From f2b2e57f79a44e5f170d53c0f1fae6620c0b4a40 Mon Sep 17 00:00:00 2001 From: Maximilian Becker Date: Wed, 4 Oct 2023 14:40:10 +0200 Subject: [PATCH 001/497] Mantis 0038043: ilDatePresentation::formatDate may return null instead of string --- Services/Calendar/classes/class.ilDatePresentation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Calendar/classes/class.ilDatePresentation.php b/Services/Calendar/classes/class.ilDatePresentation.php index 6b2689871c6d..ae6d58d05cd3 100644 --- a/Services/Calendar/classes/class.ilDatePresentation.php +++ b/Services/Calendar/classes/class.ilDatePresentation.php @@ -105,7 +105,7 @@ public static function formatDate(ilDateTime $date, bool $a_skip_day = false, bo $date_info = $date->get(IL_CAL_FKT_GETDATE, '', 'UTC'); } - $date_str = null; + $date_str = ''; if (!$a_skip_day) { $sep = ", "; if (self::isToday($date) and self::useRelativeDates()) { From 4ce1525a20c112dc56f8c5b28a0265493fded815 Mon Sep 17 00:00:00 2001 From: Stefan Hecken Date: Mon, 16 Oct 2023 14:20:29 +0200 Subject: [PATCH 002/497] Search: 38092 cast db result for user id to int during result entry creation --- .../Like/class.ilLikeUserOrgUnitSearch.php | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/Services/Search/classes/Like/class.ilLikeUserOrgUnitSearch.php b/Services/Search/classes/Like/class.ilLikeUserOrgUnitSearch.php index 8b362caf77ba..6d3007cef1e9 100644 --- a/Services/Search/classes/Like/class.ilLikeUserOrgUnitSearch.php +++ b/Services/Search/classes/Like/class.ilLikeUserOrgUnitSearch.php @@ -1,8 +1,22 @@ db->query($query); while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) { - $this->search_result->addEntry($row->user_id, 'user', $this->__prepareFound($row)); + $this->search_result->addEntry((int) $row->user_id, 'user', $this->__prepareFound($row)); } return $this->search_result; } From 9b0a82dbe66803dd32d2582514266486eef6a4e6 Mon Sep 17 00:00:00 2001 From: tbongers-cat Date: Wed, 18 Oct 2023 13:31:29 +0200 Subject: [PATCH 003/497] Course: Handle autofill after changing course member settings (#29388) --- Modules/Course/classes/class.ilObjCourseGUI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Course/classes/class.ilObjCourseGUI.php b/Modules/Course/classes/class.ilObjCourseGUI.php index 9f95436f604c..82b0e7e19047 100755 --- a/Modules/Course/classes/class.ilObjCourseGUI.php +++ b/Modules/Course/classes/class.ilObjCourseGUI.php @@ -1,7 +1,5 @@ object->setWaitingListAutoFill(false); break; } + $this->object->handleAutoFill(); $obj_service->commonSettings()->legacyForm($form, $this->object)->saveTitleIconVisibility(); $obj_service->commonSettings()->legacyForm($form, $this->object)->saveTopActionsVisibility(); From 59f7bafc71b16bc082cdab11c620587cd256d9d6 Mon Sep 17 00:00:00 2001 From: Fabian Borghoff Date: Wed, 25 Oct 2023 14:28:47 +0200 Subject: [PATCH 004/497] FIX: Undefined variable $initGlobalobjData See: https://mantis.ilias.de/view.php?id=38261 --- Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php b/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php index 3e4fd94be592..c828b3b1340b 100755 --- a/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php +++ b/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php @@ -363,6 +363,7 @@ public function getPlayer(): void $initSuspendData = null; $initAdlactData = null; + $initGlobalobjData = null; if ($this->slm->getSequencing() == true) { $initSuspendData = json_decode($this->getSuspendDataInit()); $initAdlactData = json_decode($this->getADLActDataInit()); From 49fd14e58d12652ebfb6f56afbc33ca02fee1c9c Mon Sep 17 00:00:00 2001 From: Fabian Borghoff Date: Wed, 25 Oct 2023 14:33:46 +0200 Subject: [PATCH 005/497] fix copyright --- Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php b/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php index c828b3b1340b..ecc5518e3665 100755 --- a/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php +++ b/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php @@ -1,7 +1,5 @@ Date: Fri, 27 Oct 2023 16:54:49 +0200 Subject: [PATCH 006/497] Merge pull request #6420 from fneumann/fix7-mantis37833 fix #37833 Ls as precondition for a subsequent object --- Services/Tracking/classes/status/class.ilLPStatusCollection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Tracking/classes/status/class.ilLPStatusCollection.php b/Services/Tracking/classes/status/class.ilLPStatusCollection.php index 63c3d0b8ff90..1205dc90bdbe 100644 --- a/Services/Tracking/classes/status/class.ilLPStatusCollection.php +++ b/Services/Tracking/classes/status/class.ilLPStatusCollection.php @@ -413,7 +413,7 @@ protected function isMember(int $objId, int $usrId): bool case 'lso': $participants = ilLearningSequenceParticipants::_getInstanceByObjId($objId); - return $participants->isMember($objId); + return $participants->isMember($usrId); } return true; From 6e7353e71f67eaf57ce8c4e0cec66e94d35eeaf4 Mon Sep 17 00:00:00 2001 From: Pascal Seeland Date: Sun, 29 Oct 2023 07:01:59 +0100 Subject: [PATCH 007/497] Fix Copyright Header and cs-fixer indentation --- Services/LDAP/classes/class.ilAuthProviderLDAP.php | 4 ++-- Services/LDAP/classes/class.ilLDAPAttributeMapping.php | 4 ++-- .../LDAP/classes/class.ilLDAPAttributeMappingUtils.php | 8 ++++---- Services/LDAP/classes/class.ilLDAPAttributeToUser.php | 4 ++-- Services/LDAP/classes/class.ilLDAPCronSynchronization.php | 4 ++-- Services/LDAP/classes/class.ilLDAPPlugin.php | 4 ++-- Services/LDAP/classes/class.ilLDAPQuery.php | 8 ++++---- Services/LDAP/classes/class.ilLDAPQueryException.php | 4 ++-- Services/LDAP/classes/class.ilLDAPResult.php | 4 ++-- Services/LDAP/classes/class.ilLDAPRoleAssignmentRule.php | 4 ++-- Services/LDAP/classes/class.ilLDAPRoleAssignmentRules.php | 4 ++-- .../LDAP/classes/class.ilLDAPRoleAssignmentTableGUI.php | 4 ++-- Services/LDAP/classes/class.ilLDAPRoleGroupMapping.php | 4 ++-- .../LDAP/classes/class.ilLDAPRoleGroupMappingSetting.php | 4 ++-- .../LDAP/classes/class.ilLDAPRoleGroupMappingSettings.php | 4 ++-- Services/LDAP/classes/class.ilLDAPRoleMappingTableGUI.php | 4 ++-- Services/LDAP/classes/class.ilLDAPServer.php | 4 ++-- Services/LDAP/classes/class.ilLDAPServerTableGUI.php | 4 ++-- Services/LDAP/classes/class.ilLDAPSettingsGUI.php | 6 +++--- Services/LDAP/classes/class.ilLDAPUserSynchronisation.php | 4 ++-- 20 files changed, 45 insertions(+), 45 deletions(-) diff --git a/Services/LDAP/classes/class.ilAuthProviderLDAP.php b/Services/LDAP/classes/class.ilAuthProviderLDAP.php index b7d137570257..7c0cd799579e 100644 --- a/Services/LDAP/classes/class.ilAuthProviderLDAP.php +++ b/Services/LDAP/classes/class.ilAuthProviderLDAP.php @@ -1,7 +1,5 @@ diff --git a/Services/LDAP/classes/class.ilLDAPAttributeMapping.php b/Services/LDAP/classes/class.ilLDAPAttributeMapping.php index 309e22332665..72422975d5cc 100644 --- a/Services/LDAP/classes/class.ilLDAPAttributeMapping.php +++ b/Services/LDAP/classes/class.ilLDAPAttributeMapping.php @@ -1,7 +1,5 @@ diff --git a/Services/LDAP/classes/class.ilLDAPPlugin.php b/Services/LDAP/classes/class.ilLDAPPlugin.php index 3cabfea7f29a..d3046cb6d198 100644 --- a/Services/LDAP/classes/class.ilLDAPPlugin.php +++ b/Services/LDAP/classes/class.ilLDAPPlugin.php @@ -1,7 +1,5 @@ @@ -593,8 +593,8 @@ public function bind(int $a_binding_type = ilLDAPQuery::LDAP_BIND_DEFAULT, strin /** @noinspection PhpMissingBreakStatementInspection */ case self::LDAP_BIND_TEST: ldap_set_option($this->lh, LDAP_OPT_NETWORK_TIMEOUT, ilLDAPServer::DEFAULT_NETWORK_TIMEOUT); - // fall through - // no break + // fall through + // no break case self::LDAP_BIND_DEFAULT: // Now bind anonymously or as user if ( diff --git a/Services/LDAP/classes/class.ilLDAPQueryException.php b/Services/LDAP/classes/class.ilLDAPQueryException.php index b8a4888cad30..d6d0d9e0e49a 100644 --- a/Services/LDAP/classes/class.ilLDAPQueryException.php +++ b/Services/LDAP/classes/class.ilLDAPQueryException.php @@ -1,7 +1,5 @@ diff --git a/Services/LDAP/classes/class.ilLDAPResult.php b/Services/LDAP/classes/class.ilLDAPResult.php index c335bcf6f9cb..8fff630098c1 100644 --- a/Services/LDAP/classes/class.ilLDAPResult.php +++ b/Services/LDAP/classes/class.ilLDAPResult.php @@ -1,7 +1,5 @@ diff --git a/Services/LDAP/classes/class.ilLDAPRoleAssignmentRules.php b/Services/LDAP/classes/class.ilLDAPRoleAssignmentRules.php index 293de0c63265..b45e6b978dd8 100644 --- a/Services/LDAP/classes/class.ilLDAPRoleAssignmentRules.php +++ b/Services/LDAP/classes/class.ilLDAPRoleAssignmentRules.php @@ -1,7 +1,5 @@ diff --git a/Services/LDAP/classes/class.ilLDAPRoleGroupMapping.php b/Services/LDAP/classes/class.ilLDAPRoleGroupMapping.php index dd1a2dbf6151..cccc9c4d8980 100644 --- a/Services/LDAP/classes/class.ilLDAPRoleGroupMapping.php +++ b/Services/LDAP/classes/class.ilLDAPRoleGroupMapping.php @@ -1,7 +1,5 @@ */ diff --git a/Services/LDAP/classes/class.ilLDAPRoleGroupMappingSetting.php b/Services/LDAP/classes/class.ilLDAPRoleGroupMappingSetting.php index 1a87955d7a5a..6cbb6c0a097a 100644 --- a/Services/LDAP/classes/class.ilLDAPRoleGroupMappingSetting.php +++ b/Services/LDAP/classes/class.ilLDAPRoleGroupMappingSetting.php @@ -1,7 +1,5 @@ */ diff --git a/Services/LDAP/classes/class.ilLDAPRoleGroupMappingSettings.php b/Services/LDAP/classes/class.ilLDAPRoleGroupMappingSettings.php index 378b4b5f0a9c..562455932abc 100644 --- a/Services/LDAP/classes/class.ilLDAPRoleGroupMappingSettings.php +++ b/Services/LDAP/classes/class.ilLDAPRoleGroupMappingSettings.php @@ -1,7 +1,5 @@ */ diff --git a/Services/LDAP/classes/class.ilLDAPRoleMappingTableGUI.php b/Services/LDAP/classes/class.ilLDAPRoleMappingTableGUI.php index fc827a691cf2..789608dc336b 100644 --- a/Services/LDAP/classes/class.ilLDAPRoleMappingTableGUI.php +++ b/Services/LDAP/classes/class.ilLDAPRoleMappingTableGUI.php @@ -1,7 +1,5 @@ */ diff --git a/Services/LDAP/classes/class.ilLDAPServer.php b/Services/LDAP/classes/class.ilLDAPServer.php index 970e48be50d6..d570012dd60a 100644 --- a/Services/LDAP/classes/class.ilLDAPServer.php +++ b/Services/LDAP/classes/class.ilLDAPServer.php @@ -1,7 +1,5 @@ */ diff --git a/Services/LDAP/classes/class.ilLDAPServerTableGUI.php b/Services/LDAP/classes/class.ilLDAPServerTableGUI.php index 0dc56341cdde..60e663ab759e 100644 --- a/Services/LDAP/classes/class.ilLDAPServerTableGUI.php +++ b/Services/LDAP/classes/class.ilLDAPServerTableGUI.php @@ -1,7 +1,5 @@ */ diff --git a/Services/LDAP/classes/class.ilLDAPSettingsGUI.php b/Services/LDAP/classes/class.ilLDAPSettingsGUI.php index dbaa1110bc1a..c8c8a5cfcb79 100644 --- a/Services/LDAP/classes/class.ilLDAPSettingsGUI.php +++ b/Services/LDAP/classes/class.ilLDAPSettingsGUI.php @@ -1,7 +1,5 @@ */ @@ -192,7 +192,7 @@ public function executeCommand(): bool if (!$cmd) { $cmd = "serverList"; } - $this->$cmd(); + $this->$cmd(); break; } return true; diff --git a/Services/LDAP/classes/class.ilLDAPUserSynchronisation.php b/Services/LDAP/classes/class.ilLDAPUserSynchronisation.php index 4ad9a7203f12..1613dcc68069 100644 --- a/Services/LDAP/classes/class.ilLDAPUserSynchronisation.php +++ b/Services/LDAP/classes/class.ilLDAPUserSynchronisation.php @@ -1,7 +1,5 @@ Date: Sun, 29 Oct 2023 09:01:02 +0100 Subject: [PATCH 008/497] 37822: RSS feeds in blog throw ConstraintViolationException --- Modules/Blog/classes/class.ilObjBlog.php | 2 +- feed.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Blog/classes/class.ilObjBlog.php b/Modules/Blog/classes/class.ilObjBlog.php index 8a18ba28466f..074c890b5a15 100644 --- a/Modules/Blog/classes/class.ilObjBlog.php +++ b/Modules/Blog/classes/class.ilObjBlog.php @@ -642,7 +642,7 @@ public static function deliverRSS(string $a_wsp_id): void $feed = new ilFeedWriter(); - $url = ilLink::_getStaticLink($a_wsp_id, "blog", true, $is_wsp); + $url = ilLink::_getStaticLink($a_wsp_id, "blog", true, (string) $is_wsp); $url = str_replace("&", "&", $url); // #11870 diff --git a/feed.php b/feed.php index c9f277dc2c11..29f3073fa262 100755 --- a/feed.php +++ b/feed.php @@ -39,7 +39,7 @@ $requested_user_id = $getPar("user_id", "int"); $requested_ref_id = $getPar("ref_id", "int"); $requested_purpose = $getPar("purpose", "string"); -$requested_blog_id = $getPar("blog_id", "int"); +$requested_blog_id = $getPar("blog_id", "string"); $requested_hash = $getPar("hash", "string"); if ($requested_user_id > 0) { From 3d4b1821769c79da279f5344bf8aa8fb241c2387 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 29 Oct 2023 21:04:32 +0100 Subject: [PATCH 009/497] 26381: copy wiki: links for sections that point to wiki pages lead to original wiki not to copy --- Modules/Wiki/classes/class.ilObjWiki.php | 21 +++++++++++++++++++ .../COPage/classes/class.ilPageObject.php | 5 ++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Modules/Wiki/classes/class.ilObjWiki.php b/Modules/Wiki/classes/class.ilObjWiki.php index dd643362a8b9..32a8a5731f89 100755 --- a/Modules/Wiki/classes/class.ilObjWiki.php +++ b/Modules/Wiki/classes/class.ilObjWiki.php @@ -701,6 +701,7 @@ public function cloneObject(int $target_id, int $copy_id = 0, bool $omit_tree = foreach (self::_lookupImportantPagesList($this->getId()) as $ip) { $new_obj->addImportantPage($map[$ip["page_id"]], $ip["ord"], $ip["indent"]); } + $this->updateInternalLinksOnCopy($map); // copy rating categories foreach (ilRatingCategory::getAllForObject($this->getId()) as $rc) { @@ -714,6 +715,26 @@ public function cloneObject(int $target_id, int $copy_id = 0, bool $omit_tree = return $new_obj; } + protected function updateInternalLinksOnCopy(array $map) : void + { + foreach ($map as $old_page_id => $new_page_id) { + // get links with targets inside the wiki + $targets = ilInternalLink::_getTargetsOfSource( + "wpg:pg", + $old_page_id, + "-" + ); + foreach ($targets as $t) { + if ((int) $t["inst"] === 0 && in_array($t["type"], ["wpag", "wpage"]) && isset($map[(int) $t["id"]])) { + $new_page = new ilWikiPage($new_page_id); + if ($new_page->moveIntLinks([$t["id"] => $map[(int) $t["id"]]])) { + $new_page->update(true, true); + } + } + } + } + } + /** * Get template selection on creation? If more than one template (including empty page template) * is activated -> return true diff --git a/Services/COPage/classes/class.ilPageObject.php b/Services/COPage/classes/class.ilPageObject.php index 2a8d23e84312..af7a417fe973 100755 --- a/Services/COPage/classes/class.ilPageObject.php +++ b/Services/COPage/classes/class.ilPageObject.php @@ -2027,7 +2027,6 @@ public function moveIntLinks(array $a_from_to): bool $this->buildDom(); $changed = false; - // resolve normal internal links $xpc = xpath_new_context($this->dom); $path = "//IntLink"; @@ -2049,6 +2048,10 @@ public function moveIntLinks(array $a_from_to): bool $res->nodeset[$i]->set_attribute("Target", "il__ppage_" . $a_from_to[$obj_id]); $changed = true; } + if ($type == "WikiPage") { + $res->nodeset[$i]->set_attribute("Target", "il__wpage_" . $a_from_to[$obj_id]); + $changed = true; + } } } unset($xpc); From 71220d5ff7b5e7a586c870b0709b324dd189b9b9 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 30 Oct 2023 09:29:58 +0100 Subject: [PATCH 010/497] SAML: Add performance recommendation (cherry picked from commit e2d04b5270003a5ddcc34156ba04508a3046832e) --- Services/Saml/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Services/Saml/README.md b/Services/Saml/README.md index 8b4d4e5a278f..ccd75813d893 100644 --- a/Services/Saml/README.md +++ b/Services/Saml/README.md @@ -8,6 +8,7 @@ in this document are to be interpreted as described in **Table of Contents** * [Server Configuration](#web-server-configuration) +* [Performance](#performance) * [ILIAS Configuration](#ilias-configuration) ## Web Server Configuration @@ -64,6 +65,15 @@ location ~ \.php$ { [...] ``` +## Performance + +For best performance with a huge number of concurrent login requests we recommend +the usage of `memcached` as session storage for the *SimpleSAMLphp* sessions. + +See: +- https://simplesamlphp.org/docs/stable/simplesamlphp-maintenance.html#session-management +- https://mantis.ilias.de/view.php?id=37725 + ## ILIAS Configuration Please change your ILIAS configuration according to the `Superglobal` behaviour described in From 77a9d9e0c5dc0ab9a6cc4d8768e765dd01d2551d Mon Sep 17 00:00:00 2001 From: Vivek Kumar <115945472+vivekBoii@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:25:15 +0530 Subject: [PATCH 011/497] Update install.md --- docs/configuration/install.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/configuration/install.md b/docs/configuration/install.md index 199d87f24a4f..b7c255652b8c 100755 --- a/docs/configuration/install.md +++ b/docs/configuration/install.md @@ -377,7 +377,7 @@ git clone https://github.com/ILIAS-eLearning/ILIAS.git . --single-branch git checkout release_X ``` -or unpack the downloaded archieve to the docroot. Replace `release_X` with the +or unpack the downloaded archive to the docroot. Replace `release_X` with the branch or tag you actually want to install. The repository of ILIAS doesn't contain all code that is required to run. To @@ -461,7 +461,7 @@ php setup/setup.php install /foo/bar/my-configuration.json ``` The installation will display what currently happens and might prompt you with -questions. You might want to have a look into the [documenation of the command line setup](../../setup/README.md) +questions. You might want to have a look into the [documentation of the command line setup](../../setup/README.md) or into the help of the program itself `php setup/setup.php help`. It is the tool to manage and monitor your ILIAS installation. @@ -633,7 +633,7 @@ composer install --no-dev if you use tags to pin a specific ILIAS version. -In case of merge conflicts refer to [the ILIAS Developement Guide](http://www.ilias.de/docu/goto.php?target=pg_15604). +In case of merge conflicts refer to [the ILIAS Development Guide](http://www.ilias.de/docu/goto.php?target=pg_15604). You should only encounter these if you changed the code of your installation locally. @@ -702,7 +702,7 @@ installation. Run them by using the `--run` parameter and have a look into the help of the command for more details: `php setup/setup.php migrate --help`. Both commands will display what currently happens and might prompt you with -questions. You might want to have a look into the [documenation of the command line setup](../../setup/README.md) +questions. You might want to have a look into the [documentation of the command line setup](../../setup/README.md) or into the help of the program itself `php setup/setup.php help`. It is the tool to manage and monitor your ILIAS installation. From 433755ae48a5e4bdfec98d913d8adb8fa56d4b67 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Mon, 30 Oct 2023 13:40:52 +0100 Subject: [PATCH 012/497] OrgU: #38179, missing refId for new OrgUs --- Modules/OrgUnit/classes/class.ilObjOrgUnit.php | 7 ++++--- Modules/OrgUnit/classes/class.ilObjOrgUnitGUI.php | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Modules/OrgUnit/classes/class.ilObjOrgUnit.php b/Modules/OrgUnit/classes/class.ilObjOrgUnit.php index d735afb15402..cefb84d4ab13 100644 --- a/Modules/OrgUnit/classes/class.ilObjOrgUnit.php +++ b/Modules/OrgUnit/classes/class.ilObjOrgUnit.php @@ -1,4 +1,5 @@ getRefId()) { ilOrgUnitPathStorage::writePathByRefId($this->getRefId()); + } else { + throw new \LogicException('No ref_id on OrgU with id ' . $this->getId(), 1); } } } diff --git a/Modules/OrgUnit/classes/class.ilObjOrgUnitGUI.php b/Modules/OrgUnit/classes/class.ilObjOrgUnitGUI.php index dbb48780ccc8..31a71a90d193 100644 --- a/Modules/OrgUnit/classes/class.ilObjOrgUnitGUI.php +++ b/Modules/OrgUnit/classes/class.ilObjOrgUnitGUI.php @@ -352,8 +352,10 @@ public function executeCommand(): void protected function afterSave(ilObject $new_object): void { + $new_object->writePath(); $this->tpl->setOnScreenMessage('success', $this->lng->txt("object_added"), true); $this->ctrl->setParameter($this, "ref_id", $new_object->getRefId()); + ilUtil::redirect($this->getReturnLocation( "save", $this->ctrl->getLinkTarget($this, self::CMD_EDIT_SETTINGS, "") From 112b704f04956cff71025bd6488902dc2e857c47 Mon Sep 17 00:00:00 2001 From: Vivek Kumar <115945472+vivekBoii@users.noreply.github.com> Date: Mon, 30 Oct 2023 19:06:46 +0530 Subject: [PATCH 013/497] Update secure.md --- docs/configuration/secure.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/configuration/secure.md b/docs/configuration/secure.md index 56e8b6498cb7..2868d2afc640 100644 --- a/docs/configuration/secure.md +++ b/docs/configuration/secure.md @@ -29,7 +29,7 @@ This guideline is going to show you some best practice examples how to improve the security of your ILIAS installation, of the webserver and it's associated components. The ILIAS e.V. requested a documentation for a "Secure ILIAS" in march 2019. -The section "Hardening and Security Guidance" should be removed and the security related instructions have to be mantained in a own document. +The section "Hardening and Security Guidance" should be removed and the security related instructions have to be maintained in a own document. ## List of placeholder names @@ -235,7 +235,7 @@ server { `ssl_dhparam /etc/ssl/private/dhparam.pem;`: This specifies a file with DH parameters for EDH (Ephemeral Diffie-Hellman) ciphers. -By default, NGINX will use the default DHE paramaters provided by openssl. This uses a weak key that gets lower scores. +By default, NGINX will use the default DHE parameters provided by openssl. This uses a weak key that gets lower scores. Run `openssl dhparam -out /etc/ssl/private/dhparam.pem 4096` in terminal to generate it. We RECOMMEND to use the [Mozilla SSL Configuration Generator](https://ssl-config.mozilla.org/) to generate a suitable configuration and the [Qualys SSL Labs Tests](https://www.ssllabs.com/ssltest/) or the [High-Tech Bridge SSL Server Test](https://www.htbridge.com/ssl/) to check your settings. It is recommended to reach a "A" rating as minimum. @@ -460,7 +460,7 @@ You can simply add for example `add_header Set-Cookie` in your `server` configur note: For nginx, you have to generate a specific cookie for your ILIAS client. -This will overide the cookie deliverd by ILIAS, so it is necessary to generate the whole cookie. +This will override the cookie delivered by ILIAS, so it is necessary to generate the whole cookie. ## Suppress server signature and PHP version information @@ -570,7 +570,7 @@ Nginx: ### Prevent execution of PHP-Code in data-directory -There may be situations where there is no oppurtunity to disallow uploading php-files e.g. in Computer Science courses. In this case you SHOULD disallow these uploaded code to be executed by the webserver. +There may be situations where there is no opportunity to disallow uploading php-files e.g. in Computer Science courses. In this case you SHOULD disallow these uploaded code to be executed by the webserver. Apache2: @@ -615,7 +615,7 @@ Nginx: Local changes of the code of ILIAS can indicate a potential intrusion. To determine local changes of the code of ILIAS use `git status` / `git diff`. -This will show you the uncommited local changes. +This will show you the uncommitted local changes. (Beware: Committed local changes remain undetected using this method.) (If you have conscious code local changes, this can lead to a false positive.) @@ -665,9 +665,9 @@ to ## Use secure passwords -Please keep in mind, that your plattform might me be accessible to the world wide web. To avoid unauthorized access to your Ilias-Installation, it his highly recommended to use secure passwords. Especially the root password and the Ilias-Master-Password are potentially endangered. +Please keep in mind, that your platform might me be accessible to the world wide web. To avoid unauthorized access to your Ilias-Installation, it his highly recommended to use secure passwords. Especially the root password and the Ilias-Master-Password are potentially endangered. -Your passwords should fullfil the following criterias: +Your passwords should fulfil the following criterias: * at least 8 characters in length * lowercase and uppercase alphabetic characters [possible: `a-z`, `A-Z`] From bd5e53168737f3a7c81dc414f0812a7df09d337a Mon Sep 17 00:00:00 2001 From: Vivek Kumar <115945472+vivekBoii@users.noreply.github.com> Date: Mon, 30 Oct 2023 19:09:04 +0530 Subject: [PATCH 014/497] Update accessibility-process.md --- docs/development/accessibility-process.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development/accessibility-process.md b/docs/development/accessibility-process.md index 7bb8b44fd478..5da5e9f3bce9 100644 --- a/docs/development/accessibility-process.md +++ b/docs/development/accessibility-process.md @@ -29,7 +29,7 @@ interface and accessibility. competence of the ILIAS community as well as to identify concrete problems or provide concrete solutions. * Effective and efficient tools are provided to the community that help to meet the -targets and goals that are set in this document and in the accessibilty guidelines. +targets and goals that are set in this document and in the accessibility guidelines. * Regular tests of components of ILIAS make sure that there is no regression in accessibility properties of the system. * The general knowledge and awareness for accessibility in the ILIAS community is From 33e78a327404a9142c6cf44758961c5639492045 Mon Sep 17 00:00:00 2001 From: Vivek Kumar <115945472+vivekBoii@users.noreply.github.com> Date: Mon, 30 Oct 2023 19:14:23 +0530 Subject: [PATCH 015/497] Update accessibility.md --- docs/development/accessibility.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/development/accessibility.md b/docs/development/accessibility.md index 0d4c19266c2d..6c9cabdb1bf9 100644 --- a/docs/development/accessibility.md +++ b/docs/development/accessibility.md @@ -329,7 +329,7 @@ Target group: developer Where receiving and then removing pointer hover or keyboard focus triggers additional content to become visible and then hidden, the following MUST be true: -- **Dissmissable**: A mechanism is available to dismiss the additional content without moving pointer hover or keyboard focus, unless the additional content communicates an input error or does not obscure or replace other content; +- **Dismissable**: A mechanism is available to dismiss the additional content without moving pointer hover or keyboard focus, unless the additional content communicates an input error or does not obscure or replace other content; - **Hoverable**: If pointer hover can trigger the additional content, then the pointer can be moved over the additional content without the additional content disappearing; @@ -779,7 +779,7 @@ Target group: developer In content implemented using markup languages, status messages MUST be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus. # Accessibility Checklist -This list is prepared to be worked thorugh by developers implementing specific projects. Results from external compliance testing may lead to adapting these phrases. Changes will be subjected to the jour fixe if compliance testing indicates they are erroneous or lacking information. We still hope the following list is helpful in everyday work, please let us know if this is not the case. +This list is prepared to be worked through by developers implementing specific projects. Results from external compliance testing may lead to adapting these phrases. Changes will be subjected to the jour fixe if compliance testing indicates they are erroneous or lacking information. We still hope the following list is helpful in everyday work, please let us know if this is not the case. ## Tabbing and Focus Please manually check your project for tabbing and focus quality: 1. All functionality must be operable by keyboard, mainly tab, arrow, space or return keys are used. (2.1.1) From 56b3ec38ae4130df8125e575595bf9c1ecfb0230 Mon Sep 17 00:00:00 2001 From: kergomard <13102171+kergomard@users.noreply.github.com> Date: Tue, 31 Oct 2023 10:28:32 +0100 Subject: [PATCH 016/497] Registration: Valid Until Should be INT (#6370) * Registration: Valid Until Should be INT See: https://mantis.ilias.de/view.php?id=38057 --- .../Registration/classes/class.ilAccountRegistrationGUI.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/Registration/classes/class.ilAccountRegistrationGUI.php b/Services/Registration/classes/class.ilAccountRegistrationGUI.php index 96d8404f195d..9241d2b7fa66 100644 --- a/Services/Registration/classes/class.ilAccountRegistrationGUI.php +++ b/Services/Registration/classes/class.ilAccountRegistrationGUI.php @@ -1,7 +1,5 @@ @@ -481,7 +481,7 @@ protected function createUser(int $a_role): string case "relative": $rel = unserialize($code_data["alimitdt"], ['allowed_classes' => false]); - $access_limit = $rel["d"] * 86400 + $rel["m"] * 2592000 + $rel["y"] * 31536000 + time(); + $access_limit = (int) ($rel["d"] * 86400 + $rel["m"] * 2592000 + $rel["y"] * 31536000 + time()); break; } } From bc8d4abb0d03184dc0d3a84b7fa70e2cf9274007 Mon Sep 17 00:00:00 2001 From: Pascal Seeland Date: Sun, 29 Oct 2023 06:31:33 +0100 Subject: [PATCH 017/497] Fix 31639: redirect loop when session expireds --- .../classes/class.ilSession.php | 22 ++++++++++++++----- .../Init/classes/class.ilInitialisation.php | 13 +++++++---- Services/Init/classes/class.ilStartUpGUI.php | 2 +- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/Services/Authentication/classes/class.ilSession.php b/Services/Authentication/classes/class.ilSession.php index 969d658af767..69eb46c19dce 100755 --- a/Services/Authentication/classes/class.ilSession.php +++ b/Services/Authentication/classes/class.ilSession.php @@ -1,7 +1,5 @@ * @@ -226,9 +226,9 @@ public static function _exists(string $a_session_id): bool /** * Destroy session * - * @param string|array session id|s - * @param int closing context - * @param int|bool expired at timestamp + * @param string|array $a_session_id session id|s + * @param int|null $a_closing_context closing context + * @param int|bool $a_expired_at expired at timestamp */ public static function _destroy($a_session_id, ?int $a_closing_context = null, $a_expired_at = null): bool { @@ -258,6 +258,18 @@ public static function _destroy($a_session_id, ?int $a_closing_context = null, $ $ilDB->manipulate($q); + try { + // only delete session cookie if it is set in the current request + if ($DIC->http()->wrapper()->cookie()->has(session_name()) && + $DIC->http()->wrapper()->cookie()->retrieve(session_name(), $DIC->refinery()->kindlyTo()->string()) === $a_session_id) { + $cookieJar = $DIC->http()->cookieJar()->without(session_name()); + $cookieJar->renderIntoResponseHeader($DIC->http()->response()); + } + } catch (\Throwable $e) { + // ignore + // this is needed for "header already" sent errors when the random cleanup of expired sessions is triggered + } + return true; } diff --git a/Services/Init/classes/class.ilInitialisation.php b/Services/Init/classes/class.ilInitialisation.php index f48fdb0d5c17..771d86e646cd 100644 --- a/Services/Init/classes/class.ilInitialisation.php +++ b/Services/Init/classes/class.ilInitialisation.php @@ -1,4 +1,5 @@ debug('Redirecting to login page.'); if ($DIC['ilAuthSession']->isExpired()) { ilSession::setClosingContext(ilSession::SESSION_CLOSE_EXPIRE); + $session_expired = true; } if (!$DIC['ilAuthSession']->isAuthenticated()) { ilSession::setClosingContext(ilSession::SESSION_CLOSE_LOGIN); @@ -999,8 +1001,8 @@ protected static function goToLogin(): void ]) ); - $script = "login.php?" . $target . "client_id=" . $client_id . - "&auth_stat=" . $a_auth_stat; + $script = "login.php?" . $target . "client_id=" . $client_id; + $script .= $session_expired ? "&session_expired=1" : ""; self::redirect( $script, @@ -1373,6 +1375,10 @@ public static function resumeUserSession(): void !$DIC['ilAuthSession']->isAuthenticated() or $DIC['ilAuthSession']->isExpired() ) { + if ($GLOBALS['DIC']['ilAuthSession']->isExpired()) { + ilSession::_destroy($_COOKIE[session_name()], ilSession::SESSION_CLOSE_EXPIRE); + } + ilLoggerFactory::getLogger('init')->debug('Current session is invalid: ' . $GLOBALS['DIC']['ilAuthSession']->getId()); $current_script = substr(strrchr($_SERVER["PHP_SELF"], "/"), 1); if (self::blockedAuthentication($current_script)) { @@ -1468,7 +1474,6 @@ private static function initGlobalScreen(\ILIAS\DI\Container $c): void }; $c->globalScreen()->tool()->context()->stack()->clear(); $c->globalScreen()->tool()->context()->claim()->main(); -// $c->globalScreen()->tool()->context()->current()->addAdditionalData('DEVMODE', (bool) DEVMODE); } /** diff --git a/Services/Init/classes/class.ilStartUpGUI.php b/Services/Init/classes/class.ilStartUpGUI.php index b762260792c4..e93042b2eb38 100755 --- a/Services/Init/classes/class.ilStartUpGUI.php +++ b/Services/Init/classes/class.ilStartUpGUI.php @@ -308,7 +308,7 @@ protected function showLoginPage(ilPropertyFormGUI $form = null): void $page_editor_html = $this->purgePlaceholders($page_editor_html); // check expired session and send message - if ($this->authSession->isExpired()) { + if ($this->authSession->isExpired() || $this->http->wrapper()->query()->has('session_expired')) { $this->mainTemplate->setOnScreenMessage('failure', $this->lng->txt('auth_err_expired')); } elseif ($this->http->wrapper()->query()->has('reg_confirmation_msg')) { $this->lng->loadLanguageModule('registration'); From d136e1c4bb12637124bd56704805bb6d802b13c9 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 30 Oct 2023 09:39:10 +0100 Subject: [PATCH 018/497] Init: Change password assistance info message when submitting form See: https://mantis.ilias.de/view.php?id=38369 --- lang/ilias_de.lang | 2 +- lang/ilias_en.lang | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 98ceee21f585..b44c0470ae4d 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -13109,7 +13109,7 @@ pwassist#:#pwassist_enter_username_and_email#:#Geben Sie einen Anmeldenamen und pwassist#:#pwassist_enter_username_and_new_password#:#Tragen Sie den Anmeldenamen ein, und vergeben Sie ein neues Passwort.###Modified as part of gender mainstreaming activities for ILIAS 8 pwassist#:#pwassist_login_not_match#:#Der eingegebene Anmeldename stimmt nicht überein mit dem Anmeldenamen, für den Sie die Passwort-Unterstützung angefordert hatten. Bitte geben Sie den korrekten Anmeldenamen ein.###Modified as part of gender mainstreaming activities for ILIAS 8 pwassist#:#pwassist_mail_body#:#Tragen Sie ein neues Passwort ein für Ihr Anmeldekonto %1$s

Diese Nachricht wurde automatisch generiert von der ILIAS-Installation: %2$s

Sie (oder jemand mit der Adresse %3$s) hat Passwort-Unterstützung für den Anmeldenamen "%4$s" angefordert. Bitte prüfen Sie sorgfältig die nachfolgend aufgeführten Fälle, und handeln Sie wie vorgeschlagen:

• Sie haben die Passwort-Unterstützung versehentlich benutzt: Löschen Sie diese Mail.

• Sie sind sicher, dass Sie nie Passwort-Unterstützung für den angegebenen ILIAS-Server angefordert haben: Bitte nehmen Sie mit %5$s Kontakt auf.

Sie haben um Passwort-Unterstützung angefragt. Bitte gehen Sie wie folgt vor:

1. Starten Sie Ihren Browser.
2. Geben Sie folgende Adresse in Ihrem Browser ein: %6$s Wichtig: Die Adresse besteht aus einer einzigen Zeile. Wenn Sie die Adresse aufgetrennt in mehrere Zeilen sehen, dann hat Ihr E-Mail-Programm diese Zeilenumbrüche eingefügt.
3. Ihr Browser zeigt nun eine Seite an, mit der Sie ein neues Passwort an das Anmeldekonto zuweisen können.

Bitte beachten Sie: Aus Sicherheitsgründen können Sie diese drei Schritte nur exakt einmal und innerhalb einer begrenzten Zeit ausführen. Danach wird die Adresse ungültig, und Sie müssen die Passwort-Unterstützung auf dem ILIAS-Server erneut anfordern. -pwassist#:#pwassist_mail_sent#:#ILIAS hat eine E-Mail an die Adresse %1$s versandt. Weitere Anweisungen finden Sie in dieser Mail. +pwassist#:#pwassist_mail_sent#:#ILIAS hat eine E-Mail an die Adresse %1$s versandt, sofern ein ILIAS-Konto mit dem angegebenen Anmeldenamen und der E-Mail-Adresse existiert. Weitere Anweisungen finden Sie in dieser Mail. pwassist#:#pwassist_mail_sent_generic#:#ILIAS hat eine E-Mail an die hinterlegte Adresse versandt. Weitere Anweisungen finden Sie in dieser Mail. pwassist#:#pwassist_mail_subject#:#ILIAS-Passwort-Unterstützung pwassist#:#pwassist_password_assigned#:#Das Passwort für den Anmeldenamen %1$s wurde erfolgreich gespeichert. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 033a07bc343f..191a91ee0b61 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -13109,7 +13109,7 @@ pwassist#:#pwassist_enter_username_and_email#:#Enter a username and the associat pwassist#:#pwassist_enter_username_and_new_password#:#Enter the username and the new password in the fields below. pwassist#:#pwassist_login_not_match#:#Please enter another username. The username you have entered does not match the username for which you had asked for password assistance. pwassist#:#pwassist_mail_body#:#Register a new password for your user account: %1$s

This message has been generated automatically by the ILIAS server %2$s

You (or someone at %3$s) has asked for password assistance for the user account "%4$s". Please check carefully the conditions listed below and proceed accordingly:

• If you have used the password assistance form on the ILIAS server by accident: Delete this mail.

• If you are certain, that you never asked for password assistance at this ILIAS server: Please contact %5$s.

• If you asked for password assistance, please proceed as follows:
1. Open your browser.
2. Enter the following address in your browser: %6$s
Important: The address is a single line. If you see this address split into multiple lines, then your e-mail program has inserted these line breaks.
3. On the web page shown by your browser, enter a new password for your user account.

Please note, that for security reasons, you can perform the three steps above only exactly once and for a limited time only. Afterwards the address becomes invalid, and you have to use the password assistance page on the ILIAS server again. -pwassist#:#pwassist_mail_sent#:#A message has been sent to %1$s. Please check your mail box. +pwassist#:#pwassist_mail_sent#:#A message has been sent to %1$s, if a user account with the entered username and email address could be found. Please check your mail box for further instructions. pwassist#:#pwassist_mail_sent_generic#:#A message has been sent to the email address defined in ILIAS. Please check your mail box. pwassist#:#pwassist_mail_subject#:#ILIAS Password Assistance pwassist#:#pwassist_password_assigned#:#The password has been successfully assigned to user "%1$s". From 45e2c46b438ab45c3b7ca4f22e801fcf7e22bf49 Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Tue, 31 Oct 2023 12:00:14 +0100 Subject: [PATCH 019/497] Updated Milos iconset and added improved icons for page editor --- templates/default/images/icon_edtr.svg | 22 +------------------ templates/default/images/icon_pg.svg | 25 ++++++++++----------- templates/default/images/icon_pg_d.svg | 28 +++++++++++------------- templates/default/images/icon_pg_del.svg | 28 +++++++++++------------- 4 files changed, 39 insertions(+), 64 deletions(-) diff --git a/templates/default/images/icon_edtr.svg b/templates/default/images/icon_edtr.svg index e7e51ee3e47a..f2aae38aebc8 100644 --- a/templates/default/images/icon_edtr.svg +++ b/templates/default/images/icon_edtr.svg @@ -1,21 +1 @@ - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/templates/default/images/icon_pg.svg b/templates/default/images/icon_pg.svg index ebbcd561f7a3..1fd1fe31cdd1 100644 --- a/templates/default/images/icon_pg.svg +++ b/templates/default/images/icon_pg.svg @@ -1,22 +1,21 @@ - + - - - - - - - - - + + + + + + + - + diff --git a/templates/default/images/icon_pg_d.svg b/templates/default/images/icon_pg_d.svg index 53b003438789..25d2349f98f9 100644 --- a/templates/default/images/icon_pg_d.svg +++ b/templates/default/images/icon_pg_d.svg @@ -1,23 +1,21 @@ - + + - - - - - - - - - + + + + + + + - diff --git a/templates/default/images/icon_pg_del.svg b/templates/default/images/icon_pg_del.svg index f7758440af49..8306471c574e 100644 --- a/templates/default/images/icon_pg_del.svg +++ b/templates/default/images/icon_pg_del.svg @@ -1,23 +1,21 @@ - + + - - - - - - - - - + + + + + + + - From 83ed32d4e5964a659a0e90195ef0d1e83113bce1 Mon Sep 17 00:00:00 2001 From: Vivek Kumar <115945472+vivekBoii@users.noreply.github.com> Date: Tue, 31 Oct 2023 01:43:47 +0530 Subject: [PATCH 020/497] Update contributing.md --- docs/development/contributing.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/development/contributing.md b/docs/development/contributing.md index 7db705876fd5..0cd18f24473e 100644 --- a/docs/development/contributing.md +++ b/docs/development/contributing.md @@ -28,7 +28,7 @@ also include Testers, Translators, Authors and other people into the processes described here. If you want to contribute to said activities please have a look [here](contributing.md). -As a contributor you will be named in the release notes of our major relases +As a contributor you will be named in the release notes of our major releases with your name and your organisation as we find them in our commit history and in your profile on GitHub. If your don't want to be listed, please write a short mail to the [Technical Board of the ILIAS society](mailto:tb@lists.ilias.de). @@ -68,7 +68,7 @@ code please make sure: reviewers as well * that your commit follows the [ILIAS coding guidelines](http://www.ilias.de/docu/goto_docu_pg_202_42.html) - this is a - bare minimun of style we want to maintain for new code + bare minimum of style we want to maintain for new code * you don't introduce new code violations which could have been easily found by importing and running our [PhpStorm PHP Inspection Profile](./inspection-configs/php-storm-php-inspections.xml) @@ -87,7 +87,7 @@ to the ILIAS-repository as a general working space for incomplete features or id Prefer other measures like workshops or VCs for discussion about ideas or approaches. If you are positive that you definitely need to open a PR as a draft, prefix the summary with "WIP -"" for these kind of PRs to prevent them from being merged -accidentially. +accidentally. ## List of Labels From 6599e20f02192ebaf4e5570ed03412a6a113453d Mon Sep 17 00:00:00 2001 From: Vivek Kumar <115945472+vivekBoii@users.noreply.github.com> Date: Tue, 31 Oct 2023 01:45:49 +0530 Subject: [PATCH 021/497] Update database-updates.md --- docs/development/database-updates.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/development/database-updates.md b/docs/development/database-updates.md index fc61af5e9e6c..c5319538720b 100644 --- a/docs/development/database-updates.md +++ b/docs/development/database-updates.md @@ -215,10 +215,10 @@ class MyMigration implements Setup\Migration The `Migration`-interface makes it possible to break down a migration into distinct steps. This allows administrators to control and monitor the migrations, which potentially take a lot of time, closely. When the migration is executed, `prepare` -will be called first and allows the migration to pull required ressources from the +will be called first and allows the migration to pull required resources from the environment. Via `getPreconditions`, the migration can announce which other `Objective`s need to be achieved first to fill the environment with the required -ressources. With `getRemainingAmountOfSteps` you can tell the setup, how many steps +resources. With `getRemainingAmountOfSteps` you can tell the setup, how many steps still need to be performed to finish the migration. When the administrator requests migration steps to be performed, the `step` method will be called to perform the single steps. From ba7155f57279e402af3beb31acbd57d1723a3f09 Mon Sep 17 00:00:00 2001 From: Vivek Kumar <115945472+vivekBoii@users.noreply.github.com> Date: Tue, 31 Oct 2023 01:47:14 +0530 Subject: [PATCH 022/497] Update docs-guidelines.md --- docs/development/docs-guidelines.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development/docs-guidelines.md b/docs/development/docs-guidelines.md index 451d461d5ad8..e7ddda7c2166 100644 --- a/docs/development/docs-guidelines.md +++ b/docs/development/docs-guidelines.md @@ -48,7 +48,7 @@ guidelines to signify their level of requirement. * In Guidelines the audience SHOULD NOT be addressed directly (e.g. do not start with "You SHOULD"). * In how-to, tutorials or similar, the audience MAY be addressed directly. -* If contend from other files is referenced an internal link to this document +* If content from other files is referenced an internal link to this document SHOULD be provided. * Line wrap after around 80 chars per line to improve readability SHOULD be used. * Screenshots and Images SHOULD be avoided in the documentation if possible. Use From 72ec1063b5fce3763c7403035c7969326aaa3c58 Mon Sep 17 00:00:00 2001 From: Vivek Kumar <115945472+vivekBoii@users.noreply.github.com> Date: Tue, 31 Oct 2023 01:48:39 +0530 Subject: [PATCH 023/497] Update expert-groups.md --- docs/development/expert-groups.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/development/expert-groups.md b/docs/development/expert-groups.md index 17b2f25a5368..f7fd03cf4225 100644 --- a/docs/development/expert-groups.md +++ b/docs/development/expert-groups.md @@ -34,7 +34,7 @@ the general working capacity of the groups.** The TB expects the experts to contribute their insights, opinions and criticism as early as possible in the development process. Also, the TB expects all community -members to seak the experts advice and listen to their feedback. **The Technical +members to seek the experts advice and listen to their feedback. **The Technical Board is committed to make the experts opinions heard in the development of ILIAS. Recommendations by experts will have a strong impact on the decisions of the TB.** @@ -45,7 +45,7 @@ responsabilities are wide ranging, so it is not to be expected for all its membe experts in all aspects it tackles. The UI/UX/A11y Expert Group can be reached through its own email address (ux@lists.ilias.de). * The task of the UX/UI/A11y experts is to promote uniform user guidance and simple usability across ILIAS, for sighted users as well as for user with special requirements for the user interface. -* The UX/UI/A11y experts help to ask the right questions and find answers for all concepts, ideas, or problems regarding the user interface, the user experience or the accessibility of ILIAS. They take existing kitchen sink components and their rules into account and are willing to participate in the development or improvement of UI components for the UI framework. The coordinate their work with the coordinators of the UI framework. +* The UX/UI/A11y experts help to ask the right questions and find answers for all concepts, ideas, or problems regarding the user interface, the user experience or the accessibility of ILIAS. They take existing kitchen sink components and their rules into account and are willing to participate in the development or improvement of UI components for the UI framework. They coordinate their work with the coordinators of the UI framework. * The UI/UX/A11y experts participate in related SIGs, such as SIG Accessibility or SIG Client, and take part in the discussions there. * As a common and open space to discuss issues, the UI/UX/A11y experts run the UI/UX/A11y clinic. * The UI/UX/A11y Expert Group plays a central role in the [Accessibility Process](accessibility-process.md#participants). From 4f4f13a6c97707aa3d76aef8dff37b557a83ea10 Mon Sep 17 00:00:00 2001 From: Vivek Kumar <115945472+vivekBoii@users.noreply.github.com> Date: Tue, 31 Oct 2023 01:52:00 +0530 Subject: [PATCH 024/497] Update git-hooks.md --- docs/development/git-hooks.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/development/git-hooks.md b/docs/development/git-hooks.md index 9aa8cd8653a7..c3cf2729252b 100644 --- a/docs/development/git-hooks.md +++ b/docs/development/git-hooks.md @@ -5,7 +5,7 @@ It describes how Git hooks can be installed/activated [manually](#creating-git-h and where to find some offial Git hooks provided by the ILIAS community. Furtheremore it contains installation instructions for [CaptainHook](#the-easy-way-captainhook---git-hook-library), a Git hook PHP library used by ILIAS to manage and execute a shared Git -hook configuration amongst contributers. +hook configuration amongst contributors. **Table of Contents** * [General](#general) @@ -13,7 +13,7 @@ hook configuration amongst contributers. * [The Easy Way: CaptainHook - Git Hook Library](#the-easy-way-captainhook---git-hook-library) * [Installation](#installation) * [Troubleshooting](#troubleshooting) - * [The Manualy Way: Creating Git Hooks](#the-manual-way-creating-git-hooks) + * [The Manual Way: Creating Git Hooks](#the-manual-way-creating-git-hooks) * [ILIAS Git Hooks](#ilias-git-hooks) ### General @@ -122,7 +122,7 @@ similar to [captainhook.json](../../captainhook.json). #### The Manual Way: Creating Git Hooks -Git hooks recide in the `.git/hooks` directory of a Git repository. +Git hooks reside in the `.git/hooks` directory of a Git repository. To install/activate a Git hook first enter this directory. ```bash @@ -130,7 +130,7 @@ cd .git/hooks ``` By default every hook has the suffix `.sample`. This suffix prevents them -from beeing executed by default when a particular Git event occurs. +from being executed by default when a particular Git event occurs. Removing this suffix will activate the hook. @@ -158,4 +158,4 @@ only, and may not be used in production environments__ The Git hook scripts can be found in the [git_hooks](https://github.com/ILIAS-eLearning/DeveloperTools/tree/master/git_hooks) folder of the official [ILIAS Developer Tools](https://github.com/ILIAS-eLearning/DeveloperTools) -GitHub repository. \ No newline at end of file +GitHub repository. From 5cf5cdf0ba0d6c4addb4882b7743d951f82e2a3f Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 31 Oct 2023 15:47:29 +0100 Subject: [PATCH 025/497] Test: Fix Points Can Be Float in Ordering Question See: https://mantis.ilias.de/view.php?id=38286 --- .../classes/class.assOrderingQuestionGUI.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assOrderingQuestionGUI.php b/Modules/TestQuestionPool/classes/class.assOrderingQuestionGUI.php index bfd3d80ff0d8..2873c63047f0 100755 --- a/Modules/TestQuestionPool/classes/class.assOrderingQuestionGUI.php +++ b/Modules/TestQuestionPool/classes/class.assOrderingQuestionGUI.php @@ -190,9 +190,11 @@ public function writeQuestionSpecificPostData(ilPropertyFormGUI $form): void $this->updateImageFiles(); } - $this->object->setPoints((int)$this->request->raw("points")); + $points = (float) str_replace(',', '.', $this->request->raw('points')); - $use_nested = $this->request->raw(self::F_USE_NESTED) === "1"; + $this->object->setPoints($points); + + $use_nested = $this->request->raw(self::F_USE_NESTED) === '1'; $this->object->setNestingType($use_nested); } From a9aacc2e0154092cf5931a71570276406cfdc370 Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Tue, 31 Oct 2023 19:01:37 +0100 Subject: [PATCH 026/497] Copy all changes in lang/ilias_fr.lang from ILIAS 7 to ILIAS 8 --- lang/ilias_fr.lang | 6274 ++++++++++++++++++++++---------------------- 1 file changed, 3138 insertions(+), 3136 deletions(-) diff --git a/lang/ilias_fr.lang b/lang/ilias_fr.lang index afe29999e8ea..e05fc7843da5 100644 --- a/lang/ilias_fr.lang +++ b/lang/ilias_fr.lang @@ -1,10 +1,10 @@ -/* Copyright (c) 1998-2020 ILIAS open source e-Learning e.V., Extended GPL, see docs/LICENSE */ +/* Copyright (c) 1998-2023 ILIAS open source e-Learning e.V., Extended GPL, see docs/LICENSE */ /** * ILIAS language file * * @module language file French * @modulegroup language -* @author I.E.F Jean-Paul Manigand , Sébastien Fraysse , Laurent Merle , Bernard Beron +* @author Marily Vouillamoz , I.E.F Jean-Paul Manigand , Sébastien Fraysse , Laurent Merle , Bernard Beron * @version $Id$ */ // The language file starts beyond the HTML-comment below. DO NOT modify this line! @@ -14,64 +14,64 @@ // to the corresponding mode! // Language file names refer to ISO 639, see: http://www.oasis-open.org/cover/iso639a.html -acc#:#acc_add_document_btn_label#:#Add Document###07 02 2020 new variable -acc#:#acc_crit_type_usr_language#:#Profile Language###07 02 2020 new variable -acc#:#acc_criterion_assignment_must_be_unique_insert#:#You cannot attach this criterion with this value. There is already an identical criterion attached.###07 02 2020 new variable -acc#:#acc_criterion_assignment_must_be_unique_update#:#You cannot change the criterion as desired. There is already an identical criterion attached.###07 02 2020 new variable -acc#:#acc_ctrl_cpt_txt#:#Accessibility Control Concept###07 02 2020 new variable -acc#:#acc_deleted_documents_p#:#The documents have been deleted.###07 02 2020 new variable -acc#:#acc_deleted_documents_s#:#The document has been deleted.###07 02 2020 new variable -acc#:#acc_doc_crit_attached#:#The criterion has been attached.###07 02 2020 new variable -acc#:#acc_doc_crit_changed#:#The criterion has been changed.###07 02 2020 new variable -acc#:#acc_doc_crit_detached#:#The criterion has been detached.###07 02 2020 new variable -acc#:#acc_doc_delete#:#Delete Document###07 02 2020 new variable -acc#:#acc_doc_detach_crit_confirm_title#:#Detach Criterion###07 02 2020 new variable -acc#:#acc_doc_sure_detach_crit#:#Are your sure you want to detach the criterion?###07 02 2020 new variable -acc#:#acc_document#:#Document###07 02 2020 new variable -acc#:#acc_form_attach_criterion_head#:#Attach Criterion###07 02 2020 new variable -acc#:#acc_form_criterion#:#Criterion###07 02 2020 new variable -acc#:#acc_form_document#:#Document###07 02 2020 new variable -acc#:#acc_form_document_content_changed#:#The contents of the uploaded file was purified by ILIAS. Please check the result and upload a new file, if necessary.###07 02 2020 new variable -acc#:#acc_form_document_info#:#Please select a file from your local filesystem. You can either upload a plain text file, or a simple HTML file. HTML files will be purified, only the contents of the body element will be used.###07 02 2020 new variable -acc#:#acc_form_document_new#:#Change Content###07 02 2020 new variable -acc#:#acc_form_document_new_info#:#Please select a file from your local filesystem. You can either upload a plain text file, or a simple HTML file. HTML files will be purified, only the contents of the body element will be used. The existing contents will be replaced.###07 02 2020 new variable -acc#:#acc_form_document_title#:#Title###07 02 2020 new variable -acc#:#acc_form_document_title_info#:#Please enter a title for the document.###07 02 2020 new variable -acc#:#acc_form_edit_criterion_head#:#Edit Criterion Assignment###07 02 2020 new variable -acc#:#acc_form_edit_doc_head#:#Edit Document###07 02 2020 new variable -acc#:#acc_form_new_doc_head#:#Create Document###07 02 2020 new variable +acc#:#acc_add_document_btn_label#:#Add Document +acc#:#acc_crit_type_usr_language#:#Profile Language +acc#:#acc_criterion_assignment_must_be_unique_insert#:#You cannot attach this criterion with this value. There is already an identical criterion attached. +acc#:#acc_criterion_assignment_must_be_unique_update#:#You cannot change the criterion as desired. There is already an identical criterion attached. +acc#:#acc_ctrl_cpt_txt#:#Accessibility Control Concept +acc#:#acc_deleted_documents_p#:#The documents have been deleted. +acc#:#acc_deleted_documents_s#:#The document has been deleted. +acc#:#acc_doc_crit_attached#:#The criterion has been attached. +acc#:#acc_doc_crit_changed#:#The criterion has been changed. +acc#:#acc_doc_crit_detached#:#The criterion has been detached. +acc#:#acc_doc_delete#:#Delete Document +acc#:#acc_doc_detach_crit_confirm_title#:#Detach Criterion +acc#:#acc_doc_sure_detach_crit#:#Are your sure you want to detach the criterion? +acc#:#acc_document#:#Document +acc#:#acc_form_attach_criterion_head#:#Attach Criterion +acc#:#acc_form_criterion#:#Criterion +acc#:#acc_form_document#:#Document +acc#:#acc_form_document_content_changed#:#The contents of the uploaded file was purified by ILIAS. Please check the result and upload a new file, if necessary. +acc#:#acc_form_document_info#:#Please select a file from your local filesystem. You can either upload a plain text file, or a simple HTML file. HTML files will be purified, only the contents of the body element will be used. +acc#:#acc_form_document_new#:#Change Content +acc#:#acc_form_document_new_info#:#Please select a file from your local filesystem. You can either upload a plain text file, or a simple HTML file. HTML files will be purified, only the contents of the body element will be used. The existing contents will be replaced. +acc#:#acc_form_document_title#:#Title +acc#:#acc_form_document_title_info#:#Please enter a title for the document. +acc#:#acc_form_edit_criterion_head#:#Edit Criterion Assignment +acc#:#acc_form_edit_doc_head#:#Edit Document +acc#:#acc_form_new_doc_head#:#Create Document acc#:#acc_forward_mail#:#Transférer email acc#:#acc_function#:#Fonction acc#:#acc_last_rep_visited#:#Catalogue/Dernière Page Visitée -acc#:#acc_saved_sorting#:#The sorting has been saved.###07 02 2020 new variable -acc#:#acc_sure_delete_documents_p#:#Are you sure you want to delete the selected documents?###07 02 2020 new variable -acc#:#acc_sure_delete_documents_s#:#Are you sure you want to delete the document?###07 02 2020 new variable -acc#:#acc_tbl_docs_action_add_criterion#:#Add Criterion###07 02 2020 new variable -acc#:#acc_tbl_docs_cell_not_criterion#:#No criterion assigned###07 02 2020 new variable -acc#:#acc_tbl_docs_head_created#:#Creation Date###07 02 2020 new variable -acc#:#acc_tbl_docs_head_criteria#:#Criteria###07 02 2020 new variable -acc#:#acc_tbl_docs_head_last_change#:#Last Change###07 02 2020 new variable -acc#:#acc_tbl_docs_head_sorting#:#Sorting###07 02 2020 new variable -acc#:#acc_tbl_docs_head_title#:#Title###07 02 2020 new variable -acc#:#acc_tbl_docs_title#:#Documents###07 02 2020 new variable +acc#:#acc_saved_sorting#:#The sorting has been saved. +acc#:#acc_sure_delete_documents_p#:#Are you sure you want to delete the selected documents? +acc#:#acc_sure_delete_documents_s#:#Are you sure you want to delete the document? +acc#:#acc_tbl_docs_action_add_criterion#:#Add Criterion +acc#:#acc_tbl_docs_cell_not_criterion#:#No criterion assigned +acc#:#acc_tbl_docs_head_created#:#Creation Date +acc#:#acc_tbl_docs_head_criteria#:#Criteria +acc#:#acc_tbl_docs_head_last_change#:#Last Change +acc#:#acc_tbl_docs_head_sorting#:#Sorting +acc#:#acc_tbl_docs_head_title#:#Title +acc#:#acc_tbl_docs_title#:#Documents acc#:#acc_tree_off#:#Arborescence Désactivée acc#:#acc_tree_on#:#Arborescence Activée -adm#:#adm_acc_ctrl_cpt_desc#:#If activated, the link for the Accessibility Control Concept shows up in the Footer.###30 04 2021 new variable -adm#:#adm_acc_ctrl_cpt_enable#:#Enable Accessibility Control Concept###30 04 2021 new variable -adm#:#adm_accessibility_contacts#:#Accessibility Point of Contact###07 02 2020 new variable -adm#:#adm_accessibility_contacts_info#:#Contacts for reporting accessibility issues in the footer link. Comma separated list of account logins.###07 02 2020 new variable +adm#:#adm_acc_ctrl_cpt_desc#:#If activated, the link for the Accessibility Control Concept shows up in the Footer. +adm#:#adm_acc_ctrl_cpt_enable#:#Enable Accessibility Control Concept +adm#:#adm_accessibility_contacts#:#Accessibility Point of Contact +adm#:#adm_accessibility_contacts_info#:#Contacts for reporting accessibility issues in the footer link. Comma separated list of account logins. adm#:#adm_awrn_support_contacts_info#:#Tous les contacts de support technique sont répertoriés. Les utilisateurs sont définis comme des contacts de support technique dans la section « Paramètres Généraux → Informations de Contacts ». adm#:#adm_support_contacts#:#Support technique adm#:#adm_support_contacts_info#:#Contacts de support technique utilisés dans le lien de bas de page, et si activé dans le 'Qui est en ligne ?', comme liste séparée de comptes de connexion. -administration#:#adm_achievements#:#Achievements###07 02 2020 new variable +administration#:#adm_achievements#:#Succès administration#:#adm_activate_db_benchmark#:#Activer Benchmark administration#:#adm_activate_db_benchmark_desc#:#Le test de performance sera automatiquement désactivé après avoir été effectué. administration#:#adm_add_settings_template#:#Ajouter Modèle administration#:#adm_adm_role_protect#:#Protéger le Rôle Administrateur administration#:#adm_adm_role_protect_info#:#Lorsque activé, seuls les administrateurs sont autorisés à attribuer/retirer le rôle administrateur. -administration#:#adm_auth_login#:#Authentication Login###30 04 2021 new variable -administration#:#adm_auth_reg#:#Authentication Registration###30 04 2021 new variable -administration#:#adm_communication#:#Communication###07 02 2020 new variable +administration#:#adm_auth_login#:#Authentication Login +administration#:#adm_auth_reg#:#Authentication Registration +administration#:#adm_communication#:#Communication administration#:#adm_db_bench_by_first_table#:#Agrégé par le premier tableau dans SQL administration#:#adm_db_bench_chronological#:#Par Ordre d'Exécution administration#:#adm_db_bench_slowest_first#:#Les plus lents d’abord @@ -80,7 +80,7 @@ administration#:#adm_db_benchmark#:#Référence DB administration#:#adm_db_benchmark_user#:#Nom du compte de l'utilisateur administration#:#adm_db_benchmark_user_desc#:#Seules les mesures pour cet utilisateur seront effectuées. administration#:#adm_edit_settings_template#:#Modifier le Modèle -administration#:#adm_extending_ilias#:#Extending ILIAS###07 02 2020 new variable +administration#:#adm_extending_ilias#:#Étendre ILIAS administration#:#adm_external_setting_edit#:#Modifier Paramètres administration#:#adm_hide#:#Cacher dans le Formulaire de Paramétrage administration#:#adm_hide_tabs#:#Masquer les Onglets @@ -89,15 +89,15 @@ administration#:#adm_imprint#:#Mentions Légales administration#:#adm_imprint_inactive#:#La page de mentions légales est désactivée. Les utilisateurs n'y ont pas accès. administration#:#adm_item_cmd_asynch#:#Charger les Menus "Actions" de Manière Asynchrone administration#:#adm_item_cmd_asynch_info#:#Les menus "Actions" présents dans le catalogue sont chargés de manière asynchrone. Cela accroît les performances générales, mais ralentit légèrement l'affichage des menus. -administration#:#adm_layout_and_navigation#:#Layout and Navigation###07 02 2020 new variable +administration#:#adm_layout_and_navigation#:#Mise en page et navigation administration#:#adm_locale#:#Local administration#:#adm_locale_info#:#Paramètres régionaux, pouvant par exemple influencer le tri des objets. Exemples : fr_FR, de_DE. Plusieurs valeurs peuvent être saisies séparées par des virgules. Le premier valide sera utilisé. -administration#:#adm_maintenance#:#Maintenance +administration#:#adm_maintenance#:#Paramètre système et maintenance administration#:#adm_missing_entries#:#Il manque une valeur administration#:#adm_missing_entry_add#:#Ajouter une entrée administration#:#adm_missing_entry_add_action#:#Ajouter administration#:#adm_nr_statements#:#Nombre de Déclarations -administration#:#adm_personal_workspace#:#Personal Workspace###07 02 2020 new variable +administration#:#adm_personal_workspace#:#Espace personnel administration#:#adm_predefined_settings#:#Paramètres Prédéfinis administration#:#adm_pub_section_domain_filter#:#Filtre de domaine administration#:#adm_pub_section_domain_filter_info#:#Filtres des domaines donnant un accès anonyme. Enter un ou plusieurs domaines qui permettent un accès anonyme. @@ -111,8 +111,8 @@ administration#:#adm_rep_tree_limit_grp_crs_info#:#Active automatiquement la 'sy administration#:#adm_rep_tree_only_cntr#:#Conteneur Uniquement administration#:#adm_rep_tree_only_cntr_info#:#Uniquement les catégories, cours et groupes sont affichés en liste. administration#:#adm_rep_tree_presentation#:#Présentation de l'Arborescence du Catalogue -administration#:#adm_repository_and_objects#:#Repository and Objects###07 02 2020 new variable -administration#:#adm_search_and_find#:#Search and Find###07 02 2020 new variable +administration#:#adm_repository_and_objects#:#Catalogue et éléments +administration#:#adm_search_and_find#:#Chercher et trouver administration#:#adm_settings_templates#:#Modèles de Paramétrage administration#:#adm_show_comments_tagging_in_lists#:#Afficher le nombre de notes, commentaires et mots-clés dans les listes d'objets administration#:#adm_show_comments_tagging_in_lists_tags#:#Afficher les mot-clés au lieu du nombre @@ -120,16 +120,16 @@ administration#:#adm_sql#:#SQL administration#:#adm_sure_delete_settings_template#:#Voulez-vous vraiment supprimer les modèles suivants ? administration#:#adm_table#:#Tableau administration#:#adm_time#:#Durée -administration#:#adm_user_administration#:#Utilisateurs -administration#:#adm_user_starting_point#:#Page de Démarrage -administration#:#adm_user_starting_point_info#:#Sélectionnez la page ou l'objet qui doit être affiché après connexion. -administration#:#adm_user_starting_point_inherit#:#Utiliser les Paramètres Standards -administration#:#adm_user_starting_point_inherit_info#:#Les paramètres de l'administrateur de la plate-forme seront utilisés dans leur ensemble. +administration#:#adm_user_administration#:#Utilisateurs et rôles +administration#:#adm_user_starting_point#:#Page personnelle de démarrage +administration#:#adm_user_starting_point_info#:#Sélectionnez la page ou l'objet qui doit être affiché après la connexion. +administration#:#adm_user_starting_point_inherit#:#Utiliser les paramètres standards +administration#:#adm_user_starting_point_inherit_info#:#Les paramètres standards définis par l'administrateur de la plateforme seront utilisés. administration#:#adm_user_starting_point_invalid_info#:#Cette fonction est actuellement désactivée. -administration#:#adm_user_starting_point_object#:#Objet du Catalogue +administration#:#adm_user_starting_point_object#:#Objet du catalogue administration#:#adm_user_starting_point_personal#:#Paramètres Personnels administration#:#adm_user_starting_point_personal_info#:#Lorsque activé, les utilisateurs peuvent choisir leur page de démarrage. -administration#:#adm_user_starting_point_ref_id#:#ID Référence +administration#:#adm_user_starting_point_ref_id#:#ID référence administration#:#adm_user_starting_point_ref_id_info#:#Ouvre l'objet que vous voulez utiliser comme point de départ. Copier le nombre qui suit "ref_id=" dans le champs de saisie. administration#:#adm_value#:#Valeur Prédéfinie administration#:#allow_change_loginname#:#Permettre la modification du nom de connexion (login) dans le profil personnel @@ -253,7 +253,7 @@ administration#:#language_scope_unchanged_info#:#Exporter toutes les entrées de administration#:#language_settings#:#Paramètres de Langue administration#:#language_statistics#:#Statistiques administration#:#language_translation_enabled#:#Traduction des pages activée -administration#:#language_variables_saved#:#The changes to the language variables were saved successfully.###25 06 2021 new variable +administration#:#language_variables_saved#:#The changes to the language variables were saved successfully. administration#:#log_scan#:#Ecrire les Résultats d'Analyse administration#:#log_scan_desc#:#Écriture des résultats de l'analyse dans le fichier 'scanlog.log' dans le dossier de données du client. administration#:#loginname_change_blocking_time#:#Période bloquée pour modification des noms de connexion (login) @@ -264,20 +264,20 @@ administration#:#nothing_to_purge#:#Rien à purger ... administration#:#nothing_to_remove#:#Rien à supprimer... administration#:#nothing_to_restore#:#Rien à restaurer... administration#:#obj_blga#:#Blog -administration#:#obj_blga_desc#:#Paramétrage des Blogs -administration#:#obj_chta_desc#:#Administration du Chat +administration#:#obj_blga_desc#:#Paramétrage des blogs +administration#:#obj_chta_desc#:#Administration du Chat et du server du Chat administration#:#obj_excs#:#Exercice -administration#:#obj_excs_desc#:#Paramètres généraux pour les Exercices -administration#:#obj_mds#:#Méta-données -administration#:#obj_mds_desc#:#Configurer les paramètres de méta-données et de méta-données avancées -administration#:#obj_otpl#:#Modèles d'Objet -administration#:#obj_otpl_desc#:#Modèles pour la création de nouveaux objets +administration#:#obj_excs_desc#:#Paramètres généraux pour les exercices +administration#:#obj_mds#:#Métadonnées +administration#:#obj_mds_desc#:#Paramètres des métadonnées +administration#:#obj_otpl#:#Modèles didactiques +administration#:#obj_otpl_desc#:#Modèles pour la création de nouveaux éléments avec des paramètres de droits prédéfinis administration#:#obj_prfa#:#Portfolio -administration#:#obj_prfa_desc#:#Paramétrage des Portfolios +administration#:#obj_prfa_desc#:#Paramétrage des portfolios administration#:#obj_taxs#:#Taxonomie -administration#:#obj_taxs_desc#:#Paramétrage de Taxonomie +administration#:#obj_taxs_desc#:#Paramétrage de taxonomie administration#:#options#:#Options -administration#:#org_op_edit_user_accounts#:#Edit User Accounts###07 02 2020 new variable +administration#:#org_op_edit_user_accounts#:#Edit User Accounts administration#:#output_options#:#Options de restitution administration#:#path_to_mkisofs#:#Chemin d'accès à "mkisofs" administration#:#purge_age_limit#:#Limiter l'âge @@ -335,65 +335,65 @@ administration#:#vc_information#:#Information de Contrôle de Version administration#:#vc_information_not_determined#:#ILIAS n’a pas pu déterminer la moindre information de contrôle de version. administration#:#view_last_log#:#Voir le journal de la dernière analyse administration#:#view_log#:#Voir les détails -adn#:#administrative_notification_description#:#Provide system-wide notifications in topbar of ILIAS###30 04 2021 new variable -adn#:#btn_cancel#:#Cancel###30 04 2021 new variable -adn#:#btn_delete#:#Delete###30 04 2021 new variable -adn#:#btn_delete_confirm#:#Would you like to delete this Notification?###30 04 2021 new variable -adn#:#btn_edit#:#Edit###30 04 2021 new variable -adn#:#btn_reset#:#Reset###30 04 2021 new variable -adn#:#btn_reset_confirm#:#Would you like to reset this Notification for all Users?###30 04 2021 new variable -adn#:#common_actions#:#Actions###30 04 2021 new variable -adn#:#common_add_msg#:#Add Notification###30 04 2021 new variable -adn#:#main#:#Notifications###30 04 2021 new variable -adn#:#msg_body#:#Body###30 04 2021 new variable -adn#:#msg_body_info#:#Body of the Notification###30 04 2021 new variable -adn#:#msg_dismissable#:#Dismissable###30 04 2021 new variable -adn#:#msg_dismissable_info#:#Notifications can be closed by the user. The user won't see this notification again.###30 04 2021 new variable -adn#:#msg_display_date_end#:#Displayed Until###30 04 2021 new variable -adn#:#msg_display_date_start#:#Displayed From###30 04 2021 new variable -adn#:#msg_error_false_date_configuration#:#Can't create a notification with this configuration of dates. The event must be within the display time.###30 04 2021 new variable -adn#:#msg_event_date_end#:#Event Ends###30 04 2021 new variable -adn#:#msg_event_date_start#:#Event Starts###30 04 2021 new variable -adn#:#msg_form_title#:#Notification###30 04 2021 new variable -adn#:#msg_limit_to_roles#:#Role-sensitive Presentation###30 04 2021 new variable -adn#:#msg_limit_to_roles_info#:#Only the selected roles will see the notification.###30 04 2021 new variable -adn#:#msg_limited_to_role_ids#:#Roles###30 04 2021 new variable -adn#:#msg_permanent#:#Display###30 04 2021 new variable -adn#:#msg_permanent_info#:#Display Notifications permanently or temporarily###30 04 2021 new variable -adn#:#msg_permanent_no#:#Show Temporarily###30 04 2021 new variable -adn#:#msg_permanent_yes#:#Show Permanently###30 04 2021 new variable -adn#:#msg_presentation#:#Presentation###31 08 2022 new variable -adn#:#msg_show_to_all_roles#:#Show to all roles###31 08 2022 new variable -adn#:#msg_show_to_all_roles_info#:#All users even when not logged-in will see notification.###31 08 2022 new variable -adn#:#msg_success_created#:#Notification created###30 04 2021 new variable -adn#:#msg_success_deleted#:#Notification sucessfully deleted###30 04 2021 new variable -adn#:#msg_success_reset#:#Notification reset###30 04 2021 new variable -adn#:#msg_success_updated#:#Notification updated###30 04 2021 new variable -adn#:#msg_table_title#:#Notifications###30 04 2021 new variable -adn#:#msg_title#:#Headline###30 04 2021 new variable -adn#:#msg_title_info#:#Short Headline of the Notification###30 04 2021 new variable -adn#:#msg_type#:#Importance###30 04 2021 new variable -adn#:#msg_type_0#:#Notice###30 04 2021 new variable -adn#:#msg_type_1#:#Notice###30 04 2021 new variable -adn#:#msg_type_2#:#Important###30 04 2021 new variable -adn#:#msg_type_3#:#Breaking News###30 04 2021 new variable -adn#:#msg_type_during_event#:#During Event###30 04 2021 new variable -adn#:#msg_type_info#:#the importance has an influence on the color representation of the notification###30 04 2021 new variable -adn#adn#:#administrative_notification#:#Administrative Notifications###31 03 2023 new variable +adn#:#administrative_notification_description#:#Provide system-wide notifications in topbar of ILIAS +adn#:#btn_cancel#:#Cancel +adn#:#btn_delete#:#Delete +adn#:#btn_delete_confirm#:#Would you like to delete this Notification? +adn#:#btn_edit#:#Edit +adn#:#btn_reset#:#Reset +adn#:#btn_reset_confirm#:#Would you like to reset this Notification for all Users? +adn#:#common_actions#:#Actions +adn#:#common_add_msg#:#Add Notification +adn#:#main#:#Notifications +adn#:#msg_body#:#Body +adn#:#msg_body_info#:#Body of the Notification +adn#:#msg_dismissable#:#Dismissable +adn#:#msg_dismissable_info#:#Notifications can be closed by the user. The user won't see this notification again. +adn#:#msg_display_date_end#:#Displayed Until +adn#:#msg_display_date_start#:#Displayed From +adn#:#msg_error_false_date_configuration#:#Can't create a notification with this configuration of dates. The event must be within the display time. +adn#:#msg_event_date_end#:#Event Ends +adn#:#msg_event_date_start#:#Event Starts +adn#:#msg_form_title#:#Notification +adn#:#msg_limit_to_roles#:#Role-sensitive Presentation +adn#:#msg_limit_to_roles_info#:#Only the selected roles will see the notification. +adn#:#msg_limited_to_role_ids#:#Roles +adn#:#msg_permanent#:#Display +adn#:#msg_permanent_info#:#Display Notifications permanently or temporarily +adn#:#msg_permanent_no#:#Show Temporarily +adn#:#msg_permanent_yes#:#Show Permanently +adn#:#msg_presentation#:#Presentation +adn#:#msg_show_to_all_roles#:#Show to all roles +adn#:#msg_show_to_all_roles_info#:#All users even when not logged-in will see notification. +adn#:#msg_success_created#:#Notification created +adn#:#msg_success_deleted#:#Notification sucessfully deleted +adn#:#msg_success_reset#:#Notification reset +adn#:#msg_success_updated#:#Notification updated +adn#:#msg_table_title#:#Notifications +adn#:#msg_title#:#Headline +adn#:#msg_title_info#:#Short Headline of the Notification +adn#:#msg_type#:#Importance +adn#:#msg_type_0#:#Notice +adn#:#msg_type_1#:#Notice +adn#:#msg_type_2#:#Important +adn#:#msg_type_3#:#Breaking News +adn#:#msg_type_during_event#:#During Event +adn#:#msg_type_info#:#the importance has an influence on the color representation of the notification +adn#adn#:#administrative_notification#:#Administrative Notifications###31 10 2023 new variable adve#:#advanced_editing_excass_settings#:#Paramètres des Activités d'Exercice adve#:#advanced_editing_tst_editing#:#Activer l'Edition de Contenu pour des questions supplémentaires adve#:#advanced_editing_tst_editing_desc#:#Activate ILIAS Page Editor for feedback and hint text editing. adve#:#adve_activation#:#Activation adve#:#adve_auto_url_linking#:#Lien URL automatique adve#:#adve_auto_url_linking_info#:#Essaie d’identifier les URL comme «http://..» dans les paragraphes de textes et crée automatiquement des liens autour. -adve#:#adve_autosave#:#Automatic Saving Intervall###30 04 2021 new variable -adve#:#adve_autosave_info#:#Auto-save for text content. With shorter intervals, the server load increases and the performance of the system decreases.###30 04 2021 new variable -adve#:#adve_autosave_info_min_10#:#Please choose a value of minimal 10 seconds if you activated this feature.###30 04 2021 new variable +adve#:#adve_autosave#:#Automatic Saving Intervall +adve#:#adve_autosave_info#:#Auto-save for text content. With shorter intervals, the server load increases and the performance of the system decreases. +adve#:#adve_autosave_info_min_10#:#Please choose a value of minimal 10 seconds if you activated this feature. adve#:#adve_blocking_mode#:#Verrouillage de Page adve#:#adve_char_selector_settings#:#Sélecteur des Caractères adve#:#adve_excass_settings#:#Activités d'un Exercice adve#:#adve_grp_copa#:#Content Pages -adve#:#adve_grp_frm#:#Forums###31 03 2023 new variable +adve#:#adve_grp_frm#:#Forums###31 10 2023 new variable adve#:#adve_grp_glo#:#Glossaires adve#:#adve_grp_lm#:#Documents d'apprentissage ILIAS adve#:#adve_grp_rep#:#Pages du Catalogue @@ -409,45 +409,45 @@ adve#:#adve_text_content_features#:#Options de l'éditeur de Texte adve#:#adve_use_physical#:#Utiliser b/i/u au lieu de str/emp/imp adve#:#adve_use_physical_info#:#Ce paramètre permet de remplacer les boutons "strong", "emphatic" et "important" par les boutons "b" (bold/gras), "i" (italic/italique) et "u" (underlined/souligné). Notez que cela peut entraîner des incohérences si l'éditeur de style est utilisé et que d'autres attributs sont affectés aux classes "strong", "emphatic" et "important". adve#:#adve_use_tiny_mce#:#Activez TinyMCE pour une Edition WYSIWYG -adve#:#char_selector_admin#:#Sélecteur de Caractères Unicode (TODO) -adve#:#char_selector_blocks#:#Tables Unicode Disponibles +adve#:#char_selector_admin#:#Sélecteur de Caractères Unicode +adve#:#char_selector_blocks#:#Jeux de caractères spéciaux disponibles (Unicode) adve#:#char_selector_blocks_info#:#Tous les caractères de la table sélectionnée seront proposés, mais tous ne sont peut-être pas supportés par la police de votre navigateur. -adve#:#char_selector_custom_items#:#Sélection Personnalisée -adve#:#char_selector_custom_items_info1#:#La sélection courante sera affichée avec les tables sélectionnées. Veuillez ajouter vos caractères avec le style suivant : +adve#:#char_selector_custom_items#:#Sélection personnalisée +adve#:#char_selector_custom_items_info1#:#La sélection personnalisée sera listée avant les blocs sélectionnés. Veuillez ajouter vos caractères dans le style suivant : adve#:#char_selector_custom_items_info2a#:#A B C adve#:#char_selector_custom_items_info2b#:#Les caractères sont séparés par des espaces, générant des boutons de sélection séparés adve#:#char_selector_custom_items_info3a#:#A BC D adve#:#char_selector_custom_items_info3b#:#Il est possible d'ajouter plus de caractères à un bouton adve#:#char_selector_custom_items_info4a#:#A-Z -adve#:#char_selector_custom_items_info4b#:#Les intervalles de caractères peuvent être définis avec "-" +adve#:#char_selector_custom_items_info4b#:#Les plages de caractères peuvent être définies avec "-" adve#:#char_selector_custom_items_info5a#:#U+00C0 adve#:#char_selector_custom_items_info5b#:#Un caractère peut aussi être défini en notation Unicode (insensible à la casse) adve#:#char_selector_custom_items_info6a#:#U+00C0-U+00CF -adve#:#char_selector_custom_items_info6b#:#Les intervalles sont aussi possibles avec la notation Unicode -adve#:#char_selector_disabled_admin#:#Désactivé (TODO) +adve#:#char_selector_custom_items_info6b#:#Les plages sont aussi possibles avec la notation Unicode +adve#:#char_selector_disabled_admin#:#Désactivé adve#:#char_selector_disabled_info_admin#:#Désactive le sélecteur. Le sélecteur peut toutefois être activé pour chaque utilisateur et test. adve#:#char_selector_disabled_info_test#:#Désactive le sélecteur pendant l'exécution d'un test. -adve#:#char_selector_disabled_info_user#:#Désactive le sélecteur. Le sélecteur peut toutefois être activé pour chaque test. -adve#:#char_selector_disabled_test#:#Désactivé (TODO) -adve#:#char_selector_disabled_user#:#Désactivé (TODO) -adve#:#char_selector_enabled_admin#:#Activé (TODO) +adve#:#char_selector_disabled_info_user#:#Lors des tests, un menu permettant de sélectionner des caractères spéciaux ne s'affiche pas. Cependant, les tests individuels "forcent l'activation" du menu bien que vous l'ayez désactivé ici. +adve#:#char_selector_disabled_test#:#Désactivé +adve#:#char_selector_disabled_user#:#Désactiver le menu de sélection des caractères spéciaux +adve#:#char_selector_enabled_admin#:#Activé adve#:#char_selector_enabled_info_admin#:#Active le sélecteur accessible via un bouton dans le menu principal. Le sélecteur peut être (dés)activé pour chaque utilisateur et test. adve#:#char_selector_enabled_info_test#:#Active le sélecteur pendant l'exécution d'un test. -adve#:#char_selector_enabled_info_user#:#Active le sélecteur accessible via un bouton dans le menu principal. -adve#:#char_selector_enabled_test#:#Activé (TODO) -adve#:#char_selector_enabled_user#:#Activé (TODO) -adve#:#char_selector_inactive_admin#:#Inactif (TODO) +adve#:#char_selector_enabled_info_user#:#Lors des tests, un menu permettant de sélectionner des caractères spéciaux s'affiche. Toutefois, des tests individuels peuvent empêcher ce réglage d'être effectif et ne pas afficher le menu des caractères spéciaux malgré votre choix de l'activer. +adve#:#char_selector_enabled_test#:#Activé +adve#:#char_selector_enabled_user#:#Activer le menu de sélection des caractères spéciaux +adve#:#char_selector_inactive_admin#:#Inactif adve#:#char_selector_inactive_info_admin#:#Désactive le sélecteur. Le sélecteur ne peut pas être activé dans les utilisateurs et tests. adve#:#char_selector_inherit_info_test#:#Utiliser les réglages de la plateforme ou de l'utilisateur. -adve#:#char_selector_inherit_info_user#:#Utiliser les réglages de la plateforme. -adve#:#char_selector_inherit_test#:#Inherit (TODO) -adve#:#char_selector_inherit_user#:#Inherit (TODO) +adve#:#char_selector_inherit_info_user#:#Les paramètres standards définis par l'administrateur de la plateforme seront utilisés. +adve#:#char_selector_inherit_test#:#Inherit +adve#:#char_selector_inherit_user#:#Utiliser les paramètres standards adve#:#char_selector_menu_close#:#Fermer le sélecteur de caractères spéciaux adve#:#char_selector_menu_open#:#Ouvrir le sélecteur de caractères spéciaux adve#:#char_selector_msg_blocks_or_custom_needed#:#Lorsque vous activez le sélecteur, veuillez choisir un bloc de caractères ou entrer une sélection spéciale ! -adve#:#char_selector_test#:#Sélecteur de Caractères Unicode (TODO) -adve#:#char_selector_unicode_all#:#Toutes les Tables Unicode -adve#:#char_selector_user#:#Sélecteur de Caractères Unicode (TODO) +adve#:#char_selector_test#:#Sélecteur de Caractères Unicode +adve#:#char_selector_unicode_all#:#Toutes les tables Unicode +adve#:#char_selector_user#:#Menu de sélection des caractères spéciaux (Unicode) dans les tests assessment#:#action#:#Action assessment#:#addSuggestedSolution#:#Ajouter solution suggérée assessment#:#add_answers#:#Add Antworten @@ -472,7 +472,7 @@ assessment#:#answer_image#:#Réponse en image assessment#:#answer_is_not_correct_but_positive#:#Vous obtenez des points pour votre réponse mais ce n'est pas la meilleure réponse. assessment#:#answer_is_right#:#Votre réponse est correcte assessment#:#answer_is_wrong#:#Votre réponse est incorrecte -assessment#:#answer_of#:#Answer of###07 02 2020 new variable +assessment#:#answer_of#:#Answer of assessment#:#answer_options#:#Options de réponse: assessment#:#answer_question#:#Répondez à la question assessment#:#answer_text#:#Texte de Réponse @@ -562,17 +562,17 @@ assessment#:#assessment_pool_selection#:#Choix d'un réservoir assessment#:#assessment_scoring_adjust#:#Activer les corrections assessment#:#assessment_scoring_adjust_desc#:#Activer la fonction de correction pour permettre la modification de questions du test. assessment#:#autocomplete_error#:#Votre numéro auto-complété est trop long, vous avez des réponses qui ont moins de caractères et qui ne seront donc jamais affichées. -assessment#:#autoparticipants_subtab#:#Participants###07 02 2020 new variable +assessment#:#autoparticipants_subtab#:#Participants assessment#:#autosave#:#Sauvegarde Automatique assessment#:#autosave_failed#:#Echec de l'enregistrement automatique ! assessment#:#autosave_info#:#Lorsque activé, les réponses sont enregistrées régulièrement sans intervention de l'utilisateur, afin de prévenir toute perte de donnée. assessment#:#autosave_ival#:#Intervalle assessment#:#autosave_success#:#Enregistrement automatique réussi… -assessment#:#autosavecontent#:#Autosave Content###30 04 2021 new variable +assessment#:#autosavecontent#:#Autosave Content assessment#:#average_reached_points#:#Moyennes des points obtenus assessment#:#back_to_objective_container#:#Aller au cours -assessment#:#backtocallingpage#:#Back to the question page###29 06 2022 new variable -assessment#:#backtocallingpool#:#Back to the question pool###29 06 2022 new variable +assessment#:#backtocallingpage#:#Back to the question page +assessment#:#backtocallingpool#:#Back to the question pool assessment#:#backtocallingtest#:#Retour au test assessment#:#baseunit#:#Unité de Base assessment#:#button_request_next_question_hint#:#Indice Suivant @@ -626,8 +626,8 @@ assessment#:#counter#:#Compteur assessment#:#create_date#:#Créé assessment#:#create_gaps#:#Créer trou assessment#:#create_new#:#Créer nouveau -assessment#:#ctm_cannot_be_changed#:#This is a test in CTM-Mode. Settings cannot be changed anymore as CTM has been abandoned.###31 03 2023 new variable -assessment#:#ctm_cannot_be_started#:#This is a test in CTM-Mode. The test cannot be started anymore as CTM has been abandoned.###31 03 2023 new variable +assessment#:#ctm_cannot_be_changed#:#This is a test in CTM-Mode. Settings cannot be changed anymore as CTM has been abandoned.###31 10 2023 new variable +assessment#:#ctm_cannot_be_started#:#This is a test in CTM-Mode. The test cannot be started anymore as CTM has been abandoned.###31 10 2023 new variable assessment#:#customstyle#:#Style personnalisé assessment#:#dashboard_tab#:#Dashboard assessment#:#definition#:#Définition @@ -682,13 +682,13 @@ assessment#:#end_tag#:#Balise de fin assessment#:#enlarge#:#agrandir assessment#:#enter_anonymous_code#:#Saisir le code d'accès anonyme assessment#:#enter_enough_positive_points#:#Le nombre de points maximum pour cette question doit être supérieur à zéro ! Indiquez un nombre de points suffisants et non négatifs -assessment#:#enter_enough_positive_points_checked#:#At least one answer needs to score. Please enter a positive score for the selection of an answer.###07 02 2020 new variable +assessment#:#enter_enough_positive_points_checked#:#At least one answer needs to score. Please enter a positive score for the selection of an answer. assessment#:#enter_valid_values#:#Veuillez entrer une valeur correcte. Les caractères ne sont pas considérés comme corrects. assessment#:#errFormulaQuestion#:#A question de type Formule contient des informations incorrectes ! assessment#:#errRecursionInResult#:#La formule contient une récursivité infinie. assessment#:#err_category_in_use#:#Au minimum une catégorie ne peut être supprimée. Une ou plusieurs unités de la catégorie sont encore utilisées. -assessment#:#err_divider_too_big#:#The divider of one of the variables in this question is too big.###09 03 2022 new variable -assessment#:#err_division#:#This value has to be smaller than the maximum range.###09 03 2022 new variable +assessment#:#err_divider_too_big#:#The divider of one of the variables in this question is too big. +assessment#:#err_division#:#This value has to be smaller than the maximum range. assessment#:#err_duplicate_results#:#Vous avez utilisé une variable de résultat plusieurs fois, ce qui n'est pas autorisé dans le texte d'une question. assessment#:#err_no_formula#:#Vous devez entrer une formule assessment#:#err_no_numeric_value#:#Veuillez saisir une valeur numérique. @@ -717,9 +717,9 @@ assessment#:#essay_scoring_mode_without_keywords#:#Pas de Notation Automatique assessment#:#essay_scoring_mode_without_keywords_desc#:#Aucun point attribué tant que le tuteur n'a pas effectué la notation manuelle. assessment#:#eval_all_users#:#Résultats par Utilisateur assessment#:#eval_legend_link#:#Veuillez vous reporter à la légende pour connaître le sens des symboles des entêtes de colonnes. -assessment#:#evaluated_users#:#Evaluated Users###07 02 2020 new variable +assessment#:#evaluated_users#:#Evaluated Users assessment#:#exam_id#:#Identifiant Examen : -assessment#:#exam_id_label#:#Exam Id###30 04 2021 new variable +assessment#:#exam_id_label#:#Exam Id assessment#:#examid_in_test_pass#:#Afficher l'ID des Essais assessment#:#examid_in_test_pass_desc#:#Un ID Essai est affiché dans le test. Un nouvel ID est généré pour chaque passage de test. assessment#:#examid_in_test_res#:#ILIAS Testpass ID @@ -757,14 +757,14 @@ assessment#:#filter_show_question_types#:#Afficher types de questions assessment#:#filter_show_questionpools#:#Afficher Banques de Questions assessment#:#final_statement#:#Conclusion assessment#:#final_statement_show_desc#:#Si cochée, la conclusion sera affichée dès le test achevé et avant la présentation des résultats. -assessment#:#finalized_by#:#Completed by###07 02 2020 new variable -assessment#:#finalized_evaluation#:#Scoring completed###07 02 2020 new variable -assessment#:#finalized_on#:#Completed at###07 02 2020 new variable +assessment#:#finalized_by#:#Completed by +assessment#:#finalized_evaluation#:#Scoring completed +assessment#:#finalized_on#:#Completed at assessment#:#finish_all_user_passes#:#Finir tous les essais de test assessment#:#finish_pass_for_all_users#:#Êtes-vous sûr de vouloir finir les essais de test pour tous les utilisateurs? -assessment#:#finish_pass_for_all_users_in_processing_time#:#You cannot finish the passes of all users together, because for at least one user the processing time is not over yet.###09 03 2022 new variable +assessment#:#finish_pass_for_all_users_in_processing_time#:#You cannot finish the passes of all users together, because for at least one user the processing time is not over yet. assessment#:#finish_pass_for_user_confirmation#:#Êtes-vous sûr de vouloir terminer cet essai de test? -assessment#:#finish_pass_for_user_in_processing_time#:#WARNING: the processing time for this user is not over yet! You should only end the test run if there is a compelling reason (e.g. exclusion from the test).###09 03 2022 new variable +assessment#:#finish_pass_for_user_in_processing_time#:#WARNING: the processing time for this user is not over yet! You should only end the test run if there is a compelling reason (e.g. exclusion from the test). assessment#:#finish_test#:#Terminer le Test assessment#:#finish_unfinished_passes#:#Finir les essais ouverts assessment#:#finish_unfinished_passes_desc#:#Passes which have a Finishing time or a Duration limit configured will be closed by this cron job. @@ -875,10 +875,10 @@ assessment#:#log_user_not_entered_values#:#L'utilisateur n'a saisi aucune valeur assessment#:#log_user_solution_willingly_deleted#:#L’utilisateur a supprimé la réponse. assessment#:#log_wrong_test_password_entered#:#Le Participant a entré un mot de passe de test erroné. assessment#:#longmenu#:#Longmenu -assessment#:#longmenu_answeroptions_differ#:#This question does not work correctly, as there are not the same amount of gaps in the text as in the correction options.###28 07 2023 new variable +assessment#:#longmenu_answeroptions_differ#:#This question does not work correctly, as there are not the same amount of gaps in the text as in the correction options. assessment#:#longmenu_text#:#Texte de menu long assessment#:#mailnottype#:#Envoyer notification lorsqu'un utilisateur achève un passage de test. -assessment#:#mailnottype_desc#:#Notify the owner of the test even if the number of test attempts has not been limited.###09 11 2022 new variable +assessment#:#mailnottype_desc#:#Notify the owner of the test even if the number of test attempts has not been limited. assessment#:#maintenance#:#Maintenance assessment#:#manscoring#:#Notation Manuelle assessment#:#manscoring_done#:#Participants notés @@ -918,7 +918,7 @@ assessment#:#new_category#:#Nouvelle Catégorie d'Unité assessment#:#new_unit#:#Nouvelle Unité assessment#:#next_question#:#Suivant assessment#:#next_question_rows#:#Questions %d - %d sur %d >> -assessment#:#no_manual_feedback_export_info#:#Manual feedbacks will not be exported.###13 09 2023 new variable +assessment#:#no_manual_feedback_export_info#:#Manual feedbacks will not be exported. assessment#:#no_passed_mark#:#Vous devez définir au moins une appréciation de REUSSITE. L'échelle d'évaluation n'a pas été enregistrée. assessment#:#no_question_selected_for_move#:#Veuillez cocher au moins une question pour la déplacer assessment#:#no_questions_available#:#Il n'y a pas de questions disponibles ! @@ -928,7 +928,7 @@ assessment#:#no_selection_for_move#:#Aucune question à déplacer assessment#:#no_target_selected_for_move#:#Vous devez sélectionner une position de destination assessment#:#no_user_or_group_selected#:#Veuillez sélectionner le type d'objets que vous cherchez (utilisateurs et/ou groupes) assessment#:#not_all_obligations_answered#:#Vous devez répondre à toutes les questions obligatoires avant de terminer le test. -assessment#:#not_evaluated_users#:#Not Yet Evaluated User###07 02 2020 new variable +assessment#:#not_evaluated_users#:#Not Yet Evaluated User assessment#:#not_yet_accessed#:#Pas encore accédé assessment#:#nr_of_correct_answers#:#Nombre de Réponses Attendues assessment#:#number_of_answers#:#Nombre de Réponses @@ -960,7 +960,7 @@ assessment#:#oq_btn_use_order_pictures#:#Utiliser les images réponses assessment#:#oq_btn_use_order_terms#:#Utiliser les termes réponses assessment#:#oq_header_ordering_elements#:#Eléments de Triage assessment#:#or#:#ou -assessment#:#order#:#Order###09 11 2022 new variable +assessment#:#order#:#Order assessment#:#ordering_answer_sequence_info#:#La séquence de réponse définie, ici, sera prise comme séquence correcte de la solution. assessment#:#ordertext#:#Texte à ordonner assessment#:#ordertext_info#:#Veuillez saisir le texte devant être ordonné horizontalement. Le texte à ordonner devra être séparé par des caractères blancs dans le texte. Vous pouvez aussi utiliser le séparateur %s pour séparer vos groupes de texte. @@ -1040,8 +1040,8 @@ assessment#:#qpl_lac_legend_label_operators#:#Opérateurs assessment#:#qpl_maxchars_info_numeric_question#:#Si vous entrez une valeur, le champ de la réponse numérique sera créé avec une longueur fixe de cette valeur, de sorte qu'il n'est pas possible d'entrer plus de caractères autorisés. Notez que pour les intervalles numériques, le séparateur décimal est compté comme un caractère régulier. assessment#:#qpl_move_insert_clipboard#:#Les questions sélectionnées sont marquées pour être déplacées assessment#:#qpl_move_select_none#:#Sélectionner au moins une question pour la déplacer -assessment#:#qpl_numeric_lower_needs_valid_lower_alert#:#The lower bound needs to be valid numerical value lower than the upper bound.###07 02 2020 new variable -assessment#:#qpl_numeric_upper_needs_valid_upper_alert#:#The upper bound needs to be valid numerical value greater than the lower bound.###07 02 2020 new variable +assessment#:#qpl_numeric_lower_needs_valid_lower_alert#:#The lower bound needs to be valid numerical value lower than the upper bound. +assessment#:#qpl_numeric_upper_needs_valid_upper_alert#:#The upper bound needs to be valid numerical value greater than the lower bound. assessment#:#qpl_paste_error#:#At least one question could not pe pasted into the question pool. Possible reason: You tried to move the question into the same question pool. assessment#:#qpl_paste_no_objects#:#Il n'y a aucune question dans le presse-papier. Liez ou coupez une question dans le presse-papier. assessment#:#qpl_paste_success#:#Les questions ont été copiées dans la banque de questions @@ -1078,32 +1078,32 @@ assessment#:#qpl_skl_sub_tab_quest_assign#:#Affectation compétence / question assessment#:#qpl_skl_sub_tab_usages#:#Fréquence d’affectation assessment#:#qpl_sync_quest_skl_assigns_confirmation#:#La question a été insérée depuis un autre répertoire. L’original de la question doit-il être mis à jour avec la configuration actuelle des affectations de compétence? assessment#:#qpl_tab_competences#:#Compétences -assessment#:#qst_error_text_too_long#:#One or more text elements marked as erroneous are too long. The maximum size for a text element marked as erroneous is 150 characters:###21 06 2023 new variable -assessment#:#qst_essay_allready_written_words#:#Already entered words:###07 02 2020 new variable -assessment#:#qst_essay_chars_remaining#:#Remaining characters:###07 02 2020 new variable -assessment#:#qst_essay_wordcounter_enabled#:#Count Words###07 02 2020 new variable -assessment#:#qst_essay_wordcounter_enabled_info#:#The entered words are counted. The number of written words is shown to the participants below the text input field.###07 02 2020 new variable -assessment#:#qst_essay_written_words#:#Number of entered words:###07 02 2020 new variable -assessment#:#qst_lifecycle#:#Lifecycle###07 02 2020 new variable -assessment#:#qst_lifecycle_draft#:#Draft###07 02 2020 new variable -assessment#:#qst_lifecycle_filter_all#:#All Lifecycles###07 02 2020 new variable -assessment#:#qst_lifecycle_final#:#Final###07 02 2020 new variable -assessment#:#qst_lifecycle_outdated#:#Outdated###07 02 2020 new variable -assessment#:#qst_lifecycle_rejected#:#Rejected###07 02 2020 new variable -assessment#:#qst_lifecycle_review#:#To be Reviewed###07 02 2020 new variable -assessment#:#qst_lifecycle_sharable#:#Sharable###07 02 2020 new variable -assessment#:#qst_nested_nested_answers_off#:#No indents, just order###29 07 2022 new variable -assessment#:#qst_nested_nested_answers_on#:#Use indents in anwers###29 07 2022 new variable +assessment#:#qst_error_text_too_long#:#One or more text elements marked as erroneous are too long. The maximum size for a text element marked as erroneous is 150 characters:###31 10 2023 new variable +assessment#:#qst_essay_allready_written_words#:#Already entered words: +assessment#:#qst_essay_chars_remaining#:#Remaining characters: +assessment#:#qst_essay_wordcounter_enabled#:#Count Words +assessment#:#qst_essay_wordcounter_enabled_info#:#The entered words are counted. The number of written words is shown to the participants below the text input field. +assessment#:#qst_essay_written_words#:#Number of entered words: +assessment#:#qst_lifecycle#:#Lifecycle +assessment#:#qst_lifecycle_draft#:#Draft +assessment#:#qst_lifecycle_filter_all#:#All Lifecycles +assessment#:#qst_lifecycle_final#:#Final +assessment#:#qst_lifecycle_outdated#:#Outdated +assessment#:#qst_lifecycle_rejected#:#Rejected +assessment#:#qst_lifecycle_review#:#To be Reviewed +assessment#:#qst_lifecycle_sharable#:#Sharable +assessment#:#qst_nested_nested_answers_off#:#No indents, just order +assessment#:#qst_nested_nested_answers_on#:#Use indents in anwers assessment#:#qst_nr_of_tries#:#Nombre de tentatives assessment#:#qst_preview_reset_msg#:#L'aperàçu a été réinitialisé. -assessment#:#qst_use_nested_answers#:#Nested answers###29 07 2022 new variable +assessment#:#qst_use_nested_answers#:#Nested answers assessment#:#que_contains_unused_var#:#Le texte de la question contient une variable qui n'est utilisée dans aucune formule de réponse. assessment#:#question_browse_area_info#:#Veuillez sélectionner un objet à partir duquel vous souhaitez importer des questions. assessment#:#question_cumulated_statistics#:#Résultats Consolidés par Question assessment#:#question_id#:#ID de Question assessment#:#question_id_short#:#ID assessment#:#question_instances_title#:#Cette question est utilisée dans les tests suivants -assessment#:#question_is_part_of_running_test#:#Question is part of a running test and may not be edited.###29 06 2022 new variable +assessment#:#question_is_part_of_running_test#:#Question is part of a running test and may not be edited. assessment#:#question_marking#:#Activer le Marquage des Questions assessment#:#question_marking_description#:#Si cochée, chaque participant a la possibilité de marquer chaque question d'un test pour indiquer que quelque chose reste à faire sur cette question (par ex. vérifier à nouveau, répondu, non répondu). Les marques sont visibles aussi dans la liste des questions (si elle est disponible). assessment#:#question_not_answered#:#Question sans réponse @@ -1113,7 +1113,7 @@ assessment#:#question_summary_btn#:#Processing Status assessment#:#question_title#:#Titre de la Question assessment#:#question_type#:#Type de Question assessment#:#questionpool_not_entered#:#Veuillez saisir un nom pour un groupe de questions. -assessment#:#questionpool_not_selected#:#Please select a question pool!###07 02 2020 new variable +assessment#:#questionpool_not_selected#:#Please select a question pool! assessment#:#questions_from#:#questions de assessment#:#questions_per_page_view#:#Vue par Page assessment#:#random_accept_sample#:#Accepter échantillon @@ -1223,7 +1223,7 @@ assessment#:#suggest_range#:#Suggérer un Intervalle assessment#:#suggestedSolutionType#:#Type de solution suggérée assessment#:#suggested_solution#:#Contenu pour Récapitulation assessment#:#suggested_solution_added_successfully#:#Vous avez ajouté une ressource avec succès ! -assessment#:#tab_nest_answers#:#Nesting###29 07 2022 new variable +assessment#:#tab_nest_answers#:#Nesting assessment#:#term#:#Terme assessment#:#term_image#:#Image du terme assessment#:#term_text#:#Texte du terme @@ -1239,11 +1239,11 @@ assessment#:#test_jump_to#:#Aller à la Question assessment#:#test_move_page#:#Déplacer la question assessment#:#test_next_question#:#Question Suivante assessment#:#test_prev_question#:#Question Précédente -assessment#:#test_question_set_type#:#Selection of Test Questions###31 03 2023 new variable -assessment#:#test_question_set_type_fixed#:#Fixed Questions###31 03 2023 new variable -assessment#:#test_question_set_type_fixed_info#:#All test participants see the same questions.
You can create questions directly in the test as well as use questions from a Question Pool. If you create new questions, you can decide to save them in a Question Pool.###31 03 2023 new variable -assessment#:#test_question_set_type_random#:#Random Questions###31 03 2023 new variable -assessment#:#test_question_set_type_random_info#:#Each test participant will see an individually generated set of questions. The questions are drawn from one or more Question Pools.###31 03 2023 new variable +assessment#:#test_question_set_type#:#Selection of Test Questions###31 10 2023 new variable +assessment#:#test_question_set_type_fixed#:#Fixed Questions###31 10 2023 new variable +assessment#:#test_question_set_type_fixed_info#:#All test participants see the same questions.
You can create questions directly in the test as well as use questions from a Question Pool. If you create new questions, you can decide to save them in a Question Pool.###31 10 2023 new variable +assessment#:#test_question_set_type_random#:#Random Questions###31 10 2023 new variable +assessment#:#test_question_set_type_random_info#:#Each test participant will see an individually generated set of questions. The questions are drawn from one or more Question Pools.###31 10 2023 new variable assessment#:#test_results#:#Options de Résultats assessment#:#test_scoring#:#Options de Notation assessment#:#test_template_reset#:#Le modèle de paramétrage a été retiré. @@ -1258,7 +1258,7 @@ assessment#:#textsize#:#Taille du Texte assessment#:#textsize_errortext_info#:#Saisir la taille du texte d'erreur en pourcentage si vous désirez une taille autre que 100%. assessment#:#textsize_info#:#Saisir la taille du texte à ordonner en pourcentage si vous désirez une taille autre que 100%. assessment#:#thumb_size#:#Taille de miniature -assessment#:#thumb_size_info#:#Les miniatures d'image seront créées avec la valeur saisie en hauteur et largeur. Le ratio de l'aspect sera préservé. +assessment#:#thumb_size_info#:#Si la taille de miniature est renseignée, une miniature de cette taille sera générée pour le image téléversée. Sans taille de miniature, la taille originale de l'image sera conservée. assessment#:#thumb_size_unit_pixel#:#Pixel assessment#:#time_format#:#HH MM SS assessment#:#timing#:#Temps Supplémentaire @@ -1282,10 +1282,10 @@ assessment#:#tst_activation_limited_visibility_info#:#Lorsque activé, le test e assessment#:#tst_activation_online_info#:#Lorsque le test est hors-ligne, seuls les administrateurs peuvent le voir et l'éditer. assessment#:#tst_add_quest_cont_edit_mode#:#Mode d'Edition par Défaut pour Contenu Additionnel assessment#:#tst_add_quest_cont_edit_mode_IPE#:#Edition de Contenu Supplémentaire avec Editeur de Page -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 ILIAS learning module.###30 04 2021 new variable +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 ILIAS learning module. assessment#:#tst_add_quest_cont_edit_mode_RTE#:#Mode d'Edition par Défaut pour Contenu Additionnel -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 ILIAS learning module.###30 04 2021 new variable -assessment#:#tst_addit_passes_blocked_after_passed_msg#:#You have passed the test. The test cannot be started again.###07 02 2020 new variable +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 ILIAS learning module. +assessment#:#tst_addit_passes_blocked_after_passed_msg#:#You have passed the test. The test cannot be started again. assessment#:#tst_all_test_competences#:#Tous les tests de compétence assessment#:#tst_all_user_data_deleted#:#Toutes les données utilisateur de ce test ont été détruites assessment#:#tst_allowed_users#:#Nombre Maximum d'Utilisateurs Simultanés @@ -1314,7 +1314,7 @@ assessment#:#tst_answer_status_answered#:#Répondues assessment#:#tst_answer_status_editing#:# (editing ... ) assessment#:#tst_answer_status_not_answered#:#Pas répondues assessment#:#tst_answered_questions#:#Réponses -assessment#:#tst_answered_questions_of_total#:#%s of %s###07 02 2020 new variable +assessment#:#tst_answered_questions_of_total#:#%s of %s assessment#:#tst_answered_questions_test#:#Questions avec réponse du test assessment#:#tst_attached_xls_file#:#Vous trouverez le résultat du test pour ce participant dans le fichier Excel ci-joint. assessment#:#tst_attempt#:#Tentative @@ -1323,13 +1323,13 @@ assessment#:#tst_back_to_question_list#:#Retour à la liste de questions assessment#:#tst_back_to_top#:#Retour en haut de la page assessment#:#tst_back_to_virtual_pass#:#Back to Questionoverview assessment#:#tst_best_solution_is#:#La meilleure réponse est -assessment#:#tst_block_passes_after_passed#:#Block Additional Passes After Test is Passed###07 02 2020 new variable -assessment#:#tst_block_passes_after_passed_info#:#After a participant has passed the test, no further test passes are allowed to the participant with this option.###07 02 2020 new variable +assessment#:#tst_block_passes_after_passed#:#Block Additional Passes After Test is Passed +assessment#:#tst_block_passes_after_passed_info#:#After a participant has passed the test, no further test passes are allowed to the participant with this option. assessment#:#tst_browse_for_qpl_questions#:#Ajouter depuis le pool assessment#:#tst_browse_for_tst_questions#:#Ajouter depuis un autre test assessment#:#tst_btn_hide_best_solutions#:#Cacher les meilleures solutions assessment#:#tst_btn_rebuild_random_question_stage#:#Synchronize Quesitons from Pool -assessment#:#tst_btn_reset_pool_sync#:#Edit/Cancel Synchronisation###29 06 2022 new variable +assessment#:#tst_btn_reset_pool_sync#:#Edit/Cancel Synchronisation assessment#:#tst_btn_show_best_solutions#:#Montrer les meilleures solutions assessment#:#tst_cannot_online_due_to_switched_quest_set_type_setting#:#Le test ne peut pas être mis en-ligne car le mode de test a été modifié. Vous devez choisir une configuration avant de pouvoir mettre le test en-ligne. assessment#:#tst_change_dyn_test_question_selection#:#Modifier la Sélection de Question Courante @@ -1347,8 +1347,8 @@ assessment#:#tst_corr_answ_stat_tbl_header_answer#:#Answer assessment#:#tst_corr_answ_stat_tbl_header_frequency#:#Frequency assessment#:#tst_corrections_answers_tbl#:#Statistics assessment#:#tst_corrections_answers_tbl_subindex#:#Statistics for %s -assessment#:#tst_corrections_incompatible_question_set_type#:#Corrections are only possible if the test uses a fixed set of questions.###24 09 2021 new variable -assessment#:#tst_corrections_manscore_reset_warning#:#There are %s manual scorings that have been done for the question "%s (ID: %s)". All manual scorings will be reset when saving the question.###07 02 2020 new variable +assessment#:#tst_corrections_incompatible_question_set_type#:#Corrections are only possible if the test uses a fixed set of questions. +assessment#:#tst_corrections_manscore_reset_warning#:#There are %s manual scorings that have been done for the question "%s (ID: %s)". All manual scorings will be reset when saving the question. assessment#:#tst_corrections_qst_form#:#Correction of Points assessment#:#tst_corrections_qst_remove_confirmation#:#Do you really want to finally remove the question "%s (ID: %s)" from the test? assessment#:#tst_corrections_tab_question#:#Question @@ -1358,7 +1358,7 @@ assessment#:#tst_count_correct_solutions#:#Comptabiliser uniquement les solution assessment#:#tst_count_correct_solutions_desc#:#Participants score either the maximum number of points for a fully correct and complete answer or 0 points in every other case. assessment#:#tst_count_partial_solutions#:#Comptabiliser les solutions partielles assessment#:#tst_count_partial_solutions_desc#:#Points for correctly provided partial answers are added up: Participants can score points for incomplete or partly wrong answers. -assessment#:#tst_current_run_no_longer_valid#:#Your current test run is no longer valid.
It was probably completed already or finished by a tutor.###16 03 2023 new variable +assessment#:#tst_current_run_no_longer_valid#:#Your current test run is no longer valid.
It was probably completed already or finished by a tutor. assessment#:#tst_default_settings#:#Préférences assessment#:#tst_defaults_applied#:#Les paramètres du test sélectionnés par défaut ont été appliqués. assessment#:#tst_defaults_apply_not_possible#:#ILIAS ne peut appliquer les paramètres par défaut sélectionnés à ce test ! Il est possible que ce test contienne déjà des questions et/ou de données de participant. @@ -1389,7 +1389,7 @@ assessment#:#tst_dynamic_question_set_source_questionpool_summary_string#:#%s (C assessment#:#tst_edit_competence_assign#:#Éditer les propriétés de la tâche assessment#:#tst_edit_scoring#:#Notation Manuelle assessment#:#tst_ending_time#:#Heure de Fin -assessment#:#tst_ending_time_before_starting_time#:#Please enter a date for the end of the test that is after the start date.###31 08 2022 new variable +assessment#:#tst_ending_time_before_starting_time#:#Please enter a date for the end of the test that is after the start date. assessment#:#tst_ending_time_desc#:#Moment où le test sera terminé: Les participants ne sont plus autorisés à répondre à des questions, le test est terminé par ILIAS. assessment#:#tst_enter_questionpool#:#Veuillez saisir le nom de la banque de questions assessment#:#tst_eval_question_points#:#Résultats de la tentative %s @@ -1408,13 +1408,13 @@ assessment#:#tst_exp_sc_short_desc#:#In the 'Statistics'-tab an additional expor assessment#:#tst_extratime_added#:#Le temps passé par le participant a été augmenté de %s minutes. assessment#:#tst_extratime_info#:#Si vous souhaitez ajouter le temps de travail plusieurs fois pour le même participant, veuillez insérer le temps total que vous souhaitez ajouter. assessment#:#tst_extratime_notavailable#:#Le temps supplémentaire ne peut être ajouté qu'aux tests à une seul essai et avec un temps maximum assigné. -assessment#:#tst_failed#:#Failed###07 02 2020 new variable +assessment#:#tst_failed#:#Failed assessment#:#tst_failed_imp_qst_skl_assign#:#The question's assignments to the following competences could not be created. The accoring competences could not be identified within the local system. assessment#:#tst_failed_imp_skl_thresholds#:#L’importation des seuils pour les compétences suivantes a été passée car les compétences correspondantes dans le système local sont configurées avec une liste de niveaux différente. assessment#:#tst_feedback#:#Retour -assessment#:#tst_feedback_is_given_inline#:#The feedback will be displayed along with your answer.###31 03 2023 new variable -assessment#:#tst_feedback_not_available_for_answer#:#There is no feedback available for your answer.###31 03 2023 new variable -assessment#:#tst_filter_lifecycle_enabled#:#Use Lifecycle as Filter###07 02 2020 new variable +assessment#:#tst_feedback_is_given_inline#:#The feedback will be displayed along with your answer. +assessment#:#tst_feedback_not_available_for_answer#:#There is no feedback available for your answer. +assessment#:#tst_filter_lifecycle_enabled#:#Use Lifecycle as Filter assessment#:#tst_filter_question_type#:#Type de question assessment#:#tst_filter_question_type_enabled#:#Utiliser le type de question comme filtre assessment#:#tst_filter_tax_node#:#Noeud de Taxinomie @@ -1436,8 +1436,8 @@ assessment#:#tst_general_properties#:#Paramètres Généraux assessment#:#tst_header_participant#:#Résultat : assessment#:#tst_header_solution#:#Solution correcte : assessment#:#tst_heading_scoring#:#Notation -assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable -assessment#:#tst_hide_pagecontents_desc#:#ILIAS 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.###31 03 2023 new variable +assessment#:#tst_hide_pagecontents#:#Hide page content###31 10 2023 new variable +assessment#:#tst_hide_pagecontents_desc#:#ILIAS 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.###31 10 2023 new variable assessment#:#tst_hide_side_list#:#Masquer liste de question assessment#:#tst_highscore_achieved_ts#:#Afficher la date du test assessment#:#tst_highscore_achieved_ts_description#:#Ajoute une colonne avec la date du test. @@ -1526,7 +1526,7 @@ assessment#:#tst_list_of_questions_start#:#Afficher la liste des questions avant assessment#:#tst_list_of_questions_with_description#:#Afficher les descriptions de question dans la liste des questions assessment#:#tst_man_scoring_by_part#:#Notation par Participant assessment#:#tst_man_scoring_by_qst#:#Notation par Question -assessment#:#tst_man_scoring_only_answered#:#Only answered###29 06 2022 new variable +assessment#:#tst_man_scoring_only_answered#:#Only answered assessment#:#tst_manage_competence_assigns#:#Gérer les tâches de compétence assessment#:#tst_manscoring_input_max_points_for_question#:#Points Maximum pour la Question assessment#:#tst_manscoring_input_question_and_user_solution#:#Question et Solution de l'utilisateur @@ -1624,7 +1624,7 @@ assessment#:#tst_pass_details#:#Afficher les détails assessment#:#tst_pass_details_header_lo_initial#:#Résultats du test initial pour les objectifs d’apprentissage
%s - %s assessment#:#tst_pass_details_header_lo_qualifying#:#Résultats du test de qualification pour les objectifs d’apprentissage
%s - %s assessment#:#tst_pass_details_overview_table_title#:#Aperçu détaillé pour l’essai %s -assessment#:#tst_pass_finished#:#Test pass finished###24 11 2022 new variable +assessment#:#tst_pass_finished#:#Test pass finished assessment#:#tst_pass_finished_on#:#Essai de test terminé le assessment#:#tst_pass_last_pass#:#Garder le Dernier Essai assessment#:#tst_pass_last_pass_desc#:#Le dernier essai d’un participant sera noté. @@ -1637,7 +1637,7 @@ assessment#:#tst_pass_scoring#:#Notation des Essais Multiples assessment#:#tst_pass_waiting_enabled#:#Forcer le temps d’attente entre les essais assessment#:#tst_pass_waiting_info#:#Avec cette option, les essais supplémentaires ne peuvent pas commencer avant que le temps défini ne soit écoulé par rapport au dernier essai terminé. assessment#:#tst_pass_waiting_time#:#Temps d’attente -assessment#:#tst_passed#:#Passed###07 02 2020 new variable +assessment#:#tst_passed#:#Passed assessment#:#tst_passes#:#Tentatives assessment#:#tst_password#:#Mot de Passe du Test assessment#:#tst_password_details#:#Si un mot de passe est défini pour ce test, tous les utilisateurs ayant accès à celui-ci devront saisir ce mot de passe pour y accéder. @@ -1646,8 +1646,8 @@ assessment#:#tst_password_entered_wrong_password#:#Vous ne pouvez pas commencer assessment#:#tst_password_form#:#Entrer le mot de passe du test assessment#:#tst_password_introduction#:#L'accès à ce test requiert la saisie d'un mot de passe. Veuillez saisir ce mot de passe pour commencer le test assessment#:#tst_percent_solved#:#Pourcentage de Réussite -assessment#:#tst_player_answer_saved_and_locked#:#Answer is saved and locked and can no longer be changed###21 12 2022 new variable -assessment#:#tst_please_select_source_pool#:#Please select a question pool.###13 09 2023 new variable +assessment#:#tst_player_answer_saved_and_locked#:#Answer is saved and locked and can no longer be changed +assessment#:#tst_please_select_source_pool#:#Please select a question pool. assessment#:#tst_please_select_target_for_pool_derives#:#Veuillez sélectionner un conteneur cible. assessment#:#tst_position#:#Question %s sur %s assessment#:#tst_position_without_total#:#Question %s @@ -1704,7 +1704,7 @@ assessment#:#tst_question_hints_ordering_clipboard_resetted#:#Le presse papier a assessment#:#tst_question_hints_paste_after_success_msg#:#L'indice %s a bien été collé après l'indice %s. assessment#:#tst_question_hints_paste_before_success_msg#:#L'indice %s a bien été collé avant l'indice %s. assessment#:#tst_question_hints_request_confirmation#:#Voulez vous vraiment recourir à l'indice %s ?
%s point(s) seront retirés de la note. -assessment#:#tst_question_hints_request_confirmation_no_deduction#:#No points will be deducted for this hint.###09 11 2022 new variable +assessment#:#tst_question_hints_request_confirmation_no_deduction#:#No points will be deducted for this hint. assessment#:#tst_question_hints_requested_hint_count_header#:#Indices proposés assessment#:#tst_question_hints_save_order_success_msg#:#Le classement des indices a été sauvegardé. assessment#:#tst_question_hints_tab#:#Indices @@ -1746,7 +1746,7 @@ assessment#:#tst_questions_removed#:#Question(s) retirée(s) assessment#:#tst_random_nr_of_questions#:#Combien de questions ? assessment#:#tst_random_select_questionpool#:#Sélectionner le jeu de questions dans lequel vous choisirez la question assessment#:#tst_reached_points#:#Points Obtenus -assessment#:#tst_reached_points_of_max#:#%s of %s###07 02 2020 new variable +assessment#:#tst_reached_points_of_max#:#%s of %s assessment#:#tst_remove_mark#:#Retirer cette marque assessment#:#tst_remove_question#:#Etes-vous sûr de vouloir retirer la question suivante du test ? assessment#:#tst_remove_questions#:#Etes-vous sûr(e) de vouloir supprimer la (les) question(s) suivante(s) du test ? @@ -1789,9 +1789,9 @@ assessment#:#tst_results_aggregated#:#Résultats Consolidés assessment#:#tst_results_back_introduction#:#Retour à l'Introduction assessment#:#tst_results_back_overview#:#retour à la vue des résultats assessment#:#tst_results_details_options#:#Autres détails inclus dans les résultats de test -assessment#:#tst_results_gamification#:#Gamification###31 03 2023 new variable -assessment#:#tst_results_grading_opt_show_details#:#Show detailed test results###31 03 2023 new variable -assessment#:#tst_results_grading_opt_show_details_desc#:#In addition to the summary test result, a "Detailed Results" action is provided. The "Detailed test results" table shows the titles of the questions and the points achieved for each run. The content of the table can be further supplemented in the "Further options" section.###31 03 2023 new variable +assessment#:#tst_results_gamification#:#Gamification###31 10 2023 new variable +assessment#:#tst_results_grading_opt_show_details#:#Show detailed test results###31 10 2023 new variable +assessment#:#tst_results_grading_opt_show_details_desc#:#In addition to the summary test result, a "Detailed Results" action is provided. The "Detailed test results" table shows the titles of the questions and the points achieved for each run. The content of the table can be further supplemented in the "Further options" section.###31 10 2023 new variable assessment#:#tst_results_grading_opt_show_mark#:#Afficher uniquement la marque résultante assessment#:#tst_results_grading_opt_show_mark_desc#:#La note obtenue sera ajoutée au résultat sommaire du test. Les participants peuvent accéder aux résultats de leurs tests sur l'onglet "Info". assessment#:#tst_results_grading_opt_show_status#:#Afficher seulement l'état "Réussite" ou "Echec" @@ -1799,8 +1799,8 @@ assessment#:#tst_results_grading_opt_show_status_desc#:#Les informations sur le assessment#:#tst_results_overview#:#Résultats du Test assessment#:#tst_results_print_best_solution#:#Meilleure Réponse dans les Résultats du Test assessment#:#tst_results_print_best_solution_info#:#Lorsque activé, la meilleure réponse apparaît dans la synthèse du test. -assessment#:#tst_results_print_best_solution_singlepage#:#Best Solution###31 03 2023 new variable -assessment#:#tst_results_print_best_solution_singlepage_info#:#Additionally for each question the best possible solution will be displayed.###31 03 2023 new variable +assessment#:#tst_results_print_best_solution_singlepage#:#Best Solution###31 10 2023 new variable +assessment#:#tst_results_print_best_solution_singlepage_info#:#Additionally for each question the best possible solution will be displayed.###31 10 2023 new variable assessment#:#tst_results_tax_filters#:#Filtre de résultats assessment#:#tst_resume_dyn_test_with_cur_quest_sel#:#Reprendre le Test avec la Question Courante assessment#:#tst_resume_test#:#Reprendre le Test @@ -1855,8 +1855,8 @@ assessment#:#tst_show_solution_compare#:#Comparer la Réponse avec la Solution d assessment#:#tst_show_solution_compare_desc#:#Participants are presented with an overview comparing their own answers with the best solutions. Please note that this view will be displayed in the ‘Detailed Results’ that can be accessed via the ‘Show Test Results‘-button on the ‘Info’-tab. It will not be displayed in the printable ‘List of Answers’ even though the setting is made here. assessment#:#tst_show_solution_details#:#Afficher les Réponses Correctes dans les Résultats assessment#:#tst_show_solution_details_desc#:#If selected, the detailed question solution is available to participants in the test results presentation. This includes the exact scoring of every answer, otherwise only an overview with the question titles and the reached points is shown. -assessment#:#tst_show_solution_details_singlepage#:#Scored Answers on single pages###31 03 2023 new variable -assessment#:#tst_show_solution_details_singlepage_desc#:#Participants can access each question individually and see if their answers were correct and how many points they scored.###31 03 2023 new variable +assessment#:#tst_show_solution_details_singlepage#:#Scored Answers on single pages###31 10 2023 new variable +assessment#:#tst_show_solution_details_singlepage_desc#:#Participants can access each question individually and see if their answers were correct and how many points they scored.###31 10 2023 new variable assessment#:#tst_show_solution_feedback#:#Afficher un Retour d'Information par Réponse dans les Résultats du Test assessment#:#tst_show_solution_feedback_desc#:#If is selected, the answer specific feedback will be shown in the test results next to the questions. assessment#:#tst_show_solution_printview#:#Afficher la Liste des Réponses @@ -1908,19 +1908,19 @@ assessment#:#tst_submit_results#:#Oui, je confirme l'envoi des réponses. assessment#:#tst_tab_competences#:#Compétences assessment#:#tst_tab_results_objective_oriented#:#Résultats par Objectifs d'apprentissage assessment#:#tst_tab_results_pass_oriented#:#Résultats par tentatives -assessment#:#tst_tbl_col_answered_questions#:#Answered Questions###07 02 2020 new variable -assessment#:#tst_tbl_col_final_mark#:#Mark###07 02 2020 new variable -assessment#:#tst_tbl_col_finished_passes#:#Finished Passes###31 08 2022 new variable -assessment#:#tst_tbl_col_finished_passes_num_of#:#%s of %s###31 08 2022 new variable -assessment#:#tst_tbl_col_last_scored_access#:#Last Scored Access###31 08 2022 new variable -assessment#:#tst_tbl_col_pass_finished#:#Pass Finished###07 02 2020 new variable -assessment#:#tst_tbl_col_passed_status#:#Grading###07 02 2020 new variable -assessment#:#tst_tbl_col_percent_result#:#Percent Solved###07 02 2020 new variable -assessment#:#tst_tbl_col_reached_points#:#Reached Points###07 02 2020 new variable -assessment#:#tst_tbl_col_scored_pass#:#Scored Pass###07 02 2020 new variable -assessment#:#tst_tbl_col_started_passes#:#Started Passes###31 08 2022 new variable +assessment#:#tst_tbl_col_answered_questions#:#Answered Questions +assessment#:#tst_tbl_col_final_mark#:#Mark +assessment#:#tst_tbl_col_finished_passes#:#Finished Passes +assessment#:#tst_tbl_col_finished_passes_num_of#:#%s of %s +assessment#:#tst_tbl_col_last_scored_access#:#Last Scored Access +assessment#:#tst_tbl_col_pass_finished#:#Pass Finished +assessment#:#tst_tbl_col_passed_status#:#Grading +assessment#:#tst_tbl_col_percent_result#:#Percent Solved +assessment#:#tst_tbl_col_reached_points#:#Reached Points +assessment#:#tst_tbl_col_scored_pass#:#Scored Pass +assessment#:#tst_tbl_col_started_passes#:#Started Passes assessment#:#tst_tbl_invited_users#:#Manually Selected Participants -assessment#:#tst_tbl_participants#:#Participants###07 02 2020 new variable +assessment#:#tst_tbl_participants#:#Participants assessment#:#tst_tbl_results_grades#:#Results and Grades assessment#:#tst_test_contains_obligatory_questions#:#Pour terminer ce test, vous devez répondre au moins à toutes les questions obligatoires (*). assessment#:#tst_test_result#:#Résultat du test @@ -2011,8 +2011,8 @@ auth#:#auth_account_migration_new#:#Créer Nouveau Compte Utilisateur auth#:#auth_activation_code_success#:#Votre compte a été réactivé. Vous pouvez maintenant vous connecter dans ILIAS. auth#:#auth_allow_local_info#:#Si cette option est activée, une authentification locale par rapport à la base de données ILIAS est toujours possible (avec un nom d'utilisateur/mot de passe local) pour les comptes utilisateur dont le mode d’authentification est défini sur SAML. auth#:#auth_auth_settings#:#Paramètres -auth#:#auth_cas_ldap#:#Synchronization using LDAP###31 03 2023 new variable -auth#:#auth_cas_ldap_info#:#If enabled, the synchronization of user accounts and role assignments is done using an existing LDAP configuration.###31 03 2023 new variable +auth#:#auth_cas_ldap#:#Synchronization using LDAP###31 10 2023 new variable +auth#:#auth_cas_ldap_info#:#If enabled, the synchronization of user accounts and role assignments is done using an existing LDAP configuration.###31 10 2023 new variable auth#:#auth_err_expired#:#Votre session a été désactivée pour cause d’inactivité. auth#:#auth_err_invalid_user_account#:#Authentification échouée à cause d’une erreur interne. auth#:#auth_err_ldap_exception#:#Authentification échouée à cause d’une erreur d’authentification interne (LDAP). @@ -2022,28 +2022,28 @@ auth#:#auth_info_migrate#:#Si vous avez déjà un compte ILIAS, saisir nom d'ut auth#:#auth_ldap_server_ds#:#Serveur LDAP auth#:#auth_login_editor#:#Editeur de la page de connexion auth#:#auth_oidc#:#OpenId Connect -auth#:#auth_oidc_failed#:#Login via OpenID Connect failed###16 03 2023 new variable -auth#:#auth_oidc_login_element_info#:#Login to ILIAS via OpenID Connect###30 04 2021 new variable +auth#:#auth_oidc_failed#:#Login via OpenID Connect failed +auth#:#auth_oidc_login_element_info#:#Login to ILIAS via OpenID Connect auth#:#auth_oidc_mapping_table#:#Zuordnung von ILIAS-Benutzerdaten zu OpenId Connect Attributen -auth#:#auth_oidc_profile#:#Zuordnung der Profildaten -auth#:#auth_oidc_role_info#:#OpenID Connect Attribute::Value (e.g: "roles::employee").###07 02 2020 new variable -auth#:#auth_oidc_role_mapping_table#:#Zurodnung von ILIAS-Rollen zu OpenId Connect Attributen -auth#:#auth_oidc_roles#:#Rollenzuordnung -auth#:#auth_oidc_settings#:#Server-Einstellungen -auth#:#auth_oidc_settings_activation#:#OpenID Connect aktivieren -auth#:#auth_oidc_settings_additional_scopes#:#Additional Scopes###30 04 2021 new variable +auth#:#auth_oidc_profile#:#User Profile Mapping +auth#:#auth_oidc_role_info#:#OpenID Connect Attribute::Value (e.g: "roles::employee"). +auth#:#auth_oidc_role_mapping_table#:#Attribution de rôles ILIAS à des attributs OpenID Connect +auth#:#auth_oidc_roles#:#Attribution des rôles +auth#:#auth_oidc_settings#:#Paramètres du serveur +auth#:#auth_oidc_settings_activation#:#Activer OpenID Connect +auth#:#auth_oidc_settings_additional_scopes#:#Additional Scopes auth#:#auth_oidc_settings_client_id#:#Client-ID -auth#:#auth_oidc_settings_custom_session_duration#:#Sitzungsdauer -auth#:#auth_oidc_settings_custom_session_duration_option#:#Eigene Sitzungsdauer -auth#:#auth_oidc_settings_custom_session_duration_type#:#Einstellungen zur Sitzungsdauer -auth#:#auth_oidc_settings_default_role#:#Rollenzuordnung -auth#:#auth_oidc_settings_default_role_info#:#Bitte wählen Sie eine globale Rolle für neu anzulegende ILIAS-Benutzer -auth#:#auth_oidc_settings_discovery_error#:#Retrieving the Discovery URL failed with: %s###16 03 2023 new variable -auth#:#auth_oidc_settings_discovery_url#:#Discovery URL of the provider###16 03 2023 new variable +auth#:#auth_oidc_settings_custom_session_duration#:#Durée de la session +auth#:#auth_oidc_settings_custom_session_duration_option#:#Durée de session adaptée +auth#:#auth_oidc_settings_custom_session_duration_type#:#Paramètres de durée de la session +auth#:#auth_oidc_settings_default_role#:#Attribution des rôles +auth#:#auth_oidc_settings_default_role_info#:#Veuillez sélectionner un rôle global pour les nouveaux utilisateurs ILIAS à créer +auth#:#auth_oidc_settings_discovery_error#:#Retrieving the Discovery URL failed with: %s +auth#:#auth_oidc_settings_discovery_url#:#Discovery URL of the provider auth#:#auth_oidc_settings_img#:#Bild -auth#:#auth_oidc_settings_img_file_info#:#Laden Sie ein Bild hoch das auf der Anmeldeseite angezeigt werden soll. Das Bild verlinkt automatisch auf das OpenId Connect Anmeldeskript. -auth#:#auth_oidc_settings_invalid_scopes#:#The following values are no valid Scopes: %s###30 04 2021 new variable -auth#:#auth_oidc_settings_le#:#Darstellung Anmeldeseite +auth#:#auth_oidc_settings_img_file_info#:#Téléchargez une image qui sera affichée sur la page d'inscription. L'image renvoie automatiquement au script de connexion OpenID Connect. +auth#:#auth_oidc_settings_invalid_scopes#:#The following values are no valid Scopes: %s +auth#:#auth_oidc_settings_le#:#Présentation de la page d'inscription auth#:#auth_oidc_settings_login_option_default#:#Anmeldung nicht erzwingen auth#:#auth_oidc_settings_login_option_default_info#:#Eine Anmeldung beim OpenId Connect Server ist nicht notwendig, wenn bereits eine gültige Sitzung vorliegt. auth#:#auth_oidc_settings_login_option_enforce#:#Anmeldung erzwingen @@ -2064,14 +2064,14 @@ auth#:#auth_oidc_settings_txt_val_info#:#Tragen Sie einen Text ein der auf der A auth#:#auth_oidc_settings_user_attr#:#Attributname der Benutzerzugänge auth#:#auth_oidc_settings_user_sync#:#Automatische Synchronisierung auth#:#auth_oidc_settings_user_sync_info#:#Wenn aktiviert, wird für Benutzer, die sich erfolgreich gegen Open ID Connect authentifiziert haben aber kein ILIAS-Benutzerkonto besitzen, automatisch ein neues Benutzerkonto erzeugt. -auth#:#auth_oidc_settings_validate_scope_custom#:#Use custom OpenID Connect Discovery url###16 03 2023 new variable -auth#:#auth_oidc_settings_validate_scope_default#:#Use :Provider-URL:/.well-known/openid-configuration###16 03 2023 new variable -auth#:#auth_oidc_settings_validate_scope_none#:#Do not validate Scopes on saving###16 03 2023 new variable -auth#:#auth_oidc_settings_validate_scopes#:#Validate Scopes upon saving###16 03 2023 new variable +auth#:#auth_oidc_settings_validate_scope_custom#:#Use custom OpenID Connect Discovery url +auth#:#auth_oidc_settings_validate_scope_default#:#Use :Provider-URL:/.well-known/openid-configuration +auth#:#auth_oidc_settings_validate_scope_none#:#Do not validate Scopes on saving +auth#:#auth_oidc_settings_validate_scopes#:#Validate Scopes upon saving auth#:#auth_oidc_update_field_info#:#Automatisch aktualisieren auth#:#auth_oidc_update_role_info#:#Nur bei Erstanmeldung (automatische Synchronisierung) anwenden auth#:#auth_oidconnect#:#OpenID Connect -auth#:#auth_page_type_auth#:#Login Page###30 04 2021 new variable +auth#:#auth_page_type_auth#:#Login Page auth#:#auth_saml#:#SAML auth#:#auth_saml_add_idp_btn#:#Ajouter un nouveau fournisseur d’identité auth#:#auth_saml_add_idp_md_error#:#La valeur donnée n’était pas un document XML valide. S’assurer que XML contient un fournisseur d’identité valide. @@ -2081,7 +2081,7 @@ auth#:#auth_saml_configure#:#Configurer l’authentification SAML auth#:#auth_saml_configure_idp#:#Configurer SAML IDP: %s auth#:#auth_saml_deleted_idp#:#Le fournisseur d’identité a été supprimé. auth#:#auth_saml_enable#:#Autoriser le support SAML -auth#:#auth_saml_err_sqlite_driver#:#The SAML authentication requires the SQLite driver for PHP. Please install the SQLite package and try again.###30 04 2021 new variable +auth#:#auth_saml_err_sqlite_driver#:#The SAML authentication requires the SQLite driver for PHP. Please install the SQLite package and try again. auth#:#auth_saml_idp#:#IDP auth#:#auth_saml_idp_selection_table_desc#:#Veuillez choisir le fournisseur d’identité avec lequel vous souhaitez vous connecter. auth#:#auth_saml_idp_selection_table_title#:#Sélection du fournisseur d’identité @@ -2106,7 +2106,7 @@ auth#:#auth_saml_username_claim_info#:#Définir l’attribut qu’ILIAS utilise auth#:#auth_sync#:#Synchronisation Utilisateur auth#:#auth_sync_cas#:#Génération automatique de comptes utilisateurs auth#:#auth_sync_cas_info#:#Crée automatiquement des comptes utilisateurs ILIAS pour les utilisateurs qui se sont correctement authentifiés avec CAS. -auth#:#err_auth_ldap_failed#:#Authentication failed. Please contact your ILIAS administrator.###24 09 2021 new variable +auth#:#err_auth_ldap_failed#:#Authentication failed. Please contact your ILIAS administrator. auth#:#err_auth_saml_failed#:#Authentification échouée. Veuillez contacter votre administrateur de système. auth#:#err_auth_saml_no_ilias_user#:#Authentification échouée. Veuillez contacter votre administrateur de système. auth#:#login_page_activate#:#Activer les Langues Sélectionnées @@ -2120,9 +2120,9 @@ awrn#:#awareness_settings#:#Paramètres Généraux awrn#:#awrn_caching_period#:#Période de Rafraà®chissement awrn#:#awrn_caching_period_info#:#Le temps attendu avant que le nombre d'utilisateurs dans le bandeau supérieure soit mise à jour et que les nouveaux utilisateurs en ligne soient déterminés. awrn#:#awrn_enable#:#Activer 'Qui est en Ligne ?' -awrn#:#awrn_filter#:#User Filter###30 04 2021 new variable +awrn#:#awrn_filter#:#Filtre utilisateur awrn#:#awrn_hide_from_awareness#:#Cacher Mon Statut En-Ligne -awrn#:#awrn_hide_from_awareness_info#:#L’outil «Qui est en ligne?» est dans la barre supérieure et liste les utilisateurs sélectionnés (par ex. contacts ou membres de vos cours). +awrn#:#awrn_hide_from_awareness_info#:#L'outil "Qui est en ligne ?" se trouve dans la barre supérieure et liste les utilisateurs sélectionnés (par ex. contacts ou membres de vos cours). awrn#:#awrn_inactive#:#Non Listé awrn#:#awrn_incl_offline#:#En ligne et Hors ligne awrn#:#awrn_max_inactivity#:#Période Maximale d'Inactivité @@ -2135,10 +2135,10 @@ awrn#:#awrn_online_only#:#En ligne Seulement awrn#:#awrn_seconds#:#sec awrn#:#awrn_use_osd#:#Pop-up utilisateurs en ligne awrn#:#awrn_use_osd_info#:#Un pop-up apparaît pour indiquer de nouveaux utilisateurs en ligne dans la liste «Qui est en ligne?». -awrn#:#awrn_user_show#:#Show your account in "Who-is-online?"###30 04 2021 new variable -awrn#:#user_awrn_default#:#Default###30 04 2021 new variable -awrn#:#user_awrn_hide#:#Hide my status###30 04 2021 new variable -awrn#:#user_awrn_show#:#Show my status###30 04 2021 new variable +awrn#:#awrn_user_show#:#Montrer votre profil dans "Qui est en ligne ?" +awrn#:#user_awrn_default#:#Par défaut +awrn#:#user_awrn_hide#:#Cacher mon statut +awrn#:#user_awrn_show#:#Montrer mon statut background_tasks#:#abort#:#Annuler background_tasks#:#background_tasks#:#Tâches d’arrière-plan background_tasks#:#background_tasks_running#:#Tâches d’arrière-plan @@ -2147,10 +2147,10 @@ background_tasks#:#proceed_job#:#Procéder background_tasks#:#remove#:#Retirer background_tasks#:#scheduled#:#Prévues background_tasks#:#task_might_be_failed#:#Cette tâche n’a pas répondu pendant un certain temps. Vous pouvez la quitter si vous le souhaitez. -background_tasks#:#ui_msg_files_violate_maxsize#:#The total download size violates the global limit. The download will be aborted.###07 02 2020 new variable -background_tasks#:#ui_msg_no_files_found#:#No files have been found. The download will be aborted.###07 02 2020 new variable -background_tasks#:#ui_msg_num_files#:#%s file(-s) were detected for download, do you want to continue?###07 02 2020 new variable -background_tasks#:#ui_msg_sum_file_sizes#:#The total download size before creating the zip-folder is %s. Do you want to continue?###07 02 2020 new variable +background_tasks#:#ui_msg_files_violate_maxsize#:#The total download size violates the global limit. The download will be aborted. +background_tasks#:#ui_msg_no_files_found#:#No files have been found. The download will be aborted. +background_tasks#:#ui_msg_num_files#:#%s file(-s) were detected for download, do you want to continue? +background_tasks#:#ui_msg_sum_file_sizes#:#The total download size before creating the zip-folder is %s. Do you want to continue? background_tasks#:#waiting#:#En attente badge#:#badge_activity_badges#:#Badges d’activités badge#:#badge_add_template#:#Ajouter modèle @@ -2180,7 +2180,7 @@ badge#:#badge_issued_on#:#Émis le badge#:#badge_lhist_badge_completed#:#Badge $3$ was awarded. badge#:#badge_lhist_badge_completed_in#:#Badge $3$ was awarded in $1$. badge#:#badge_manual#:#Récompense manuelle -badge#:#badge_new_badges#:#You have %1 new badge(s).###07 02 2020 new variable +badge#:#badge_new_badges#:#You have %1 new badge(s). badge#:#badge_no_valid_types_for_obj#:#Il n’y a actuellement aucun type de badge actif. Vous ne pouvez pas créer de nouveaux badges. Veuillez contacter votre administrateur. badge#:#badge_notification_badges#:#Nouveaux badges badge#:#badge_notification_badges_goto#:#À vos badges @@ -2297,7 +2297,7 @@ bibl#:#identifier#:#Identifier bibl#:#msg_confirm_delete_filter#:#Do you like to delete the following filter? bibl#:#news_title_created#:#Nouvelle bibliographie ajoutée bibl#:#news_title_updated#:#Bibliographie mise à jour -bibl#:#not_yet_migrated#:#This Object has not et been migrated. Please contact the administrators of the platform.###31 03 2023 new variable +bibl#:#not_yet_migrated#:#This Object has not et been migrated. Please contact the administrators of the platform.###31 10 2023 new variable bibl#:#obj_bibl_duplicate#:#Dupliquer Bibliographie bibl#:#order#:#Order bibl#:#override_entries#:#Ignorer les entrées @@ -2361,7 +2361,7 @@ blog#:#blog_confirm_delete_contributors#:#Etes-vous sà»r de vouloir supprimer blog#:#blog_contribute_other_roles#:#Les rôles suivants donnent les permissions de "contribution" : %s. blog#:#blog_contributors#:#Contributeurs blog#:#blog_copy#:#Copier Blog -blog#:#blog_download_submission#:#Download Submission###07 02 2020 new variable +blog#:#blog_download_submission#:#Download Submission blog#:#blog_draft#:#Brouillon blog#:#blog_draft_info#:#Le brouillon de l'article n'est visible que par l'auteur. blog#:#blog_draft_info_contributors#:#Ce brouillon d'article n'est visible que par les contributeurs. @@ -2380,21 +2380,21 @@ blog#:#blog_enable_nav_authors_info#:#La liste des auteurs de blog est affichée blog#:#blog_enable_notes#:#Commentaires Publics blog#:#blog_enable_rss#:#Activer Flux RSS blog#:#blog_enable_rss_info#:#Le flux RSS est public et indépendant de partage du blog et des droits utilisateur. -blog#:#blog_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable -blog#:#blog_est_reading_time_info#:#For Blogs in the repository reading time can be determined and displayed.###31 03 2023 new variable +blog#:#blog_est_reading_time#:#Estimated Reading Time###31 10 2023 new variable +blog#:#blog_est_reading_time_info#:#For Blogs in the repository reading time can be determined and displayed.###31 10 2023 new variable blog#:#blog_exercise_info#:#Le blog fait partie du devoir "%s" de l'exercice "%s". blog#:#blog_exercise_submitted_info#:#Votre dernière contribution date du %s. Veuillez vérifier le fichier d'exportation : %s. blog#:#blog_finalize_blog#:#Finaliser et Soumettre le Blog blog#:#blog_finalized#:#Le Blog a été soumis. blog#:#blog_import#:#Importer Blog -blog#:#blog_incl_comments#:#including comments###30 04 2021 new variable +blog#:#blog_incl_comments#:#including comments blog#:#blog_keyword#:#Mot-Clé blog#:#blog_keyword_enter#:#Write a keyword and press Enter. blog#:#blog_keywords#:#Mots-Clés blog#:#blog_keywords_other#:#Autres mots clés blog#:#blog_keywords_other_info#:#Ces mots clés ont été définis pour d’autres publications de blog. blog#:#blog_latest_posting#:#Dernière publication -blog#:#blog_link#:#Link###31 03 2023 new variable +blog#:#blog_link#:#Link###31 10 2023 new variable blog#:#blog_list_more#:#plus blog#:#blog_list_num_postings#:#Nombre de publications blog#:#blog_list_num_postings_info#:#Ce paramètre n'est utilisé que si aucun mois spécifique n'est sélectionné. @@ -2423,14 +2423,14 @@ blog#:#blog_notification_deactivated#:#Notification Désactivée blog#:#blog_notification_toggle_off#:#Désactiver Notification blog#:#blog_notification_toggle_on#:#Activer Notification blog#:#blog_number_users_notes_or_comments#:#Nombre d'utilisateurs ayant attaché des notes ou commentaires à cet article -blog#:#blog_page_type_blp#:#Blog Posting###30 04 2021 new variable +blog#:#blog_page_type_blp#:#Blog Posting blog#:#blog_permanent_link#:#Permalien blog#:#blog_posting#:#Article du Blog blog#:#blog_posting_deleted#:#L'article a été supprimé. blog#:#blog_posting_deletion_confirmation#:#Etes-vous sûr de vouloir supprimer l'article suivant ? blog#:#blog_posting_edit_approval_info#:#L'affichage reste à être approuvé par un tuteur avant d'être publié. blog#:#blog_posting_not_found#:#Cet article n'est pas disponible. -blog#:#blog_postings#:#Postings###31 03 2023 new variable +blog#:#blog_postings#:#Postings###31 10 2023 new variable blog#:#blog_presentation_frame#:#Présentation du blog blog#:#blog_presentation_overview#:#Aperçu initial blog#:#blog_preview#:#Prévisualisation @@ -2442,36 +2442,36 @@ blog#:#blog_profile_picture#:#Afficher Image du Profil blog#:#blog_profile_picture_repository_info#:#Les photos de profil des auteurs ne sont montrées que sur les pages de publications, pas sur les pages d’aperçu. blog#:#blog_properties#:#Propriétés du Blog blog#:#blog_rename_posting#:#Renommer Article -blog#:#blog_selected_pages#:#Selected Postings###31 03 2023 new variable +blog#:#blog_selected_pages#:#Selected Postings###31 10 2023 new variable blog#:#blog_settings#:#Administration des Blogs blog#:#blog_settings_navigation#:#Colonne de navigation blog#:#blog_show_latest#:#Montrer les dernier(ière)s publications/brouillons -blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_show_print_view#:#Show Print View###31 10 2023 new variable blog#:#blog_style#:#Style du Blog -blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable +blog#:#blog_task_publishing_draft_title#:#Publication de brouillon "%s" blog#:#blog_toggle_draft#:#Enregistrer comme Brouillon blog#:#blog_toggle_draft_admin#:#Désactiver la Publication d'Articles blog#:#blog_toggle_final#:#Publier l'Article -blog#:#blog_whole_blog#:#Whole Blog###31 03 2023 new variable -book#:#X_reservations_of#:#%s reservations of###30 04 2021 new variable +blog#:#blog_whole_blog#:#Whole Blog###31 10 2023 new variable +book#:#X_reservations_of#:#%s reservations of book#:#book_add#:#Ajouter Système de Réservation book#:#book_add_object#:#Ajouter objet book#:#book_add_schedule#:#Ajouter planning book#:#book_additional_info_file#:#Description Complémentaire book#:#book_all#:#Afficher tout -book#:#book_all_pools_need_schedules#:#Settings not saved. All assigned pools need to have at least one schedule.###07 02 2020 new variable -book#:#book_all_users#:#All Participants###07 02 2020 new variable +book#:#book_all_pools_need_schedules#:#Settings not saved. All assigned pools need to have at least one schedule. +book#:#book_all_users#:#All Participants book#:#book_assign#:#Assign book#:#book_assign_object#:#Assign Booking Object book#:#book_assign_participant#:#Assign to Participant book#:#book_back_to_list#:#Retour liste book#:#book_bobj#:#Réservation d'Objet book#:#book_book#:#Réserver -book#:#book_booked_in#:#Booked in###07 02 2020 new variable +book#:#book_booked_in#:#Booked in book#:#book_booking_information#:#Information -book#:#book_booking_objects#:#Booking Objects###31 03 2023 new variable +book#:#book_booking_objects#:#Booking Objects###31 10 2023 new variable book#:#book_booking_reminders#:#Upcoming reservations -book#:#book_bookings_per_user#:#Bookings per User###31 03 2023 new variable +book#:#book_bookings_per_user#:#Bookings per User###31 10 2023 new variable book#:#book_cal_entry#:#Réservation de : book#:#book_confirm_booking#:#Confirmer réservation book#:#book_confirm_booking_no_schedule#:#Etes-vous sûr de vouloir réserver cette ressource ? @@ -2499,18 +2499,18 @@ book#:#book_is_used#:#Est utilisé book#:#book_limit_objects_available#:#You can not assign %s participants to "%s" because it has only %s items available. book#:#book_log#:#Registre book#:#book_new#:#Nouveau Système de Réservation -book#:#book_no_bookings_for_you#:#No reservations have been performed for you.###07 02 2020 new variable -book#:#book_no_objects#:#No Assignment###07 02 2020 new variable +book#:#book_no_bookings_for_you#:#No reservations have been performed for you. +book#:#book_no_objects#:#No Assignment book#:#book_no_of_objects#:#Nb d'objets -book#:#book_no_preferences_for_you#:#No preferences have been stored for you.###07 02 2020 new variable +book#:#book_no_preferences_for_you#:#No preferences have been stored for you. book#:#book_not#:#Non -book#:#book_not_enough_preferences#:#You selected not enough preferences. The preferences have not been saved.###07 02 2020 new variable +book#:#book_not_enough_preferences#:#You selected not enough preferences. The preferences have not been saved. book#:#book_notification#:#Send Reservation Notifications -book#:#book_notification_cron_not_active#:#Note: The corresponding cron job "Send Reservation Notifications" is currently not activated.###16 03 2023 new variable +book#:#book_notification_cron_not_active#:#Note: The corresponding cron job "Send Reservation Notifications" is currently not activated. book#:#book_notification_info#:#Send a list of reservations of the next day to users (own reservations) and admins (if activated). -book#:#book_nr_of_preferences#:#Number of Preferences###07 02 2020 new variable -book#:#book_nr_of_preferences_info#:#Number of preferences each participant can indicate.###07 02 2020 new variable -book#:#book_nr_preferences#:#Prefences###31 03 2023 new variable +book#:#book_nr_of_preferences#:#Number of Preferences +book#:#book_nr_of_preferences_info#:#Number of preferences each participant can indicate. +book#:#book_nr_preferences#:#Preferences###31 10 2023 new variable book#:#book_object_added#:#Un objet de réservation a été ajouté. book#:#book_object_deleted#:#L'objet de réservation a été supprimé. book#:#book_object_updated#:#Une ressource a été modifiée. @@ -2522,19 +2522,19 @@ book#:#book_participant_already_assigned#:#Participant(s) already assigned. book#:#book_participant_assigned#:#Participant(s) assigned book#:#book_period#:#Période book#:#book_pool_added#:#Un outil de réservation a été ajouté. -book#:#book_pool_selection#:#Booking Pool Selection###07 02 2020 new variable +book#:#book_pool_selection#:#Booking Pool Selection book#:#book_post_booking_file#:#Fichier book#:#book_post_booking_information#:#Saisir les Informations de Réservation book#:#book_post_booking_text#:#Texte book#:#book_post_booking_text_info#:#Use [PERIOD] and [OBJECT] to add booking details to the text. -book#:#book_pref_book_cron#:#Booking with Preferences###07 02 2020 new variable -book#:#book_pref_book_cron_info#:#Automatically book pools using preferences after the deadline###07 02 2020 new variable -book#:#book_pref_deadline#:#Deadline###07 02 2020 new variable -book#:#book_pref_deadline_info#:#Preferences can be given up to this point.###31 03 2023 new variable -book#:#book_pref_overview#:#Overview###07 02 2020 new variable -book#:#book_preference_info#:#Please select %1 preference(s) until %2. After the deadline bookings will be done automatically based on the preferences of all users.###07 02 2020 new variable -book#:#book_preferences#:#Preferences###07 02 2020 new variable -book#:#book_preferences_saved#:#The preferences have been saved.###07 02 2020 new variable +book#:#book_pref_book_cron#:#Booking with Preferences +book#:#book_pref_book_cron_info#:#Automatically book pools using preferences after the deadline +book#:#book_pref_deadline#:#Deadline +book#:#book_pref_deadline_info#:#Preferences can be given up to this point.###31 10 2023 new variable +book#:#book_pref_overview#:#Overview +book#:#book_preference_info#:#Please select %1 preference(s) until %2. After the deadline bookings will be done automatically based on the preferences of all users. +book#:#book_preferences#:#Preferences +book#:#book_preferences_saved#:#The preferences have been saved. book#:#book_public_log#:#Réservations publiques book#:#book_public_log_info#:#La liste des réservations peut être vue par tous les utilisateurs. book#:#book_rem_intro#:#This is an overview of upcoming reservations: @@ -2542,9 +2542,9 @@ book#:#book_rem_reason#:#You are reciving these mails, because you are subscribe book#:#book_reminder_day#:#Before Reservation book#:#book_reminder_day_info#:#Send list of own reservations to users and full list of reservations to admins. book#:#book_reminder_days#:#Day(s) -book#:#book_reminder_setting#:#Reminder -book#:#book_rerun_assignments#:#Run Assignment Process###26 04 2023 new variable -book#:#book_rerun_confirmation#:#Attention. The assignments via preference process has already run. You may restart the process, if any errors have occured, e.g. no assignments have been saved. To prevent multiple assignments delete all reservations before restarting the process.###26 04 2023 new variable +book#:#book_reminder_setting#:#Rappel +book#:#book_rerun_assignments#:#Run Assignment Process +book#:#book_rerun_confirmation#:#Attention. The assignments via preference process has already run. You may restart the process, if any errors have occured, e.g. no assignments have been saved. To prevent multiple assignments delete all reservations before restarting the process. book#:#book_reservation_available#:#%s disponible book#:#book_reservation_confirmed#:#Votre réservation a été confirmée. book#:#book_reservation_failed#:#Votre réservation a échoué. @@ -2566,29 +2566,29 @@ book#:#book_schedule_type#:#Type book#:#book_schedule_type_fixed#:#Avec Planning book#:#book_schedule_type_fixed_info#:#Ce type peut être utilisé pour les salles, vidéo-projecteurs, etc. book#:#book_schedule_type_none#:#Sans Planning -book#:#book_schedule_type_none_direct#:#No Schedule, Direct Booking###07 02 2020 new variable -book#:#book_schedule_type_none_direct_info#:#This type can be used for seminar papers, seminar places and such. Participants can book items directly.###07 02 2020 new variable +book#:#book_schedule_type_none_direct#:#No Schedule, Direct Booking +book#:#book_schedule_type_none_direct_info#:#This type can be used for seminar papers, seminar places and such. Participants can book items directly. book#:#book_schedule_type_none_info#:#Ce type peut être utilisé pour les places de séminaires, documents de séminaires, etc. -book#:#book_schedule_type_none_preference#:#No Schedule, Using Preferences###07 02 2020 new variable -book#:#book_schedule_type_none_preference_info#:#This type can be used for seminar papers, seminar places and such. Participants will indicate their preferences. Items will be assigned automatically after the preferences deadline.###07 02 2020 new variable +book#:#book_schedule_type_none_preference#:#No Schedule, Using Preferences +book#:#book_schedule_type_none_preference_info#:#This type can be used for seminar papers, seminar places and such. Participants will indicate their preferences. Items will be assigned automatically after the preferences deadline. book#:#book_schedule_updated#:#Le planning de réservation a été mis à jour. book#:#book_schedule_warning_edit#:#Il n'y a actuellement pas de planning disponible. Vous devez créer un planning de réservation avant de pouvoir utiliser le système de réservation. book#:#book_schedules#:#Plannings -book#:#book_select_pool#:#Select Pool###07 02 2020 new variable +book#:#book_select_pool#:#Select Pool book#:#book_set_cancel#:#Annuler réservation -book#:#book_set_delete#:#Delete###30 04 2021 new variable -book#:#book_too_many_preferences#:#You selected too many preferences. The preferences have not been saved.###07 02 2020 new variable +book#:#book_set_delete#:#Delete +book#:#book_too_many_preferences#:#You selected too many preferences. The preferences have not been saved. book#:#book_type_warning#:#Il n'y a actuellement pas de ressource disponible. Vous devez créer des ressources avant de pouvoir utiliser le système de réservation. -book#:#book_your_bookings#:#Your Reservations###07 02 2020 new variable -book#:#book_your_preferences#:#Your Preferences###07 02 2020 new variable +book#:#book_your_bookings#:#Your Reservations +book#:#book_your_preferences#:#Your Preferences book#:#book_your_reservations#:#Your Reservations book#:#booking_multiple_succesfully#:#Bookings created successfully. book#:#booking_nr_of_items#:#Nombre de Réservations Max. book#:#obj_book_duplicate#:#Copier Système de Réservation book#:#participants#:#Participants -book#:#reservation_deleted#:#Reservation deleted###30 04 2021 new variable +book#:#reservation_deleted#:#Reservation deleted buddysystem#:#buddy_allow_to_contact_me#:#Autoriser à être contacté -buddysystem#:#buddy_allow_to_contact_me_info#:#Si activer, d'autres utilisateurs sont en mesure de me faire parvenir une demande pour entrer en contact. +buddysystem#:#buddy_allow_to_contact_me_info#:#Si cette option est activée, d'autres utilisateurs sont en mesure de me faire parvenir une demande de contact. buddysystem#:#buddy_bs_act_btn_txt_ignored_request_to_linked#:#Confirmer demande buddysystem#:#buddy_bs_act_btn_txt_ignored_request_to_unlinked#:#Annuler demande buddysystem#:#buddy_bs_act_btn_txt_linked_to_unlinked#:#Non liée @@ -2612,19 +2612,19 @@ buddysystem#:#buddy_bs_state_ignored_request_p#:#Ignoré buddysystem#:#buddy_bs_state_ignoredrequest#:#Ignoré buddysystem#:#buddy_bs_state_linked#:#Liée buddysystem#:#buddy_bs_state_linked_a#:#Liée -buddysystem#:#buddy_bs_state_linked_p#:#Linked###27 04 2022 new variable +buddysystem#:#buddy_bs_state_linked_p#:#Linked buddysystem#:#buddy_bs_state_requested#:#Demandé buddysystem#:#buddy_bs_state_requested_a#:#Demandé -buddysystem#:#buddy_bs_state_requested_filter_a#:#Waiting for Reaction###27 04 2022 new variable -buddysystem#:#buddy_bs_state_requested_filter_p#:#Action Required###27 04 2022 new variable +buddysystem#:#buddy_bs_state_requested_filter_a#:#Waiting for Reaction +buddysystem#:#buddy_bs_state_requested_filter_p#:#Action Required buddysystem#:#buddy_bs_state_requested_p#:#Demandé -buddysystem#:#buddy_bs_state_unlinked#:#Unlinked###27 04 2022 new variable +buddysystem#:#buddy_bs_state_unlinked#:#Unlinked buddysystem#:#buddy_bs_state_unlinked_a#:#Non liée -buddysystem#:#buddy_bs_state_unlinked_p#:#Unlinked###27 04 2022 new variable +buddysystem#:#buddy_bs_state_unlinked_p#:#Unlinked buddysystem#:#buddy_enable#:#Activer les Contacts buddysystem#:#buddy_enable_info#:#Si activé, les utilisateurs sont autorisés à communiquer entre eux en lanàçant des demandes de contact. De plus, il y a un paramètre d'utilisateur personnel pour permettre ou éviter d'être contacté. buddysystem#:#buddy_handle_contact_request#:#Demande de contact -buddysystem#:#buddy_noti_cr_profile_not_published#:#Profile not published###07 02 2020 new variable +buddysystem#:#buddy_noti_cr_profile_not_published#:#Profile not published buddysystem#:#buddy_notification_contact_request#:#Demande de contact buddysystem#:#buddy_notification_contact_request_ignore#:#Ignore Request: buddysystem#:#buddy_notification_contact_request_ignore_osd#:#Ignorer demande @@ -2636,7 +2636,7 @@ buddysystem#:#buddy_relation_requested#:#Une demande a été envoyée à l’uti buddysystem#:#buddy_request_approved#:#Vous avez approuvé le contact avec succès. buddysystem#:#buddy_request_ignored#:#Vous avez ignoré l’utilisateur. buddysystem#:#buddy_tbl_filter_state#:#Statut -buddysystem#:#buddy_tbl_state_actions_col_label#:#State / Action###31 03 2023 new variable +buddysystem#:#buddy_tbl_state_actions_col_label#:#State / Action###31 10 2023 new variable buddysystem#:#buddy_tbl_title_relations#:#Contacts buddysystem#:#buddy_use_osd#:#Pop-up de demandes de contact buddysystem#:#buddy_use_osd_info#:#Affiche un pop-up pour indiquer qu’un utilisateur veut vous ajouter à sa liste d’amis. @@ -2645,7 +2645,7 @@ buddysystem#:#buddy_view_table#:#Liste cat#:#cat_copy#:#Copier Catégorie cat#:#cat_import#:#Importer Catégorie cat#:#cat_more_translations#:#Plus de Traductions -cert#:#cert_currently_no_certs#:#Currently you did not achieve any certificate, yet. +cert#:#cert_currently_no_certs#:#Pour l'instant, vous n'avez pas encore obtenu de certificat. cert#:#cert_description_label#:#Description cert#:#cert_download_label#:#Download cert#:#cert_error_no_access#:#You have no access to this certificate. @@ -2662,7 +2662,7 @@ cert#:#certificate_migration_confirm_started#:#The migration was started. cert#:#certificate_migration_go#:#Start Migration cert#:#certificate_migration_lastrun_failed#:#The migration of the certificates failed. Try again? cert#:#certificate_no_object_desc#:#No object description available -cert#:#certificate_no_object_title#:#No object title available +cert#:#certificate_no_object_title#:#Aucun titre disponible 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 @@ -2686,7 +2686,7 @@ certificate#:#certificate_error_upload_bgimage#:#Une erreur s'est produite penda certificate#:#certificate_export#:#Exporter Certificat certificate#:#certificate_failed#:#échec certificate#:#certificate_file_basename#:#Certificat -certificate#:#certificate_learning_progress_must_be_active#:#Only objects with an active Learning Progress can be selected. The Learning Progress is deactivated on the following objects: %s###07 02 2020 new variable +certificate#:#certificate_learning_progress_must_be_active#:#Only objects with an active Learning Progress can be selected. The Learning Progress is deactivated on the following objects: %s certificate#:#certificate_letter#:#Lettre (21.59 cm x 27.94 cm) certificate#:#certificate_letter_landscape#:#Lettre paysage (27,94 cm x 21,59 cm) certificate#:#certificate_margin_body#:#Marges du certificat @@ -2742,7 +2742,7 @@ certificate#:#certificate_settings#:#Paramètres certificat certificate#:#certificate_short_name#:#Libellé court du fichier du certificat certificate#:#certificate_short_name_description#:#Veuillez saisir un libellé court pour le fichier du certificat. Ce libellé court sera une partie du titre du fichier du certificat : YYMMDD_[nom]_[libelle_court]_certificate.pdf. certificate#:#certificate_text#:#Texte du Certificat -certificate#:#certificate_text_info#:#Please enter the certificate text. If the WYSIWYG editor is disabled in the ILIAS administration, you can still use valid XHTML to format the text.###28 07 2023 new variable +certificate#:#certificate_text_info#:#Please enter the certificate text. If the WYSIWYG editor is disabled in the ILIAS administration, you can still use valid XHTML to format the text.###31 10 2023 new variable certificate#:#certificate_unit_description#:#Entrer une valeur avec unité de mesure : VALEUR [cm|mm|in|pt|pc|px|em], par ex. 10mm ou 3in certificate#:#certificate_usage#:#Veuillez noter que les certificats sont utilisables uniquement si le serveur Java d'ILIAS fonctionne. La configuration du serveur Java est disponible sur la page Paramètres système d'ILIAS dans la section Webservices. certificate#:#certificate_var_max_points#:#46 @@ -2771,21 +2771,21 @@ certificate#:#certificate_visibility_introduction#:#Les utilisateurs pourront t certificate#:#certificate_visibility_never#:#Non Visible certificate#:#certificate_visibility_passed#:#Visible si un utilisateur a passé le test certificate#:#certificate_visibility_passed_exercise#:#Visible Uniquement si Exercice Réussi -certificate#:#cmix_cert_ph_object_description#:#Description###07 02 2020 new variable -certificate#:#cmix_cert_ph_object_title#:#Title of the xAPI/cmi5 Object###07 02 2020 new variable -certificate#:#cmix_cert_ph_reached_score#:#Reached score as percentage###07 02 2020 new variable +certificate#:#cmix_cert_ph_object_description#:#Description +certificate#:#cmix_cert_ph_object_title#:#Title of the xAPI/cmi5 Object +certificate#:#cmix_cert_ph_reached_score#:#Reached score as percentage certificate#:#default_background_info#:#Cette image d'arrière-plan sera appliquée par défaut à tous les certificats. L'éditeur de certificat permet toutefois de téléverser une image différente pour chaque certificat. certificate#:#download_certificate#:#Télécharger certificat -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.###07 02 2020 new variable -certificate#:#lti_cert_ph_mastery_score#:#Mastery score as percentage###07 02 2020 new variable -certificate#:#lti_cert_ph_object_description#:#Description###07 02 2020 new variable -certificate#:#lti_cert_ph_object_title#:#Title of the LTI Consumer Object###07 02 2020 new variable -certificate#:#lti_cert_ph_reached_score#:#Reached score as percentage###07 02 2020 new variable -certificate#:#persistent_certificate_mode#:#User Certificate Creation###07 02 2020 new variable -certificate#:#persistent_certificate_mode_cron#:#Cron Job###07 02 2020 new variable -certificate#:#persistent_certificate_mode_cron_info#:#This option is recommended for systems with high user interaction.###07 02 2020 new variable -certificate#:#persistent_certificate_mode_instant#:#Instant###07 02 2020 new variable -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.###07 02 2020 new variable +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#:#lti_cert_ph_mastery_score#:#Mastery score as percentage +certificate#:#lti_cert_ph_object_description#:#Description +certificate#:#lti_cert_ph_object_title#:#Title of the LTI Consumer Object +certificate#:#lti_cert_ph_reached_score#:#Reached score as percentage +certificate#:#persistent_certificate_mode#:#User Certificate Creation +certificate#:#persistent_certificate_mode_cron#:#Cron Job +certificate#:#persistent_certificate_mode_cron_info#:#This option is recommended for systems with high user interaction. +certificate#:#persistent_certificate_mode_instant#:#Instant +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. chatroom#:#allow_anonymous#:#Autoriser l'Accès Anonyme chatroom#:#allow_custom_usernames#:#Autoriser les Noms d'Utilisateur Personnalisés chatroom#:#anonymous_hint#:#Assurez vous de régler correctement les permissions dans l'onglet "Permissions" pour permettre aux utilisateurs anonymes d'accéder à cet objet. @@ -2800,90 +2800,90 @@ chatroom#:#chat_address#:#S& chatroom#:#chat_anonymous_not_allowed#:#Veuillez vous connecter pour utiliser l’espace de discussion. chatroom#:#chat_auth_token_info#:#Veuillez définir des chaînes uniques utilisées par ILIAS à des fins d’authentification lors de l’envoi de demandes au serveur chat. Vous pouvez créer automatiquement ces chaînes en cliquant sur le bouton correspondant. Veuillez noter que le serveur chat est capable de communiquer avec plusieurs clients ILIAS, mais que chaque ID de client ILIAS doit être unique. chatroom#:#chat_ban#:#Bannir -chatroom#:#chat_broadcast_typing#:#Broadcast Typing###31 03 2023 new variable -chatroom#:#chat_broadcast_typing_info#:#Allow participants in conversations or chatrooms to see when you are typing a message.###31 03 2023 new variable +chatroom#:#chat_broadcast_typing#:#Broadcast Typing###31 10 2023 new variable +chatroom#:#chat_broadcast_typing_info#:#Allow participants in conversations or chatrooms to see when you are typing a message.###31 10 2023 new variable chatroom#:#chat_connection_disconnected#:#--- chatroom#:#chat_connection_established#:#+++ chatroom#:#chat_create_private_room_button#:#Créer Salle de Chat Privée chatroom#:#chat_deletion_disabled#:#Désactivé chatroom#:#chat_deletion_interval#:#Intervalle -chatroom#:#chat_deletion_interval_info#:#If chosen, messages in the repository chat on On-Screen-Chat conversations will be deleted after the defined threshold. +chatroom#:#chat_deletion_interval_info#:#If chosen, messages in the repository chat and On-Screen-Chat conversations will be deleted after the defined threshold. chatroom#:#chat_deletion_interval_run_at#:#Temps chatroom#:#chat_deletion_interval_run_at_info#:#Veuillez définir le temps (format: HH:MM) auquel le serveur doit procéder à la suppression du message. chatroom#:#chat_deletion_interval_unit#:#Unité chatroom#:#chat_deletion_interval_value#:#Valeur chatroom#:#chat_deletion_ival_max_val#:#La valeur maximum pour l'unité «%s» est: %s chatroom#:#chat_deletion_section_head#:#Suppression d’anciens messages -chatroom#:#chat_enable_history#:#Enable History###31 03 2023 new variable -chatroom#:#chat_enable_history_info#:#Everybody can read and export past public chat messages in the tab „History“. Messages from within private rooms are only accessible by invited users.###31 03 2023 new variable +chatroom#:#chat_enable_history#:#Enable History###31 10 2023 new variable +chatroom#:#chat_enable_history_info#:#Everybody can read and export past public chat messages in the tab „History“. Messages from within private rooms are only accessible by invited users.###31 10 2023 new variable chatroom#:#chat_error_log_info#:#Veuillez définir un chemin de serveur absolu pour le fichier de journal d’erreurs du serveur chat (par ex.: /var/www/ilias/données/chat_error.journal). Si vous ne définisez pas de chemin, le serveur chat créera automatiquement un fichier situé dans le répertoire du serveur chat. chatroom#:#chat_https_cert_info#:#Veuillez définir un chemin de serveur absolu pour le dossier de certificat SSL (par ex.: /etc/ssl/certs/server.pem). chatroom#:#chat_https_dhparam_info#:#Veuillez définir un chemin de serveur absolu pour un fichier (par ex.: /etc/ssl/privé/dhparam.pem) utilisé pour la négociation des paramètres Diffie Hellman (par ex. généré via openssl dhparam -out /etc/ssl/privé/dhparam.pem 2048 ). chatroom#:#chat_https_key_info#:#Veuillez définir un chemin de serveur absolu pour le fichier clé privé (par ex.: /etc/ssl/privé/serveur.clé). chatroom#:#chat_invitation#:#Invitation de [INVITER_NAME] à la salle de Chat [ROOM_NAME] chatroom#:#chat_invitation_long#:#[SALUTATION]\n\nVous avez été invité à la salle de Chat :\nTitre de la salle : [ROOM_NAME]\nInvité par : [INVITER_NAME]\nURL: [LINK]\n\nSi vous souhaitez entrer dans cette salle, cliquez sur le lien ci-dessus. -chatroom#:#chat_invitation_nc_inv_x#:#You have %s chat invitations.###31 03 2023 new variable -chatroom#:#chat_invitation_nc_no_inv#:#You have no chat invitations.###31 03 2023 new variable +chatroom#:#chat_invitation_nc_inv_x#:#You have %s chat invitations.###31 10 2023 new variable +chatroom#:#chat_invitation_nc_no_inv#:#You have no chat invitations.###31 10 2023 new variable chatroom#:#chat_invitation_short#:#Veuillez cliquer sur le titre pour entrer dans la salle de Chat. -chatroom#:#chat_invitations#:#Chat invitations###31 03 2023 new variable +chatroom#:#chat_invitations#:#Chat invitations###31 10 2023 new variable chatroom#:#chat_invite#:#Inviter chatroom#:#chat_join#:#Rejoindre chatroom#:#chat_kick#:#Exclure chatroom#:#chat_log_info#:#Please define an absolute server path to the chat server's log file (e.g.: /var/www/ilias/data/chat.log). If you do not specify a path, the chat server will automatically create a file located in the chat server directory. -chatroom#:#chat_log_level#:#Log Level###30 04 2021 new variable +chatroom#:#chat_log_level#:#Log Level chatroom#:#chat_mainroom#:#Salle Principale chatroom#:#chat_message#:#Message chatroom#:#chat_message_display#:#Options chatroom#:#chat_message_options#:#Afficher chatroom#:#chat_message_to_all#:#A Tous -chatroom#:#chat_no_use_typing_broadcast#:#Typing will not be broadcasted###31 03 2023 new variable -chatroom#:#chat_not_use_osc#:#Not Using On-Screen-Chat###30 04 2021 new variable -chatroom#:#chat_osc_accept_msg#:#Autoriser les conversation chat à l’écran -chatroom#:#chat_osc_accept_msg_info#:#Si cette option est activée, les autres utilisateurs sont autorisés à commencer une conversation avec moi. -chatroom#:#chat_osc_accept_msg_info_slate#:#To have private conversations, you must enable your setting "Allow On-Screen Chat Conversations".###31 03 2023 new variable -chatroom#:#chat_osc_accept_msg_info_slate_link_txt#:#Visibility (in Profile and Privacy)###31 03 2023 new variable -chatroom#:#chat_osc_accept_no_conv_info_slate#:#There are currently no minimzed conversations.###31 03 2023 new variable +chatroom#:#chat_no_use_typing_broadcast#:#Typing will not be broadcasted###31 10 2023 new variable +chatroom#:#chat_not_use_osc#:#Not Using On-Screen-Chat +chatroom#:#chat_osc_accept_msg#:#Autoriser les discussions Chat à l’écran +chatroom#:#chat_osc_accept_msg_info#:#Si cette option est activée, les autres utilisateurs sont autorisés à entamer une discussion avec moi. +chatroom#:#chat_osc_accept_msg_info_slate#:#To have private conversations, you must enable your setting "Allow On-Screen Chat Conversations".###31 10 2023 new variable +chatroom#:#chat_osc_accept_msg_info_slate_link_txt#:#Visibility (in Profile and Privacy)###31 10 2023 new variable +chatroom#:#chat_osc_accept_no_conv_info_slate#:#There are currently no minimzed conversations.###31 10 2023 new variable chatroom#:#chat_osc_accepts_messages_no#:#Ne reçoit pas les messages chat chatroom#:#chat_osc_accepts_messages_yes#:#Reçoit les messages chat -chatroom#:#chat_osc_add_user#:#Ajouter plus d’utilisateurs -chatroom#:#chat_osc_conversations#:#Conversations +chatroom#:#chat_osc_add_user#:#Ajouter des utilisateurs +chatroom#:#chat_osc_conversations#:#Discussions chatroom#:#chat_osc_doesnt_accept_msg#:#Conversations impossibles -chatroom#:#chat_osc_dont_accept_msg#:#Vous ne pouvez actuellement pas être invité aux conversations. Si vous le souhaitez, vous pouvez changer cela dans vos «Paramètres personnels». -chatroom#:#chat_osc_dont_accept_msg_link_txt#:#'Personal Settings'###07 02 2020 new variable +chatroom#:#chat_osc_dont_accept_msg#:#Actuellement, vous ne pouvez pas être invité à des discussions. Si vous le souhaitez, vous pouvez modifier cela dans votre %s. +chatroom#:#chat_osc_dont_accept_msg_link_txt#:#'Paramètres personnels' chatroom#:#chat_osc_emoticons#:#Émoticônes -chatroom#:#chat_osc_head_grp_x_persons#:#%s Users -chatroom#:#chat_osc_invite_to_conversation#:#Ajouter à la conversation -chatroom#:#chat_osc_leave_grp_conv#:#Quitter la conversation -chatroom#:#chat_osc_minimize#:#Minimize###31 03 2023 new variable -chatroom#:#chat_osc_nc_conv_x_p#:#You have %s hidden conversations.###07 02 2020 new variable -chatroom#:#chat_osc_nc_conv_x_s#:#You have one hidden conversation.###07 02 2020 new variable -chatroom#:#chat_osc_nc_no_conv#:#No Conversations available###07 02 2020 new variable -chatroom#:#chat_osc_nc_prop_time#:#Time###07 02 2020 new variable -chatroom#:#chat_osc_no_conv#:#Pas de conversation. +chatroom#:#chat_osc_head_grp_x_persons#:#%s utilisateurs +chatroom#:#chat_osc_invite_to_conversation#:#Ajouter à la discussion +chatroom#:#chat_osc_leave_grp_conv#:#Quitter la discussion +chatroom#:#chat_osc_minimize#:#Minimize###31 10 2023 new variable +chatroom#:#chat_osc_nc_conv_x_p#:#Vous avez %s de discussions minimisées. +chatroom#:#chat_osc_nc_conv_x_s#:#Vous avez une discussion minimisée. +chatroom#:#chat_osc_nc_no_conv#:#Aucune discussion disponible +chatroom#:#chat_osc_nc_prop_time#:#Time +chatroom#:#chat_osc_no_conv#:#Aucune discussion disponible chatroom#:#chat_osc_no_sub_directory#:#Sous-répertoire chatroom#:#chat_osc_no_sub_directory_info#:#If the Chatserver is only reachable through a sub directory with an URL like "http(s)://[IP/Domain]/[PATH]" it is required to insert the [PATH] for this Chatserver. -chatroom#:#chat_osc_no_usr_found#:#Aucun utilisateur qui correspond à votre recherche n’a pu être trouvé. -chatroom#:#chat_osc_search_modal_info#:#Here you can search for users you would like to add to a conversation. If the search dialogue was opened within a group chat, the new user will be added to this chat. If you started the search within a 1:1 chat, a new group chat window will be opened. -chatroom#:#chat_osc_self_rej_msgs#:#Vous ne pouvez actuellement pas participer à cette conversation car vous avez supprimé la réception des messages dans vos paramètres. +chatroom#:#chat_osc_no_usr_found#:#Aucun utilisateur correspondant à votre recherche n’a pu être trouvé. +chatroom#:#chat_osc_search_modal_info#:#Vous pouvez rechercher ici les utilisateurs que vous souhaitez ajouter à une discussion. Si le dialogue de recherche a été ouvert au sein d'une discussion de groupe, le nouvel utilisateur y sera ajouté. Si vous avez lancé la recherche dans le cadre d'une discussion 1:1, une nouvelle fenêtre de discussion de groupe s'ouvrira. +chatroom#:#chat_osc_self_rej_msgs#:#Vous ne pouvez actuellement pas participer à cette discussion car vous avez supprimé la réception des messages de discussion dans vos paramètres. chatroom#:#chat_osc_send#:#Envoyer -chatroom#:#chat_osc_start_conversation#:#Démarrer la conversation -chatroom#:#chat_osc_subs_rej_msgs#:#Il n’est actuellement pas possible de continuer cette conversation. Votre partenaire de chat doit activer les chats dans les paramètres de chat. -chatroom#:#chat_osc_subs_rej_msgs_p#:#Les partenaires de chat suivants de votre conversation ne veulent plus recevoir de messages: %s -chatroom#:#chat_osc_sure_to_leave_grp_conv#:#Êtes-vous sûr de vouloir quitter la conversation du groupe? +chatroom#:#chat_osc_start_conversation#:#Démarrer la discussion +chatroom#:#chat_osc_subs_rej_msgs#:#Il n’est actuellement pas possible de continuer cette discussion. Votre partenaire de discussion doit activer les discussions dans les paramètres de discussion. +chatroom#:#chat_osc_subs_rej_msgs_p#:#Les partenaires suivants de cette discussion ne veulent plus recevoir de messages: %s +chatroom#:#chat_osc_sure_to_leave_grp_conv#:#Êtes-vous sûr de vouloir quitter la discussion de groupe ? chatroom#:#chat_osc_user#:#Utilisateur -chatroom#:#chat_osc_user_left_grp_conv#:#L’utilisateur «%s» a quitté la conversation du groupe. +chatroom#:#chat_osc_user_left_grp_conv#:#L’utilisateur «%s» a quitté la discussion de groupe. chatroom#:#chat_osc_write_a_msg#:#Écrire un message... chatroom#:#chat_select_room#:#Sélectionner Salle de Chat chatroom#:#chat_settings#:#Paramètres du Chat -chatroom#:#chat_settings_functions_header#:#Chat Room Functions###31 03 2023 new variable -chatroom#:#chat_show_auto_messages#:#Show Status Messages###31 03 2023 new variable +chatroom#:#chat_settings_functions_header#:#Chat Room Functions###31 10 2023 new variable +chatroom#:#chat_show_auto_messages#:#Show Status Messages###31 10 2023 new variable chatroom#:#chat_to_mainroom#:#A la Salle Principale -chatroom#:#chat_use_osc#:#Using On-Screen-Chat###30 04 2021 new variable -chatroom#:#chat_use_typing_broadcast#:#Typing will be broadcasted###31 03 2023 new variable -chatroom#:#chat_user_action_invite_osd#:#Inviter au chat à l’écran -chatroom#:#chat_user_action_invite_public_room#:#Inviter au salon de chat public -chatroom#:#chat_user_x_is_typing#:#User %s is typing ...###31 03 2023 new variable -chatroom#:#chat_users_are_typing#:#Multiple users are typing ...###31 03 2023 new variable +chatroom#:#chat_use_osc#:#Using On-Screen-Chat +chatroom#:#chat_use_typing_broadcast#:#Typing will be broadcasted###31 10 2023 new variable +chatroom#:#chat_user_action_invite_osd#:#Inviter à une discussion à l’écran +chatroom#:#chat_user_action_invite_public_room#:#Inviter au salon de discussion public +chatroom#:#chat_user_x_is_typing#:#User %s is typing ...###31 10 2023 new variable +chatroom#:#chat_users_are_typing#:#Multiple users are typing ...###31 10 2023 new variable chatroom#:#chat_whisper#:#Discuter en privé chatroom#:#chatroom_auth#:#Authentification chatroom#:#chatroom_auth_btn_txt#:#Générer clés @@ -2893,7 +2893,7 @@ chatroom#:#chatroom_client_name#:#Nom chatroom#:#chatroom_client_name_info#:#Veuillez entrer un nom pour ce client ILIAS. La chaîne entrée doit être unique globalement. Initialement, cette valeur est définie sur L’ID du client ILIAS. Si elle est modifiée, le serveur chat doit être réinitialisé. chatroom#:#chatroom_enable_osc#:#Autoriser le chat à l’écran chatroom#:#chatroom_enable_osc_info#:#Si cette option est activée, le chat à l’écran sera disponible pour chaque utilisateur. Mais chaque utilisateur peut décider s’il aimerait être contacté par des autres. Les conversations devraient commencer dans l’outil «Qui est en ligne?». -chatroom#:#chatroom_log#:#Chatserver Log###30 04 2021 new variable +chatroom#:#chatroom_log#:#Chatserver Log chatroom#:#chatroom_smiley_keyword#:#Mot-Clé chatroom#:#chatserver_address#:#Adresse IP des Servers de Chat chatroom#:#chatserver_port#:#Port des Serveurs de Chat @@ -2915,7 +2915,7 @@ chatroom#:#delete_private_room#:#Supprimer Salle de Chat Privée chatroom#:#delete_private_room_question#:#Confirmer la suppression du salon privé? chatroom#:#dhparam#:#Paramètre Diffie-Hellman chatroom#:#display_past_msgs#:#Nombre de Messages Précédents -chatroom#:#display_past_msgs_suffix#:#Messages###31 03 2023 new variable +chatroom#:#display_past_msgs_suffix#:#Messages###31 10 2023 new variable chatroom#:#duration_from#:#De chatroom#:#duration_to#:#A chatroom#:#enable_smilies#:#Activer les Smileys @@ -2924,12 +2924,12 @@ chatroom#:#enter#:#Entrer dans la Salle de Chat chatroom#:#error_log#:#Journal d’erreurs du serveur chat chatroom#:#hint_display_past_msgs#:#Nombre de messages précédents à afficher lorsque l'on rentre dans une discussion. "0" désactive la fonction. chatroom#:#hint_enable_smilies#:#Lorsque activé, certaines séquences de caractères sont remplacées par une icône. Voir l'onglet Smileys pour configuration. -chatroom#:#history_by_day#:#Historique par Date -chatroom#:#history_by_session#:#Historique par Session -chatroom#:#history_byday_title#:#Afficher les Discussions par Jour -chatroom#:#history_bysession_title#:#Afficher les Discussions par Session +chatroom#:#history_by_day#:#Historique par date +chatroom#:#history_by_session#:#Historique par session +chatroom#:#history_byday_title#:#Afficher les discussions par jour +chatroom#:#history_bysession_title#:#Afficher les discussions par session chatroom#:#history_cleared#:#L& -chatroom#:#history_title_general#:#Discussion dans la Salle de Chat "%s" +chatroom#:#history_title_general#:#Discussion dans la salle de Chat "%s" chatroom#:#history_title_private_room#:#Discussion dans la Salle de Chat Privée "%s" chatroom#:#ilias_chatserver_connection#:#ILIAS de connexion serveur chatroom#:#ilias_proxy_info#:#Si le serveur n’est pas accessible avec l’adresse IP et le port par défaut, il est possible de configurer une URL personnalisée pour la connexion de l’ILIAS au serveur. @@ -2942,20 +2942,20 @@ chatroom#:#kicked_from_private_room#:#Vous avez été exclu de la salle de Chat chatroom#:#leave_private_room#:#Quitter Salle de Chat Privée chatroom#:#left_private_room#:#A quitté le salon privé chatroom#:#lost_connection#:#La connexion au Chat a été interrompue. -chatroom#:#main#:#Salle Principale +chatroom#:#main#:#Salle principale chatroom#:#no_further_users#:#Aucun autre utilisateur présent chatroom#:#no_messages#:#Il n'y a aucun message enregistré pour cette période. chatroom#:#no_username_given#:#Veuiilez choisir un nom d'utilisateur chatroom#:#obj_chtr#:#Salle de Chat -chatroom#:#osc_browser_noti_no_permission_error#:#Please remove this domain from the list of blocked domains in the notification settings of your browser or operating system. Otherwise you will not be able to receive browser notifications.###07 02 2020 new variable -chatroom#:#osc_browser_noti_no_support_error#:#Browser notifications are not supported in your browser. Please ensure you are requesting ILIAS via HTTPS and use a supported browser.###07 02 2020 new variable -chatroom#:#osc_browser_noti_req_permission_error#:#The browser notifications could not be enabled because you did not grant access. Please remove this domain from the list of blocked domains in the notification settings of your browser or operating system.###07 02 2020 new variable -chatroom#:#osc_enable_browser_notifications_info#:#If enabled, a browser notification will be shown if you receive new messages and conversations when the ILIAS browser tab is in background, or if the browser is hidden. You will also receive a browser notification for new messages in a conversation after %s minute(s) of idling if the ILIAS tab is in foreground.###07 02 2020 new variable -chatroom#:#osc_enable_browser_notifications_label#:#Browser Notifications###07 02 2020 new variable -chatroom#:#osc_noti_title#:#New Chat Message###07 02 2020 new variable +chatroom#:#osc_browser_noti_no_permission_error#:#Veuillez supprimer ce domaine de la liste des domaines bloqués dans les paramètres de notification de votre navigateur ou de votre système d'exploitation. Sinon, vous ne pourrez pas recevoir les notifications du navigateur. +chatroom#:#osc_browser_noti_no_support_error#:#Les notifications du navigateur ne sont pas prises en charge par votre navigateur. Veuillez vous assurer que vous demandez ILIAS via HTTPS et que vous utilisez un mot de passe supported browser. +chatroom#:#osc_browser_noti_req_permission_error#:#Les notifications du navigateur n'ont pas pu être activées car vous n'avez pas autorisé l'accès. Veuillez supprimer ce domaine de la liste des domaines bloqués dans les paramètres de notification de votre navigateur ou de votre système d'exploitation. +chatroom#:#osc_enable_browser_notifications_info#:#Si cette option est activée, une notification de navigateur sera affichée si vous recevez de nouveaux messages et de nouvelles discussions lorsque l'onglet du navigateur ILIAS est en arrière-plan ou si le navigateur est masqué. Vous recevrez également une notification de navigateur pour les nouveaux messages dans une discussion après %s minute(s) d'inactivité si l'onglet ILIAS est au premier plan. +chatroom#:#osc_enable_browser_notifications_label#:#Notifications du navigateur +chatroom#:#osc_noti_title#:#Nouveau message de discussion chatroom#:#period#:#Période chatroom#:#permissions#:#Permissions -chatroom#:#preferred_chatname#:#Preferred Name###31 03 2023 new variable +chatroom#:#preferred_chatname#:#Preferred Name###31 10 2023 new variable chatroom#:#private_room_closed#:#La salle de Chat chatroom#:#private_room_entered#:#Bienvenue dans la salle de Chat privée chatroom#:#private_room_entered_user#:#L& @@ -3001,10 +3001,10 @@ chatroom_adm#:#chatserver_settings_title#:#Paramètres du Serveur de Chat chatroom_adm#:#client_settings#:#Paramètres Client chatroom_adm#:#general_settings_title#:#Paramètres Généraux du Chat chatroom_adm#:#https#:#HTTPS -chatroom_adm#:#osc_adm_browser_noti_info#:#If enabled, users may individually decide whether or not they want to receive browser notifications for new conversations and messages. Notifications are triggered if the user works in different browser tabs or the browser is hidden and ILIAS was put into the background. Users will also receive browser notifications after a certain idle time in a conversation if ILIAS is in the foreground.###07 02 2020 new variable -chatroom_adm#:#osc_adm_browser_noti_label#:#Browser Notifications###07 02 2020 new variable -chatroom_adm#:#osc_adm_conv_idle_state_threshold_info#:#Cut off notifications by given a minimum interval at which browser notifications are triggered for incoming chat messages..###07 02 2020 new variable -chatroom_adm#:#osc_adm_conv_idle_state_threshold_label#:#Time between Browser Notifications###07 02 2020 new variable +chatroom_adm#:#osc_adm_browser_noti_info#:#If enabled, users may individually decide whether or not they want to receive browser notifications for new conversations and messages. Notifications are triggered if the user works in different browser tabs or the browser is hidden and ILIAS was put into the background. Users will also receive browser notifications after a certain idle time in a conversation if ILIAS is in the foreground. +chatroom_adm#:#osc_adm_browser_noti_label#:#Browser Notifications +chatroom_adm#:#osc_adm_conv_idle_state_threshold_info#:#Cut off notifications by given a minimum interval at which browser notifications are triggered for incoming chat messages.. +chatroom_adm#:#osc_adm_conv_idle_state_threshold_label#:#Time between Browser Notifications chatroom_adm#:#port_info#:#Les ports rarement utilisés sont souvent bloqués par les firewalls et serveurs proxy. Le navigateur de l'utilisateur ne parviendra pas à établir une connexion avec le serveur de Chat si le port défini est bloqué. chatroom_adm#:#protocol#:#Protocole chatroom_adm#:#public_chat_permissions#:#Permissions de la Salle de Chat Publique @@ -3018,273 +3018,273 @@ classification#:#clsfct_block_title#:#Sélection par sujets classification#:#clsfct_content_no_match#:#No hits classification#:#clsfct_content_title#:#Objets correspondant à votre sélection classification#:#clsfct_selected_objects#:#Objets sélectionnés -cmix#:#achieved_info#:#Successfully bring about or reach a desired objective, level, or result by effort, skill, or courage.###30 04 2021 new variable -cmix#:#achieved_label#:#Statements with the verb 'achieved'###30 04 2021 new variable -cmix#:#activity_id#:#Activity-ID###07 02 2020 new variable -cmix#:#activity_id_info#:#This ID is primarily used for the display of data from the LRS. You receive this ID from the resource provider.###07 02 2020 new variable -cmix#:#answered_info#:#Indicates the actor replied to a question, where the object is generally an activity representing the question. The text of the answer will often be included in the response inside result.###30 04 2021 new variable -cmix#:#answered_label#:#Statements with the verb 'answered'###30 04 2021 new variable -cmix#:#btn_change_registration#:#Submit###07 02 2020 new variable -cmix#:#btn_create_lrs_type#:#Add LRS-Type###07 02 2020 new variable -cmix#:#btn_create_registration#:#Submit###07 02 2020 new variable -cmix#:#change_registration#:#E-Mail address for Registration###07 02 2020 new variable -cmix#:#cmix_add#:#Add xAPI/cmi5 Object###07 02 2020 new variable -cmix#:#cmix_add_cmi5_lm#:#cmi5 Learning Module###07 02 2020 new variable -cmix#:#cmix_add_cmi5_lm_info#:#This option should be used when the content is a cmi5 compliant learning module. Related features like suitable reportings are available without further configurations.###07 02 2020 new variable -cmix#:#cmix_add_lrs_type#:#LRS-Type###07 02 2020 new variable -cmix#:#cmix_add_source#:#Source###07 02 2020 new variable -cmix#:#cmix_add_source_external_app#:#Resource not launched by ILIAS###07 02 2020 new variable -cmix#:#cmix_add_source_external_app_info#:#Use this option for separately launched resources as e.g. apps or simulations. Users must agree to the fetching of data.###07 02 2020 new variable -cmix#:#cmix_add_source_local_dir#:#Local Directory###07 02 2020 new variable -cmix#:#cmix_add_source_local_dir_info#:#Use this option for content packages on your local device.###07 02 2020 new variable -cmix#:#cmix_add_source_upload_dir#:#Upload Directory###07 02 2020 new variable -cmix#:#cmix_add_source_upload_dir_info#:#Use this option for content packages already uploaded into the ILIAS upload directory which is also used for SCORM and HTML packages.###07 02 2020 new variable -cmix#:#cmix_add_source_upload_select#:#--- Please select ---###07 02 2020 new variable -cmix#:#cmix_add_source_url#:#Resource URL###07 02 2020 new variable -cmix#:#cmix_add_source_url_info#:#Use this option for an external resource.###07 02 2020 new variable -cmix#:#cmix_add_xapi_standard_object#:#xAPI Standard Object###07 02 2020 new variable -cmix#:#cmix_add_xapi_standard_object_info#:#Use this option to have a generic content module offering all features like different reportings. This option comes with the greatest possible flexibility but requires a more complex configuration.###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_answered#:#Answered###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_asked#:#Asked###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_attempted#:#Attempted###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_attended#:#Attended###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_commented#:#Commented###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_completed#:#Completed###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_exited#:#Exited###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_experienced#:#Experienced###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_failed#:#Failed###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_imported#:#Imported###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_initialized#:#Initialized###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_interacted#:#Interacted###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_launched#:#Launched###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_mastered#:#Mastered###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_passed#:#Passed###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_preferred#:#Preferred###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_progressed#:#Progressed###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_registered#:#Registered###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_responded#:#Responded###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_resumed#:#Resumed###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_scored#:#Scored###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_shared#:#Shared###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_suspended#:#Suspended###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_terminated#:#Terminated###07 02 2020 new variable -cmix#:#cmix_adlnetgov_expapi_verbs_voided#:#Voided###07 02 2020 new variable -cmix#:#cmix_all_verbs#:#All Verbs###07 02 2020 new variable -cmix#:#cmix_copy#:#Copy xAPI/cmi5 Object###07 02 2020 new variable -cmix#:#cmix_import#:#Import xAPI/cmi5 Object###07 02 2020 new variable -cmix#:#cmix_indication_to_user#:#Further Hints for this LRS###07 02 2020 new variable -cmix#:#cmix_info_external_lrs_info#:#This Learning Record Store is an external LRS. An external LRS is characterized by insufficient influence on the LRS by the operator of the ILIAS-Installation. This is the case e.g. if there are no rights to delete data.###07 02 2020 new variable -cmix#:#cmix_info_external_lrs_label#:#Additional Info about this LRS###07 02 2020 new variable -cmix#:#cmix_info_privacy_section#:#Info about personal data###07 02 2020 new variable -cmix#:#cmix_info_privacy_section_launch#:#Info about personal data transmitted at launch###07 02 2020 new variable -cmix#:#cmix_lrs_type#:#Learning Record Store (LRS)###07 02 2020 new variable -cmix#:#cmix_new#:#New xAPI/cmi5 Object###07 02 2020 new variable -cmix#:#completed_info#:#Indicates the actor finished or concluded the activity normally.###30 04 2021 new variable -cmix#:#completed_label#:#Statements with the verb 'completed'###30 04 2021 new variable -cmix#:#conf_availability#:#Availability###07 02 2020 new variable -cmix#:#conf_availability_0#:#Not available###07 02 2020 new variable -cmix#:#conf_availability_1#:#Existing ones allowed###07 02 2020 new variable -cmix#:#conf_availability_2#:#New producible###07 02 2020 new variable -cmix#:#conf_bypass_proxy#:#Detection of Learning Progress###07 02 2020 new variable -cmix#:#conf_bypass_proxy_disabled#:#xAPI-Proxy to get immediately data###07 02 2020 new variable -cmix#:#conf_bypass_proxy_enabled#:#CronJob to check Learning Record Store###07 02 2020 new variable -cmix#:#conf_bypass_proxy_info#:#In most cases it is recommended to use the xAPI-Proxy. Use the CronJob in case of Limitations regarding Resource or Server.###07 02 2020 new variable -cmix#:#conf_cronjob_neccessary#:#CronJob necessary for Learning Progress###07 02 2020 new variable -cmix#:#conf_cronjob_neccessary_info#:#By activating this option, xAPI-Objects using this LRS-Type could not use the xAPI-Proxy to get immediately data for Detection of Learning Progress. Use only the CronJob in case of limitations regarding resources or server.###07 02 2020 new variable -cmix#:#conf_description#:#Description###07 02 2020 new variable -cmix#:#conf_external_lrs#:#External LRS###07 02 2020 new variable -cmix#:#conf_keep_lp#:#Keep Learning Progress###07 02 2020 new variable -cmix#:#conf_keep_lp_info#:#The ILIAS learning progress status completed would be freezed.###07 02 2020 new variable -cmix#:#conf_launch_mode#:#Launch Mode###07 02 2020 new variable -cmix#:#conf_launch_mode_browse#:#Browse###07 02 2020 new variable -cmix#:#conf_launch_mode_browse_info#:#This option should provide a user experience that allows the user to "look around" without judgement.###03 11 2021 new variable -cmix#:#conf_launch_mode_normal#:#Normal###07 02 2020 new variable -cmix#:#conf_launch_mode_normal_info#:#Data related to the learning progress should be recorded.###03 11 2021 new variable -cmix#:#conf_launch_mode_review#:#Review###07 02 2020 new variable -cmix#:#conf_launch_mode_review_info#:#This option should provide a user experience that allows the user to "revisit / review" already completed material.###03 11 2021 new variable -cmix#:#conf_lrs_endpoint#:#Endpoint###07 02 2020 new variable -cmix#:#conf_lrs_key#:#Key / Login###07 02 2020 new variable -cmix#:#conf_lrs_secret#:#Secret / Password###07 02 2020 new variable -cmix#:#conf_mastery_score#:#Mastery Score###03 11 2021 new variable -cmix#:#conf_mastery_score_info#:#This value is passed to the cmi5 learning module at startup to determine the points required for passing. If a higher (or equal) value is obtained, the learning module shall transmit the status 'passed'.###03 11 2021 new variable -cmix#:#conf_new_window#:#New Window###24 09 2021 new variable -cmix#:#conf_new_window_info#:#The content is opened in a new window. When leaving the content this window gets closed.###24 09 2021 new variable -cmix#:#conf_own_window#:#Own Window###07 02 2020 new variable -cmix#:#conf_own_window_info#:#The content is opened in the same window and replaces the ILIAS Screen. When leaving the content the user returns to ILIAS.###07 02 2020 new variable -cmix#:#conf_privacy_comment_default#:#Indication to user###07 02 2020 new variable -cmix#:#conf_privacy_ident#:#User identification###30 04 2021 new variable -cmix#:#conf_privacy_ident_il_uuid_ext_account#:#External User Id combined with a unique ILIAS platform id formatted as an E-Mail adress###30 04 2021 new variable -cmix#:#conf_privacy_ident_il_uuid_ext_account_info#:#This is identical to each call, but may allow a direct conclusion about the user.###30 04 2021 new variable -cmix#:#conf_privacy_ident_il_uuid_login#:#ILIAS Login combined with a unique ILIAS platform id formatted as an E-Mail adress###30 04 2021 new variable -cmix#:#conf_privacy_ident_il_uuid_login_info#:#This is identical to each call, but may allow a direct conclusion about the ILIAS user.###30 04 2021 new variable -cmix#:#conf_privacy_ident_il_uuid_random#:#Random ID combined with a unique ILIAS platform ID formatted as an E-Mail address###30 04 2021 new variable -cmix#:#conf_privacy_ident_il_uuid_random_info#:#For each ILIAS object and ILIAS user a random ID is generated which remains identical for each call. Conclusions about a user are very limited because it is practically impossible to create user profiles across objects.###30 04 2021 new variable -cmix#:#conf_privacy_ident_il_uuid_sha256#:#Hash combined with a unique ILIAS platform id formatted as an E-Mail address###26 09 2022 new variable -cmix#:#conf_privacy_ident_il_uuid_sha256_info#:#This is identical to each call, but does not permit any direct conclusions about the ILIAS user.###26 09 2022 new variable -cmix#:#conf_privacy_ident_il_uuid_sha256url#:#Hash combined with the ILIAS Domain formatted as an E-Mail address###26 09 2022 new variable -cmix#:#conf_privacy_ident_il_uuid_sha256url_info#:#This is identical to each call, with with a maximum of 80 characters significantly shorter than the variant with the ILIAS platform ID and allows only very limited conclusions about the ILIAS user.###26 09 2022 new variable -cmix#:#conf_privacy_ident_il_uuid_user_id#:#ILIAS user id combined with a unique ILIAS platform id formatted as an E-Mail adress###30 04 2021 new variable -cmix#:#conf_privacy_ident_il_uuid_user_id_info#:#This is identical to each call, but doesn't allow a direct conclusion about the ILIAS user.###30 04 2021 new variable -cmix#:#conf_privacy_ident_info#:#Standard is frequently the email address. The unique ILIAS platform id is:###30 04 2021 new variable -cmix#:#conf_privacy_ident_real_email#:#E-Mail Address###30 04 2021 new variable -cmix#:#conf_privacy_ident_real_email_info#:#Sends E-Mail Address of user as identification (Warning: an E-Mail Address might be used by multiple users!)###30 04 2021 new variable -cmix#:#conf_privacy_name#:#User name###30 04 2021 new variable -cmix#:#conf_privacy_name_firstname#:#First name###30 04 2021 new variable -cmix#:#conf_privacy_name_firstname_info#:#Sends the first name of the user name from ILIAS###30 04 2021 new variable -cmix#:#conf_privacy_name_fullname#:#Entire name###30 04 2021 new variable -cmix#:#conf_privacy_name_fullname_info#:#Sends title, first name and last name###30 04 2021 new variable -cmix#:#conf_privacy_name_info#:#Sending an user name is usually not required.###30 04 2021 new variable -cmix#:#conf_privacy_name_lastname#:#Title and last name###30 04 2021 new variable -cmix#:#conf_privacy_name_lastname_info#:#Sends Mister or Ms/Mrs. (unless otherwise specified) and the last name###30 04 2021 new variable -cmix#:#conf_privacy_name_none#:#No one###30 04 2021 new variable -cmix#:#conf_privacy_name_none_info#:#Sends '-' instead of a name###30 04 2021 new variable -cmix#:#conf_privacy_setting_conf#:#Configuration Options###07 02 2020 new variable -cmix#:#conf_privacy_setting_default#:#Default Settings, changeable for Objects###07 02 2020 new variable -cmix#:#conf_privacy_setting_force#:#Settings are not changeable for Objects###07 02 2020 new variable -cmix#:#conf_privacy_setting_info#:#Configuration Options for Privacy Settings###07 02 2020 new variable -cmix#:#conf_remarks#:#Internal comments###07 02 2020 new variable -cmix#:#conf_switch_to_review#:#Switch to Review Mode###03 11 2021 new variable -cmix#:#conf_switch_to_review_info#:#After the cmi5 learning module has been successfully processed (status satisfied), the learning module is started in review mode the next time it is called up.###03 11 2021 new variable -cmix#:#conf_title#:#Title###07 02 2020 new variable -cmix#:#conf_user_ident#:#User identification###31 03 2023 new variable -cmix#:#conf_user_ident_il_uuid_ext_account#:#External User Id combined with a unique ILIAS platform id formatted as an E-Mail adress###31 03 2023 new variable -cmix#:#conf_user_ident_il_uuid_ext_account_info#:#This is identical to each call, but may allow a direct conclusion about the user.###31 03 2023 new variable -cmix#:#conf_user_ident_il_uuid_login#:#ILIAS Login as E-Mail Address, if necessary combined with a unique ILIAS platform id###31 03 2023 new variable -cmix#:#conf_user_ident_il_uuid_login_info#:#This is identical to each call, but may allow a direct conclusion about the ILIAS user.###31 03 2023 new variable -cmix#:#conf_user_ident_il_uuid_random#:#Random ID combined with a unique ILIAS platform ID formatted as an E-Mail address###31 03 2023 new variable -cmix#:#conf_user_ident_il_uuid_random_info#:#For each ILIAS object and ILIAS user a random ID is generated which remains identical for each call. Conclusions about a user are very limited because it is practically impossible to create user profiles across objects.###31 03 2023 new variable -cmix#:#conf_user_ident_il_uuid_user_id#:#ILIAS user id combined with a unique ILIAS platform id formatted as an E-Mail adress###31 03 2023 new variable -cmix#:#conf_user_ident_il_uuid_user_id_info#:#This is identical to each call, but doesn't allow a direct conclusion about the ILIAS user.###31 03 2023 new variable -cmix#:#conf_user_ident_info#:#Standard is frequently the email address. The unique ILIAS platform id is:###31 03 2023 new variable -cmix#:#conf_user_ident_real_email#:#E-Mail Address###31 03 2023 new variable -cmix#:#conf_user_ident_real_email_info#:#Sends E-Mail Address of user as identification (Warning: an E-Mail Address might be used by multiple users!)###31 03 2023 new variable -cmix#:#conf_user_name#:#User name###31 03 2023 new variable -cmix#:#conf_user_name_firstname#:#First name###31 03 2023 new variable -cmix#:#conf_user_name_firstname_info#:#Sends the first name of the user name from ILIAS###31 03 2023 new variable -cmix#:#conf_user_name_fullname#:#Entire name###31 03 2023 new variable -cmix#:#conf_user_name_fullname_info#:#Sends title, first name and last name###31 03 2023 new variable -cmix#:#conf_user_name_info#:#Sending an user name is usually not required.###31 03 2023 new variable -cmix#:#conf_user_name_lastname#:#Title and last name###31 03 2023 new variable -cmix#:#conf_user_name_lastname_info#:#Sends Mister or Ms/Mrs. (unless otherwise specified) and the last name###31 03 2023 new variable -cmix#:#conf_user_name_none#:#No one###31 03 2023 new variable -cmix#:#conf_user_name_none_info#:#Sends '-' instead of a name###31 03 2023 new variable -cmix#:#conf_user_registered_mail#:#Registered E-Mail-Address###07 02 2020 new variable -cmix#:#content_privacy_ident#:#User identification for resource###07 02 2020 new variable -cmix#:#content_privacy_name#:#User name for resource###07 02 2020 new variable -cmix#:#create_lrs_type_form#:#New LRS-Type###07 02 2020 new variable -cmix#:#create_registration#:#Register your E-Mail address###07 02 2020 new variable -cmix#:#cron_xapi_results_evaluation#:#Fetch xAPI/cmi5 Results###07 02 2020 new variable -cmix#:#cron_xapi_results_evaluation_desc#:#Requests all xAPI results from learning record stores for objects not supporting the ILIAS xAPI proxy.###07 02 2020 new variable -cmix#:#description_info#:#The description will be shown below the title.###07 02 2020 new variable -cmix#:#download_certificate#:#Download Certificate###07 02 2020 new variable -cmix#:#duration_info#:#The duration can be entered e.g. for answering a task. The duration is set to the default value 0 seconds (PT00.000S) by this option.###30 04 2021 new variable -cmix#:#duration_label#:#Duration###30 04 2021 new variable -cmix#:#edit_lrs_type_form#:#LRS-Type###07 02 2020 new variable -cmix#:#failed_info#:#Indicates the actor did not successfully pass an activity to a level of predetermined satisfaction.###30 04 2021 new variable -cmix#:#failed_label#:#Statements with the verb 'failed'###30 04 2021 new variable -cmix#:#fetch_xapi_statements#:#Fetch results from Learning Record Store###07 02 2020 new variable -cmix#:#field_user_ident#:#E-Mail-Address###07 02 2020 new variable -cmix#:#field_user_ident_info#:#Enter the e-mail address used in the external application to identify you.###07 02 2020 new variable -cmix#:#form_change_registration#:#Registration###07 02 2020 new variable -cmix#:#form_create_registration#:#Registration###07 02 2020 new variable -cmix#:#hide_data_info#:#With this option which is only available for the ILIAS LRS proxy certain data is stored in statements with unrecognizable values in the Learning Record Store.###30 04 2021 new variable -cmix#:#hide_data_label#:#Blacken data###30 04 2021 new variable -cmix#:#highscore_achieved_ts#:#Date###07 02 2020 new variable -cmix#:#highscore_achieved_ts_description#:#A column containing the date will be included in the ranking.###07 02 2020 new variable -cmix#:#highscore_all_tables#:#Participant's Own Rank and Top Ranking###07 02 2020 new variable -cmix#:#highscore_all_tables_description#:#Participants get information about the top ranking and their own position in the ranking.###07 02 2020 new variable -cmix#:#highscore_description#:#The names of other users could be displayed if the right 'View learning experiences of other users' is set.###07 02 2020 new variable -cmix#:#highscore_enabled#:#Ranking###07 02 2020 new variable -cmix#:#highscore_mode#:#Mode###07 02 2020 new variable -cmix#:#highscore_own_table#:#Participant's Own Rank###07 02 2020 new variable -cmix#:#highscore_own_table_description#:#Participants are advised of their own position in the ranking.###07 02 2020 new variable -cmix#:#highscore_percentage#:#Percentage###07 02 2020 new variable -cmix#:#highscore_percentage_description#:#A column containing the score as percentage will be included in the ranking.###07 02 2020 new variable -cmix#:#highscore_score#:#Score###07 02 2020 new variable -cmix#:#highscore_score_description#:#A column containing the score will be included in the ranking.###07 02 2020 new variable -cmix#:#highscore_top_num#:#Length of Top Ranking###07 02 2020 new variable -cmix#:#highscore_top_num_description#:#Specify how many ranks are to be included in the top ranking list.###07 02 2020 new variable -cmix#:#highscore_top_num_unit#:#entries###07 02 2020 new variable -cmix#:#highscore_top_table#:#Top Ranking###07 02 2020 new variable -cmix#:#highscore_top_table_description#:#Participants are presented with a table containing the top rankings.###07 02 2020 new variable -cmix#:#highscore_wtime#:#Duration###07 02 2020 new variable -cmix#:#highscore_wtime_description#:#A column containing the duration will be included in the ranking.###07 02 2020 new variable -cmix#:#info_availability#:#Hereby you can operate the availability of the LRS-type within the magazine. All types can set on "allow existing ones" instead of being deleted.###07 02 2020 new variable -cmix#:#info_description#:#This description will be shown when choosing the type for new objects.###07 02 2020 new variable -cmix#:#info_external_lrs#:#A hint will be shown to users when dealing with an external LRS. An external LRS is characterized by insufficient influence on the LRS the by the operator of the ILIAS-installation. This is the case when there are no rights to delete.###07 02 2020 new variable -cmix#:#info_lrs_endpoint#:#URL of the endpoint without '/' at the end###07 02 2020 new variable -cmix#:#info_lrs_key#:#Key or login for access, i.e. 12345###07 02 2020 new variable -cmix#:#info_lrs_secret#:#Shared secret / Password, i.e. secret###07 02 2020 new variable -cmix#:#info_privacy_comment_default#:#Please insert, if required, an additional indication on data security when using this LRS.###07 02 2020 new variable -cmix#:#info_remarks#:#Place to write down your comments on this LRS-type here.###07 02 2020 new variable -cmix#:#info_title#:#This title will be shown when choosing the type for new objects.###07 02 2020 new variable -cmix#:#initialized_info#:#Indicates the activity provider has determined that the actor successfully started an activity.###30 04 2021 new variable -cmix#:#initialized_label#:#Statements with the verb 'initialized'###30 04 2021 new variable -cmix#:#launch_options#:#Options for Launch###07 02 2020 new variable -cmix#:#launch_url#:#URL of the resource###07 02 2020 new variable -cmix#:#launch_url_info#:#Insert here the Internet address by adding http:// or https:// . Options for data security are also relevant for remote resources.###07 02 2020 new variable -cmix#:#log_options#:#Options for the display of transmitted data###07 02 2020 new variable -cmix#:#lrs_authentication#:#Authentication###07 02 2020 new variable -cmix#:#no_substatements_info#:#With this option - which is only available for the ILIAS LRS proxy - the storage of subordinate statements can be suppressed. This can for example affect the answering of single tasks in a test. The content is informed that the statements would have been saved.###30 04 2021 new variable -cmix#:#no_substatements_label#:#Do not store substatements###30 04 2021 new variable -cmix#:#online_info#:#This makes the object visible and usable for the users.###07 02 2020 new variable -cmix#:#only_moveon_info#:#With this option, which is only available for the ILIAS LRS proxy, only statements with defined verbs are stored in the Learning Record Store (WhiteList). The content is informed that the statements would have been saved. This usually ensures the expiration date but should be discussed with the content provider.###30 04 2021 new variable -cmix#:#only_moveon_label#:#Save learning success data only###30 04 2021 new variable -cmix#:#passed_info#:#Indicates the actor successfully passed an activity to a level of predetermined satisfaction.###30 04 2021 new variable -cmix#:#passed_label#:#Statements with the verb 'passed'###30 04 2021 new variable -cmix#:#privacy_options#:#Options for data security###07 02 2020 new variable -cmix#:#progressed_info#:#Indicates a value of how much of an actor has advanced or moved through an activity.###30 04 2021 new variable -cmix#:#progressed_label#:#Statements with the verb 'progressed'###30 04 2021 new variable -cmix#:#registration_saved_successfully#:#Registration saved successfully###07 02 2020 new variable -cmix#:#satisfied_info#:#Indicates that the authority or activity provider determined the actor has fulfilled the criteria of the object or activity.###30 04 2021 new variable -cmix#:#satisfied_label#:#Statements with the verb 'satisfied'###30 04 2021 new variable -cmix#:#sect_learning_progress_options#:#Options for Learning Progress###07 02 2020 new variable -cmix#:#show_debug#:#Display Learning Experiences###07 02 2020 new variable -cmix#:#show_debug_info#:#The Learning Experiences of other users could be displayed if the right 'View learning experiences of other users' is set.###07 02 2020 new variable -cmix#:#tab_export#:#Export###07 02 2020 new variable -cmix#:#tab_info#:#Info###07 02 2020 new variable -cmix#:#tab_lrs_types#:#LRS-Types###07 02 2020 new variable -cmix#:#tab_scoring#:#Ranking###07 02 2020 new variable -cmix#:#tab_settings#:#Settings###07 02 2020 new variable -cmix#:#tab_statements#:#Learning Experiences###07 02 2020 new variable -cmix#:#tbl_action_raw_data#:#View Raw Data###07 02 2020 new variable -cmix#:#tbl_lrs_type_availability#:#Availability###07 02 2020 new variable -cmix#:#tbl_lrs_type_title#:#Title###07 02 2020 new variable -cmix#:#tbl_lrs_type_usages#:#Usages Count###07 02 2020 new variable -cmix#:#tbl_lrs_types_header#:#LRS-Types###07 02 2020 new variable -cmix#:#tbl_statements_actor#:#User###07 02 2020 new variable -cmix#:#tbl_statements_date#:#Date###07 02 2020 new variable -cmix#:#tbl_statements_object#:#Object###07 02 2020 new variable -cmix#:#tbl_statements_verb#:#Verb###07 02 2020 new variable -cmix#:#terminated_info#:#Indicates that the actor successfully ended an activity.###30 04 2021 new variable -cmix#:#terminated_label#:#Statements with the verb 'terminated'###30 04 2021 new variable -cmix#:#timestamp_info#:#The timestamp marks the time of an action indicated by the statement. The timestamp is set to the default value 01.01.1970 (1970-01-01T00:00:00.000Z) by this option. Please note that a Learning Record Store may automatically set a value for the stored date, which can be almost identical to the timestamp.###30 04 2021 new variable -cmix#:#timestamp_label#:#Timestamp###30 04 2021 new variable -cmix#:#title_info#:#Give the object a title.###07 02 2020 new variable -cmix#:#toplist_top_n_results#:#Top Ranking###30 04 2021 new variable -cmix#:#toplist_your_result#:#Own Rank###30 04 2021 new variable -cmix#:#type_cmi5#:#cmi5 Learning Module###24 09 2021 new variable -cmix#:#type_generic#:#xAPI Standard Object###24 09 2021 new variable -cmix#:#use_fetch#:#Authorization through Fetch-URL###07 02 2020 new variable -cmix#:#use_fetch_info#:#As long as the resource supports this option, you should use this option to increase data security.###07 02 2020 new variable -cmix#:#xapi_statements_fetched_successfully#:#Results from Learning Record Store were fetched successfully###07 02 2020 new variable -cmix#:#xapi_statements_last_fetch_date#:#Last fetch of Results:###07 02 2020 new variable -cmix#:#xapi_statements_not_fetched_yet#:#Results from Learning Record Store are not fetched yet###07 02 2020 new variable +cmix#:#achieved_info#:#Successfully bring about or reach a desired objective, level, or result by effort, skill, or courage. +cmix#:#achieved_label#:#Statements with the verb 'achieved' +cmix#:#activity_id#:#Activity-ID +cmix#:#activity_id_info#:#This ID is primarily used for the display of data from the LRS. You receive this ID from the resource provider. +cmix#:#answered_info#:#Indicates the actor replied to a question, where the object is generally an activity representing the question. The text of the answer will often be included in the response inside result. +cmix#:#answered_label#:#Statements with the verb 'answered' +cmix#:#btn_change_registration#:#Submit +cmix#:#btn_create_lrs_type#:#Add LRS-Type +cmix#:#btn_create_registration#:#Submit +cmix#:#change_registration#:#E-Mail address for Registration +cmix#:#cmix_add#:#Add xAPI/cmi5 Object +cmix#:#cmix_add_cmi5_lm#:#cmi5 Learning Module +cmix#:#cmix_add_cmi5_lm_info#:#This option should be used when the content is a cmi5 compliant learning module. Related features like suitable reportings are available without further configurations. +cmix#:#cmix_add_lrs_type#:#LRS-Type +cmix#:#cmix_add_source#:#Source +cmix#:#cmix_add_source_external_app#:#Resource not launched by ILIAS +cmix#:#cmix_add_source_external_app_info#:#Use this option for separately launched resources as e.g. apps or simulations. Users must agree to the fetching of data. +cmix#:#cmix_add_source_local_dir#:#Local Directory +cmix#:#cmix_add_source_local_dir_info#:#Use this option for content packages on your local device. +cmix#:#cmix_add_source_upload_dir#:#Upload Directory +cmix#:#cmix_add_source_upload_dir_info#:#Use this option for content packages already uploaded into the ILIAS upload directory which is also used for SCORM and HTML packages. +cmix#:#cmix_add_source_upload_select#:#--- Please select --- +cmix#:#cmix_add_source_url#:#Resource URL +cmix#:#cmix_add_source_url_info#:#Use this option for an external resource. +cmix#:#cmix_add_xapi_standard_object#:#xAPI Standard Object +cmix#:#cmix_add_xapi_standard_object_info#:#Use this option to have a generic content module offering all features like different reportings. This option comes with the greatest possible flexibility but requires a more complex configuration. +cmix#:#cmix_adlnetgov_expapi_verbs_answered#:#Answered +cmix#:#cmix_adlnetgov_expapi_verbs_asked#:#Asked +cmix#:#cmix_adlnetgov_expapi_verbs_attempted#:#Attempted +cmix#:#cmix_adlnetgov_expapi_verbs_attended#:#Attended +cmix#:#cmix_adlnetgov_expapi_verbs_commented#:#Commented +cmix#:#cmix_adlnetgov_expapi_verbs_completed#:#Completed +cmix#:#cmix_adlnetgov_expapi_verbs_exited#:#Exited +cmix#:#cmix_adlnetgov_expapi_verbs_experienced#:#Experienced +cmix#:#cmix_adlnetgov_expapi_verbs_failed#:#Failed +cmix#:#cmix_adlnetgov_expapi_verbs_imported#:#Imported +cmix#:#cmix_adlnetgov_expapi_verbs_initialized#:#Initialized +cmix#:#cmix_adlnetgov_expapi_verbs_interacted#:#Interacted +cmix#:#cmix_adlnetgov_expapi_verbs_launched#:#Launched +cmix#:#cmix_adlnetgov_expapi_verbs_mastered#:#Mastered +cmix#:#cmix_adlnetgov_expapi_verbs_passed#:#Passed +cmix#:#cmix_adlnetgov_expapi_verbs_preferred#:#Preferred +cmix#:#cmix_adlnetgov_expapi_verbs_progressed#:#Progressed +cmix#:#cmix_adlnetgov_expapi_verbs_registered#:#Registered +cmix#:#cmix_adlnetgov_expapi_verbs_responded#:#Responded +cmix#:#cmix_adlnetgov_expapi_verbs_resumed#:#Resumed +cmix#:#cmix_adlnetgov_expapi_verbs_scored#:#Scored +cmix#:#cmix_adlnetgov_expapi_verbs_shared#:#Shared +cmix#:#cmix_adlnetgov_expapi_verbs_suspended#:#Suspended +cmix#:#cmix_adlnetgov_expapi_verbs_terminated#:#Terminated +cmix#:#cmix_adlnetgov_expapi_verbs_voided#:#Voided +cmix#:#cmix_all_verbs#:#All Verbs +cmix#:#cmix_copy#:#Copy xAPI/cmi5 Object +cmix#:#cmix_import#:#Import xAPI/cmi5 Object +cmix#:#cmix_indication_to_user#:#Further Hints for this LRS +cmix#:#cmix_info_external_lrs_info#:#This Learning Record Store is an external LRS. An external LRS is characterized by insufficient influence on the LRS by the operator of the ILIAS-Installation. This is the case e.g. if there are no rights to delete data. +cmix#:#cmix_info_external_lrs_label#:#Additional Info about this LRS +cmix#:#cmix_info_privacy_section#:#Info about personal data +cmix#:#cmix_info_privacy_section_launch#:#Info about personal data transmitted at launch +cmix#:#cmix_lrs_type#:#Learning Record Store (LRS) +cmix#:#cmix_new#:#New xAPI/cmi5 Object +cmix#:#completed_info#:#Indicates the actor finished or concluded the activity normally. +cmix#:#completed_label#:#Statements with the verb 'completed' +cmix#:#conf_availability#:#Availability +cmix#:#conf_availability_0#:#Not available +cmix#:#conf_availability_1#:#Existing ones allowed +cmix#:#conf_availability_2#:#New producible +cmix#:#conf_bypass_proxy#:#Detection of Learning Progress +cmix#:#conf_bypass_proxy_disabled#:#xAPI-Proxy to get immediately data +cmix#:#conf_bypass_proxy_enabled#:#CronJob to check Learning Record Store +cmix#:#conf_bypass_proxy_info#:#In most cases it is recommended to use the xAPI-Proxy. Use the CronJob in case of Limitations regarding Resource or Server. +cmix#:#conf_cronjob_neccessary#:#CronJob necessary for Learning Progress +cmix#:#conf_cronjob_neccessary_info#:#By activating this option, xAPI-Objects using this LRS-Type could not use the xAPI-Proxy to get immediately data for Detection of Learning Progress. Use only the CronJob in case of limitations regarding resources or server. +cmix#:#conf_description#:#Description +cmix#:#conf_external_lrs#:#External LRS +cmix#:#conf_keep_lp#:#Keep Learning Progress +cmix#:#conf_keep_lp_info#:#The ILIAS learning progress status completed would be freezed. +cmix#:#conf_launch_mode#:#Launch Mode +cmix#:#conf_launch_mode_browse#:#Browse +cmix#:#conf_launch_mode_browse_info#:#This option should provide a user experience that allows the user to "look around" without judgement. +cmix#:#conf_launch_mode_normal#:#Normal +cmix#:#conf_launch_mode_normal_info#:#Data related to the learning progress should be recorded. +cmix#:#conf_launch_mode_review#:#Review +cmix#:#conf_launch_mode_review_info#:#This option should provide a user experience that allows the user to "revisit / review" already completed material. +cmix#:#conf_lrs_endpoint#:#Endpoint +cmix#:#conf_lrs_key#:#Key / Login +cmix#:#conf_lrs_secret#:#Secret / Password +cmix#:#conf_mastery_score#:#Mastery Score +cmix#:#conf_mastery_score_info#:#This value is passed to the cmi5 learning module at startup to determine the points required for passing. If a higher (or equal) value is obtained, the learning module shall transmit the status 'passed'. +cmix#:#conf_new_window#:#New Window +cmix#:#conf_new_window_info#:#The content is opened in a new window. When leaving the content this window gets closed. +cmix#:#conf_own_window#:#Own Window +cmix#:#conf_own_window_info#:#The content is opened in the same window and replaces the ILIAS Screen. When leaving the content the user returns to ILIAS. +cmix#:#conf_privacy_comment_default#:#Indication to user +cmix#:#conf_privacy_ident#:#User identification +cmix#:#conf_privacy_ident_il_uuid_ext_account#:#External User Id combined with a unique ILIAS platform id formatted as an E-Mail adress +cmix#:#conf_privacy_ident_il_uuid_ext_account_info#:#This is identical to each call, but may allow a direct conclusion about the user. +cmix#:#conf_privacy_ident_il_uuid_login#:#ILIAS Login combined with a unique ILIAS platform id formatted as an E-Mail adress +cmix#:#conf_privacy_ident_il_uuid_login_info#:#This is identical to each call, but may allow a direct conclusion about the ILIAS user. +cmix#:#conf_privacy_ident_il_uuid_random#:#Random ID combined with a unique ILIAS platform ID formatted as an E-Mail address +cmix#:#conf_privacy_ident_il_uuid_random_info#:#For each ILIAS object and ILIAS user a random ID is generated which remains identical for each call. Conclusions about a user are very limited because it is practically impossible to create user profiles across objects. +cmix#:#conf_privacy_ident_il_uuid_sha256#:#Hash combined with a unique ILIAS platform id formatted as an E-Mail address +cmix#:#conf_privacy_ident_il_uuid_sha256_info#:#This is identical to each call, but does not permit any direct conclusions about the ILIAS user. +cmix#:#conf_privacy_ident_il_uuid_sha256url#:#Hash combined with the ILIAS Domain formatted as an E-Mail address +cmix#:#conf_privacy_ident_il_uuid_sha256url_info#:#This is identical to each call, with with a maximum of 80 characters significantly shorter than the variant with the ILIAS platform ID and allows only very limited conclusions about the ILIAS user. +cmix#:#conf_privacy_ident_il_uuid_user_id#:#ILIAS user id combined with a unique ILIAS platform id formatted as an E-Mail adress +cmix#:#conf_privacy_ident_il_uuid_user_id_info#:#This is identical to each call, but doesn't allow a direct conclusion about the ILIAS user. +cmix#:#conf_privacy_ident_info#:#Standard is frequently the email address. The unique ILIAS platform id is: +cmix#:#conf_privacy_ident_real_email#:#E-Mail Address +cmix#:#conf_privacy_ident_real_email_info#:#Sends E-Mail Address of user as identification (Warning: an E-Mail Address might be used by multiple users!) +cmix#:#conf_privacy_name#:#User name +cmix#:#conf_privacy_name_firstname#:#First name +cmix#:#conf_privacy_name_firstname_info#:#Sends the first name of the user name from ILIAS +cmix#:#conf_privacy_name_fullname#:#Entire name +cmix#:#conf_privacy_name_fullname_info#:#Sends title, first name and last name +cmix#:#conf_privacy_name_info#:#Sending an user name is usually not required. +cmix#:#conf_privacy_name_lastname#:#Title and last name +cmix#:#conf_privacy_name_lastname_info#:#Sends Mister or Ms/Mrs. (unless otherwise specified) and the last name +cmix#:#conf_privacy_name_none#:#No one +cmix#:#conf_privacy_name_none_info#:#Sends '-' instead of a name +cmix#:#conf_privacy_setting_conf#:#Configuration Options +cmix#:#conf_privacy_setting_default#:#Default Settings, changeable for Objects +cmix#:#conf_privacy_setting_force#:#Settings are not changeable for Objects +cmix#:#conf_privacy_setting_info#:#Configuration Options for Privacy Settings +cmix#:#conf_remarks#:#Internal comments +cmix#:#conf_switch_to_review#:#Switch to Review Mode +cmix#:#conf_switch_to_review_info#:#After the cmi5 learning module has been successfully processed (status satisfied), the learning module is started in review mode the next time it is called up. +cmix#:#conf_title#:#Title +cmix#:#conf_user_ident#:#User identification###31 10 2023 new variable +cmix#:#conf_user_ident_il_uuid_ext_account#:#External User Id combined with a unique ILIAS platform id formatted as an E-Mail adress###31 10 2023 new variable +cmix#:#conf_user_ident_il_uuid_ext_account_info#:#This is identical to each call, but may allow a direct conclusion about the user.###31 10 2023 new variable +cmix#:#conf_user_ident_il_uuid_login#:#ILIAS Login as E-Mail Address, if necessary combined with a unique ILIAS platform id###31 10 2023 new variable +cmix#:#conf_user_ident_il_uuid_login_info#:#This is identical to each call, but may allow a direct conclusion about the ILIAS user.###31 10 2023 new variable +cmix#:#conf_user_ident_il_uuid_random#:#Random ID combined with a unique ILIAS platform ID formatted as an E-Mail address###31 10 2023 new variable +cmix#:#conf_user_ident_il_uuid_random_info#:#For each ILIAS object and ILIAS user a random ID is generated which remains identical for each call. Conclusions about a user are very limited because it is practically impossible to create user profiles across objects.###31 10 2023 new variable +cmix#:#conf_user_ident_il_uuid_user_id#:#ILIAS user id combined with a unique ILIAS platform id formatted as an E-Mail adress###31 10 2023 new variable +cmix#:#conf_user_ident_il_uuid_user_id_info#:#This is identical to each call, but doesn't allow a direct conclusion about the ILIAS user.###31 10 2023 new variable +cmix#:#conf_user_ident_info#:#Standard is frequently the email address. The unique ILIAS platform id is:###31 10 2023 new variable +cmix#:#conf_user_ident_real_email#:#E-Mail Address###31 10 2023 new variable +cmix#:#conf_user_ident_real_email_info#:#Sends E-Mail Address of user as identification (Warning: an E-Mail Address might be used by multiple users!)###31 10 2023 new variable +cmix#:#conf_user_name#:#User name###31 10 2023 new variable +cmix#:#conf_user_name_firstname#:#First name###31 10 2023 new variable +cmix#:#conf_user_name_firstname_info#:#Sends the first name of the user name from ILIAS###31 10 2023 new variable +cmix#:#conf_user_name_fullname#:#Entire name###31 10 2023 new variable +cmix#:#conf_user_name_fullname_info#:#Sends title, first name and last name###31 10 2023 new variable +cmix#:#conf_user_name_info#:#Sending an user name is usually not required.###31 10 2023 new variable +cmix#:#conf_user_name_lastname#:#Title and last name###31 10 2023 new variable +cmix#:#conf_user_name_lastname_info#:#Sends Mister or Ms/Mrs. (unless otherwise specified) and the last name###31 10 2023 new variable +cmix#:#conf_user_name_none#:#No one###31 10 2023 new variable +cmix#:#conf_user_name_none_info#:#Sends '-' instead of a name###31 10 2023 new variable +cmix#:#conf_user_registered_mail#:#Registered E-Mail-Address +cmix#:#content_privacy_ident#:#User identification for resource +cmix#:#content_privacy_name#:#User name for resource +cmix#:#create_lrs_type_form#:#New LRS-Type +cmix#:#create_registration#:#Register your E-Mail address +cmix#:#cron_xapi_results_evaluation#:#Fetch xAPI/cmi5 Results +cmix#:#cron_xapi_results_evaluation_desc#:#Requests all xAPI results from learning record stores for objects not supporting the ILIAS xAPI proxy. +cmix#:#description_info#:#The description will be shown below the title. +cmix#:#download_certificate#:#Download Certificate +cmix#:#duration_info#:#The duration can be entered e.g. for answering a task. The duration is set to the default value 0 seconds (PT00.000S) by this option. +cmix#:#duration_label#:#Duration +cmix#:#edit_lrs_type_form#:#LRS-Type +cmix#:#failed_info#:#Indicates the actor did not successfully pass an activity to a level of predetermined satisfaction. +cmix#:#failed_label#:#Statements with the verb 'failed' +cmix#:#fetch_xapi_statements#:#Fetch results from Learning Record Store +cmix#:#field_user_ident#:#E-Mail-Address +cmix#:#field_user_ident_info#:#Enter the e-mail address used in the external application to identify you. +cmix#:#form_change_registration#:#Registration +cmix#:#form_create_registration#:#Registration +cmix#:#hide_data_info#:#With this option which is only available for the ILIAS LRS proxy certain data is stored in statements with unrecognizable values in the Learning Record Store. +cmix#:#hide_data_label#:#Blacken data +cmix#:#highscore_achieved_ts#:#Date +cmix#:#highscore_achieved_ts_description#:#A column containing the date will be included in the ranking. +cmix#:#highscore_all_tables#:#Participant's Own Rank and Top Ranking +cmix#:#highscore_all_tables_description#:#Participants get information about the top ranking and their own position in the ranking. +cmix#:#highscore_description#:#The names of other users could be displayed if the right 'View learning experiences of other users' is set. +cmix#:#highscore_enabled#:#Ranking +cmix#:#highscore_mode#:#Mode +cmix#:#highscore_own_table#:#Participant's Own Rank +cmix#:#highscore_own_table_description#:#Participants are advised of their own position in the ranking. +cmix#:#highscore_percentage#:#Percentage +cmix#:#highscore_percentage_description#:#A column containing the score as percentage will be included in the ranking. +cmix#:#highscore_score#:#Score +cmix#:#highscore_score_description#:#A column containing the score will be included in the ranking. +cmix#:#highscore_top_num#:#Length of Top Ranking +cmix#:#highscore_top_num_description#:#Specify how many ranks are to be included in the top ranking list. +cmix#:#highscore_top_num_unit#:#entries +cmix#:#highscore_top_table#:#Top Ranking +cmix#:#highscore_top_table_description#:#Participants are presented with a table containing the top rankings. +cmix#:#highscore_wtime#:#Duration +cmix#:#highscore_wtime_description#:#A column containing the duration will be included in the ranking. +cmix#:#info_availability#:#Hereby you can operate the availability of the LRS-type within the magazine. All types can set on "allow existing ones" instead of being deleted. +cmix#:#info_description#:#This description will be shown when choosing the type for new objects. +cmix#:#info_external_lrs#:#A hint will be shown to users when dealing with an external LRS. An external LRS is characterized by insufficient influence on the LRS the by the operator of the ILIAS-installation. This is the case when there are no rights to delete. +cmix#:#info_lrs_endpoint#:#URL of the endpoint without '/' at the end +cmix#:#info_lrs_key#:#Key or login for access, i.e. 12345 +cmix#:#info_lrs_secret#:#Shared secret / Password, i.e. secret +cmix#:#info_privacy_comment_default#:#Please insert, if required, an additional indication on data security when using this LRS. +cmix#:#info_remarks#:#Place to write down your comments on this LRS-type here. +cmix#:#info_title#:#This title will be shown when choosing the type for new objects. +cmix#:#initialized_info#:#Indicates the activity provider has determined that the actor successfully started an activity. +cmix#:#initialized_label#:#Statements with the verb 'initialized' +cmix#:#launch_options#:#Options for Launch +cmix#:#launch_url#:#URL of the resource +cmix#:#launch_url_info#:#Insert here the Internet address by adding http:// or https:// . Options for data security are also relevant for remote resources. +cmix#:#log_options#:#Options for the display of transmitted data +cmix#:#lrs_authentication#:#Authentication +cmix#:#no_substatements_info#:#With this option - which is only available for the ILIAS LRS proxy - the storage of subordinate statements can be suppressed. This can for example affect the answering of single tasks in a test. The content is informed that the statements would have been saved. +cmix#:#no_substatements_label#:#Do not store substatements +cmix#:#online_info#:#This makes the object visible and usable for the users. +cmix#:#only_moveon_info#:#With this option, which is only available for the ILIAS LRS proxy, only statements with defined verbs are stored in the Learning Record Store (WhiteList). The content is informed that the statements would have been saved. This usually ensures the expiration date but should be discussed with the content provider. +cmix#:#only_moveon_label#:#Save learning success data only +cmix#:#passed_info#:#Indicates the actor successfully passed an activity to a level of predetermined satisfaction. +cmix#:#passed_label#:#Statements with the verb 'passed' +cmix#:#privacy_options#:#Options for data security +cmix#:#progressed_info#:#Indicates a value of how much of an actor has advanced or moved through an activity. +cmix#:#progressed_label#:#Statements with the verb 'progressed' +cmix#:#registration_saved_successfully#:#Registration saved successfully +cmix#:#satisfied_info#:#Indicates that the authority or activity provider determined the actor has fulfilled the criteria of the object or activity. +cmix#:#satisfied_label#:#Statements with the verb 'satisfied' +cmix#:#sect_learning_progress_options#:#Options for Learning Progress +cmix#:#show_debug#:#Display Learning Experiences +cmix#:#show_debug_info#:#The Learning Experiences of other users could be displayed if the right 'View learning experiences of other users' is set. +cmix#:#tab_export#:#Export +cmix#:#tab_info#:#Info +cmix#:#tab_lrs_types#:#LRS-Types +cmix#:#tab_scoring#:#Ranking +cmix#:#tab_settings#:#Settings +cmix#:#tab_statements#:#Learning Experiences +cmix#:#tbl_action_raw_data#:#View Raw Data +cmix#:#tbl_lrs_type_availability#:#Availability +cmix#:#tbl_lrs_type_title#:#Title +cmix#:#tbl_lrs_type_usages#:#Usages Count +cmix#:#tbl_lrs_types_header#:#LRS-Types +cmix#:#tbl_statements_actor#:#User +cmix#:#tbl_statements_date#:#Date +cmix#:#tbl_statements_object#:#Object +cmix#:#tbl_statements_verb#:#Verb +cmix#:#terminated_info#:#Indicates that the actor successfully ended an activity. +cmix#:#terminated_label#:#Statements with the verb 'terminated' +cmix#:#timestamp_info#:#The timestamp marks the time of an action indicated by the statement. The timestamp is set to the default value 01.01.1970 (1970-01-01T00:00:00.000Z) by this option. Please note that a Learning Record Store may automatically set a value for the stored date, which can be almost identical to the timestamp. +cmix#:#timestamp_label#:#Timestamp +cmix#:#title_info#:#Give the object a title. +cmix#:#toplist_top_n_results#:#Top Ranking +cmix#:#toplist_your_result#:#Own Rank +cmix#:#type_cmi5#:#cmi5 Learning Module +cmix#:#type_generic#:#xAPI Standard Object +cmix#:#use_fetch#:#Authorization through Fetch-URL +cmix#:#use_fetch_info#:#As long as the resource supports this option, you should use this option to increase data security. +cmix#:#xapi_statements_fetched_successfully#:#Results from Learning Record Store were fetched successfully +cmix#:#xapi_statements_last_fetch_date#:#Last fetch of Results: +cmix#:#xapi_statements_not_fetched_yet#:#Results from Learning Record Store are not fetched yet cmps#:#cmps_activate#:#Activer cmps#:#cmps_active#:#Actif cmps#:#cmps_add_new_rank#:#Position dans la liste Ajouter-un-nouvel-objet cmps#:#cmps_available#:#Disponible -cmps#:#cmps_available_version#:#Available Version###31 03 2023 new variable +cmps#:#cmps_available_version#:#Available Version###31 10 2023 new variable cmps#:#cmps_basic_files#:#Fichiers basiques cmps#:#cmps_class_file#:#Fichier de Classe cmps#:#cmps_component#:#Composant cmps#:#cmps_configure#:#Configurer -cmps#:#cmps_current_db_version#:#Current DB-Version###31 03 2023 new variable +cmps#:#cmps_current_db_version#:#Current DB-Version###31 10 2023 new variable cmps#:#cmps_current_version#:#Version actuelle cmps#:#cmps_database#:#Base de données cmps#:#cmps_db_update#:#Script de mise à jour de la BbD cmps#:#cmps_deactivate#:#Désactiver -cmps#:#cmps_detailed_information#:#Detailed Informationen###31 03 2023 new variable +cmps#:#cmps_detailed_information#:#Detailed Informationen###31 10 2023 new variable cmps#:#cmps_dir#:#Dossier cmps#:#cmps_enable_creation#:#Autoriser Création cmps#:#cmps_file_version#:#Mettre à jour la version du fichier @@ -3294,8 +3294,8 @@ cmps#:#cmps_ilias_max_version#:#Version Max. ILIAS cmps#:#cmps_ilias_min_version#:#Version Min. ILIAS cmps#:#cmps_inactive#:#Inactif cmps#:#cmps_install#:#Installer -cmps#:#cmps_is_active#:#Activated###31 03 2023 new variable -cmps#:#cmps_is_installed#:#Installed###31 03 2023 new variable +cmps#:#cmps_is_active#:#Activated###31 10 2023 new variable +cmps#:#cmps_is_installed#:#Installed###31 10 2023 new variable cmps#:#cmps_lang_files#:#Fichier de langues cmps#:#cmps_lang_prefix#:#Préfixe des variables de langue cmps#:#cmps_languages#:#Langues @@ -3304,7 +3304,7 @@ cmps#:#cmps_missing#:#Manquant cmps#:#cmps_module#:#Module cmps#:#cmps_must_installed#:#Le composant doit être installé. cmps#:#cmps_name#:#Nom -cmps#:#cmps_needs_matching_ilias_version#:#This plugin does not work with your current ILIAS version.###31 03 2023 new variable +cmps#:#cmps_needs_matching_ilias_version#:#This plugin does not work with your current ILIAS version.###31 10 2023 new variable cmps#:#cmps_needs_newer_ilias_version#:#Cette version de plugin fonctionne uniquement sur les nouvelles versions d'ILIAS. Veuillez mettre à jour ILIAS. cmps#:#cmps_needs_newer_plugin_version#:#Cette version d'ILIAS nécessite une nouvelle version de plugin. Veuillez mettre à jour le plugin. cmps#:#cmps_needs_update#:#Nécessite un update. @@ -3315,27 +3315,27 @@ cmps#:#cmps_plugin#:#Plug-in cmps#:#cmps_plugin_activated#:#Le plugin a été activé. cmps#:#cmps_plugin_db_prefixes#:#Préfixes de tables de BdD cmps#:#cmps_plugin_deactivated#:#Le plugin a été désactivé. -cmps#:#cmps_plugin_deinstalled#:#The plugin has been uninstalled###31 03 2023 new variable +cmps#:#cmps_plugin_deinstalled#:#The plugin has been uninstalled###31 10 2023 new variable cmps#:#cmps_plugin_file#:#Fichier Plugin cmps#:#cmps_plugin_lang_prefixes#:#Préfixes de langage de plugin cmps#:#cmps_plugin_slot#:#Slot du Plugin cmps#:#cmps_plugin_uninstalled#:#Le plugin a été désinstallé. -cmps#:#cmps_plugin_updated#:#The plugin has been updated###31 03 2023 new variable +cmps#:#cmps_plugin_updated#:#The plugin has been updated###31 10 2023 new variable cmps#:#cmps_plugins#:#Plug-ins cmps#:#cmps_refresh#:#Rafraà®chir -cmps#:#cmps_refresh_lng#:#Refresh language###31 03 2023 new variable +cmps#:#cmps_refresh_lng#:#Refresh language###31 10 2023 new variable cmps#:#cmps_rep_object#:#Type d'Objet cmps#:#cmps_repository_object_types#:#Types d'Objets cmps#:#cmps_responsible#:#Responsable -cmps#:#cmps_responsible_mail#:#Mail (Responsible)###31 03 2023 new variable +cmps#:#cmps_responsible_mail#:#Mail (Responsible)###31 10 2023 new variable cmps#:#cmps_save_options#:#Enregistrer Options cmps#:#cmps_service#:#Service cmps#:#cmps_show_details#:#Afficher détails cmps#:#cmps_slots#:#Emplacements cmps#:#cmps_status#:#Statut -cmps#:#cmps_supports_cli_setup#:#Supports CLI-Setup###31 03 2023 new variable -cmps#:#cmps_supports_export#:#Supports export###31 03 2023 new variable -cmps#:#cmps_supports_learning_progress#:#Supports learning progress###31 03 2023 new variable +cmps#:#cmps_supports_cli_setup#:#Supports CLI-Setup###31 10 2023 new variable +cmps#:#cmps_supports_export#:#Supports export###31 10 2023 new variable +cmps#:#cmps_supports_learning_progress#:#Supports learning progress###31 10 2023 new variable cmps#:#cmps_uninstall#:#Désinstaller cmps#:#cmps_uninstall_confirm#:#Etes-vous sûr de vouloir désinstaller le plugin "%s"? cmps#:#cmps_uninstall_inactive_confirm#:#Le plug-in «%1$s» ne peut pas être activé pour le moment («%2$s»). Dans cet état, les plug-ins ne peuvent pas être installés complètement. Puisque seule l’intégration principale est inversée, les données personnalisées des plug-ins peuvent rester. Voulez-vous continuer la désinstallation partielle? @@ -3343,9 +3343,9 @@ cmps#:#cmps_update#:#Mettre à jour cmps#:#cmps_version#:#Version cmps#:#database_is_uptodate#:#La base de donnée est à jour. cmps#:#no_changes#:#Aucun changement -cmxv#:#cmxv_create#:#Create Certificate for xAPI/cmi5 Object###07 02 2020 new variable -cmxv#:#cmxv_create_info#:#Select a completed xAPI/cmi5 object to generate a certificate for it###07 02 2020 new variable -cntr#:#cntr_add_new_item#:#Ajouter Nouvel Objet +cmxv#:#cmxv_create#:#Create Certificate for xAPI/cmi5 Object +cmxv#:#cmxv_create_info#:#Select a completed xAPI/cmi5 object to generate a certificate for it +cntr#:#cntr_add_new_item#:#Ajouter un nouvel objet cntr#:#cntr_adopt_content#:#Adopter Contenu cntr#:#cntr_container_only_on_their_own#:#Veuillez ne sélectionner qu'un objet. cntr#:#cntr_copy_crs_grp#:#Mes cours et mes groupes @@ -3355,14 +3355,14 @@ cntr#:#cntr_manage#:#Gérer cntr#:#cntr_ordering#:#Classer cntr#:#cntr_saved_sorting#:#Classement Enregistré. cntr#:#cntr_switch_to_new_editor_cmd#:#Basculer à cette page pour la présentation -cntr#:#cntr_switch_to_new_editor_message#:#Ceci est l'éditeur standard. Veuillez l'utiliser pour mettre à jour le contenu de la page. Si vous cliquez sur le lien suivant, le contenu de la présentation dans le repository sera basculer de l'ancien éditeur dans cette page. +cntr#:#cntr_switch_to_new_editor_message#:#Ceci est l'éditeur standard. Veuillez l'utiliser pour mettre à jour le contenu de la page. Si vous cliquez sur le lien suivant, le contenu de la présentation dans le catalogue sera basculer de l'ancien éditeur dans cette page. cntr#:#cntr_switched_editor#:#Nouveau contenu adopté. cntr#:#cntr_tax_list_info#:#Voici toutes les taxonomies qui ont été définis pour cet objet. cntr#:#cntr_tax_none_available#:#Il n’y a plus de taxonomies de disponibles. cntr#:#cntr_taxonomy_definitions#:#Définition de la Taxinomie cntr#:#cntr_taxonomy_show_sideblock#:#Afficher la taxonomie dans le bloc latéral cntr#:#cntr_taxonomy_sideblock_settings#:#Paramètres du bloc Taxonomie -cntr#:#cntr_text_media_editor#:#Editer Page +cntr#:#cntr_text_media_editor#:#Editer la page cntr#:#cntr_view_by_type#:#Vue regroupement par type cntr#:#cntr_view_info_by_type#:#Cette présentation groupe tous les objets par type. cntr#:#cntr_view_info_sessions#:#Cette présentation regroupe les sessions en premier, puis les autres objets du cours. @@ -3383,10 +3383,10 @@ cntr#:#sorting_new_items_order#:#Ordre des Nouveaux Objets cntr#:#sorting_new_items_position#:#Position des Nouveaux Objets cntr#:#tab_back_to_repository#:#Retour au Catalogue common#:#HH#:#HH:MM -common#:#absolute_path#:#Chemin Absolu +common#:#absolute_path#:#Chemin absolu common#:#accept_usr_agreement#:#Accepter la charte d'utilisation ? -common#:#accept_usr_agreement_btn#:#Accept###30 04 2021 new variable -common#:#accept_usr_agreement_intro#:#There are new terms of service. You need to accept them before proceeding with the use of ILIAS. Read the following document carefully and give your consent or dissent at the bottom of the page.###24 11 2022 new variable +common#:#accept_usr_agreement_btn#:#Accept +common#:#accept_usr_agreement_intro#:#There are new terms of service. You need to accept them before proceeding with the use of ILIAS. Read the following document carefully and give your consent or dissent at the bottom of the page. common#:#access#:#Accès common#:#accessFree#:#Supprimer accès limité common#:#accessRestrict#:#Appliquer l'accès limité @@ -3400,14 +3400,14 @@ common#:#access_unlimited#:#Illimité common#:#access_until#:#Accès (jusqu'à) common#:#access_users#:#Utilisateurs Connectés common#:#accesscount_registered_users#:#Nombre d'utilisateurs distincts -common#:#accessibility_control_concept#:#Accessibility Control Concept###07 02 2020 new variable -common#:#account#:#My Account###07 02 2020 new variable +common#:#accessibility_control_concept#:#Info accessibilité +common#:#account#:#My Account common#:#account_expires_body#:#Votre compte à expiré, Toutefois, vos données sont concervées pendant trois mois après la date d'expiration. Vous pouvez contacter l'administrateur par E-mail pour faire réactiver votre compte. Date d'expiration du compte : common#:#account_expires_subject#:#[ILIAS] Votre compte expire common#:#action#:#Action common#:#action_aborted#:#Action annulée common#:#actions#:#Actions -common#:#actions_for#:#Actions for %s###15 12 2021 new variable +common#:#actions_for#:#Actions pour %s common#:#activate#:#Actif common#:#activate_assessment_logging#:#Activer le Suivi des Tests et Evaluations common#:#activate_https#:#Gestion HTTPS par ILIAS
(Paiement, Connexion) @@ -3418,28 +3418,28 @@ common#:#add#:#Ajouter common#:#add_condition#:#Ajouter Précondition common#:#add_entry#:#Ajouter/Editer Entrée common#:#add_member#:#Ajouter Membre -common#:#add_member_role#:#Add Member Role###07 02 2020 new variable +common#:#add_member_role#:#Add Member Role common#:#add_new_user_defined_field#:#Ajouter une zone supplémentaire au profil utilisateur common#:#add_note#:#Ajouter Note common#:#add_parameter#:#Nouveau Paramètre -common#:#add_remove_edit_entries_of_main_menu#:#Add, remove or edit entries of the main menu###07 02 2020 new variable -common#:#add_role#:#Add Role###07 02 2020 new variable +common#:#add_remove_edit_entries_of_main_menu#:#Add, remove or edit entries of the main menu +common#:#add_role#:#Add Role common#:#add_translation#:#Ajouter Traduction common#:#add_user#:#Ajouter Utilisateur Local common#:#add_user_defined_field#:#Ajouter une nouvelle zone de saisie common#:#added_new_condition#:#Nouvelle condition créée. -common#:#additional_info#:#Informations Supplémentaires +common#:#additional_info#:#Informations supplémentaires common#:#address#:#Adresse common#:#admin_force_noti#:#Notification active common#:#administrate_users#:#Administration Locale des Utilisateurs -common#:#administrate_users_headline#:#Local ILIAS Accounts of this Category###31 03 2023 new variable +common#:#administrate_users_headline#:#Local ILIAS Accounts of this Category###31 10 2023 new variable common#:#administration#:#Administration common#:#administrator#:#Administrateur common#:#adopt#:#Adopter common#:#advanced_editing_allow_html_tags#:#Autoriser les balises HTML suivantes common#:#advanced_editing_assessment_settings#:#Tests et Evaluations common#:#advanced_editing_frm_post_settings#:#Paramètres de publication du forum -common#:#advanced_editing_rep_page_editing#:#Activer la modification de contenu dans le repository +common#:#advanced_editing_rep_page_editing#:#Activer la modification de contenu dans le catalogue common#:#advanced_editing_rep_page_editing_desc#:#Cette fonction autorise l'ajout de texte/média aux pages de catégorie, cours, groupe et dossier. common#:#advanced_editing_required_tags#:#Les balises HTML suivantes sont requises : %s common#:#advanced_editing_survey_settings#:#Balises HTML autorisées pour les enquêtes ILIAS @@ -3448,7 +3448,7 @@ common#:#adve_frm_post_settings#:#Articles du forum common#:#adve_general_settings#:#Paramètres Généraux common#:#adve_survey_settings#:#Paramètres d'Enquête common#:#agree_date#:#Accepté le -common#:#all#:#All###07 02 2020 new variable +common#:#all#:#All common#:#all_global_roles#:#Rôles globaux common#:#all_local_roles#:#Rôles locaux (tous) common#:#all_objects#:#Tous les Objets @@ -3470,7 +3470,7 @@ common#:#application_completed#:#Inscription terminée common#:#application_date#:#Date common#:#applications#:#Applications common#:#apply#:#Appliquer -common#:#apply_filter#:#Appliquer le Filtre +common#:#apply_filter#:#Appliquer le filtre common#:#appointment#:#Evènement common#:#approve_date#:#Approuvé le common#:#approve_recipient#:#Nom d'Utilisateur de l'Approbateur @@ -3507,7 +3507,7 @@ common#:#associated_user#:#Utilisateur associé common#:#astounded#:#Astounded common#:#at_least_one_style#:#Un style au moins doit rester actif common#:#attachment#:#Pièce jointe -common#:#attachments#:#Pièces Jointes +common#:#attachments#:#Pièces jointes common#:#attempts#:#Tentatives common#:#auth_active_roles#:#Rôles globaux disponibles dans le formulaire d'enregistrement common#:#auth_allow_local#:#Autoriser l'Authentification Locale @@ -3567,9 +3567,9 @@ common#:#authoring_mode#:#Mode rédaction common#:#authors#:#Auteurs common#:#autocomplete_more#:#plus common#:#available#:#Disponible -common#:#awra#:#Who is online?###07 02 2020 new variable +common#:#awra#:#Qui est en ligne ? common#:#back#:#Retour -common#:#back_to_course#:#Back to Course###30 04 2021 new variable +common#:#back_to_course#:#Back to Course common#:#back_to_crs_content#:#Retour au Contenu du Cours common#:#back_to_fold_content#:#Retour au Contenu du Dossier common#:#back_to_grp_content#:#Retour au Contenu du Groupe @@ -3581,7 +3581,7 @@ common#:#behind#:#Derrière common#:#benchmark#:#Test de Performance common#:#benchmarks#:#Test de Performance common#:#bib_data#:#Données Bibliographiques -common#:#bibl_add#:#Add Bibliography###31 03 2023 new variable +common#:#bibl_add#:#Add Bibliography###31 10 2023 new variable common#:#birthday#:#Date de Naissance common#:#bkm_import#:#Importer les Favoris common#:#bkm_import_ok#:#Importation réussie de %d favoris et %d dossier(s) de favoris. @@ -3598,9 +3598,9 @@ common#:#bookmark_new#:#Nouveau Favori common#:#bookmark_target#:#Cible common#:#bookmarks#:#Favoris common#:#bookmarks_of#:#Favoris de -common#:#breadcrumb_navigation#:#Fil d'ariane -common#:#breadcrumbs_aria_label#:#Breadcrumbs###30 04 2021 new variable -common#:#briefcase#:#Background Tasks###30 04 2021 new variable +common#:#breadcrumb_navigation#:#Navigation en fil d'Ariane +common#:#breadcrumbs_aria_label#:#Fil d'Ariane +common#:#briefcase#:#Background Tasks common#:#btn_add#:#Ajouter common#:#btn_back#:#Retour common#:#btn_next#:#Suivant @@ -3614,7 +3614,7 @@ common#:#by#:#Par common#:#bytes#:#Octets common#:#cal_from#:#De : common#:#cal_until#:#Jusqu'à : -common#:#calendar#:#Agenda +common#:#calendar#:#Calendrier common#:#cancel#:#Annuler common#:#cancel_file_upload#:#Voulez-vous vraiment annuler tous les dépôts en attente ? common#:#cannot_find_xml#:#Aucun fichier XML n'a été trouvé. @@ -3632,18 +3632,18 @@ common#:#cat_wizard_page#:#Copier une Catégorie (Etape 2/2) common#:#categories#:#Catégories common#:#categories_imported#:#Importation des catégorie terminée common#:#catr#:#Catégorie référente -common#:#catr_add#:#Add Category Link###31 03 2023 new variable +common#:#catr_add#:#Add Category Link###31 10 2023 new variable common#:#catr_edit_info#:#Veuillez choisir une catégorie pour créer un nouveau référent. common#:#catr_new#:#Créer nouvelle catégorie référente -common#:#catr_settings#:#Category Link Settings###31 03 2023 new variable +common#:#catr_settings#:#Category Link Settings###31 10 2023 new variable common#:#certificate#:#Certificat -common#:#certificate_file_already_exists_error#:#The certificate file already exists in the file system.###07 02 2020 new variable -common#:#certificate_file_input_output_error#:#The certificate file was found but couldn't be deleted because of internal errors. Please contact your administrator.###07 02 2020 new variable -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.###07 02 2020 new variable -common#:#certificate_persistent_option#:#Certificates of Achievements###07 02 2020 new variable -common#:#certificate_selection#:#Origin of Certificates###07 02 2020 new variable -common#:#certificate_workspace_option#:#Certificates of Personal Resources###07 02 2020 new variable -common#:#certificates#:#Certificates###29 06 2022 new variable +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#:#certificates#:#Certificates common#:#change#:#Modifier common#:#change_assignment#:#Modifier attribution common#:#change_header_title#:#Editer le Titre du Bandeau @@ -3656,13 +3656,13 @@ common#:#chapter#:#Chapitre common#:#characters#:#caractères restants common#:#chat_enter_public_room#:#Chat public common#:#chat_enter_public_room_tooltip#:#Entrer dans le chat public. -common#:#chat_invite_public_room#:#Chat Privé +common#:#chat_invite_public_room#:#Salon de discussion public common#:#chat_invite_public_room_tooltip#:#Inviter à un chat public. common#:#chat_users_active#:#Utilisateurs actifs common#:#check#:#Vérifier common#:#check_all#:#Tout cocher common#:#check_langfile#:#Veuillez vérifier votre fichier de langue -common#:#check_languages#:#Vérifier Toutes les Langues +common#:#check_languages#:#Vérifier toutes les langues common#:#check_link#:#Vérifier les liens (modules ILIAS) common#:#check_link_desc#:#Si active, tous les liens externes dans les modules d'apprentissage ILIAS seront vérifiés. common#:#check_user_accounts#:#Vérifier les comptes utilisateurs @@ -3673,7 +3673,7 @@ common#:#checked#:#Coché common#:#checked_files#:#Fichiers importables common#:#chg_ilias_and_webfolder_password#:#Modifier mot de passe d'ILIAS et du dossier web common#:#chg_ilias_password#:#Modifier le Mot de Passe ILIAS -common#:#chg_password#:#Modifier mot de passe +common#:#chg_password#:#Modifier le mot de passe common#:#choose_language#:#Choisir votre langue common#:#choose_only_one_language#:#Veuillez ne choisir qu'une langue common#:#chown_warning#:#Attention, il se peut que vous perdiez les droits d'accès à cet objet après avoir changé son propriétaire. @@ -3684,7 +3684,7 @@ common#:#chta_write#:#Administration autorisée common#:#chtr_copy#:#Copier Salle de Chat common#:#chtr_import#:#Importer le salon de chat common#:#city#:#Ville, Etat -common#:#cld_abandoned#:#The Cloud Object has been abandoned as of ILIAS 8. No data has been lost. Contact your System Administration for more information.###31 03 2023 new variable +common#:#cld_abandoned#:#The Cloud Object has been abandoned as of ILIAS 8. No data has been lost. Contact your System Administration for more information.###31 10 2023 new variable common#:#cleaned_file#:#Le fichier a été nettoyé. common#:#cleaning_failed#:#Le nettoyage a échoué. common#:#clear#:#Effacer @@ -3701,16 +3701,16 @@ common#:#clientlist_public_access#:#Accès public common#:#clientlist_start_page#:#Page de démarrage common#:#clipboard#:#Presse-Papier common#:#close#:#Fermer -common#:#cmix#:#Object xAPI/cmi5###31 03 2023 new variable +common#:#cmix#:#Object xAPI/cmi5###31 10 2023 new variable common#:#cnt_new#:#(%s Nouveaux) common#:#collapse#:#Replier common#:#collapse_all#:#Replier tout -common#:#collapse_content#:#Collapse Content###30 04 2021 new variable +common#:#collapse_content#:#Collapse Content common#:#collapsed#:#Replié common#:#columns#:#Colonnes common#:#comma_separated#:#Séparé par des virgules (CSV) common#:#comment#:#Commentaire -common#:#comments#:#Comments###30 04 2021 new variable +common#:#comments#:#Comments common#:#compose#:#Ecrire common#:#concurrent_uploads#:#Nombre de dépôts concurrents common#:#concurrent_uploads_info#:#Définit le nombre de fichiers qui peuvent être déposés en même temps lors d'un dépôt. @@ -3735,7 +3735,7 @@ common#:#cont_iim_content_popups_info#:#Une fenêtre de contenu apparaît lorsqu common#:#cont_iim_create_info#:#Téléchargez l'image de fond pour les interactions. common#:#cont_iim_overlay_info#:#Les images en superpositions sont utilisées pour modifier (ex. mettre en évidence) des parties de l'image de fond au survol de la souris. Après téléchargement des images, vous pouvez les sélectionner dans l'onglet "Déclencheurs". common#:#contact#:#Contact -common#:#contact_data#:#Informations de Contact +common#:#contact_data#:#Informations de contact common#:#contact_sysadmin#:#Contacter l'administrateur common#:#container#:#Conteneur common#:#container_no_items#:#Pas de Contenu Disponible @@ -3777,10 +3777,10 @@ common#:#cron_mail_notification_desc#:#Si actif, tous les utilisateurs demandant common#:#cron_mail_notification_message#:#Envoyer les notifications de mails avec le corps de message common#:#cron_mail_notification_message_info#:#Si actif, tous les utilisateurs recevront des notifications par mail externe. common#:#cron_mail_notification_never#:#Jamais -common#:#cron_users_without_login_del_create_date_thr#:#Thresholt###07 02 2020 new variable -common#:#cron_users_without_login_del_create_date_thr_info#:#All user accounts created before the defined threshold will be taken into consideration.###07 02 2020 new variable -common#:#cron_users_without_login_del_role_whitelist#:#Included Roles###07 02 2020 new variable -common#:#cron_users_without_login_del_role_whitelist_info#:#The deletion will only processed for users assigned to at least one of the selected roles###07 02 2020 new variable +common#:#cron_users_without_login_del_create_date_thr#:#Thresholt +common#:#cron_users_without_login_del_create_date_thr_info#:#All user accounts created before the defined threshold will be taken into consideration. +common#:#cron_users_without_login_del_role_whitelist#:#Included Roles +common#:#cron_users_without_login_del_role_whitelist_info#:#The deletion will only processed for users assigned to at least one of the selected roles common#:#cronjob_last_start#:#Dernière Tâche Cron Effectuée common#:#cronjob_last_start_unknown#:#Indéterminé common#:#crs#:#Cours @@ -3795,7 +3795,7 @@ common#:#crs_list_reg#:#Inscription common#:#crs_list_reg_end#:#Fin d'Inscription common#:#crs_list_reg_limit_full#:#Plus de place disponible common#:#crs_list_reg_limit_places#:#Places disponibles -common#:#crs_list_reg_noreg#:#Inscription Impossible +common#:#crs_list_reg_noreg#:#Inscription impossible common#:#crs_list_reg_period#:#Période d'Inscription common#:#crs_list_reg_start#:#Début d'Inscription common#:#crs_member_not_passed#:#Non validé @@ -3807,18 +3807,18 @@ common#:#crs_status_blocked#:#[Accès refusé] common#:#crs_status_pending#:#[En attente d'inscription] common#:#crs_subscribers_assigned#:#Nouveaux utilisateurs assignés common#:#crs_title#:#Titre du cours -common#:#crs_unsubscribe#:#Se Désinscrire +common#:#crs_unsubscribe#:#Se désinscrire common#:#crs_wizard_page#:#Copier Cours (Etape 2/2) common#:#crsr#:#Cours référent -common#:#crsr_add#:#Add Course Link###31 03 2023 new variable +common#:#crsr_add#:#Add Course Link###31 10 2023 new variable common#:#crsr_edit_info#:#Veuillez choisir un cours pour créer un nouveau référent. common#:#crsr_new#:#Créer nouveau cours référent -common#:#crsr_settings#:#Course Link Settings###31 03 2023 new variable +common#:#crsr_settings#:#Course Link Settings###31 10 2023 new variable common#:#csv_export#:#Export CSV common#:#current_ip#:#Numéro IP actuel: common#:#current_ip_alert#:#Attention : si vous saisissez un numéro IP erroné, vous ne pourrez plus accéder à la plateforme ILIAS avec ce compte utilisateur. -common#:#current_password#:#Mot de Passe Actuel -common#:#current_user_avatar#:#Your User Avatar###30 04 2021 new variable +common#:#current_password#:#Mot de passe actuel +common#:#current_user_avatar#:#Votre photo de profil common#:#currently_used_disk_space#:#Espace disque actuellement utilisé common#:#cut#:#Couper common#:#cutPage#:#Couper @@ -3840,19 +3840,19 @@ common#:#dd_mm_yyyy#:#DD/MM/YYYY common#:#deactivate#:#Désactiver common#:#decrease_attempts#:#Tentatives - 1 common#:#def_repository_view#:#Affichage par Défaut du Panneau Latéral -common#:#default#:#Par Défaut +common#:#default#:#Par défaut common#:#default_auth_mode#:#Méthode d'authentification par défaut common#:#default_auth_mode_info#:#Veuillez choisir une méthode d'authentification pour la page de connexion. common#:#default_language#:#Langue par Défaut common#:#default_perm_settings#:#Permissions par Défaut common#:#default_role#:#Rôle par Défaut -common#:#default_roles#:#Rôles par Défaut +common#:#default_roles#:#Rôles par défaut common#:#default_skin#:#Thème par Défaut common#:#default_skin_style#:#Thème / Style par Défaut common#:#default_style#:#Style par Défaut common#:#defaults#:#Paramètres par Défaut common#:#delete#:#Supprimer -common#:#delete_existing_file#:#Supprimer fichier existant +common#:#delete_existing_file#:#Supprimer un fichier existant common#:#delete_inactivated_user_accounts#:#Supprimer les comptes désactivés common#:#delete_inactivated_user_accounts_desc#:#Lorsque activé, les comptes utilisateurs sont supprimés en fonction de leur date de désactivation. common#:#delete_inactivated_user_accounts_include_roles#:#Rôles concernés @@ -3870,29 +3870,29 @@ common#:#delete_selected_items#:#Supprimer common#:#deleted#:#Supprimé common#:#deleted_user#:#L'utilisateur a été supprimé common#:#deleted_users#:#Utilisateurs supprimés -common#:#deletion_notification#:#"%s" has canceled the attendance of session "%s".###07 02 2020 new variable +common#:#deletion_notification#:#"%s" has canceled the attendance of session "%s". common#:#deliver#:#Remettre -common#:#deny_usr_agreement#:#Do not accept terms of service?###30 04 2021 new variable -common#:#deny_usr_agreement_btn#:#Not Accept###30 04 2021 new variable +common#:#deny_usr_agreement#:#Do not accept terms of service? +common#:#deny_usr_agreement_btn#:#Not Accept common#:#department#:#Département common#:#desc#:#Description common#:#description#:#Description -common#:#desired_password#:#Mot de Passe Souhaité +common#:#desired_password#:#Mot de passe souhaité common#:#details#:#Détails -common#:#didactic_template#:#Didactic Template###31 03 2023 new variable +common#:#didactic_template#:#Didactic Template###31 10 2023 new variable common#:#disable#:#désactiver common#:#disable_check#:#Désactiver la case à cocher common#:#disable_ext_lang_maint#:#Désactiver la Maintenance Etendue common#:#disable_hide_user_toggle#:#Désactivation autorisée pour ce membre common#:#disabled#:#Désactivé -common#:#disclose#:#Disclose###30 04 2021 new variable +common#:#disclose#:#Fermer common#:#dislike#:#Dislike common#:#domain#:#Domaine common#:#down#:#En Bas common#:#download#:#Télécharger common#:#download_all_returned_files#:#Télécharger tous les fichiers reçus common#:#download_link#:#Télécharger Lien -common#:#download_multiple_objects#:#Télécharger Objets Multiples +common#:#download_multiple_objects#:#Télécharger objets multiples common#:#download_selected_items#:#Télécharger common#:#download_with_uploaded_filename#:#Télécharger avec le nom de fichier téléversé common#:#download_with_uploaded_filename_info#:#Sélectionner cette option uniquement pour la compatibilité avec ILIAS 3.9 et versions précédentes : Si sélectionnée, le nom du fichier téléchargé est identique au nom du fichier téléversé dans ILIAS.Si non sélectionné, le nom du fichier téléchargé est identique au titre de l'objet ILIAS.Cette option n'affecte le WebDAV.Pour le WebDAV, le nom du fichier téléchargé est toujours identique au titre de l'objet fichier. @@ -3904,7 +3904,7 @@ common#:#drop_files_on_repo_obj_info#:#Déposez ici les fichiers que vous souhai common#:#edit#:#Editer common#:#edit_assignments#:#Editer Activités common#:#edit_cat_settings#:#Paramètres Avancés de Catégorie -common#:#edit_content#:#Editer Contenu +common#:#edit_content#:#Editer le contenu common#:#edit_grouping#:#Éditer les Limitations d'Accès common#:#edit_metadata#:#Éditer métadonnées common#:#edit_operations#:#Éditer les Opérations @@ -3915,13 +3915,13 @@ common#:#edit_properties#:#Editer les Propriétés common#:#edit_stylesheet#:#Éditer le Style common#:#edited_on#:#Edité le common#:#editor#:#Editeur -common#:#email#:#Email +common#:#email#:#e-mail common#:#email_not_valid#:#L'adresse email que vous avez saisie n'est pas valide ! common#:#enable#:#Activer common#:#enable_anonymous_fora#:#Publier avec un pseudonyme common#:#enable_anonymous_fora_desc#:#Si inactif, le bouton "Publier avec un pseudonyme" n'est plus disponible dans les forums. common#:#enable_calendar#:#Activer l'Agenda -common#:#enable_comments_export#:#Enable Comments Export###30 04 2021 new variable +common#:#enable_comments_export#:#Enable Comments Export common#:#enable_course_group_notifications#:#Mail Hebdomadaire pour les Actualités des Groupes et Cours common#:#enable_course_group_notifications_desc#:#Lorsque activé, les participants peuvent s'abonner à un résumé hebdomadaire des actualités. common#:#enable_custom_icons#:#Autoriser les icônes personnalisées @@ -3949,12 +3949,12 @@ common#:#enable_search_engine#:#Permet aux moteurs de recherche du Web (ex. Goog common#:#enable_trash#:#Activer la Corbeille common#:#enable_trash_info#:#Si la corbeille est activée, les objets supprimés sont déplacés dans la corbeille et peuvent être récupérés ultérieurement. En désactivant cette option, les objets supprimés sont définitivement supprimés du système ! common#:#enable_webdav#:#Activer l'accès au WebDAV -common#:#enable_webdav_info#:#Autorise les clients WebDAB à accèder au repository comme un webfolder. Les utilisateurs peuvent ouvrir les webfolders en utilisant l'action "Ouvrir comme un webfolder" dans le repository, ou en saississant l'adresse suivante sur un client WebDAV : %1$s +common#:#enable_webdav_info#:#Autorise les clients WebDAB à accèder au catalogue comme un webfolder. Les utilisateurs peuvent ouvrir les webfolders en utilisant l'action "Ouvrir comme un webfolder" dans le catalogue, ou en saississant l'adresse suivante sur un client WebDAV : %1$s common#:#enabled#:#Actif common#:#enter_in_mb_desc#:#Entrez une valeur en Mo. common#:#enter_new_name#:#Veuillez entrer un nom -common#:#entered_notification#:#"%s" has joined the session "%s".###07 02 2020 new variable -common#:#entry_status#:#Entry status###07 02 2020 new variable +common#:#entered_notification#:#"%s" has joined the session "%s". +common#:#entry_status#:#Entry status common#:#err_1_param#:#Seulement 1 paramètre ! common#:#err_2_param#:#Seulement 2 paramètres ! common#:#err_auth_apache_failed#:#L'authentification a échoué. Il est possible que vous n'ayez pas de certificat utilisateur valide ou votre "smartcard" n'est pas insérée. @@ -3974,7 +3974,7 @@ common#:#err_no_param#:#Pas de paramètre ! common#:#err_over_3_param#:#Plus de 3 paramètres ! common#:#err_role_not_assignable#:#Vous ne pouvez pas assigner des utilisateurs à ce rôle à cet endroit. common#:#err_session_expired#:#Votre session a expiré -common#:#err_valid_login_account_creation_disabled#:#Authentication succeeded, but the creation of new user accounts is currently disabled. Please contact your system administrator.###30 04 2021 new variable +common#:#err_valid_login_account_creation_disabled#:#Authentication succeeded, but the creation of new user accounts is currently disabled. Please contact your system administrator. common#:#err_wrong_header#:#Raison : entête invalide common#:#err_wrong_login#:#Nom d'utilisateur incorrect common#:#err_wrong_password#:#Mot de passe incorrect @@ -3983,7 +3983,7 @@ common#:#error_empty_file_or_folder#:#La taille du fichier est de 0 ou bien il s common#:#error_extraction_failed#:#L'extraction a échoué. Vous n'avez probablement pas les droits de création de dossiers ou de catégories dans l'objet. common#:#error_parser#:#Erreur au démarrage du parseur common#:#error_upload_was_zero_bytes#:#Le dépôt a échoué. Cela peut provenir d'un choix de dossier, d'un fichier dont la taille est 0 ou d'un renommage de fichier durant le dépôt. -common#:#etal_talks#:#Talks###31 03 2023 new variable +common#:#etal_talks#:#Talks###31 10 2023 new variable common#:#event_ass_materials_prop#:#Matériaux de session common#:#event_assign_files#:#Assignation au fichier common#:#exc#:#Exercice @@ -4023,7 +4023,7 @@ common#:#exercise_time_over#:#Vous avez atteint la limite de temps de l'exercice common#:#exp_html#:#Exporter HTML common#:#expand#:#Déplier common#:#expand_all#:#Déplier Tout -common#:#expand_content#:#Expand Content###30 04 2021 new variable +common#:#expand_content#:#Ouvrir le contenu common#:#expanded#:#Déplié common#:#export#:#Exporter common#:#export_format#:#Format d'exportation @@ -4031,8 +4031,8 @@ common#:#export_html#:#Exporter sous la forme d'un fichier HTML common#:#ext_cat_settings#:#Editer les Paramètres Avancés common#:#ext_link#:#Lier common#:#extracting#:#Extraction en cours... -common#:#eyeclosed#:#Eye Closed - Click to hide the input's contents###30 04 2021 new variable -common#:#eyeopened#:#Eye Open - Click to reveal the input's contents###30 04 2021 new variable +common#:#eyeclosed#:#Eye Closed - Click to hide the input's contents +common#:#eyeopened#:#Eye Open - Click to reveal the input's contents common#:#failure_message#:#Message d'échec common#:#fax#:#Fax common#:#feed#:#FluxRSS) @@ -4052,18 +4052,18 @@ common#:#file_info#:#Information sur le Fichier common#:#file_is_infected#:#Le fichier est infecté par un virus. common#:#file_no_valid_file_type#:#Ce type de fichier n’est pas autorisé. common#:#file_not_found#:#Fichier Non Trouvé ! -common#:#file_not_found_sec#:#This file cannot be found in ILIAS or has been blocked due to security reasons.###24 09 2021 new variable +common#:#file_not_found_sec#:#This file cannot be found in ILIAS or has been blocked due to security reasons. common#:#file_not_valid#:#Fichier non valide ! common#:#file_notice#:#Taille maximum du fichier : -common#:#file_objects#:#File Objects###30 04 2021 new variable +common#:#file_objects#:#File Objects common#:#file_rollback#:#Choisir comme version courante common#:#file_rollback_done#:#La version courante du fichier est maintenant %s. common#:#file_rollback_select_exact_one#:#Une seule version de fichier doit être sélectionnée. common#:#file_some_invalid_file_types_removed#:#Certains types de fichier ne sont pas autorisés et ont été retirés. common#:#file_suffix_repl#:#Remplacement des Suffixes de Fichiers common#:#file_suffix_repl_info#:#Les fichiers se terminant par ces suffixes (separés par des virgules) sont renommés avec le suffixe ".sec" lorsqu'ils sont déposés dans l'espace Web du système. C'est le cas par défaut de : -common#:#file_system_clean_temp_dir_cron#:#Clean temp directory###31 03 2023 new variable -common#:#file_system_clean_temp_dir_cron_info#:#This job cleans the ILIAS 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.###31 03 2023 new variable +common#:#file_system_clean_temp_dir_cron#:#Clean temp directory###31 10 2023 new variable +common#:#file_system_clean_temp_dir_cron_info#:#This job cleans the ILIAS 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.###31 10 2023 new variable common#:#file_updated#:#Le fichier a été mis à jour. common#:#file_upload_pending#:#Fichier en attente common#:#file_valid#:#Le fichier est valide ! @@ -4086,7 +4086,7 @@ common#:#filename_windows_special_characters#:#\/:*?"<>| non autorisés dans les common#:#filename_windows_webdav_issue#:#0 common#:#files#:#Fichiers common#:#filesize#:#Taille du Fichier -common#:#filetype#:#Type de Fichier +common#:#filetype#:#Type de fichier common#:#fill_out_all_required_fields#:#Veuillez renseigner tous les champs obligatoires common#:#filter#:#Filtre common#:#filter_users_with_access#:#Uniquement les utilisateurs avec accès @@ -4141,12 +4141,12 @@ common#:#functions#:#Fonctions common#:#further_informations#:#Informations supplémentaires common#:#gdf_add#:#Ajouter Définition common#:#gdf_new#:#Nouvelle Définition -common#:#gender#:#Sexe +common#:#gender#:#Genre common#:#gender_f#:#Féminin common#:#gender_m#:#Masculin common#:#gender_n#:#Aucune salutation souhaitée -common#:#general#:#General###31 03 2023 new variable -common#:#general_settings#:#Paramètres Généraux +common#:#general#:#General###31 10 2023 new variable +common#:#general_settings#:#Paramètres généraux common#:#generate#:#Générer common#:#ghostscript_not_configured#:#Ghostscript n'est pas configuré. Veuillez ouvrir ce lien pour le configurer. common#:#glo#:#Glossaire @@ -4162,7 +4162,7 @@ common#:#glo_new#:#Nouveau Glossaire common#:#global#:#Global common#:#global_default#:#Valeur par Défaut common#:#global_fixed#:#Valeur Imposée -common#:#global_role_assignment#:#Globale Rollenzuweisung###30 04 2021 new variable +common#:#global_role_assignment#:#Attribution globale des rôles common#:#global_settings#:#Paramètres globaux common#:#global_user#:#Utilisateurs globaux common#:#glossaries#:#Glossaires @@ -4196,13 +4196,13 @@ common#:#grp_dismiss_myself#:#Etes-vous sûr(e) de vouloir vous retirer du group common#:#grp_edit#:#Editer Groupe common#:#grp_err_administrator_required#:#L'utilisateur ne peut pas être retiré du groupe : au moins un administrateur par groupe est nécessaire ! common#:#grp_header_edit_members#:#Editer les membres -common#:#grp_list_members#:#List members###07 02 2020 new variable +common#:#grp_list_members#:#List members common#:#grp_list_reg#:#Inscription common#:#grp_list_reg_end#:#Fin d'Inscription common#:#grp_list_reg_limit_full#:#Plus de place disponible common#:#grp_list_reg_limit_places#:#Places disponibles -common#:#grp_list_reg_noreg#:#Aucune Inscription Possible -common#:#grp_list_reg_period#:#Période d'Inscription +common#:#grp_list_reg_noreg#:#Aucune inscription possible +common#:#grp_list_reg_period#:#Période d'inscription common#:#grp_list_reg_start#:#Début d'Inscription common#:#grp_list_users#:#Lister des utilisateurs common#:#grp_mem_change_status#:#Modifier le statut de membre @@ -4218,11 +4218,11 @@ common#:#grp_removed_from_waiting_list#:#Vous avez été supprimé de la liste d common#:#grp_select_one_file#:#Veuillez sélectionner un fichier. common#:#grp_wizard_page#:#Copier le Groupe (Etape 2/2) common#:#grpr#:#Group Reference -common#:#grpr_add#:#Add Group Link###31 03 2023 new variable +common#:#grpr_add#:#Add Group Link###31 10 2023 new variable common#:#grpr_edit#:#Edit Group Reference common#:#grpr_edit_info#:#Please choose one group, for creating a new reference. common#:#grpr_new#:#Create Group Reference -common#:#grpr_settings#:#Group Link Settings###31 03 2023 new variable +common#:#grpr_settings#:#Group Link Settings###31 10 2023 new variable common#:#header_searchable#:#Recherche common#:#header_title#:#Titre de Bandeau common#:#header_visible_registration#:#Visible dans l'inscription @@ -4232,14 +4232,14 @@ common#:#help#:#Aide common#:#hide#:#Masquer common#:#hide_all_details#:#Cacher les détails common#:#hide_details#:#Cacher Détails -common#:#hide_filter#:#Masquer le Filtre +common#:#hide_filter#:#Masquer le filtre common#:#hide_own_online_status#:#Cacher Mon Statut En-Ligne common#:#hide_visible_sections#:#Masquer plus d’informations » common#:#hint#:#Zone common#:#hist_lm_delete_pg#:#La page "%1" [%2] a été supprimée. common#:#hist_lm_delete_st#:#Le chapitre "%1" [%2] a été supprimé. common#:#hist_lm_pg_create#:#Page créée. -common#:#hist_lm_pg_update#:#Page changed.###15 12 2021 new variable +common#:#hist_lm_pg_update#:#Page changed. common#:#hist_lm_st_create#:#Chapitre créé. common#:#hist_webr_add#:#Nouvelle ressource web ajoutée avec le titre : "%1" common#:#hist_webr_delete#:#Ressource web détruite : "%1" @@ -4288,8 +4288,8 @@ common#:#il_grp_status_open#:#Groupe ouvert common#:#il_iass_member#:#Personne examinée dans l’évaluation individuelle common#:#il_lso_admin#:#Learning Sequence Admin common#:#il_lso_member#:#Learning Sequence Member -common#:#il_lti_instructor#:#LTI Instructor###24 09 2021 new variable -common#:#il_lti_learner#:#LTI Learner###24 09 2021 new variable +common#:#il_lti_instructor#:#LTI Instructor +common#:#il_lti_learner#:#LTI Learner common#:#il_orgu_employee#:#Employé common#:#il_orgu_superior#:#Supérieur common#:#ilias_version#:#Version ILIAS @@ -4312,9 +4312,9 @@ common#:#import_users#:#Importer Utilisateurs common#:#import_warning_log#:#Importer journal des avertissements common#:#important#:#Important common#:#imported#:#importé -common#:#imprint#:#Mentions Légales +common#:#imprint#:#Mentions légales common#:#in#:#dans -common#:#in_use#:#Langue Utilisateur +common#:#in_use#:#Langue de l'utilisateur common#:#in_use_by#:#Utilisé par common#:#inactive#:#Inactif common#:#inbox#:#Réception @@ -4335,7 +4335,7 @@ common#:#info_err_user_not_exist#:#Il n'existe pas d'utilisateur avec ce nom ou common#:#info_from_role#:#Obtenu par le Rôle / Propriété common#:#info_is_member#:#L'utilisateur est membre common#:#info_is_not_member#:#L'utilisateur n'est pas membre -common#:#info_message#:#Message d'Information +common#:#info_message#:#Message d'information common#:#info_not_assigned#:#non assigné common#:#info_owner_of_object#:#Propriétaire de l'objet common#:#info_permission_origin#:#Position d'Origine @@ -4354,8 +4354,8 @@ common#:#inst_id#:#ID d'Installation common#:#inst_info#:#Info d'Installation common#:#inst_name#:#Nom d'Installation common#:#install#:#Installer -common#:#install_local#:#Installer avec Fichiers Locaux -common#:#installation_status#:#Installation Status###30 04 2021 new variable +common#:#install_local#:#Installer avec fichiers locaux +common#:#installation_status#:#Installation Status common#:#installed#:#Installé common#:#installed_local#:#Installé avec Fichiers Locaux common#:#instant_messengers#:#Messageries Instantanées @@ -4374,11 +4374,11 @@ common#:#java_server_host#:#Hôte common#:#java_server_info#:#Lorsque cette option est activée, il est possible d'effectuer des recherches dans les fichiers PDF, fichiers HTML et modules HTML. common#:#java_server_port#:#Port common#:#java_server_readme#:#Informations d'installation -common#:#join#:#S'Inscrire +common#:#join#:#S'inscrire common#:#join_session#:#S'inscrire common#:#kb#:#Ko common#:#keywords#:#Mots-clés -common#:#label_search_options#:#Search Area###30 04 2021 new variable +common#:#label_search_options#:#Champ de recherche common#:#lang_dateformat#:#d-m-Y common#:#lang_path#:#Chemin d'Accès aux Langues common#:#lang_refresh_confirm#:#Désirez-vous vraiment rafraichir toutes les langues ? @@ -4403,13 +4403,13 @@ common#:#languages_already_installed#:#Les langues choisies sont déjà install common#:#languages_already_uninstalled#:#Les langues choisies sont déjà désinstallées common#:#languages_updated#:#Toutes les langues installées ont été mises à jour common#:#last_access#:#Dernier Accès -common#:#last_change#:#Dernière Modification +common#:#last_change#:#Dernière modification common#:#last_edited_on#:#Dernière modification le common#:#last_login#:#Dernière Connexion common#:#last_refresh#:#Dernier rafraîchissement common#:#last_reminder#:#Dernier rappel -common#:#last_update#:#Dernière Mise à Jour -common#:#last_visited#:#Dernières Pages Visitées +common#:#last_update#:#Dernière mise à jour +common#:#last_visited#:#Dernières pages visitées common#:#lastname#:#Nom common#:#laugh#:#Laugh common#:#launch#:#Lancer @@ -4466,11 +4466,11 @@ common#:#local#:#Local common#:#local_language_file#:#Fichier local de langue common#:#local_language_files#:#Fichiers locaux de langue common#:#local_languages_already_installed#:#Les fichiers de langue locaux sélectionnés sont déjà installés -common#:#local_role_assignment#:#Lokale Rollenzuweisung###30 04 2021 new variable +common#:#local_role_assignment#:#Attribution de rôles locaux common#:#location#:#Localisation common#:#locator#:#Emplacement : -common#:#log_in#:#Se Connecter -common#:#log_out#:#Logout###30 04 2021 new variable +common#:#log_in#:#Se connecter +common#:#log_out#:#Se déconnecter common#:#logic_or#:#ou common#:#login#:#Connexion common#:#login_as#:#... @@ -4486,26 +4486,26 @@ common#:#login_to_ilias_via_saml#:#Connexion à ILIAS par authentification SAML common#:#login_to_ilias_via_shibboleth#:#Se connecter à ILIAS via Shibboleth common#:#loginname_already_exists#:#Ce nom de connexion (login) existe déjà . common#:#loginname_settings#:#Paramètres-nom de connexion -common#:#logout#:#Déconnexion +common#:#logout#:#Déconnecter common#:#logout_text#:#Vous êtes déconnecté d'ILIAS. Votre session a été fermée. common#:#logs#:#Données de Suivi common#:#love#:#Love common#:#lres#:#Ressources Pédagogiques common#:#lso_add#:#Add Learning Sequence -common#:#lso_admin_form_byline#:#General Settings for Learning Sequences###30 04 2021 new variable -common#:#lso_admin_form_title#:#Settings###30 04 2021 new variable -common#:#lso_admin_interval_byline#:#Poll Learning Progress every x seconds. Be careful! A low value will increase server-requests and have an impact on overall system performance. Please choose highest value possible! ###30 04 2021 new variable -common#:#lso_admin_interval_label#:#Learning Progress Polling Interval (seconds)###30 04 2021 new variable +common#:#lso_admin_form_byline#:#General Settings for Learning Sequences +common#:#lso_admin_form_title#:#Settings +common#:#lso_admin_interval_byline#:#Poll Learning Progress every x seconds. Be careful! A low value will increase server-requests and have an impact on overall system performance. Please choose highest value possible! +common#:#lso_admin_interval_label#:#Learning Progress Polling Interval (seconds) common#:#lso_copy#:#Copy Learning Sequence common#:#lso_copy_threads_info#:#Please decide which elements of the Learning Sequence should be copied, linked or omitted. common#:#lso_edit#:#Edit Learning Sequence common#:#lso_import#:#Import Learning Sequence common#:#lso_new#:#New Learning Sequence -common#:#lso_wizard_page#:#Copy Learning Sequence (Step 2/2)###07 02 2020 new variable -common#:#lti#:#LTI Consumer###31 03 2023 new variable +common#:#lso_wizard_page#:#Copy Learning Sequence (Step 2/2) +common#:#lti#:#LTI Consumer###31 10 2023 new variable common#:#lti_outcome#:#Notification de la progression d’apprentissage LTI common#:#lti_outcome_info#:#Envoyer le statut de progression d’apprentissage des utilisateurs LTI au consommateur d’outils LTI. -common#:#mail#:#Messagerie +common#:#mail#:#Messagerie e-mail common#:#mail_addressbook#:#Contacts common#:#mail_at_the_ilias_installation#:#Vous avez reçu %1$s nouveau mail à l'installation-ILIAS %2$s common#:#mail_attachment#:#Piece jointe @@ -4513,28 +4513,28 @@ common#:#mail_b_inbox#:#Réception common#:#mail_c_trash#:#Corbeille common#:#mail_d_drafts#:#Brouillons common#:#mail_delete_error#:#Erreur pendant la suppression -common#:#mail_e_sent#:#Envoyé +common#:#mail_e_sent#:#Envoyés common#:#mail_edit_permission#:#Permissions d'administration modifiables -common#:#mail_folders#:#Dossiers de Messagerie +common#:#mail_folders#:#Dossiers de messagerie e-mail common#:#mail_import_file#:#Fichier d'exportation common#:#mail_mails_of#:#Messages common#:#mail_maxsize_attach#:#Taille max. des pièces jointes common#:#mail_member#:#Envoyer Message -common#:#mail_members#:#Envoyer un Message aux Membres +common#:#mail_members#:#Envoyer un message aux membres common#:#mail_not_sent#:#Message non envoyé ! common#:#mail_search_no#:#Aucune entrée trouvée ! common#:#mail_select_one#:#Vous devez sélectionner un message! common#:#mail_send_error#:#Erreur lors de l'envoi du message common#:#mail_sent#:#Message envoyé ! -common#:#mail_settings#:#Paramètres de Messagerie +common#:#mail_settings#:#Paramètres de la messagerie common#:#mail_to_global_roles_not_allowed#:#L'envoi d'email aux rôles globaux n'est pas autorisé. -common#:#mail_z_local#:#Dossiers Utilisateur +common#:#mail_z_local#:#Dossiers utilisateur common#:#mails#:#Messages common#:#mails_at_the_ilias_installation#:#Vous avez reçu %1$s nouveaux mails à l'installation-ILIAS %2$s common#:#mails_pl#:#Message(s) common#:#main_menu#:#Menu Principal -common#:#mainbar_aria_label#:#Mainbar###30 04 2021 new variable -common#:#mainbar_more_label#:#More###30 04 2021 new variable +common#:#mainbar_aria_label#:#Barre principale +common#:#mainbar_more_label#:#Plus common#:#manage_members#:#Gérer les membres common#:#marked_entries#:#Entrées Marquées common#:#matriculation#:#Numéro de matricule @@ -4573,80 +4573,80 @@ common#:#mep_edit#:#Modifier les Propriétés de la Galerie de Médias common#:#mep_new#:#Nouvelle Galerie de Médias common#:#mep_not_insert_already_exist#:#Les objets suivants n'ont pas été ajoutés, car ils sont déjà dans la galerie multimédia. common#:#message#:#Message -common#:#message_content#:#Contenu du Message +common#:#message_content#:#Contenu du message common#:#message_no_delivered_files#:#Vous n'avez remis aucun fichier common#:#meta_data#:#Métadonnées -common#:#metabar_aria_label#:#Metabar###30 04 2021 new variable +common#:#metabar_aria_label#:#Metabar common#:#mgs_objects_linked_to_the_following_folders_p#:#Les objets étaient liés aux dossiers suivant(s): %s common#:#mgs_objects_linked_to_the_following_folders_s#:#L'objet était lié aux dossiers suivant(s): %s common#:#migrate#:#Migrer -common#:#minimize#:#Minimize###31 03 2023 new variable +common#:#minimize#:#Minimize###31 10 2023 new variable common#:#minute#:#Minute common#:#minutes#:#Minute(s) common#:#missing#:#Manquant common#:#missing_perm#:#Permission Manquante common#:#missing_precondition#:#Précondition Non Remplie -common#:#mm_achievements#:#Achievements###07 02 2020 new variable -common#:#mm_administration#:#Administration###07 02 2020 new variable -common#:#mm_badges#:#Badges###07 02 2020 new variable -common#:#mm_calendar#:#Calendar###07 02 2020 new variable -common#:#mm_certificates#:#Certificates###07 02 2020 new variable -common#:#mm_comments#:#Comments###07 02 2020 new variable -common#:#mm_communication#:#Communication###07 02 2020 new variable -common#:#mm_contacts#:#Contacts###07 02 2020 new variable -common#:#mm_dashboard#:#Dashboard###07 02 2020 new variable -common#:#mm_enrolments#:#Enrolments###07 02 2020 new variable -common#:#mm_favorites#:#Favourites###07 02 2020 new variable -common#:#mm_learning_history#:#Learning History###07 02 2020 new variable -common#:#mm_learning_progress#:#Learning Progress###07 02 2020 new variable -common#:#mm_mail#:#Mail###07 02 2020 new variable -common#:#mm_news#:#News###07 02 2020 new variable -common#:#mm_notes#:#Notes###07 02 2020 new variable -common#:#mm_organisation#:#Organisation###07 02 2020 new variable -common#:#mm_personal_and_shared_r#:#Personal and Shared Resources###07 02 2020 new variable -common#:#mm_personal_workspace#:#Personal Workspace###07 02 2020 new variable -common#:#mm_portfolio#:#Portfolio###07 02 2020 new variable -common#:#mm_private_chats#:#Private Chats###31 03 2023 new variable -common#:#mm_rep_tree_view#:#Tree View###07 02 2020 new variable -common#:#mm_repo_tree_view#:#Tree View###07 02 2020 new variable -common#:#mm_repo_tree_view_act#:#Activate Tree###07 02 2020 new variable -common#:#mm_repo_tree_view_deact#:#Deactivate Tree###07 02 2020 new variable -common#:#mm_repository#:#Repository###07 02 2020 new variable -common#:#mm_skills#:#Competences###07 02 2020 new variable -common#:#mm_staff_list#:#Staff List###07 02 2020 new variable -common#:#mm_tags#:#Tags###07 02 2020 new variable -common#:#mm_task_derived_tasks#:#Tasks###07 02 2020 new variable -common#:#mme_lost_item_reason#:#Item is no longer provided.###07 02 2020 new variable -common#:#mme_lost_item_title#:#No assignment###07 02 2020 new variable +common#:#mm_achievements#:#Succès +common#:#mm_administration#:#Administration +common#:#mm_badges#:#Badges +common#:#mm_calendar#:#Calendrier +common#:#mm_certificates#:#Certificats +common#:#mm_comments#:#Commentaires +common#:#mm_communication#:#Communication +common#:#mm_contacts#:#Contacts +common#:#mm_dashboard#:#Tableau de bord +common#:#mm_enrolments#:#Inscriptions +common#:#mm_favorites#:#Favoris +common#:#mm_learning_history#:#Parcours de formation +common#:#mm_learning_progress#:#Progression +common#:#mm_mail#:#Messagerie e-mail +common#:#mm_news#:#Actualités +common#:#mm_notes#:#Notes +common#:#mm_organisation#:#Organisation +common#:#mm_personal_and_shared_r#:#Ressources personnelles et partagées +common#:#mm_personal_workspace#:#Espace personnel +common#:#mm_portfolio#:#Portfolio +common#:#mm_private_chats#:#Private Chats###31 10 2023 new variable +common#:#mm_rep_tree_view#:#Arborescence +common#:#mm_repo_tree_view#:#Tree View +common#:#mm_repo_tree_view_act#:#Activate Tree +common#:#mm_repo_tree_view_deact#:#Deactivate Tree +common#:#mm_repository#:#Catalogue +common#:#mm_skills#:#Compétences +common#:#mm_staff_list#:#Collaborateurs +common#:#mm_tags#:#Tags +common#:#mm_task_derived_tasks#:#Tâches +common#:#mme_lost_item_reason#:#Item is no longer provided. +common#:#mme_lost_item_title#:#No assignment common#:#mob#:#Média common#:#moderators#:#Modérateurs common#:#module#:#module common#:#modules#:#Modules common#:#month#:#Mois -common#:#month_01_long#:#Janvier -common#:#month_01_short#:#Jan -common#:#month_02_long#:#Février -common#:#month_02_short#:#Fév -common#:#month_03_long#:#Mars -common#:#month_03_short#:#Mar -common#:#month_04_long#:#Avril -common#:#month_04_short#:#Avr -common#:#month_05_long#:#Mai -common#:#month_05_short#:#Mai -common#:#month_06_long#:#Juin -common#:#month_06_short#:#Juin -common#:#month_07_long#:#Juillet -common#:#month_07_short#:#Juil -common#:#month_08_long#:#Août -common#:#month_08_short#:#Aoû -common#:#month_09_long#:#Septembre -common#:#month_09_short#:#Sep -common#:#month_10_long#:#Octobre -common#:#month_10_short#:#Oct -common#:#month_11_long#:#Novembre -common#:#month_11_short#:#Nov -common#:#month_12_long#:#Décembre -common#:#month_12_short#:#Déc +common#:#month_01_long#:#janvier +common#:#month_01_short#:#janv. +common#:#month_02_long#:#février +common#:#month_02_short#:#fév. +common#:#month_03_long#:#mars +common#:#month_03_short#:#mars +common#:#month_04_long#:#avril +common#:#month_04_short#:#avr. +common#:#month_05_long#:#mai +common#:#month_05_short#:#mai +common#:#month_06_long#:#juin +common#:#month_06_short#:#juin +common#:#month_07_long#:#juillet +common#:#month_07_short#:#juil. +common#:#month_08_long#:#août +common#:#month_08_short#:#août +common#:#month_09_long#:#septembre +common#:#month_09_short#:#sept. +common#:#month_10_long#:#octobre +common#:#month_10_short#:#oct. +common#:#month_11_long#:#novembre +common#:#month_11_short#:#nov. +common#:#month_12_long#:#décembre +common#:#month_12_short#:#déc. common#:#monthly#:#mensuel common#:#months#:#Mois common#:#mount_webfolder#:#Ouvrir comme un dossier web @@ -4654,7 +4654,7 @@ common#:#move#:#Déplacer common#:#moveChapter#:#Déplacer common#:#movePage#:#Déplacer common#:#move_selected_items#:#Déplacer -common#:#msg_bt_download_started#:#ILIAS is generating a ZIP archive of all available files. You can download them from the Notification Center (bell icon) on top right.###07 02 2020 new variable +common#:#msg_bt_download_started#:#ILIAS is generating a ZIP archive of all available files. You can download them from the Notification Center (bell icon) on top right. common#:#msg_cancel#:#Action annulée common#:#msg_clear_clipboard#:#Presse-papier vidé common#:#msg_cloned#:#Objet(s) sélectionné(s) copié(s) @@ -4668,9 +4668,9 @@ common#:#msg_deleted_role#:#Rôle supprimé common#:#msg_deleted_roles_rolts#:#Rôles et Modèles de Rôle supprimés common#:#msg_failed#:#Désolé, l'action a échoué common#:#msg_form_save_error#:#Les données pourraient être non enregistrées. Veuillez vérifier les zones de saisie ayant des messages d'erreur. -common#:#msg_info_blacklisted#:#The files cannot be uploaded due to security reasons.###07 02 2020 new variable -common#:#msg_input_char_limit_max#:#You have entered more characters than allowed.###26 04 2023 new variable -common#:#msg_input_char_limit_min#:#You have to enter the minimum of characters specified.###26 04 2023 new variable +common#:#msg_info_blacklisted#:#Veuillez nous excuser ! Vous ne pouvez pas télécharger le fichier pour des raisons de sécurité. +common#:#msg_input_char_limit_max#:#You have entered more characters than allowed.###31 10 2023 new variable +common#:#msg_input_char_limit_min#:#You have to enter the minimum of characters specified.###31 10 2023 new variable common#:#msg_input_does_not_match_regexp#:#Veuillez fournir une valeur correcte. common#:#msg_input_is_required#:#Cette information est obligatoire. Veuillez saisir une valeur. common#:#msg_is_last_role#:#Vous avez retiré le dernier rôle global des utilisateurs suivants @@ -4684,7 +4684,7 @@ common#:#msg_multi_language_selected#:#Vous avez choisi la même langue pour plu common#:#msg_no_default_language#:#Pas de langue par défaut spécifié ! Vous devez définir une traduction comme traduction par défaut. common#:#msg_no_delete_yourself#:#Vous ne pouvez pas supprimer votre propre compte utilisateur. common#:#msg_no_file#:#Vous n'avez pas choisi de fichier -common#:#msg_no_files_selected#:#No files selected###24 09 2021 new variable +common#:#msg_no_files_selected#:#No files selected common#:#msg_no_language_selected#:#Pas de langue de traduction spécifiée ! Vous devez définir une langue pour chaque traduction. common#:#msg_no_perm_assign_role_to_user#:#Vous n'avez pas la permission de modifier les rôles de l'utilisateur common#:#msg_no_perm_assign_user_to_role#:#Vous n'avez pas la permission de modifier l'assignation de l'utilisateur @@ -4725,38 +4725,38 @@ common#:#msg_role_reserved_prefix#:#Le préfixe 'il_' est réservé aux rôles g common#:#msg_roleassignment_changed#:#Assignation de rôle modifée common#:#msg_sysrole_not_deletable#:#Le rôle système ne peut pas être supprimé common#:#msg_sysrole_not_editable#:#Les paramètres de permissions du rôle système ne peuvent pas être modifiés. Le rôle système donne à tous les utilisateurs assignés un accès illimité sur tous les objets et fonctions. -common#:#msg_to_many_files#:#Too many files selected, allowed amount of files:###24 09 2021 new variable +common#:#msg_to_many_files#:#Too many files selected, allowed amount of files: common#:#msg_trash_empty#:#Aucun objet n'a été supprimé common#:#msg_undeleted#:#Objet(s) restauré(s). common#:#msg_unit_is_required#:#Cette saisie nécessite une unité. Veuillez saisir une valeur correcte. -common#:#msg_unknown_value#:#An unknown value has been passed.###30 04 2021 new variable +common#:#msg_unknown_value#:#An unknown value has been passed. common#:#msg_user_last_role1#:#Seul ce rôle a été attribué aux utilisateurs suivants : common#:#msg_user_last_role2#:#Veuillez supprimer les utilisateurs ou leur assigner un autre rôle pour pouvoir supprimer ce rôle. common#:#msg_userassignment_changed#:#Assignation de l'utilisateur modifiée -common#:#msg_wrong_filetypes#:#Allowed Files-Types:###07 02 2020 new variable +common#:#msg_wrong_filetypes#:#Allowed Files-Types: common#:#msg_wrong_format#:#La valeur saisie n'est pas dans un format valide. common#:#my_bms#:#Favoris common#:#my_certificates#:#My Certificates common#:#my_contacts#:#Mes Contacts common#:#my_courses#:#Mes Cours -common#:#my_courses_groups#:#Mes Cours et Groupes +common#:#my_courses_groups#:#Mes cours et groupes common#:#my_staff#:#Personnel common#:#name#:#Nom -common#:#nc_contact_requests_headline#:#Contact Requests###07 02 2020 new variable -common#:#nc_contact_requests_number_p#:#You have %s Contact Requests.###07 02 2020 new variable -common#:#nc_contact_requests_number_s#:#You have %s Contact Request.###07 02 2020 new variable -common#:#nc_contact_requests_prop_time#:#Time###07 02 2020 new variable +common#:#nc_contact_requests_headline#:#Contact Requests +common#:#nc_contact_requests_number_p#:#You have %s Contact Requests. +common#:#nc_contact_requests_number_s#:#You have %s Contact Request. +common#:#nc_contact_requests_prop_time#:#Time common#:#never#:#jamais common#:#new#:#Nouveau common#:#new_language#:#Nouvelle Langue common#:#new_pass_equals_old_pass#:#Le nouveau mot de passe est identique à l'ancien. common#:#newline#:#Nouvelle ligne -common#:#news#:#Actualités +common#:#news#:#Actualités et flux RSS common#:#next#:#Suivant common#:#no#:#Non common#:#no_access_item#:#Vous n'avez pas la permission d'accéder à cet objet. common#:#no_access_item_public#:#Vous devez être connecté et disposer des permissions nécessaires pour accéder à cet objet. -common#:#no_accessibility_control_concept_description#:#There is currently no Accessibility Control Concept provided with this installation. Please contact the Accessibility Point of Contact.###07 02 2020 new variable +common#:#no_accessibility_control_concept_description#:#There is currently no Accessibility Control Concept provided with this installation. Please contact the Accessibility Point of Contact. common#:#no_agreement_description#:#Aucune charte d'utilisation n'est actuellement fournie. Veuillez contacter l'administrateur. common#:#no_checkbox#:#Veuillez sélectionner au moins un élément. common#:#no_condition_selected#:#Veuillez sélectionner une précondition. @@ -4764,7 +4764,7 @@ common#:#no_date#:#Pas de date common#:#no_gallery_users_available#:#Il n'y a pas d'utilisateurs dans la galerie. common#:#no_global_role_left#:#Un rôle doit être assigné à tout utilisateur. common#:#no_import_file_found#:#Aucun fichier d'importation trouvé -common#:#no_items#:#Aucun Objet +common#:#no_items#:#Aucune entrée common#:#no_limit#:#Pas de limite common#:#no_mkisofs_configured#:#Vous devez configurer l'utilitaire mkisofs dans les paramètres système pour exécuter l'export ISO common#:#no_owner#:#Pas de Propriétaire @@ -4775,7 +4775,7 @@ common#:#no_start_file#:#Aucun Fichier de Départ. common#:#no_title#:#Pas de Titre common#:#no_users_selected#:#Veuillez sélectionner un utilisateur. common#:#no_xml_file_found_in_zip#:#Aucun fichier XML n'est présent dans le ZIP : -common#:#noc#:#Notification Center###07 02 2020 new variable +common#:#noc#:#Centre de notifications common#:#non_internal_local_roles_only#:#Rôles locaux (définis par l'utilisateur) common#:#none#:#Aucun common#:#normal#:#Normal @@ -4785,7 +4785,7 @@ common#:#not_installed#:#Non installé common#:#not_logged_in#:#Vous n'êtes pas connecté common#:#note#:#Annotation common#:#notes#:#Notes -common#:#notes_and_comments#:#Notes et Commentaires +common#:#notes_and_comments#:#Notes et commentaires common#:#notice#:#Note common#:#notifications#:#Notifications common#:#nr_following_sessions#:#%1d session(s) suivante(s)... @@ -4793,94 +4793,94 @@ common#:#num_of_selected_files#:#%s fichier(s) sélectionnés common#:#num_users#:#Nombre d'Utilisateurs common#:#obj#:#Objet common#:#obj_accs#:#Accessibilité -common#:#obj_accs_desc#:#Paramètrage des fonctions d'accessibilité. +common#:#obj_accs_desc#:#Paramétrage des fonctions d'accessibilité common#:#obj_adm#:#Administration common#:#obj_adm_desc#:#Paramétrage et administration générale d'ILIAS -common#:#obj_adn#:#Administrative Notifications###30 04 2021 new variable -common#:#obj_adve#:#Edition +common#:#obj_adn#:#Notifications administratives +common#:#obj_adve#:#Editeur common#:#obj_adve_desc#:#Paramétrage de l'éditeur ILIAS et de TinyMCE common#:#obj_ass#:#Atout -common#:#obj_assf#:#Test & Evaluation -common#:#obj_assf_desc#:#Paramétrage des Tests et Evaluations -common#:#obj_auth#:#Authentification et Enregistrement -common#:#obj_auth_desc#:#Paramétrage du mode d'authentification (local, LDAP, etc.) et de l'enregistrement de nouveaux utilisateurs -common#:#obj_awra#:#'Qui est en Ligne ?' -common#:#obj_awra_desc#:#Paramétrage de 'Qui est en Ligne ?' +common#:#obj_assf#:#Test et évaluation +common#:#obj_assf_desc#:#Paramétrage et gestion de l'outil de test et d'évaluation +common#:#obj_auth#:#Authentification / Nouvelle inscription +common#:#obj_auth_desc#:#Configurez ici le type d'authentification des utilisateurs (local, LDAP, CAS, ...) ainsi que les nouvelles inscriptions. +common#:#obj_awra#:#Annonce 'Qui est en ligne ?' +common#:#obj_awra_desc#:#Paramétrage de l'annonce 'Qui est en ligne ?' common#:#obj_bdga#:#Badges common#:#obj_bdga_desc#:#Administrer les types, modèles d’images et les badges d’activité -common#:#obj_bgtk#:#Background Task###07 02 2020 new variable +common#:#obj_bgtk#:#Background Task common#:#obj_bibl#:#Bibliographie common#:#obj_bibs#:#Bibliographie -common#:#obj_bibs_desc#:#Paramétrage de Bibliographie +common#:#obj_bibs_desc#:#Paramétrage de bibliographie common#:#obj_blog#:#Blog common#:#obj_blog_duplicate#:#Copier Blog common#:#obj_book#:#Outil de réservation common#:#obj_cadm#:#Contacts -common#:#obj_cadm_desc#:#Paramétrage des Contacts -common#:#obj_cals#:#Agenda -common#:#obj_cals_desc#:#Paramètres généraux de l'agenda. +common#:#obj_cadm_desc#:#Paramétrage des contacts +common#:#obj_cals#:#Calendrier +common#:#obj_cals_desc#:#Paramètres généraux du calendrier common#:#obj_cat#:#Catégorie common#:#obj_cat_duplicate#:#Copier Catégorie common#:#obj_catr#:#Catégorie référente common#:#obj_cert#:#Certificats common#:#obj_cert_desc#:#Paramètrage des certificats common#:#obj_chap#:#Chapitre -common#:#obj_chta#:#Chat +common#:#obj_chta#:#Salle de discussion common#:#obj_chtr#:#Salle de Chat -common#:#obj_chtr_duplicate#:#Copy Chat Room###09 03 2022 new variable +common#:#obj_chtr_duplicate#:#Copy Chat Room common#:#obj_cld#:#Objet Cloud -common#:#obj_cmis#:#xAPI/cmi5###07 02 2020 new variable -common#:#obj_cmis_desc#:#Learning Record Store Types Configuration###07 02 2020 new variable -common#:#obj_cmix#:#xAPI/cmi5###07 02 2020 new variable -common#:#obj_cmps#:#Plugins, Modules et Services -common#:#obj_cmps_desc#:#Paramètres généraux des Modules, Services et Plugins. -common#:#obj_coms#:#Comments###07 02 2020 new variable -common#:#obj_coms_desc#:#Comments settings###07 02 2020 new variable +common#:#obj_cmis#:#xAPI/cmi5 +common#:#obj_cmis_desc#:#Configuration Learning Record Store Types +common#:#obj_cmix#:#xAPI/cmi5 +common#:#obj_cmps#:#Plugins +common#:#obj_cmps_desc#:#Paramètres généraux des plugins +common#:#obj_coms#:#Commentaires +common#:#obj_coms_desc#:#Administrer la fonction de commentaire common#:#obj_copa#:#Content Page -common#:#obj_cpad#:#Content Pages###30 04 2021 new variable -common#:#obj_cpad#_desc#:#Content Page Administration###30 04 2021 new variable -common#:#obj_cpad_desc#:#Content Page Administration###30 04 2021 new variable +common#:#obj_cpad#:#Pages de contenu +common#:#obj_cpad#_desc#:#Content Page Administration +common#:#obj_cpad_desc#:#Administration des pages de contenu common#:#obj_crs#:#Cours common#:#obj_crs_duplicate#:#Copier Cours common#:#obj_crsr#:#Cours référent common#:#obj_crss#:#Cours -common#:#obj_crss_desc#:#Paramètres généraux pour les Cours +common#:#obj_crss_desc#:#Paramètres généraux pour les cours common#:#obj_crsv#:#Certificat de Cours common#:#obj_dbk#:#Livre Digilib common#:#obj_dcl#:#Collection de Données common#:#obj_dcl_duplicate#:#Copier Collection de Données -common#:#obj_dshs#:#Dashboard###07 02 2020 new variable -common#:#obj_dshs_desc#:#Dashboard settings###07 02 2020 new variable +common#:#obj_dshs#:#Tableau de bord +common#:#obj_dshs_desc#:#Administrer le tableau de bord common#:#obj_ecss#:#ECS -common#:#obj_ecss_desc#:#Paramétrage général ECS -common#:#obj_etal#:#Employee Talk###31 03 2023 new variable +common#:#obj_ecss_desc#:#Contient des paramètres globaux pour le E-Learning Community Server +common#:#obj_etal#:#Employee Talk###31 10 2023 new variable common#:#obj_exc#:#Exercice common#:#obj_exc_duplicate#:#Copier Exercice common#:#obj_excv#:#Certificat d'Exercice -common#:#obj_extt#:#Logiciels Tiers +common#:#obj_extt#:#Logiciels tiers common#:#obj_extt_desc#:#Configuration des logiciels et services externes supportés par ILIAS -common#:#obj_facs#:#Accès au fichier -common#:#obj_facs_desc#:#Configurer les accès aux fichiers. +common#:#obj_facs#:#Fichiers +common#:#obj_facs_desc#:#Paramètres pour les fichiers et la gestion des fichiers common#:#obj_file#:#Fichier common#:#obj_file_duplicate#:#Copier Fichier common#:#obj_file_inline#:#Fichier de document d'apprentissage -common#:#obj_fils#:#File Services###30 04 2021 new variable -common#:#obj_fils_desc#:#Configuration of File Service Settings.###30 04 2021 new variable +common#:#obj_fils#:#Service fichiers +common#:#obj_fils_desc#:#Configuration des paramètres du service de fichiers. common#:#obj_fold#:#Dossier common#:#obj_fold_duplicate#:#Copier dossier common#:#obj_frm#:#Forum common#:#obj_frm_duplicate#:#Copier Forum common#:#obj_frma#:#Forum -common#:#obj_frma_desc#:#Paramètres généraux pour les Forums +common#:#obj_frma_desc#:#Paramètres généraux du forum common#:#obj_glo#:#Glossaire common#:#obj_glo_duplicate#:#Copier Glossaire common#:#obj_grp#:#Groupe common#:#obj_grp_duplicate#:#Copier Groupe common#:#obj_grpr#:#Group Reference common#:#obj_grps#:#Groupe -common#:#obj_grps_desc#:#Paramètres généraux pour les Groupes -common#:#obj_hlps#:#Système d'Aide -common#:#obj_hlps_desc#:#Paramétrage de l'aide en-ligne +common#:#obj_grps_desc#:#Paramètres généraux pour les groupes +common#:#obj_hlps#:#Système d'aide +common#:#obj_hlps_desc#:#Paramétrage de l'aide en ligne common#:#obj_htlm#:#Module HTML common#:#obj_htlm_duplicate#:#Copier Module HTML common#:#obj_iass#:#Évaluation individuelle @@ -4888,77 +4888,77 @@ common#:#obj_iass_duplicate#:#Copier l’évaluation individuelle common#:#obj_iass_select#:#-- Veuillez sélectionner une évaluation individuelle -- common#:#obj_itgr#:#Groupe d'Objets common#:#obj_ldap_desc#:#Configurer les paramètres généraux LDAP ici. -common#:#obj_lhts#:#Learning History###07 02 2020 new variable -common#:#obj_lhts_desc#:#Learning history settings###07 02 2020 new variable +common#:#obj_lhts#:#Parcours de formation +common#:#obj_lhts_desc#:#Paramétrage du parcours de formation common#:#obj_lm#:#Module ILIAS common#:#obj_lm_duplicate#:#Copier Module common#:#obj_lng#:#Langue common#:#obj_lngf#:#Langues common#:#obj_lngf_desc#:#Gestion des langues du système common#:#obj_logs#:#Connexion -common#:#obj_logs_desc#:#Paramètres de connexion généraux -common#:#obj_lrss#:#Ressource d'apprentissage -common#:#obj_lrss_desc#:#Configuration des modules pédagogiques +common#:#obj_logs_desc#:#Paramètres généraux de connexion +common#:#obj_lrss#:#Modules de formation +common#:#obj_lrss_desc#:#Configurer tous les types de modules de formation common#:#obj_lso#:#Learning Sequence common#:#obj_lso_duplicate#:#Copy Learning Sequence -common#:#obj_lsos#:#Learning Sequences###30 04 2021 new variable -common#:#obj_lsos_desc#:#General settings for Learning Sequences###30 04 2021 new variable -common#:#obj_lti#:#LTI Consumer###07 02 2020 new variable -common#:#obj_lti_duplicate#:#Copy LTI Consumer###31 03 2023 new variable +common#:#obj_lsos#:#Séquences de formation +common#:#obj_lsos_desc#:#Paramètres généraux pour les séquences de formation +common#:#obj_lti#:#LTI Consumer +common#:#obj_lti_duplicate#:#Copy LTI Consumer###31 10 2023 new variable common#:#obj_ltis#:#LTI -common#:#obj_ltis_desc#:#Interopérabilité des outils d’apprentissage (LTI) +common#:#obj_ltis_desc#:#Interopérabilité des outils de formation (LTI) common#:#obj_mail#:#Messagerie -common#:#obj_mail_desc#:#Configurez les paramètres de mail globaux ici. +common#:#obj_mail_desc#:#Configurez ici les paramètres globaux de la messagerie e-mail. common#:#obj_mcst#:#Mediacast common#:#obj_mcst_duplicate#:#Copier Mediacast common#:#obj_mcts#:#Médiacast -common#:#obj_mcts_desc#:#Paramètres gébéraux du mediacast. +common#:#obj_mcts_desc#:#Paramètres généraux du mediacast common#:#obj_mep#:#Galerie de Médias common#:#obj_mep_duplicate#:#Copier Galerie de Médias -common#:#obj_mme#:#Main Menu +common#:#obj_mme#:#Menu principal common#:#obj_mob#:#Média common#:#obj_mobs#:#Galerie multimédia -common#:#obj_mobs_desc#:#Paramètres pour les objets multimédias et les galeries multimédias +common#:#obj_mobs_desc#:#Paramètres pour les éléments multimédias et les galeries multimédias common#:#obj_not_found#:#Objet Non Trouvé -common#:#obj_nota#:#Notifications###31 03 2023 new variable -common#:#obj_nota_desc#:#Notifications Administration###31 03 2023 new variable -common#:#obj_nots#:#Notes###07 02 2020 new variable -common#:#obj_nots_desc#:#Notes settings###07 02 2020 new variable +common#:#obj_nota#:#Notifications###31 10 2023 new variable +common#:#obj_nota_desc#:#Notifications Administration###31 10 2023 new variable +common#:#obj_nots#:#Notes +common#:#obj_nots_desc#:#Paramètres des notes common#:#obj_nwss#:#Actualités et Flux RSS common#:#obj_nwss_desc#:#Paramétrage des actualités et flux RSS -common#:#obj_objf#:#Définitions d'Objets -common#:#obj_objf_desc#:#Gérer les types d'objets ILIAS et permissions associées (réservé aux experts !) +common#:#obj_objf#:#Définitions d'éléments +common#:#obj_objf_desc#:#Gérer les types d'éléments ILIAS et permissions associées (réservé aux experts !) common#:#obj_orgu#:#Unité Organisationnelle common#:#obj_orgu_description#:#Création et modification de l'unité organisationnelle common#:#obj_page#:#Page common#:#obj_pdfg#:#Création de PDF common#:#obj_pdfg_desc#:#Options pour la création de documents PDF -common#:#obj_peac#:#Accordion###30 04 2021 new variable -common#:#obj_peadl#:#Advanced List###30 04 2021 new variable -common#:#obj_peadt#:#Advanced Table###30 04 2021 new variable -common#:#obj_pecd#:#Code###30 04 2021 new variable -common#:#obj_pech#:#Consultation Hour###30 04 2021 new variable -common#:#obj_pecl#:#Column Layout###30 04 2021 new variable -common#:#obj_peclp#:#Clipboard###30 04 2021 new variable -common#:#obj_pecom#:#Competences###30 04 2021 new variable -common#:#obj_pecrs#:#Course###30 04 2021 new variable -common#:#obj_pecrt#:#Certificate###30 04 2021 new variable -common#:#obj_pecs#:#Content Snippet###30 04 2021 new variable -common#:#obj_pedt#:#Data Table###30 04 2021 new variable -common#:#obj_pefl#:#File List###30 04 2021 new variable -common#:#obj_peim#:#interactive Media###30 04 2021 new variable -common#:#obj_pelh#:#Learning History###30 04 2021 new variable -common#:#obj_pemed#:#Image/Audio/Video###30 04 2021 new variable -common#:#obj_pemp#:#Map###30 04 2021 new variable -common#:#obj_pepd#:#Personal Data###30 04 2021 new variable -common#:#obj_pepe#:#Plugin Element###30 04 2021 new variable -common#:#obj_pepl#:#Page List###30 04 2021 new variable -common#:#obj_peplh#:#Placeholder###30 04 2021 new variable -common#:#obj_pequ#:#Questions###30 04 2021 new variable -common#:#obj_perl#:#Ressource List###30 04 2021 new variable -common#:#obj_pesc#:#Section###30 04 2021 new variable -common#:#obj_petmp#:#Page Template###30 04 2021 new variable -common#:#obj_peusr#:#User###30 04 2021 new variable +common#:#obj_peac#:#Accordion +common#:#obj_peadl#:#Advanced List +common#:#obj_peadt#:#Advanced Table +common#:#obj_pecd#:#Code +common#:#obj_pech#:#Consultation Hour +common#:#obj_pecl#:#Column Layout +common#:#obj_peclp#:#Clipboard +common#:#obj_pecom#:#Competences +common#:#obj_pecrs#:#Course +common#:#obj_pecrt#:#Certificate +common#:#obj_pecs#:#Content Snippet +common#:#obj_pedt#:#Data Table +common#:#obj_pefl#:#File List +common#:#obj_peim#:#interactive Media +common#:#obj_pelh#:#Learning History +common#:#obj_pemed#:#Image/Audio/Video +common#:#obj_pemp#:#Map +common#:#obj_pepd#:#Personal Data +common#:#obj_pepe#:#Plugin Element +common#:#obj_pepl#:#Page List +common#:#obj_peplh#:#Placeholder +common#:#obj_pequ#:#Questions +common#:#obj_perl#:#Ressource List +common#:#obj_pesc#:#Section +common#:#obj_petmp#:#Page Template +common#:#obj_peusr#:#User common#:#obj_pg#:#Page common#:#obj_poll#:#Vote common#:#obj_poll_dupliate:#:#Copier Vote @@ -4966,27 +4966,27 @@ common#:#obj_poll_duplicate#:#Copier Vote common#:#obj_prg#:#Programme d’étude common#:#obj_prg_duplicate#:#Copier le programme d’étude common#:#obj_prg_select#:#-- Veuillez choisir un programme d'étude -- -common#:#obj_prgr#:#Link to Study Programme###07 02 2020 new variable -common#:#obj_prgrs#:#Links to Study Programmes###07 02 2020 new variable -common#:#obj_prgs#:#Programmes d'Etudes -common#:#obj_prgs_desc#:#Configuration des Programmes d'Etudes -common#:#obj_prss#:#Personal Resources###07 02 2020 new variable -common#:#obj_prss_desc#:#Personal resources settings###07 02 2020 new variable +common#:#obj_prgr#:#Link to Study Programme +common#:#obj_prgrs#:#Links to Study Programmes +common#:#obj_prgs#:#Programmes d'études +common#:#obj_prgs_desc#:#Configuration des programmes d'études +common#:#obj_prss#:#Ressources personnelles +common#:#obj_prss_desc#:#Paramètres des ressources personnelles common#:#obj_prtf#:#Portfolio common#:#obj_prtt#:#Modèle de Portfolio common#:#obj_prtt_duplicate#:#Copier Modèle de Portfolio -common#:#obj_ps#:#Confidentialité et Sécurité -common#:#obj_ps_desc#:#Paramétrage de confidentialité et de sécurité +common#:#obj_ps#:#Confidentialité et sécurité +common#:#obj_ps_desc#:#Configurez ici les paramètres globaux de confidentialité et de sécurité. common#:#obj_qpl#:#Banque de Questions (Test) common#:#obj_qpl_duplicate#:#Copier Banque de Questions (Test) common#:#obj_qpl_select#:#-- Veuillez sélectionner une banque de questions -- common#:#obj_rcat#:#Categorie ECS common#:#obj_rcrs#:#Cours lié -common#:#obj_recf#:#Objets Restaurés -common#:#obj_recf_desc#:#Contient les objets restaurés lors de la vérification du système -common#:#obj_rep#:#Repository###07 02 2020 new variable +common#:#obj_recf#:#Eléments restaurés +common#:#obj_recf_desc#:#Contient les éléments restaurés lors de la vérification du système. +common#:#obj_rep#:#Catalogue common#:#obj_reps#:#Catalogue -common#:#obj_reps_desc#:#Paramètres généraux pour le Catalogue +common#:#obj_reps_desc#:#Paramètres généraux du catalogue common#:#obj_rfil#:#Fichier ECS common#:#obj_rglo#:#Glossaire ECS common#:#obj_rgrp#:#Groupe ECS @@ -4997,7 +4997,7 @@ common#:#obj_rolf_desc#:#Gestion des rôles common#:#obj_rolf_local#:#Rôles Locaux common#:#obj_rolf_local_desc#:#Contient les rôles locaux de l'objet n° common#:#obj_rolt#:#Modèle de Rôle -common#:#obj_root#:#Catalogue - Racine +common#:#obj_root#:#Catalogue - Page d'accueil common#:#obj_rtst#:#Test ECS common#:#obj_rwik#:#Wiki ECS common#:#obj_sahs#:#Module SCORM/AICC @@ -5008,53 +5008,53 @@ common#:#obj_seas#:#Recherche common#:#obj_seas_desc#:#Paramétrage du moteur de recherche common#:#obj_sess#:#Session common#:#obj_sess_duplicate#:#Copier Session -common#:#obj_skmg#:#Gestion des Compétences +common#:#obj_skmg#:#Gestion des compétences common#:#obj_skmg_desc#:#Gestion des compétences et catégories de compétences common#:#obj_spl#:#Banque de Questions (Enquête) common#:#obj_spl_select#:#-- Veuillez sélectionner une Banque de Questions d'Enquête -- common#:#obj_st#:#Chapitre common#:#obj_sty#:#Style -common#:#obj_stys#:#Styles et Mises en Page -common#:#obj_stys_desc#:#Gestion des styles système, styles de contenu et mises en page -common#:#obj_svy#:#Enquête +common#:#obj_stys#:#Style et mise en page +common#:#obj_stys_desc#:#Paramètres pour l'apparence de l'installation et pour les styles de certains éléments de contenu +common#:#obj_svy#:#Sondage common#:#obj_svy_duplicate#:#Copier Enquête -common#:#obj_svyf#:#Enquête -common#:#obj_svyf_desc#:#Paramètres système pour l'enquête -common#:#obj_sysc#:#Vérification du Système -common#:#obj_sysc_desc#:#Vérification du Système et Outils de Réparation -common#:#obj_tags#:#Marquage par Mots-Clés -common#:#obj_tags_desc#:#Paramètres pour la fonction tagging. -common#:#obj_tala#:#Talk Templates###31 03 2023 new variable -common#:#obj_tala_desc#:#Talk Templates###31 03 2023 new variable -common#:#obj_tals#:#Employee Talk Series###31 03 2023 new variable -common#:#obj_talt#:#Talk Template###31 03 2023 new variable -common#:#obj_task#:#Task###07 02 2020 new variable +common#:#obj_svyf#:#Sondage +common#:#obj_svyf_desc#:#Paramètres système pour le sondage +common#:#obj_sysc#:#Vérification du système +common#:#obj_sysc_desc#:#Vérification du système et outils de réparation +common#:#obj_tags#:#Tagging +common#:#obj_tags_desc#:#Paramètres pour la fonction tagging +common#:#obj_tala#:#Talk Templates###31 10 2023 new variable +common#:#obj_tala_desc#:#Talk Templates###31 10 2023 new variable +common#:#obj_tals#:#Employee Talk Series###31 10 2023 new variable +common#:#obj_talt#:#Talk Template###31 10 2023 new variable +common#:#obj_task#:#Task common#:#obj_tax#:#Taxinomie common#:#obj_taxf#:#Taxinomies common#:#obj_tool_setting_calendar#:#Afficher l'Agenda -common#:#obj_tool_setting_calendar_active#:#Calendar###30 04 2021 new variable -common#:#obj_tool_setting_calendar_active_info#:#A calendar is available.###30 04 2021 new variable +common#:#obj_tool_setting_calendar_active#:#Calendar +common#:#obj_tool_setting_calendar_active_info#:#A calendar is available. common#:#obj_tool_setting_calendar_info#:#Le bloc "Agenda" sera affiché dans l'onglet "Contenu". common#:#obj_tool_setting_custom_metadata#:#Métadonnées Personnalisées common#:#obj_tool_setting_custom_metadata_info#:#Si activé, les métadonnées peuvent être configurées. common#:#obj_tool_setting_news#:#Afficher les Actualités common#:#obj_tool_setting_news_info#:#Le bloc "Actualités" sera affiché dans l'onglet "Contenu". -common#:#obj_tos#:#Conditions d'Utilisation -common#:#obj_tos_desc#:#Paramètres des Conditions d'Utilisation -common#:#obj_trac#:#Statistiques et Progression -common#:#obj_trac_desc#:#Paramétrage et vue d'ensemble des statistiques et du suivi de progression +common#:#obj_tos#:#Conditions d'utilisation +common#:#obj_tos_desc#:#Paramètres des conditions d'utilisation +common#:#obj_trac#:#Statistiques et progression de la formation +common#:#obj_trac_desc#:#Paramétrage et vue d'ensemble des statistiques et du suivi de progression de la formation common#:#obj_tst#:#Test common#:#obj_tst_duplicate#:#Copier Test common#:#obj_tstv#:#Certificat de Test -common#:#obj_type#:#Type d'Objet +common#:#obj_type#:#Type d'élément common#:#obj_user#:#Utilisateur common#:#obj_usr#:#Utilisateur -common#:#obj_usrf#:#Comptes Utilisateurs +common#:#obj_usrf#:#Gestion des utilisateurs common#:#obj_usrf_desc#:#Gestion des comptes utilisateurs -common#:#obj_wbdv#:#WebDAV###30 04 2021 new variable -common#:#obj_wbdv_desc#:#Configuration of WebDAV Settings.###30 04 2021 new variable +common#:#obj_wbdv#:#WebDAV +common#:#obj_wbdv_desc#:#Configuration des paramètres WebDAV common#:#obj_wbrs#:#Lien Web -common#:#obj_wbrs_desc#:#Paramètres généraux pour les Liens Web +common#:#obj_wbrs_desc#:#Paramètres généraux pour les liens Web common#:#obj_webr#:#Lien Web common#:#obj_webr_duplicate#:#Copier Liste de Liens Web common#:#obj_wfe#:#Moteur de flux de travail @@ -5063,7 +5063,7 @@ common#:#obj_wiki#:#Wiki common#:#obj_wiki_duplicate#:#Copier Wiki common#:#obj_wiks#:#Wiki common#:#obj_wiks_desc#:#Paramètres généraux pour les Wikis -common#:#object#:#Objet +common#:#object#:#Elément common#:#object_added#:#Objet ajouté common#:#object_copy_in_progress#:#Copie en cours. common#:#object_duplicated#:#Objet dupliqué @@ -5076,14 +5076,14 @@ common#:#objs_blog#:#Blogs common#:#objs_book#:#Outil de réservation common#:#objs_cat#:#Catégories common#:#objs_catr#:#Catégorie référente -common#:#objs_chtr#:#Salles de Chat +common#:#objs_chtr#:#Salle de Chat common#:#objs_cld#:#Objets Cloud -common#:#objs_cmix#:#Objects xAPI/cmi5###07 02 2020 new variable -common#:#objs_copa#:#Content Pages +common#:#objs_cmix#:#Objects xAPI/cmi5 +common#:#objs_copa#:#Pages de contenu common#:#objs_crs#:#Cours common#:#objs_crsr#:#Cours référents -common#:#objs_dcl#:#Collections de Données -common#:#objs_etal#:#Employee Talks###31 03 2023 new variable +common#:#objs_dcl#:#Collections de données +common#:#objs_etal#:#Employee Talks###31 10 2023 new variable common#:#objs_exc#:#Exercices common#:#objs_file#:#Fichiers common#:#objs_fold#:#Dossiers @@ -5093,21 +5093,21 @@ common#:#objs_grp#:#Groupes common#:#objs_grpr#:#Group References common#:#objs_htlm#:#Modules HTML common#:#objs_iass#:#Évaluations individuelles -common#:#objs_itgr#:#Groupes d'Objets +common#:#objs_itgr#:#Groupes d'objets common#:#objs_lm#:#Modules ILIAS -common#:#objs_lres#:#Ressources Pédagogiques -common#:#objs_lso#:#Learning Sequences -common#:#objs_lti#:#LTI Consumers###07 02 2020 new variable +common#:#objs_lres#:#Ressources pédagogiques +common#:#objs_lso#:#Séquences de formation +common#:#objs_lti#:#LTI Consumers common#:#objs_mail#:#E-mails common#:#objs_mcst#:#Mediacasts -common#:#objs_mep#:#Galeries de Médias -common#:#objs_orgu#:#Unité Organisationnelle +common#:#objs_mep#:#Galeries de médias +common#:#objs_orgu#:#Unité organisationnelle common#:#objs_poll#:#Votes -common#:#objs_prg#:#Programmes d'Etudes -common#:#objs_prgr#:#Links to Study Programmes###30 04 2021 new variable +common#:#objs_prg#:#Programmes d'études +common#:#objs_prgr#:#Links to Study Programmes common#:#objs_prtf#:#Portfolios common#:#objs_prtt#:#Modèles de Portfolio -common#:#objs_qpl#:#Banques de Questions (Test) +common#:#objs_qpl#:#Banques de questions (Test) common#:#objs_qst#:#Questions common#:#objs_rcat#:#Catégories ECS common#:#objs_rcrs#:#Cours liés @@ -5120,26 +5120,26 @@ common#:#objs_rtst#:#Tests ECS common#:#objs_rwik#:#Wikis ECS common#:#objs_sahs#:#Modules SCORM/AICC common#:#objs_sess#:#Sessions -common#:#objs_spl#:#Banques de Questions (Enquête) +common#:#objs_spl#:#Banques de questions (Enquête) common#:#objs_st#:#Chapitres -common#:#objs_svy#:#Enquête -common#:#objs_tala#:#Talk Templates###31 03 2023 new variable -common#:#objs_talt#:#Talk Templates###31 03 2023 new variable +common#:#objs_svy#:#Enquêtes +common#:#objs_tala#:#Talk Templates###31 10 2023 new variable +common#:#objs_talt#:#Talk Templates###31 10 2023 new variable common#:#objs_tst#:#Tests common#:#objs_webr#:#Liens Web common#:#objs_wiki#:#Wikis -common#:#of#:#Sur -common#:#offline#:#Hors-Ligne +common#:#of#:#de +common#:#offline#:#Hors-ligne common#:#offline_mode#:#Mode Déconnecté common#:#ok#:#OK common#:#old#:#Ancien common#:#omit#:#Omettre common#:#omit_all#:#Omettre tout common#:#on_waiting_list#:#Vous êtes sur la liste d'attente -common#:#online#:#En-Ligne +common#:#online#:#En ligne common#:#online_time#:#Temps en-ligne (JJ:HH:MM:SS) -common#:#only_active#:#Only Active###07 02 2020 new variable -common#:#only_inactive#:#Only Inactive###07 02 2020 new variable +common#:#only_active#:#Only Active +common#:#only_inactive#:#Only Inactive common#:#open#:#Open common#:#operation#:#Opération common#:#optimize#:#Optimiser @@ -5165,17 +5165,17 @@ common#:#page_count#:#Nombre de pages common#:#page_layout#:#Modèle de page common#:#page_layouts#:#Modèles de page common#:#pages#:#Pages -common#:#pagination_label_x_of_y#:#Page %1$d of %2$d###07 02 2020 new variable +common#:#pagination_label_x_of_y#:#Page %1$d of %2$d common#:#parameter#:#Paramètre common#:#parse#:#Analyser -common#:#participate#:#Subscribe###07 02 2020 new variable +common#:#participate#:#Subscribe common#:#passed#:#Passé common#:#passwd#:#Mot de passe common#:#passwd_generation#:#Génération de Mot de Passe common#:#passwd_invalid#:#Le nouveau mot de passe n'est pas valide ! Veuillez en choisir un autre. common#:#passwd_not_match#:#Vos saisies pour le nouveau mot de passe ne correspondent pas ! Veuillez saisir votre nouveau mot de passe à nouveau. common#:#passwd_wrong#:#Le mot de passe que vous avez saisi est erroné. -common#:#password#:#Mot de Passe +common#:#password#:#Mot de passe common#:#password_allow_chars#:#Caractères autorisés : %s common#:#password_assistance_info#:#Lorsque l'assistance pour les mots de passe est activée, un lien avec le texte "Mot de passe oublié ?" est affiché dans la page de connexion d'ILIAS. Les utilisateurs peuvent utiliser ce lien pour générer un nouveau mot de passe, sans assistance d'un administrateur. common#:#password_change_on_first_login_demand#:#Votre mot de passe intial doit être modifié avant que vous puissiez utiliser les services ILIAS. @@ -5209,23 +5209,23 @@ common#:#pdfg_read#:#L’utilisateur a un accès de lecture pour la création de common#:#pdfg_visible#:#La création de PDF est visible common#:#pdfg_write#:#L’utilisateur peut éditer les paramètres de la création de PDF common#:#perm_settings#:#Permissions -common#:#perma_link#:#Lien Permanent +common#:#perma_link#:#Lien permanent common#:#permission#:#Permission common#:#permission_denied#:#Permission refusée common#:#permission_settings#:#Réglage des Permissions common#:#person_title#:#Titre -common#:#personal_data#:#Données Personnelles -common#:#personal_picture#:#Image Personnelle -common#:#personal_profile#:#Profil et Données Personnelles -common#:#personal_resources#:#Personal Resources###07 02 2020 new variable -common#:#personal_settings#:#Paramètres Personnels +common#:#personal_data#:#Données personnelles +common#:#personal_picture#:#Image personnelle +common#:#personal_profile#:#Profil et données personnelles +common#:#personal_resources#:#Ressources personnelles +common#:#personal_settings#:#Paramètres personnels common#:#persons#:#Personnes common#:#pg_add#:#Ajouter Page common#:#pg_new#:#Nouvelle page common#:#phone#:#Téléphone common#:#phone_home#:#PTT -common#:#phone_mobile#:#Téléphone, Mobile -common#:#phone_office#:#PNIA +common#:#phone_mobile#:#Téléphone mobile +common#:#phone_office#:#Téléphone travail common#:#phrase#:#Expression common#:#please_choose#:#-- Sélectionnez -- common#:#please_enter_target#:#Veuillez saisir une cible @@ -5253,15 +5253,15 @@ common#:#predefined_template#:#Modèle de rôle prédéfini common#:#preferences#:#Préférences Utilisateur-défini common#:#presentation_table_more#:#more common#:#preview#:#Aperçu -common#:#preview_caption#:#Preview %sof %s###31 03 2023 new variable +common#:#preview_caption#:#Preview %sof %s common#:#preview_create#:#Créer Aperçu common#:#preview_delete#:#Supprimer Aperçu common#:#preview_learner_info#:#Si actif, les administrateurs de cours et groupe auront la possibilité de visualiser la vue de l'apprenant. common#:#preview_loading#:#Chargement de l'aperçu... common#:#preview_none#:#Aperçu (non encore créé) -common#:#preview_renderers#:#Preview Renderers###30 04 2021 new variable +common#:#preview_renderers#:#Preview Renderers common#:#preview_settings#:#Aperçu du Fichier -common#:#preview_show#:#Afficher l'Aperçu +common#:#preview_show#:#Afficher l'aperçu common#:#preview_status_creating#:#L'aperçu est en cours de création. Veuillez patienter. common#:#preview_status_deleting#:#L'aperçu est en cours de suppression... common#:#preview_status_failed#:#Création de l'aperçu échouée @@ -5270,13 +5270,13 @@ common#:#preview_status_pending#:#L'aperçu n'a pas encore été créé. Veuille common#:#previous#:#Précédent common#:#prg_copy_threads_info#:#Veuillez choisir quels éléments du programme d'études doivent être copiés, liés ou même omis. common#:#prg_wizard_page#:#Copier le programme d’étude (étape 2/2) -common#:#prgr_add#:#Add Study Programme Link###31 03 2023 new variable -common#:#prgr_edit_info#:#Please choose one Study Programme for creating a new link.###09 03 2022 new variable -common#:#prgr_new#:#Create Study Programme Link###09 03 2022 new variable -common#:#prgr_settings#:#Settings of Study Programme Link###31 03 2023 new variable +common#:#prgr_add#:#Add Study Programme Link###31 10 2023 new variable +common#:#prgr_edit_info#:#Please choose one Study Programme for creating a new link. +common#:#prgr_new#:#Create Study Programme Link +common#:#prgr_settings#:#Settings of Study Programme Link###31 10 2023 new variable common#:#print#:#Imprimer common#:#print_view#:#Vue Imprimable -common#:#private_notes#:#Notes Personnelles +common#:#private_notes#:#Notes personnelles common#:#pro#:#Pour common#:#proceed#:#Confirmer common#:#profile#:#Profil @@ -5303,11 +5303,11 @@ common#:#ps_password_must_not_contain_loginame_info#:#Lorsque activé, le mot de common#:#ps_password_uppercase_chars_num#:#Lettres Majuscule common#:#ps_password_uppercase_chars_num_info#:#Veuillez entrer le nombre de lettres majuscules que le mot de passe doit contenir. 0 désactiver cette contrainte. common#:#pub_section#:#Espace Public -common#:#pub_section_info#:#Si actif, des morceaux du système (e.g. repository, profil utilisateur) peuvent être disponibles sur Internet sans authentification. Les permissions du rôle "Anonymous" controleront l'accès aux ressources du repository. +common#:#pub_section_info#:#Si actif, des morceaux du système (e.g. catalogue, profil utilisateur) peuvent être disponibles sur Internet sans authentification. Les permissions du rôle "Anonymous" controleront l'accès aux ressources du catalogue. common#:#public#:#public common#:#public_notes#:#Notes Publiques common#:#public_profile#:#Profil -common#:#public_room#:#Discussion publique +common#:#public_room#:#Chat public common#:#purpose#:#Type common#:#qpl#:#Banque de Questions common#:#qpl_add#:#Ajouter Banque de Questions (Test) @@ -5327,9 +5327,9 @@ common#:#reference_deleted#:#Destination non disponible common#:#reference_of#:#Référence de : common#:#referral_comment#:#Comment avez-vous entendu parler d'ILIAS ? common#:#refresh#:#Actualiser -common#:#refresh_languages#:#Actualiser Toutes les Langues +common#:#refresh_languages#:#Actualiser toutes les langues common#:#refuse#:#Refuser -common#:#refuse_tos_acceptance#:#Refuse to Accept Terms of Service###09 03 2022 new variable +common#:#refuse_tos_acceptance#:#Refuse to Accept Terms of Service common#:#reg_account_confirmation_successful#:#Votre compte utilisateur a été activé. common#:#reg_goto_parent_membership_info#:#Seuls les membres peuvent accéder à cet objet. common#:#reg_mail_body_2_confirmation#:#Le lien sera bon uniquement pour %s. Après, vous devrez recommencer depuis le début. @@ -5343,7 +5343,7 @@ common#:#reg_mail_subject#:#MediaEcole - Vos données d'accès common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Votre lien de confirmation common#:#reg_passwd_via_mail#:#Votre mot de passe sera envoyé à l'adresse email précisée ci-dessous. common#:#register#:#Créer un Compte -common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable +common#:#register_notification#:#"%s" has applied for session "%s". common#:#registered_since#:#Inscrit depuis common#:#registered_user#:#Utilisateur inscrit common#:#registered_users#:#Utilisateurs inscrits @@ -5357,28 +5357,28 @@ common#:#rename_file#:#Renommer Fichier common#:#renderer_supported_file_types#:#Types de Fichiers Supportés common#:#renderer_supported_repo_types#:#Objets ILIAS Supportés common#:#renderer_type_builtin#:#Préfabriqué -common#:#rep_main_page#:#Page Principale +common#:#rep_main_page#:#Catalogue - Page d'accueil common#:#repeat_scan#:#Nouvelle recherche de virus... common#:#repeat_scan_failed#:#Echec de la nouvelle recherche. common#:#repeat_scan_succeded#:#Nouvelle recherche réussie. common#:#replace_file#:#Remplacer Fichier common#:#reply#:#Répondre -common#:#report_accessibility_issue#:#Report Accessibility Issue###07 02 2020 new variable -common#:#report_accessibility_link#:#Reported Link:###07 02 2020 new variable -common#:#report_accessibility_link_mailto#:#Reported%20Link:###29 06 2022 new variable +common#:#report_accessibility_issue#:#Signaler un problème d'accessibilité +common#:#report_accessibility_link#:#Reported Link: +common#:#report_accessibility_link_mailto#:#Reported%20Link: common#:#repository#:#Catalogue -common#:#repository_admin#:#Corbeille et Permissions du Catalogue -common#:#repository_admin_desc#:#Définit les permissions des objets du catalogue, restaure et détruit les objets de la corbeille +common#:#repository_admin#:#Corbeille et permissions du catalogue +common#:#repository_admin_desc#:#Définit les permissions des éléments du catalogue, restaure et détruit les éléments de la corbeille système common#:#require_email#:#E-mail requis common#:#require_gender#:#Sexe requis common#:#require_hobby#:#Hobby requis common#:#require_matriculation#:#Numéro d'immatriculation requis common#:#require_referral_comment#:#Commentaire du référent requis -common#:#required_field#:#Zone obligatoire +common#:#required_field#:#Champ obligatoire common#:#res_links#:#Liens dans le Catalogue common#:#res_links_short#:#Liens common#:#reset#:#Réinitialiser -common#:#reset_filter#:#Réinitialiser le Filtre +common#:#reset_filter#:#Réinitialiser le filtre common#:#resources#:#Ressources common#:#right#:#Droite common#:#rights#:#Droits @@ -5427,15 +5427,15 @@ common#:#sahs_insert_chap_from_clip#:#Coller Chapitres depuis le presse-papier common#:#sahs_insert_page_from_clip#:#Coller Pages depuis le presse-papier common#:#sahs_insert_sco_from_clip#:#Coller SCOs depuis le presse-papier common#:#salutation#:#Salutation -common#:#salutation_f#:#Mme/Mlle -common#:#salutation_m#:#M. -common#:#salutation_n#:#No salutation desired +common#:#salutation_f#:#Madame +common#:#salutation_m#:#Monsieur +common#:#salutation_n#:#Autre common#:#saml_log_in#:#Connexion directe common#:#saml_login_form_info_txt#:#Vous pouvez vous connecter en utilisant le bouton «Connexion directe» sans avoir à entrer votre nom d’utilisateur ou mot de passe. common#:#saml_login_form_txt#:#Connexion à ILIAS via SAML common#:#save#:#Enregistrer common#:#save_and_back#:#Enregistrer et Retourner -common#:#save_message#:#Enregistrer Brouillon +common#:#save_message#:#Enregistrer un brouillon common#:#save_params_for_cron#:#Enregistrer paramètre pour la tà¢che Cron common#:#save_refresh#:#Enregistrer et Actualiser common#:#save_return#:#Enregistrer et Retourner @@ -5457,16 +5457,16 @@ common#:#scorm_without_session#:#SCORM 2004: autoriser l'enregistrement des donn common#:#scorm_without_session_info#:#Cela garantit l'enregistrement des données SCORM même si la session ILIAS a expiré. common#:#search#:#Rechercher common#:#search_active#:#Inclure utilisateurs actifs -common#:#search_at_current_position#:#A la Position Courante +common#:#search_at_current_position#:#A la position actuelle common#:#search_engine#:#Moteurs de Recherche common#:#search_for#:#Rechercher -common#:#search_globally#:#Globalement +common#:#search_globally#:#Dans tout le catalogue common#:#search_in#:#Rechercher dans common#:#search_inactive#:#Inclure utilisateurs inactifs common#:#search_new#:#Nouvelle Recherche common#:#search_result#:#Résultat de Recherche -common#:#search_results#:#Résultats de Recherche -common#:#search_user#:#Rechercher Utilisateurs +common#:#search_results#:#Résultats de recherche +common#:#search_user#:#Rechercher des utilisateurs common#:#seas_max_hits#:#Nombre maximum de résultats common#:#seas_max_hits_info#:#Définir un nombre maximum de résultats de recherche. common#:#seas_settings#:#Paramètres de recherche @@ -5475,14 +5475,14 @@ common#:#second_email#:#Deuxième e-mail common#:#seconds#:#Seconde(s) common#:#sel_country#:#Pays common#:#select#:#Sélectionner -common#:#select_all#:#Tout Sélectionner +common#:#select_all#:#Tout sélectionner common#:#select_at_least_one_object#:#Veuillez choisir au moins un objet. -common#:#select_file#:#Sélectionner Fichier +common#:#select_file#:#Sélectionner un fichier common#:#select_files_from_computer#:#Sélectionner les fichiers sur votre ordinateur common#:#select_max_one_item#:#Veuillez saisir un seul objet common#:#select_object_to_link#:#Veuillez sélectionner l'objet que vous voulez lier common#:#select_one#:#Veuillez sélectionner... -common#:#select_question_pool_info#:#As long as the import file contains questions, these questions will be imported to the selected questionpool as well.###07 02 2020 new variable +common#:#select_question_pool_info#:#As long as the import file contains questions, these questions will be imported to the selected questionpool as well. common#:#select_questionpool#:#Insérer des questions dans common#:#selected#:#Sélectionné common#:#selected_files#:#Fichiers sélectionnés @@ -5490,7 +5490,7 @@ common#:#selected_items#:#Objets Personnels common#:#selected_items_back#:#Retour common#:#selected_languages_updated#:#Les langages sélectionnés ont été mis à jour (si installé) : common#:#send#:#Envoyer -common#:#send_mail#:#Envoyer Message +common#:#send_mail#:#Envoyer le message common#:#sender#:#Expéditeur common#:#sent#:#Envoyé common#:#sequence#:#Séquence @@ -5505,9 +5505,9 @@ common#:#sess_load_dependent_session_handling#:#Gestion Dynamique des Sessions common#:#sess_mode#:#Mode de Session common#:#session_config#:#Paramètres Session common#:#session_config_maintenance_disabled#:#Maintenance par le client non autorisée -common#:#session_mail_subject_deletion#:#Deregistration of user "%s" from session "%s"###07 02 2020 new variable -common#:#session_mail_subject_entered#:#Joining of user "%s" in session "%s"###07 02 2020 new variable -common#:#session_mail_subject_registered#:#Registration of user "%s" for session "%s"###07 02 2020 new variable +common#:#session_mail_subject_deletion#:#Deregistration of user "%s" from session "%s" +common#:#session_mail_subject_entered#:#Joining of user "%s" in session "%s" +common#:#session_mail_subject_registered#:#Registration of user "%s" for session "%s" common#:#session_max_count#:#Nombre max. de sessions actives common#:#session_max_count_info#:#Définit le nombre maximal de sessions qui peuvent être créées simultanément. «0» désactive la fonction. common#:#session_max_idle#:#Période max. d'inactivité (en minutes) @@ -5516,11 +5516,11 @@ common#:#session_max_idle_after_first_request_info#:#Toutes les sessions connect common#:#session_max_idle_info#:#Définit le temps maximum d'inactivité avant que la session d'un utilisateur n'expire. common#:#session_min_idle#:#Période min. d'inactivité (en minutes) common#:#session_min_idle_info#:#Au delà de cette période, la session est susceptible d'être interrompue si une autre session utilisateur doit être ouverte et que le nombre maximal de sessions a été atteint. -common#:#session_reminder#:#Rappel-session +common#:#session_reminder#:#Rappel de session common#:#session_reminder_alert#:#Votre session expire dans 5 minutes. Veuillez choisir OK pour poursuivre votre session -common#:#session_reminder_info#:#Si actif, vous recevez un rappel avant que votre session expire. -common#:#session_reminder_lead_time#:#Délai de livraison -common#:#session_reminder_lead_time_info#:#Veuillez spécifier, pendant combien de secondes, avant expiration de la session, vous désirez afficher un warning.La valeur actuelle pour une session utilisateur est de %s. +common#:#session_reminder_info#:#Si cette option est activée, vous recevrez un rappel avant l'expiration de la session en ligne de votre navigateur. +common#:#session_reminder_lead_time#:#Délai d'exécution +common#:#session_reminder_lead_time_info#:#Veuillez indiquer le délai d'exécution du rappel de session en minutes. Le rappel affiche un avertissement lorsqu'il ne reste plus que ce laps de temps avant l'expiration de la session. La valeur recommandée est 5 (minutes)La durée actuelle d'une session utilisateur est %s. common#:#session_reminder_session_duration#:#(Durée de Session : %s). common#:#set#:#Enregistrer common#:#setSystemLanguage#:#Définir comme Langue du Système @@ -5532,7 +5532,7 @@ common#:#set_style_does_not_exist#:#Le style de système sélectionné n’exist common#:#settings#:#Paramètres common#:#settings_for_all_members#:#Notification activée par défaut pour tous les membres de cours/groupes common#:#settings_per_users#:#Paramètres par Membre de Cours/Groupe -common#:#settings_presentation_header#:#Presentation###07 02 2020 new variable +common#:#settings_presentation_header#:#Presentation common#:#settings_saved#:#Paramètres enregistrés common#:#shib#:#Shibboleth common#:#shib_active#:#Activer le support Shibboleth @@ -5575,22 +5575,22 @@ common#:#short_inst_name#:#Titre Court common#:#short_inst_name_info#:#Ce titre apparaît dans la barre de titre du navigateur. Si aucune valeur n'est entrée, 'ILIAS' sera utilisé. common#:#show#:#Afficher common#:#show_all_details#:#Montrer les détails -common#:#show_content#:#Show Content###31 03 2023 new variable +common#:#show_content#:#Show Content common#:#show_details#:#Afficher Détails -common#:#show_filter#:#Afficher le Filtre +common#:#show_filter#:#Afficher le filtre common#:#show_hidden_sections#:#Afficher plus d'informations » common#:#show_list#:#Afficher Liste common#:#show_members#:#Afficher Membres -common#:#show_more#:#Show More###30 04 2021 new variable +common#:#show_more#:#Afficher plus common#:#show_owner#:#Afficher Propriétaire common#:#show_users_online#:#Afficher les utilisateurs actifs -common#:#show_who_is_online#:#Show who is online###30 04 2021 new variable +common#:#show_who_is_online#:#Afficher qui est en ligne common#:#side_frame#:#Fenêtre latérale common#:#signature#:#Signature common#:#simultaneous_login_detected#:#Votre accès a été refusé car il existe une autre connexion avec le même compte. common#:#size#:#Taille -common#:#skills#:#Mes Compétences -common#:#skin_style#:#Thème / Style par Défaut +common#:#skills#:#Mes compétences +common#:#skin_style#:#Thème / Style par défaut common#:#smtp#:#SMTP common#:#soap_connect_timeout#:#Délai de Connexion common#:#soap_connect_timeout_info#:#Temps maximum en secondes à partir duquel les tentatives de connexion au service Web SOAP sont interrompues. @@ -5598,11 +5598,11 @@ common#:#soap_user_administration#:#Administration via SOAP common#:#soap_user_administration_desc#:#Si active, tous les comptes utilisateurs peuvent être administrés par un client SOAP externe. common#:#soap_wsdl_path#:#Chemin WSDL common#:#soap_wsdl_path_info#:#Entrer le chemin du fichier wsdl qui sera utilisé par le Webservice. Si ce champs est vide, le chemin par defaut est :%s -common#:#sort_ascending#:#Sort Ascending###30 04 2021 new variable -common#:#sort_ascending_long#:#Change Sort Direction to Ascending###17 05 2023 new variable +common#:#sort_ascending#:#Sort Ascending +common#:#sort_ascending_long#:#Change Sort Direction to Ascending common#:#sort_by_this_column#:#Trier selon cette colonne -common#:#sort_descending#:#Sort Descending###30 04 2021 new variable -common#:#sort_descending_long#:#Change Sort Direction to Descending###17 05 2023 new variable +common#:#sort_descending#:#Sort Descending +common#:#sort_descending_long#:#Changer l'ordre de tri en décroissant common#:#sort_inherit_prefix#:#Défaut common#:#sorting_asc#:#Croissant common#:#sorting_creation_header#:#Trier par Date de Création @@ -5649,26 +5649,26 @@ common#:#svy#:#Enquête common#:#svy_add#:#Ajouter Enquête common#:#svy_finished#:#Vous avez terminé le questionnaire common#:#svy_new#:#Nouvelle enquête -common#:#svy_not_finished#:#Ce questionnaire n'est pas encore terminé -common#:#svy_not_started#:#Vous n'avez pas participé à cette enquête +common#:#svy_not_finished#:#Ce sondage n'est pas encore terminé +common#:#svy_not_started#:#Vous n'avez pas participé à ce sondage common#:#svy_run#:#Commencer common#:#svy_warning_survey_not_complete#:#Le questionnaire n'est pas terminé -common#:#switch_language#:#Switch Language###30 04 2021 new variable +common#:#switch_language#:#Switch Language common#:#system#:#Système common#:#system_check#:#Vérification du Système common#:#system_information#:#Informations système -common#:#system_language#:#Langue Système +common#:#system_language#:#Langue du système common#:#system_styles#:#Styles Système common#:#systemcheck_cron#:#Process System Check par tà¢che Cron common#:#systemcheck_cronform#:#Activation du système de contrôle dans la tà¢che Cron common#:#table_mail_import#:#Importer à partir de mails d'ILIAS 2 common#:#tabs#:#Onglets -common#:#tagging_my_tags#:#Mes Mots-Clés -common#:#tags#:#Tags###30 04 2021 new variable +common#:#tagging_my_tags#:#Mes mots-clés +common#:#tags#:#Tags common#:#take_over_structure#:#Adopter la Structure common#:#take_over_structure_info#:#Si cochée, les dossiers contenus dans le fichier ZIP seront convertis en catégories ou en dossiers si l'importation du ZIP est faite dans un groupe ou un cours. -common#:#tals_etal#:#Talk###31 03 2023 new variable -common#:#talt_etal#:#Talk###31 03 2023 new variable +common#:#tals_etal#:#Talk###31 10 2023 new variable +common#:#talt_etal#:#Talk###31 10 2023 new variable common#:#target#:#Cible common#:#tax#:#Taxinomie common#:#tax_add#:#Ajouter Taxinomie @@ -5697,11 +5697,11 @@ common#:#today#:#Aujourd'hui common#:#toggleGlobalDefault#:#Modifier la valeur globale par défaut common#:#toggleGlobalFixed#:#Modifier la valeur fixée par défaut common#:#toggle_dropdown#:#Passer à la liste déroulante -common#:#toggle_off#:#OFF### Don't translate this label to prevent rendering problems of the related Toggle Button! -common#:#toggle_on#:#ON### Don't translate this label to prevent rendering problems of the related Toggle Button! +common#:#toggle_off#:#OFF +common#:#toggle_on#:#ON common#:#tomorrow#:#Demain -common#:#toolbar_more_actions#:#More Actions###31 03 2023 new variable -common#:#tools#:#Tools###30 04 2021 new variable +common#:#toolbar_more_actions#:#More Actions###31 10 2023 new variable +common#:#tools#:#Tools common#:#top_of_page#:#Haut de page common#:#total#:#Total common#:#tracking_settings#:#Configuration de la Progression @@ -5752,8 +5752,8 @@ common#:#unchecked#:#Non coché common#:#uninstall#:#Désinstaller common#:#uninstalled#:#désinstallé. common#:#unknown#:#INCONNU -common#:#unparticipate#:#Unsubscribe###07 02 2020 new variable -common#:#unread#:#Non Lu +common#:#unparticipate#:#Unsubscribe +common#:#unread#:#non lu common#:#unzip#:#Décompresser common#:#up#:#En Haut common#:#update#:#Editer @@ -5780,8 +5780,8 @@ common#:#user#:#Utilisateur common#:#user_activated#:#L'utilisateur a été approuvé common#:#user_added#:#Utilisateur ajouté common#:#user_assignment#:#Assignation d'Utilisateur -common#:#user_avatar#:#User Avatar###30 04 2021 new variable -common#:#user_avatar_of#:#User Avatar of###30 04 2021 new variable +common#:#user_avatar#:#User Avatar +common#:#user_avatar_of#:#User Avatar of common#:#user_cant_receive_mail#:#L'utilisateur n'est pas autorisé à utiliser l'envoi de mail système common#:#user_comment#:#Commentaire de l'utilisateur common#:#user_deactivated#:#L'utilisateur a été désapprouvé @@ -5796,9 +5796,9 @@ common#:#user_import_failed#:#Echec d'importation utilisateur common#:#user_imported#:#Importation utilisateur terminée. common#:#user_imported_with_warnings#:#Importation d'utilisateurs terminée avec des avertissements common#:#user_language#:#Langue Utilisateur -common#:#user_never_logged_in#:#Delete user accounts without login###07 02 2020 new variable -common#:#user_never_logged_in_info#:#All user accounts without login at all be deleted.###07 02 2020 new variable -common#:#user_never_logged_in_info_threshold_err_num#:#Only positive non decimal numbers are accepted.###07 02 2020 new variable +common#:#user_never_logged_in#:#Delete user accounts without login +common#:#user_never_logged_in_info#:#All user accounts without login at all be deleted. +common#:#user_never_logged_in_info_threshold_err_num#:#Only positive non decimal numbers are accepted. common#:#user_new_account_mail#:#Mail de Nouveau Compte common#:#user_new_account_mail_desc#:#Ce mail peut être envoyé quand un utilisateur ILIAS est créé par d'autres moyens que l'auto-enregistrement. common#:#user_not_found#:#Utilisateur non trouvé @@ -5815,7 +5815,7 @@ common#:#userfolder_export_file#:#Fichier common#:#userfolder_export_file_size#:#Taille du Fichier common#:#userfolder_export_files#:#Fichiers common#:#userfolder_export_xml#:#.XML -common#:#username#:#Nom d'Utilisateur +common#:#username#:#Nom d'utilisateur common#:#users#:#Utilisateurs common#:#users_not_imported#:#Les utilisateurs suivants n'existent pas, leurs messages ne peuvent pas être importés common#:#users_online#:#Utilisateurs Actifs @@ -5823,10 +5823,10 @@ common#:#usr#:#Utilisateur common#:#usr_account_inactive#:#Compte Inactif common#:#usr_active_only#:#Utilisateurs Actifs Seulement common#:#usr_add#:#Ajouter Utilisateur -common#:#usr_agreement#:#Charte d'Utilisation -common#:#usr_agreement_footer_intro#:#You have declared your consent to these terms of service.###24 11 2022 new variable +common#:#usr_agreement#:#Conditions d'utilisation +common#:#usr_agreement_footer_intro#:#Vous avez déclaré accepter les présentes conditions d'utilisation. common#:#usr_edit#:#Editer Utilisateur -common#:#usr_field_change_components_listening#:#There is at least one component which is interested in the changed configuration. Would you like to confirm the changes with the consequences the component(s) announced below?###31 03 2023 new variable +common#:#usr_field_change_components_listening#:#There is at least one component which is interested in the changed configuration. Would you like to confirm the changes with the consequences the component(s) announced below?###31 10 2023 new variable common#:#usr_filter_coursemember#:#Membre du cours common#:#usr_filter_groupmember#:#Membre du groupe common#:#usr_filter_lastlogin#:#Dernière connexion de l'utilisateur @@ -5850,15 +5850,15 @@ common#:#usrimport_cant_delete#:#Suppression impossible : aucun utilisateur ne c common#:#usrimport_cant_insert#:#Ajout impossible : l'utilisateur existe déjà . common#:#usrimport_cant_update#:#Mise à jour impossible : aucun utilisateur ne correspond. common#:#usrimport_conflict_handling_info#:#Quand 'Ignorer les conflits' est sélectionné, ILIAS ignore une action s'il ne peut pas la réaliser (par exemple, un ajout n'est pas fait si un utilisateur avec le même login existe déjà dans la base de données)nQuand 'Mettre à jour en cas de conflit' est sélectionné, ILIAS met la base à jour si une action ne peut pas être réalisée (par exemple, une action 'ajout' est remplacée par une action 'mise à jour' si un utilisateur portant le même login existe déjà ). -common#:#usrimport_form_not_evaluabe#:#The form data couldn't be read.###30 04 2021 new variable +common#:#usrimport_form_not_evaluabe#:#The form data couldn't be read. common#:#usrimport_global_role_for_action_required#:#Au moins un rôle global doit être spécifié pour l'action "%1$s". common#:#usrimport_ignore_role#:#Ignorer le rôle common#:#usrimport_login_is_not_unique#:#Le nom d'utilisateur n'est pas unique. common#:#usrimport_no_insert_ext_account_exists#:#Impossible d'effectuer l'action "Insert". Le compte externe existe déjà. common#:#usrimport_no_update_ext_account_exists#:#Impossible d'effectuer l'action "Update". Le compte externe existe déjà. common#:#usrimport_with_specified_role_not_permitted#:#L'importation avec le rôle spécifié n'est pas autorisée. -common#:#usrimport_wrong_file_count#:#Too many files in import-folder. Please try again.###30 04 2021 new variable -common#:#usrimport_xml_anonymous_or_root_not_allowed#:#Neither the system-account nor the anonymous account can be changed through the import.###13 09 2023 new variable +common#:#usrimport_wrong_file_count#:#Too many files in import-folder. Please try again. +common#:#usrimport_xml_anonymous_or_root_not_allowed#:#Neither the system-account nor the anonymous account can be changed through the import. common#:#usrimport_xml_attribute_missing#:#L'attribut "%2$s" dans l'élément "%1$s" est manquant. common#:#usrimport_xml_attribute_value_illegal#:#La valeur "%3$s" de l'attribut "%2$s" dans l'élément "%1$s" n'est pas autorisée. common#:#usrimport_xml_attribute_value_inapplicable#:#La valeur "%3$s" de l'attribut "%2$s" dans l'élément "%1$s" n'est pas applicable pour l'action "%4$s". @@ -5875,7 +5875,7 @@ common#:#verification_failure_log#:#Journal des échecs de la vérification common#:#verification_warning_log#:#Journal des avertissements de la vérification common#:#version#:#Version common#:#versions#:#Versions -common#:#view#:#Voir le document +common#:#view#:#Voir common#:#view_content#:#Voir Contenu common#:#view_learning_progress#:#Voir la progression d’apprentissage common#:#view_learning_progress_rec#:#Voir la progression d’apprentissage de l’unité, y compris des sous-unités @@ -5886,31 +5886,31 @@ common#:#visitors#:#Visiteurs common#:#visits#:#Visites common#:#web_resources#:#Liens Web common#:#webdav#:#WebDAV -common#:#webdav_add_instructions_btn_label#:#Add Mount Instructions Document###07 02 2020 new variable -common#:#webdav_chosen_language_already_used#:#There already is another document associated with the chosen language###07 02 2020 new variable -common#:#webdav_doc_delete#:#Delete WebDav Mount Instructions###07 02 2020 new variable -common#:#webdav_docs_mount_instructions#:#Mount Instructions Documents###07 02 2020 new variable -common#:#webdav_duplicate_detected_title#:#Following objects could not be displayed, because an object with the same Title is already being shown:###07 02 2020 new variable -common#:#webdav_enable_versioning#:#File Versioning###07 02 2020 new variable -common#:#webdav_forbidden_chars_title#:#Following files cannot be displayed, because they contain one or more forbidden characters (\<>/:*?"|#):###07 02 2020 new variable -common#:#webdav_form_document#:#Instructions Document###07 02 2020 new variable -common#:#webdav_form_document_info#:#Upload a txt or an html file here. After the upload the file will be parsed and processed. For more information###07 02 2020 new variable -common#:#webdav_form_document_title#:#Title###07 02 2020 new variable -common#:#webdav_form_document_title_info#:#This title will be dislayed as the title of the modal when the Mount Instructions are opened###07 02 2020 new variable -common#:#webdav_form_edit_doc_head#:#Edit Mount Instructions Document###07 02 2020 new variable -common#:#webdav_form_new_doc_head#:#Create new Mount Instructions Document###07 02 2020 new variable -common#:#webdav_general_settings#:#General Settings###07 02 2020 new variable -common#:#webdav_missing_lang#:#There is no english version of the WebDAV Mount Instructions###07 02 2020 new variable -common#:#webdav_mount_instructions#:#Mount Instructions###07 02 2020 new variable -common#:#webdav_problem_free_container#:#There are no objects that cause problems in this container.###07 02 2020 new variable -common#:#webdav_problem_info_duplicate#:#There is a file with the same title as the info file.###07 02 2020 new variable -common#:#webdav_pwd_instruction#:#Nous suggérons de créer un mot de passe local pour ouvrir le repository comme un dossier web.
.Ce mot de passe est requis seulement pour les fonctionnalités du dossier web. -common#:#webdav_pwd_instruction_success#:#Un nouveau mot de passe local a été créé. Vous pouvez maintenant ouvrir le repository comme un dossier web. -common#:#webdav_sure_delete_documents_s#:#Are you sure you want to delete the Mount Instructions with the following title:###07 02 2020 new variable -common#:#webdav_tbl_docs_head_title#:#Dokument title###07 02 2020 new variable -common#:#webdav_tbl_docs_title#:#List of uploaded WebDAV Mount Instructions###07 02 2020 new variable -common#:#webdav_upload_instructions#:#Upload Instructions###07 02 2020 new variable -common#:#webdav_versioning_info#:#If enabled, already existing files will get a new version instead of beeing overwritten.###07 02 2020 new variable +common#:#webdav_add_instructions_btn_label#:#Add Mount Instructions Document +common#:#webdav_chosen_language_already_used#:#There already is another document associated with the chosen language +common#:#webdav_doc_delete#:#Delete WebDav Mount Instructions +common#:#webdav_docs_mount_instructions#:#Mount Instructions Documents +common#:#webdav_duplicate_detected_title#:#Following objects could not be displayed, because an object with the same Title is already being shown: +common#:#webdav_enable_versioning#:#File Versioning +common#:#webdav_forbidden_chars_title#:#Following files cannot be displayed, because they contain one or more forbidden characters (\<>/:*?"|#): +common#:#webdav_form_document#:#Instructions Document +common#:#webdav_form_document_info#:#Upload a txt or an html file here. After the upload the file will be parsed and processed. For more information +common#:#webdav_form_document_title#:#Title +common#:#webdav_form_document_title_info#:#This title will be dislayed as the title of the modal when the Mount Instructions are opened +common#:#webdav_form_edit_doc_head#:#Edit Mount Instructions Document +common#:#webdav_form_new_doc_head#:#Create new Mount Instructions Document +common#:#webdav_general_settings#:#General Settings +common#:#webdav_missing_lang#:#There is no english version of the WebDAV Mount Instructions +common#:#webdav_mount_instructions#:#Mount Instructions +common#:#webdav_problem_free_container#:#There are no objects that cause problems in this container. +common#:#webdav_problem_info_duplicate#:#There is a file with the same title as the info file. +common#:#webdav_pwd_instruction#:#Nous suggérons de créer un mot de passe local pour ouvrir le catalogue comme un dossier web.
.Ce mot de passe est requis seulement pour les fonctionnalités du dossier web. +common#:#webdav_pwd_instruction_success#:#Un nouveau mot de passe local a été créé. Vous pouvez maintenant ouvrir le catalogue comme un dossier web. +common#:#webdav_sure_delete_documents_s#:#Are you sure you want to delete the Mount Instructions with the following title: +common#:#webdav_tbl_docs_head_title#:#Dokument title +common#:#webdav_tbl_docs_title#:#List of uploaded WebDAV Mount Instructions +common#:#webdav_upload_instructions#:#Upload Instructions +common#:#webdav_versioning_info#:#If enabled, already existing files will get a new version instead of beeing overwritten. common#:#webfolder_dir_info#:#Cette page s'affiche car votre navigateur ne peut pas ouvrir de 'Dossier Web'. Merci de bien vouloir lire les instructions de création des 'Dossiers Web'. common#:#webfolder_index_of#:#Index de la page %1$s common#:#webfolder_instructions#:#Instructions du dossier web @@ -5934,25 +5934,25 @@ common#:#wiki#:#Wiki common#:#wiki_add#:#Ajouter Wiki common#:#wiki_new#:#Nouveau Wiki common#:#with#:#largeur -common#:#withdraw_consent#:#Withdraw Acceptance###30 04 2021 new variable -common#:#withdraw_consent_description#:#Withdraw your acceptance to the terms of service here###30 04 2021 new variable -common#:#withdraw_consent_description_external#:#Please return to your source installation and log in again to complete the revocation process.###30 04 2021 new variable -common#:#withdraw_consent_description_internal#:#Please log in again to complete the revocation process.###30 04 2021 new variable -common#:#withdraw_consent_header#:#Revoke acceptance to terms of service###30 04 2021 new variable -common#:#withdraw_consent_info#:#Withdraw acceptance to terms of service###30 04 2021 new variable -common#:#withdraw_consent_info_external#:#Please notify the administrator of your authentication system and inform them about your intention to revoke your acceptance to the terms of service.###30 04 2021 new variable -common#:#withdraw_consent_info_internal#:#If you confirm here, your account will be deleted.###30 04 2021 new variable -common#:#withdraw_usr_agreement#:#Withdraw###30 04 2021 new variable -common#:#withdrawal_complete#:#Withdrawal of consent complete.###30 04 2021 new variable -common#:#withdrawal_complete_deleted#:#Withdrawal of consent complete, account deleted.###30 04 2021 new variable -common#:#withdrawal_complete_redirect#:#Withdrawal of consent complete. To have the account deleted, please contact your organisation.###30 04 2021 new variable -common#:#withdrawal_mail_info#:#The following email will be sent to an administrator after confirming the withdrawal:[BR][BR]###30 04 2021 new variable -common#:#withdrawal_mail_subject#:#Withdrawal of Consent to Terms of Service###30 04 2021 new variable -common#:#withdrawal_mail_text#:#Dear Sir or Madam,[BR][BR]I hereby withdraw my consent to your ILIAS 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###30 04 2021 new variable -common#:#withdrawal_sure_account#:#Are you sure you want to confirm the withdrawal of consent?###30 04 2021 new variable -common#:#withdrawal_sure_account_deletion#:#Are you sure you want to confirm the withdrawal of consent? Your user account will be irrevocably deleted.###30 04 2021 new variable -common#:#withdrawal_sure_account_deletion_no_consent_yet#:#Are you sure you do not want to accept the terms of service? Your user account will be irrevocably deleted.###15 12 2021 new variable -common#:#withdrawal_sure_account_no_consent_yet#:#Are you sure you do not want to accept the terms of service?###15 12 2021 new variable +common#:#withdraw_consent#:#Retirer l'acceptation +common#:#withdraw_consent_description#:#Retirer votre acceptation des conditions d'utilisation ici +common#:#withdraw_consent_description_external#:#Please return to your source installation and log in again to complete the revocation process. +common#:#withdraw_consent_description_internal#:#Please log in again to complete the revocation process. +common#:#withdraw_consent_header#:#Révoquer votre acceptation des conditions d'utilisation +common#:#withdraw_consent_info#:#Withdraw acceptance to terms of service +common#:#withdraw_consent_info_external#:#Please notify the administrator of your authentication system and inform them about your intention to revoke your acceptance to the terms of service. +common#:#withdraw_consent_info_internal#:#If you confirm here, your account will be deleted. +common#:#withdraw_usr_agreement#:#Withdraw +common#:#withdrawal_complete#:#Withdrawal of consent complete. +common#:#withdrawal_complete_deleted#:#Withdrawal of consent complete, account deleted. +common#:#withdrawal_complete_redirect#:#Withdrawal of consent complete. To have the account deleted, please contact your organisation. +common#:#withdrawal_mail_info#:#The following email will be sent to an administrator after confirming the withdrawal:[BR][BR] +common#:#withdrawal_mail_subject#:#Withdrawal of Consent to Terms of Service +common#:#withdrawal_mail_text#:#Dear Sir or Madam,[BR][BR]I hereby withdraw my consent to your ILIAS 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#:#withdrawal_sure_account#:#Are you sure you want to confirm the withdrawal of consent? +common#:#withdrawal_sure_account_deletion#:#Are you sure you want to confirm the withdrawal of consent? Your user account will be irrevocably deleted. +common#:#withdrawal_sure_account_deletion_no_consent_yet#:#Are you sure you do not want to accept the terms of service? Your user account will be irrevocably deleted. +common#:#withdrawal_sure_account_no_consent_yet#:#Êtes-vous sûr de ne pas vouloir accepter les conditions d'utilisation ? common#:#wizard_search_list#:#Votre recherche a produit les résultats suivants. Veuillez en sélectionner un. common#:#wizard_title_info#:#Veuillez saisir le titre de l'objet que vous voulez dupliquer. common#:#write#:#Ecrire @@ -5965,10 +5965,10 @@ common#:#yesterday#:#Hier common#:#zip#:#Code Postal common#:#zip_structure_error#:#L'archive ZIP contient des noms de fichiers identiques. Le dépôt est abandonné. common#:#zip_test_failed#:#Le test ZIP a échoué. Veuillez contacter votre administrateur ILIAS. -common#:#zipcode#:#Code Postal +common#:#zipcode#:#Code postal cond#:#cond_under_parent_control#:#Preconditions are under the control of the parent object. -cont#:#cont_add_global_profile#:#Add Global Profile###30 04 2021 new variable -cont#:#cont_add_local_profile#:#Add Local Profile###30 04 2021 new variable +cont#:#cont_add_global_profile#:#Add Global Profile +cont#:#cont_add_local_profile#:#Add Local Profile cont#:#cont_add_skill#:#Ajouter une compétence cont#:#cont_assign_competence#:#Assigner les compétences aux membres cont#:#cont_assign_skills#:#Assigner les compétences @@ -5976,14 +5976,14 @@ cont#:#cont_block_limit#:#Limit Items per Block cont#:#cont_block_limit_info#:#If a block contains more items, a "Show more" button will appear. cont#:#cont_cont_skills#:#Compétences assignées des membres cont#:#cont_deassign_competence#:#Annuler les assignations des compétences -cont#:#cont_filter#:#Filter###07 02 2020 new variable -cont#:#cont_filter_field#:#Field###07 02 2020 new variable -cont#:#cont_filter_fields#:#Filter Fields###07 02 2020 new variable -cont#:#cont_filter_record#:#Record###07 02 2020 new variable -cont#:#cont_found_objects#:#Found Objects###07 02 2020 new variable +cont#:#cont_filter#:#Filter +cont#:#cont_filter_field#:#Field +cont#:#cont_filter_fields#:#Filter Fields +cont#:#cont_filter_record#:#Record +cont#:#cont_found_objects#:#Found Objects cont#:#cont_item_list#:#List -cont#:#cont_item_list_info#:#Display content objects in a list.###16 03 2023 new variable -cont#:#cont_list_presentation#:#Item Presentation +cont#:#cont_item_list_info#:#Display content objects in a list. +cont#:#cont_list_presentation#:#Présentation de l'objet cont#:#cont_mem_skills#:#Compétences cont#:#cont_news_edited#:#Traitées cont#:#cont_news_settings#:#Paramètres des nouvelles @@ -5994,58 +5994,58 @@ cont#:#cont_news_timeline_info#:#Active l’onglet de chronologie des nouvelles cont#:#cont_news_timeline_landing_page#:#Page d’accueil cont#:#cont_news_timeline_landing_page_info#:#La page de chronologie sera la page d’accueil. cont#:#cont_news_timeline_tab#:#Chronologie -cont#:#cont_page_type_cont#:#Repository Page (Cours, Group, ...)###30 04 2021 new variable -cont#:#cont_page_type_cstr#:#Course Start Page (Learning Objectives View)###30 04 2021 new variable +cont#:#cont_page_type_cont#:#Page de catalogue (cours, group, ...) +cont#:#cont_page_type_cstr#:#Course Start Page (Learning Objectives View) cont#:#cont_path#:#Chemin cont#:#cont_publish_assignment#:#Publier les affectations cont#:#cont_published#:#Publiées cont#:#cont_really_deassign_skills#:#Voulez-vous vraiment annuler l’affectation de toutes les compétences des utilisateurs? cont#:#cont_really_remove_skill_from_course#:#Voulez-vous vraiment retirer ces compétences de la liste? -cont#:#cont_select_fields#:#Select Fields###07 02 2020 new variable +cont#:#cont_select_fields#:#Select Fields cont#:#cont_show_more#:#Show More cont#:#cont_skill#:#Compétence cont#:#cont_skill_assigned_comp#:#Sélection de compétences -cont#:#cont_skill_assigned_profiles#:#Profile Selection###30 04 2021 new variable -cont#:#cont_skill_deletion_not_possible#:#Deletion of global competence profiles is not possible. Please select only local competence profiles.###30 04 2021 new variable +cont#:#cont_skill_assigned_profiles#:#Profile Selection +cont#:#cont_skill_deletion_not_possible#:#Deletion of global competence profiles is not possible. Please select only local competence profiles. cont#:#cont_skill_do_not_set#:#Ne pas définir cont#:#cont_skill_members#:#Membres -cont#:#cont_skill_no_profile_selected#:#Please select a profile.###30 04 2021 new variable +cont#:#cont_skill_no_profile_selected#:#Please select a profile. cont#:#cont_skill_no_skill#:#Aucune valeur (réinitialiser) -cont#:#cont_skill_no_skills_selected#:#No competences have been selected yet. Please add at least one competence first under "Competence Selection".###09 11 2022 new variable -cont#:#cont_skill_profile#:#Profile###30 04 2021 new variable -cont#:#cont_skill_profiles#:#Assigned Profiles of Members###30 04 2021 new variable +cont#:#cont_skill_no_skills_selected#:#No competences have been selected yet. Please add at least one competence first under "Competence Selection". +cont#:#cont_skill_profile#:#Profile +cont#:#cont_skill_profiles#:#Assigned Profiles of Members cont#:#cont_skill_publish#:#Publier cont#:#cont_skill_publish_auto#:#Automatique cont#:#cont_skill_publish_auto_info#:#Les affectations de compétences pour les membres sont immédiatement visibles pour les membres. cont#:#cont_skill_publish_manual#:#Manuel cont#:#cont_skill_publish_manual_info#:#Les affectations de compétences pour les membres doivent être publiées avant de devenir visibles pour les membres. -cont#:#cont_skill_really_delete_profile_from_list#:#Do you really want to delete this profile?###30 04 2021 new variable -cont#:#cont_skill_really_delete_profiles_from_list#:#Do you really want to delete these profiles?###30 04 2021 new variable -cont#:#cont_skill_really_remove_profile_from_list#:#Do you really want to remove this profile from the list?###30 04 2021 new variable -cont#:#cont_skill_really_remove_profiles_from_list#:#Do you really want to remove these profiles from the list?###30 04 2021 new variable -cont#:#cont_skill_removal_not_possible#:#Removing of local competence profiles is not possible. Please select only global competence profiles.###30 04 2021 new variable +cont#:#cont_skill_really_delete_profile_from_list#:#Do you really want to delete this profile? +cont#:#cont_skill_really_delete_profiles_from_list#:#Do you really want to delete these profiles? +cont#:#cont_skill_really_remove_profile_from_list#:#Do you really want to remove this profile from the list? +cont#:#cont_skill_really_remove_profiles_from_list#:#Do you really want to remove these profiles from the list? +cont#:#cont_skill_removal_not_possible#:#Removing of local competence profiles is not possible. Please select only global competence profiles. cont#:#cont_skill_show#:#Montrer -cont#:#cont_std_filter_title_1#:#Title###07 02 2020 new variable -cont#:#cont_std_filter_title_2#:#Description###07 02 2020 new variable -cont#:#cont_std_filter_title_3#:#Title/Description###07 02 2020 new variable -cont#:#cont_std_filter_title_4#:#Keyword###07 02 2020 new variable -cont#:#cont_std_filter_title_5#:#Author###07 02 2020 new variable -cont#:#cont_std_filter_title_6#:#Copyright###07 02 2020 new variable -cont#:#cont_std_filter_title_7#:#Tutorial Support###07 02 2020 new variable -cont#:#cont_std_filter_title_8#:#Object Type###07 02 2020 new variable -cont#:#cont_std_filter_title_9#:#Online/Offline###07 02 2020 new variable -cont#:#cont_std_record_title#:#Standard###07 02 2020 new variable -cont#:#cont_tile_size#:#Tile Size###31 03 2023 new variable -cont#:#cont_tile_size_0#:#normal (up to four tiles per row)###31 03 2023 new variable -cont#:#cont_tile_size_1#:#small (up to six tiles per row)###31 03 2023 new variable -cont#:#cont_tile_size_2#:#large (up to three tiles per row)###31 03 2023 new variable -cont#:#cont_tile_size_3#:#extra large (up to two tiles per row)###31 03 2023 new variable -cont#:#cont_tile_size_4#:#full (one tile per row)###31 03 2023 new variable +cont#:#cont_std_filter_title_1#:#Titre +cont#:#cont_std_filter_title_2#:#Description +cont#:#cont_std_filter_title_3#:#Titre/Description +cont#:#cont_std_filter_title_4#:#Mot-clé +cont#:#cont_std_filter_title_5#:#Auteur +cont#:#cont_std_filter_title_6#:#Droit d'auteur +cont#:#cont_std_filter_title_7#:#Tutoriel +cont#:#cont_std_filter_title_8#:#Type d'objet +cont#:#cont_std_filter_title_9#:#En ligne/Hors-ligne +cont#:#cont_std_record_title#:#Standard +cont#:#cont_tile_size#:#Tile Size###31 10 2023 new variable +cont#:#cont_tile_size_0#:#normal (up to four tiles per row)###31 10 2023 new variable +cont#:#cont_tile_size_1#:#small (up to six tiles per row)###31 10 2023 new variable +cont#:#cont_tile_size_2#:#large (up to three tiles per row)###31 10 2023 new variable +cont#:#cont_tile_size_3#:#extra large (up to two tiles per row)###31 10 2023 new variable +cont#:#cont_tile_size_4#:#full (one tile per row)###31 10 2023 new variable cont#:#cont_tile_view#:#Tiles -cont#:#cont_tile_view_info#:#Display content objects as thumbnail-style tiles. Images for these tiles can be uploaded in the settings of each individual object.###16 03 2023 new variable -contact#:#contact_awrn_ap_contacts#:#Contacts Approuvés +cont#:#cont_tile_view_info#:#Display content objects as thumbnail-style tiles. Images for these tiles can be uploaded in the settings of each individual object. +contact#:#contact_awrn_ap_contacts#:#Contacts approuvés contact#:#contact_awrn_ap_contacts_info#:#Tous les contacts approuvés par l'utilisateur sont répertoriés. -contact#:#contact_awrn_req_contacts#:#Demandes de Contacts +contact#:#contact_awrn_req_contacts#:#Demandes de contacts contact#:#contact_awrn_req_contacts_info#:#Toutes les demandes de contact sont répertoriées. content#:#Pages#:#Pages content#:#add_menu_entry#:#Ajouter Entrée de Menu @@ -6057,38 +6057,38 @@ content#:#citate#:#Faire référence content#:#citate_from#:#Fait référence à ... content#:#citate_page#:#Faire référence à cette page content#:#citate_to#:#Faire référence à ... -content#:#cont_Additional#:#Informations Supplémentaires -content#:#cont_AdvancedKnowledge#:#Connaissances Avancées -content#:#cont_Attention#:#Attention###07 02 2020 new variable -content#:#cont_Background#:#Background###07 02 2020 new variable +content#:#cont_Additional#:#Informations supplémentaires +content#:#cont_AdvancedKnowledge#:#Connaissances avancées +content#:#cont_Attention#:#Attention +content#:#cont_Background#:#Arrière-plan content#:#cont_Block#:#Bloc -content#:#cont_Book#:#Book###30 04 2021 new variable +content#:#cont_Book#:#Book content#:#cont_Circle#:#Cercle content#:#cont_Citation#:#Citation -content#:#cont_Confirmation#:#Confirmation###07 02 2020 new variable +content#:#cont_Confirmation#:#Confirmation content#:#cont_Example#:#Exemple content#:#cont_Excursus#:#Annexe content#:#cont_FileListItem#:#Objet liste de fichier (Standard) content#:#cont_Headline1#:#Titre 1 content#:#cont_Headline2#:#Titre 2 content#:#cont_Headline3#:#Titre 3 -content#:#cont_Information#:#Information###07 02 2020 new variable -content#:#cont_Interaction#:#Interaction###07 02 2020 new variable -content#:#cont_Link#:#Link###07 02 2020 new variable +content#:#cont_Information#:#Information +content#:#cont_Interaction#:#Interaction +content#:#cont_Link#:#Lien content#:#cont_List#:#Liste -content#:#cont_Literature#:#Literature###07 02 2020 new variable -content#:#cont_Media#:#Média (Standard) +content#:#cont_Literature#:#Littérature +content#:#cont_Media#:#Images/Media content#:#cont_Mnemonic#:#Mnémonique -content#:#cont_Numbers#:#Numbers###30 04 2021 new variable +content#:#cont_Numbers#:#Nombres content#:#cont_Poly#:#Polygone content#:#cont_Rect#:#Rectangle content#:#cont_Remark#:#Remarque -content#:#cont_Separator#:#Separator###07 02 2020 new variable +content#:#cont_Separator#:#Séparateur content#:#cont_Special#:#Spécial -content#:#cont_StandardCenter#:#Standard Center###07 02 2020 new variable +content#:#cont_StandardCenter#:#Centre standard content#:#cont_StandardTable#:#Tableau Simple -content#:#cont_TableContent#:#Contenu du Tableau -content#:#cont_Verse#:#Verse/Stanza###30 04 2021 new variable +content#:#cont_TableContent#:#Contenu du tableau +content#:#cont_Verse#:#Verset/Strophe content#:#cont_WholePicture#:#Image Entière content#:#cont_accented#:#Accentué content#:#cont_act_number#:#Numérotation de Chapitre @@ -6111,13 +6111,13 @@ content#:#cont_add_file#:#Ajouter Fichier content#:#cont_add_images#:#Ajouter Images content#:#cont_add_popup#:#Ajouter Popup content#:#cont_add_tab#:#Ajouter Onglet -content#:#cont_add_url#:#From URL###30 04 2021 new variable +content#:#cont_add_url#:#From URL content#:#cont_added_cell#:#Column added content#:#cont_added_comment#:#Commentaire ajouté à l'historique content#:#cont_added_tab#:#Onglet créé. content#:#cont_added_term#:#Terme ajouté content#:#cont_adjust_size#:#Ajuster les Dimensions -content#:#cont_advanced_settings#:#Advanced Settings###30 04 2021 new variable +content#:#cont_advanced_settings#:#Advanced Settings content#:#cont_align#:#Alignement content#:#cont_alignment#:#Alignement content#:#cont_all_answers_correct#:#Toutes les réponses sont correctes @@ -6153,7 +6153,7 @@ content#:#cont_behavior#:#Comportement content#:#cont_biblio#:#Donnée bibliographique content#:#cont_biblio_info#:#Autorise la fonction de données bibliographiques content#:#cont_blist#:#Liste à Puces -content#:#cont_block_format#:#Section Format###30 04 2021 new variable +content#:#cont_block_format#:#Section Format content#:#cont_blocked_users#:#Utilisateurs bloqués content#:#cont_blocked_users_mail_link#:#Cliquez sur le lien suivant pour ouvrir le module d'apprentissage: content#:#cont_bottom#:#Bas @@ -6167,15 +6167,15 @@ content#:#cont_cant_copy_folders#:#Les dossiers ne peuvent pas être copiés dan content#:#cont_cant_del_full#:#Suppression du fichier plein écran impossible. content#:#cont_cant_del_std#:#Suppression de la vue standard impossible. content#:#cont_caption#:#Légende -content#:#cont_caption_style#:#Caption Style Class###31 03 2023 new variable +content#:#cont_caption_style#:#Caption Style Class###31 10 2023 new variable content#:#cont_cc_emp#:#Emphase content#:#cont_cc_imp#:#Important content#:#cont_cc_str#:#Gras content#:#cont_cc_sub#:#Indice content#:#cont_cc_sup#:#Exposant content#:#cont_center#:#Centre -content#:#cont_change_notification_salutation#:#Hello %s,###07 02 2020 new variable -content#:#cont_change_notification_subject_lm#:#Learning Module "%1$s" has been changed: %2$s###07 02 2020 new variable +content#:#cont_change_notification_salutation#:#Hello %s, +content#:#cont_change_notification_subject_lm#:#Learning Module "%1$s" has been changed: %2$s content#:#cont_change_object_reference#:#Modifier la référence de l'objet content#:#cont_change_type#:#Modifier Type content#:#cont_chap_and_pages#:#Chapitres et Pages @@ -6195,30 +6195,30 @@ content#:#cont_check_values_info#:#L'outil de test vérifiera si les valeurs env content#:#cont_choose_characteristic#:#Choisir caractéristique content#:#cont_choose_characteristic_section#:#Sections content#:#cont_choose_characteristic_text#:#Eléments de texte -content#:#cont_choose_file_source#:#Source###07 02 2020 new variable -content#:#cont_choose_from_clipboard#:#Choose from Clipboard###30 04 2021 new variable -content#:#cont_choose_from_pool#:#Select from Media Pool###30 04 2021 new variable +content#:#cont_choose_file_source#:#Source +content#:#cont_choose_from_clipboard#:#Choose from Clipboard +content#:#cont_choose_from_pool#:#Select from Media Pool content#:#cont_choose_glo#:#Choisir glossaire content#:#cont_choose_lm#:#Choisir module d’apprentissage -content#:#cont_choose_local#:#Local directory###07 02 2020 new variable -content#:#cont_choose_media_pool#:#Select Pool###30 04 2021 new variable +content#:#cont_choose_local#:#Local directory +content#:#cont_choose_media_pool#:#Select Pool content#:#cont_choose_mep#:#Choisir pool média content#:#cont_choose_pages_or_chapters_only#:#Veuillez sélectionner uniquement soit des pages soit des chapitres. -content#:#cont_choose_upload_dir#:#Upload directory###07 02 2020 new variable +content#:#cont_choose_upload_dir#:#Upload directory content#:#cont_choose_wiki#:#Wiki content#:#cont_citation_selection_not_valid#:#Votre sélection n'est pas valide content#:#cont_click_br_corner#:#Veuillez cliquer sur le coin inférieur droit de la zone désirée. content#:#cont_click_center#:#Veuillez cliquer sur le centre de la zone désirée. content#:#cont_click_circle#:#Veuillez cliquer sur un point de la circonférence de la zone désirée. -content#:#cont_click_edit#:#Click on elements to edit its properties.###30 04 2021 new variable -content#:#cont_click_multi_select#:#Click on elements to select or deselect them.###30 04 2021 new variable +content#:#cont_click_edit#:#Click on elements to edit its properties. +content#:#cont_click_multi_select#:#Click on elements to select or deselect them. content#:#cont_click_next_or_save#:#Veuillez cliquer sur le point suivant du polygone ou enregistrer la zone (il n'est pas nécessaire de cliquer à nouveau sur le point de départ de ce polygone). content#:#cont_click_next_point#:# Veuillez cliquer sur le point suivant du polygone. content#:#cont_click_starting_point#:# Veuillez cliquer sur le point de départ du polygone. content#:#cont_click_tl_corner#:#Veuillez cliquer sur le coin supérieur gauche de la zone désirée. content#:#cont_col_ordering#:#Tri des Colonnes content#:#cont_colspan#:#Fusion colonne -content#:#cont_commented_by#:#Commented by###07 02 2020 new variable +content#:#cont_commented_by#:#Commented by content#:#cont_comments#:#Enregistrer les Commentaires content#:#cont_comments_info#:#Certains modules d'apprentissage SCORM 2004 permettent aux utilisateurs de fournir des commentaires dans le module. Cette option permet d'enregistrer ces commentaires. content#:#cont_confirm_delete#:#Etes-vous sûr(e) de vouloir détruire cet objet? @@ -6235,12 +6235,12 @@ content#:#cont_correct_answer_also#:#Autre réponse correcte : content#:#cont_correct_answers_also#:#Autres réponses correctes : content#:#cont_correct_answers_shown#:#Les réponses correctes sont visibles ci-dessus content#:#cont_could_not_determine_resource_size#:#ILIAS ne peut pas automatiquement déterminer la taille de la ressource. -content#:#cont_could_not_save_duplicate_pc_ids#:#Page could not be saved (duplicate PC IDs).###28 05 2021 new variable +content#:#cont_could_not_save_duplicate_pc_ids#:#Page could not be saved (duplicate PC IDs). content#:#cont_cp_question_diff_formats_info#:#Veuillez noter que certains formatages ne sont pas supportés dans les modules de contenu. content#:#cont_create_link#:#Créer lien content#:#cont_create_mob#:#Créer Média content#:#cont_credit_mode#:#Option "Credit" -content#:#cont_credit_mode_info#:#The Learning Module is informed via cmi.core.credit whether the achieved Performance (pass/fail and score) is desired (credit) or not desired (no-credit) for the Assessment. It is the responsibility of the Learning Module to interpret this Instruction adequately.###29 07 2022 new variable +content#:#cont_credit_mode_info#:#The Learning Module is informed via cmi.core.credit whether the achieved Performance (pass/fail and score) is desired (credit) or not desired (no-credit) for the Assessment. It is the responsibility of the Learning Module to interpret this Instruction adequately. content#:#cont_credit_off#:#Pas de crédit content#:#cont_credit_on#:#Crédit content#:#cont_credits#:#Crédits @@ -6256,7 +6256,7 @@ content#:#cont_custom_menu_entries#:#Entrées de Menu Personnalisées content#:#cont_custom_size#:#Taille Personnalisée content#:#cont_dark#:#Foncé content#:#cont_data_from_lms#:#adlcp:datafromlms -content#:#cont_de_activate#:#Désactiver / Activer +content#:#cont_de_activate#:#Dés(activer) content#:#cont_deactivate_html#:#Désactiver le rendu HTML content#:#cont_deactivate_js#:#Activer Mode Formulaire content#:#cont_deactivate_media#:#Désactiver Médias @@ -6277,7 +6277,7 @@ content#:#cont_def_organization#:#défaut content#:#cont_default#:#Par Défaut content#:#cont_definition#:#Définition content#:#cont_definitions#:#Définitions -content#:#cont_delete_content#:#Delete Content###30 04 2021 new variable +content#:#cont_delete_content#:#Delete Content content#:#cont_delete_selected#:#Supprimer content#:#cont_delete_style#:#Supprimer style content#:#cont_delete_track_data#:#Supprimer Données de Suivi @@ -6297,96 +6297,96 @@ content#:#cont_downloads_desc#:#Permet le téléchargement pour tous les fichier content#:#cont_downloads_public_desc#:#Autoriser le téléchargement pour les utilisateurs anonymes dans la zone publique (sans être connecté) content#:#cont_drag_and_drop_elements#:#Glissez-déposez les éléments sur les emplacements pour les déplacer. content#:#cont_drag_element_click_save#:#Glissez-déposez les éléments aux positions souhaitées, puis cliquez sur "Enregistrer". -content#:#cont_ed_align_center#:#Alignement : Centré -content#:#cont_ed_align_left#:#Alignement : Gauche -content#:#cont_ed_align_left_float#:#Alignement : Flottant à Gauche -content#:#cont_ed_align_right#:#Alignement : Droite -content#:#cont_ed_align_right_float#:#Alignement : Flottant à Droite +content#:#cont_ed_align_center#:#Alignement : centré +content#:#cont_ed_align_left#:#Alignement : gauche +content#:#cont_ed_align_left_float#:#Alignement : flottant à Gauche +content#:#cont_ed_align_right#:#Alignement : droite +content#:#cont_ed_align_right_float#:#Alignement : flottant à droite content#:#cont_ed_atable#:#Table avancée content#:#cont_ed_cell_left#:#Déplacer à gauche content#:#cont_ed_cell_right#:#Déplacer à droite content#:#cont_ed_class#:#Style content#:#cont_ed_click_to_add_pg#:#Cliquez ici pour ajouter du contenu. -content#:#cont_ed_col_left#:#Déplacer Colonne à Gauche -content#:#cont_ed_col_right#:#Déplacer Colonne à Droite +content#:#cont_ed_col_left#:#Déplacer la colonne à gauche +content#:#cont_ed_col_right#:#Déplacer la colonne à droite content#:#cont_ed_copy#:#Copier -content#:#cont_ed_copy_clip#:#Copier dans Presse-Papier +content#:#cont_ed_copy_clip#:#Copier dans presse-papier content#:#cont_ed_cut#:#Couper content#:#cont_ed_delete#:#Supprimer -content#:#cont_ed_delete_cell#:#Supprimer colonne -content#:#cont_ed_delete_col#:#Détruire colonne -content#:#cont_ed_delete_item#:#Détruire objet -content#:#cont_ed_delete_row#:#Détruire ligne +content#:#cont_ed_delete_cell#:#Supprimer la colonne +content#:#cont_ed_delete_col#:#Détruire la colonne +content#:#cont_ed_delete_item#:#Détruire l'objet +content#:#cont_ed_delete_row#:#Détruire la ligne content#:#cont_ed_dtable#:#Tableau Simplifié -content#:#cont_ed_edit#:#Editer +content#:#cont_ed_edit#:#Modifier content#:#cont_ed_edit_data#:#Modifier les données -content#:#cont_ed_edit_files#:#Editer Fichiers -content#:#cont_ed_edit_multiple#:#Editer Séquence de Paragraphes -content#:#cont_ed_edit_prop#:#Paramètres -content#:#cont_ed_enable#:#(Dés)Activer Eléments +content#:#cont_ed_edit_files#:#Modifier les fichiers +content#:#cont_ed_edit_multiple#:#Modifier les séquence de paragraphes +content#:#cont_ed_edit_prop#:#Modifier les propriétés +content#:#cont_ed_enable#:#(Dés)activer les éléments content#:#cont_ed_flist#:#Liste fichier -content#:#cont_ed_go#:#Envoi +content#:#cont_ed_go#:#Envoyer content#:#cont_ed_grid_col_width#:#Largeur de colonne content#:#cont_ed_grid_col_width_info#:#Column width can span multiple 1/12 units of the row and depend on the overall screen size. Devices are given as examples. Their screen size determines the concrete behaviour. 12/12 equals to 100% width. content#:#cont_ed_grid_col_widths#:#Largeurs des colonnes -content#:#cont_ed_insert_amdfrm#:#Insert Advanced Metadata###31 03 2023 new variable -content#:#cont_ed_insert_amdpl#:#Insert Page List###30 04 2021 new variable -content#:#cont_ed_insert_blog#:#Insérer Blog -content#:#cont_ed_insert_cach#:#Insert Consultation Hours###30 04 2021 new variable -content#:#cont_ed_insert_dtab#:#Insert Data Table###30 04 2021 new variable -content#:#cont_ed_insert_flst#:#Insert File List###30 04 2021 new variable +content#:#cont_ed_insert_amdfrm#:#Insert Advanced Metadata###31 10 2023 new variable +content#:#cont_ed_insert_amdpl#:#Insérer une liste de pages +content#:#cont_ed_insert_blog#:#Insérer un blog +content#:#cont_ed_insert_cach#:#Insérer des heures de consultation +content#:#cont_ed_insert_dtab#:#Insérer une table de données +content#:#cont_ed_insert_flst#:#Insérer une liste de fichiers content#:#cont_ed_insert_grid#:#Insérer la mise en page des colonnes content#:#cont_ed_insert_grid_info#:#Ajoute une mise en page de colonnes réactive basée sur un grillage avec 12 unités par rangée. -content#:#cont_ed_insert_iim#:#Insérer Image Interactive -content#:#cont_ed_insert_incl#:#Ajouter texte/média -content#:#cont_ed_insert_lhist#:#Insert Learning History###30 04 2021 new variable -content#:#cont_ed_insert_list#:#Insérer Liste Enrichie -content#:#cont_ed_insert_lpe#:#Insert Login Page Element###30 04 2021 new variable -content#:#cont_ed_insert_map#:#Insérer Carte -content#:#cont_ed_insert_mcrs#:#Insert My Courses###30 04 2021 new variable -content#:#cont_ed_insert_media#:#Ajouter un média -content#:#cont_ed_insert_par#:#Insérer Texte -content#:#cont_ed_insert_pcqst#:#Insérer Question -content#:#cont_ed_insert_plach#:#Insérer Emplacement -content#:#cont_ed_insert_prof#:#Insert Personal Data###30 04 2021 new variable -content#:#cont_ed_insert_qover#:#Insérer Apperçu de Question -content#:#cont_ed_insert_repobj#:#Ajouter un type d'objet -content#:#cont_ed_insert_sec#:#Insert Section###30 04 2021 new variable -content#:#cont_ed_insert_skills#:#Insérer Compétences -content#:#cont_ed_insert_src#:#Insert Code###30 04 2021 new variable -content#:#cont_ed_insert_tab#:#Insert Advanced Table###30 04 2021 new variable -content#:#cont_ed_insert_tabs#:#Insérer Onglets +content#:#cont_ed_insert_iim#:#Insérer une image interactive +content#:#cont_ed_insert_incl#:#Insérer un extrait de contenu +content#:#cont_ed_insert_lhist#:#Insérer un historique d'apprentissage +content#:#cont_ed_insert_list#:#Insérer une liste enrichie +content#:#cont_ed_insert_lpe#:#Insérer un élément de page de connexion +content#:#cont_ed_insert_map#:#Insérer une carte +content#:#cont_ed_insert_mcrs#:#Insérer mes cours +content#:#cont_ed_insert_media#:#Insérer une image/audio/vidéo +content#:#cont_ed_insert_par#:#Insérer du texte +content#:#cont_ed_insert_pcqst#:#Insérer un question +content#:#cont_ed_insert_plach#:#Insérer un emplacement +content#:#cont_ed_insert_prof#:#Insérer les données personnelles +content#:#cont_ed_insert_qover#:#Insérer un aperçu de question +content#:#cont_ed_insert_repobj#:#Insérer une liste de ressources +content#:#cont_ed_insert_sec#:#Insérer une section +content#:#cont_ed_insert_skills#:#Insérer des compétences +content#:#cont_ed_insert_src#:#Insérer un code +content#:#cont_ed_insert_tab#:#Insérer un tableau avancé +content#:#cont_ed_insert_tabs#:#Insérer un accordéon content#:#cont_ed_insert_templ#:#Insérer un modèle de contenu -content#:#cont_ed_insert_vrfc#:#Insert Certificate###30 04 2021 new variable -content#:#cont_ed_item_down#:#Déplacer Objet vers le Bas -content#:#cont_ed_item_up#:#Déplacer Objet vers le Haut +content#:#cont_ed_insert_vrfc#:#Insérer un certificat +content#:#cont_ed_item_down#:#Déplacer un objet vers le bas +content#:#cont_ed_item_up#:#Déplacer un objet vers le haut content#:#cont_ed_list#:#Liste avancée -content#:#cont_ed_moveafter#:#Déplacer Après -content#:#cont_ed_movebefore#:#Déplacer Avant -content#:#cont_ed_new_col_after#:#Nouvelle Colonne Après -content#:#cont_ed_new_col_before#:#Nouvelle Colonne Avant -content#:#cont_ed_new_item_after#:#Nouvel Objet Après -content#:#cont_ed_new_item_before#:#Nouvel Objet Avant -content#:#cont_ed_new_row_after#:#Nouvelle Ligne Après -content#:#cont_ed_new_row_before#:#Nouvelle Ligne Avant +content#:#cont_ed_moveafter#:#Déplacer après +content#:#cont_ed_movebefore#:#Déplacer avant +content#:#cont_ed_new_col_after#:#Nouvelle colonne après +content#:#cont_ed_new_col_before#:#Nouvelle colonne avant +content#:#cont_ed_new_item_after#:#Nouvel objet après +content#:#cont_ed_new_item_before#:#Nouvel objet avant +content#:#cont_ed_new_row_after#:#Nouvelle ligne après +content#:#cont_ed_new_row_before#:#Nouvelle ligne avant content#:#cont_ed_par#:#Texte content#:#cont_ed_paste#:#Coller -content#:#cont_ed_paste_clip#:#Coller Depuis Presse-Papier +content#:#cont_ed_paste_clip#:#Coller depuis le presse-papier content#:#cont_ed_pglprop#:#Propriétés modèle de la page content#:#cont_ed_plachmedia#:#Média de champs de fusion content#:#cont_ed_plachprop#:#Propriétés du champ de fusion content#:#cont_ed_plachquestion#:#Question du champ de fusion content#:#cont_ed_plachtext#:#Texte du champ de fusion content#:#cont_ed_plachverification#:#Emplacement de Certificat -content#:#cont_ed_row_down#:#Déplacer Colonne vers le Bas -content#:#cont_ed_row_up#:#Déplacer Colonne vers le Haut +content#:#cont_ed_row_down#:#Déplacer la colonne vers le bas +content#:#cont_ed_row_up#:#Déplacer la colonne vers le haut content#:#cont_ed_select_pctext#:#Sélectionner item de texte -content#:#cont_ed_split_page#:#passer à une nouvelle page -content#:#cont_ed_split_page_next#:#passer à la page suivante +content#:#cont_ed_split_page#:#Passer à une nouvelle page +content#:#cont_ed_split_page_next#:#Passer à la page suivante content#:#cont_ed_textitem#:#Item de texte content#:#cont_ed_width#:#Largeur content#:#cont_edit_base_image#:#Editer Image de Fond -content#:#cont_edit_comp#:#Editing###30 04 2021 new variable +content#:#cont_edit_comp#:#Editing content#:#cont_edit_definition#:#Editer Définitions content#:#cont_edit_definitions#:#Editer Définitions content#:#cont_edit_file_list_properties#:#Editer Propriétés de la Liste de Fichiers @@ -6396,7 +6396,7 @@ content#:#cont_edit_marker_position#:#Editer Position du Marqueur content#:#cont_edit_mob#:#Editer Média content#:#cont_edit_mob_alias_prop#:#Editer Propriétés de l'Instance de Média content#:#cont_edit_mode#:#Mode d'édition -content#:#cont_edit_multi#:#Selection###30 04 2021 new variable +content#:#cont_edit_multi#:#Selection content#:#cont_edit_overlay_position#:#Editer Position de Superposition content#:#cont_edit_par#:#Editer Texte content#:#cont_edit_personal_data#:#Editer Données Personnelles @@ -6411,7 +6411,7 @@ content#:#cont_edit_style#:#Modifier style content#:#cont_edit_tabs#:#Propriétés content#:#cont_edit_term#:#Editer Terme content#:#cont_element_refers_removed_itgr#:#Ce contenu fait référence à un groupe d'objets qui a été supprimé entre temps. -content#:#cont_empty_question#:#Question modifiée inachevée. Veuillez cliquer puis modifier ou supprimer la question. +content#:#cont_empty_question#:#La modification de la question n'est pas terminée. Veuillez cliquer et modifier, ou supprimer la question. content#:#cont_enable_page_history#:#Historique de Page content#:#cont_enable_page_history_info#:#Préserve les versions de page et permet de revenir à une version antérieure. content#:#cont_enable_time_scheduled_page_activation#:#Activation Programmée des Pages @@ -6443,14 +6443,14 @@ content#:#cont_fix_tree#:#Réparer la Structure content#:#cont_fix_tree_confirm#:#Veuillez exécuter cette commande seulement si l'arborescence de ce module est corrompue, par exemple si des objets vides apparaissent. content#:#cont_fn#:#Note de Bas de Page content#:#cont_footer#:#Bas de page -content#:#cont_footnote#:#Footnote###30 04 2021 new variable +content#:#cont_footnote#:#Footnote content#:#cont_force_all_open#:#Tous Ouverts content#:#cont_format#:#Format content#:#cont_fourth_edition#:#SCORM 2004 4ème édition content#:#cont_fourth_edition_info#:#SCORM 2004 4ème édition offre plusieurs avantages par rapport à la 3ème édition. Des données peuvent par exemple être échangées entre SCOs. Ces possibilités sont néanmoins rarement utilisées et pénalisent les performances. content#:#cont_free_pages#:#Pages Libres content#:#cont_full_is_in_dir#:#Suppression impossible. Le fichier plein écran est dans le dossier. -content#:#cont_fullscreen#:#Plein Ecran +content#:#cont_fullscreen#:#Plein écran content#:#cont_general_properties#:#Propriétés générales content#:#cont_get_link#:#récupérer lien content#:#cont_glo_assign#:#Assigner glossaire @@ -6462,16 +6462,16 @@ content#:#cont_got_lock_release#:#This page has been locked for your editing unt content#:#cont_grid_cell#:#Colonne content#:#cont_grid_cell_confirm_deletion#:#Voulez-vous vraiment supprimer la/les colonne(s)? content#:#cont_grid_nr_cells#:#Nombre de colonnes -content#:#cont_grid_t_main_side#:#Haupt- und Seitenblock###07 02 2020 new variable -content#:#cont_grid_t_main_side_info#:#Legt einen breite Spalte links und eine schmalere Spalte rechts daneben an. Wechselt in Mobilansicht (small) zu einem Ein-Spalten-Layout.###07 02 2020 new variable -content#:#cont_grid_t_manual#:#Manuell erstelltes Seitenlayout###07 02 2020 new variable -content#:#cont_grid_t_manual_info#:#Ermöglicht die freie Gestaltung von Spaltenanzahl und -breiten.###07 02 2020 new variable -content#:#cont_grid_t_three_column#:#Drei-Spalten-Layout###07 02 2020 new variable -content#:#cont_grid_t_three_column_info#:#Legt drei gleich breite Spalten nebeneinander an. Wechselt in Mobilansicht (small) zu einem Ein-Spalten-Layout.###07 02 2020 new variable -content#:#cont_grid_t_two_by_two#:#Zwei-mal-zwei-Box###07 02 2020 new variable -content#:#cont_grid_t_two_by_two_info#:#Legt zwei Zeilen mit zwei gleich breiten Spalten an. Wechselt in Mobilansicht (small) zu einem Ein-Spalten-Layout und auf extrabreiten Bildschirmen (extra large) in ein Vier-Spalten-Layout.###07 02 2020 new variable -content#:#cont_grid_t_two_column#:#Zwei-Spalten-Layout###07 02 2020 new variable -content#:#cont_grid_t_two_column_info#:#Legt zwei gleich breite Spalten nebeneinander an. Wechselt in Mobilansicht (small) zu einem Ein-Spalten-Layout.###07 02 2020 new variable +content#:#cont_grid_t_main_side#:#Bloc principal et bloc latéral +content#:#cont_grid_t_main_side_info#:#Crée une colonne large à gauche et une colonne plus étroite à droite. Passe à une mise en page à une seule colonne en affichage mobile (small). +content#:#cont_grid_t_manual#:#Mise en page créée manuellement +content#:#cont_grid_t_manual_info#:#Permet de définir librement le nombre et la largeur des colonnes. +content#:#cont_grid_t_three_column#:#Mise en page en trois colonnes +content#:#cont_grid_t_three_column_info#:#Crée trois colonnes de même largeur l'une à côté de l'autre. Passe à une mise en page à une seule colonne en affichage mobile (small). +content#:#cont_grid_t_two_by_two#:#Boîte deux fois deux +content#:#cont_grid_t_two_by_two_info#:#Crée deux lignes avec deux colonnes de même largeur. Passe à une mise en page d'une seule colonne en affichage mobile (small) et à une mise en page de quatre colonnes sur les écrans extra larges (extra large). +content#:#cont_grid_t_two_column#:#Mise en page en deux colonnes +content#:#cont_grid_t_two_column_info#:#Crée deux colonnes de même largeur l'une à côté de l'autre. Passe à une mise en page à une seule colonne en affichage mobile (small). content#:#cont_grid_width_l#:#Large content#:#cont_grid_width_l_info#:#Par ex. ordinateur content#:#cont_grid_width_m#:#Moyen @@ -6480,12 +6480,12 @@ content#:#cont_grid_width_s#:#Petite content#:#cont_grid_width_s_info#:#Par ex. smartphone content#:#cont_grid_width_xl#:#Extra large content#:#cont_grid_width_xl_info#:#Par ex. ordinateur large -content#:#cont_hacc_needs_height#:#Please set a content height for horizontal accordions.###26 04 2023 new variable -content#:#cont_hacc_needs_width#:#Please set a content width for horizontal accordions.###26 04 2023 new variable +content#:#cont_hacc_needs_height#:#Please set a content height for horizontal accordions. +content#:#cont_hacc_needs_width#:#Please set a content width for horizontal accordions. content#:#cont_header#:#Entête content#:#cont_height#:#Hauteur content#:#cont_help_no_valid_tooltip_id#:#L'ID d'info-bulle que vous avez saisi n'était pas valide. -content#:#cont_hide_adv#:#Cacher Connaissances Avancées +content#:#cont_hide_adv#:#Cacher les connaissances avancées content#:#cont_hide_head_foot_print#:#Cacher l'entête et le pied de page personnalisés dans la vue imprimée content#:#cont_hidenavig#:#Masquer barre de navigation latérale content#:#cont_hidenavig_info#:#L'arborescence de navigation gauche peut être masquée si le module d'apprentissage SCORM contient suffisamment de fonctionnalités pour naviguer dans le contenu ou si la barre de navigation supérieure est affichée. @@ -6525,7 +6525,7 @@ content#:#cont_insert_mob#:#Insérer Média content#:#cont_insert_my_courses#:#Insérer Mes cours content#:#cont_insert_page#:#Ajouter page content#:#cont_insert_page_from_clip#:#Coller pages depuis le presse-papier -content#:#cont_insert_pagelayout#:#Insert Template Page###07 02 2020 new variable +content#:#cont_insert_pagelayout#:#Insert Template Page content#:#cont_insert_par#:#Insérer Texte content#:#cont_insert_profile#:#Publier Données Personnelles content#:#cont_insert_resources#:#Ajouter un type d'objet @@ -6545,11 +6545,11 @@ content#:#cont_internal_links#:#Liens Internes content#:#cont_invalid_new_module#:#Document incompatible ! Veuillez vous assurer que imsmanifest.xml n'a pas été modifié content#:#cont_is_visible#:#isvisible content#:#cont_item#:#Objet -content#:#cont_keyword#:#Keyword###30 04 2021 new variable +content#:#cont_keyword#:#Keyword content#:#cont_language#:#Langue content#:#cont_languages#:#Langues content#:#cont_last_try#:#Dernière tentative -content#:#cont_last_update#:#Last Update###30 04 2021 new variable +content#:#cont_last_update#:#Last Update content#:#cont_last_visited_page#:#Dernière page visitée content#:#cont_latest_rev#:#Dernière Révision content#:#cont_layout#:#Modèle @@ -6575,7 +6575,7 @@ content#:#cont_left_float#:#Flottant à gauche content#:#cont_license#:#Licence content#:#cont_license_info#:#Autorise la fonction de licence content#:#cont_light#:#Clair -content#:#cont_link#:#Lien +content#:#cont_link#:#Link###31 10 2023 new variable content#:#cont_link_area#:#Surface de lien content#:#cont_link_ext#:#Lien (externe) content#:#cont_link_glo_in_lm#:#Tous les termes du glossaire doivent-ils être liés au module maintenant ? @@ -6586,7 +6586,7 @@ content#:#cont_link_to_external#:#Lien vers Site Web Externe content#:#cont_link_to_internal#:#Lien vers Ressource ILIAS content#:#cont_link_to_wiki#:#Lien vers Page de Wiki content#:#cont_link_type#:#Type de Lien -content#:#cont_link_user#:#User Profile###30 04 2021 new variable +content#:#cont_link_user#:#User Profile content#:#cont_linked_mobs#:#Médias associés content#:#cont_links#:#Liens content#:#cont_list_files#:#Liste des Fichiers @@ -6623,7 +6623,7 @@ content#:#cont_lpe_login_form#:#Formulaire de connexion content#:#cont_lpe_openid_connect_login#:#OpenId Connect Login content#:#cont_lpe_openid_login_form#:#Formulaire de connexion OpenId content#:#cont_lpe_registration_link#:#Nouveau lien d’inscription -content#:#cont_lpe_saml_login#:#SAML Login###26 01 2022 new variable +content#:#cont_lpe_saml_login#:#SAML Login content#:#cont_lpe_shib_login_form#:#Formulaire de connexion Shibboleth content#:#cont_lpe_user_agreement_link#:#Lien d’accord d’utilisation content#:#cont_lrs_settings#:#Paramètres @@ -6640,9 +6640,9 @@ content#:#cont_mastery_score_12_info#:#Si un SCO ne détermine pas un statut de content#:#cont_mastery_score_2004#:#écraser scaled_passing_score content#:#cont_mastery_score_2004_info#:#Les objectifs d’apprentissage centraux de ce module d’apprentissage sont considérés comme atteints si la note obtenue atteint au moins un certain niveau - la scaled_passing_score. Cette valeur, qui doit être exprimée en pourcentage, peut être écrasée ici, par ex. pour réduire le niveau d’exigence. Si le champ est vide, les informations dans le manifeste SCORM sont valides. Les valeurs suivantes sont fournies dans le fichier manifeste  content#:#cont_max_time_allowed#:#adlcp:maxtimeallowed -content#:#cont_media#:#Images/Media###24 09 2021 new variable +content#:#cont_media#:#Images/Media###31 10 2023 new variable content#:#cont_media_placeh#:#Cliquer et modifier pour ajouter le média -content#:#cont_media_placehl#:#Emplacement du Média +content#:#cont_media_placehl#:#Emplacement du média content#:#cont_media_source#:#Source du Média content#:#cont_missing_preconditions#:#Vous devez remplir les conditions suivantes avant de pouvoir accéder au chapitre "%s". content#:#cont_missing_snippet#:#La portion de contenu a été supprimée. @@ -6676,7 +6676,7 @@ content#:#cont_new_trigger_area#:#Nouvelle Zone Réactive content#:#cont_next_rev#:#Révision suivante content#:#cont_nlist#:#Liste Numérotée content#:#cont_no_access#:#Pas d'Accès -content#:#cont_no_block#:#No Section###30 04 2021 new variable +content#:#cont_no_block#:#No Section content#:#cont_no_caption#:#Aucune Légende content#:#cont_no_download_file_available#:#Il n'existe aucun fichier public à télécharger. content#:#cont_no_glossary#:#Aucun glossaire assigné. @@ -6685,22 +6685,22 @@ content#:#cont_no_page#:#Aucune page trouvée. content#:#cont_no_page_access_unansw_q#:#Vous devez répondre correctement à toutes les questions des pages précédentes pour pouvoir accéder à cette page. content#:#cont_no_page_in_chapter#:#Désolé, mais il n'y a actuellement aucun contenu actif dans ce chapitre. content#:#cont_no_parameters#:#Aucun Paramètre -content#:#cont_no_read#:#No read permission###07 02 2020 new variable +content#:#cont_no_read#:#No read permission content#:#cont_no_subdir_in_zip#:#La décompression a échoué ou le fichier importé est non valide.
Il ne contient pas de sous-dossier '%s'. content#:#cont_no_text#:#Aucun Texte content#:#cont_nomenu#:#Masquer barre de navigation horizontale content#:#cont_nomenu_info#:#La barre de navigation principale peut être cachée si le module d'apprentissage SCORM contient suffisamment de fonctionnalités pour suspendre, terminer et naviguer dans le contenu. content#:#cont_none#:#Aucun content#:#cont_not_saved_edit_lock_expired#:#Désolé, mais un autre utilisateur détient le verrou d'édition pour cette page dans cet intervalle de temps. Vous pouvez fermer ce message et copier le contenu de votre presse-papiers. -content#:#cont_notification_activate_lm#:#Activate Notification for Learning Module###07 02 2020 new variable -content#:#cont_notification_activate_page#:#Activate Notification for Page###07 02 2020 new variable -content#:#cont_notification_activated#:#Notification Activated (Whole LM)###07 02 2020 new variable -content#:#cont_notification_comment_lm#:#the following Learning Module Page has been commented###07 02 2020 new variable -content#:#cont_notification_comment_subject_lm#:#A comment was added to %s: %s###07 02 2020 new variable -content#:#cont_notification_deactivate_lm#:#Deactivate Notification for Learning Module###07 02 2020 new variable -content#:#cont_notification_deactivate_page#:#Deactivate Notification for Page###07 02 2020 new variable -content#:#cont_notification_deactivated#:#Notification Deactivated###07 02 2020 new variable -content#:#cont_notification_update_lm#:#the following Learning Module has been updated###07 02 2020 new variable +content#:#cont_notification_activate_lm#:#Activate Notification for Learning Module +content#:#cont_notification_activate_page#:#Activate Notification for Page +content#:#cont_notification_activated#:#Notification Activated (Whole LM) +content#:#cont_notification_comment_lm#:#the following Learning Module Page has been commented +content#:#cont_notification_comment_subject_lm#:#A comment was added to %s: %s +content#:#cont_notification_deactivate_lm#:#Deactivate Notification for Learning Module +content#:#cont_notification_deactivate_page#:#Deactivate Notification for Page +content#:#cont_notification_deactivated#:#Notification Deactivated +content#:#cont_notification_update_lm#:#the following Learning Module has been updated content#:#cont_notify_on_blocked_users#:#Notifications d’utilisateurs bloqués content#:#cont_notify_on_blocked_users_info#:#Vous serez averti si les utilisateurs sont bloqués car ils sont à court d'essais. content#:#cont_nr_col_footer#:#Colonnes de pied de page @@ -6725,7 +6725,7 @@ content#:#cont_online#:#En-Ligne content#:#cont_online_help_ids#:#ID d’écrans content#:#cont_online_info#:#Configurez le module d'apprentissage SCORM en ligne pour le rendre visible et disponible pour les utilisateurs. Si ce n'est pas le cas, seuls les utilisateurs disposant d'une autorisation d'édition pourront y accéder. content#:#cont_open#:#Affichage -content#:#cont_open_clipboard#:#Open Clipboard###30 04 2021 new variable +content#:#cont_open_clipboard#:#Open Clipboard content#:#cont_open_iframe#:#S'ouvre dans la même fenêtre, le menu principal ILIAS est affiché content#:#cont_open_normal#:#dans un onglet / nouvelle fenêtre avec lien content#:#cont_open_window#:#S'ouvre définitivement dans une nouvelle fenêtre, sans le menu principal ILIAS @@ -6745,15 +6745,15 @@ content#:#cont_overlays_have_been_deleted#:#Les superpositions ont été supprim content#:#cont_page_activation#:#Activation de Page content#:#cont_page_activation_on#:#Le contenu sera activé le %s. content#:#cont_page_compare#:#Comparer les Versions -content#:#cont_page_created#:#Page created###07 02 2020 new variable +content#:#cont_page_created#:#Page created content#:#cont_page_currently_deactivated#:#Désolé, mais cette page est actuellement désactivée. content#:#cont_page_deactivated#:#Page désactivée. content#:#cont_page_deactivated_elements#:#La page contient des éléments désactivés. content#:#cont_page_header#:#Titre content#:#cont_page_layout#:#Modèle de page content#:#cont_page_lock_released#:#Edition terminée. Page débloquée. -content#:#cont_page_notification_activated#:#Notification Activated (Single Page)###07 02 2020 new variable -content#:#cont_page_template#:#Page Template###07 02 2020 new variable +content#:#cont_page_notification_activated#:#Notification Activated (Single Page) +content#:#cont_page_template#:#Page Template content#:#cont_page_toc#:#Aperçu de Page content#:#cont_page_translation_does_not_exist#:#La page de traduction n'existe pas encore et va être créée content#:#cont_pages#:#Pages @@ -6769,34 +6769,34 @@ content#:#cont_pc_blog#:#Blog content#:#cont_pc_carousel#:#Carrousel content#:#cont_pc_code#:#Code content#:#cont_pc_deleted#:#Contenu supprimé -content#:#cont_pc_dtab#:#Tableau Simplifié -content#:#cont_pc_flist#:#Liste de Fichiers +content#:#cont_pc_dtab#:#Tableau des données +content#:#cont_pc_flist#:#Liste de fichiers content#:#cont_pc_grid#:#Mise en page des colonnes -content#:#cont_pc_hacc#:#Accordéon (Horizontal) -content#:#cont_pc_iim#:#Image Interactive -content#:#cont_pc_incl#:#texte/média -content#:#cont_pc_list#:#Liste Enrichie +content#:#cont_pc_hacc#:#Accordéon (horizontal) +content#:#cont_pc_iim#:#Image interactive +content#:#cont_pc_incl#:#Extrait de contenu +content#:#cont_pc_list#:#Liste avancée content#:#cont_pc_map#:#Carte -content#:#cont_pc_media#:#Image/Media###09 03 2022 new variable +content#:#cont_pc_media#:#Image/Média content#:#cont_pc_mob#:#Média content#:#cont_pc_modified#:#Contenu modifié content#:#cont_pc_new#:#Nouveau contenu content#:#cont_pc_par#:#Texte -content#:#cont_pc_prof#:#Données Personnelles -content#:#cont_pc_qover#:#Aperçu de Question +content#:#cont_pc_prof#:#Données personnelles +content#:#cont_pc_qover#:#Aperçu de question content#:#cont_pc_qst#:#Question content#:#cont_pc_res#:#Ressource content#:#cont_pc_sec#:#Section content#:#cont_pc_skills#:#Compétence -content#:#cont_pc_tab#:#Tableau Enrichi -content#:#cont_pc_vacc#:#Accordéon (Vertical) +content#:#cont_pc_tab#:#Tableau avancé +content#:#cont_pc_vacc#:#Accordéon (vertical) content#:#cont_pc_vrfc#:#Certificat content#:#cont_permission_object#:#Objet de permission content#:#cont_permission_object_desc#:#La section sera présentée uniquement pour les utilisateurs qui ont reçu la permission pour l’objet de permission. content#:#cont_personal_clipboard#:#Presse-Papier Personnel content#:#cont_pg_title#:#Titre de Page content#:#cont_please_enter_a_term#:#Veuillez saisir un terme. -content#:#cont_please_select#:#veuillez sélectionner +content#:#cont_please_select#:#Veuillez sélectionner content#:#cont_please_try_again#:#Veuillez réessayer content#:#cont_popups_have_been_deleted#:#Les fenêtres ont été supprimées. content#:#cont_position#:#Localisation @@ -6829,10 +6829,10 @@ content#:#cont_qover_short_message_info#:#Un message "Vous avez correctement ré content#:#cont_qtries#:#Nombre d'Essais pour les Questions content#:#cont_qtries_info#:#Valeur par défaut pour le nombre de tentatives pour les questions récemment créées. content#:#cont_question_placeh#:#Cliquer et modifier pour ajouter la question -content#:#cont_question_placehl#:#Emplacement de la Question +content#:#cont_question_placehl#:#Emplacement de la question content#:#cont_question_stats#:#Statistique content#:#cont_question_type#:#Type de Question -content#:#cont_quit_text_editing#:#Finish Text Editing###26 04 2023 new variable +content#:#cont_quit_text_editing#:#Finish Text Editing###31 10 2023 new variable content#:#cont_rand_start#:#Démarrage aléatoire content#:#cont_really_delete_overlays#:#Voulez-vous vraiment supprimer les superpositions suivantes ? content#:#cont_really_delete_popups#:#Voulez-vous vraiment supprimer les fenêtres suivantes ? @@ -6930,17 +6930,17 @@ content#:#cont_scorm_ed_properties#:#Propriétés du Module / Glossaire content#:#cont_scorm_options#:#Options SCORM content#:#cont_scorm_type#:#adlcp:scormtype content#:#cont_screen_ids#:#ID d’écrans -content#:#cont_sec_protected#:#Protected###31 03 2023 new variable -content#:#cont_sec_protected_text#:#The following section is protected and can not be edited.###31 03 2023 new variable +content#:#cont_sec_protected#:#Protected###31 10 2023 new variable +content#:#cont_sec_protected_text#:#The following section is protected and can not be edited.###31 10 2023 new variable content#:#cont_second#:#Deuxième -content#:#cont_sel_el_use_paste#:#Selected elements are now in the clipboard. Please click the desired target placeholder and select ‘Paste’.###30 04 2021 new variable +content#:#cont_sel_el_use_paste#:#Selected elements are now in the clipboard. Please click the desired target placeholder and select ‘Paste’. content#:#cont_select#:#Sélectionner content#:#cont_select_file#:#Sélectionner fichier content#:#cont_select_from_upload_dir#:#-- Sélectionner depuis le dossier de téléversement -- content#:#cont_select_item#:#Sélectionner au moins un objet content#:#cont_select_max_one_item#:#Veuillez ne sélectionner qu'un seul objet. content#:#cont_select_media_pool#:#Sélectionner galerie multimédia -content#:#cont_select_none#:#Clear Selection###30 04 2021 new variable +content#:#cont_select_none#:#Clear Selection content#:#cont_select_other_qpool#:#Sélectionner une autre Galerie content#:#cont_select_par_or_section#:#Veuillez sélectionner au moins un paragraphe ou une section. content#:#cont_selected_items_have_been_copied#:#Les items sélectionnés ont été copiés dans le presse-papiers. Cliquer sur le champ de fusion approprié pour les coller dans le document d'apprentissage. @@ -6960,15 +6960,15 @@ content#:#cont_set_styles#:#Définir Styles content#:#cont_set_tab_style_info#:#Cocher les cellules du tableau pour appliquer le style sélectionné. content#:#cont_settings#:#Paramètre pour les modules d’apprentissage content#:#cont_shape#:#Forme -content#:#cont_shift_click_to_select#:#Shift-click on elements will select them and switch to the selection mode.###30 04 2021 new variable +content#:#cont_shift_click_to_select#:#Shift-click on elements will select them and switch to the selection mode. content#:#cont_short_title#:#Titre court content#:#cont_short_title_info#:#Les titres courts sont utilisés dans la présentation arborescente gauche et pour les vignettes dans la navigation précédente/suivante. content#:#cont_short_titles#:#Titres courts content#:#cont_show_activation_info#:#Afficher Information d'Activation content#:#cont_show_activation_info_info#:#Lorsque la période d'activation n'est pas encore atteinte, la page est tout de même présente et la période d'activation est affichée. -content#:#cont_show_adv#:#Afficher Connaissances Avancées +content#:#cont_show_adv#:#Afficher les connaissances avancées content#:#cont_show_content_after_focus#:#Continuer avec le module d’apprentissage -content#:#cont_show_fullscreen#:#Show Fullscreen###30 04 2021 new variable +content#:#cont_show_fullscreen#:#Show Fullscreen content#:#cont_show_info#:#Afficher Info content#:#cont_show_line_numbers#:#Afficher numéros de lignes content#:#cont_show_print_view#:#Afficher Vue Imprimable @@ -6998,7 +6998,7 @@ content#:#cont_subchapters#:#Sous-Chapitres content#:#cont_submit_answers#:#Soumettre réponses content#:#cont_subtitle_file#:#Fichier SRT ZIP content#:#cont_subtitle_files#:#Sous-titres média -content#:#cont_sur_block_format#:#Surrounding Section###24 09 2021 new variable +content#:#cont_sur_block_format#:#Surrounding Section content#:#cont_switch_to_media_pool#:#Passer à une autre Galerie de Médias content#:#cont_syntax_help#:#Aide Syntaxique content#:#cont_tab_cont_height#:#Hauteur du Contenu @@ -7009,7 +7009,7 @@ content#:#cont_table_border_info#:#Gardez ce vide pour rendre le contenu des par content#:#cont_table_cell_properties#:#Propriétés des Cellules du Tableau content#:#cont_table_cellpadding#:#Marge des Cellules du Tableau content#:#cont_table_cellpadding_info#:#Gardez ce vide pour rendre le contenu des paramètres de style efficace. Les valeurs doivent inclure l'unité (comme px). -content#:#cont_table_edit_cells#:#Edit Cells###30 04 2021 new variable +content#:#cont_table_edit_cells#:#Edit Cells content#:#cont_table_properties#:#Propriétés du Tableau content#:#cont_table_width#:#Largeur du Tableau content#:#cont_tabs#:#Onglets @@ -7026,14 +7026,14 @@ content#:#cont_tex#:#Code Latex content#:#cont_text_acc#:#Texte accentué : content#:#cont_text_code#:#Code : content#:#cont_text_com#:#Commentaire : -content#:#cont_text_editing#:#Edit Text###26 04 2023 new variable +content#:#cont_text_editing#:#Edit Text###31 10 2023 new variable content#:#cont_text_emp#:#Texte en italique : content#:#cont_text_fn#:#Pied de Page : -content#:#cont_text_iln_link#:#Interal Link###30 04 2021 new variable +content#:#cont_text_iln_link#:#Interal Link content#:#cont_text_imp#:#Texte souligné : content#:#cont_text_keyword#:#Mot-clé content#:#cont_text_placeh#:#Cliquer et modifier pour ajouter du texte -content#:#cont_text_placehl#:#Emplacement du Texte +content#:#cont_text_placehl#:#Emplacement du texte content#:#cont_text_quot#:#Citation : content#:#cont_text_str#:#Gras : content#:#cont_text_sub#:#Indice @@ -7047,10 +7047,10 @@ content#:#cont_time_from_lms_info#:#Vérification stricte (selon SCORM) des vale content#:#cont_time_limit_action#:#adlcp:timelimitaction content#:#cont_to_focus_beginning#:#Retour au contenu lié à l'objectif d'apprentissage content#:#cont_to_focus_return_crs#:#Retour au cours -content#:#cont_toc#:#Table des Matières +content#:#cont_toc#:#Table des matières content#:#cont_toc_mode#:#Eléments de la Table des Matières -content#:#cont_tool_faq#:#FAQ###07 02 2020 new variable -content#:#cont_tool_media#:#Media###07 02 2020 new variable +content#:#cont_tool_faq#:#FAQ +content#:#cont_tool_media#:#Media content#:#cont_top#:#Haut content#:#cont_topic#:#Sujet content#:#cont_total_time#:#Temps Total @@ -7086,10 +7086,10 @@ content#:#cont_update_skills#:#Editer Compétence content#:#cont_update_verification#:#Editer Certificat content#:#cont_upload_dir#:#Répertoire de téléversement content#:#cont_upload_dir_info#:#Répertoire du serveur depuis lequel des zip lourds SCORM et HTML peuvent être copiés au lieu d'être téléchargés. Seuls les administrateurs ILIAS verront les fichiers depuis ce répertoire. Veuillez saisir un chemin absolu de serveur sans slash. -content#:#cont_upload_file#:#Upload File###30 04 2021 new variable +content#:#cont_upload_file#:#Upload File content#:#cont_upload_multi_srt_howto#:#This feature allows you to upload multiple subtitle (srt) files in a zip file for all media objects of the learning module. Your .zip file should contain all .srt files on the top level (no subdirectories). The file names should end with "_<lang code>.srt" where lang code is e.g. "en", "it", "de". The rest of the filename should correspond to the name of the video file, e.g. "my_video.mp4" ➜ "my_video_en.srt". content#:#cont_uploaded_file#:#Fichier existant -content#:#cont_url_info#:#URL of a media file or Youtube URL.###30 04 2021 new variable +content#:#cont_url_info#:#URL of a media file or Youtube URL. content#:#cont_usage#:#Utilisation content#:#cont_use_same_resource_as_above#:#Utilisez la même ressource que précédemment content#:#cont_user#:#Utilisateur @@ -7103,7 +7103,7 @@ content#:#cont_users_have_mob_in_clip2#:#utilisateur(s). content#:#cont_validate_file#:#Valider Fichier content#:#cont_verification_object#:#Certificat content#:#cont_verification_placeh#:#Cliquer et éditer pour insérer un certificat -content#:#cont_verification_placehl#:#Emplacement de Certificat +content#:#cont_verification_placehl#:#Emplacement de certificat content#:#cont_version#:#version content#:#cont_versions#:#Versions content#:#cont_whole_glossary#:#Glossaire Entier @@ -7155,8 +7155,8 @@ content#:#htlm_import#:#Importer document d'apprentissage HTML content#:#import_sco_object#:#Importer SCO content#:#info_stop_offline_mode_sure#:#Note : la progression en mode déconnecté sera perdue. Etes-vous sûr ? content#:#lm_activate_rating#:#Activer la Notation des Pages -content#:#lm_editing_view#:#Editing View###07 02 2020 new variable -content#:#lm_import#:#Import ILIAS Learning Module###30 04 2021 new variable +content#:#lm_editing_view#:#Editing View +content#:#lm_import#:#Import ILIAS Learning Module content#:#lm_menu_edit_entry#:#Editer entrée du menu content#:#lm_menu_entry_target#:#Cible content#:#lm_menu_entry_title#:#Titre @@ -7173,7 +7173,7 @@ content#:#mob_upload_dir_info#:#Dossier du serveur dans lequel les médias peuve content#:#msg_entry_added#:#Entrée de menu ajoutée content#:#msg_entry_removed#:#Entrée de menu supprimée content#:#msg_entry_updated#:#Entrée de menu mise à jour -content#:#msg_no_page_access#:#You do not have the permission to access this page.###07 02 2020 new variable +content#:#msg_no_page_access#:#You do not have the permission to access this page. content#:#msg_page_no_public_access#:#La page demandée n'est pas disponible dans l'espace public. Seuls les utilisateurs enregistrés peuvent accéder à cette page. content#:#msg_page_not_public#:#La page n'est pas publique content#:#offline_mode_manager#:#Mode déconnecté @@ -7216,7 +7216,7 @@ content#:#stop_user_offline_mode#:#Arrêter le mode déconnecté content#:#stop_user_offline_mode_for_user#:#Arrêter le mode déconnecté pour content#:#text_repr#:#Texte de Substitution content#:#text_repr_info#:#Attribut "alt" utilisé pour l'image. -copa#:#copa_activation_online_info#:#Set the Content Page online to make it visible and available to other users. If not, only administrators will have access to it.###31 03 2023 new variable +copa#:#copa_activation_online_info#:#Set the Content Page online to make it visible and available to other users. If not, only administrators will have access to it.###31 10 2023 new variable copa#:#copa_add#:#Add Content Page copa#:#copa_btn_lp_toggle_state_completed#:#Set Not Completed copa#:#copa_btn_lp_toggle_state_not_completed#:#Set Completed @@ -7224,36 +7224,36 @@ copa#:#copa_copy#:#Copy Content Page copa#:#copa_edit#:#Edit Content Page copa#:#copa_import#:#Import Content Page copa#:#copa_new#:#Create Content Page -copa#:#copa_page_type_copa#:#Content Page###30 04 2021 new variable -copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable -copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable -copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable +copa#:#copa_page_type_copa#:#Content Page +copa#:#copa_prop_reading_time#:#Reading Time +copa#:#copa_value_reading_time_f_p#:#%s Minutes +copa#:#copa_value_reading_time_f_s#:#%s Minute copa#:#obj_copa_duplicate#:#Duplicate Content Page -copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable -copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable -copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable +copg#:#copg_allow_html#:#Enable HTML/Javascript +copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version. +copg#:#copg_an_error_occured#:#An error occured. copg#:#copg_confirm_el_deletion#:#Voulez-vous vraiment supprimer les éléments sélectionnés? -copg#:#copg_cron_days#:#Delete pages older than###31 03 2023 new variable -copg#:#copg_cron_days_info#:#Page history entries older than this period will be deleted.###31 03 2023 new variable -copg#:#copg_cron_keep_entries#:#Keep Minimum###31 03 2023 new variable -copg#:#copg_cron_keep_entries_info#:#This number is the minimum of entries that will be kept, even if they are older than the deletion period.###31 03 2023 new variable -copg#:#copg_days#:#Days###31 03 2023 new variable -copg#:#copg_details#:#Details###30 04 2021 new variable -copg#:#copg_entries#:#Entries###31 03 2023 new variable -copg#:#copg_error#:#Error###30 04 2021 new variable -copg#:#copg_error_occured_modal#:#An error occured while processing the page. Hit "Reload Page" to return to the previously saved state.###29 06 2022 new variable -copg#:#copg_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable -copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new variable -copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable -copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable -copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_cron_days#:#Delete pages older than###31 10 2023 new variable +copg#:#copg_cron_days_info#:#Page history entries older than this period will be deleted.###31 10 2023 new variable +copg#:#copg_cron_keep_entries#:#Keep Minimum###31 10 2023 new variable +copg#:#copg_cron_keep_entries_info#:#This number is the minimum of entries that will be kept, even if they are older than the deletion period.###31 10 2023 new variable +copg#:#copg_days#:#Days###31 10 2023 new variable +copg#:#copg_details#:#Details +copg#:#copg_entries#:#Entries###31 10 2023 new variable +copg#:#copg_error#:#Error +copg#:#copg_error_occured_modal#:#An error occured while processing the page. Hit "Reload Page" to return to the previously saved state. +copg#:#copg_est_reading_time#:#Estimated Reading Time###31 10 2023 new variable +copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 10 2023 new variable +copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 10 2023 new variable +copg#:#copg_page_element_not_found#:#Page element not found. +copg#:#copg_page_type_stys#:#Layout Page copg#:#copg_questions_not_supported_here#:#Les questions ne sont pas supportées dans ce contexte. -copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable +copg#:#copg_reload_page#:#Reload Page copg#:#copg_sec_link_info#:#Si vous définissez un lien sur toute la section, veuillez vous assurer qu’aucun autre élément interactif n’est inclus dans la section. Autrement, son comportement peut être irrégulier. copg#:#copg_snippet_cannot_be_edited#:#Il s'agit d’un extrait du contenu prédéfini et il ne peut pas être édité ici. -copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable -cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable -cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable +copg#:#copg_x_minutes#:#%s minute(s)###31 10 2023 new variable +cpad#:#cpad_reading_time_status#:#Reading Time +cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed. cptch#:#cptch_freetype_support_needed#:#Pour utiliser cette fonction, vous devez activer le support de FreeType dans PHP. cptch#:#cptch_wrong_input#:#Mauvaise Saisie cron#:#cro_job_rc_job_auto_deactivation_time_limit#:#PROBABLY CRASHED @@ -7348,7 +7348,7 @@ crs#:#crs_auto_notification#:#Notification des Nouveaux Membres crs#:#crs_auto_notification_info#:#Les nouveaux membres reçoivent un mail dès leur inscription au cours. crs#:#crs_awrn_current_course#:#Cours actuel crs#:#crs_awrn_current_course_info#:#Si l’utilisateur navigue vers un cours dans le répertoire, tous les membres du cours sont listés. -crs#:#crs_awrn_support_contacts#:#Support de tutoriel +crs#:#crs_awrn_support_contacts#:#Tutoriel d'aide crs#:#crs_awrn_support_contacts_info#:#Tous les contacts de support de tutoriel des cours avec une affiliation de l’utilisateur actuel sont listés. Les utilisateurs sont définis comme des contacts de support de tutoriel dans l'onglet des membres du cours en question. crs#:#crs_blocked#:#Accès Refusé crs#:#crs_blocked_member#:#Inscription bloquée pour le cours "%s" @@ -7441,7 +7441,7 @@ crs#:#crs_link_show_all_next_sessions#:#Montrer toutes les sessions à venir crs#:#crs_link_show_all_prev_sessions#:#Montrer toutes les sessions précédentes crs#:#crs_lobj_pm_min_goal#:#Required Score crs#:#crs_lobj_pm_score#:#Your Result -crs#:#crs_loc_btn_new_assignment#:#Neue Testzuordnung +crs#:#crs_loc_btn_new_assignment#:#Nouvelle affectation de test crs#:#crs_loc_confirm_delete_tst#:#Voulez-vous vraiment concevoir le test ce cours axé sur l'objectif d'apprentissage? crs#:#crs_loc_delete_assignment#:#Delete Assignment crs#:#crs_loc_err_no_active_it#:#Objectifs d'apprentissage sans essai initial @@ -7468,7 +7468,7 @@ crs#:#crs_loc_form_tst_new_qualified_info#:#-- crs#:#crs_loc_itest_info#:#Test initial crs#:#crs_loc_itst_for_objective#:#Test initial «%1$s» crs#:#crs_loc_learning_objective#:#Objectif d'apprentissage -crs#:#crs_loc_mem_show_res#:#Testergebnisse anzeigen +crs#:#crs_loc_mem_show_res#:#Afficher les résultats des tests crs#:#crs_loc_num_qst#:#Nombre de questions crs#:#crs_loc_objective_passed_confirmation#:#Sie haben das Lernziel bereits bestanden. Ein erneutes Starten des Tests setzt die Ergebnisse zurück. Wollen Sie den Test erneut starten? crs#:#crs_loc_objectives_passed_confirmation#:#Sie haben bereits alle Lernziel bestanden. Ein erneutes Starten des Tests setzt die Ergebnisse zurück. Wollen Sie den Test erneut starten? @@ -7542,8 +7542,8 @@ crs#:#crs_loc_tst_qpls#:#Pools de questions disponibles: crs#:#crs_loc_tst_resume#:#Testdurchlauf fortsetzen crs#:#crs_loc_tst_start#:#Test starten crs#:#crs_loc_tt_info#:#Vous avez atteint %1$d%%. Le test est réussi avec %2$d%%. -crs#:#crs_loc_type_initial_all_info#:#todo -crs#:#crs_loc_type_qualified_info#:#todo +crs#:#crs_loc_type_initial_all_info#:#Sur la base des résultats individuels du test initial, ILIAS recommande un contenu d'apprentissage pour les objectifs d'apprentissage qui ne sont pas encore suffisants. Le test de performance final permet d'évaluer si un participant au test maîtrise déjà les objectifs d'apprentissage ou si un apprentissage et une formation supplémentaires sont nécessaires. +crs#:#crs_loc_type_qualified_info#:#Le cours commence par un test qui permet d'évaluer si le participant a déjà maîtrisé les objectifs d'apprentissage. Pour tous les objectifs d'apprentissage réussis, les utilisateurs n'ont pas besoin de travailler sur le contenu d'apprentissage ou de passer d'autres tests. Pour tous les objectifs d'apprentissage non encore maîtrisés, ILIAS recommande un contenu d'apprentissage. La maîtrise des objectifs d'apprentissage restants est testée lors d'un test supplémentaire. crs#:#crs_mail_all#:#Pour tous les Participants crs#:#crs_mail_all_info#:#Les membres, administrateurs et tuteurs peuvent utiliser la fonction "Envoyer un Message aux Membres" dans l'onglet "Membres". crs#:#crs_mail_context_member_info#:#For the contact emails on the info screen of a course @@ -7574,8 +7574,8 @@ crs#:#crs_members_groups#:#Répartition par groupes crs#:#crs_members_map#:#Carte des Membres du Cours crs#:#crs_members_print_title#:#Membres du cours crs#:#crs_min_one_admin#:#Il existe au moins un administrateur assigné à ce cours. -crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable -crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable +crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups +crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible. crs#:#crs_new_status#:#Votre nouveau statut est : crs#:#crs_new_subscription#:#Nouvel abonnement au cours "%s" crs#:#crs_new_subscription_body#:#Un nouvel utilisateur "%s" a été inscrit @@ -7625,16 +7625,16 @@ crs#:#crs_objective_pretest#:#Après test initial crs#:#crs_objective_qst_summary#:#Aperçu de l'assignation de la question crs#:#crs_objective_random_warn#:#Vous ne pouvez pas utiliser de tests aléatoires en combinaison avec des objectifs d'apprentissage. crs#:#crs_objective_result#:#Après le test final -crs#:#crs_objective_result_details#:#« Show Details###30 04 2021 new variable -crs#:#crs_objective_result_summary_initial#:#Placement Test: %1$s (%2$s required)###30 04 2021 new variable -crs#:#crs_objective_result_summary_qualifying#:#Achievement Test: %1$s (%2$s required)###30 04 2021 new variable +crs#:#crs_objective_result_details#:#« Show Details +crs#:#crs_objective_result_summary_initial#:#Placement Test: %1$s (%2$s required) +crs#:#crs_objective_result_summary_qualifying#:#Achievement Test: %1$s (%2$s required) crs#:#crs_objective_saved_sorting#:#Tri enregistré. crs#:#crs_objective_self_assessment#:#Test initial crs#:#crs_objective_status#:#Statut de l'objectif crs#:#crs_objective_status_configure#:#Configure Learning Objective Oriented Course crs#:#crs_objective_status_itest#:#Configure Initial Test crs#:#crs_objective_status_materials#:#Create New Course Materials -crs#:#crs_objective_status_materials_info#:#The course is currently empty. Add course materials that can be assigned to learning objectives.###31 03 2023 new variable +crs#:#crs_objective_status_materials_info#:#The course is currently empty. Add course materials that can be assigned to learning objectives.###31 10 2023 new variable crs#:#crs_objective_status_objective_creation#:#Créer Objectif d'apprentissage crs#:#crs_objective_status_objectives#:#Configurer Objectifs d'apprentissage crs#:#crs_objective_status_qtest#:#Configure Qualifying Test @@ -7660,7 +7660,7 @@ crs#:#crs_objectives_reset_sure#:#Vous voulez supprimer tous les résultats de c crs#:#crs_objectives_reseted#:#Résultats réinitialisés. crs#:#crs_open#:#Ouvrir cours crs#:#crs_other_resources#:#Autres Ressources -crs#:#crs_page_type_lobj#:#Learning Objective Page###30 04 2021 new variable +crs#:#crs_page_type_lobj#:#Learning Objective Page crs#:#crs_passed#:#Validé crs#:#crs_passed_status_manual_by#:#Manuel par crs#:#crs_passed_status_system#:#Système @@ -7668,16 +7668,16 @@ crs#:#crs_password_not_valid#:#Votre mot de passe n'est pas valide crs#:#crs_password_required#:#Cette procédure d'inscription nécessite un mot de passe. crs#:#crs_pdf#:#PDF crs#:#crs_period#:#Durée du Cours -crs#:#crs_period_end_mail_placeholder#:#Period End###07 02 2020 new variable +crs#:#crs_period_end_mail_placeholder#:#Period End crs#:#crs_period_info#:#Indiquer la date de début et de fin du cours -crs#:#crs_period_start_mail_placeholder#:#Period Start###07 02 2020 new variable +crs#:#crs_period_start_mail_placeholder#:#Period Start crs#:#crs_presentation_type#:#Type de Présentation crs#:#crs_print_list#:#Feuille de Présence -crs#:#crs_ref_delete_confirmation_info#:#Would you like to remove the following members from this course? If these members are to be removed from courses linked into this course, please activate the respective checkboxes.###07 02 2020 new variable -crs#:#crs_ref_member_update#:#Neue Mitglieder hinzufügen###07 02 2020 new variable -crs#:#crs_ref_member_update_info#:#Alle neuen Mitglieder des übergeordneten Kurses werden automatisch in den Kurs, auf den dieser Kurs-Link verweist, eingetragen.###07 02 2020 new variable -crs#:#crs_ref_missing_access#:#Die Option kann nicht ausgewählt werden, da Sie nicht die Berechtigung "Mitglieder verwalten" für beide Kurse besitzen.###07 02 2020 new variable -crs#:#crs_ref_missing_parent_crs#:#Die Option kann nicht ausgewählt werden, da dieser Kurs-Link keinen übergeordneten Kurs besitzt.###07 02 2020 new variable +crs#:#crs_ref_delete_confirmation_info#:#Would you like to remove the following members from this course? If these members are to be removed from courses linked into this course, please activate the respective checkboxes. +crs#:#crs_ref_member_update#:#Neue Mitglieder hinzufügen +crs#:#crs_ref_member_update_info#:#Alle neuen Mitglieder des übergeordneten Kurses werden automatisch in den Kurs, auf den dieser Kurs-Link verweist, eingetragen. +crs#:#crs_ref_missing_access#:#Die Option kann nicht ausgewählt werden, da Sie nicht die Berechtigung "Mitglieder verwalten" für beide Kurse besitzen. +crs#:#crs_ref_missing_parent_crs#:#Die Option kann nicht ausgewählt werden, da dieser Kurs-Link keinen übergeordneten Kurs besitzt. crs#:#crs_reg#:#Paramètres d'Inscription crs#:#crs_reg_code#:#Lien d'Inscription crs#:#crs_reg_code_enabled_info#:#Si cochée, un enregistrement automatique est possible en utilisant un lien particulier d'enregistrement. @@ -7755,10 +7755,10 @@ crs#:#crs_sure_delete_selected_archives#:#Etes-vous sûr de vouloir supprimer le crs#:#crs_syllabus#:#Cursus crs#:#crs_sys_default#:#System Default crs#:#crs_table_start_objects#:#Objets de Démarrage -crs#:#crs_target_group#:#Target Group###07 02 2020 new variable -crs#:#crs_tile_and_objective_view_not_supported#:#You cannot activate both "Tile Presentation" and "Learning Objectives Presentation" at the same time.###07 02 2020 new variable -crs#:#crs_tile_and_session_limit_not_supported#:#You cannot activate both "Tile Presentation" and "Session Limitation" at the same time.###07 02 2020 new variable -crs#:#crs_timing_err_start_end#:#The end date must be greater than or equals the start date.###30 04 2021 new variable +crs#:#crs_target_group#:#Target Group +crs#:#crs_tile_and_objective_view_not_supported#:#You cannot activate both "Tile Presentation" and "Learning Objectives Presentation" at the same time. +crs#:#crs_tile_and_session_limit_not_supported#:#You cannot activate both "Tile Presentation" and "Session Limitation" at the same time. +crs#:#crs_timing_err_start_end#:#The end date must be greater than or equals the start date. crs#:#crs_timings_activate_optional#:#Optional mode for course timings crs#:#crs_timings_activate_optional_own#:#Optional mode for my course timings crs#:#crs_timings_availability_enabled#:#Disponible Temporairement @@ -7768,7 +7768,7 @@ crs#:#crs_timings_days_after_subsription#:#Day(s) after course subscription crs#:#crs_timings_disabled#:#Chronologie Désactivée crs#:#crs_timings_disabled_info#:#Choisir cette option pour désactiver les minutages. crs#:#crs_timings_early_begin#:#Au Plus Tôt -crs#:#crs_timings_edit_personal#:#Edit Personal Timings###07 02 2020 new variable +crs#:#crs_timings_edit_personal#:#Edit Personal Timings crs#:#crs_timings_end#:#Fin crs#:#crs_timings_from_until#:#(Depuis/Jusqu'à) crs#:#crs_timings_in_days#:#(En Jours) @@ -7786,12 +7786,12 @@ crs#:#crs_timings_short_active#:#Activé crs#:#crs_timings_short_active_tt#:#Activate Timings crs#:#crs_timings_short_changeable#:#Modifiable crs#:#crs_timings_short_changeable_tt#:#Timings changeable by participants -crs#:#crs_timings_short_end#:#End Date###07 02 2020 new variable +crs#:#crs_timings_short_end#:#End Date crs#:#crs_timings_short_limit_start_end#:#Au Plus Tard (Date) crs#:#crs_timings_short_limit_start_end_tt#:#Latest end crs#:#crs_timings_short_limit_start_end_tt_rel#:#Latest end in days after course subscription crs#:#crs_timings_short_start_end#:#Recommandation -crs#:#crs_timings_short_start_end_rel#:#Suggested Start (in days)###07 02 2020 new variable +crs#:#crs_timings_short_start_end_rel#:#Suggested Start (in days) crs#:#crs_timings_short_start_end_tt#:#Suggested start crs#:#crs_timings_short_start_end_tt_rel#:#Suggested start after course subscription crs#:#crs_timings_start#:#Début @@ -7827,19 +7827,19 @@ crs#:#crs_users_removed_from_list#:#Les utilisateurs sélectionnés ont été re crs#:#crs_usr_agreement#:#Accord d’utilisation crs#:#crs_view_info_objective#:#Ce mode est utilisé pour la présentation des objectifs pédagogiques. crs#:#crs_view_info_timing#:#Mode de présentation pour le réglage de la chronologie. -crs#:#crs_view_info_timing_absolute#:#Start and end date will be set absolute.###07 02 2020 new variable -crs#:#crs_view_info_timing_relative#:#Start and end date will be set relative to the subscription date.###07 02 2020 new variable +crs#:#crs_view_info_timing_absolute#:#Start and end date will be set absolute. +crs#:#crs_view_info_timing_relative#:#Start and end date will be set relative to the subscription date. crs#:#crs_view_mode#:#Présentation du Cours crs#:#crs_view_objective#:#Vue par Objectifs Pédagogiques crs#:#crs_view_timing#:#Vue par Chronologie -crs#:#crs_view_timing_absolute#:#Absolute Dates###07 02 2020 new variable -crs#:#crs_view_timing_relative#:#Relative Dates###07 02 2020 new variable -crs#:#crs_view_timings#:#Timings View Type###07 02 2020 new variable -crs#:#crs_visibility#:#Visibility###24 11 2022 new variable +crs#:#crs_view_timing_absolute#:#Absolute Dates +crs#:#crs_view_timing_relative#:#Relative Dates +crs#:#crs_view_timings#:#Timings View Type +crs#:#crs_visibility#:#Visibility crs#:#crs_visibility_limitless#:#Illimité crs#:#crs_visibility_until#:#Disponible Temporairement crs#:#crs_visibility_until_info#:#Le cours sera visible à ses membres dans une période de temps spécifique. -crs#:#crs_visibility_unvisible#:#The course is not visible.###24 11 2022 new variable +crs#:#crs_visibility_unvisible#:#The course is not visible. crs#:#crs_wait_info#:#Les nouvelles demandes d'inscription seront placées en liste d'attente si le nombre maximum d'utilisateurs est atteint. crs#:#crs_waiting_list#:#Liste d'Attente crs#:#crs_waiting_list_autofill#:#Avec Liste d'Attente @@ -7900,12 +7900,12 @@ crs#:#event_user_selection_include_waiting_list#:#Inclure tous les utilisateurs crs#:#events#:#Sessions crs#:#export_members#:#Exporter Participants crs#:#grouping_change_assignment#:#Modifier Assignation -crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups. crs#:#mem_cron_min_members_intro#:#Les cours et les groupes suivants ne respectent pas le nombre minimum de membres (encore). crs#:#mem_cron_min_members_reason#:#Vous recevez ce message parce que vous avez activé la notification dans l'onglet membres. crs#:#mem_cron_min_members_subject#:#Cours / Groupe: Vérification du Nombre Minimum des Membres crs#:#mem_cron_min_members_task#:#Veuillez informer les participants si le cours n’aura pas lieu en raison du manque de participants. Ajuster les paramètres par la suite. -crs#:#obj_count_members#:#Number of members###31 03 2023 new variable +crs#:#obj_count_members#:#Number of members###31 10 2023 new variable crs#:#sess_attendance_list#:#Feuille de présence crs#:#sess_gen_attendance_list#:#Générer feuille de présence crs#:#sess_join_info#:#Veuillez cliquer sur le Join button si vous désirez prendre part à cette session @@ -7924,14 +7924,14 @@ crs#:#timing_tutor_visible#:#La remarque est visible par les tuteurs du cours crs#:#timing_user_accept#:#Accepter la Chronologie crs#:#timing_user_accepted#:#Chronologie Accepté crs#:#timings#:#Chronologie -crs#:#timings_cron_reminder_exceeded_start#:#Der Bearbeitungszeitraum ist überfällig bei:###07 02 2020 new variable -crs#:#timings_cron_reminder_exceeded_subject#:#Sie haben den Bearbeitungszeitraum überschritten###07 02 2020 new variable -crs#:#timings_cron_reminder_freshly_start#:#Der Bearbeitungszeitraum hat begonnen bei:###07 02 2020 new variable -crs#:#timings_cron_reminder_started_subject#:#Der Bearbeitungszeitraum hat begonnen###07 02 2020 new variable +crs#:#timings_cron_reminder_exceeded_start#:#Der Bearbeitungszeitraum ist überfällig bei: +crs#:#timings_cron_reminder_exceeded_subject#:#Sie haben den Bearbeitungszeitraum überschritten +crs#:#timings_cron_reminder_freshly_start#:#Der Bearbeitungszeitraum hat begonnen bei: +crs#:#timings_cron_reminder_started_subject#:#Der Bearbeitungszeitraum hat begonnen crs#:#timings_edit#:#Editer Chronologie crs#:#timings_of#:#Chronologie Désactivée -crs#:#timings_reminder_notifications#:#Course Timings Notifications###07 02 2020 new variable -crs#:#timings_reminder_notifications_info#:#If enabled, course participants will be notified about exceeded timing materials.###07 02 2020 new variable +crs#:#timings_reminder_notifications#:#Course Timings Notifications +crs#:#timings_reminder_notifications_info#:#If enabled, course participants will be notified about exceeded timing materials. crs#:#timings_timings#:#Chronologie crs#:#timings_timings_off#:#Fermer la Gestion de Chronologie crs#:#timings_timings_on#:#Ouvrir la Gestion de Chronologie @@ -7942,43 +7942,43 @@ crs#:#tutor_phone#:#Téléphone crs#:#user_fields#:#Champs Utilisateur crsv#:#crsv_create#:#Créer Certificat de Cours crsv#:#crsv_create_info#:#Sélectionner un cours terminé pour générer le certificat -dash#:#dash_activation#:#activation###07 02 2020 new variable -dash#:#dash_added_to_favs#:#Recommendation has been added to personal favourites.###07 02 2020 new variable -dash#:#dash_avail_presentation#:#Available Presentations###07 02 2020 new variable -dash#:#dash_avail_sortation#:#Available Sortations###07 02 2020 new variable -dash#:#dash_click_here#:#Click here###07 02 2020 new variable -dash#:#dash_dashboard#:#Dashboard###07 02 2020 new variable -dash#:#dash_default_presentation#:#Default Presentation###07 02 2020 new variable -dash#:#dash_default_sortation#:#Default Sortation###07 02 2020 new variable -dash#:#dash_enable_cal#:#Calendar###07 02 2020 new variable -dash#:#dash_enable_favourites#:#Favourites###07 02 2020 new variable -dash#:#dash_enable_mail#:#Mail###07 02 2020 new variable -dash#:#dash_enable_memberships#:#My Courses and Groups###07 02 2020 new variable -dash#:#dash_enable_news#:#News###07 02 2020 new variable -dash#:#dash_enable_task#:#Tasks###07 02 2020 new variable -dash#:#dash_favourites#:#Favourites###07 02 2020 new variable -dash#:#dash_info_sure_remove_from_favs#:#Are you sure you want to remove the following objects from your Favourites?###07 02 2020 new variable -dash#:#dash_item_removed#:#Recommendation has been removed from the list.###07 02 2020 new variable -dash#:#dash_learningsequences#:#My Learning Sequences###07 02 2020 new variable -dash#:#dash_list#:#List###07 02 2020 new variable -dash#:#dash_main_panel#:#Main Panel###07 02 2020 new variable -dash#:#dash_make_favourite#:#Add to Favourites###07 02 2020 new variable -dash#:#dash_member_main_alt#:#Courses and groups can also be configured as a separate main menu entry.###07 02 2020 new variable -dash#:#dash_memberships#:#My Courses and Groups###07 02 2020 new variable -dash#:#dash_presentation#:#Presentation###07 02 2020 new variable -dash#:#dash_remove_from_list#:#Remove from List###07 02 2020 new variable -dash#:#dash_side_panel#:#Side Panel###07 02 2020 new variable -dash#:#dash_sort_by_alphabet#:#Sort by Alphabet###31 03 2023 new variable -dash#:#dash_sort_by_location#:#Sort by Location###07 02 2020 new variable -dash#:#dash_sort_by_start_date#:#Sort by Start Date###07 02 2020 new variable -dash#:#dash_sort_by_type#:#Sort by Type###07 02 2020 new variable -dash#:#dash_sortation#:#Sortation###07 02 2020 new variable -dash#:#dash_studyprogramme#:#My Study Programmes###07 02 2020 new variable -dash#:#dash_tile#:#Tile###07 02 2020 new variable -dash#:#dash_view_courses_groups#:#Section ‘My Courses and Groups’###07 02 2020 new variable -dash#:#dash_view_favourites#:#Section ‘Favourites’###07 02 2020 new variable -dash#:#favourites_disabled_info#:#Add to favorites is deactivated. You may change this inside the repository settings.###28 07 2023 new variable -dash#:#memberships_disabled_info#:#Subscriptions are deactivated. You may change this inside the course settings.###28 07 2023 new variable +dash#:#dash_activation#:#activation +dash#:#dash_added_to_favs#:#Recommendation has been added to personal favourites. +dash#:#dash_avail_presentation#:#Available Presentations +dash#:#dash_avail_sortation#:#Available Sortations +dash#:#dash_click_here#:#Click here +dash#:#dash_dashboard#:#Tableau de bord +dash#:#dash_default_presentation#:#Default Presentation +dash#:#dash_default_sortation#:#Default Sortation +dash#:#dash_enable_cal#:#Calendar +dash#:#dash_enable_favourites#:#Favourites +dash#:#dash_enable_mail#:#Mail +dash#:#dash_enable_memberships#:#My Courses and Groups +dash#:#dash_enable_news#:#News +dash#:#dash_enable_task#:#Tasks +dash#:#dash_favourites#:#Favoris +dash#:#dash_info_sure_remove_from_favs#:#Are you sure you want to remove the following objects from your Favourites? +dash#:#dash_item_removed#:#Recommendation has been removed from the list. +dash#:#dash_learningsequences#:#My Learning Sequences +dash#:#dash_list#:#List +dash#:#dash_main_panel#:#Main Panel +dash#:#dash_make_favourite#:#Ajouter aux favoris +dash#:#dash_member_main_alt#:#Courses and groups can also be configured as a separate main menu entry. +dash#:#dash_memberships#:#Mes cours et groupes +dash#:#dash_presentation#:#Presentation +dash#:#dash_remove_from_list#:#Retirer de la liste +dash#:#dash_side_panel#:#Side Panel +dash#:#dash_sort_by_alphabet#:#Sort by Alphabet###31 10 2023 new variable +dash#:#dash_sort_by_location#:#Trier par lieu +dash#:#dash_sort_by_start_date#:#Trier par date de début +dash#:#dash_sort_by_type#:#Trier par type +dash#:#dash_sortation#:#Sortation +dash#:#dash_studyprogramme#:#My Study Programmes +dash#:#dash_tile#:#Tile +dash#:#dash_view_courses_groups#:#Section ‘My Courses and Groups’ +dash#:#dash_view_favourites#:#Section ‘Favourites’ +dash#:#favourites_disabled_info#:#Add to favorites is deactivated. You may change this inside the repository settings. +dash#:#memberships_disabled_info#:#Subscriptions are deactivated. You may change this inside the course settings. dateplaner#:#Fr_long#:#Vendredi dateplaner#:#Fr_short#:#Ve dateplaner#:#Mo_long#:#Lundi @@ -7986,7 +7986,7 @@ dateplaner#:#Mo_short#:#Lu dateplaner#:#Sa_long#:#Samedi dateplaner#:#Sa_short#:#Sa dateplaner#:#Su_long#:#Dimanche -dateplaner#:#Su_short#:#Di +dateplaner#:#Su_short#:#Dim dateplaner#:#Text#:#Texte dateplaner#:#Th_long#:#Jeudi dateplaner#:#Th_short#:#Je @@ -7996,31 +7996,31 @@ dateplaner#:#We_long#:#Mercredi dateplaner#:#We_short#:#Me dateplaner#:#add_appointment#:#Ajouter Evènement dateplaner#:#app_consultation_hours#:#Heures de Consultation -dateplaner#:#app_day#:#Vue Journalière -dateplaner#:#app_month#:#Vue Mensuelle -dateplaner#:#app_week#:#Vue Hebdomadaire +dateplaner#:#app_day#:#Vue journalière +dateplaner#:#app_month#:#Vue mensuelle +dateplaner#:#app_week#:#Vue hebdomadaire dateplaner#:#apply#:#Valider dateplaner#:#back#:#Retour dateplaner#:#back_to_crs#:#Go to Course dateplaner#:#back_to_grp#:#Go to Group dateplaner#:#back_to_pd#:#Back to Personal Desktop -dateplaner#:#btn_ical#:#iCal###07 02 2020 new variable +dateplaner#:#btn_ical#:#iCal dateplaner#:#c_date#:#Créer Evènement dateplaner#:#cal_accepted#:#Accepté -dateplaner#:#cal_add_appointment#:#Créer Evènement -dateplaner#:#cal_add_calendar#:#Ajouter Agenda +dateplaner#:#cal_add_appointment#:#Créer un évènement +dateplaner#:#cal_add_calendar#:#Ajouter un calendrier dateplaner#:#cal_add_category#:#Créer Nouvel Agenda dateplaner#:#cal_add_milestone#:#Ajouter étape dateplaner#:#cal_adm_notification_info#:#Choisir cette option pour envoyer une notification des changements affectant les évènements aux membres du groupe ou du cours. dateplaner#:#cal_adm_notification_user_info#:#Cette option permet d'envoyer des notifications aux utilisateurs sélectionnés. -dateplaner#:#cal_agenda#:#Agenda -dateplaner#:#cal_all_day#:#Toute la journée -dateplaner#:#cal_app_info#:#Informations concernant les rendez-vous -dateplaner#:#cal_app_other_materials_num#:#View other materials###30 04 2021 new variable +dateplaner#:#cal_agenda#:#Calendrier +dateplaner#:#cal_all_day#:#Jour entier +dateplaner#:#cal_app_info#:#Information sur les dates du calendrier +dateplaner#:#cal_app_other_materials_num#:#View other materials dateplaner#:#cal_appointments#:#Evènement(s) -dateplaner#:#cal_apps#:#Nombre d'Evènements +dateplaner#:#cal_apps#:#Nombre d'évènements dateplaner#:#cal_assigned_appointments#:#Evènements Assignés -dateplaner#:#cal_back_to_cal#:#Retour à l'agenda +dateplaner#:#cal_back_to_cal#:#Retour au calendrier dateplaner#:#cal_back_to_list#:#Retour à la Liste dateplaner#:#cal_back_to_search#:#Retour à la Recherche dateplaner#:#cal_batch_file_downloads#:#Téléchargements de fichiers Batch dans le calendrier @@ -8045,7 +8045,7 @@ dateplaner#:#cal_cal_deleted#:#Les agendas ont été supprimés dateplaner#:#cal_cal_details#:#Informations sur l'Agenda dateplaner#:#cal_cal_shared_with#:#Le calendrier des utilisateurs est partagé avec dateplaner#:#cal_cal_sync_success#:#Agenda synchronisé avec succès -dateplaner#:#cal_cal_synchronize#:#Synchroniser Agenda +dateplaner#:#cal_cal_synchronize#:#Synchroniser le calendrier dateplaner#:#cal_cal_type#:#Type d'Agenda dateplaner#:#cal_calendar_color#:#Couleur dateplaner#:#cal_calendar_download#:#Fichiers de calendrier @@ -8054,7 +8054,7 @@ dateplaner#:#cal_calendar_subscription_modal_title#:#Calendar Subscription dateplaner#:#cal_cancel_booking#:#Annuler la Réservation dateplaner#:#cal_cancel_booking_confirmed#:#La réservation a été annulée avec succès. dateplaner#:#cal_cancel_booking_info#:#Veuillez confirmer l'annulation de cette réservation. -dateplaner#:#cal_category_selection#:#Choix de l'Agenda +dateplaner#:#cal_category_selection#:#Choix du calendrier dateplaner#:#cal_cg_notification#:#Notification de Cours/Groupe dateplaner#:#cal_cg_registration_info#:#Permet aux utilisateurs de s'inscrire aux évènements des cours et groupes. dateplaner#:#cal_cg_registrations#:#Inscription aux rendez-vous de cours/groupe @@ -8119,7 +8119,7 @@ dateplaner#:#cal_ch_target_object_info#:#Restreindre les évènements à cet ob dateplaner#:#cal_ch_unknown_repository_object#:#Le Ref-ID de l'objet n'est pas valide. dateplaner#:#cal_ch_unknown_user#:#Le login saisi correspond à aucun utilisateur. dateplaner#:#cal_ch_user_assignment_failed_info#:#Le nombre maximum de rendez-vous a été atteint. -dateplaner#:#cal_change_calendar_view#:#Change Calendar View###09 03 2022 new variable +dateplaner#:#cal_change_calendar_view#:#Modifier la vue du calendrier dateplaner#:#cal_change_responsible_users#:#Modifier utilisateurs responsables dateplaner#:#cal_changed_events_header#:#Nouveaux Evènements et Evénements Modifiés dateplaner#:#cal_confirm_booking#:#Confirmer Réservation @@ -8133,25 +8133,25 @@ dateplaner#:#cal_create#:#Créer dateplaner#:#cal_created_appointment#:#Créer un nouvel évènement. dateplaner#:#cal_created_milestone#:#Etape ajoutée. dateplaner#:#cal_created_milestone_resp_q#:#Etape ajoutée. Veuillez sélectionner les utilisateurs responsables de l'étape à atteindre. -dateplaner#:#cal_cronjob_remote_description#:#If activated, appointments of the calendar type "Web calendar" are automatically synchronised after the specified time interval.###13 09 2023 new variable -dateplaner#:#cal_cronjob_remote_title#:#External Calendar Synchronisation###13 09 2023 new variable +dateplaner#:#cal_cronjob_remote_description#:#If activated, appointments of the calendar type "Web calendar" are automatically synchronised after the specified time interval.###31 10 2023 new variable +dateplaner#:#cal_cronjob_remote_title#:#External Calendar Synchronisation###31 10 2023 new variable dateplaner#:#cal_crs_info#:#Informations sur le cours dateplaner#:#cal_crs_new_notification_body#:#un nouvel évènement a été créé dans le cours "%s". dateplaner#:#cal_crs_new_notification_sub#:#Nouveau rendez-vous du cours "%" dateplaner#:#cal_crs_notification_body#:#un évènement a été modifié dans le cours "%s". dateplaner#:#cal_crs_notification_sub#:#Evènement Modifié dans le Cours "%s" -dateplaner#:#cal_crs_timing_end#:#Suggested End###07 02 2020 new variable -dateplaner#:#cal_crs_timing_start#:#Suggested Start###07 02 2020 new variable +dateplaner#:#cal_crs_timing_end#:#Suggested End +dateplaner#:#cal_crs_timing_start#:#Suggested Start dateplaner#:#cal_daily#:#Quotidienne dateplaner#:#cal_date_booked#:#Réservé dateplaner#:#cal_date_format_info#:#Veuilllez choisir un format pour la saisie des dates. -dateplaner#:#cal_day_end#:#Fin de Journée +dateplaner#:#cal_day_end#:#Fin de journée dateplaner#:#cal_day_of_month#:#Jour du mois dateplaner#:#cal_day_overview#:#Vue journée dateplaner#:#cal_day_s#:#Jour(s) dateplaner#:#cal_day_selection#:#Sélectionner jour -dateplaner#:#cal_day_start#:#Début de Journée -dateplaner#:#cal_day_week_view#:#Propriétés de la Vue Jour/Semaine +dateplaner#:#cal_day_start#:#Début de journée +dateplaner#:#cal_day_week_view#:#Paramètres de la vue Jour/Semaine dateplaner#:#cal_deadline#:#Date Limite dateplaner#:#cal_declined#:#Refusé dateplaner#:#cal_def_date_format#:#Formatage des Dates par Défaut @@ -8163,15 +8163,15 @@ dateplaner#:#cal_def_time_format#:#Formatage de l'Heure dateplaner#:#cal_def_time_format_info#:#Veuillez sélectionner un format de présentation des heures. dateplaner#:#cal_def_timezone#:#Fuseau Horaire par Défaut dateplaner#:#cal_def_timezone_info#:#Veuillez sélectionner un fuseau horaire par défaut pour la présentation des évènements. -dateplaner#:#cal_def_view#:#Default Calendar View###30 04 2021 new variable +dateplaner#:#cal_def_view#:#Default Calendar View dateplaner#:#cal_def_week_start#:#Début de Semaine -dateplaner#:#cal_default_calendar#:#Evènements Personnels -dateplaner#:#cal_default_settings#:#Default settings###30 04 2021 new variable +dateplaner#:#cal_default_calendar#:#Calendrier personnel +dateplaner#:#cal_default_settings#:#Default settings dateplaner#:#cal_del_app_sure#:#Etes-vous certain de vouloir supprimer les évènements sélectionnés ? dateplaner#:#cal_del_cal_sure#:#Etes-vous certain de vouloir supprimer les agendas sélectionnés ? dateplaner#:#cal_delete_app_sure#:#Désirez-vous supprimer les réservations suivantes ? dateplaner#:#cal_delete_cal#:#Fermer le calendrier -dateplaner#:#cal_delete_recurrence_rule#:#Delete Series of Appoinments###28 05 2021 new variable +dateplaner#:#cal_delete_recurrence_rule#:#Delete Series of Appoinments dateplaner#:#cal_delete_recurrences#:#Supprimer toutes les répétitions dateplaner#:#cal_delete_single#:#Supprimer uniquement cet évènement dateplaner#:#cal_deleted_app#:#Les rendez-vous sélectionnées ont été supprimés. @@ -8196,14 +8196,14 @@ dateplaner#:#cal_exc_info#:#Informations sur l’affectation dateplaner#:#cal_exc_inst_files#:#Fichiers d’instructions dateplaner#:#cal_exc_open#:#Ouvrir affectation dateplaner#:#cal_exc_peer_review_deadline#:#Échéance du retour -dateplaner#:#cal_export_timezone#:#
Fuseau horaire pour le Calendrier d'Exportation -dateplaner#:#cal_export_timezone_tz#:#Utilisez le Fuseau horaire ILIAS -dateplaner#:#cal_export_timezone_utc#:#Utilisez le Fuseau horaire UTC (compatible avec MS Outlook) +dateplaner#:#cal_export_timezone#:#Fuseau horaire pour le calendrier d'exportation +dateplaner#:#cal_export_timezone_tz#:#Utilisez le fuseau horaire ILIAS +dateplaner#:#cal_export_timezone_utc#:#Utilisez le fuseau horaire UTC (compatible avec MS Outlook) dateplaner#:#cal_fifth#:#Cinquième dateplaner#:#cal_first#:#Premier dateplaner#:#cal_fourth#:#Quatrième dateplaner#:#cal_fullday#:#Date/Heure -dateplaner#:#cal_fullday_title#:#Evènement sur Journée Entière +dateplaner#:#cal_fullday_title#:#Evènement sur journée entière dateplaner#:#cal_global_settings#:#Paramètres Généraux dateplaner#:#cal_grp_curr_crs#:#Cours actuel dateplaner#:#cal_grp_curr_crs_cons#:#Heures de consultation @@ -8227,8 +8227,8 @@ dateplaner#:#cal_last#:#Dernier dateplaner#:#cal_list#:#Liste dateplaner#:#cal_mail_notification_body#:#vous êtes invité à un évènement. dateplaner#:#cal_mail_notification_subject#:#Invitation à un Evènements : "%s" -dateplaner#:#cal_manage#:#Administrer -dateplaner#:#cal_materials#:#Materials###30 04 2021 new variable +dateplaner#:#cal_manage#:#Gérer le calendrier +dateplaner#:#cal_materials#:#Materials dateplaner#:#cal_milestone_settings#:#Tâches dateplaner#:#cal_month_overview#:#Aperçu Mensuel dateplaner#:#cal_month_s#:#Mois @@ -8236,12 +8236,12 @@ dateplaner#:#cal_month_selection#:#Sélectionner mois dateplaner#:#cal_monthly#:#Mensuelle dateplaner#:#cal_ms_details#:#Informations sur la Tâche dateplaner#:#cal_ms_users_responsible#:#Responsables utilisateurs -dateplaner#:#cal_new_app#:#Nouvel Evènement -dateplaner#:#cal_new_ms#:#Nouvelle Tâche -dateplaner#:#cal_no_ending#:#Aucune Date de Fin -dateplaner#:#cal_no_events_block#:#Es sind keine Termine für Sie vorhanden.###07 02 2020 new variable +dateplaner#:#cal_new_app#:#Nouvel évènement +dateplaner#:#cal_new_ms#:#Nouvelle tâche +dateplaner#:#cal_no_ending#:#Aucune date de fin +dateplaner#:#cal_no_events_block#:#Es sind keine Termine für Sie vorhanden. dateplaner#:#cal_no_events_info#:#Aucun évènement trouvé pour la période sélectionnée. -dateplaner#:#cal_no_recurrence#:#Aucune Répétition +dateplaner#:#cal_no_recurrence#:#Aucune répétition dateplaner#:#cal_notification#:#Message de Notification dateplaner#:#cal_notification_crsgrp#:#Notification des Membres de Cours/Groupes dateplaner#:#cal_notification_info#:#Si actif, tous les participants au cours/groupe peuvent être notifié par mail de ce rendez-vous. @@ -8251,9 +8251,9 @@ dateplaner#:#cal_on_the#:#Sur le : dateplaner#:#cal_open_calendar#:#Ouvrir le calendrier dateplaner#:#cal_origin#:#Origine dateplaner#:#cal_owner#:#Propriétaire -dateplaner#:#cal_period#:#Period###21 06 2023 new variable +dateplaner#:#cal_period#:#Période dateplaner#:#cal_rec_err_limit#:#Veuillez saisir un nombre valide de rendez-vous. -dateplaner#:#cal_recurrence_confirm_deletion#:#Please decide wether you want to delete single appointments or the complete series of appointments.###28 05 2021 new variable +dateplaner#:#cal_recurrence_confirm_deletion#:#Please decide wether you want to delete single appointments or the complete series of appointments. dateplaner#:#cal_recurrences#:#Répétitions dateplaner#:#cal_reg_register#:#S'inscrire dateplaner#:#cal_reg_registered#:#Vous avez été inscrit. @@ -8271,27 +8271,27 @@ dateplaner#:#cal_search_info_share#:#Veuillez saisir le nom de l'utilisateur ou dateplaner#:#cal_second#:#Seconde dateplaner#:#cal_server_tz#:#Fuseau Horaire du Serveur dateplaner#:#cal_sess_info#:#Informations sur la session -dateplaner#:#cal_setting_global_crs_act#:#Activation in Courses###30 04 2021 new variable -dateplaner#:#cal_setting_global_crs_act_info#:#If selected, the calendar is active in courses by default. In any case the calendar activation can be enabled/disabled in the course settings.###30 04 2021 new variable +dateplaner#:#cal_setting_global_crs_act#:#Activation in Courses +dateplaner#:#cal_setting_global_crs_act_info#:#If selected, the calendar is active in courses by default. In any case the calendar activation can be enabled/disabled in the course settings. dateplaner#:#cal_setting_global_crs_vis#:#Afficher dans les Cours dateplaner#:#cal_setting_global_crs_vis_info#:#Lorsque activé, l'affichage de l'agenda dans les cours est activé par défaut. Il reste toutefois possible de le désactiver dans les paramètres du cours. -dateplaner#:#cal_setting_global_grp_act#:#Activation in Groups###30 04 2021 new variable -dateplaner#:#cal_setting_global_grp_act_info#:#If selected, the calendar is active in groups by default. In any case the calendar activation can be enabled/disabled in the group settings.###30 04 2021 new variable +dateplaner#:#cal_setting_global_grp_act#:#Activation in Groups +dateplaner#:#cal_setting_global_grp_act_info#:#If selected, the calendar is active in groups by default. In any case the calendar activation can be enabled/disabled in the group settings. dateplaner#:#cal_setting_global_grp_vis#:#Afficher dans les Groupes dateplaner#:#cal_setting_global_grp_vis_info#:#Lorsque activé, l'affichage de l'agenda dans les groupes est activé par défaut. Il reste toutefois possible de le désactiver dans les paramètres du groupe. dateplaner#:#cal_setting_global_vis_repos#:#Agenda du Catalogue dateplaner#:#cal_share#:#Partager l'Agenda -dateplaner#:#cal_share_accept#:#Accepter Invitation +dateplaner#:#cal_share_accept#:#Accepter l'invitation dateplaner#:#cal_share_cal#:#Partager l'agenda dateplaner#:#cal_share_cal_editable#:#Partager Agenda (Lecture et Ecriture) -dateplaner#:#cal_share_decline#:#Décliner Invitation +dateplaner#:#cal_share_decline#:#Décliner l'invitation dateplaner#:#cal_share_search_header#:#Partager Agenda dateplaner#:#cal_share_search_role_header#:#Sélection du Rôle dateplaner#:#cal_share_search_usr_header#:#Sélection de l'Utilisateur dateplaner#:#cal_shared_access_read_only#:#Lecture seulement dateplaner#:#cal_shared_access_read_write#:#Lecture et Ecriture dateplaner#:#cal_shared_access_table_col#:#Accès -dateplaner#:#cal_shared_calendars#:#Agendas Partagés (Invitations) +dateplaner#:#cal_shared_calendars#:#Calendriers partagés (invitations) dateplaner#:#cal_shared_header#:#Agendas Partagés dateplaner#:#cal_shared_selected_usr#:#L'agenda est partagé avec les utilisateurs/rôles sélectionnés. dateplaner#:#cal_show_weeks#:#Montrer semaines @@ -8305,12 +8305,12 @@ dateplaner#:#cal_sync_cache#:#Cache de l'agenda dateplaner#:#cal_sync_cache_info#:#En cas d'activation, les évènements nouveaux ou modifiés de l'agenda seront calculés seulement toutes les x minutes. dateplaner#:#cal_sync_disabled#:#Désactivé dateplaner#:#cal_sync_enabled#:#Activé -dateplaner#:#cal_table_categories#:#Sélection d'agendas +dateplaner#:#cal_table_categories#:#Sélection de calendrier dateplaner#:#cal_task_completion#:#Achèvement de tà¢che dateplaner#:#cal_third#:#Troisième -dateplaner#:#cal_time_format_info#:#Veuillez choisir le format d'affichage de l'heure +dateplaner#:#cal_time_format_info#:#Veuillez choisir le format d'affichage de l'heure. dateplaner#:#cal_timezone_info#:#Veuillez choisir le fuseau horaire de la ville la plus proche. -dateplaner#:#cal_type_crs#:#Agenda de Cours +dateplaner#:#cal_type_crs#:#Calendrier de cours dateplaner#:#cal_type_exc#:#Calendrier des exercices dateplaner#:#cal_type_grp#:#Agenda de Groupe dateplaner#:#cal_type_info#:#Veuillez choisir un type d'agenda. Les "Agenda public" sont visibles pour tous les utilisateurs ILIAS. @@ -8319,29 +8319,29 @@ dateplaner#:#cal_type_personal#:#Agenda Privé dateplaner#:#cal_type_remote#:#Agenda Web dateplaner#:#cal_type_rl#:#Localisation de l'Agenda dateplaner#:#cal_type_sess#:#Agenda session -dateplaner#:#cal_type_system#:#Agenda Public -dateplaner#:#cal_type_tals#:#Talks###31 03 2023 new variable +dateplaner#:#cal_type_system#:#Calendrier public +dateplaner#:#cal_type_tals#:#Talks###31 10 2023 new variable dateplaner#:#cal_unshare#:#Annuler le Partage dateplaner#:#cal_unshare_cal#:#Stopper le Partage dateplaner#:#cal_unshared_selected_usr#:#Partage avec les utilisateurs sélectionnés annulé. dateplaner#:#cal_upcoming_events_header#:#Evènements à venir -dateplaner#:#cal_user_date_format#:#Format de Date -dateplaner#:#cal_user_notification#:#Notification Utilisateur +dateplaner#:#cal_user_date_format#:#Format de date +dateplaner#:#cal_user_notification#:#Notification utilisateur dateplaner#:#cal_user_notification_info#:#Les utilisateurs sélectionnés seront notifiés de cet évènement par email. Veuillez entrer des noms d'utilisateurs ILIAS ou adresses email. -dateplaner#:#cal_user_settings#:#Propriétés de l'Agenda -dateplaner#:#cal_user_time_format#:#Format d'Heure -dateplaner#:#cal_user_timezone#:#Fuseau Horaire -dateplaner#:#cal_usr_info#:#Appointment Information###07 02 2020 new variable +dateplaner#:#cal_user_settings#:#Paramètres du calendrier +dateplaner#:#cal_user_time_format#:#Format d'heure +dateplaner#:#cal_user_timezone#:#Fuseau horaire ILIAS +dateplaner#:#cal_usr_info#:#Appointment Information dateplaner#:#cal_usr_show_weeks#:#Montrer la colonne des semaines dateplaner#:#cal_usr_show_weeks_info#:#Active la colonne des semaines dans le bloc latéral du calendrier. dateplaner#:#cal_webcal_sync#:#Synchronisation d'Agenda Externe dateplaner#:#cal_webcal_sync_info#:#Synchroniser automatiquement les agendas externes toutes les x minutes. dateplaner#:#cal_week_abbrev#:#Sem. -dateplaner#:#cal_week_month_view#:#Propriétés de la Vue Semaine/Mois +dateplaner#:#cal_week_month_view#:#Paramètres de la vue Semaine/Mois dateplaner#:#cal_week_overview#:#Vue par semaine dateplaner#:#cal_week_s#:#Semaine(s) dateplaner#:#cal_week_selection#:#Sélectionner semaine -dateplaner#:#cal_week_start#:#Début de Semaine +dateplaner#:#cal_week_start#:#Début de semaine dateplaner#:#cal_weekday#:#Jour de Semaine dateplaner#:#cal_weekly#:#Hebdomadaire dateplaner#:#cal_where#:#Lieu @@ -8412,7 +8412,7 @@ dcl#:#dcl_changed_by#:#Modifié par dcl#:#dcl_checked#:#Coché. dcl#:#dcl_comments#:#Commentaires dcl#:#dcl_comments_desc#:#Affiche le nombre de commentaires pour une entrée. -dcl#:#dcl_configuration_complete#:#Configuration Complete###30 04 2021 new variable +dcl#:#dcl_configuration_complete#:#Configuration Complete dcl#:#dcl_confirm_delete_detailed_view_text#:#La vue des enregistrements de cette table sera supprimée définitivement. Les enregistrements et les champs ne seront pas modifiés. dcl#:#dcl_confirm_delete_detailed_view_title#:#Voulez-vous vraiment supprimer cette vue ? dcl#:#dcl_confirm_delete_field#:#Voulez-vous vraiment supprimer ce champ ? @@ -8424,7 +8424,7 @@ dcl#:#dcl_confirm_storing_records#:#Veuillez valider et confirmer votre entrée. dcl#:#dcl_confirm_storing_records_no_permission#:#Vous avez la permission de modifier le dossier par la suite. dcl#:#dcl_copy#:#Copier Collection de Données dcl#:#dcl_create_date#:#Date de création -dcl#:#dcl_create_entry_rules#:#Entry Creation###30 04 2021 new variable +dcl#:#dcl_create_entry_rules#:#Entry Creation dcl#:#dcl_create_field#:#Créer Champ dcl#:#dcl_create_fields#:#Veuillez créer au moins un champ dans l'onglet " Liste des champs ". dcl#:#dcl_creation_date#:#Date de création @@ -8439,13 +8439,13 @@ dcl#:#dcl_default_sort_field#:#Champ de triage par défaut dcl#:#dcl_default_sort_field_desc#:#Tabelle wird standardmässig nach dem ausgewählten Feld sortiert. dcl#:#dcl_default_sort_field_order#:#Ordre des champs de triage par défaut dcl#:#dcl_delete_fields#:#Supprimer champs -dcl#:#dcl_delete_fields_no_selection#:#Please select at least one field to delete###31 03 2023 new variable +dcl#:#dcl_delete_fields_no_selection#:#Please select at least one field to delete###31 10 2023 new variable dcl#:#dcl_delete_perm#:#Permission "Supprimer Entrée" dcl#:#dcl_delete_records#:#Delete records dcl#:#dcl_delete_tables#:#Supprimer les tableaux -dcl#:#dcl_delete_tables_no_selection#:#Please select at least one table to delete###31 03 2023 new variable +dcl#:#dcl_delete_tables_no_selection#:#Please select at least one table to delete###31 10 2023 new variable dcl#:#dcl_delete_views#:#Supprimer les vues -dcl#:#dcl_delete_views_no_selection#:#Please select at least one view to delete###31 03 2023 new variable +dcl#:#dcl_delete_views_no_selection#:#Please select at least one view to delete###31 10 2023 new variable dcl#:#dcl_deleted_records#:#Successfully deleted %s records dcl#:#dcl_desc#:#Ordre décroissant (DECR) dcl#:#dcl_description#:#Description du Champ @@ -8453,7 +8453,7 @@ dcl#:#dcl_detailed_view#:#Vue détaillée dcl#:#dcl_display_action_menu#:#Activer la possibilité de copier ou lier le module référencé dcl#:#dcl_display_record_alt#:#Afficher cette entrée dcl#:#dcl_edit#:#Editer Collection de Données -dcl#:#dcl_edit_entry_rules#:#Entry Editing###30 04 2021 new variable +dcl#:#dcl_edit_entry_rules#:#Entry Editing dcl#:#dcl_edit_field#:#Editer Champ dcl#:#dcl_edit_perm#:#Permission "Editer Entrée" dcl#:#dcl_edit_record#:#Editer Enregistrement @@ -8512,7 +8512,7 @@ dcl#:#dcl_limited#:#Période d'Ajout / Edition / Suppression Limitée dcl#:#dcl_limited_desc#:#Benutzer können Einträge nur bis zum gewählten Datum hinzufügen, bearbeiten und löschen. dcl#:#dcl_link_detail_page#:#Lier les entrées à une page détaillée dcl#:#dcl_list_fields#:#Champs -dcl#:#dcl_list_visibility_and_filter#:#Visibility and filter###07 02 2020 new variable +dcl#:#dcl_list_visibility_and_filter#:#Visibility and filter dcl#:#dcl_locked#:#Vérouillé dcl#:#dcl_locked_tooltip#:#Désactiver ce champ pour les utilisateurs à modifier. Ne comprend pas les rôles avec la permission "Modifier les paramètres" dcl#:#dcl_manage#:#Gérer @@ -8543,7 +8543,7 @@ dcl#:#dcl_new_field#:#Nouveau Champ dcl#:#dcl_new_table#:#Nouveau Tableau dcl#:#dcl_next_record#:#Next record dcl#:#dcl_no_content_warning#:#Attention, la Collection de Données est en-ligne mais n'a actuellement aucun contenu ! -dcl#:#dcl_no_entry#:#No entry###07 02 2020 new variable +dcl#:#dcl_no_entry#:#No entry dcl#:#dcl_no_export_content_available#:#Pas de données disponibles pour l’exportation. dcl#:#dcl_no_export_data_available#:#Pas de données ou de champs disponibles pour l’exportation. dcl#:#dcl_no_export_fields_available#:#Pas de champs activés pour l’exportation. Marquez au moins un champ comme pouvant être exporté dans les paramètres de tableaux. @@ -8569,7 +8569,7 @@ dcl#:#dcl_own_entries#:#Uniquement les entrées propres dcl#:#dcl_owner#:#Propriétaire dcl#:#dcl_owner_description#:#Le propriétaire de l’entrée. dcl#:#dcl_owner_name#:#Propriétaire (nom) -dcl#:#dcl_page_type_dclf#:#Details View###30 04 2021 new variable +dcl#:#dcl_page_type_dclf#:#Details View dcl#:#dcl_permissions_form#:#Permissions Utilisateurs dcl#:#dcl_please_select#:#--- Veuillez sélectionner --- dcl#:#dcl_plugin#:#Plug-in @@ -8631,18 +8631,18 @@ dcl#:#dcl_tables_confirm_delete#:#Voulez-vous vraiment supprimer les tableaux su dcl#:#dcl_tableview#:#Vue dcl#:#dcl_tableview_add#:#Ajouter une nouvelle vue dcl#:#dcl_tableview_confirm_delete#:#Voulez-vous vraiment supprimer la vue suivante? -dcl#:#dcl_tableview_copy#:#View successfully copied###30 04 2021 new variable -dcl#:#dcl_tableview_default_value#:#Default Value###30 04 2021 new variable -dcl#:#dcl_tableview_default_value_fail#:#Some numeric default values couldn't be saved because they contained letters. Please try again.###30 04 2021 new variable -dcl#:#dcl_tableview_field_access#:#Field Access###30 04 2021 new variable +dcl#:#dcl_tableview_copy#:#View successfully copied +dcl#:#dcl_tableview_default_value#:#Default Value +dcl#:#dcl_tableview_default_value_fail#:#Some numeric default values couldn't be saved because they contained letters. Please try again. +dcl#:#dcl_tableview_field_access#:#Field Access dcl#:#dcl_tableview_fieldsettings#:#Paramètres spécifiques du champ -dcl#:#dcl_tableview_fieldtitle#:#Field Title###30 04 2021 new variable -dcl#:#dcl_tableview_locked#:#Locked###30 04 2021 new variable -dcl#:#dcl_tableview_locked_visible#:#Locked & Visible###30 04 2021 new variable -dcl#:#dcl_tableview_not_visible#:#Not Visible###30 04 2021 new variable -dcl#:#dcl_tableview_required#:#Required###30 04 2021 new variable -dcl#:#dcl_tableview_required_visible#:#Required & Visible###30 04 2021 new variable -dcl#:#dcl_tableview_visible#:#Visible###30 04 2021 new variable +dcl#:#dcl_tableview_fieldtitle#:#Field Title +dcl#:#dcl_tableview_locked#:#Locked +dcl#:#dcl_tableview_locked_visible#:#Locked & Visible +dcl#:#dcl_tableview_not_visible#:#Not Visible +dcl#:#dcl_tableview_required#:#Required +dcl#:#dcl_tableview_required_visible#:#Required & Visible +dcl#:#dcl_tableview_visible#:#Visible dcl#:#dcl_tableviews#:#Vues dcl#:#dcl_tableviews_confirm_delete#:#Voulez-vous vraiment supprimer les vues suivantes? dcl#:#dcl_tableviews_table#:#Vues du tableau sélectionné @@ -8662,9 +8662,9 @@ dcl#:#dcl_unknown_exception#:#La valeur que vous avez entrée n'est pas valide. dcl#:#dcl_update_field#:#Enregistrer Champ dcl#:#dcl_update_record#:#Enregistrer dcl#:#dcl_url#:#URL -dcl#:#dcl_view_configuration#:#View Configuration###30 04 2021 new variable +dcl#:#dcl_view_configuration#:#View Configuration dcl#:#dcl_view_own_records_perm#:#Voir uniquement les entrées propres -dcl#:#dcl_view_settings#:#View Settings###30 04 2021 new variable +dcl#:#dcl_view_settings#:#View Settings dcl#:#dcl_view_viewdefinition#:#Affichage dcl#:#dcl_visible#:#Visible par tous dcl#:#dcl_visible_desc#:#Benutzer können diese Tabelle über das Auswahlmenü "Tabelle" aufrufen. @@ -8695,18 +8695,18 @@ didactic#:#didactic_default_type_info#:#Utiliser les paramètres par défaut didactic#:#didactic_delete_msg#:#Modèles d'objet supprimés didactic#:#didactic_do_export#:#Exporter didactic#:#didactic_edit_tpl#:#Editer Modèle d'Objet -didactic#:#didactic_filter_with_icon#:#with Icon###30 04 2021 new variable -didactic#:#didactic_filter_without_icon#:#without Icon###30 04 2021 new variable -didactic#:#didactic_global#:#Global###30 04 2021 new variable -didactic#:#didactic_icon#:#Icon###30 04 2021 new variable -didactic#:#didactic_icon_error#:#Icons cannot be assigned to non-container objects.###30 04 2021 new variable -didactic#:#didactic_icon_info#:#The Icon is shown for all objects, which use this object template. "Custom Icons" of objects overwrite the didactic template icons. Icons can only be used for didactic templates assigned to container objects.###30 04 2021 new variable +didactic#:#didactic_filter_with_icon#:#with Icon +didactic#:#didactic_filter_without_icon#:#without Icon +didactic#:#didactic_global#:#Global +didactic#:#didactic_icon#:#Icon +didactic#:#didactic_icon_error#:#Icons cannot be assigned to non-container objects. +didactic#:#didactic_icon_info#:#The Icon is shown for all objects, which use this object template. "Custom Icons" of objects overwrite the didactic template icons. Icons can only be used for didactic templates assigned to container objects. didactic#:#didactic_import_btn#:#Importer Modèle d'Objet didactic#:#didactic_import_failed#:#Echec lors de l'import du modèle d'objet : didactic#:#didactic_import_success#:#Modèles d'objet importés avec succès didactic#:#didactic_import_table_title#:#Import d'un modèle d'objet didactic#:#didactic_install_info#:#Information Générale -didactic#:#didactic_local#:#Local###30 04 2021 new variable +didactic#:#didactic_local#:#Local didactic#:#didactic_not_changed#:#Le réglage du modèles d'objet est inchangé. didactic#:#didactic_scope#:#Étendue didactic#:#didactic_scope_list_header#:#Limité à: @@ -8802,8 +8802,8 @@ ecs#:#ecs_cms_tree_synchronized#:#L'arborescence a été synchronisée. ecs#:#ecs_communities#:#Participants ecs#:#ecs_confirm_delete_tree#:#Souhaitez-vous vraiment supprimer toutes les assignations pour l'arborescence du Campus Management ? ecs#:#ecs_connection_settings#:#Paramètres de connection -ecs#:#ecs_cron_task_scheduler#:#ECS Task Scheduler###07 02 2020 new variable -ecs#:#ecs_cron_task_scheduler_info#:#ECS tasks will be executed according to the schedule settings. Only neccessary, if ECS servers are configured.###07 02 2020 new variable +ecs#:#ecs_cron_task_scheduler#:#ECS Task Scheduler +ecs#:#ecs_cron_task_scheduler_info#:#ECS tasks will be executed according to the schedule settings. Only neccessary, if ECS servers are configured. ecs#:#ecs_crs_alloc#:#Allocation de Cours ecs#:#ecs_crs_alloc_set#:#Editer Allocation de Cours ecs#:#ecs_crs_export#:#Publications de Cours @@ -8966,44 +8966,45 @@ ecs#:#ecs_wiki_export_enabled#:#Publier ce Wiki ecs#:#ecs_wiki_export_obj_settings#:#Paramètres de Publication du Wiki error#:#error_back_to_repository#:#Retour au Catalogue error#:#error_sry_error#:#Désolé, une erreur s'est produite. -etal#:#appointments#:#Appointments###31 03 2023 new variable -etal#:#cal_type_tals#:#Talks###31 03 2023 new variable -etal#:#change_date_of_series#:#Change date of talk series###31 03 2023 new variable -etal#:#change_date_of_talk#:#Change date of talk###31 03 2023 new variable -etal#:#date_of_talk#:#Start Date###31 03 2023 new variable -etal#:#etal_add#:#Add Talk###31 03 2023 new variable -etal#:#etal_add_new_item#:#Add new Talk###31 03 2023 new variable -etal#:#etal_create_invalid_template_ref#:#Invalid Talk Template ID###31 03 2023 new variable -etal#:#etal_date_appointment_edit#:#Date of Talk###31 03 2023 new variable -etal#:#etal_date_series_edit#:#Date of Talk Series###31 03 2023 new variable -etal#:#etal_edit#:#General###31 03 2023 new variable -etal#:#etal_invalid_user#:#This user either does not exist or can't be invited.###31 03 2023 new variable -etal#:#etal_new#:#New Talk###31 03 2023 new variable -etal#:#etal_open#:#Open Employee Talk###31 03 2023 new variable -etal#:#etal_status_all#:#All###31 03 2023 new variable -etal#:#etal_status_completed#:#Completed###31 03 2023 new variable -etal#:#etal_status_pending#:#Pending###31 03 2023 new variable -etal#:#etal_unknown_username#:#Unknown User###31 03 2023 new variable -etal#:#lock_edititng_for_others#:#Lock editing for others###31 03 2023 new variable -etal#:#meta_adv_records#:#Metadata###31 03 2023 new variable -etal#:#mm_org_etal#:#Talks###31 03 2023 new variable -etal#:#mm_talk_template#:#Talk Templates###31 03 2023 new variable -etal#:#notification_talks_created#:#You have been invited to the following employee talks.###31 03 2023 new variable -etal#:#notification_talks_date_list_header#:#Dates###31 03 2023 new variable -etal#:#notification_talks_removed#:#The following appointments have been canceled.###31 03 2023 new variable -etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable -etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable -etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable -etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable -etal#:#tals_add#:#Add Talks###31 03 2023 new variable -etal#:#tals_new#:#New Talks###31 03 2023 new variable -etal#:#talt_activation_online_info#:#Set the talk template online to make it visible and available for employees. If not, only administrators will have access to it.###31 03 2023 new variable -etal#:#talt_add#:#Add Template###31 03 2023 new variable -etal#:#talt_edit#:#General###31 03 2023 new variable -etal#:#talt_etal#:#Employee Talk###31 03 2023 new variable -etal#:#talt_new#:#New Talk Template###31 03 2023 new variable -etal#:#will_update_series_info_lock#:#Lock the editing of all appointments in this series###31 03 2023 new variable -etal#:#will_update_series_info_title#:#Changes to the title will be made to all appointments in this series.###31 03 2023 new variable +etal#:#appointments#:#Appointments###31 10 2023 new variable +etal#:#cal_type_tals#:#Talks###31 10 2023 new variable +etal#:#change_date_of_series#:#Change date of talk series###31 10 2023 new variable +etal#:#change_date_of_talk#:#Change date of talk###31 10 2023 new variable +etal#:#date_of_talk#:#Start Date###31 10 2023 new variable +etal#:#etal_add#:#Add Talk###31 10 2023 new variable +etal#:#etal_add_new_item#:#Add new Talk###31 10 2023 new variable +etal#:#etal_create_invalid_template_ref#:#Invalid Talk Template ID###31 10 2023 new variable +etal#:#etal_date_appointment_edit#:#Date of Talk###31 10 2023 new variable +etal#:#etal_date_series_edit#:#Date of Talk Series###31 10 2023 new variable +etal#:#etal_edit#:#General###31 10 2023 new variable +etal#:#etal_invalid_user#:#This user either does not exist or can't be invited.###31 10 2023 new variable +etal#:#etal_new#:#New Talk###31 10 2023 new variable +etal#:#etal_open#:#Open Employee Talk###31 10 2023 new variable +etal#:#etal_status_all#:#All###31 10 2023 new variable +etal#:#etal_status_completed#:#Completed###31 10 2023 new variable +etal#:#etal_status_pending#:#Pending###31 10 2023 new variable +etal#:#etal_unknown_username#:#Unknown User###31 10 2023 new variable +etal#:#lock_edititng_for_others#:#Lock editing for others###31 10 2023 new variable +etal#:#meta_adv_records#:#Metadata###31 10 2023 new variable +etal#:#mm_org_etal#:#Talks###31 10 2023 new variable +etal#:#mm_talk_template#:#Talk Templates###31 10 2023 new variable +etal#:#notification_talks_created#:#You have been invited to the following employee talks.###31 10 2023 new variable +etal#:#notification_talks_date_list_header#:#Dates###31 10 2023 new variable +etal#:#notification_talks_removed#:#The following appointments have been canceled.###31 10 2023 new variable +etal#:#notification_talks_subject#:#Invitation: %s###31 10 2023 new variable +etal#:#notification_talks_subject_update#:#Update: %s###31 10 2023 new variable +etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 10 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###31 10 2023 new variable +etal#:#talk_serial#:#Talk Serial###31 10 2023 new variable +etal#:#tals_add#:#Add Talks###31 10 2023 new variable +etal#:#tals_new#:#New Talks###31 10 2023 new variable +etal#:#talt_activation_online_info#:#Set the talk template online to make it visible and available for employees. If not, only administrators will have access to it.###31 10 2023 new variable +etal#:#talt_add#:#Add Template###31 10 2023 new variable +etal#:#talt_edit#:#General###31 10 2023 new variable +etal#:#talt_etal#:#Employee Talk###31 10 2023 new variable +etal#:#talt_new#:#New Talk Template###31 10 2023 new variable +etal#:#will_update_series_info_lock#:#Lock the editing of all appointments in this series###31 10 2023 new variable +etal#:#will_update_series_info_title#:#Changes to the title will be made to all appointments in this series.###31 10 2023 new variable exc#:#exc_add_assignment#:#Ajouter une Activité exc#:#exc_add_criteria#:#Ajouter des critères exc#:#exc_add_criteria_catalogue#:#Ajouter catalogue @@ -9018,7 +9019,7 @@ exc#:#exc_after_submission#:#Après la soumission exc#:#exc_all_new_files_offered_already#:#Le téléchargement de tous les nouveaux fichiers a déjà été proposé. Pour un autre téléchargement, veuillez cliquer sur les liens d’action ci-dessous. exc#:#exc_ass_submission_zip#:#Submissions exc#:#exc_ass_team_wiki#:#Assignment Team Wiki -exc#:#exc_assignment#:#Tà¢ches +exc#:#exc_assignment#:#Tâches exc#:#exc_assignment_type#:#Type de Présentation exc#:#exc_assignment_view#:#Vue tà¢che exc#:#exc_assignments#:#Tà¢ches @@ -9029,14 +9030,14 @@ exc#:#exc_blog_selected#:#Le blog a été assigné. exc#:#exc_chars_remaining#:#Caractères restants: exc#:#exc_comment_for_learner_edit#:#Editer le commentaire pour l'apprenant exc#:#exc_comment_for_learner_info#:#Une notification est envoyée à l’utilisateur et le retour sera listé dans la vue d’affectation de l’utilisateur. -exc#:#exc_compare_selected_submissions#:#Compare selected submissions###07 02 2020 new variable -exc#:#exc_compare_submissions#:#Compare submissions###07 02 2020 new variable +exc#:#exc_compare_selected_submissions#:#Compare selected submissions +exc#:#exc_compare_submissions#:#Compare submissions exc#:#exc_completion_by_submission#:#Complétion Automatique exc#:#exc_completion_by_submission_info#:#Lorsque activé, la remise d'au moins un fichier a pour effet de considérer l'activité correspondante comme terminée. Le score peut ensuite être modifié manuellement. La modification de ce paramètre n'a aucun effet sur les réalisations déjà effectuées. exc#:#exc_completion_by_tutor#:#Manuellement par le Tuteur exc#:#exc_conf_del_assignments#:#Etes-vous certain de vouloir supprimer les tà¢ches suivantes ? exc#:#exc_copy#:#Copier Exercice -exc#:#exc_copy_zip_error#:#The submission can not be opened. An error occurred when copying the files.###07 02 2020 new variable +exc#:#exc_copy_zip_error#:#The submission can not be opened. An error occurred when copying the files. exc#:#exc_create_blog#:#Créer un Blog exc#:#exc_create_blog_select_info#:#Sélectionnez le dossier de ressources à ajouter au Blog. exc#:#exc_create_portfolio#:#Créer un Portfolio @@ -9064,15 +9065,15 @@ exc#:#exc_deadline_ext_mismatch#:#Le délai de grâce doit prendre fin après l exc#:#exc_deadline_extended#:#Délai de grâce exc#:#exc_deadline_extended_info#:#Une soumission tardive est possible entre l’échéance et la fin de la période de grâce. exc#:#exc_delete_team#:#Supprimer équipe -exc#:#exc_deleted_user#:#Deleted User###30 04 2021 new variable -exc#:#exc_denied_has_peer_reviews#:#Reason: Some assignments have peer reviewing activated.###07 02 2020 new variable -exc#:#exc_denied_has_submissions#:#Reason: Users have already submitted to assignments.###07 02 2020 new variable -exc#:#exc_denied_has_team_assignments#:#Reason: There are team assignments in this exercise.###07 02 2020 new variable +exc#:#exc_deleted_user#:#Deleted User +exc#:#exc_denied_has_peer_reviews#:#Reason: Some assignments have peer reviewing activated. +exc#:#exc_denied_has_submissions#:#Reason: Users have already submitted to assignments. +exc#:#exc_denied_has_team_assignments#:#Reason: There are team assignments in this exercise. exc#:#exc_direct_no_submit#:#Ne pas soumettre exc#:#exc_direct_submit#:#Soumettre exc#:#exc_direct_submit_blog#:#Voulez vous soumettre la version actuelle du blog ? Vous pouvez le soumettre à tout moment à partir de l'éditeur de blog. exc#:#exc_direct_submit_portfolio#:#Voulez vous soumettre la version actuelle du portfolio ? Vous pouvez le soumettre à tout moment à partir de l'éditeur de portfolio. -exc#:#exc_down_files_started_bg#:#Download of submission files has started. Please check your background tasks in the top right corner.###07 02 2020 new variable +exc#:#exc_down_files_started_bg#:#Download of submission files has started. Please check your background tasks in the top right corner. exc#:#exc_download_zip_structure#:#Télécharger la Structure ZIP exc#:#exc_earliest_start_time#:#Earliest Start Time exc#:#exc_edit_assignment#:#Modifier tà¢che @@ -9089,10 +9090,10 @@ exc#:#exc_feedback_notification_link#:#Lier à l'exercice exc#:#exc_feedback_notification_reason#:#Vous recevez cet email car vous participez à l'exercice cité précédemment. exc#:#exc_feedback_notification_subject#:#Des retours sont disponibles pour l'exercice "%s" exc#:#exc_files_returned_text#:#Texte d'Activité -exc#:#exc_find_zip_error#:#The submission can not be opened. The original files are not found.###07 02 2020 new variable +exc#:#exc_find_zip_error#:#The submission can not be opened. The original files are not found. exc#:#exc_fixed_date#:#Fixed Date exc#:#exc_fixed_date_info#:#Initially all users get the same fixed deadline. -exc#:#exc_fullscreen#:#Fullscreen###09 03 2022 new variable +exc#:#exc_fullscreen#:#Fullscreen exc#:#exc_global_feedback_file#:#Fichier de retour pour tous les apprenants exc#:#exc_global_feedback_file_after_date#:#After set Date exc#:#exc_global_feedback_file_cron#:#Notification @@ -9126,14 +9127,14 @@ exc#:#exc_mail_permanent_link#:#Cliquer sur le lien suivant pour accéder à l' exc#:#exc_manage_team#:#Gérer l’équipe exc#:#exc_mandatory#:#Obligatoire exc#:#exc_mandatory_info#:#Les tâches obligatoires doivent être passées pour réussir l'exercice entier. -exc#:#exc_mandatory_rand_determined#:#Randomly determined###07 02 2020 new variable +exc#:#exc_mandatory_rand_determined#:#Randomly determined exc#:#exc_max_char_limit#:#Nombre maximum de caractères exc#:#exc_max_file#:#Nombre max. de fichiers exc#:#exc_max_file_info#:#Participants will not be able to upload more files once the limit is reached. exc#:#exc_max_file_reached#:#Vous ne pouvez pas télécharger plus de %s fichiers. exc#:#exc_max_file_tgl#:#Limites de téléchargements exc#:#exc_max_team_participants#:#Maximal Number -exc#:#exc_members_already_assigned_team#:#This user is already assigned to a team.###07 02 2020 new variable +exc#:#exc_members_already_assigned_team#:#This user is already assigned to a team. exc#:#exc_min_char_limit#:#Nombre minimum de caractères exc#:#exc_min_nr#:#Nombre de tâches exc#:#exc_min_nr_info#:#This value must be equal or higher than the number of obligatory assignments. @@ -9169,7 +9170,7 @@ exc#:#exc_no_team_yet_info_tutor#:#Les équipes sont gérées par les tuteurs de exc#:#exc_no_team_yet_notice#:#Vous n’êtes pas encore assigné à une équipe! exc#:#exc_note_for_tutor#:#Note pour les tuteurs exc#:#exc_notification#:#Notification Personnelle -exc#:#exc_nr_random_mand#:#Number of Mandatory Assignments###07 02 2020 new variable +exc#:#exc_nr_random_mand#:#Number of Mandatory Assignments exc#:#exc_num_teams#:#Number exc#:#exc_order_by_deadline#:#Trier par Date Limite exc#:#exc_overview#:#Vue d'Ensemble @@ -9181,7 +9182,7 @@ exc#:#exc_pass_all_info#:#Toutes les tâches obligatoires doivent être passées exc#:#exc_pass_minimum_nr#:#Nombre minimum de tâches exc#:#exc_pass_minimum_nr_info#:#Un nombre minimum de tâches doit être passé pour réussir l'exercice. Cette valeur doit être égale ou supérieure au nombre de tâches obligatoires. exc#:#exc_pass_mode#:#Mode de passage -exc#:#exc_pass_mode_not_changeable_info#:#The pass mode cannot be changed anymore.###07 02 2020 new variable +exc#:#exc_pass_mode_not_changeable_info#:#The pass mode cannot be changed anymore. exc#:#exc_passed_status_determination#:#Détermination du statut "Réussite" exc#:#exc_passing_exc#:#Paramètres de Passage exc#:#exc_peer_deadline_mismatch#:#Un retour est envoyé une fois que l’échéance est écoulée. L’échéance du retour ne doit pas être antérieure à l’échéance d’affectation. @@ -9241,19 +9242,19 @@ exc#:#exc_portfolio_selected#:#Le portfolio a été assigné. exc#:#exc_portfolio_template#:#Modèle de portfolio exc#:#exc_portfolio_unlinked_from_assignment#:#Portfolio retiré de l’affectation exc#:#exc_presentation_order#:#Ordre de présentation -exc#:#exc_print_pdf#:#Print/PDF###31 03 2023 new variable +exc#:#exc_print_pdf#:#Print/PDF###31 10 2023 new variable exc#:#exc_public_submission#:#Réalisations Publiques exc#:#exc_publishing#:#Edition -exc#:#exc_rand_nr_mandatory#:#Number of Mandatory Assignments###07 02 2020 new variable -exc#:#exc_rand_overall_ass#:#Overall Number of Assignments###07 02 2020 new variable -exc#:#exc_random#:#Random###07 02 2020 new variable -exc#:#exc_random_assignment#:#Random Assignment###07 02 2020 new variable -exc#:#exc_random_assignment_info#:#When starting the exercise some assignments will be randomly selected being mandatory for you.###07 02 2020 new variable -exc#:#exc_random_selection#:#Random Selection###07 02 2020 new variable -exc#:#exc_random_selection_info#:#Each user gets assigned a random selection of mandatory assignments.###07 02 2020 new variable -exc#:#exc_random_selection_not_changeable_info#:#This mode cannot be activated.###07 02 2020 new variable -exc#:#exc_rel_last_submission#:#Last Possible Submission###07 02 2020 new variable -exc#:#exc_rel_last_submission_info#:#If this optional date is set, all user have to submit until this deadline is reached.###07 02 2020 new variable +exc#:#exc_rand_nr_mandatory#:#Number of Mandatory Assignments +exc#:#exc_rand_overall_ass#:#Overall Number of Assignments +exc#:#exc_random#:#Random +exc#:#exc_random_assignment#:#Random Assignment +exc#:#exc_random_assignment_info#:#When starting the exercise some assignments will be randomly selected being mandatory for you. +exc#:#exc_random_selection#:#Random Selection +exc#:#exc_random_selection_info#:#Each user gets assigned a random selection of mandatory assignments. +exc#:#exc_random_selection_not_changeable_info#:#This mode cannot be activated. +exc#:#exc_rel_last_submission#:#Last Possible Submission +exc#:#exc_rel_last_submission_info#:#If this optional date is set, all user have to submit until this deadline is reached. exc#:#exc_relative_date#:#Relative Date exc#:#exc_relative_date_info#:#The deadline is set individually relative to the time when a user started the assignment. exc#:#exc_rem_time_after_start#:#Remaining Time after Start @@ -9304,7 +9305,7 @@ exc#:#exc_show_peer_review#:#Afficher les Retours des Pairs exc#:#exc_show_submissions#:#Publier les propositions après la date limite exc#:#exc_show_submissions_info#:#Publier toutes les propositions de tous les apprenants après la date limite. exc#:#exc_start_assignment#:#Start Assignment -exc#:#exc_start_exercise#:#Start Exercise###07 02 2020 new variable +exc#:#exc_start_exercise#:#Start Exercise exc#:#exc_start_time#:#Date de Début exc#:#exc_starting_on#:#A partir de exc#:#exc_submission_and_grades_notification_link#:#Lien vers les «soumissions et classements» de l’exercice: %s @@ -9322,16 +9323,16 @@ exc#:#exc_submit_convenience_no_deadline#:#Soumettez la tâche à votre convenan exc#:#exc_submitted_files_deleted#:#Les fichiers sélectionnés ont été supprimés. exc#:#exc_sure_unlink_portfolio#:#Êtes-vous sûr de vouloir retirer ce portfolio de cette affectation? exc#:#exc_target_not_valid#:#La cible demandée n’est pas valide ou incomplète. -exc#:#exc_task_grading#:#Grading of Assignment "%1"###07 02 2020 new variable -exc#:#exc_task_peer_feedback#:#Give Peer Feedback in Assignment "%1"###07 02 2020 new variable -exc#:#exc_task_submission#:#Submission of Assignment "%1"###07 02 2020 new variable +exc#:#exc_task_grading#:#Grading of Assignment "%1" +exc#:#exc_task_peer_feedback#:#Give Peer Feedback in Assignment "%1" +exc#:#exc_task_submission#:#Soumission de la tâche "%1" exc#:#exc_tbl_action_download_all_files#:#Télécharger toutes les soumissions exc#:#exc_tbl_action_download_files#:#Télécharger soumissions exc#:#exc_tbl_action_download_new_files#:#Télécharger les nouvelles soumissions exc#:#exc_tbl_action_feedback_file#:#Give Feedback As File exc#:#exc_tbl_action_feedback_mail#:#Give Feedback As Mail exc#:#exc_tbl_action_feedback_text#:#Give Feedback As Text -exc#:#exc_tbl_action_open_submission#:#Open Submission###07 02 2020 new variable +exc#:#exc_tbl_action_open_submission#:#Open Submission exc#:#exc_tbl_action_peer_review_given#:#Montrer le retour de pairs donné exc#:#exc_tbl_action_peer_review_received#:#Montrer le retour de pairs reçu exc#:#exc_tbl_action_team_log#:#Montrer le journal de l’équipe @@ -9363,7 +9364,7 @@ exc#:#exc_team_by_assignment_info#:#Teams formed in other Assignments will be us exc#:#exc_team_by_participants#:#Participants Self-Organise Forming Teams exc#:#exc_team_by_participants_info#:#Participants opt for teams. exc#:#exc_team_by_random#:#Teams are formed randomly and automatically. -exc#:#exc_team_by_random_add_info#:#Please note that you have to assign all participants first before using this mode.###07 02 2020 new variable +exc#:#exc_team_by_random_add_info#:#Please note that you have to assign all participants first before using this mode. exc#:#exc_team_by_random_info#:#ILIAS will allocate participants to a set number of teams. exc#:#exc_team_by_tutors#:#Teams are formed by Tutors. exc#:#exc_team_by_tutors_info#:#Tutors allocate participants to teams, participants cannot self-organize. @@ -9375,7 +9376,7 @@ exc#:#exc_team_log#:#Historique de l'Equipe exc#:#exc_team_log_add_file#:#Le fichier %s a été ajouté. exc#:#exc_team_log_add_member#:#L'équipier %s été ajouté. exc#:#exc_team_log_create_team#:#L'équipe a été créée. -exc#:#exc_team_log_remove_file#:#Removed file %s.###21 12 2022 new variable +exc#:#exc_team_log_remove_file#:#Removed file %s. exc#:#exc_team_log_remove_member#:#L'équipier %s a été retiré. exc#:#exc_team_management_tutor#:#Gestion d’équipes par les tuteurs exc#:#exc_team_management_tutor_info#:#Si cette option est activée, les participants ne peuvent pas organiser les équipes eux-mêmes. @@ -9399,7 +9400,7 @@ exc#:#exc_teams_assignment_adopted#:#Teams adopted from existing assignment exc#:#exc_template#:#Modèle exc#:#exc_text_assignment_edit#:#Editer Texte exc#:#exc_text_assignment_show#:#Afficher Texte -exc#:#exc_text_saved#:#Text has been saved.###07 02 2020 new variable +exc#:#exc_text_saved#:#Text has been saved. exc#:#exc_total_exc#:#Total de l'exercise exc#:#exc_total_members#:#Total Exercise Members exc#:#exc_type_blog#:#Blog @@ -9425,7 +9426,7 @@ exc#:#feedback#:#Feedback exc#:#feedback_from#:#Feedback from exc#:#feedback_given#:#Feedback given exc#:#feedback_received#:#Feedback received -exc#:#filter#:#Filter +exc#:#filter#:#Filtre exc#:#fiter_no_results#:#The current filter did not match any submission. exc#:#grade_evaluate#:#Grade and Evaluate exc#:#not_yet#:#not yet @@ -9447,16 +9448,16 @@ exercise#:#exc_send_mail#:#Envoyer un Message exercise#:#exc_start_date_should_be_before_end_date#:#La date de début doit être antérieure à la date de fin. exercise#:#exc_your_submission#:#Votre Travail exp#:#exp_create_file#:#Créer fichier exportable -exp#:#exp_error_disabled#:#The export feature is disabled for containers. You may contact your system administrator.###07 02 2020 new variable -exp#:#exp_error_too_many_objects#:#The export exceeds the maximum number of allowerd objects (%1). Please select a lower number of objects.###07 02 2020 new variable +exp#:#exp_error_disabled#:#The export feature is disabled for containers. You may contact your system administrator. +exp#:#exp_error_too_many_objects#:#The export exceeds the maximum number of allowerd objects (%1). Please select a lower number of objects. exp#:#exp_export_files#:#Fichiers exportables exp#:#exp_file_created#:#Le fichier d'export a été créé. exp#:#exp_html#:#HTML -exp#:#exp_print_pdf#:#Print/PDF###31 03 2023 new variable -exp#:#exp_print_pdf_info#:#To create a PDF please use the "Print to PDF" target as soon as the print view is presented.###31 03 2023 new variable +exp#:#exp_print_pdf#:#Print/PDF###31 10 2023 new variable +exp#:#exp_print_pdf_info#:#To create a PDF please use the "Print to PDF" target as soon as the print view is presented.###31 10 2023 new variable exp#:#exp_really_delete#:#Désirez vous vraiment supprimer ces fichiers d'export ? exp#:#exp_scorm#:#SCORM -exp#:#exp_show_print_view#:#Show Print View###31 03 2023 new variable +exp#:#exp_show_print_view#:#Show Print View###31 10 2023 new variable exp#:#exp_xml#:#XML exp#:#export_created#:#Un nouveau fichier d'export a été créé. export#:#export_create#:#Créer @@ -9479,28 +9480,28 @@ file#:#file_new_version#:#Créer nouvelle version file#:#file_new_version_info#:#Créer nouvelle version du fichier. Les versions précédentes ne seront pas modifiées. file#:#file_upload_info_file_with_critical_extension#:#The uploaded file contains a critical or unknown file ending. The file ending will be changed to .sec for every download. file#:#file_uploaded_by#:#Déposé par -file#:#general_upload_error_occured#:#An unexpected error occured during upload.###30 04 2021 new variable -file#:#migrated#:#Status###09 03 2022 new variable -file#:#msg_unzip_success#:#Archive has been successfully unziped.###31 03 2023 new variable +file#:#general_upload_error_occured#:#An unexpected error occured during upload. +file#:#migrated#:#Status +file#:#msg_unzip_success#:#Archive has been successfully unziped.###31 10 2023 new variable file#:#replace_file_info#:#Toutes les versions du fichier seront supprimées. -file#:#resource_id#:#Resource ID###24 09 2021 new variable -file#:#storage_id#:#Storage ID###24 09 2021 new variable -file#:#upload_info#:#File###07 02 2020 new variable -file#:#upload_info_desc#:#Manage Uploads and Versions in Tab "Versions"###07 02 2020 new variable -file#:#version_uploaded#:#Version uploaded###24 09 2021 new variable -file#:#versionname#:#Title###24 09 2021 new variable -fils#:#file_services#:#File Services###30 04 2021 new variable -fils#:#file_services_description#:#Configuration of File Service Settings.###30 04 2021 new variable -fils#:#file_suffix_custom_expl_negative#:#Prohibited File Suffixes###30 04 2021 new variable -fils#:#file_suffix_custom_expl_negative_info#:#Files with these suffixes won't be accepted for upload.###30 04 2021 new variable -fils#:#file_suffix_custom_negative#:#File Suffixes: Negative List (Adaptations)###30 04 2021 new variable -fils#:#file_suffix_custom_negative_info#:#These file suffixes will be removed from the positive list.###30 04 2021 new variable -fils#:#file_suffix_custom_positive#:#File Suffixes: Positive List (Adaptations)###30 04 2021 new variable -fils#:#file_suffix_custom_positive_info#:#These file suffixes will be added to the positive list.###30 04 2021 new variable -fils#:#file_suffix_default_positive#:#File Suffixes: Positive List (Default List)###30 04 2021 new variable -fils#:#file_suffix_default_positive_info#:#Preset default list of accepted file suffixes.###30 04 2021 new variable -fils#:#file_suffix_overall_positive#:#Overall Positive List###30 04 2021 new variable -fils#:#file_suffix_overall_positive_info#:#This is the final list of accepted file suffixes.###30 04 2021 new variable +file#:#resource_id#:#Resource ID +file#:#storage_id#:#Storage ID +file#:#upload_info#:#File +file#:#upload_info_desc#:#Manage Uploads and Versions in Tab "Versions" +file#:#version_uploaded#:#Version uploaded +file#:#versionname#:#Title +fils#:#file_services#:#File Services +fils#:#file_services_description#:#Configuration of File Service Settings. +fils#:#file_suffix_custom_expl_negative#:#Prohibited File Suffixes +fils#:#file_suffix_custom_expl_negative_info#:#Files with these suffixes won't be accepted for upload. +fils#:#file_suffix_custom_negative#:#File Suffixes: Negative List (Adaptations) +fils#:#file_suffix_custom_negative_info#:#These file suffixes will be removed from the positive list. +fils#:#file_suffix_custom_positive#:#File Suffixes: Positive List (Adaptations) +fils#:#file_suffix_custom_positive_info#:#These file suffixes will be added to the positive list. +fils#:#file_suffix_default_positive#:#File Suffixes: Positive List (Default List) +fils#:#file_suffix_default_positive_info#:#Preset default list of accepted file suffixes. +fils#:#file_suffix_overall_positive#:#Overall Positive List +fils#:#file_suffix_overall_positive_info#:#This is the final list of accepted file suffixes. fold#:#fold_copy#:#Copier Dossier fold#:#fold_import#:#Importer dossier fold#:#fold_presentation#:#Folder Presentation @@ -9508,7 +9509,7 @@ fold#:#fold_settings#:#Paramètres de Dossier form#:#email_not_match#:#Les informations fournies ne correspondent pas à l'adresse email ! form#:#form_alphabet_all#:#Tous form#:#form_chars_remaining#:#Caractères restants: -form#:#form_date_aria_desc#:#The following input format is required:###30 04 2021 new variable +form#:#form_date_aria_desc#:#Le format de saisie suivant est requis : form#:#form_date_duration_end#:#Terminer form#:#form_date_duration_start#:#Démarrer form#:#form_days#:#Jours @@ -9520,7 +9521,7 @@ form#:#form_hierarchy_add_elements#:#Cliquez sur ces liens pour ajouter de nouve form#:#form_hierarchy_drag_drop_help#:#Glissez-déposez les icônes sur les emplacements pour déplacer les éléments. form#:#form_hours#:#Heures form#:#form_image_file_input#:#Ajout fichier image -form#:#form_invalid_uri#:#Invalid URI format.###30 04 2021 new variable +form#:#form_invalid_uri#:#Invalid URI format. form#:#form_link_external#:#Externe à ILIAS (Web) form#:#form_link_internal#:#Interne à ILIAS form#:#form_location_radius#:#Rayon @@ -9530,7 +9531,7 @@ form#:#form_min_value#:#Valeur Minimale form#:#form_minutes#:#Minutes form#:#form_months#:#Mois form#:#form_msg_file_cannot_write_to_disk#:#Impossible d'écrire sur le disque. -form#:#form_msg_file_missing_file_ext#:#The uploaded file has no file type exension.###07 02 2020 new variable +form#:#form_msg_file_missing_file_ext#:#The uploaded file has no file type exension. form#:#form_msg_file_missing_tmp_dir#:#Répertoire temporaire de dépôt absent. form#:#form_msg_file_no_upload#:#Cette information est nécessaire. Veuillez sélectionner un fichier à télécharger. form#:#form_msg_file_partially_uploaded#:#Le fichier ne peut pas être téléchargé dans son intégralité. @@ -9540,7 +9541,7 @@ form#:#form_msg_file_upload_stopped_ext#:#Dépôt du fichier interrompu à cause form#:#form_msg_file_virus_found#:#Virus trouvé dans le fichier téléchargé. form#:#form_msg_file_wrong_file_type#:#Format de fichier incorrect. form#:#form_msg_formula_is_required#:#Veuillez saisir une formule correcte. -form#:#form_msg_max_upload#:#Maximum number of simultaneously uploadable files:###30 04 2021 new variable +form#:#form_msg_max_upload#:#Maximum number of simultaneously uploadable files: form#:#form_msg_numeric_value_required#:#Veuillez saisir une valeur numérique. form#:#form_msg_value_too_high#:#Valeur trop élevée. Veuillez saisir une valeur plus basse. form#:#form_msg_value_too_low#:#Valeur trop basse. Veuillez saisir une valeur plus élevée. @@ -9551,10 +9552,10 @@ form#:#form_password_not_allowed_for_auth#:#Il n'est pas possible de changer de form#:#form_password_required_for_auth#:#Un mot de passe est nécessaire pour cette méthode d'authentification. form#:#form_please_select#:#Veuillez sélectionner form#:#form_retype_email#:#Re-saisir Email -form#:#form_retype_password#:#Ressaisir Mot de Passe +form#:#form_retype_password#:#Ressaisir le mot de passe form#:#form_seconds#:#Secondes -form#:#form_take_snapshot#:#Take Snapshot###31 03 2023 new variable -form#:#form_use_camera#:#Use Camera###31 03 2023 new variable +form#:#form_take_snapshot#:#Take Snapshot###31 10 2023 new variable +form#:#form_use_camera#:#Use Camera###31 10 2023 new variable forum#:#activate_new_posts#:#Modérer les nouveaux articles forum#:#activate_only_current#:#Accepter les articles à jour forum#:#activate_post#:#Accepter @@ -9575,27 +9576,27 @@ forum#:#content_censored_post#:#Contenu de l'affichage censuré: forum#:#content_deleted_post#:#Contenu de l'affichage supprimé: forum#:#content_deleted_thread#:#Contenu du fil supprimé: forum#:#content_post_updated#:#Contenu de l'affichage édité : -forum#:#deletePosting#:#Delete Posting###30 04 2021 new variable -forum#:#deletePostingDraft#:#Delete Draft###30 04 2021 new variable +forum#:#deletePosting#:#Delete Posting +forum#:#deletePostingDraft#:#Delete Draft forum#:#delete_draft_successfully#:#Le brouillon a été supprimé avec succès. forum#:#delete_drafts_successfully#:#Les brouillons ont été supprimés avec succès. forum#:#descending_order#:#Les derniers sujets en haut forum#:#edit_thread_draft#:#Éditer le brouillon du thread forum#:#empty_subject#:#Lors de la réponse, l'utilisateur doit entrer un nouveau titre -forum#:#empty_thread#:#Empty Thread###31 03 2023 new variable +forum#:#empty_thread#:#Empty Thread###31 10 2023 new variable forum#:#enable_send_attachments#:#Envoyer des pièces-jointes avec des notifications dans le forum forum#:#enable_send_attachments_desc#:#Veuillez noter que les pièces-jointes doivent être stockées séparément pour chaque utilisateur notifié. Cela peut demander beaucoup d’espace disque sur le serveur. forum#:#enable_thread_ratings#:#Evaluation du fil de discutions forum#:#enable_thread_ratings_info#:#Si coché, les utilisateurs peuvent voter pour évaluer le fil de discution. forum#:#enter_new_subject#:#Veuillez saisir un nouvel objet -forum#:#error_no_target_selected#:#Please select a forum.###31 03 2023 new variable +forum#:#error_no_target_selected#:#Please select a forum.###31 10 2023 new variable forum#:#error_reading_file#:#Il y a eu une erreur lors de la lecture du fichier forum#:#error_same_thread_ids#:#Les sujets à fusionner doivent être différents. forum#:#file_upload_allowed#:#Autoriser les Pièces Jointes forum#:#file_upload_allowed_fora#:#Pièces Jointes forum#:#file_upload_allowed_fora_desc#:#Si 'Autoriser les Pièces Jointes dans les Forums Sélectionnés' est coché, les modérateurs du forum peuvent individuellement permettre de joindre des fichiers aux messages dans les paramètres de chaque forum. Dans les nouveaux forums, le téléchargement des pièces jointes sera désactivé par défaut. forum#:#file_upload_option_allow#:#Autoriser les Pièces Jointes dans Tous les forums -forum#:#file_upload_option_allow_info#:#Files can be attached to posts in all forums.###26 01 2022 new variable +forum#:#file_upload_option_allow_info#:#Files can be attached to posts in all forums. forum#:#file_upload_option_disallow#:#Autoriser les Pièces Jointes dans les Forums Sélectionnés forum#:#fmr_copy_threads_info#:#Vous avez la possibilité de copier des sujets seuls. Seul, le début du sujet sera dupliqué. forum#:#forum_add_quote#:#Ajouter la citation @@ -9647,9 +9648,9 @@ forum#:#forums_your_reply#:#Votre Réponse forum#:#frm_action_not_possible_parent_deleted#:#Action not possible, the parent posting has been deleted. forum#:#frm_action_not_possible_thr_closed#:#Action not possible, the thread has been closed. forum#:#frm_action_not_possible_thr_deleted#:#Action not possible, the thread has been deleted. -forum#:#frm_activation_online_info#:#Set the forum online to make it visible and available to other users. If not, only administrators will have access to it.###31 03 2023 new variable -forum#:#frm_all_postings_stats#:#All###31 03 2023 new variable -forum#:#frm_all_threads#:#All Threads###31 03 2023 new variable +forum#:#frm_activation_online_info#:#Set the forum online to make it visible and available to other users. If not, only administrators will have access to it.###31 10 2023 new variable +forum#:#frm_all_postings_stats#:#All###31 10 2023 new variable +forum#:#frm_all_threads#:#All Threads###31 10 2023 new variable forum#:#frm_anonymous_posting#:#Publication anonyme forum#:#frm_anonymous_posting_desc#:#Si cochée, la publication d'articles anonymes sur ce forum est permis. forum#:#frm_at_least_one_moderator#:#Il doit y avoir au moins un modérateur. @@ -9675,11 +9676,11 @@ forum#:#frm_moderators_detached_role_successfully#:#Le rôle de modérateur a é forum#:#frm_moderators_not_exist_yet#:#Veuillez choisir un modérateur. forum#:#frm_moderators_select_at_least_one#:#Veuillez choisir au moins un modérateur. forum#:#frm_moderators_select_one#:#Veuillez choisir un utilisateur. -forum#:#frm_move_invalid_file_type#:#The thread "%s" has an unsupported file type attached. Remove the file or contact the administrator of the system to add this file type to the file type whitelist.###07 02 2020 new variable +forum#:#frm_move_invalid_file_type#:#The thread "%s" has an unsupported file type attached. Remove the file or contact the administrator of the system to add this file type to the file type whitelist. forum#:#frm_noti_message#:#Message: forum#:#frm_noti_new_post#:#Une nouvelle publication a été créée dans le forum «%1$s». -forum#:#frm_noti_obj_crs#:#course###29 07 2022 new variable -forum#:#frm_noti_obj_grp#:#group###29 07 2022 new variable +forum#:#frm_noti_obj_crs#:#course +forum#:#frm_noti_obj_grp#:#group forum#:#frm_noti_subject_act_post#:#Publication activée dans le forum «%1$s», thread «%2$s» forum#:#frm_noti_subject_answ_post#:#Publication répondue dans le forum «%1$s», thread «%2$s» forum#:#frm_noti_subject_cens_post#:#Publication censurée dans le forum «%1$s», thread «%2$s» @@ -9691,30 +9692,30 @@ forum#:#frm_noti_subject_upt_post#:#Publication modifiée dans le forum «%1$s» forum#:#frm_notification_activated#:#Ma notification est activée forum#:#frm_notification_deactivated#:#La notification est désactivée forum#:#frm_post_not_activated_yet#:#Pas encore activé. -forum#:#frm_posts#:#Forum Posts###30 04 2021 new variable +forum#:#frm_posts#:#Forum Posts forum#:#frm_pseudonym#:#Pseudonyme forum#:#frm_purifier_not_implemented_for_type_x#:#Purificateur pour type %s non encore implémenté. forum#:#frm_rating#:#Évaluation forum#:#frm_revoke_censorship#:#Annuler censure forum#:#frm_search#:#Recherche forum#:#frm_selected_merge_src#:#Sujet à Fusionner : %s -forum#:#frm_settings_form_header#:#Forum Settings###07 02 2020 new variable -forum#:#frm_settings_mod_functions_header#:#Moderator Functions###07 02 2020 new variable -forum#:#frm_settings_privacy_header#:#Privacy###07 02 2020 new variable -forum#:#frm_settings_user_functions_header#:#User Functions###07 02 2020 new variable +forum#:#frm_settings_form_header#:#Forum Settings +forum#:#frm_settings_mod_functions_header#:#Moderator Functions +forum#:#frm_settings_privacy_header#:#Privacy +forum#:#frm_settings_user_functions_header#:#User Functions forum#:#frm_statistics#:#Statistiques forum#:#frm_statistics_disabled_for_participants#:#Les statistiques sont désactivés pour les membres du forum. forum#:#frm_statistics_enabled#:#Activer les statistiques forum#:#frm_statistics_enabled_desc#:#Activer les statistiques pour tous les participants forum#:#frm_statistics_ranking#:#Nombre d'articles -forum#:#frm_sticky_threads_latest_at_top#:#‘Sticky Threads’ at Top###07 02 2020 new variable -forum#:#frm_sticky_threads_latest_at_top_info#:#‘Sticky Threads’ are always listed at the top of the list of threads. Within the ‘Sticky Threads’ the thread with the latest posting iss listed at top.###07 02 2020 new variable -forum#:#frm_sticky_threads_manual_sorting#:#Manual Sorting of ‘Sticky Threads’###07 02 2020 new variable -forum#:#frm_sticky_threads_manual_sorting_info#:#‘Sticky Threads’ are always listed at the top of the list of threads. The ‘Sticky Threads’ can be sorted manually.###07 02 2020 new variable +forum#:#frm_sticky_threads_latest_at_top#:#‘Sticky Threads’ at Top +forum#:#frm_sticky_threads_latest_at_top_info#:#‘Sticky Threads’ are always listed at the top of the list of threads. Within the ‘Sticky Threads’ the thread with the latest posting iss listed at top. +forum#:#frm_sticky_threads_manual_sorting#:#Manual Sorting of ‘Sticky Threads’ +forum#:#frm_sticky_threads_manual_sorting_info#:#‘Sticky Threads’ are always listed at the top of the list of threads. The ‘Sticky Threads’ can be sorted manually. forum#:#frm_subject_setting#:#Titre de la réponse forum#:#frm_sure_delete_threads#:#à‹tes vous sûr(e) de vouloir supprimer les sujets suivants ? forum#:#frm_sure_merge_threads#:#Etes-vous sûr de vouloir fusionner ces sujets ? Attention : cette action est définitive ! -forum#:#frm_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable +forum#:#frm_task_publishing_draft_title#:#Publishing of Draft "%s" forum#:#frm_wizard_page#:#Copier Forum (étape 2/2) forum#:#is_read#:#Marqué comme lu forum#:#make_topics_non_sticky#:#Mettre les sujets sans annonces @@ -9727,15 +9728,15 @@ forum#:#merged_threads_successfully#:#Les sujets sélectionnés ont été fusion forum#:#move_chosen_topics#:#Déplacer les sujets sélectionnés forum#:#move_thread_to_forum#:#Déplacer le fil de discussion vers un autre forum forum#:#new_post#:#Nouvel article -forum#:#new_thread_with_post#:#New Thread with Posting###31 03 2023 new variable +forum#:#new_thread_with_post#:#New Thread with Posting###31 10 2023 new variable forum#:#no_forum_selected#:#Pas de forum sélectionné pour y déplacer les sujets de discussion. forum#:#not_allowed_to_merge_into_another_forum#:#Il n'est pas possible de fusionner des sujets issus de forums différents. -forum#:#notification_settings#:#Notification Settings###31 03 2023 new variable -forum#:#notify_censored#:#Censored Posts###31 03 2023 new variable -forum#:#notify_modified#:#Modified Posts###31 03 2023 new variable -forum#:#notify_post_deleted#:#Deleted Posts###31 03 2023 new variable -forum#:#notify_thread_deleted#:#Deleted Threads###31 03 2023 new variable -forum#:#notify_uncensored#:#Uncensored Posts###31 03 2023 new variable +forum#:#notification_settings#:#Notification Settings###31 10 2023 new variable +forum#:#notify_censored#:#Censored Posts###31 10 2023 new variable +forum#:#notify_modified#:#Modified Posts###31 10 2023 new variable +forum#:#notify_post_deleted#:#Deleted Posts###31 10 2023 new variable +forum#:#notify_thread_deleted#:#Deleted Threads###31 10 2023 new variable +forum#:#notify_uncensored#:#Uncensored Posts###31 10 2023 new variable forum#:#number_of_threads#:#Nombre de sujets par page forum#:#please_choose_target#:#Veuillez choisir un sujet à fusionner. forum#:#post_activation_desc#:#Si cochée, le modérateur doit valider chaque article pour autoriser sa publication sur le forum @@ -9750,9 +9751,9 @@ forum#:#preset_subject#:#Répéter l'objet lors d'une réponse forum#:#publish#:#Publier forum#:#reopen_topics#:#Ré-ouvrir forum#:#reply_to_postings#:#Répondre -forum#:#reset_limited_view#:#Limited view on this post an all posts below it.###31 03 2023 new variable -forum#:#reset_limited_view_button#:#Show entire thread###31 03 2023 new variable -forum#:#reset_limited_view_info#:#Limited view on this post and all posts below it.###31 03 2023 new variable +forum#:#reset_limited_view#:#Limited view on this post an all posts below it.###31 10 2023 new variable +forum#:#reset_limited_view_button#:#Show entire thread###31 10 2023 new variable +forum#:#reset_limited_view_info#:#Limited view on this post and all posts below it.###31 10 2023 new variable forum#:#restore#:#Restaurer forum#:#restore_draft_from_autosave#:#Restaurer le brouillon forum#:#save_draft_successfully#:#Le brouillon a été sauvegardé avec succès. @@ -9765,16 +9766,16 @@ forum#:#select_max_one_thread#:#Sélectionner un seul élément ! forum#:#selected_threads_closed#:#Les threads sélectionnés ont été fermés forum#:#selected_threads_reopened#:#Les fils sélectionnés ont été rouverts forum#:#sort_by_date#:#Trié par date -forum#:#sort_by_date_desc#:#The thread is presented in a flat view. The postings are shown in chronological order of creation.###31 03 2023 new variable +forum#:#sort_by_date_desc#:#The thread is presented in a flat view. The postings are shown in chronological order of creation.###31 10 2023 new variable forum#:#sort_by_posts#:#Trier par Sujet -forum#:#sort_by_posts_desc#:#The thread is presented in a tree view. Replies to posts are shown in the order in which they relate to each other.###31 03 2023 new variable -forum#:#sorting#:#Sorting###07 02 2020 new variable +forum#:#sort_by_posts_desc#:#The thread is presented in a tree view. Replies to posts are shown in the order in which they relate to each other.###31 10 2023 new variable +forum#:#sorting#:#Sorting forum#:#sorting_manual_sticky#:#Tri manuel des sujets marqués forum#:#sticky#:#Annonce -forum#:#sticky_threads_sorting#:#Sticky Threads Sorting###24 09 2021 new variable +forum#:#sticky_threads_sorting#:#Sticky Threads Sorting forum#:#sure_delete_drafts#:#Êtes-vous sûr de vouloir supprimer les brouillons sélectionnés? forum#:#switch_threads_for_merge#:#Le sujet choisi est plus ancien que le sujet ciblé. Pour garantir une bonne fusion, les sujets source et ciblé vont être inversés. -forum#:#target_select#:#Select posting for limited view###31 03 2023 new variable +forum#:#target_select#:#Select posting for limited view###31 10 2023 new variable forum#:#thread#:#Sujet forum#:#thread_deleted_by#:#Le thread suivant dans le forum «%2$s» a été supprimé par «%1$s»: forum#:#threads_moved_successfully#:#Les sujets sélectionnés ont été correctement déplacés dans un autre forum. @@ -9782,15 +9783,15 @@ forum#:#topic_close#:#Fermé forum#:#topics_please_select_one_action#:#Veuillez choisir une action. forum#:#user_decides_notification#:#Chaque utilisateur décide des options de notification glo#:#glo_add_from_other#:#Collecter les termes -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.###31 03 2023 new variable -glo#:#glo_collection#:#Collection Glossary###31 03 2023 new variable -glo#:#glo_collection_info#:#The glossary collects additional terms of other glossaries.###31 03 2023 new variable -glo#:#glo_content_assembly#:#Content Assembly###31 03 2023 new variable +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.###31 10 2023 new variable +glo#:#glo_collection#:#Collection Glossary###31 10 2023 new variable +glo#:#glo_collection_info#:#The glossary collects additional terms of other glossaries.###31 10 2023 new variable +glo#:#glo_content_assembly#:#Content Assembly###31 10 2023 new variable glo#:#glo_copy#:#Copier Glossaire glo#:#glo_copy_terms#:#Copier les termes glo#:#glo_link_glo_in_glo#:#Est-ce que tous les termes du glossaire cible doivent être liés au glossaire actuel maintenant? -glo#:#glo_page_type_gdf#:#Term Definition###30 04 2021 new variable -glo#:#glo_please_select_other_glo#:#Please select another glossary.###29 06 2022 new variable +glo#:#glo_page_type_gdf#:#Term Definition +glo#:#glo_please_select_other_glo#:#Please select another glossary. glo#:#glo_reference#:#Référence glo#:#glo_reference_terms#:#Termes de références glo#:#glo_referenced_term#:#Terme référencé @@ -9823,8 +9824,8 @@ grp#:#grp_agreement_header#:#Agrément de l'utilisateur grp#:#grp_agreement_required#:#Vous devez accepter l'agrément de l'utilisateur, si vous désirez accéder au contenu du groupe. grp#:#grp_already_assigned#:#Vous avez déjà demandé une adhésion pour ce groupe. grp#:#grp_at_least_one_admin#:#Il doit y avoir au moins un administrateur de groupe. -grp#:#grp_auto_notification#:#Welcome-Mail For New Members###07 02 2020 new variable -grp#:#grp_auto_notification_info#:#New members get a mail notification when added to the group.###07 02 2020 new variable +grp#:#grp_auto_notification#:#Welcome-Mail For New Members +grp#:#grp_auto_notification_info#:#New members get a mail notification when added to the group. grp#:#grp_cancel_subscr_request#:#Supprimer requête d'adhésion grp#:#grp_cancellation_end#:#Limite d'Annulation grp#:#grp_cancellation_end_info#:#A partir de cette date les participants ne peuvent plus se désinscrire. @@ -9859,7 +9860,7 @@ grp#:#grp_info_settings#:#Informations du Groupe grp#:#grp_information#:#Informations Importantes grp#:#grp_information_info#:#Cette information sera affichée dans l'onglet "Info" ainsi que lors de nouvelles inscriptions. grp#:#grp_join_request#:#Envoyer -grp#:#grp_lim_assigned#:#Already assigned to associated group "%s".###07 02 2020 new variable +grp#:#grp_lim_assigned#:#Already assigned to associated group "%s". grp#:#grp_mail_admission_new_bod#:#Nous sommes heureux de vous annoncer votre inscription au groupe "%s". grp#:#grp_mail_admission_new_sub#:#Votre inscription pour le groupe "%s" grp#:#grp_mail_all#:#Pour tous les Participants @@ -9900,7 +9901,7 @@ grp#:#grp_members#:#Membres grp#:#grp_members_deleted#:#Membres supprimés grp#:#grp_members_map#:#Carte des Membres du Groupe grp#:#grp_members_print_title#:#Membres du Groupe -grp#:#grp_min_one_admin#:#There has to be at least one administrator assigned to this group.###23 10 2023 new variable +grp#:#grp_min_one_admin#:#There has to be at least one administrator assigned to this group.###31 10 2023 new variable grp#:#grp_missing_grp_type#:#Veuillez choisir un type de groupe. grp#:#grp_missing_password#:#Veuillez saisir un mot de passe de groupe. grp#:#grp_new_status#:#Votre nouveau statut est : @@ -9986,10 +9987,10 @@ help#:#help_help_only#:#Workflow Seulement help#:#help_imported_on#:#Importé le help#:#help_module_uploaded#:#Package d'aide déposé. help#:#help_modules#:#Packages d'Aide -help#:#help_no_content#:#There is no help content available for the current screen. You may use the search tool.###07 02 2020 new variable +help#:#help_no_content#:#There is no help content available for the current screen. You may use the search tool. help#:#help_open_online_help#:#Aide En-Ligne Ouverte -help#:#help_search_label#:#Search Help###30 04 2021 new variable -help#:#help_select_a_file#:#Please select a file.###31 03 2023 new variable +help#:#help_search_label#:#Search Help +help#:#help_select_a_file#:#Please select a file.###31 10 2023 new variable help#:#help_set_mode#:#Changer Mode help#:#help_sure_delete_help_modules#:#Etes-vous sûr de vouloir supprimer ce package d'aide ? help#:#help_toggle_tooltips#:#Activer Etiquettes d'Aide @@ -10000,7 +10001,7 @@ help#:#help_tooltips_and_help#:#Etiquettes et Workflow help#:#help_tooltips_only#:#Etiquettes Seulement help#:#help_topcis#:#Sujets help#:#help_tt_text#:#Texte -iass#:#download_assessment_paper#:#Download Record file###30 04 2021 new variable +iass#:#download_assessment_paper#:#Download Record file iass#:#general#:#Informations générales iass#:#grading#:#Classement iass#:#grading_info#:#Informations de classement @@ -10011,9 +10012,9 @@ iass#:#iass_add_user_success#:#Utilisateur ajouté en tant que personne examiné iass#:#iass_added#:#Évaluation individuelle ajoutée iass#:#iass_amend_saved#:#Le dossier modifié a été sauvegardé. iass#:#iass_assessment_not_completed#:#Pas encore complétée -iass#:#iass_cancel#:#Cancel###30 04 2021 new variable +iass#:#iass_cancel#:#Cancel iass#:#iass_changed_by#:#Modifiée après finalisation -iass#:#iass_confirm_finalize#:#Finalize###30 04 2021 new variable +iass#:#iass_confirm_finalize#:#Finalize iass#:#iass_consultation_hours#:#Heures de consultation iass#:#iass_contact#:#Nom iass#:#iass_contact_info#:#Coordonnées @@ -10028,7 +10029,7 @@ iass#:#iass_event_time#:#Date de l’évaluation iass#:#iass_event_time_place_required#:#Date et lieu requis iass#:#iass_event_time_place_required_info#:#La date et le lieu de l’évaluation doivent être ajoutés à chaque dossier de participant. iass#:#iass_file#:#File -iass#:#iass_file_dropzone#:#you can drop your files here###30 04 2021 new variable +iass#:#iass_file_dropzone#:#you can drop your files here iass#:#iass_file_required#:#Fichier de dossier requis iass#:#iass_file_required_info#:#Un fichier de dossier doit être téléchargé pour chaque dossier de participant. iass#:#iass_file_visible_examinee#:#Fichier visible pour le participant @@ -10038,7 +10039,7 @@ iass#:#iass_filter_finalized#:#Completed only iass#:#iass_filter_not_finalized#:#Not completed only iass#:#iass_filter_not_started#:#Not started only iass#:#iass_finalize#:#Finaliser -iass#:#iass_finalize_info#:#Individual Assessment will be finalized.###30 04 2021 new variable +iass#:#iass_finalize_info#:#Individual Assessment will be finalized. iass#:#iass_finalize_user_qst#:#Le statut de la personne examinée doit-il vraiment être finalisé? Aucune modification possible par la suite. iass#:#iass_further_field_headline#:#Detailed Information iass#:#iass_graded_by#:#Classé par @@ -10065,8 +10066,8 @@ iass#:#iass_remove_user_qst#:#La personne examinée doit-elle vraiment être ret iass#:#iass_responsibility#:#Responsabilité iass#:#iass_save_amend#:#Sauvegarder le dossier modifié iass#:#iass_settings_saved#:#Paramètres sauvegardés. -iass#:#iass_sort_changetime_asc#:#Last Change ascending###07 02 2020 new variable -iass#:#iass_sort_changetime_desc#:#Last Change descending###07 02 2020 new variable +iass#:#iass_sort_changetime_asc#:#Last Change ascending +iass#:#iass_sort_changetime_desc#:#Last Change descending iass#:#iass_sort_examiner_login_asc#:#Examiner ascending iass#:#iass_sort_examiner_login_desc#:#Examiner descending iass#:#iass_sort_name_asc#:#Username ascending @@ -10077,7 +10078,7 @@ iass#:#iass_status_pending#:#Statut en attente iass#:#iass_subj_notification_completed#:#%s: Évaluation individuelle terminée. iass#:#iass_subj_notification_failed#:#%s: Évaluation individuelle échouée. iass#:#iass_upload_file#:#Fichier de dossier -iass#:#iass_user_removed#:#User successfully removed.###30 04 2021 new variable +iass#:#iass_user_removed#:#User successfully removed. iass#:#iass_usr_amend#:#Modifier classement iass#:#iass_usr_download_attachment#:#Télécharger la pièce-jointe iass#:#iass_usr_edit#:#Edit user record and learning progress @@ -10086,19 +10087,19 @@ iass#:#iass_usr_view#:#User record iass#:#il_iass_member#:#Individual Assessment examinee iass#:#il_iass_members#:#Participants iass#:#lp_inactive#:#Note: la progression d’apprentissage pour cet objet est inactive. Les affiliations ne peuvent donc pas être finalisées. -iass#:#save_amend#:#Save Amended Record###31 03 2023 new variable -impr#:#impr_page_type_impr#:#Imprint###30 04 2021 new variable +iass#:#save_amend#:#Save Amended Record###31 10 2023 new variable +impr#:#impr_page_type_impr#:#Imprint init#:#init_error_authentication_fail#:#Mauvaise authentification init#:#init_error_maintenance#:#Le serveur est indisponible pour cause de maintenance. Veuillez nous excuser. init#:#init_error_redirect_click#:#Cliquer pour continuer init#:#init_error_redirect_info#:#Redirection on supportée dans ce contexte -irss#:#max_revision#:#Max. Revision###31 03 2023 new variable -irss#:#resource_id#:#Resource ID###31 03 2023 new variable -irss#:#stakeholders#:#Stakeholders###31 03 2023 new variable -irss#:#storage_id#:#Storage ID###31 03 2023 new variable -irss#:#storage_info#:#Storage Information###31 03 2023 new variable +irss#:#max_revision#:#Max. Revision###31 10 2023 new variable +irss#:#resource_id#:#Resource ID###31 10 2023 new variable +irss#:#stakeholders#:#Stakeholders###31 10 2023 new variable +irss#:#storage_id#:#Storage ID###31 10 2023 new variable +irss#:#storage_info#:#Storage Information###31 10 2023 new variable itgr#:#itgr_always_open#:#Toujours ouvert -itgr#:#itgr_assign_materials#:#Assign Materials###31 03 2023 new variable +itgr#:#itgr_assign_materials#:#Assign Materials###31 10 2023 new variable itgr#:#itgr_assigned_materials#:#Ressources Associées itgr#:#itgr_assignment#:#Association itgr#:#itgr_behaviour#:#Comportement du bloc @@ -10109,15 +10110,15 @@ itgr#:#itgr_expandable_closed#:#Extensible (initialement fermé) itgr#:#itgr_expandable_open#:#Extensible (initialement ouvert) itgr#:#itgr_hide_title#:#Masquer titre itgr#:#itgr_item#:#Objet -itgr#:#itgr_list#:#List###31 03 2023 new variable -itgr#:#itgr_list_default#:#Default###31 03 2023 new variable -itgr#:#itgr_list_default_info#:#Inherits value from upper container.###31 03 2023 new variable -itgr#:#itgr_list_presentation#:#Item Presentation###31 03 2023 new variable +itgr#:#itgr_list#:#List###31 10 2023 new variable +itgr#:#itgr_list_default#:#Default###31 10 2023 new variable +itgr#:#itgr_list_default_info#:#Inherits value from upper container.###31 10 2023 new variable +itgr#:#itgr_list_presentation#:#Item Presentation###31 10 2023 new variable itgr#:#itgr_materials#:#Ressources itgr#:#itgr_show_title#:#Montrer titre itgr#:#itgr_show_title_info#:#Montre le titre du groupe d'articles dans la présentation pour l’apprenant. -itgr#:#itgr_tile#:#Tiles###31 03 2023 new variable -itgr#:#itgr_tile_size#:#Tile Size###31 03 2023 new variable +itgr#:#itgr_tile#:#Tiles###31 10 2023 new variable +itgr#:#itgr_tile_size#:#Tile Size###31 10 2023 new variable jscalendar#:#about_calendar#:#A propos du calendrier jscalendar#:#about_calendar_long#:#DHTML Date/Time Selectorn(c) dynarch.com 2002-2003nPour la dernière version, voir : http://dynarch.com/mishoo/calendar.eplnDistribué selon les termes de la licence GNU LGPL. Voir http://gnu.org/licenses/lgpl.html pour plus de détails.nnSélection de la date:n- Utiliser les boutons « et » pour sélectionner l'annéen- Utiliser les boutons < et > pour sélectionner le moisn- Maintenir le bouton de la souris appuyé plus longtemps pour une sélection rapide. jscalendar#:#about_time#:#nnSélection de l'heure :n- Cliquer sur n'importe quelle partie de l'heure pour l'augmentern- cliquer en maintenant la touche 'Shift' (majuscule) du clavier appuyée pour la diminuer, ou cliquez et déplacez la souris pour une sélection rapide. @@ -10196,8 +10197,8 @@ ldap#:#ldap_dn_info#:#Saisir le Distinguished Name du groupe LDAP. ldap#:#ldap_edit_role_ass_rule#:#Modifier règle d'assignation de rôle ldap#:#ldap_edit_role_assignment#:#Editer Rôle ➜ Association Groupe ldap#:#ldap_err_missing_plugin_id#:#Veuillez saisir un id de plugin valide. -ldap#:#ldap_escapedn#:#Escape DN###30 04 2021 new variable -ldap#:#ldap_escapedn_info#:#If enabled, special characters in the "Distinguished Name (DN)" of user accounts are escaped in queries for group membership.###30 04 2021 new variable +ldap#:#ldap_escapedn#:#Escape DN +ldap#:#ldap_escapedn_info#:#If enabled, special characters in the "Distinguished Name (DN)" of user accounts are escaped in queries for group membership. ldap#:#ldap_filter_info#:#Filtre qui sera ajouté au filtre de recherche : (&(userattr=username)(userfilter)). ldap#:#ldap_global_role#:#Rôle global ldap#:#ldap_global_role_assignment#:#Assignation de rôle ILIAS @@ -10224,7 +10225,7 @@ ldap#:#ldap_group_search_base#:#Base de recherche de groupe ldap#:#ldap_group_user_filter#:#Filtre utilisateur ldap#:#ldap_ilias_role#:#Rôle ILIAS ldap#:#ldap_info_text#:#Message d'Information -ldap#:#ldap_info_text_info#:#Si saisi, ce texte sera affiché dans le repository et sur l'onglet Info de l'objet sur lequel ce rôle est assigné. +ldap#:#ldap_info_text_info#:#Si saisi, ce texte sera affiché dans le catalogue et sur l'onglet Info de l'objet sur lequel ce rôle est assigné. ldap#:#ldap_local_role#:#Rôle local ldap#:#ldap_mapping_info_type#:#Afficher les informations dans le catalogue et le bureau personnel ldap#:#ldap_mapping_table#:#Assignation d'attributs LDAP au profil utilisateur ILIAS @@ -10303,13 +10304,13 @@ lhist#:#cont_create_lhist#:#Create Learning History Element lhist#:#cont_update_lhist#:#Edit Learning History Element lhist#:#lhist_all#:#All lhist#:#lhist_cont_placeholder_text#:#This element will show the learning history in the presentation mode of the portfolio. -lhist#:#lhist_enable_learning_history#:#Learning History###07 02 2020 new variable -lhist#:#lhist_enable_learning_history_info#:#Enables an overview of all achievements of a user.###07 02 2020 new variable -lhist#:#lhist_first_login#:#First Login -lhist#:#lhist_learning_history#:#Learning History +lhist#:#lhist_enable_learning_history#:#Learning History +lhist#:#lhist_enable_learning_history_info#:#Enables an overview of all achievements of a user. +lhist#:#lhist_first_login#:#Première connexion +lhist#:#lhist_learning_history#:#Parcours de formation lhist#:#lhist_lhist#:#Learning History lhist#:#lhist_manual#:#Manual -lhist#:#lhist_no_entries#:#Achieve your goals! Learn something today to further your learning history. +lhist#:#lhist_no_entries#:#Atteignez vos objectifs ! Apprenez quelque chose aujourd'hui pour poursuivre votre parcours de formation. lhist#:#lhist_period#:#Period lhist#:#lhist_selected#:#Selected lhist#:#lhist_show_more#:#Show More @@ -10321,19 +10322,19 @@ link#:#link_link#:#Lien link#:#link_mobs#:#Objets média link#:#link_terms#:#Termes link#:#link_wpages#:#Pages Wiki -lm#:#lm_btn_lp_toggle_state_completed#:#Set Not Completed###30 04 2021 new variable -lm#:#lm_btn_lp_toggle_state_not_completed#:#Set Completed###30 04 2021 new variable +lm#:#lm_btn_lp_toggle_state_completed#:#Set Not Completed +lm#:#lm_btn_lp_toggle_state_not_completed#:#Set Completed lm#:#lm_copy#:#Copier Module ILIAS -lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable -lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable -lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable -lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable -lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_edit_chapters#:#Edit Chapters###31 10 2023 new variable +lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###31 10 2023 new variable +lm#:#lm_est_reading_time#:#Estimated Reading Time###31 10 2023 new variable +lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 10 2023 new variable +lm#:#lm_page_type_lm#:#LM Page lm#:#lm_save_titles#:#Titres sauvegardés. -lng#:#language_detection#:#Language Detection###30 04 2021 new variable +lng#:#language_detection#:#Détection de la langue lng#:#lng_disable_language_detection#:#Désactiver la Détection de la Langue lng#:#lng_download_deprecated#:#Télécharger la liste obsolète -lng#:#lng_enable_language_detection#:#Activer la Détection de la Langue +lng#:#lng_enable_language_detection#:#Activer la détection de la langue log#:#log_browser#:#Journal de console du navigateur log#:#log_browser_users#:#Noms d’utilisateurs utilisant le journal de console log#:#log_cache_#:#Mise en cache @@ -10365,7 +10366,7 @@ logging#:#log_error_folder#:#Chemin logging#:#log_error_mail#:#Destinataire du mail logging#:#log_error_message#:#Erreur %s survenue. logging#:#log_error_message_send_mail#:#Veuillez envoyer un mail à %s -logging#:#log_error_path_not_configured_or_wrong#:#Path to errors (error_path) is not configured or unreachable.###07 02 2020 new variable +logging#:#log_error_path_not_configured_or_wrong#:#Path to errors (error_path) is not configured or unreachable. logging#:#log_error_settings#:#Erreur des paramètres de connexion logging#:#logs_settings#:#Paramètres de connexion lso#:#abstract#:#Abstract @@ -10379,18 +10380,18 @@ lso#:#entries_deleted#:#Successfuly delete entries lso#:#entries_updated#:#Entries saved lso#:#extro#:#Exitpage lso#:#extro_img#:#Image for Exitpage -lso#:#failed#:#Failed###07 02 2020 new variable -lso#:#finished#:#Finished###07 02 2020 new variable +lso#:#failed#:#Failed +lso#:#finished#:#Finished lso#:#first_access#:#First Access lso#:#last_access#:#Last Access lso#:#last_visited_step#:#Last visited Step lso#:#learner_view#:#Overview -lso#:#lso_activation_online_info#:#Set the Learning Sequence online to make it visible and available for Learning Sequence members. If not, only administrators and tutors will have access to it.###07 02 2020 new variable +lso#:#lso_activation_online_info#:#Set the Learning Sequence online to make it visible and available for Learning Sequence members. If not, only administrators and tutors will have access to it. lso#:#lso_at_least_one_admin#:#There has to be at least one learning sequence administrator. lso#:#lso_edit_permission#:#User can change permission settings lso#:#lso_header_delete_members#:#Would you like to remove the following members from this learning sequence? lso#:#lso_header_edit_members#:#Edit Members -lso#:#lso_intropages_deprecationhint#:#You can edit the abstract and exit page in the tab "Content".###31 03 2023 new variable +lso#:#lso_intropages_deprecationhint#:#You can edit the abstract and exit page in the tab "Content".###31 10 2023 new variable lso#:#lso_mail_admission_new_bod#:#we are pleased to announce your registration for the learning sequence "%s". lso#:#lso_mail_admission_new_sub#:#Your registration for learning sequence "%s" lso#:#lso_mail_dismiss_bod#:#your membership in learning sequence "%s" has been terminated. @@ -10416,8 +10417,8 @@ lso#:#lso_mail_unsubscribe_member_bod#:#we confirm your cancellation of membersh lso#:#lso_mail_unsubscribe_member_sub#:#Your cancellation of membership in learning sequence "%s" lso#:#lso_mail_wl_bod#:#you have been assigned to the waiting list of learning sequence "%s".\nYou are assigned to position %s on the list.\n\nYou will receive a message from a learning sequence administrator when your request has been approved or rejected. lso#:#lso_mail_wl_sub#:#Your registration for learning sequence "%s" -lso#:#lso_mainbar_button_label_curriculum#:#Curriculum###07 02 2020 new variable -lso#:#lso_mainbar_button_label_toc#:#Content###07 02 2020 new variable +lso#:#lso_mainbar_button_label_curriculum#:#Curriculum +lso#:#lso_mainbar_button_label_toc#:#Content lso#:#lso_mem_tbl_header#:#Learning Sequence Member lso#:#lso_member_administration#:#Edit Participants lso#:#lso_members_deleted#:#Deleted members @@ -10425,7 +10426,7 @@ lso#:#lso_members_gallery#:#Learning Sequence Members Gallery lso#:#lso_members_print_title#:#Learning sequence mebers lso#:#lso_min_one_admin#:#There has to be at least one administrator assigned to this learning sequence. lso#:#lso_msg_member_assigned#:#User(s) assigned as learning sequence member(s) -lso#:#lso_multidownload_not_available#:#Downloading multiple objects is currently not available for Learning Sequence Objects.###23 10 2023 new variable +lso#:#lso_multidownload_not_available#:#Downloading multiple objects is currently not available for Learning Sequence Objects.###31 10 2023 new variable lso#:#lso_new_status#:#Your new status is: lso#:#lso_notification#:#Notification lso#:#lso_notification_explanation_admin#:#You receive mail from ILIAS because you are learning sequence administrator with notification enabled. @@ -10440,24 +10441,24 @@ lso#:#lso_player_resume#:#Resume Learning Sequence lso#:#lso_player_review#:#Review Learning Sequence lso#:#lso_player_start#:#Start Learning Sequence lso#:#lso_player_suspend#:#Suspend -lso#:#lso_player_viewmodelabel#:#Learning Sequence###31 03 2023 new variable +lso#:#lso_player_viewmodelabel#:#Learning Sequence###31 10 2023 new variable lso#:#lso_print_list#:#Print list lso#:#lso_read#:#User has read access to Learning Sequence lso#:#lso_search_users#:#Search user lso#:#lso_settings_availability#:#availability lso#:#lso_settings_extro#:#Exitpage Settings lso#:#lso_settings_intro#:#Intropage Settings -lso#:#lso_settings_old_extro#:#View Old Exit Page###31 03 2023 new variable -lso#:#lso_settings_old_intro#:#View Old Intro Page###31 03 2023 new variable +lso#:#lso_settings_old_extro#:#View Old Exit Page###31 10 2023 new variable +lso#:#lso_settings_old_intro#:#View Old Intro Page###31 10 2023 new variable lso#:#lso_show_members_info#:#Member Gallery available for users -lso#:#lso_start_item#:#Open %s###07 02 2020 new variable +lso#:#lso_start_item#:#Open %s lso#:#lso_users_already_assigned#:#The user is already assigned to this learning sequence lso#:#mail_lso_roles#:#Send mails to roles of learning sequence. -lso#:#manage#:#Manage###07 02 2020 new variable +lso#:#manage#:#Manage lso#:#manage_content_maintab#:#Content lso#:#members_gallery#:#Member Gallery lso#:#no_entries_selected_for_delete#:#There has to be at least one entry selected. -lso#:#not_finished#:#Not Finished###07 02 2020 new variable +lso#:#not_finished#:#Not Finished lso#:#participate#:#Subscribe lso#:#show_summary#:#Info lso#:#table_actions#:#Actions @@ -10468,194 +10469,194 @@ lso#:#table_sequence_content#:#Content Management lso#:#table_title#:#Title lso#:#unparticipate#:#Unsubscribe lti#:#act_lti_for_obj_type#:#Activer la LTI pour le type d’objet -lti#:#activity_id#:#Activity ID###07 02 2020 new variable -lti#:#activity_id_info#:#This Activity ID is used by the LTI Provider to identify Statements.###07 02 2020 new variable +lti#:#activity_id#:#Activity ID +lti#:#activity_id_info#:#This Activity ID is used by the LTI Provider to identify Statements. lti#:#auth_lti#:#Auteur LTI -lti#:#conf_privacy_ident#:#User identification###30 04 2021 new variable -lti#:#conf_privacy_ident_il_uuid_ext_account#:#External User Id combined with a unique ILIAS platform id formated as an email adress.###30 04 2021 new variable -lti#:#conf_privacy_ident_il_uuid_ext_account_info#:#This is identical to each call, but may allow a direct conclusion about the user.###30 04 2021 new variable -lti#:#conf_privacy_ident_il_uuid_login#:#ILIAS Login combined with a unique ILIAS platform id formated as an email adress.###30 04 2021 new variable -lti#:#conf_privacy_ident_il_uuid_login_info#:#This is identical to each call, but may allow a direct conclusion about the ILIAS user.###30 04 2021 new variable -lti#:#conf_privacy_ident_il_uuid_random#:#Random ID combined with a unique ILIAS platform ID formatted as an E-Mail address###31 03 2023 new variable -lti#:#conf_privacy_ident_il_uuid_random_info#:#For each ILIAS object and ILIAS user a random ID is generated which remains identical for each call. Conclusions about a user are very limited because it is practically impossible to create user profiles across objects.###31 03 2023 new variable -lti#:#conf_privacy_ident_il_uuid_sha256#:#Hash combined with a unique ILIAS platform id formatted as an E-Mail address###26 09 2022 new variable -lti#:#conf_privacy_ident_il_uuid_sha256_info#:#This is identical to each call, but does not permit any direct conclusions about the ILIAS user.###26 09 2022 new variable -lti#:#conf_privacy_ident_il_uuid_sha256url#:#Hash combined with the ILIAS Domain formatted as an E-Mail address###26 09 2022 new variable -lti#:#conf_privacy_ident_il_uuid_sha256url_info#:#This is identical to each call, with a maximum of 80 characters significantly shorter than the variant with the ILIAS platform ID and allows only very limited conclusions about the ILIAS user.###26 09 2022 new variable -lti#:#conf_privacy_ident_il_uuid_user_id#:#ILIAS user id combined with a unique ILIAS platform id formated as an email adress.###30 04 2021 new variable -lti#:#conf_privacy_ident_il_uuid_user_id_info#:#This is identical to each call, but doesn't allow a direct conclusion about the ILIAS user.###30 04 2021 new variable -lti#:#conf_privacy_ident_info#:#Standard is frequently the email address. The unique ILIAS platform id is:###30 04 2021 new variable -lti#:#conf_privacy_ident_real_email#:#E-Mail Address###30 04 2021 new variable -lti#:#conf_privacy_ident_real_email_info#:#Sends E-Mail Address of user as identification (Warning: an E-Mail Address might be used by multiple users!)###30 04 2021 new variable -lti#:#conf_privacy_name#:#User name###30 04 2021 new variable -lti#:#conf_privacy_name_firstname#:#First name###30 04 2021 new variable -lti#:#conf_privacy_name_firstname_info#:#Sends the first name of the user name from ILIAS###30 04 2021 new variable -lti#:#conf_privacy_name_fullname#:#Entire name###30 04 2021 new variable -lti#:#conf_privacy_name_fullname_info#:#Sends title, first name and last name###30 04 2021 new variable -lti#:#conf_privacy_name_info#:#Sending an user name is usually not required.###30 04 2021 new variable -lti#:#conf_privacy_name_lastname#:#Title and last name###30 04 2021 new variable -lti#:#conf_privacy_name_lastname_info#:#Sends Mister or Ms/Mrs. (unless otherwise specified) and the last name###30 04 2021 new variable -lti#:#conf_privacy_name_none#:#No one###30 04 2021 new variable -lti#:#conf_privacy_name_none_info#:#Sends '-' instead of a name###30 04 2021 new variable -lti#:#conf_user_ident#:#User identification###31 03 2023 new variable -lti#:#conf_user_ident_il_uuid_ext_account#:#External User Id combined with a unique ILIAS platform id formated as an email adress.###31 03 2023 new variable -lti#:#conf_user_ident_il_uuid_ext_account_info#:#This is identical to each call, but may allow a direct conclusion about the user.###31 03 2023 new variable -lti#:#conf_user_ident_il_uuid_login#:#ILIAS Login combined with a unique ILIAS platform id formated as an email adress.###31 03 2023 new variable -lti#:#conf_user_ident_il_uuid_login_info#:#This is identical to each call, but may allow a direct conclusion about the ILIAS user.###31 03 2023 new variable -lti#:#conf_user_ident_il_uuid_user_id#:#ILIAS user id combined with a unique ILIAS platform id formated as an email adress.###31 03 2023 new variable -lti#:#conf_user_ident_il_uuid_user_id_info#:#This is identical to each call, but doesn't allow a direct conclusion about the ILIAS user.###31 03 2023 new variable -lti#:#conf_user_ident_info#:#Standard is frequently the email address. The unique ILIAS platform id is:###31 03 2023 new variable -lti#:#conf_user_ident_real_email#:#E-Mail Address###31 03 2023 new variable -lti#:#conf_user_ident_real_email_info#:#Sends E-Mail Address of user as identification (Warning: an E-Mail Address might be used by multiple users!)###31 03 2023 new variable -lti#:#conf_user_name#:#User name###31 03 2023 new variable -lti#:#conf_user_name_firstname#:#First name###31 03 2023 new variable -lti#:#conf_user_name_firstname_info#:#Sends the first name of the user name from ILIAS###31 03 2023 new variable -lti#:#conf_user_name_fullname#:#Entire name###31 03 2023 new variable -lti#:#conf_user_name_fullname_info#:#Sends title, first name and last name###31 03 2023 new variable -lti#:#conf_user_name_info#:#Sending an user name is usually not required.###31 03 2023 new variable -lti#:#conf_user_name_lastname#:#Title and last name###31 03 2023 new variable -lti#:#conf_user_name_lastname_info#:#Sends Mister or Ms/Mrs. (unless otherwise specified) and the last name###31 03 2023 new variable -lti#:#conf_user_name_none#:#No one###31 03 2023 new variable -lti#:#conf_user_name_none_info#:#Sends '-' instead of a name###31 03 2023 new variable +lti#:#conf_privacy_ident#:#User identification +lti#:#conf_privacy_ident_il_uuid_ext_account#:#External User Id combined with a unique ILIAS platform id formated as an email adress. +lti#:#conf_privacy_ident_il_uuid_ext_account_info#:#This is identical to each call, but may allow a direct conclusion about the user. +lti#:#conf_privacy_ident_il_uuid_login#:#ILIAS Login combined with a unique ILIAS platform id formated as an email adress. +lti#:#conf_privacy_ident_il_uuid_login_info#:#This is identical to each call, but may allow a direct conclusion about the ILIAS user. +lti#:#conf_privacy_ident_il_uuid_random#:#Random ID combined with a unique ILIAS platform ID formatted as an E-Mail address###31 10 2023 new variable +lti#:#conf_privacy_ident_il_uuid_random_info#:#For each ILIAS object and ILIAS user a random ID is generated which remains identical for each call. Conclusions about a user are very limited because it is practically impossible to create user profiles across objects.###31 10 2023 new variable +lti#:#conf_privacy_ident_il_uuid_sha256#:#Hash combined with a unique ILIAS platform id formatted as an E-Mail address +lti#:#conf_privacy_ident_il_uuid_sha256_info#:#This is identical to each call, but does not permit any direct conclusions about the ILIAS user. +lti#:#conf_privacy_ident_il_uuid_sha256url#:#Hash combined with the ILIAS Domain formatted as an E-Mail address +lti#:#conf_privacy_ident_il_uuid_sha256url_info#:#This is identical to each call, with a maximum of 80 characters significantly shorter than the variant with the ILIAS platform ID and allows only very limited conclusions about the ILIAS user. +lti#:#conf_privacy_ident_il_uuid_user_id#:#ILIAS user id combined with a unique ILIAS platform id formated as an email adress. +lti#:#conf_privacy_ident_il_uuid_user_id_info#:#This is identical to each call, but doesn't allow a direct conclusion about the ILIAS user. +lti#:#conf_privacy_ident_info#:#Standard is frequently the email address. The unique ILIAS platform id is: +lti#:#conf_privacy_ident_real_email#:#E-Mail Address +lti#:#conf_privacy_ident_real_email_info#:#Sends E-Mail Address of user as identification (Warning: an E-Mail Address might be used by multiple users!) +lti#:#conf_privacy_name#:#User name +lti#:#conf_privacy_name_firstname#:#First name +lti#:#conf_privacy_name_firstname_info#:#Sends the first name of the user name from ILIAS +lti#:#conf_privacy_name_fullname#:#Entire name +lti#:#conf_privacy_name_fullname_info#:#Sends title, first name and last name +lti#:#conf_privacy_name_info#:#Sending an user name is usually not required. +lti#:#conf_privacy_name_lastname#:#Title and last name +lti#:#conf_privacy_name_lastname_info#:#Sends Mister or Ms/Mrs. (unless otherwise specified) and the last name +lti#:#conf_privacy_name_none#:#No one +lti#:#conf_privacy_name_none_info#:#Sends '-' instead of a name +lti#:#conf_user_ident#:#User identification###31 10 2023 new variable +lti#:#conf_user_ident_il_uuid_ext_account#:#External User Id combined with a unique ILIAS platform id formated as an email adress.###31 10 2023 new variable +lti#:#conf_user_ident_il_uuid_ext_account_info#:#This is identical to each call, but may allow a direct conclusion about the user.###31 10 2023 new variable +lti#:#conf_user_ident_il_uuid_login#:#ILIAS Login combined with a unique ILIAS platform id formated as an email adress.###31 10 2023 new variable +lti#:#conf_user_ident_il_uuid_login_info#:#This is identical to each call, but may allow a direct conclusion about the ILIAS user.###31 10 2023 new variable +lti#:#conf_user_ident_il_uuid_user_id#:#ILIAS user id combined with a unique ILIAS platform id formated as an email adress.###31 10 2023 new variable +lti#:#conf_user_ident_il_uuid_user_id_info#:#This is identical to each call, but doesn't allow a direct conclusion about the ILIAS user.###31 10 2023 new variable +lti#:#conf_user_ident_info#:#Standard is frequently the email address. The unique ILIAS platform id is:###31 10 2023 new variable +lti#:#conf_user_ident_real_email#:#E-Mail Address###31 10 2023 new variable +lti#:#conf_user_ident_real_email_info#:#Sends E-Mail Address of user as identification (Warning: an E-Mail Address might be used by multiple users!)###31 10 2023 new variable +lti#:#conf_user_name#:#User name###31 10 2023 new variable +lti#:#conf_user_name_firstname#:#First name###31 10 2023 new variable +lti#:#conf_user_name_firstname_info#:#Sends the first name of the user name from ILIAS###31 10 2023 new variable +lti#:#conf_user_name_fullname#:#Entire name###31 10 2023 new variable +lti#:#conf_user_name_fullname_info#:#Sends title, first name and last name###31 10 2023 new variable +lti#:#conf_user_name_info#:#Sending an user name is usually not required.###31 10 2023 new variable +lti#:#conf_user_name_lastname#:#Title and last name###31 10 2023 new variable +lti#:#conf_user_name_lastname_info#:#Sends Mister or Ms/Mrs. (unless otherwise specified) and the last name###31 10 2023 new variable +lti#:#conf_user_name_none#:#No one###31 10 2023 new variable +lti#:#conf_user_name_none_info#:#Sends '-' instead of a name###31 10 2023 new variable lti#:#consumers#:#Consommateurs -lti#:#description_info#:#The description will be shown below the title.###07 02 2020 new variable -lti#:#field_provider_xml#:#XML-File###07 02 2020 new variable -lti#:#field_provider_xml_info#:#Supported are XML-Files for Tool Consumer and for Common Cartridge according to https://www.imsglobal.org/specs/lti/xml.###07 02 2020 new variable -lti#:#form_import_provider#:#Import Global Provider###07 02 2020 new variable +lti#:#description_info#:#The description will be shown below the title. +lti#:#field_provider_xml#:#XML-File +lti#:#field_provider_xml_info#:#Supported are XML-Files for Tool Consumer and for Common Cartridge according to https://www.imsglobal.org/specs/lti/xml. +lti#:#form_import_provider#:#Import Global Provider lti#:#gbl_roles_to_users#:#Rôle global assigné aux utilisateurs LTI -lti#:#global_provider_subtab#:#Global Providers for all Users###07 02 2020 new variable -lti#:#grade_activityProgress_completed#:#completed###31 03 2023 new variable -lti#:#grade_activityProgress_passed#:#passed###31 03 2023 new variable -lti#:#grade_all_verbs#:#all status information###31 03 2023 new variable -lti#:#highscore_achieved_ts#:#Date###07 02 2020 new variable -lti#:#highscore_achieved_ts_description#:#A column containing the date will be included in the ranking.###07 02 2020 new variable -lti#:#highscore_all_tables#:#Participant's Own Rank and Top Ranking###07 02 2020 new variable -lti#:#highscore_all_tables_description#:#Participants get information about the top ranking and their own position in the ranking.###07 02 2020 new variable -lti#:#highscore_description#:#The names of other users could be displayed if the right 'View learning experiences of other users' is set.###07 02 2020 new variable -lti#:#highscore_enabled#:#Ranking###07 02 2020 new variable -lti#:#highscore_mode#:#Mode###07 02 2020 new variable -lti#:#highscore_own_table#:#Participant's Own Rank###07 02 2020 new variable -lti#:#highscore_own_table_description#:#Participants are advised of their own position in the ranking.###07 02 2020 new variable -lti#:#highscore_percentage#:#Percentage###07 02 2020 new variable -lti#:#highscore_percentage_description#:#A column containing the score as percentage will be included in the ranking.###07 02 2020 new variable -lti#:#highscore_score#:#Score###07 02 2020 new variable -lti#:#highscore_score_description#:#A column containing the score will be included in the ranking.###07 02 2020 new variable -lti#:#highscore_top_num#:#Length of Top Ranking###07 02 2020 new variable -lti#:#highscore_top_num_description#:#Specify how many ranks are to be included in the top ranking list.###07 02 2020 new variable -lti#:#highscore_top_num_unit#:#entries###07 02 2020 new variable -lti#:#highscore_top_table#:#Top Ranking###07 02 2020 new variable -lti#:#highscore_top_table_description#:#Participants are presented with a table containing the top rankings.###07 02 2020 new variable -lti#:#highscore_wtime#:#Duration###07 02 2020 new variable -lti#:#highscore_wtime_description#:#A column containing the duration will be included in the ranking.###07 02 2020 new variable -lti#:#launch_method#:#Options for Launch###07 02 2020 new variable -lti#:#launch_method_embedded#:#Embedded Content###07 02 2020 new variable -lti#:#launch_method_embedded_info#:#The content is opened within the ILIAS context. It is presented as embedded content within the content tab.###07 02 2020 new variable -lti#:#launch_method_new_win#:#New Window###07 02 2020 new variable -lti#:#launch_method_new_win_info#:#The content is opened in a new window. When leaving the content this window gets closed.###07 02 2020 new variable -lti#:#launch_method_own_win#:#Own Window###07 02 2020 new variable -lti#:#launch_method_own_win_info#:#The content is opened in the same window and replaces the ILIAS Screen. When leaving the content the user returns to ILIAS.###07 02 2020 new variable -lti#:#launched#:#Resource was already launched.###07 02 2020 new variable -lti#:#learning_progress_options#:#Options for Learning Progress###07 02 2020 new variable +lti#:#global_provider_subtab#:#Global Providers for all Users +lti#:#grade_activityProgress_completed#:#completed###31 10 2023 new variable +lti#:#grade_activityProgress_passed#:#passed###31 10 2023 new variable +lti#:#grade_all_verbs#:#all status information###31 10 2023 new variable +lti#:#highscore_achieved_ts#:#Date +lti#:#highscore_achieved_ts_description#:#A column containing the date will be included in the ranking. +lti#:#highscore_all_tables#:#Participant's Own Rank and Top Ranking +lti#:#highscore_all_tables_description#:#Participants get information about the top ranking and their own position in the ranking. +lti#:#highscore_description#:#The names of other users could be displayed if the right 'View learning experiences of other users' is set. +lti#:#highscore_enabled#:#Ranking +lti#:#highscore_mode#:#Mode +lti#:#highscore_own_table#:#Participant's Own Rank +lti#:#highscore_own_table_description#:#Participants are advised of their own position in the ranking. +lti#:#highscore_percentage#:#Percentage +lti#:#highscore_percentage_description#:#A column containing the score as percentage will be included in the ranking. +lti#:#highscore_score#:#Score +lti#:#highscore_score_description#:#A column containing the score will be included in the ranking. +lti#:#highscore_top_num#:#Length of Top Ranking +lti#:#highscore_top_num_description#:#Specify how many ranks are to be included in the top ranking list. +lti#:#highscore_top_num_unit#:#entries +lti#:#highscore_top_table#:#Top Ranking +lti#:#highscore_top_table_description#:#Participants are presented with a table containing the top rankings. +lti#:#highscore_wtime#:#Duration +lti#:#highscore_wtime_description#:#A column containing the duration will be included in the ranking. +lti#:#launch_method#:#Options for Launch +lti#:#launch_method_embedded#:#Embedded Content +lti#:#launch_method_embedded_info#:#The content is opened within the ILIAS context. It is presented as embedded content within the content tab. +lti#:#launch_method_new_win#:#New Window +lti#:#launch_method_new_win_info#:#The content is opened in a new window. When leaving the content this window gets closed. +lti#:#launch_method_own_win#:#Own Window +lti#:#launch_method_own_win_info#:#The content is opened in the same window and replaces the ILIAS Screen. When leaving the content the user returns to ILIAS. +lti#:#launched#:#Resource was already launched. +lti#:#learning_progress_options#:#Options for Learning Progress lti#:#lm_only_one_download_per_type#:#Veuillez noter que vous ne pouvez rendre accessible au public qu’un seul fichier par type (XML, HTML, SCORM). -lti#:#lti13_hints#:#Hints###31 03 2023 new variable -lti#:#lti_13_authentication_url#:#Authentication Request URL###31 03 2023 new variable -lti#:#lti_13_client_id#:#Client-ID###31 03 2023 new variable -lti#:#lti_13_deployment_id#:#Deployment-ID###31 03 2023 new variable -lti#:#lti_13_keyset_url#:#Public Keyset URL###31 03 2023 new variable -lti#:#lti_13_platform_id#:#Platform-ID###31 03 2023 new variable -lti#:#lti_13_step1#:#Step 1###31 03 2023 new variable -lti#:#lti_13_step1_info#:#For the initiating platform (consumer), enter the following address for Launch URL, Initiate Login URL, Redirection URI, and Registration URL:###31 03 2023 new variable -lti#:#lti_13_step2#:#Step 2###31 03 2023 new variable -lti#:#lti_13_step2_info#:#You will receive information from the initiating platform (Consumer), which you must enter in the following fields. After saving, the LTI 1.3 functionalities are available.###31 03 2023 new variable -lti#:#lti_13_token_url#:#Access Token URL###31 03 2023 new variable -lti#:#lti_action_accept_provider_as_global#:#Accept Provider as Global Provider for all Users###07 02 2020 new variable -lti#:#lti_action_accept_providers_as_global#:#Accept Providers as Global###07 02 2020 new variable -lti#:#lti_action_delete_providers#:#Delete Providers###07 02 2020 new variable -lti#:#lti_action_edit_provider#:#Edit Provider###07 02 2020 new variable -lti#:#lti_action_reset_provider_to_user_scope#:#Reset Provider as User Defined Provider###07 02 2020 new variable -lti#:#lti_action_reset_providers_to_user_scope#:#Reset Providers as User Defined###07 02 2020 new variable -lti#:#lti_add_global_provider#:#Add Global Provider for all Users###07 02 2020 new variable -lti#:#lti_add_own_provider#:#Add Own Provider (not for all Users)###07 02 2020 new variable +lti#:#lti13_hints#:#If the tool was created without dynamic registration, the following data must be entered for the tool to run.###31 10 2023 new variable +lti#:#lti_13_authentication_url#:#Authentication Request URL###31 10 2023 new variable +lti#:#lti_13_client_id#:#Client-ID###31 10 2023 new variable +lti#:#lti_13_deployment_id#:#Deployment-ID###31 10 2023 new variable +lti#:#lti_13_keyset_url#:#Public Keyset URL###31 10 2023 new variable +lti#:#lti_13_platform_id#:#Platform-ID###31 10 2023 new variable +lti#:#lti_13_step1#:#Step 1###31 10 2023 new variable +lti#:#lti_13_step1_info#:#For the initiating platform (consumer), enter the following address for Launch URL, Initiate Login URL, Redirection URI, and Registration URL:###31 10 2023 new variable +lti#:#lti_13_step2#:#Step 2###31 10 2023 new variable +lti#:#lti_13_step2_info#:#You will receive information from the initiating platform (Consumer), which you must enter in the following fields. After saving, the LTI 1.3 functionalities are available.###31 10 2023 new variable +lti#:#lti_13_token_url#:#Access Token URL###31 10 2023 new variable +lti#:#lti_action_accept_provider_as_global#:#Accept Provider as Global Provider for all Users +lti#:#lti_action_accept_providers_as_global#:#Accept Providers as Global +lti#:#lti_action_delete_providers#:#Delete Providers +lti#:#lti_action_edit_provider#:#Edit Provider +lti#:#lti_action_reset_provider_to_user_scope#:#Reset Provider as User Defined Provider +lti#:#lti_action_reset_providers_to_user_scope#:#Reset Providers as User Defined +lti#:#lti_add_global_provider#:#Add Global Provider for all Users +lti#:#lti_add_own_provider#:#Add Own Provider (not for all Users) lti#:#lti_admin#:#Administrateur LTI -lti#:#lti_at_least_one_prov_has_usages#:#At least one provider could not be deleted because this provider has usages (might be in trash).###07 02 2020 new variable +lti#:#lti_at_least_one_prov_has_usages#:#At least one provider could not be deleted because this provider has usages (might be in trash). lti#:#lti_auth_failed_invalid_key#:#Authentification échouée, aucune clé consommateur valide donnée. -lti#:#lti_con_content_item#:#Support for Deep Linking###31 03 2023 new variable -lti#:#lti_con_content_item_url#:#Content URL###31 03 2023 new variable -lti#:#lti_con_grade_synchronization#:#Advanced Grading Services###31 03 2023 new variable -lti#:#lti_con_grade_synchronization_info#:#The LTI tool must offer 'Assignment and Grade Services'.###31 03 2023 new variable -lti#:#lti_con_initiate_login_url#:#Initiate Login URL###31 03 2023 new variable -lti#:#lti_con_key_type#:#Public Key Type###31 03 2023 new variable -lti#:#lti_con_key_type_jwk#:#URL (Json Web Token)###31 03 2023 new variable -lti#:#lti_con_key_type_jwk_url#:#URL###31 03 2023 new variable -lti#:#lti_con_key_type_rsa#:#RSA-Key###31 03 2023 new variable -lti#:#lti_con_key_type_rsa_public_key#:#Public Key###31 03 2023 new variable -lti#:#lti_con_key_type_rsa_public_key_info#:#Insert the key provided by the tool (provider) in PEM format here.###31 03 2023 new variable -lti#:#lti_con_prov_always_learner#:#LTI User is always Learner###07 02 2020 new variable -lti#:#lti_con_prov_always_learner_info#:#Usually the role in ILIAS is mapped to a LTI role. Course Administrators could have more rights in the Provider, e.g. to manipulate the object. Activate this option to avoid the Role Mapping.###07 02 2020 new variable -lti#:#lti_con_prov_authentication#:#Authentication###07 02 2020 new variable -lti#:#lti_con_prov_availability#:#Availability###07 02 2020 new variable -lti#:#lti_con_prov_availability_create#:#For Creating Objects###07 02 2020 new variable -lti#:#lti_con_prov_availability_existing#:#Only for existing Objects###07 02 2020 new variable -lti#:#lti_con_prov_availability_non#:#not available###07 02 2020 new variable -lti#:#lti_con_prov_category#:#Category###07 02 2020 new variable -lti#:#lti_con_prov_category_info#:#Category to filter entries when LTI Consumer Object is created.###07 02 2020 new variable -lti#:#lti_con_prov_custom_params#:#Custom Parameters for this specific Provider###07 02 2020 new variable -lti#:#lti_con_prov_custom_params_info#:#Please enter them in the form param1=value1; param2=value2###07 02 2020 new variable -lti#:#lti_con_prov_description#:#Description###07 02 2020 new variable -lti#:#lti_con_prov_dyn_reg_params#:#Optional Parameters###23 10 2023 new variable -lti#:#lti_con_prov_dyn_reg_params_info#:#Here, for example, references to target objects in the tool can be specified.###23 10 2023 new variable -lti#:#lti_con_prov_dyn_reg_url#:#Registration URL of the Tool###31 03 2023 new variable -lti#:#lti_con_prov_dyn_reg_url_info#:#Note: Not every tool supports dynamic registration.###23 10 2023 new variable -lti#:#lti_con_prov_external_provider#:#External Provider###07 02 2020 new variable -lti#:#lti_con_prov_external_provider_info#:#A hint will be shown to users when dealing with an external Provider. An external Provider is characterized by insufficient influence on the Provider by the operator of the ILIAS-installation. This is the case when there are no rights to delete.###07 02 2020 new variable -lti#:#lti_con_prov_group_options#:#Options to group and filter Providers###07 02 2020 new variable -lti#:#lti_con_prov_has_outcome_service#:#Provider supports Outcome Service###07 02 2020 new variable -lti#:#lti_con_prov_has_outcome_service_info#:#If the LTI Outcome Service is supported, Learning Progress could be activated. The Provider returns a value between 0 and 1 to indicate the Learning Progress.###07 02 2020 new variable -lti#:#lti_con_prov_hints#:#Hints###07 02 2020 new variable -lti#:#lti_con_prov_icon#:#Icon###07 02 2020 new variable -lti#:#lti_con_prov_inc_usr_pic#:#Send User Picture###07 02 2020 new variable -lti#:#lti_con_prov_inc_usr_pic_info#:#Links to ILIAS user pictures are included at launch of LTI consumer object.###07 02 2020 new variable -lti#:#lti_con_prov_instructor_email#:#Instructor E-Mail###31 03 2023 new variable -lti#:#lti_con_prov_instructor_email_info#:#In difference to the previously selected settings, the e-mail address can be transferred for instructors. To do this, they must be course or group administrators.###31 03 2023 new variable -lti#:#lti_con_prov_instructor_name#:#Instructor Name###31 03 2023 new variable -lti#:#lti_con_prov_instructor_name_info#:#In difference to the previously selected settings, the name can be transferred for instructors.###31 03 2023 new variable -lti#:#lti_con_prov_key#:#Key###07 02 2020 new variable -lti#:#lti_con_prov_keywords#:#Keywords###07 02 2020 new variable -lti#:#lti_con_prov_keywords_info#:#The keywords must be separated by a Semicolon (;). The Keywords are automatically taken to the Metadata as Keywords.###07 02 2020 new variable -lti#:#lti_con_prov_launch_options#:#Launch Options###07 02 2020 new variable -lti#:#lti_con_prov_learning_progress_options#:#Options for Learning Progress###07 02 2020 new variable -lti#:#lti_con_prov_mastery_score_default#:#Default Mastery Score###07 02 2020 new variable -lti#:#lti_con_prov_mastery_score_default_info#:#The Learning Progress will be evaluated from the Provider Outcome Service and the mastery score threshold.###07 02 2020 new variable -lti#:#lti_con_prov_privacy_setting_conf#:#Configuration Options###07 02 2020 new variable -lti#:#lti_con_prov_privacy_setting_default#:#Default Settings, changeable for Objects###07 02 2020 new variable -lti#:#lti_con_prov_privacy_setting_force#:#Settings are not changeable for Objects###07 02 2020 new variable -lti#:#lti_con_prov_privacy_setting_info#:#Configuration Options for Privacy Settings###07 02 2020 new variable -lti#:#lti_con_prov_privacy_settings#:#Privacy Settings###07 02 2020 new variable -lti#:#lti_con_prov_provider_key_global#:#Predefined Key and Secret###07 02 2020 new variable -lti#:#lti_con_prov_provider_key_global_info#:#If not set, users have to add key and secret to use the provider.###07 02 2020 new variable -lti#:#lti_con_prov_remarks#:#Internal Remarks###07 02 2020 new variable -lti#:#lti_con_prov_secret#:#Secret###07 02 2020 new variable -lti#:#lti_con_prov_title#:#Title###07 02 2020 new variable -lti#:#lti_con_prov_url#:#URL of Provider###07 02 2020 new variable -lti#:#lti_con_prov_use_provider_id#:#Use Provider ID###07 02 2020 new variable -lti#:#lti_con_prov_use_provider_id_info#:#Usually the Ref-Id of the LTI Consumer is transferred to the Provider. Some Providers map this Ref-Id with the Resource of the Provider. To get always the same Resource for these Providers this Option should be activated.###07 02 2020 new variable -lti#:#lti_con_prov_use_xapi#:#Provider supports request of xAPI-Statements###07 02 2020 new variable -lti#:#lti_con_prov_use_xapi_info#:#Provider supports xAPI-Statements###07 02 2020 new variable -lti#:#lti_con_prov_xapi_activity_id#:#Activity ID###07 02 2020 new variable -lti#:#lti_con_prov_xapi_activity_id_info#:#The Activity ID is necessary to request data from the Learning Record Store. Only enter something here if the assignment of the provider's resource to an Activity Id is unique! If nothing is entered here, the Activity Id can be entered in LTI Consumer. The Activity Id could be requested from the LTI Provider.###07 02 2020 new variable -lti#:#lti_con_prov_xapi_launch_key#:#Key of LRS Endpoint###07 02 2020 new variable -lti#:#lti_con_prov_xapi_launch_key_info#:# ###07 02 2020 new variable -lti#:#lti_con_prov_xapi_launch_secret#:#Secret of LRS Endpoint###07 02 2020 new variable -lti#:#lti_con_prov_xapi_launch_secret_info#:# ###07 02 2020 new variable -lti#:#lti_con_prov_xapi_launch_url#:#URL of LRS Endpoint###07 02 2020 new variable -lti#:#lti_con_prov_xapi_launch_url_info#:#Please add full URL with https://###07 02 2020 new variable -lti#:#lti_con_redirection_uris#:#Redirection URI###31 03 2023 new variable -lti#:#lti_con_tool_url#:#Login URL###31 03 2023 new variable -lti#:#lti_con_version#:#LTI Version###31 03 2023 new variable -lti#:#lti_con_version_1.1#:#Version 1.1###31 03 2023 new variable -lti#:#lti_con_version_1.3#:#Version 1.3###31 03 2023 new variable -lti#:#lti_con_version_1.3_before_id#:#If dynamic registration is not used, after entering the data provided by the tool, additional data will appear that must be entered with the tool.###28 07 2023 new variable -lti#:#lti_confirm_delete_providers#:#Are you sure that you want to delete the following provider(s)?###07 02 2020 new variable +lti#:#lti_con_content_item#:#Support for Deep Linking###31 10 2023 new variable +lti#:#lti_con_content_item_url#:#Content URL###31 10 2023 new variable +lti#:#lti_con_grade_synchronization#:#Advanced Grading Services###31 10 2023 new variable +lti#:#lti_con_grade_synchronization_info#:#The LTI tool must offer 'Assignment and Grade Services'.###31 10 2023 new variable +lti#:#lti_con_initiate_login_url#:#Initiate Login URL###31 10 2023 new variable +lti#:#lti_con_key_type#:#Public Key Type###31 10 2023 new variable +lti#:#lti_con_key_type_jwk#:#URL (Json Web Token)###31 10 2023 new variable +lti#:#lti_con_key_type_jwk_url#:#URL###31 10 2023 new variable +lti#:#lti_con_key_type_rsa#:#RSA-Key###31 10 2023 new variable +lti#:#lti_con_key_type_rsa_public_key#:#Public Key###31 10 2023 new variable +lti#:#lti_con_key_type_rsa_public_key_info#:#Insert the key provided by the tool (provider) in PEM format here.###31 10 2023 new variable +lti#:#lti_con_prov_always_learner#:#LTI User is always Learner +lti#:#lti_con_prov_always_learner_info#:#Usually the role in ILIAS is mapped to a LTI role. Course Administrators could have more rights in the Provider, e.g. to manipulate the object. Activate this option to avoid the Role Mapping. +lti#:#lti_con_prov_authentication#:#Authentication +lti#:#lti_con_prov_availability#:#Availability +lti#:#lti_con_prov_availability_create#:#For Creating Objects +lti#:#lti_con_prov_availability_existing#:#Only for existing Objects +lti#:#lti_con_prov_availability_non#:#not available +lti#:#lti_con_prov_category#:#Category +lti#:#lti_con_prov_category_info#:#Category to filter entries when LTI Consumer Object is created. +lti#:#lti_con_prov_custom_params#:#Custom Parameters for this specific Provider +lti#:#lti_con_prov_custom_params_info#:#Please enter them in the form param1=value1; param2=value2 +lti#:#lti_con_prov_description#:#Description +lti#:#lti_con_prov_dyn_reg_params#:#Optional Parameters###31 10 2023 new variable +lti#:#lti_con_prov_dyn_reg_params_info#:#Here, for example, references to target objects in the tool can be specified.###31 10 2023 new variable +lti#:#lti_con_prov_dyn_reg_url#:#Registration URL of the Tool###31 10 2023 new variable +lti#:#lti_con_prov_dyn_reg_url_info#:#Note: Not every tool supports dynamic registration.###31 10 2023 new variable +lti#:#lti_con_prov_external_provider#:#External Provider +lti#:#lti_con_prov_external_provider_info#:#A hint will be shown to users when dealing with an external Provider. An external Provider is characterized by insufficient influence on the Provider by the operator of the ILIAS-installation. This is the case when there are no rights to delete. +lti#:#lti_con_prov_group_options#:#Options to group and filter Providers +lti#:#lti_con_prov_has_outcome_service#:#Provider supports Outcome Service +lti#:#lti_con_prov_has_outcome_service_info#:#If the LTI Outcome Service is supported, Learning Progress could be activated. The Provider returns a value between 0 and 1 to indicate the Learning Progress. +lti#:#lti_con_prov_hints#:#Hints +lti#:#lti_con_prov_icon#:#Icon +lti#:#lti_con_prov_inc_usr_pic#:#Send User Picture +lti#:#lti_con_prov_inc_usr_pic_info#:#Links to ILIAS user pictures are included at launch of LTI consumer object. +lti#:#lti_con_prov_instructor_email#:#Instructor E-Mail###31 10 2023 new variable +lti#:#lti_con_prov_instructor_email_info#:#In difference to the previously selected settings, the e-mail address can be transferred for instructors. To do this, they must be course or group administrators.###31 10 2023 new variable +lti#:#lti_con_prov_instructor_name#:#Instructor Name###31 10 2023 new variable +lti#:#lti_con_prov_instructor_name_info#:#In difference to the previously selected settings, the name can be transferred for instructors.###31 10 2023 new variable +lti#:#lti_con_prov_key#:#Key +lti#:#lti_con_prov_keywords#:#Keywords +lti#:#lti_con_prov_keywords_info#:#The keywords must be separated by a Semicolon (;). The Keywords are automatically taken to the Metadata as Keywords. +lti#:#lti_con_prov_launch_options#:#Launch Options +lti#:#lti_con_prov_learning_progress_options#:#Options for Learning Progress +lti#:#lti_con_prov_mastery_score_default#:#Default Mastery Score +lti#:#lti_con_prov_mastery_score_default_info#:#The Learning Progress will be evaluated from the Provider Outcome Service and the mastery score threshold. +lti#:#lti_con_prov_privacy_setting_conf#:#Configuration Options +lti#:#lti_con_prov_privacy_setting_default#:#Default Settings, changeable for Objects +lti#:#lti_con_prov_privacy_setting_force#:#Settings are not changeable for Objects +lti#:#lti_con_prov_privacy_setting_info#:#Configuration Options for Privacy Settings +lti#:#lti_con_prov_privacy_settings#:#Privacy Settings +lti#:#lti_con_prov_provider_key_global#:#Predefined Key and Secret +lti#:#lti_con_prov_provider_key_global_info#:#If not set, users have to add key and secret to use the provider. +lti#:#lti_con_prov_remarks#:#Internal Remarks +lti#:#lti_con_prov_secret#:#Secret +lti#:#lti_con_prov_title#:#Title +lti#:#lti_con_prov_url#:#URL of Provider +lti#:#lti_con_prov_use_provider_id#:#Use Provider ID +lti#:#lti_con_prov_use_provider_id_info#:#Usually the Ref-Id of the LTI Consumer is transferred to the Provider. Some Providers map this Ref-Id with the Resource of the Provider. To get always the same Resource for these Providers this Option should be activated. +lti#:#lti_con_prov_use_xapi#:#Provider supports request of xAPI-Statements +lti#:#lti_con_prov_use_xapi_info#:#Provider supports xAPI-Statements +lti#:#lti_con_prov_xapi_activity_id#:#Activity ID +lti#:#lti_con_prov_xapi_activity_id_info#:#The Activity ID is necessary to request data from the Learning Record Store. Only enter something here if the assignment of the provider's resource to an Activity Id is unique! If nothing is entered here, the Activity Id can be entered in LTI Consumer. The Activity Id could be requested from the LTI Provider. +lti#:#lti_con_prov_xapi_launch_key#:#Key of LRS Endpoint +lti#:#lti_con_prov_xapi_launch_key_info#:#  +lti#:#lti_con_prov_xapi_launch_secret#:#Secret of LRS Endpoint +lti#:#lti_con_prov_xapi_launch_secret_info#:#  +lti#:#lti_con_prov_xapi_launch_url#:#URL of LRS Endpoint +lti#:#lti_con_prov_xapi_launch_url_info#:#Please add full URL with https:// +lti#:#lti_con_redirection_uris#:#Redirection URI###31 10 2023 new variable +lti#:#lti_con_tool_url#:#Login URL###31 10 2023 new variable +lti#:#lti_con_version#:#LTI Version###31 10 2023 new variable +lti#:#lti_con_version_1.1#:#Version 1.1###31 10 2023 new variable +lti#:#lti_con_version_1.3#:#Version 1.3###31 10 2023 new variable +lti#:#lti_con_version_1.3_before_id#:#If dynamic registration is not used, after entering the data provided by the tool, additional data will appear that must be entered with the tool.###31 10 2023 new variable +lti#:#lti_confirm_delete_providers#:#Are you sure that you want to delete the following provider(s)? lti#:#lti_consumer#:#Freigabe für lti#:#lti_consumer_created#:#Consommateur créé lti#:#lti_consumer_deleted#:#Consommateur supprimé @@ -10664,120 +10665,120 @@ lti#:#lti_consumer_secret#:#Secret consommateur lti#:#lti_consumer_set_active#:#Consommateur activé lti#:#lti_consumer_set_inactive#:#Consommateur désactivé lti#:#lti_consumer_updated#:#Consommateur mis à jour -lti#:#lti_consuming_tab#:#ILIAS as LTI Consumer###07 02 2020 new variable -lti#:#lti_copy#:#Copy Consumer###07 02 2020 new variable +lti#:#lti_consuming_tab#:#ILIAS as LTI Consumer +lti#:#lti_copy#:#Copy Consumer lti#:#lti_create_consumer#:#Créer consommateur -lti#:#lti_create_lti_user_role#:#Create recommended global role for LTI users###30 04 2021 new variable -lti#:#lti_cron_title#:#LTI Outcome Service###07 02 2020 new variable -lti#:#lti_cron_title_desc#:#Synchronizes the learning progress of LTI users with the LTI consumer, if it supports the outcome service. This cron job is only required to transfer status updates after Learning progress settings updates.###07 02 2020 new variable -lti#:#lti_custom_new#:#Create Own Provider Settings###07 02 2020 new variable -lti#:#lti_delete_consume_provider#:#Delete Provider###07 02 2020 new variable -lti#:#lti_delete_consume_providers#:#Delete Providers###07 02 2020 new variable -lti#:#lti_delete_provider#:#Delete Provider###07 02 2020 new variable -lti#:#lti_dyn_reg_add_tool#:#Add###31 03 2023 new variable -lti#:#lti_dynamic_registration#:#Create Own Settings for Tool with Dynamic Registration (LTI 1.3)###31 03 2023 new variable +lti#:#lti_create_lti_user_role#:#Create recommended global role for LTI users +lti#:#lti_cron_title#:#LTI Outcome Service +lti#:#lti_cron_title_desc#:#Synchronizes the learning progress of LTI users with the LTI consumer, if it supports the outcome service. This cron job is only required to transfer status updates after Learning progress settings updates. +lti#:#lti_custom_new#:#Create Own Provider Settings +lti#:#lti_delete_consume_provider#:#Delete Provider +lti#:#lti_delete_consume_providers#:#Delete Providers +lti#:#lti_delete_provider#:#Delete Provider +lti#:#lti_dyn_reg_add_tool#:#Add###31 10 2023 new variable +lti#:#lti_dynamic_registration#:#Create Own Settings for Tool with Dynamic Registration (LTI 1.3)###31 10 2023 new variable lti#:#lti_edit_consumer#:#Éditer consommateur LTI lti#:#lti_exit#:#Fermer session LTI lti#:#lti_exited#:#Session LTI fermée lti#:#lti_exited_info#:#Session LTI fermée avec succès -lti#:#lti_form_provider_create#:#Create Provider Settings###07 02 2020 new variable -lti#:#lti_form_provider_edit#:#Edit Provider Settings###07 02 2020 new variable -lti#:#lti_form_section_appearance#:#Options for launch###07 02 2020 new variable -lti#:#lti_global_settings_form#:#Global Settings###07 02 2020 new variable -lti#:#lti_import_global_provider#:#Import Global Provider for all Users with XML-File###07 02 2020 new variable -lti#:#lti_info_external_provider_info#:#The used Provider is an external Provider. An external Provider is characterized by insufficient influence on the Provider by the operator of the ILIAS-Installation. This is the case e.g. if there are no rights to delete data.###07 02 2020 new variable -lti#:#lti_info_external_provider_label#:#Additional Info about this Provider###07 02 2020 new variable -lti#:#lti_info_learning_progress_section#:#Info about Determination of the Learning Progress###07 02 2020 new variable -lti#:#lti_info_privacy_section#:#Info about personal data transmitted to the provider at launch###07 02 2020 new variable +lti#:#lti_form_provider_create#:#Create Provider Settings +lti#:#lti_form_provider_edit#:#Edit Provider Settings +lti#:#lti_form_section_appearance#:#Options for launch +lti#:#lti_global_settings_form#:#Global Settings +lti#:#lti_import_global_provider#:#Import Global Provider for all Users with XML-File +lti#:#lti_info_external_provider_info#:#The used Provider is an external Provider. An external Provider is characterized by insufficient influence on the Provider by the operator of the ILIAS-Installation. This is the case e.g. if there are no rights to delete data. +lti#:#lti_info_external_provider_label#:#Additional Info about this Provider +lti#:#lti_info_learning_progress_section#:#Info about Determination of the Learning Progress +lti#:#lti_info_privacy_section#:#Info about personal data transmitted to the provider at launch lti#:#lti_launch_url#:#Url lti#:#lti_member#:#Membre LTI lti#:#lti_navigation#:#Navigation -lti#:#lti_no_provider_selected#:#No provider selected###07 02 2020 new variable +lti#:#lti_no_provider_selected#:#No provider selected lti#:#lti_not_allowed#:#Accès refusé. Votre demande a été redirigée vers l’objet LTI racine. lti#:#lti_obj_active#:#Fournisseur d’outils LTI lti#:#lti_obj_active_info#:#S'il est activé, cet objet fait office de fournisseur d’outils LTI. Les nouveaux utilisateurs LTI peuvent être automatiquement assignés aux rôles locaux suivants. -lti#:#lti_obj_version#:#LTI Version###31 03 2023 new variable -lti#:#lti_obj_version_11#:#Version 1.1###31 03 2023 new variable -lti#:#lti_obj_version_13#:#Version 1.3###31 03 2023 new variable +lti#:#lti_obj_version#:#LTI Version###31 10 2023 new variable +lti#:#lti_obj_version_11#:#Version 1.1###31 10 2023 new variable +lti#:#lti_obj_version_13#:#Version 1.3###31 10 2023 new variable lti#:#lti_object_consumer#:#Consommateurs LTI lti#:#lti_object_release_settings_form#:#LTI Freigaben bearbeiten lti#:#lti_provider#:#LTI-Freigaben -lti#:#lti_provider_not_avail_msg#:#LTI Provider is set to 'Not Available'###07 02 2020 new variable -lti#:#lti_provider_not_set_msg#:#LTI Provider / Tool is configured incompletely.###26 04 2023 new variable -lti#:#lti_providing_tab#:#ILIAS as LTI Provider###07 02 2020 new variable +lti#:#lti_provider_not_avail_msg#:#LTI Provider is set to 'Not Available' +lti#:#lti_provider_not_set_msg#:#LTI Provider is configured incompletely. +lti#:#lti_providing_tab#:#ILIAS as LTI Provider lti#:#lti_released_objects#:#Objekt-Freigaben -lti#:#lti_select_provider#:#Select Provider###07 02 2020 new variable +lti#:#lti_select_provider#:#Select Provider lti#:#lti_session#:#Session LTI lti#:#lti_settings#:#Paramètres LTI -lti#:#lti_settings_form#:#Object Settings###07 02 2020 new variable -lti#:#lti_success_accept_as_global#:#Successfully accepted as Global Provider for all Users###07 02 2020 new variable -lti#:#lti_success_accept_as_global_multi#:#Successfully accepted as Global Provider for all Users###07 02 2020 new variable -lti#:#lti_success_delete_provider#:#Successfully deleted###07 02 2020 new variable -lti#:#lti_success_reset_to_usr_def#:#Successfully reseted as User Defined Provider###07 02 2020 new variable -lti#:#lti_success_reset_to_usr_def_multi#:#Successfully reseted as User Defined Provider###07 02 2020 new variable +lti#:#lti_settings_form#:#Object Settings +lti#:#lti_success_accept_as_global#:#Successfully accepted as Global Provider for all Users +lti#:#lti_success_accept_as_global_multi#:#Successfully accepted as Global Provider for all Users +lti#:#lti_success_delete_provider#:#Successfully deleted +lti#:#lti_success_reset_to_usr_def#:#Successfully reseted as User Defined Provider +lti#:#lti_success_reset_to_usr_def_multi#:#Successfully reseted as User Defined Provider lti#:#lti_tutor#:#Instructeur LTI -lti#:#lti_user_role_created#:#The recommended global role for LTI users has been created.###30 04 2021 new variable -lti#:#lti_user_role_info#:#The recommended global role for LTI users has not yet been created in this installation. This special global role contains only the permission 'visible' for repository and categories.###30 04 2021 new variable -lti#:#mastery_score#:#Mastery Score###07 02 2020 new variable -lti#:#mastery_score_info#:#The Learning Progress will be evaluated from the Provider Outcome Service and the mastery score threshold.###07 02 2020 new variable -lti#:#obj_tile_image_info#:#Use an Image in Square Format###07 02 2020 new variable -lti#:#online_info#:#This makes the object visible and usable for the users.###07 02 2020 new variable +lti#:#lti_user_role_created#:#The recommended global role for LTI users has been created. +lti#:#lti_user_role_info#:#The recommended global role for LTI users has not yet been created in this installation. This special global role contains only the permission 'visible' for repository and categories. +lti#:#mastery_score#:#Mastery Score +lti#:#mastery_score_info#:#The Learning Progress will be evaluated from the Provider Outcome Service and the mastery score threshold. +lti#:#obj_tile_image_info#:#Use an Image in Square Format +lti#:#online_info#:#This makes the object visible and usable for the users. lti#:#prefix#:#Préfixe -lti#:#prefix_info#:#This prefix is put in front of the username (login). This ensures the uniqueness of usernames. It also facilitates the assignment of users to LTI consumers / platforms.###23 10 2023 new variable -lti#:#provider_info#:#Used Provider###07 02 2020 new variable -lti#:#settings_subtab#:#Settings###07 02 2020 new variable -lti#:#show_statements#:#Display Learning Experiences###07 02 2020 new variable -lti#:#show_statements_info#:#The Learning Experiences of other users could be displayed if the right 'View learning experiences of other users' is set.###07 02 2020 new variable -lti#:#subtab_certificate#:#Certificate###07 02 2020 new variable -lti#:#subtab_object_settings#:#Object Settings###07 02 2020 new variable -lti#:#subtab_provider_settings#:#LTI Provider Settings###07 02 2020 new variable -lti#:#tab_content#:#Content###07 02 2020 new variable -lti#:#tab_grade_synchronization#:#Advanced Grading Services###31 03 2023 new variable -lti#:#tab_info#:#Info###07 02 2020 new variable -lti#:#tab_scoring#:#Ranking###07 02 2020 new variable -lti#:#tab_settings#:#Settings###07 02 2020 new variable -lti#:#tab_statements#:#Learning Experiences###07 02 2020 new variable -lti#:#tbl_grade_activityProgress#:#Status Selection###31 03 2023 new variable -lti#:#tbl_grade_activityProgress_select#:#Status###31 03 2023 new variable -lti#:#tbl_grade_actor#:#User###31 03 2023 new variable -lti#:#tbl_grade_date#:#Date###31 03 2023 new variable -lti#:#tbl_grade_object#:#Object###31 03 2023 new variable -lti#:#tbl_grade_period#:#Period###31 03 2023 new variable -lti#:#tbl_grade_score#:#Score###31 03 2023 new variable -lti#:#tbl_lti_prov_all_categories#:#All Categories###07 02 2020 new variable -lti#:#tbl_lti_prov_availability#:#Availability###07 02 2020 new variable -lti#:#tbl_lti_prov_category#:#Category###07 02 2020 new variable -lti#:#tbl_lti_prov_description#:#Description###07 02 2020 new variable -lti#:#tbl_lti_prov_icon#:#Icon###07 02 2020 new variable -lti#:#tbl_lti_prov_internal#:#Internal Provider###07 02 2020 new variable -lti#:#tbl_lti_prov_keyword#:#Keyword###07 02 2020 new variable -lti#:#tbl_lti_prov_keywords#:#Keywords###07 02 2020 new variable -lti#:#tbl_lti_prov_outcome#:#Outcome Service###07 02 2020 new variable -lti#:#tbl_lti_prov_own_provider#:#Own Provider###07 02 2020 new variable -lti#:#tbl_lti_prov_provider_creator#:#Creator###07 02 2020 new variable -lti#:#tbl_lti_prov_title#:#Title of Provider###07 02 2020 new variable -lti#:#tbl_lti_prov_usages#:#Usages###07 02 2020 new variable -lti#:#tbl_lti_prov_usages_trashed#:#Trashed Usages###07 02 2020 new variable -lti#:#tbl_lti_prov_usages_untrashed#:#Repository Usages###07 02 2020 new variable -lti#:#tbl_lti_prov_used_by#:#Provider Used by Objects in Tree###07 02 2020 new variable -lti#:#tbl_lti_prov_with_key#:#Predefined with Key / Secret###07 02 2020 new variable -lti#:#tbl_provider_header#:#LTI Provider###07 02 2020 new variable -lti#:#tbl_provider_usage_header#:#LTI Provider###07 02 2020 new variable -lti#:#tbl_provider_usage_header_info#:#Before deleting providers, trashed usages must also be deleted.###07 02 2020 new variable -lti#:#title_info#:#Give the object a title.###07 02 2020 new variable -lti#:#usage_subtab#:#Usage###07 02 2020 new variable -lti#:#use_xapi#:#Use xAPI-Support###07 02 2020 new variable -lti#:#use_xapi_info#:#This LTI Provider supports xAPI-Statements.###07 02 2020 new variable +lti#:#prefix_info#:#This prefix is put in front of the username (login). This ensures the uniqueness of usernames. It also facilitates the assignment of users to LTI consumers / platforms.###31 10 2023 new variable +lti#:#provider_info#:#Used Provider +lti#:#settings_subtab#:#Settings +lti#:#show_statements#:#Display Learning Experiences +lti#:#show_statements_info#:#The Learning Experiences of other users could be displayed if the right 'View learning experiences of other users' is set. +lti#:#subtab_certificate#:#Certificate +lti#:#subtab_object_settings#:#Object Settings +lti#:#subtab_provider_settings#:#LTI Provider Settings +lti#:#tab_content#:#Content +lti#:#tab_grade_synchronization#:#Advanced Grading Services###31 10 2023 new variable +lti#:#tab_info#:#Info +lti#:#tab_scoring#:#Ranking +lti#:#tab_settings#:#Settings +lti#:#tab_statements#:#Learning Experiences +lti#:#tbl_grade_activityProgress#:#Status Selection###31 10 2023 new variable +lti#:#tbl_grade_activityProgress_select#:#Status###31 10 2023 new variable +lti#:#tbl_grade_actor#:#User###31 10 2023 new variable +lti#:#tbl_grade_date#:#Date###31 10 2023 new variable +lti#:#tbl_grade_object#:#Object###31 10 2023 new variable +lti#:#tbl_grade_period#:#Period###31 10 2023 new variable +lti#:#tbl_grade_score#:#Score###31 10 2023 new variable +lti#:#tbl_lti_prov_all_categories#:#All Categories +lti#:#tbl_lti_prov_availability#:#Availability +lti#:#tbl_lti_prov_category#:#Category +lti#:#tbl_lti_prov_description#:#Description +lti#:#tbl_lti_prov_icon#:#Icon +lti#:#tbl_lti_prov_internal#:#Internal Provider +lti#:#tbl_lti_prov_keyword#:#Keyword +lti#:#tbl_lti_prov_keywords#:#Keywords +lti#:#tbl_lti_prov_outcome#:#Outcome Service +lti#:#tbl_lti_prov_own_provider#:#Own Provider +lti#:#tbl_lti_prov_provider_creator#:#Creator +lti#:#tbl_lti_prov_title#:#Title of Provider +lti#:#tbl_lti_prov_usages#:#Usages +lti#:#tbl_lti_prov_usages_trashed#:#Trashed Usages +lti#:#tbl_lti_prov_usages_untrashed#:#Repository Usages +lti#:#tbl_lti_prov_used_by#:#Provider Used by Objects in Tree +lti#:#tbl_lti_prov_with_key#:#Predefined with Key / Secret +lti#:#tbl_provider_header#:#LTI Provider +lti#:#tbl_provider_usage_header#:#LTI Provider +lti#:#tbl_provider_usage_header_info#:#Before deleting providers, trashed usages must also be deleted. +lti#:#title_info#:#Give the object a title. +lti#:#usage_subtab#:#Usage +lti#:#use_xapi#:#Use xAPI-Support +lti#:#use_xapi_info#:#This LTI Provider supports xAPI-Statements. lti#:#user_lng#:#Langue de l’utilisateur -lti#:#user_provider_subtab#:#Providers Defined by Users###07 02 2020 new variable -ltiv#:#ltiv_create#:#Create Certificate for LTI Consumer Object###07 02 2020 new variable -ltiv#:#ltiv_create_info#:#Select a completed LTI consumer object to generate a certificate for it###07 02 2020 new variable +lti#:#user_provider_subtab#:#Providers Defined by Users +ltiv#:#ltiv_create#:#Create Certificate for LTI Consumer Object +ltiv#:#ltiv_create_info#:#Select a completed LTI consumer object to generate a certificate for it mail#:#back_to_folder#:#Retour au dossier mail#:#chat_users_have_been_invited#:#Les utilisateurs ont été invités. mail#:#chat_users_without_login#:#Les utilisateurs suivants n'ont pas de compte ILIAS et ne peuvent pas être invités à la salle de Chat. mail#:#chat_users_without_permission#:#Les utilisateurs suivants n'ont pas accès à la salle de Chat sélectionnée. mail#:#current_folder#:#Dossier actuel: %s -mail#:#deleteTemplate#:#Delete###31 03 2023 new variable +mail#:#deleteTemplate#:#Delete###31 10 2023 new variable mail#:#first_email_missing_info#:#Sélection impossible car aucune adresse mail n’a été entrée mail#:#forward#:#Transférer mail#:#goto_invitation_chat#:#Ouvrir Salle de Chat @@ -10790,7 +10791,7 @@ mail#:#link_check_reason#:#Vous recevez cet e-mail car vous avez activé la noti mail#:#mail_account_mail#:#Compte de messagerie mail#:#mail_add_folder#:#Ajouter Nouveau Sous-Dossier mail#:#mail_add_recipient#:#Veuillez saisir un destinataire -mail#:#mail_add_subfolder#:#Ajouter Sous-Dossier +mail#:#mail_add_subfolder#:#Ajouter sous-dossier mail#:#mail_add_subject#:#Veuillez saisir un sujet mail#:#mail_allow_external#:#E-mail externe mail#:#mail_allow_external_info#:#Si cette option est désactivée, la livraison d’e-mails externes (via SMTP) est désactivée globalement. @@ -10798,11 +10799,11 @@ mail#:#mail_assign_entry_to_mailing_list#:#Ajouter un contact de votre carnet d' mail#:#mail_attachment_file_not_exist#:#Au moins une des pièces-attachées suivantes n’existe pas: %1$s mail#:#mail_attachments#:#Pièces Jointes mail#:#mail_auto_generated_info#:#Ce message vous a été automatiquement envoyé par la plateforme ILIAS %s, %s -mail#:#mail_bcc#:#BCC###16 03 2023 new variable -mail#:#mail_bg_task_desc#:#Subject: %s###07 02 2020 new variable -mail#:#mail_bg_task_title#:#E-mail Delivery###07 02 2020 new variable -mail#:#mail_both_email#:#Les deux adresses mail -mail#:#mail_cc#:#CC###16 03 2023 new variable +mail#:#mail_bcc#:#BCC +mail#:#mail_bg_task_desc#:#Subject: %s +mail#:#mail_bg_task_title#:#E-mail Delivery +mail#:#mail_both_email#:#Les deux adresses e-mail +mail#:#mail_cc#:#CC mail#:#mail_change_to_folder#:#Afficher le dossier : mail#:#mail_create_tpl#:#Créer des modèles de textes mail#:#mail_cronjob_notification_info#:#Vous pouvez activer une notification périodique des nouveaux messages. @@ -10813,10 +10814,10 @@ mail#:#mail_deleted#:#L'email est supprimé mail#:#mail_deleted_entry#:#Les entrées sont supprimées mail#:#mail_download_zip_no_attachments#:#Could not find any attachments. mail#:#mail_edit_tpl#:#Editer Modèles de texte -mail#:#mail_email_sys_body#:#This is a test e-mail to test the delivery of system mails to the external mail account.###30 04 2021 new variable -mail#:#mail_email_sys_subject#:#Test E-Mail System Mail###30 04 2021 new variable -mail#:#mail_email_usr_body#:#This is a test e-mail to test the delivery of user mails to the external mail account.###30 04 2021 new variable -mail#:#mail_email_usr_subject#:#Test E-Mail User Mail###30 04 2021 new variable +mail#:#mail_email_sys_body#:#This is a test e-mail to test the delivery of system mails to the external mail account. +mail#:#mail_email_sys_subject#:#Test E-Mail System Mail +mail#:#mail_email_usr_body#:#This is a test e-mail to test the delivery of user mails to the external mail account. +mail#:#mail_email_usr_subject#:#Test E-Mail User Mail mail#:#mail_empty_trash#:#Vider Corbeille mail#:#mail_empty_trash_confirmation#:#Etes-vous certain de vouloir supprimer tous les messages? mail#:#mail_enable_crs_admin_notification#:#Notification aux Administrateurs de Cours @@ -10827,10 +10828,10 @@ mail#:#mail_enable_grp_admin_notification#:#Notification aux Administrateurs de mail#:#mail_enable_grp_admin_notification_info#:#Dans les nouveaux groupes, le paramètre 'Notification' est activé par défaut. Il est situé dans l'onglet 'Membres' des groupes. Les administrateurs de cours reçoivent un e-mail lorsqu'un membre se joint au groupe ou le quitte ou si le nombre minimum requis de participants n'a pas été atteint pour que le groupe ait lieu. mail#:#mail_enable_grp_member_notification#:#Notification de Groupe mail#:#mail_enable_grp_member_notification_info#:#Lorsque activé, les membres d'un groupe sont automatiquement informés lors d'un changement d'inscription. -mail#:#mail_enable_lso_admin_notification#:#Notify Learning Sequence Administrators###30 04 2021 new variable -mail#:#mail_enable_lso_admin_notification_info#:#In new Learning Sequences the setting 'Notification About New Members' will be activated by default. It is set in the 'Member'-tab of Learning Sequences. Administrators will receive an e-mail when a member joins the Learning Sequence or leaves it.###30 04 2021 new variable -mail#:#mail_enable_lso_member_notification#:#Notify Learning Sequence Members###30 04 2021 new variable -mail#:#mail_enable_lso_member_notification_info#:#ILIAS 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.###30 04 2021 new variable +mail#:#mail_enable_lso_admin_notification#:#Notify Learning Sequence Administrators +mail#:#mail_enable_lso_admin_notification_info#:#In new Learning Sequences the setting 'Notification About New Members' will be activated by default. It is set in the 'Member'-tab of Learning Sequences. Administrators will receive an e-mail when a member joins the Learning Sequence or leaves it. +mail#:#mail_enable_lso_member_notification#:#Notify Learning Sequence Members +mail#:#mail_enable_lso_member_notification_info#:#ILIAS 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_entry_of_contacts#:#Entrée de contacts mail#:#mail_error_reading_attachment#:#Could not determine any attachment. mail#:#mail_external_send_test_sys#:#Envoyer un e-mail test (mail de système) @@ -10840,49 +10841,49 @@ mail#:#mail_file_name#:#Nom du Fichier mail#:#mail_file_size#:#Taille du Fichier mail#:#mail_files_deleted#:#Les fichiers sont supprimés mail#:#mail_filter#:#Filtre -mail#:#mail_filter_attach#:#Pièces Jointes +mail#:#mail_filter_attach#:#Pièces jointes mail#:#mail_filter_body#:#Corps mail#:#mail_filter_field_placeholder#:#Filtrer ces messages... -mail#:#mail_filter_only_unread#:#Only Unread -mail#:#mail_filter_only_user_mails#:#Hide System Notifications###31 03 2023 new variable -mail#:#mail_filter_only_with_attachments#:#With Attachments -mail#:#mail_filter_period#:#Period -mail#:#mail_filter_period_from#:#From -mail#:#mail_filter_period_until#:#Until +mail#:#mail_filter_only_unread#:#Non lu +mail#:#mail_filter_only_user_mails#:#Hide System Notifications###31 10 2023 new variable +mail#:#mail_filter_only_with_attachments#:#Avec pièces jointes +mail#:#mail_filter_period#:#Période +mail#:#mail_filter_period_from#:#De +mail#:#mail_filter_period_until#:#A mail#:#mail_filter_recipients#:#Destinataires mail#:#mail_filter_sender#:#Expéditeur mail#:#mail_filter_subject#:#Sujet mail#:#mail_filter_txt#:#Filtrer message par -mail#:#mail_first_email#:#Première adresse mail -mail#:#mail_firstname_last_name_superior#:#Eine kommaseparierte Liste von Vor- und Nachname des/der jeweiligen Vorgesetzten.###07 02 2020 new variable +mail#:#mail_first_email#:#Première adresse e-mail +mail#:#mail_firstname_last_name_superior#:#Eine kommaseparierte Liste von Vor- und Nachname des/der jeweiligen Vorgesetzten. mail#:#mail_folder_created#:#Un nouveau dossier a été créé mail#:#mail_folder_deleted#:#Le dossier a été supprimé mail#:#mail_folder_exists#:#Un dossier portant ce nom existe déjà mail#:#mail_folder_name_changed#:#Le dossier a été renommé mail#:#mail_following_rcp_not_valid#:#Les destinataires suivants ne sont pas valides : -mail#:#mail_form_placeholders_label#:#Available Placeholders###31 03 2023 new variable +mail#:#mail_form_placeholders_label#:#Available Placeholders###31 10 2023 new variable mail#:#mail_generic_rcp_error#:#Une erreur est survenue lors de la validation des destinataires: %1$s -mail#:#mail_global_reply_to_addr#:#Reply-To###30 04 2021 new variable -mail#:#mail_global_reply_to_addr_info#:#Please enter the desired 'Reply-To' address.###30 04 2021 new variable +mail#:#mail_global_reply_to_addr#:#Reply-To +mail#:#mail_global_reply_to_addr_info#:#Please enter the desired 'Reply-To' address. mail#:#mail_grp_roles#:#Envoyer mail aux rôles de groupes -mail#:#mail_hint_add_placeholder_x#:#Add the placeholder '%s' to the message body.###31 03 2023 new variable +mail#:#mail_hint_add_placeholder_x#:#Add the placeholder '%s' to the message body. mail#:#mail_incoming#:#Messages reçus -mail#:#mail_incoming_both#:#local et redirection -mail#:#mail_incoming_local#:#local seulement +mail#:#mail_incoming_both#:#Local et redirection +mail#:#mail_incoming_local#:#Local seulement mail#:#mail_incoming_mail#:#Courrier entrant -mail#:#mail_incoming_smtp#:#redirection vers l'adresse mail externe +mail#:#mail_incoming_smtp#:#Redirection vers l'adresse e-mail externe mail#:#mail_insert_folder_name#:#Veuillez saisir un nom de dossier mail#:#mail_insert_query#:#Veuillez saisir une requête mail#:#mail_invite_users_to_chat#:#Inviter des Utilisateurs à une Chat -mail#:#mail_is_read#:#gelesen###29 06 2022 new variable -mail#:#mail_is_unread#:#ungelesen###29 06 2022 new variable +mail#:#mail_is_read#:#gelesen +mail#:#mail_is_unread#:#ungelesen mail#:#mail_list_members#:#Lister les membres mail#:#mail_mailing_list#:#Liste de Contacts mail#:#mail_mailing_lists#:#Listes de Contacts mail#:#mail_mailing_lists_all_contact_entries_assigned#:#Vous avez déjà affecté tous vos contacts à cette liste de diffusion. mail#:#mail_mailing_lists_no_contact_entries#:#Vous n'avez aucune entrée dans vos contacts à ajouter à une liste. mail#:#mail_mark_read#:#Marquer les messages comme lus -mail#:#mail_mark_unread#:#Marquer les m essagescomme non lus +mail#:#mail_mark_unread#:#Marquer les messages comme non lus mail#:#mail_max_size_attachments_total#:#Veuillez entrer la taille de fichier maximale autorisée en pièce jointe par courrier. Ce paramètre n'est pas lié à d'autres limites de ressources, par exemple upload_max_filesize etc. (puisque vous pouvez joindre plusieurs fichiers). mail#:#mail_max_size_attachments_total_error#:#La taille autorisée pour la pièce-jointe est de: mail#:#mail_maxsize_attachment_error#:#La limite de téléchargement est : @@ -10895,15 +10896,15 @@ mail#:#mail_move_to#:#Déplacer vers : mail#:#mail_moved#:#Message déplacé mail#:#mail_moved_to_trash#:#Message déplacé dans la corbeille mail#:#mail_multiple_role_recipients_found#:#%1$s (Plusieurs rôles trouvés pour le destinataire: %2$s) -mail#:#mail_my_courses#:#Mes Cours -mail#:#mail_my_groups#:#Mes Groupes +mail#:#mail_my_courses#:#Mes cours +mail#:#mail_my_groups#:#Mes groupes mail#:#mail_my_mailing_lists#:#Mes Listes de Diffusion mail#:#mail_nacc_admin_mail#:#Adresse email de l'administrateur. mail#:#mail_nacc_if_timelimit#:#Ce texte n'est inclus que si l'utilisateur a une période d'accès limitée. mail#:#mail_nacc_ilias_url#:#URL du système ILIAS -mail#:#mail_nacc_installation_desc#:#Installation Description###31 03 2023 new variable -mail#:#mail_nacc_installation_name#:#Installation Name###31 03 2023 new variable -mail#:#mail_nacc_login#:#Nom d'Utilisateur +mail#:#mail_nacc_installation_desc#:#Installation Description###31 10 2023 new variable +mail#:#mail_nacc_installation_name#:#Installation Name###31 10 2023 new variable +mail#:#mail_nacc_login#:#Nom d'utilisateur mail#:#mail_nacc_no_pw_block#:#Ce bloc de texte n'est inclus que si le nouveau compte a été créé sans mot de passe. mail#:#mail_nacc_pw_block#:#Ce bloc de texte n'est inclus que si le nouveau compte a été créé avec mot de passe. mail#:#mail_nacc_salutation#:#Salutation @@ -10913,10 +10914,10 @@ mail#:#mail_nacc_target_title#:#Titre de l'objet ciblé, par ex. titre du cours. mail#:#mail_nacc_target_type#:#Type de l'objet ciblé, par ex. « Cours » pour un objet de type cours. mail#:#mail_nacc_timelimit#:#User access period mail#:#mail_nacc_title#:#Titre -mail#:#mail_nacc_use_placeholder#:#Les chaînes de remplacement suivantes peuvent être utilisées +mail#:#mail_nacc_use_placeholder#:#Dans le champ 'Contenu du message', les caractères de remplacement suivants peuvent être utilisés mail#:#mail_new_template#:#Nouveau Modèle de Texte mail#:#mail_no_permissions_write_smtp#:#Vous n'avez pas la permission d'envoyer des messages externes. -mail#:#mail_no_subject#:#No Subject available###27 04 2022 new variable +mail#:#mail_no_subject#:#No Subject available mail#:#mail_no_valid_mailing_list#:#Aucune Liste de Diffusion Valide mail#:#mail_notification_membership_section#:#Membres Inscrits mail#:#mail_notification_subject#:#Nouveau message dans votre boîte de réception @@ -10927,8 +10928,8 @@ mail#:#mail_orphaned_mails#:#Supprimer les mails anciens ou orphelins mail#:#mail_orphaned_mails_desc#:#Supprimer les mails anciens ou orphelins mail#:#mail_recipient_not_found#:#%1$s (Impossible de trouver un destinataire valide) mail#:#mail_rename_folder#:#Renommer Dossier -mail#:#mail_roles#:#Users with the following local roles###31 03 2023 new variable -mail#:#mail_s#:#Message(s) +mail#:#mail_roles#:#Users with the following local roles###31 10 2023 new variable +mail#:#mail_s#:#message(s) mail#:#mail_salutation_anonymous#:#Bonjour mail#:#mail_salutation_f#:#Bonjour mail#:#mail_salutation_female#:#Salutation, féminin @@ -10937,8 +10938,8 @@ mail#:#mail_salutation_m#:#Bonjour mail#:#mail_salutation_male#:#Salutation, masculin mail#:#mail_salutation_n#:#Bonjour mail#:#mail_saved#:#Le message a été enregistré -mail#:#mail_second_email#:#Deuxième adresse mail -mail#:#mail_sel_label#:#Choose the Recipients###30 04 2021 new variable +mail#:#mail_second_email#:#Deuxième adresse e-mail +mail#:#mail_sel_label#:#Choose the Recipients mail#:#mail_sel_users#:#Envoyer un mail aux utilisateurs sélectionnés mail#:#mail_select_attachment#:#Veuillez sélectionner une pièce jointe pour le téléchargement. mail#:#mail_select_course#:#Veuillez sélectionner au moins un cours. @@ -10947,7 +10948,7 @@ mail#:#mail_select_one_entry#:#Vous devez sélectionner une entrée mail#:#mail_select_one_file#:#Vous devez sélectionner un fichier mail#:#mail_send_html#:#HTML Frame for External Emails mail#:#mail_send_html_info#:#Si activé, le corps des e-mails externes sera intégré dans un cadre HTML. Le modèle correspondant peut être personnalisé en créant une copie de './Services/Mail/templates/default/tpl.html_mail_template.html' at './Customizing/global/skin/[SKIN]/Services/Mail/tpl.html_mail_template.html' . -mail#:#mail_serial_letter_placeholders#:#Espaces de lettres en série +mail#:#mail_serial_letter_placeholders#:#Caractères de remplacement des lettres de série mail#:#mail_settings_external_frm_head#:#E-mail externe mail#:#mail_settings_external_tab#:#Externe mail#:#mail_settings_general_tab#:#Général @@ -10968,7 +10969,7 @@ mail#:#mail_smtp_status_info#:#S’il est activé, ILIAS enverra des e-mails ext mail#:#mail_smtp_user#:#Utilisateur mail#:#mail_subject_prefix#:#Objet du Mail mail#:#mail_subject_prefix_info#:#Saisir un texte qui sera ajouté à la rubrique "objet" des mails générés automatiquement. -mail#:#mail_subject_too_long#:#The subject is too long.###13 09 2023 new variable +mail#:#mail_subject_too_long#:#The subject is too long.###31 10 2023 new variable mail#:#mail_sure_delete#:#Êtes-vous sûr(e) de vouloir supprimer les messages sélectionnés ? mail#:#mail_sure_delete_entry#:#Êtes-vous sûr(e) de vouloir supprimer les entrées suivantes ? mail#:#mail_sure_delete_file#:#Êtes-vous sûr(e) de vouloir supprimer les fichiers sélectionnés ? @@ -10986,7 +10987,7 @@ mail#:#mail_system_usr_from_addr#:#E-mail de l’expéditeur (de) 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 ILIAS will be automatically put in the 'Reply-To' header.

Examples: info@institution.de or no-reply@institution.de mail#:#mail_system_usr_from_name#:#Nom complet de l’expéditeur (de) mail#:#mail_system_usr_from_name_info#:#Vous pouvez utiliser les espaces [FULLNAME], [FIRSTNAME] et [LASTNAME]. Ceux-ci seront remplacés par la date de l’initiateur de l’e-mail. -mail#:#mail_tbl_head_attachments#:#Attachment +mail#:#mail_tbl_head_attachments#:#Pièce jointe mail#:#mail_template_client#:#Modèle de Texte mail#:#mail_template_client_info#:#Choisir un des modèles de textes disponibles et utiliser ses espaces. Si vous choisissez un modèle de texte, un corps et un sujet de cette forme (s’ils sont définis dans le modèle de texte) seront remplacés. mail#:#mail_template_context#:#Contexte @@ -11006,22 +11007,22 @@ mail#:#mail_tpl_deleted_p#:#Les modèles de textes ont été supprimés avec suc mail#:#mail_tpl_deleted_s#:#Le modèle de texte a été supprimé avec succès. mail#:#mail_tpl_sure_delete_entries#:#Are you sure you want to delete the following entries? mail#:#mail_tpl_sure_delete_entry#:#Are you sure you want to delete the text template? -mail#:#mail_use_global_reply_to_addr#:#Use Global Reply-To###30 04 2021 new variable -mail#:#mail_use_global_reply_to_addr_info#:#If enabled, the email address entered below is used as value for the 'Reply-To' header. The sender's email address will be not disclosed to recipients. A direct reply is not possible anymore.###30 04 2021 new variable -mail#:#nc_mail_noti_item_title#:#Inbox###07 02 2020 new variable -mail#:#nc_mail_prop_time#:#Time###07 02 2020 new variable -mail#:#nc_mail_unread_messages#:#You have %s in your inbox.###07 02 2020 new variable -mail#:#nc_mail_unread_messages_number_p#:#%s Unread Mails###07 02 2020 new variable -mail#:#nc_mail_unread_messages_number_s#:#1 Unread Mail###07 02 2020 new variable +mail#:#mail_use_global_reply_to_addr#:#Use Global Reply-To +mail#:#mail_use_global_reply_to_addr_info#:#If enabled, the email address entered below is used as value for the 'Reply-To' header. The sender's email address will be not disclosed to recipients. A direct reply is not possible anymore. +mail#:#nc_mail_noti_item_title#:#Inbox +mail#:#nc_mail_prop_time#:#Time +mail#:#nc_mail_unread_messages#:#You have %s in your inbox. +mail#:#nc_mail_unread_messages_number_p#:#%s Unread Mails +mail#:#nc_mail_unread_messages_number_s#:#1 Unread Mail mail#:#only_inbox_trash#:#Considérer uniquement la boîte de réception / la corbeille mail#:#only_inbox_trash_info#:#If enabled, emails 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#:#orphaned_mail_body#:#There are old or orphaned mails in the following mailboxes. Please note, that these mails will be deleted automatically soon. mail#:#orphaned_mail_subject#:#Notification à propos des mails orphelins -mail#:#placeholders_advise#:#Les chaînes de remplacement ne concernent que les destinataires indiqués dans le champs « À », et non les destinataires indiqués dans les champs « CC » et « CCI ». +mail#:#placeholders_advise#:#Les caractères génériques personnels ne sont remplacés que pour les destinataires du champ "À". %s Les caractères de remplacement personnels sont conservés pour les destinataires dans les champs CC et BCC. mail#:#search_content#:#Résultats de Recherche -mail#:#search_recipients#:#Rechercher Destinataires -mail#:#second_email_missing_info#:#Sélection impossible car aucune adresse mail secondaire n’a été entrée -mail#:#select_mail_with_subject_x#:#Select mail with subject „%s“###16 03 2023 new variable +mail#:#search_recipients#:#Rechercher destinataires +mail#:#second_email_missing_info#:#La sélection n'est pas possible car il n'y a pas de deuxième adresse e-mail. +mail#:#select_mail_with_subject_x#:#Select mail with subject „%s“ mail#:#send_mail_admins#:#Tous les administrateurs mail#:#send_mail_members#:#Tous les membres mail#:#send_mail_to#:#Envoyer un message à @@ -11029,7 +11030,7 @@ mail#:#send_mail_tutors#:#Tous les tuteurs mail#:#show_mail_settings#:#Show Mail Settings mail#:#show_mail_settings_info#:#If enabled, the user's `Mail Settings` are accessible via the `Personal Settings` or `Mail` section. mail#:#system_notification_installation_changed_by#:#Modifié Par -mail#:#usrFieldChange_second_mail_visible_in_personal_data#:#You have changed the attribute "%s" of the field "%s".
This leads to all accounts settings being reset to "receive on primary address" for external delivery,
not only for all new accounts but also dismissing the currently active settings made by users.###31 03 2023 new variable +mail#:#usrFieldChange_second_mail_visible_in_personal_data#:#You have changed the attribute "%s" of the field "%s".
This leads to all accounts settings being reset to "receive on primary address" for external delivery,
not only for all new accounts but also dismissing the currently active settings made by users.###31 10 2023 new variable maps#:#configure_geolocation#:#Veuillez terminer la configuration de géolocalisation dans le menu d'administration "Logiciels tiers" pour permettre la recherche d'adresse. maps#:#maps_custom_geolocation_server_info#:#URL serveur pour fournir des données de géolocalisation en utilisant Nominatim. Votre entrée doit contenir l’espace [QUERY] pour définir une position pour les informations de demande. Exemple: nominatim.example.com/search/[QUERY]?format=json. maps#:#maps_custom_tile_server_info#:#URL serveur pour fournir des données de mosaïque. Les entrées multiples doivent être séparées par des espaces. Les valeurs par défaut sont «%s». @@ -11038,7 +11039,7 @@ maps#:#maps_enable_maps_info#:#Active les cartes dans les profils des utilisateu maps#:#maps_extt_maps#:#Cartes maps#:#maps_geolocation_server#:#Serveur pour géolocalisation inversée maps#:#maps_google_maps#:#Google Maps -maps#:#maps_https_for_reverse_lookup#:#Https for Reverse Lookup###30 04 2021 new variable +maps#:#maps_https_for_reverse_lookup#:#Https for Reverse Lookup maps#:#maps_latitude#:#Latitude maps#:#maps_longitude#:#Longitude maps#:#maps_lookup_address#:#Consulter adresse @@ -11050,20 +11051,20 @@ maps#:#maps_std_location_desc#:#Latitude / Longitude. Cliquer sur la carte pour maps#:#maps_tile_server#:#Serveur des mosaïques maps#:#maps_zoom_level#:#Niveau de Zoom mathjax#:#mathjax_enable_client#:#Autoriser MathJax dans le navigateur -mathjax#:#mathjax_enable_client_info#:#Activates a client-side rendering of TeX in the browser by including the MathJax script. Mathjax 3 is supported, but MathJax 2 is recommended.###31 03 2023 new variable +mathjax#:#mathjax_enable_client_info#:#Activates a client-side rendering of TeX in the browser by including the MathJax script. Mathjax 3 is supported, but MathJax 2 is recommended.###31 10 2023 new variable mathjax#:#mathjax_enable_server#:#Autoriser MathJax sur le serveur mathjax#:#mathjax_enable_server_info#:#Active un rendu côté serveur de TeX vers les graphiques. mathjax#:#mathjax_home_link#:# ➜ Page Web de MathJax mathjax#:#mathjax_limiter#:#Séparateurs mathjax#:#mathjax_limiter_info#:#Définissez les séparateurs tels qu'ils sont configurés dans votre installation MathJax. mathjax#:#mathjax_mathjax#:#MathJax -mathjax#:#mathjax_polyfill_url#:#Url of a Polyfill###31 03 2023 new variable -mathjax#:#mathjax_polyfill_url_desc_line1#:#For MathJax 2 not needed###31 03 2023 new variable -mathjax#:#mathjax_polyfill_url_desc_line2#:#For MathJax 3 e.g. https://polyfill.io/v3/polyfill.min.js?features=es6###31 03 2023 new variable -mathjax#:#mathjax_script_url#:#URL of the MathJax Script###31 03 2023 new variable -mathjax#:#mathjax_script_url_desc_line1#:#For MathJax 2 e.g. https://cdn.jsdelivr.net/npm/mathjax@2.7.9/MathJax.js?config=TeX-AMS-MML_HTMLorMML,Safe###31 03 2023 new variable -mathjax#:#mathjax_script_url_desc_line2#:#For MathJax 3 e.g. https://cdn.jsdelivr.net/npm/mathjax@3.0.1/es5/tex-mml-chtml.js###31 03 2023 new variable -mathjax#:#mathjax_script_url_desc_line3#:#Please activate the safe mode to avoid XSS attacks by MathJax code with javascript. For MathJax 2 it can be activated by adding the 'Safe' parameter to the CDN url. For MathJax 3 you need to include script that configures it before MathJax is loaded. Use for example https://your-domain/your-ilias/Services/MathJax/js/cdn-mathjax3-es5-tex-mml-chtml-safe.js###31 03 2023 new variable +mathjax#:#mathjax_polyfill_url#:#Url of a Polyfill###31 10 2023 new variable +mathjax#:#mathjax_polyfill_url_desc_line1#:#For MathJax 2 not needed###31 10 2023 new variable +mathjax#:#mathjax_polyfill_url_desc_line2#:#For MathJax 3 e.g. https://polyfill.io/v3/polyfill.min.js?features=es6###31 10 2023 new variable +mathjax#:#mathjax_script_url#:#URL of the MathJax Script###31 10 2023 new variable +mathjax#:#mathjax_script_url_desc_line1#:#For MathJax 2 e.g. https://cdn.jsdelivr.net/npm/mathjax@2.7.9/MathJax.js?config=TeX-AMS-MML_HTMLorMML,Safe###31 10 2023 new variable +mathjax#:#mathjax_script_url_desc_line2#:#For MathJax 3 e.g. https://cdn.jsdelivr.net/npm/mathjax@3.0.1/es5/tex-mml-chtml.js###31 10 2023 new variable +mathjax#:#mathjax_script_url_desc_line3#:#Please activate the safe mode to avoid XSS attacks by MathJax code with javascript. For MathJax 2 it can be activated by adding the 'Safe' parameter to the CDN url. For MathJax 3 you need to include script that configures it before MathJax is loaded. Use for example https://your-domain/your-ilias/Services/MathJax/js/cdn-mathjax3-es5-tex-mml-chtml-safe.js###31 10 2023 new variable mathjax#:#mathjax_server_address#:#Adresse de serveur mathjax#:#mathjax_server_address_info#:#Par ex. http://localhost:8003 mathjax#:#mathjax_server_cache_cleared#:#Le cache MathJax a été supprimé. @@ -11081,28 +11082,28 @@ mathjax#:#mathjax_server_timeout#:#Pause mathjax#:#mathjax_server_timeout_info#:#Pause pour appeler le serveur mathjax en quelques secondes mathjax#:#mathjax_settings#:#Paramètres MathJax mathjax#:#mathjax_test_expression#:#Expression de test -mathjax#:#mathjax_test_expression_info_client#:#This expression will be rendered by the script in the browser.###31 03 2023 new variable -mathjax#:#mathjax_test_expression_info_server#:#This expression will be rendered on the server.###31 03 2023 new variable +mathjax#:#mathjax_test_expression_info_client#:#This expression will be rendered by the script in the browser.###31 10 2023 new variable +mathjax#:#mathjax_test_expression_info_server#:#This expression will be rendered on the server.###31 10 2023 new variable mcst#:#mcst_add_new_item#:#Ajouter un Nouveau Média -mcst#:#mcst_audio_files#:#Audio Files###31 03 2023 new variable +mcst#:#mcst_audio_files#:#Audio Files###31 10 2023 new variable mcst#:#mcst_audioportable_settings_info#:#Liste d'extensions de fichier séparées par des virgules mcst#:#mcst_audioportable_settings_title#:#Extensions de Fichier pour Format Audio mcst#:#mcst_audioportable_title#:#Fichier Audio pour Mobile mcst#:#mcst_automatic_detection#:#Détection automatique -mcst#:#mcst_autoplay#:#Autoplay###31 03 2023 new variable -mcst#:#mcst_autoplay_active#:#Autoplay (Default on)###31 03 2023 new variable -mcst#:#mcst_autoplay_inactive#:#Autoplay (Default off)###31 03 2023 new variable +mcst#:#mcst_autoplay#:#Autoplay###31 10 2023 new variable +mcst#:#mcst_autoplay_active#:#Autoplay (Default on)###31 10 2023 new variable +mcst#:#mcst_autoplay_inactive#:#Autoplay (Default off)###31 10 2023 new variable mcst#:#mcst_clear_purpose_title#:#Supprimer mcst#:#mcst_converted_file#:#Fichier converti. mcst#:#mcst_copy#:#Copier Mediacast mcst#:#mcst_current_value_info#:#Affiche la valeur à jour de ce format. mcst#:#mcst_default_visibility#:#Accès par Défaut mcst#:#mcst_det_playtime#:#Déterminer la Durée -mcst#:#mcst_download_all#:#Download All###31 03 2023 new variable +mcst#:#mcst_download_all#:#Download All###31 10 2023 new variable mcst#:#mcst_download_audioportable#:#Télécharger audio portable mcst#:#mcst_download_cnt#:#Téléchargé mcst#:#mcst_download_standard#:#Télécharger -mcst#:#mcst_download_started_bg#:#Download of files has started. Please check your background tasks in the top right corner.###31 03 2023 new variable +mcst#:#mcst_download_started_bg#:#Download of files has started. Please check your background tasks in the top right corner.###31 10 2023 new variable mcst#:#mcst_download_videoalternative#:#Télécharger Fichier Alternatif mcst#:#mcst_download_videoportable#:#Télécharger vidéo portable mcst#:#mcst_downloadable#:#Liens de Téléchargement @@ -11114,7 +11115,7 @@ mcst#:#mcst_edit_settings#:#Paramètres du Mediacast mcst#:#mcst_extract_preview_image#:#Prévisualiser l'image extraite mcst#:#mcst_gallery#:#Galerie mcst#:#mcst_image_extracted#:#Image extraite. -mcst#:#mcst_img_gallery#:#Image Gallery###31 03 2023 new variable +mcst#:#mcst_img_gallery#:#Image Gallery###31 10 2023 new variable mcst#:#mcst_import#:#Importer Mediacast mcst#:#mcst_incl_files_in_rss#:#Inclure les Médias dans le Flux mcst#:#mcst_incl_files_in_rss_info#:#Lorsque activé, les médias sont inclus comme pièces jointes dans le flux RSS. Sinon, le flux ne fait que notifier la présence de nouveaux médias aux souscripteurs. @@ -11129,14 +11130,14 @@ mcst#:#mcst_mimetype#:#Type de MIME mcst#:#mcst_mimetype_info#:#Sélectionner le type de MIME pour controler le plugin utilisé pour le playback.
Veuillez noter : Soyez vigilant qu'aucun navigateur ne contienne le plugin que vous désirez utiliser. mcst#:#mcst_mimetypes#:#Types de MIME mcst#:#mcst_mimetypes_info#:#Liste de types de MIME séparé par un virgule -mcst#:#mcst_new_items_det_lp#:#Add new items to learning progress###31 03 2023 new variable -mcst#:#mcst_new_items_det_lp_info#:#New items are automatically added to determine the overall learning progress.###31 03 2023 new variable +mcst#:#mcst_new_items_det_lp#:#Add new items to learning progress###31 10 2023 new variable +mcst#:#mcst_new_items_det_lp_info#:#New items are automatically added to determine the overall learning progress.###31 10 2023 new variable mcst#:#mcst_news_item_visibility_info#:#Les éléments publics peuvent être consultés sans authentification en dehors d'ILIAS via RSS. -mcst#:#mcst_next_items#:#Next Items###31 03 2023 new variable -mcst#:#mcst_no_autoplay#:#No Autoplay###31 03 2023 new variable +mcst#:#mcst_next_items#:#Next Items###31 10 2023 new variable +mcst#:#mcst_no_autoplay#:#No Autoplay###31 10 2023 new variable mcst#:#mcst_no_extraction_possible#:#Désolé, impossible d'extraire une image à partir du fichier. mcst#:#mcst_nr_items#:#Nombre de Médias -mcst#:#mcst_nr_videos#:#Number of Initial Videos###31 03 2023 new variable +mcst#:#mcst_nr_videos#:#Number of Initial Videos###31 10 2023 new variable mcst#:#mcst_ordering#:#Tri mcst#:#mcst_ordering_creation_date_asc#:#Par Date de Création (Ascendant) mcst#:#mcst_ordering_creation_date_desc#:#Par Date de Création (Déscendant) @@ -11145,8 +11146,8 @@ mcst#:#mcst_ordering_title#:#Par Titre mcst#:#mcst_play#:#Affichage mcst#:#mcst_play_cnt#:#Joué mcst#:#mcst_play_time#:#Durée enregistrement -mcst#:#mcst_podcast#:#Podcast###31 03 2023 new variable -mcst#:#mcst_prev_items#:#Previous Items###31 03 2023 new variable +mcst#:#mcst_podcast#:#Podcast###31 10 2023 new variable +mcst#:#mcst_prev_items#:#Previous Items###31 10 2023 new variable mcst#:#mcst_preview_picture#:#Image de Prévisualisation mcst#:#mcst_preview_picture_info#:#Supporté uniquement par les types de médias suivants : mcst#:#mcst_reference_info#:#URL d'un média hors ILIAS @@ -11154,26 +11155,26 @@ mcst#:#mcst_save_order#:#Sauver le tri mcst#:#mcst_second#:#Seconde mcst#:#mcst_set_playtime#:#La durée d'enregistrement a été saisie. mcst#:#mcst_settings#:#Paramètres du Mediacast -mcst#:#mcst_show_description#:#Show Description###31 03 2023 new variable +mcst#:#mcst_show_description#:#Show Description###31 10 2023 new variable mcst#:#mcst_standard_settings_info#:#Liste d'extensions de fichier séparées par des virgules mcst#:#mcst_standard_settings_title#:#Extensions de Fichier pour Format Standard mcst#:#mcst_standard_title#:#Fichier Média Standard mcst#:#mcst_unable_to_determin_playtime#:#Incapable de déterminer la durée d'enregistrement. Veuillez la saisir manuellement en cliquant sur Modifier. -mcst#:#mcst_video_cast#:#Videocast###31 03 2023 new variable -mcst#:#mcst_video_completion_threshold#:#Video Completion Threshold###31 03 2023 new variable -mcst#:#mcst_video_completion_threshold_info#:#Amount of video that triggers the completion status. Please note that the user may skip forward to reach this point.###31 03 2023 new variable +mcst#:#mcst_video_cast#:#Videocast###31 10 2023 new variable +mcst#:#mcst_video_completion_threshold#:#Video Completion Threshold###31 10 2023 new variable +mcst#:#mcst_video_completion_threshold_info#:#Amount of video that triggers the completion status. Please note that the user may skip forward to reach this point.###31 10 2023 new variable mcst#:#mcst_videoalternative_title#:#Fichier Alternatif (Navigateur) mcst#:#mcst_videoportable_settings_info#:#Liste d'extensions de fichier séparées par des virgules mcst#:#mcst_videoportable_settings_title#:#Extensions de Fichier pour Format Vidéo mcst#:#mcst_videoportable_title#:#Fichier Vidéo pour Mobile -mcst#:#mcst_view_abandoned#:#The current presentation mode has been abandoned. Please open the settings and switch to another mode.###31 03 2023 new variable +mcst#:#mcst_view_abandoned#:#The current presentation mode has been abandoned. Please open the settings and switch to another mode.###31 10 2023 new variable mcst#:#mcst_viewmode#:#Présentation mcst#:#mcst_visibility_info#:#Les médias publics peuvent être lus via flux RSS sans authentification. mcst#:#mcst_visibility_public#:#Public mcst#:#mcst_visibility_users#:#Utilisateurs Connectés -mcst#:#mcst_watched#:#watched###31 03 2023 new variable +mcst#:#mcst_watched#:#watched###31 10 2023 new variable mcst#:#mcst_webfeed#:#Flux RSS -mem#:#mem_period_without_time#:#Without Time Indication###07 02 2020 new variable +mem#:#mem_period_without_time#:#Without Time Indication mem#:#mem_print_view_form#:#Paramètres par défaut pour l’aperçu avant impression mem#:#mem_settings_tab_print_view#:#Paramètres de la vue avant impression mem#:#mem_settings_tab_settings#:#Paramètres généraux @@ -11215,12 +11216,12 @@ mep#:#mep_master_language_only_no_media#:#Langue de gestion sans média mep#:#mep_media_files#:#Media Files mep#:#mep_media_subtitles#:#Sous-titres média mep#:#mep_mob#:#Media Object -mep#:#mep_move_select_insert#:#Navigate to target folder and click "Insert"###31 03 2023 new variable -mep#:#mep_mpg#:#Content Snippet###31 03 2023 new variable +mep#:#mep_move_select_insert#:#Navigate to target folder and click "Insert"###31 10 2023 new variable +mep#:#mep_mpg#:#Content Snippet###31 10 2023 new variable mep#:#mep_new_content_snippet#:#Nouveau texte/média mep#:#mep_new_folder#:#Nouveau dossier mep#:#mep_page_properties#:#Paramètres page -mep#:#mep_page_type_mep#:#Content Snippet###30 04 2021 new variable +mep#:#mep_page_type_mep#:#Content Snippet mep#:#mep_sel_upload_dir_files#:#Sélectionner Fichiers/Dossiers mep#:#mep_thumbnail#:#Vignette mep#:#mep_title_and_description#:#Titre et Description @@ -11238,7 +11239,7 @@ mep#:#mobs_black_list_file_types_info#:#Entrer une liste séparée par des virgu mep#:#mobs_restrict_file_types#:#Restreindre les Types de Fichier mep#:#mobs_restrict_file_types_info#:#Entez une liste d'extensions séparées par des virgules (ex. jpg,gif) autorisées pour le dépôt de médias. Si aucune valeur n'est entrée, tous les types sont autorisés. meta#:#adt_error_max_length#:#Veuillez entrer un texte plus court. -meta#:#md_adn_int_error_no_default#:#Please select on activated language as "Default-Language".###30 04 2021 new variable +meta#:#md_adn_int_error_no_default#:#Please select on activated language as "Default-Language". meta#:#md_adv_active#:#Actif meta#:#md_adv_added_new_record#:#Nouvel ensemble de données ajouté meta#:#md_adv_col_presentation_ordering#:#Position @@ -11259,58 +11260,58 @@ meta#:#md_adv_deleted_fields#:#Les champs ont été supprimés. meta#:#md_adv_deleted_files#:#Fichiers d'export supprimés meta#:#md_adv_deleted_records#:#Ensemble de données supprimé meta#:#md_adv_desc_show#:#Afficher la Description -meta#:#md_adv_edit_complex_option#:#Edit Option Properties###07 02 2020 new variable +meta#:#md_adv_edit_complex_option#:#Edit Option Properties meta#:#md_adv_edit_field#:#Editer le Champ meta#:#md_adv_edit_record#:#Modifier ensemble de données meta#:#md_adv_field_fields#:#Zones meta#:#md_adv_field_filter_warning#:#Les types de champs %s ne sont actuellement pas supportés comme des filtres de tableau. -meta#:#md_adv_field_list#:#Fields###30 04 2021 new variable +meta#:#md_adv_field_list#:#Fields meta#:#md_adv_field_names#:#Noms de zone meta#:#md_adv_field_table#:#Editer les Champs meta#:#md_adv_fields_show#:#Afficher le Nom des Champs meta#:#md_adv_file_list#:#Fichiers d'Export meta#:#md_adv_import_record#:#Importer ensemble de méta-données -meta#:#md_adv_int_current#:#Current Language:###30 04 2021 new variable -meta#:#md_adv_int_default#:#Default Language:###30 04 2021 new variable -meta#:#md_adv_int_translation_info#:#Translation:###30 04 2021 new variable +meta#:#md_adv_int_current#:#Current Language: +meta#:#md_adv_int_default#:#Default Language: +meta#:#md_adv_int_translation_info#:#Translation: meta#:#md_adv_no_fields#:#Aucun Champ Défini meta#:#md_adv_number_decimals#:#Décimales meta#:#md_adv_number_max#:#Valeur maximum meta#:#md_adv_number_min#:#Valeur minimum meta#:#md_adv_number_suffix#:#Suffixe meta#:#md_adv_presentation#:#Présentation -meta#:#md_adv_record_activate_languages#:#Activate Languages###30 04 2021 new variable +meta#:#md_adv_record_activate_languages#:#Activate Languages meta#:#md_adv_record_list#:#Ensembles de données -meta#:#md_adv_record_lng_table#:#Language Managment###30 04 2021 new variable -meta#:#md_adv_record_lng_table_active#:#Active###30 04 2021 new variable -meta#:#md_adv_record_lng_table_default#:#Default###30 04 2021 new variable -meta#:#md_adv_record_lng_table_inst#:#Installed###30 04 2021 new variable -meta#:#md_adv_record_lng_table_lng#:#Language###30 04 2021 new variable +meta#:#md_adv_record_lng_table#:#Language Managment +meta#:#md_adv_record_lng_table_active#:#Active +meta#:#md_adv_record_lng_table_default#:#Default +meta#:#md_adv_record_lng_table_inst#:#Installed +meta#:#md_adv_record_lng_table_lng#:#Language meta#:#md_adv_records#:#Ensembles de données inclus meta#:#md_adv_records_exported#:#Un nouveau fichier d'export a été créé. meta#:#md_adv_scope#:#Étendue -meta#:#md_adv_scope_info#:#Usage of this custom metadata set will be limited to selected parts of the repository.###01 02 2023 new variable +meta#:#md_adv_scope_info#:#Usage of this custom metadata set will be limited to selected parts of the repository. meta#:#md_adv_scope_list_header#:#Limité à: -meta#:#md_adv_scope_objects#:#Data Set Effective From###01 02 2023 new variable +meta#:#md_adv_scope_objects#:#Data Set Effective From meta#:#md_adv_searchable#:#Consultable meta#:#md_adv_select_one_file#:#Veuillez sélectionner un fichier. meta#:#md_adv_show#:#Afficher -meta#:#md_adv_substitution_table#:#Substitutions (Presentation dans le Repository/Bureau personnel) +meta#:#md_adv_substitution_table#:#Substitutions (Presentation dans le catalogue/tableau de bord) meta#:#md_adv_text_max_length#:#Longueur maximum meta#:#md_adv_text_multi#:#Multi-lignes meta#:#md_advanced#:#Métadonnées Avancées -meta#:#md_aria_language_selection#:#Language Selection###30 04 2021 new variable +meta#:#md_aria_language_selection#:#Language Selection meta#:#md_copyright#:#Droits d'Auteur meta#:#md_copyright_add#:#Ajouter une Configuration de Droits d'Auteur -meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable -meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_alt_text#:#Text Representation###31 10 2023 new variable +meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###31 10 2023 new variable meta#:#md_copyright_edit#:#Editer la Configuration des Droits d'Auteur meta#:#md_copyright_enable_info#:#Cette option permet d'offrir une sélection de droits d'auteur prédéfinis meta#:#md_copyright_enabled#:#Activer le Choix des Droits d'Auteur -meta#:#md_copyright_full_name#:#Full Name###23 10 2023 new variable -meta#:#md_copyright_image_link#:#Image URL###23 10 2023 new variable -meta#:#md_copyright_link#:#URL###23 10 2023 new variable -meta#:#md_copyright_link_info#:#Link to the licence###23 10 2023 new variable +meta#:#md_copyright_full_name#:#Full Name###31 10 2023 new variable +meta#:#md_copyright_image_link#:#Image URL###31 10 2023 new variable +meta#:#md_copyright_link#:#URL###31 10 2023 new variable +meta#:#md_copyright_link_info#:#Link to the licence###31 10 2023 new variable meta#:#md_copyright_preview#:#Affichage des Droits d'Auteur meta#:#md_copyright_selection#:#Sélection de Droits d'Auteur meta#:#md_copyright_settings#:#Configuration des Droits d'Auteur @@ -11356,7 +11357,7 @@ meta#:#meta_c_AX#:#Îles d’Âland meta#:#meta_c_AZ#:#Azerbaïdjan meta#:#meta_c_BA#:#Bosnie Herzégovine meta#:#meta_c_BB#:#Barbades -meta#:#meta_c_BD#:#Bengladesh +meta#:#meta_c_BD#:#Bangladesh meta#:#meta_c_BE#:#Belgique meta#:#meta_c_BF#:#Burkina Faso meta#:#meta_c_BG#:#Bulgarie @@ -11410,7 +11411,7 @@ meta#:#meta_c_FK#:#Iles Falkland meta#:#meta_c_FM#:#Micronésie meta#:#meta_c_FO#:#Iles Faroe meta#:#meta_c_FR#:#France -meta#:#meta_c_FX#:#France, Metropolitaine +meta#:#meta_c_FX#:#France métropolitaine meta#:#meta_c_GA#:#Gabon meta#:#meta_c_GB#:#Royaume Uni meta#:#meta_c_GD#:#Grenade @@ -11591,7 +11592,7 @@ meta#:#meta_competency#:#Compétence meta#:#meta_contentprovider#:#Fournisseur de contenu meta#:#meta_context#:#Contexte meta#:#meta_contribute#:#Contribution -meta#:#meta_copyright#:#Droits d'Auteur +meta#:#meta_copyright#:#Droits d'auteur meta#:#meta_copyright_and_other_restrictions#:#Droits d'Auteur et Autres Restrictions meta#:#meta_copyright_change_info#:#You are going to change the licence assigned to this content. This should only be done in accordance with the copyright owner. Please continue only if the new licence is not more restrictive than the one used before. meta#:#meta_copyright_change_warning_title#:#Modification of Copyright Settings @@ -11602,7 +11603,7 @@ meta#:#meta_copyright_status#:#Status meta#:#meta_copyright_sub_items#:#Sub Items meta#:#meta_copyright_usage#:#Usage meta#:#meta_cost#:#Coût -meta#:#meta_coverage#:#Portée +meta#:#meta_coverage#:#Domaine d'application meta#:#meta_cp_own#:# Informations Personnelles de Copyright : meta#:#meta_creator#:#Créateur meta#:#meta_current_value#:#Valeur actuelle @@ -11649,9 +11650,9 @@ meta#:#meta_info_tlt_not_valid#:#La valeur courante n'est pas valide. Donc, elle meta#:#meta_initiator#:#Initiateur meta#:#meta_installation_remarks#:#Remarques sur l'Installation meta#:#meta_instructionaldesigner#:#Ingénieur pédagogique -meta#:#meta_intended_end_user_role#:#Rôle Supposé de l'Utilisateur Final -meta#:#meta_interactivity_level#:#Niveau d'Interactivité -meta#:#meta_interactivity_type#:#Type d'Interactivité +meta#:#meta_intended_end_user_role#:#Rôle supposé de l'utilisateur final +meta#:#meta_interactivity_level#:#Niveau d'interactivité +meta#:#meta_interactivity_type#:#Type d'interactivité meta#:#meta_is_based_on#:#Est Fondé sur meta#:#meta_is_basis_for#:#Est le Fondement de meta#:#meta_is_format_of#:#Est le Format de @@ -11659,7 +11660,7 @@ meta#:#meta_is_part_of#:#Appartient à meta#:#meta_is_referenced_by#:#Est Référencé par meta#:#meta_is_required_by#:#Est Requis par meta#:#meta_is_version_of#:#Est une Version de -meta#:#meta_keyword#:#Mot-Clé +meta#:#meta_keyword#:#Mot-clé meta#:#meta_kind#:#Type meta#:#meta_l_aa#:#Afar meta#:#meta_l_ab#:#Abkhazien @@ -11802,7 +11803,7 @@ meta#:#meta_l_zh#:#Chinois meta#:#meta_l_zu#:#Zoulou meta#:#meta_language#:#Langue meta#:#meta_learner#:#Apprenant -meta#:#meta_learning_resource_type#:#Type de Ressource Pédagogique +meta#:#meta_learning_resource_type#:#Type de ressource pédagogique meta#:#meta_lecture#:#Présentation meta#:#meta_lifecycle#:#Cycle meta#:#meta_linear#:#Linéaire @@ -11829,7 +11830,7 @@ meta#:#meta_no_meta_metadata#:#Pas de métadonnée disponible pour la section M meta#:#meta_no_relation#:#Pas de métadonnée disponible pour la section Relations. meta#:#meta_no_rights#:#Pas de métadonnée disponible pour la section Droits. meta#:#meta_no_technical#:#Pas de métadonnée disponible pour la section Technique. -meta#:#meta_obj_type_active#:#Data set offered###31 03 2023 new variable +meta#:#meta_obj_type_active#:#Data set offered###31 10 2023 new variable meta#:#meta_obj_type_inactive#:#Not Used meta#:#meta_obj_type_mandatory#:#Mandatory meta#:#meta_obj_type_optional#:#Optional @@ -11840,7 +11841,7 @@ meta#:#meta_oer_copyright_selection_info#:#Nur Objekte, die unter den/der ausgew meta#:#meta_oer_harvester#:#OER Harvester meta#:#meta_oer_harvester_desc#:#OER Harvester meta#:#meta_oer_target#:#Category for Release OER Content -meta#:#meta_operating_system#:#Système d'Exploitation +meta#:#meta_operating_system#:#Système d'exploitation meta#:#meta_or_composite#:#Ou Composite meta#:#meta_order#:#Order meta#:#meta_other#:#Autre @@ -11868,7 +11869,7 @@ meta#:#meta_scriptwriter#:#Scénariste meta#:#meta_section#:#Section meta#:#meta_security_level#:#Niveau de Sécurité meta#:#meta_self_assessment#:#Auto-Evaluation -meta#:#meta_semantic_density#:#Densité Sémantique +meta#:#meta_semantic_density#:#Densité sémantique meta#:#meta_simulation#:#Simulation meta#:#meta_size#:#Taille meta#:#meta_skill_level#:#Niveau de Compétence @@ -11881,7 +11882,7 @@ meta#:#meta_tab_advmd#:#Métadonnées Personnalisées meta#:#meta_tab_advmd_def#:#Personnaliser la définition de métadonnées meta#:#meta_tab_lom#:#LOM meta#:#meta_table#:#Tableau -meta#:#meta_taxon#:#Taxinomie +meta#:#meta_taxon#:#Taxonomie meta#:#meta_taxon_path#:#Chemin vers Taxinomie meta#:#meta_teacher#:#Enseignant meta#:#meta_technical#:#Technique @@ -11904,7 +11905,7 @@ meta#:#meta_very_high#:#Très Elevé meta#:#meta_very_low#:#Très Bas meta#:#meta_yes#:#Oui meta#:#sco_propagate#:#Propager à tous les SCOs -meta#:#udf_type_address#:#Address###07 02 2020 new variable +meta#:#udf_type_address#:#Address meta#:#udf_type_externallink#:#Lien externe meta#:#udf_type_float#:#Marge meta#:#udf_type_integer#:#Nombre entier @@ -11912,55 +11913,56 @@ meta#:#udf_type_internallink#:#Lien interne meta#:#udf_type_location#:#Emplacement meta#:#udf_type_selectmulti#:#Selection List (Checkboxes) mmbr#:#info_refuse_sure#:#Etes-vous sûr de vouloir refuser l'utilisateur(s) suivant? -mmbr#:#mmbr_awrn_my_groups_courses#:#Mes Groupes et Cours +mmbr#:#mmbr_awrn_my_groups_courses#:#Mes cours et groupes mmbr#:#mmbr_awrn_my_groups_courses_info#:#Tous les membres des groupes ou des cours de l'utilisateur actuel sont répertoriés. mmbr#:#mmbr_btn_mail_selected_users#:#Envoyer mail -mmbr#:#mmbr_info_delete_sure_unsubscribe#:#Are you sure you want to unsubscribe from the following objects?###07 02 2020 new variable -mmbr#:#mmbr_memberships#:#Memberships###30 04 2021 new variable +mmbr#:#mmbr_info_delete_sure_unsubscribe#:#Are you sure you want to unsubscribe from the following objects? +mmbr#:#mmbr_memberships#:#Inscriptions mmbr#:#mmbr_selected_users#:#Participants sélectionnés -mmbr#:#mmbr_unsubscribed_from_objs#:#You have been unsubscribed from the selected objects.###07 02 2020 new variable +mmbr#:#mmbr_unsubscribed_from_objs#:#You have been unsubscribed from the selected objects. mme#:#add_languages#:#Add Language mme#:#additional_langs#:#Additional Languages mme#:#button_save#:#Save mme#:#component_not_active#:#Component is not activated. -mme#:#confirm_move#:#Would you like to move this item to Top Items?###30 04 2021 new variable -mme#:#err_uri_not_valid#:#Please provide a valid URL###30 04 2021 new variable +mme#:#confirm_move#:#Would you like to move this item to Top Items? +mme#:#err_uri_not_valid#:#Please provide a valid URL mme#:#field_external#:#External Link mme#:#field_external_info#:#Link will be opnened in a separate Window. mme#:#field_ref_id#:#ILIAS Reference-ID mme#:#field_ref_id_info#:#The Reference-ID of the desired ILIAS-Object from the Repository, you find the Reference-ID in the URL of a object (...?ref_id=123) mme#:#field_url#:#URL mme#:#field_url_info#:#Link to the desired website, lead by http(s):// -mme#:#flush#:#Remove Lost Items###30 04 2021 new variable +mme#:#flush#:#Remove Lost Items mme#:#item_must_be_always_active#:#Item must be active. mme#:#main#:#Main Menu mme#:#mm_translation_lang#:#Language mme#:#mm_translation_trans#:#Translation -mme#:#move_to_item#:#Move to Items###30 04 2021 new variable -mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable +mme#:#move_to_item#:#Move to Items +mme#:#move_to_top_item#:#Move to Top Items mme#:#msg_languages_added#:#Added languages -mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable -mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable -mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable -mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable +mme#:#msg_moved#:#Item successfully moved +mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent. +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###31 10 2023 new variable +mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost. +mme#:#msg_restored#:#Main Menu completely reset mme#:#msg_subitem_deleted#:#Item deleted. -mme#:#msg_subitem_flushed#:#Lost Items removed.###30 04 2021 new variable +mme#:#msg_subitem_flushed#:#Lost Items removed. mme#:#msg_topitem_deleted#:#Item deleted. -mme#:#msg_translations_deleted#:#Translations deleted###07 02 2020 new variable +mme#:#msg_translations_deleted#:#Translations deleted mme#:#msg_translations_saved#:#Translations saved -mme#:#restore#:#Reset Main Menu###07 02 2020 new variable -mme#:#select_parent#:#Select Parent###30 04 2021 new variable +mme#:#restore#:#Reset Main Menu +mme#:#select_parent#:#Select Parent mme#:#sub_actions#:#Actions mme#:#sub_active#:#Active mme#:#sub_active_byline#:#Activate this Item for all users. -mme#:#sub_global_roles#:#Global Roles###30 04 2021 new variable -mme#:#sub_icon#:#Icon###07 02 2020 new variable -mme#:#sub_icon_byline#:#Upload a custom icon for this Item. Please note that the SVG-Icons will be inverted.###07 02 2020 new variable +mme#:#sub_global_roles#:#Global Roles +mme#:#sub_icon#:#Icon +mme#:#sub_icon_byline#:#Upload a custom icon for this Item. Please note that the SVG-Icons will be inverted. mme#:#sub_parent#:#Top Item mme#:#sub_position#:#Position mme#:#sub_provider#:#Provider -mme#:#sub_role_based_visibility#:#Visibility for roles###30 04 2021 new variable -mme#:#sub_role_based_visibility_byline#:#Choose global roles which can see this item. If not activated, the item is always shown.###30 04 2021 new variable +mme#:#sub_role_based_visibility#:#Visibility for roles +mme#:#sub_role_based_visibility_byline#:#Choose global roles which can see this item. If not activated, the item is always shown. mme#:#sub_status#:#Status mme#:#sub_title#:#Title mme#:#sub_title_default#:#Title (Default Language) @@ -11984,8 +11986,8 @@ mme#:#topitem_confirm_delete#:#Do you really want to delete the following Item? mme#:#topitem_css_id#:#CSS-ID mme#:#topitem_delete#:#Delete mme#:#topitem_edit#:#Edit -mme#:#topitem_icon#:#Icon###07 02 2020 new variable -mme#:#topitem_icon_byline#:#Upload a custom icon for this Item. Please note that the SVG-Icons will be inverted.###07 02 2020 new variable +mme#:#topitem_icon#:#Icon +mme#:#topitem_icon_byline#:#Upload a custom icon for this Item. Please note that the SVG-Icons will be inverted. mme#:#topitem_position#:#Position mme#:#topitem_provider#:#Provider mme#:#topitem_subentries#:#Items @@ -12000,42 +12002,42 @@ mme#:#topitem_type_parent#:#Top Item mme#:#type_complex#:#Complex mme#:#type_link#:#Link mme#:#type_link_list#:#Link List -mme#:#type_lost#:#Lost###07 02 2020 new variable +mme#:#type_lost#:#Lost mme#:#type_repository_link#:#Repository-Link mme#:#type_separator#:#Separator -mme#:#type_separator_info#:#The title of this item will be displayed in a grey banner. If you do not enter any title, a simple line will be shown.###07 02 2020 new variable +mme#:#type_separator_info#:#The title of this item will be displayed in a grey banner. If you do not enter any title, a simple line will be shown. mme#:#type_top_link_item#:#Link mme#:#type_top_parent_item#:#Container -mob#:#mob_choose_from_pool#:#Choose from Media Pool###30 04 2021 new variable -mob#:#mob_external_url#:#External URL###30 04 2021 new variable +mob#:#mob_choose_from_pool#:#Choose from Media Pool +mob#:#mob_external_url#:#External URL mob#:#mob_file#:#Fichier mob#:#mob_file_could_not_be_uploaded#:#Le fichier n’a pas pu être téléchargé. mob#:#mob_general#:#Général mob#:#mob_language#:#Langage -mob#:#mob_mime_type_not_allowed#:#The following mime types are not allowed at the destination.###31 03 2023 new variable +mob#:#mob_mime_type_not_allowed#:#The following mime types are not allowed at the destination.###31 10 2023 new variable mob#:#mob_multi_srt_files#:#Fichiers SRT mob#:#mob_no_fixed_size_map_editing#:#Please define a fixed size for your image before using map areas. If your image is scaled by content style or other CSS rules, your map areas will not fit anymore. mob#:#mob_object#:#Objet -mob#:#mob_please_select_pool#:#Bitte wählen Sie einen Medienpool aus.###31 03 2023 new variable +mob#:#mob_please_select_pool#:#Bitte wählen Sie einen Medienpool aus.###31 10 2023 new variable mob#:#mob_really_delete_srt#:#Souhaitez-vous vraiment supprimer les fichiers suivants ? mob#:#mob_srt_files_deleted#:#Les fichiers de sous-titre ont été supprimés -mob#:#mob_srt_not_allowed#:#Files with a .srt suffix are currently not allowed to be uploaded. If you would like to use srt files, contact your system administrator.###31 03 2023 new variable +mob#:#mob_srt_not_allowed#:#Files with a .srt suffix are currently not allowed to be uploaded. If you would like to use srt files, contact your system administrator.###31 10 2023 new variable mob#:#mob_subtitle_file#:#Fichier de Sous-Titre mob#:#mob_subtitle_files#:#Fichiers de Sous-Titre mob#:#mob_subtitles#:#Sous-Titres -mob#:#mob_type_not_supported#:#Mime type not supported:###31 03 2023 new variable -mob#:#mob_upload_file#:#Upload File###30 04 2021 new variable +mob#:#mob_type_not_supported#:#Mime type not supported:###31 10 2023 new variable +mob#:#mob_upload_file#:#Upload File mob#:#mob_upload_multi_srt#:#Télécharger comme ZIP mob#:#mob_upload_multi_srt_howto#:#Le fichier .zip ne doit pas contenir de sous-répertoires, tous les fichiers .srt devraient être situés au niveau le plus haut. Les nom de fichier devraient se terminer par «_<lang code>.srt», tandis que le code long est par ex. «en», «it», «de». -mob#:#mob_url#:#URL###30 04 2021 new variable -mob#:#mob_url_info#:#External resource URL, e.g. Youtube or Vimeo URL.###30 04 2021 new variable -mob#:#mob_url_info1#:#External resource URL, allowed suffixes are:###31 03 2023 new variable -mob#:#mob_url_info_video#:#You may also refer to a Youtube or Vimeo URL.###31 03 2023 new variable -mst#:#mst_cert_issued_on#:#Issued On###07 02 2020 new variable +mob#:#mob_url#:#URL +mob#:#mob_url_info#:#External resource URL, e.g. Youtube or Vimeo URL. +mob#:#mob_url_info1#:#External resource URL, allowed suffixes are:###31 10 2023 new variable +mob#:#mob_url_info_video#:#You may also refer to a Youtube or Vimeo URL.###31 10 2023 new variable +mst#:#mst_cert_issued_on#:#Issued On mst#:#mst_courses_of#:#Inscriptions de %s -mst#:#mst_download_certificate#:#Download Certificate###07 02 2020 new variable -mst#:#mst_list_certificates#:#Certificates###07 02 2020 new variable -mst#:#mst_list_competences#:#Competences###07 02 2020 new variable +mst#:#mst_download_certificate#:#Download Certificate +mst#:#mst_list_certificates#:#Certificates +mst#:#mst_list_competences#:#Competences mst#:#mst_list_courses#:#Inscriptions mst#:#mst_list_users#:#Liste du personnel mst#:#mst_memb_status_registered#:#Inscrit @@ -12044,18 +12046,18 @@ mst#:#mst_memb_status_waitinglist#:#Liste d’attente mst#:#mst_my_staff#:#Personnel mst#:#mst_opt_all#:#Tous mst#:#mst_please_select_course#:#Veuillez sélectionner un cours. -mst#:#mst_profile_fulfilled#:#Not met, yet###07 02 2020 new variable -mst#:#mst_profile_not_fulfilled#:#Fulfilled###07 02 2020 new variable +mst#:#mst_profile_fulfilled#:#Not met, yet +mst#:#mst_profile_not_fulfilled#:#Fulfilled mst#:#mst_select_course#:#Sélectionner un cours mst#:#mst_show_courses#:#Inscriptions -news#:#lso_news_online_title#:#A new learning sequence object is online!###07 02 2020 new variable -news#:#lso_news_online_txt#:#A new object for your learning sequence was just published.###07 02 2020 new variable +news#:#lso_news_online_title#:#A new learning sequence object is online! +news#:#lso_news_online_txt#:#A new object for your learning sequence was just published. news#:#new_test_online#:#Le test a été mis en ligne. news#:#news_1_file_created#:#1 fichier a été ajouté. news#:#news_1_file_updated#:#1 fichier a été mis à jour. news#:#news_1_postings#:#1 article a été ajouté news#:#news_add_news#:#Ajouter article -news#:#news_all_items#:#Toutes les actualités sur le bureau personnel +news#:#news_all_items#:#Actualités pour tous les favoris news#:#news_allow_longer_periods#:#Autoriser une Période plus Longue news#:#news_allow_longer_periods_info#:#Les utilisateurs peuvent choisir une période d'actualités plus longue sur leur bureau personnel. news#:#news_allow_shorter_periods#:#Autoriser une Période plus Courte @@ -12087,7 +12089,7 @@ news#:#news_hide_news_date#:#Date de Début news#:#news_hide_news_per_date#:#Afficher les Actualités Après news#:#news_hide_news_per_date_info#:#Seules les actualités plus récentes seront affichées. news#:#news_inactive_private_feed_info#:#Votre flux de nouvelles privées est désactivé. Veuillez définir un mot de passe dans les paramètres. -news#:#news_internal_news#:#Actualités +news#:#news_internal_news#:#Actualités internes news#:#news_keep_minimal_x_items#:#Garder au moins x éléments news#:#news_keep_minimal_x_items_info#:#Lorsqu'une valeur > 0 est entrée, c'est le nombre d'éléments conservés dans le flux, même s'ils sont plus anciens que la durée de vie par défaut des éléments. news#:#news_loading_news#:#Chargement des Actualités... @@ -12106,7 +12108,7 @@ news#:#news_news_item_visibility#:#Accès news#:#news_news_item_visibility_info#:#Les éléments publics peuvent être consultés sans authentification en dehors d'ILIAS via RSS. news#:#news_news_items#:#Actualités news#:#news_no_js_click_here#:#Si l'information ne s'affiche pas, cliquez ici. -news#:#news_no_news_items#:#Aucune actualité à afficher. +news#:#news_no_news_items#:#Aucune actualité à afficher news#:#news_notifications#:#Notifications news#:#news_notifications_public#:#Notifications Publiques news#:#news_notifications_public_info#:#Si actif, les notifications peuvent être obtenues par un flux personnel d'actualité (RSS) en dehors d'ILIAS. Veuillez noter que cela rend les notifications accessibles sans authentification. @@ -12114,12 +12116,12 @@ news#:#news_nr_of_items#:#Nombre Maximum d'Actualités par Objet news#:#news_nr_of_items_info#:#Nombre d'actualités conservées en base de données pour chaque objet. Veuillez noter que les objets de type conteneurs (ex. catégories, cours) peuvent lister plus d'objets puisqu'ils agrègent des actualités d'objets fils. news#:#news_pd_period#:#Ancienneté des Actualités sur le Bureau Personnel news#:#news_pd_period_info#:#Détermine l'ancienneté des actualités sur le bureau personnel. Choisissez des valeurs plus basses si vous rencontrez des problèmes de performance. -news#:#news_period_1_month#:#Mois Dernier -news#:#news_period_1_week#:#Semaine Dernière -news#:#news_period_1_year#:#Année Dernière -news#:#news_period_x_days#:#%s Derniers Jours -news#:#news_period_x_months#:#%s Derniers Mois -news#:#news_period_x_weeks#:#%s Dernières Semaines +news#:#news_period_1_month#:#Mois dernier +news#:#news_period_1_week#:#Semaine dernière +news#:#news_period_1_year#:#Année dernière +news#:#news_period_x_days#:#%s derniers jours +news#:#news_period_x_months#:#%s derniers mois +news#:#news_period_x_weeks#:#%s dernières semaines news#:#news_public_feed#:#Flux RSS Dédié news#:#news_public_feed_info#:#Si actif, une URL du flux d'actualités (RSS) distincte pour cet article est créée. news#:#news_really_delete_news#:#Voulez-vous vraiment supprimer cet article de nouvelles? @@ -12146,23 +12148,23 @@ note#:#note_comment_notification_salutation#:#Bonjour %s, note#:#note_comment_notification_subject#:#Un commentaire a été ajouté à «%s» note#:#note_comment_notification_subjectc#:#Un commentaire a été modifié dans «%s» note#:#note_comment_notification_user_has_written#:#%s a écrit: -note#:#note_comments_notification#:#General notification about all comments###07 02 2020 new variable -note#:#note_comments_notification_info#:#Comma separated list of accounts that are notified for each comment###07 02 2020 new variable -note#:#note_enable_comments#:#Enable Comments###07 02 2020 new variable -note#:#note_enable_comments_del_tutor#:#Any Comment may be deleted by tutors###07 02 2020 new variable -note#:#note_enable_comments_del_tutor_info#:#User with "Edit Settings" permission for an object can delete any comment made in this object.###07 02 2020 new variable -note#:#note_enable_comments_del_user#:#Comments may be deleted by their authors###07 02 2020 new variable -note#:#note_enable_comments_export_info#:#This option enables comments export for content objects like portfolio, blog and wiki.###30 04 2021 new variable -note#:#note_enable_notes#:#Enable Notes###07 02 2020 new variable -note#:#note_html_export_include_comments#:#Should comments be included in the export?###30 04 2021 new variable +note#:#note_comments_notification#:#General notification about all comments +note#:#note_comments_notification_info#:#Comma separated list of accounts that are notified for each comment +note#:#note_enable_comments#:#Enable Comments +note#:#note_enable_comments_del_tutor#:#Any Comment may be deleted by tutors +note#:#note_enable_comments_del_tutor_info#:#User with "Edit Settings" permission for an object can delete any comment made in this object. +note#:#note_enable_comments_del_user#:#Comments may be deleted by their authors +note#:#note_enable_comments_export_info#:#This option enables comments export for content objects like portfolio, blog and wiki. +note#:#note_enable_notes#:#Enable Notes +note#:#note_html_export_include_comments#:#Les commentaires doivent-ils être inclus dans l'exportation ? notes#:#comments_feature_currently_not_activated_for_object#:#Les commentaires publics ne sont actuellement pas activés pour cet objet. -notes#:#note_add_comment#:#Ajouter Commentaire -notes#:#note_add_note#:#Ajouter Note +notes#:#note_add_comment#:#Ajouter un commentaire +notes#:#note_add_note#:#Ajouter une note notes#:#note_content_removed#:#Le contenu a été supprimé. -notes#:#note_text#:#Text###31 03 2023 new variable +notes#:#note_text#:#Text###31 10 2023 new variable notes#:#note_update_comment#:#Enregistrer Commentaire notes#:#note_update_note#:#Enregistrer Note -notes#:#note_without_object#:#Without reference###30 04 2021 new variable +notes#:#note_without_object#:#Without reference notes#:#notes_activate_comments#:#Activer Commentaires Publics notes#:#notes_add_comment#:#Ajouter Commentaire notes#:#notes_add_edit_comment#:#Add/Edit Comment @@ -12172,44 +12174,44 @@ notes#:#notes_comment_deleted#:#Le commentaire a été supprimé. notes#:#notes_comments#:#Commentaires notes#:#notes_comments_deleted#:#Les commentaires ont été supprimés. notes#:#notes_deactivate_comments#:#Désactiver Commentaires Publics -notes#:#notes_delete_comment#:#Do you really want to delete this comment?###31 03 2023 new variable -notes#:#notes_delete_note#:#Do you really want to delete this note?###31 03 2023 new variable +notes#:#notes_delete_comment#:#Do you really want to delete this comment?###31 10 2023 new variable +notes#:#notes_delete_note#:#Do you really want to delete this note?###31 10 2023 new variable notes#:#notes_hide_comments#:#Masquer commentaires -notes#:#notes_html_export#:#HTML Export###31 03 2023 new variable +notes#:#notes_html_export#:#HTML Export###31 10 2023 new variable notes#:#notes_latest_comment#:#Latest Comment notes#:#notes_my_comments#:#Mes Commentaires notes#:#notes_no_comments#:#Aucun commentaire actuellement. -notes#:#notes_no_comments_found#:#No comments found that match your seach criteria.###31 03 2023 new variable -notes#:#notes_no_notes#:#No notes have been attached yet.###31 03 2023 new variable -notes#:#notes_no_notes_found#:#No notes found that match your seach criteria.###31 03 2023 new variable +notes#:#notes_no_comments_found#:#No comments found that match your seach criteria.###31 10 2023 new variable +notes#:#notes_no_notes#:#No notes have been attached yet.###31 10 2023 new variable +notes#:#notes_no_notes_found#:#No notes found that match your seach criteria.###31 10 2023 new variable notes#:#notes_note_deleted#:#La note a été supprimée. notes#:#notes_notes_deleted#:#Les notes ont été supprimées. -notes#:#notes_origin#:#Origin###31 03 2023 new variable -notes#:#notes_public_comments#:#Commentaires Publics +notes#:#notes_origin#:#Origin###31 10 2023 new variable +notes#:#notes_public_comments#:#Commentaires publics notes#:#notes_show_comments#:#Afficher commentaires notes#:#notes_sort_asc#:#Trier par ordre croissant notes#:#notes_sort_desc#:#Trier par ordre décroissant -notes#:#notes_text#:#Text###31 03 2023 new variable +notes#:#notes_text#:#Text###31 10 2023 new variable noti#:#noti_activate_notification#:#Activate Notification noti#:#noti_deactivate_notification#:#Deactivate Notification noti#:#noti_notification_activated#:#Notification Activated noti#:#noti_notification_deactivated#:#Notification Deactivated -notifications_adm#:#enable_osd#:#Enable On-Screen Notifications###31 03 2023 new variable -notifications_adm#:#enable_osd_desc#:#If enabled, users are notified by a popup about new notifications.###31 03 2023 new variable -notifications_adm#:#notification_settings#:#Notification Settings###31 03 2023 new variable -notifications_adm#:#osd_delay#:#Presentation Delay###31 03 2023 new variable -notifications_adm#:#osd_delay_desc#:#Delay of the visible presentation in milliseconds.###31 03 2023 new variable -notifications_adm#:#osd_error_presentation_time_too_small#:#The Presentation Time has to be at least than 1000 miliseconds.###31 03 2023 new variable -notifications_adm#:#osd_error_refresh_interval_smaller_than_delay_and_vanish_combined#:#The Refresh Interval has to be greater than the Presentation Time and the Presentation Delay combined.###31 03 2023 new variable -notifications_adm#:#osd_error_refresh_interval_too_small#:#The Refresh Interval has to be at least than 3000 miliseconds.###31 03 2023 new variable -notifications_adm#:#osd_interval#:#Refreshinterval###31 03 2023 new variable -notifications_adm#:#osd_interval_desc#:#Polling interval for checking of new notifications in miliseconds. A lower number will notify the user more quickly but increases the number of requests the web server must handle.###31 03 2023 new variable -notifications_adm#:#osd_play_sound#:#Play a Sound###31 03 2023 new variable -notifications_adm#:#osd_play_sound_desc#:#Play a sound when receiving a new notficiation.###31 03 2023 new variable -notifications_adm#:#osd_settings#:#On-Screen Notifications###31 03 2023 new variable -notifications_adm#:#osd_vanish#:#Presentation Time###31 03 2023 new variable -notifications_adm#:#osd_vanish_desc#:#Visible time of a notification on the screen in miliseconds.###31 03 2023 new variable -obj#:#cont_filter_empty#:#Please use the filter to see any objects.###07 02 2020 new variable +notifications_adm#:#enable_osd#:#Enable On-Screen Notifications###31 10 2023 new variable +notifications_adm#:#enable_osd_desc#:#If enabled, users are notified by a popup about new notifications.###31 10 2023 new variable +notifications_adm#:#notification_settings#:#Notification Settings###31 10 2023 new variable +notifications_adm#:#osd_delay#:#Presentation Delay###31 10 2023 new variable +notifications_adm#:#osd_delay_desc#:#Delay of the visible presentation in milliseconds.###31 10 2023 new variable +notifications_adm#:#osd_error_presentation_time_too_small#:#The Presentation Time has to be at least than 1000 miliseconds.###31 10 2023 new variable +notifications_adm#:#osd_error_refresh_interval_smaller_than_delay_and_vanish_combined#:#The Refresh Interval has to be greater than the Presentation Time and the Presentation Delay combined.###31 10 2023 new variable +notifications_adm#:#osd_error_refresh_interval_too_small#:#The Refresh Interval has to be at least than 3000 miliseconds.###31 10 2023 new variable +notifications_adm#:#osd_interval#:#Refreshinterval###31 10 2023 new variable +notifications_adm#:#osd_interval_desc#:#Polling interval for checking of new notifications in miliseconds. A lower number will notify the user more quickly but increases the number of requests the web server must handle.###31 10 2023 new variable +notifications_adm#:#osd_play_sound#:#Play a Sound###31 10 2023 new variable +notifications_adm#:#osd_play_sound_desc#:#Play a sound when receiving a new notficiation.###31 10 2023 new variable +notifications_adm#:#osd_settings#:#On-Screen Notifications###31 10 2023 new variable +notifications_adm#:#osd_vanish#:#Presentation Time###31 10 2023 new variable +notifications_adm#:#osd_vanish_desc#:#Visible time of a notification on the screen in miliseconds.###31 10 2023 new variable +obj#:#cont_filter_empty#:#Please use the filter to see any objects. obj#:#cont_skll_published#:#Toutes les affectations ont été publiées. obj#:#cont_skll_published_some_not#:#Toutes les affectations données ont été publiées. Certains utilisateurs n'ont pas les affectations de compétences. Par conséquent, aucune affectation n’a pu être publiée pour eux. obj#:#edit_questions#:#Editer Questions @@ -12225,7 +12227,7 @@ obj#:#obj_deactivate_content_lang#:#Désactiver la Traduction pour l'Edition des obj#:#obj_deactivate_content_transl_conf#:#Voulez-vous vraiment désactiver la traduction pour l'édition des pages ? Seuls les contenus de la langue principale seront conservés. obj#:#obj_deactivate_multilang#:#Désactiver Multi-Linguisme obj#:#obj_deactivate_multilang_conf#:#Voulez-vous vraiment désactiver le multi-linguisme ? Seuls les contenus de la langue principale seront conservés. -obj#:#obj_fallback_lang#:#Default Language###30 04 2021 new variable +obj#:#obj_fallback_lang#:#Default Language obj#:#obj_features#:#Fonctions obj#:#obj_import_file_error#:#Ce fichier n’a pas pu être importé. Veuillez vous assurer qu’il s’agisse d’un fichier d’exportation ILIAS valide (exportation XML), du même type d’objet. Le nom du fichier ne doit pas être modifié après l’exportation. Message d’erreur: obj#:#obj_insert_into_clipboard#:#Insérer dans le Presse-Papier @@ -12240,25 +12242,25 @@ obj#:#obj_orgunit_positions_info#:#Si cette option est activée, des règles de obj#:#obj_permission_settings#:#Paramètres des permissions obj#:#obj_presentation#:#Présentation obj#:#obj_select_master_lang#:#Veuillez choisir la langue principale. Le contenu courant sera assigné à la langue principale. La langue principale ne pourra plus être modifiée par le suite. -obj#:#obj_select_one_language#:#Please select one language###30 04 2021 new variable -obj#:#obj_set_fallback_lang#:#Set default language###30 04 2021 new variable +obj#:#obj_select_one_language#:#Please select one language +obj#:#obj_set_fallback_lang#:#Set default language obj#:#obj_settings_for_all_members#:#Les membres seront notifiés automatiquement obj#:#obj_show_header_actions#:#Show Header Actions obj#:#obj_show_title_and_icon#:#Show Title and Icon obj#:#obj_target_location#:#Emplacement de la copie obj#:#obj_tile_image#:#Tile Image obj#:#obj_tile_image_info#:#The tile image will be used, if the container (course, folder, group, ...) activates the tile view presentation. -obj#:#obj_tool_booking#:#Resources###07 02 2020 new variable -obj#:#obj_tool_booking_info#:#Use the booking pools to book resources.###07 02 2020 new variable -obj#:#obj_tool_ext_mail_subject_prefix#:#Mail Subject Prefix###30 04 2021 new variable -obj#:#obj_tool_ext_mail_subject_prefix_info#:#Enter a short text that is added to the subject line of external mails send to members to make identifying these mails easier.###30 04 2021 new variable +obj#:#obj_tool_booking#:#Resources +obj#:#obj_tool_booking_info#:#Use the booking pools to book resources. +obj#:#obj_tool_ext_mail_subject_prefix#:#Mail Subject Prefix +obj#:#obj_tool_ext_mail_subject_prefix_info#:#Enter a short text that is added to the subject line of external mails send to members to make identifying these mails easier. obj#:#obj_tool_setting_badges#:#Badges obj#:#obj_tool_setting_badges_info#:#If activated badges can be managed. -obj#:#obj_tool_setting_booking#:#Resources###07 02 2020 new variable -obj#:#obj_tool_setting_filter#:#Filter###07 02 2020 new variable -obj#:#obj_tool_setting_filter_empty#:#Show on Empty Filter###07 02 2020 new variable -obj#:#obj_tool_setting_filter_empty_info#:#Show all items while filter is empty.###07 02 2020 new variable -obj#:#obj_tool_setting_filter_info#:#A filter will be displayed in the content tab.###07 02 2020 new variable +obj#:#obj_tool_setting_booking#:#Resources +obj#:#obj_tool_setting_filter#:#Filter +obj#:#obj_tool_setting_filter_empty#:#Show on Empty Filter +obj#:#obj_tool_setting_filter_empty_info#:#Show all items while filter is empty. +obj#:#obj_tool_setting_filter_info#:#A filter will be displayed in the content tab. obj#:#obj_tool_setting_info_tab#:#Afficher Onglet Info obj#:#obj_tool_setting_info_tab_info#:#L'onglet "Info" sera affiché. obj#:#obj_tool_setting_skills#:#Compétences @@ -12275,7 +12277,7 @@ obj#:#svy_results#:#Résultats objref#:#objref_custom_title#:#Utiliser un Titre Personnalisé objref#:#objref_edit_ref#:#Réglage de la Cible objref#:#objref_edit_title#:#Réglage du Titre -objref#:#objref_failure_target_type#:#Das Ziel des Links muss vom folgendem Typ sein:###07 02 2020 new variable +objref#:#objref_failure_target_type#:#Das Ziel des Links muss vom folgendem Typ sein: objref#:#objref_reuse_title#:#Réutiliser le Titre de la Référence objref#:#objref_title_settings#:#Editer le Titre de la Référence orgu#:#Actions#:#Actions @@ -12301,7 +12303,7 @@ orgu#:#import_terminated_with_warnings#:#L'import s'est terminé avec des alerte orgu#:#import_xml_file#:#Importer Données orgu#:#local_other_roles#:#Additional Roles %s orgu#:#local_staff#:#Employés %s -orgu#:#mm_organisation#:#Organisation###31 03 2023 new variable +orgu#:#mm_organisation#:#Organisation###31 10 2023 new variable orgu#:#msg_assignment_to_employee_done#:#Affectation à la position de l'employé terminée orgu#:#msg_confirm_d_ua#:#Voulez-vous assigner cette personne à la position d’employé de ses unités organisationnelles respectives? orgu#:#msg_confirm_deletion#:#Voulez-vous vraiment supprimer la position suivante? @@ -12317,19 +12319,19 @@ orgu#:#no_roles#:#Il n'y a pas d'autre rôle pour le moment. orgu#:#not_movable_to_subtree#:#Une unité organisationnelle ne peut pas être déplacée dans son propre sous-arbre. Cela créerait une boucle. orgu#:#org_op_access_enrolments#:#Voir les inscriptions orgu#:#org_op_access_results#:#Access Results -orgu#:#org_op_create_employee_talk#:#Create talk appointments / edit talk appointments that you have created yourself###31 03 2023 new variable -orgu#:#org_op_edit_employee_talk#:#Edit Talk appointments###31 03 2023 new variable -orgu#:#org_op_edit_individual_plan#:#Edit Individual Plan###07 02 2020 new variable +orgu#:#org_op_create_employee_talk#:#Create talk appointments / edit talk appointments that you have created yourself###31 10 2023 new variable +orgu#:#org_op_edit_employee_talk#:#Edit Talk appointments###31 10 2023 new variable +orgu#:#org_op_edit_individual_plan#:#Edit Individual Plan orgu#:#org_op_edit_submissions_grades#:#Éditer les soumissions d’autres utilisateurs orgu#:#org_op_manage_members#:#Gérer les membres orgu#:#org_op_manage_participants#:#Manage Participants -orgu#:#org_op_read_employee_talk#:#Read access talk appointments###31 03 2023 new variable +orgu#:#org_op_read_employee_talk#:#Read access talk appointments###31 10 2023 new variable orgu#:#org_op_read_learning_progress#:#Voir la progression d’apprentissage d’autres utilisateurs orgu#:#org_op_score_participants#:#Score Participants -orgu#:#org_op_view_certificates#:#View certificates of other users###07 02 2020 new variable -orgu#:#org_op_view_competences#:#View competences of other users###07 02 2020 new variable -orgu#:#org_op_view_individual_plan#:#View Individual Plan###07 02 2020 new variable -orgu#:#org_op_view_members#:#View Members###07 02 2020 new variable +orgu#:#org_op_view_certificates#:#View certificates of other users +orgu#:#org_op_view_competences#:#View competences of other users +orgu#:#org_op_view_individual_plan#:#View Individual Plan +orgu#:#org_op_view_members#:#View Members orgu#:#org_op_write_learning_progress#:#Définir la progression d’apprentissage d’autres utilisateurs orgu#:#org_unit_not_found#:#Unité organisationnelle non trouvée. orgu#:#orgu_add#:#Ajouter Unité Organisationnelle @@ -12373,7 +12375,7 @@ orgu#:#orgu_types#:#Types orgu#:#orgunit_position_permissions_not_active_for#:#You cannot override the position specific permissions for the type: orgu#:#ou_external_id_exists#:#Une unité avec l'ID externe existe déjà dans ce système ou dans la corbeille. orgu#:#ou_id_not_valid#:#ID d’importation non trouvée. -orgu#:#ou_more_than_one_match_found#:#More then one match found.###07 02 2020 new variable +orgu#:#ou_more_than_one_match_found#:#More then one match found. orgu#:#ou_parent_id_not_valid#:#Le "ou_parent_id" n'est pas valide. Les valeurs valides sont : "reference_id" ou "external_id". orgu#:#over#:#Sur orgu#:#over_-1#:#Tout le monde @@ -12393,7 +12395,7 @@ orgu#:#simple_xls#:#Simple Export Excel orgu#:#simple_xml#:#Simple Export XML orgu#:#superior#:#Supérieur orgu#:#user_assignments#:#Affectations d’utilisateur -orgu#:#user_assignments_recursive#:#User Assignments Subtree###30 04 2021 new variable +orgu#:#user_assignments_recursive#:#User Assignments Subtree orgu#:#user_changed_successful#:#L'utilisateur a été modifié avec succès. orgu#:#user_import_successful#:#L'import a réussi. Assignés : %s, Supprimés : %s. orgu#:#users_successfuly_added#:#L'utilisateur a été ajouté avec succès. @@ -12402,24 +12404,24 @@ orgu#:#view_learning_progress_rec#:#View Learning Progress Recursivly pd#:#block_show_chatviewer#:#Afficher le Lecteur de Chat pd#:#block_show_pdbookm#:#Afficher les Favoris pd#:#block_show_pdcal#:#Afficher l'Agenda -pd#:#block_show_pdfrmpostdraft#:#Show Postings Drafts###07 02 2020 new variable +pd#:#block_show_pdfrmpostdraft#:#Show Postings Drafts pd#:#block_show_pdmail#:#Afficher la Messagerie pd#:#block_show_pdnews#:#Afficher les Actualités pd#:#block_show_pdnotes#:#Afficher les Notes pd#:#block_show_pdportf#:#Montrer portfolios pd#:#block_show_pdtag#:#Afficher mes Mots-Clés -pd#:#block_show_pdtasks#:#Show Tasks###07 02 2020 new variable +pd#:#block_show_pdtasks#:#Show Tasks pd#:#block_show_x#:#Afficher %s pd#:#pd_achievements#:#Achievements pd#:#pd_bookmarks#:#Favoris -pd#:#pd_download_last_export_file#:#Télécharger le Dernier Fichier Exporté +pd#:#pd_download_last_export_file#:#Télécharger le dernier fichier exporté pd#:#pd_enable_comments#:#Activer les Commentaires pd#:#pd_enable_prtf#:#Activer les Portfolios pd#:#pd_enable_user_publish#:#Autoriser la Publication des Contenus Utilisateurs pd#:#pd_enable_user_publish_info#:#Lorsque activé, les utilisateurs peuvent publier sur le Web leur profil, les objets de leur espace personnel ainsi que leurs portfolios. pd#:#pd_ended#:#Terminée -pd#:#pd_export_profile#:#Exporter Données Personnelles -pd#:#pd_import_personal_data#:#Importer Données Personnelles +pd#:#pd_export_profile#:#Exporter des données personnelles +pd#:#pd_import_personal_data#:#Importer des données personnelles pd#:#pd_my_memberships_intro#:#Bienvenue dans vos "Appartenances" pd#:#pd_my_memberships_intro2#:#Votre espace personnel pour tous les cours et groupes auxquels vous participez. pd#:#pd_my_memberships_sort_default#:#Option de triage par défaut @@ -12427,83 +12429,83 @@ pd#:#pd_not_date#:#Pas de date pd#:#pd_ongoing#:#En cours pd#:#pd_personal_items_default_view#:#Vue par Défaut pd#:#pd_personal_items_default_view_info#:#Choisir la présentation par défaut de vos objets personnels -pd#:#pd_presentation_mode_list#:#Item List Presentation###07 02 2020 new variable -pd#:#pd_presentation_mode_tile#:#Tile Presentation###07 02 2020 new variable -pd#:#pd_private_calendars#:#Agendas Privés -pd#:#pd_profile_data#:#Données Personnelles +pd#:#pd_presentation_mode_list#:#Item List Presentation +pd#:#pd_presentation_mode_tile#:#Tile Presentation +pd#:#pd_private_calendars#:#Calendriers privés +pd#:#pd_profile_data#:#Données personnelles pd#:#pd_remove_multi_confirm#:#Les objets ont été retirés. -pd#:#pd_remove_multiple#:#Retirer Plusieurs Objets +pd#:#pd_remove_multiple#:#Retirer plusieurs objets pd#:#pd_unsubscribe_memberships#:#Se Désinscrire -pd#:#pd_unsubscribe_multiple_memberships#:#Se Désinscrire (Plusieurs) +pd#:#pd_unsubscribe_multiple_memberships#:#Se désinscrire (plusieurs) pd#:#pd_upcoming#:#À venir pd#:#pd_view_select_at_least_one#:#Vous devez sélectionner au moins une vue : 'Items sélectionnés' et/ou 'Mes appartenances' pdesk#:#bookmark_moved_ok#:#Le favori a été déplacé. pdesk#:#bookmark_select_target#:#Veuillez sélectionner une destination. -pdfgen#:#checkbox_checked_svg#:#Path to checked checkbox svg###07 02 2020 new variable -pdfgen#:#checkbox_svg#:#Path to checkbox svg###07 02 2020 new variable +pdfgen#:#checkbox_checked_svg#:#Path to checked checkbox svg +pdfgen#:#checkbox_svg#:#Path to checkbox svg pdfgen#:#cleanup#:#Nettoyage -pdfgen#:#config#:#Config###07 02 2020 new variable +pdfgen#:#config#:#Config pdfgen#:#config_not_saved#:#Sauvegarde échouée pdfgen#:#config_saved#:#Sauvée avec succès pdfgen#:#configure#:#Configurer le moteur de rendu -pdfgen#:#enable_forms#:#Enable Forms###07 02 2020 new variable -pdfgen#:#enable_forms_info#:#Turn HTML form fields into pdf form fields###07 02 2020 new variable -pdfgen#:#external_links#:#Externel links###07 02 2020 new variable -pdfgen#:#external_links_info#:#Make links to remote web pages###07 02 2020 new variable +pdfgen#:#enable_forms#:#Enable Forms +pdfgen#:#enable_forms_info#:#Turn HTML form fields into pdf form fields +pdfgen#:#external_links#:#Externel links +pdfgen#:#external_links_info#:#Make links to remote web pages pdfgen#:#footer_height#:#Hauteur de bas de page -pdfgen#:#footer_html#:#Html###07 02 2020 new variable -pdfgen#:#footer_line#:#Footer line###07 02 2020 new variable +pdfgen#:#footer_html#:#Html +pdfgen#:#footer_line#:#Footer line pdfgen#:#footer_show_pages#:#Montrer les nombres de pages pdfgen#:#footer_text#:#Texte -pdfgen#:#footer_text_center#:#Text center###07 02 2020 new variable -pdfgen#:#footer_text_left#:#Text left###07 02 2020 new variable -pdfgen#:#footer_text_right#:#Text right###07 02 2020 new variable +pdfgen#:#footer_text_center#:#Text center +pdfgen#:#footer_text_left#:#Text left +pdfgen#:#footer_text_right#:#Text right pdfgen#:#footer_type#:#Bas de page -pdfgen#:#greyscale#:#Greyscale###07 02 2020 new variable -pdfgen#:#greyscale_info#:#PDF will be generated in grayscale###07 02 2020 new variable +pdfgen#:#greyscale#:#Greyscale +pdfgen#:#greyscale_info#:#PDF will be generated in grayscale pdfgen#:#head_text#:#Texte pdfgen#:#header_height#:#Hauteur de l’en-tête -pdfgen#:#header_line#:#Header line###07 02 2020 new variable +pdfgen#:#header_line#:#Header line pdfgen#:#header_show_pages#:#Montrer les nombres de pages -pdfgen#:#header_text_center#:#Text center###07 02 2020 new variable -pdfgen#:#header_text_left#:#Text left###07 02 2020 new variable -pdfgen#:#header_text_right#:#Text right###07 02 2020 new variable +pdfgen#:#header_text_center#:#Text center +pdfgen#:#header_text_left#:#Text left +pdfgen#:#header_text_right#:#Text right pdfgen#:#header_type#:#En-tête -pdfgen#:#html#:#Html###07 02 2020 new variable +pdfgen#:#html#:#Html pdfgen#:#image_scale#:#Échelle d’image pdfgen#:#javascript_delay#:#Délai Javascript pdfgen#:#javascript_delay_info#:#Si JavaScript est utilisé pour le rendu du contenu des pages, ajouter un délai pour s’assurer que le contenu apparaît dans le PDF. Le délai standard de 200ms devrait suffire dans la plupart des cas. -pdfgen#:#low_quality#:#Low quality###07 02 2020 new variable -pdfgen#:#low_quality_info#:#Generates lower quality pdf/ps. Useful to shrink the result document space###07 02 2020 new variable +pdfgen#:#low_quality#:#Low quality +pdfgen#:#low_quality_info#:#Generates lower quality pdf/ps. Useful to shrink the result document space pdfgen#:#margin#:#Margin pdfgen#:#margin_bottom#:#Marge en bas -pdfgen#:#margin_info#:#Margin in mm e.g. 10mm###07 02 2020 new variable +pdfgen#:#margin_info#:#Margin in mm e.g. 10mm pdfgen#:#margin_left#:#Marge à gauche pdfgen#:#margin_right#:#Marge à droite pdfgen#:#margin_top#:#Marge en haut -pdfgen#:#none#:#Keine###07 02 2020 new variable +pdfgen#:#none#:#Keine pdfgen#:#orientation#:#Orientation -pdfgen#:#output_options#:#Output options###07 02 2020 new variable -pdfgen#:#overwrite_font#:#Overwrite default font###07 02 2020 new variable -pdfgen#:#overwrite_font_info#:#Enter somthing similar to: 'serif', 'sans-serif', 'monospace' usw. ###07 02 2020 new variable +pdfgen#:#output_options#:#Output options +pdfgen#:#overwrite_font#:#Overwrite default font +pdfgen#:#overwrite_font_info#:#Enter somthing similar to: 'serif', 'sans-serif', 'monospace' usw. pdfgen#:#page_settings#:#Paramètres de la page pdfgen#:#page_size#:#Taille de page -pdfgen#:#path#:#Path to wkhtmltopdf###07 02 2020 new variable +pdfgen#:#path#:#Path to wkhtmltopdf pdfgen#:#preferred_renderer#:#Moteur de rendu préféré -pdfgen#:#print_media_info#:#Use print media-type instead of screen###07 02 2020 new variable +pdfgen#:#print_media_info#:#Use print media-type instead of screen pdfgen#:#print_media_type#:#Utiliser le type de média imprimé au lieu de l’écran pdfgen#:#problem_with_purposes#:#Un problème a été détecté dans la configuration. Veuillez utiliser le bouton «Nettoyage» pour résoudre ce problème. -pdfgen#:#radio_button_checked_svg#:#Path to checked radiobutton svg###07 02 2020 new variable -pdfgen#:#radio_button_svg#:#Path to radiobutton svg###07 02 2020 new variable +pdfgen#:#radio_button_checked_svg#:#Path to checked radiobutton svg +pdfgen#:#radio_button_svg#:#Path to radiobutton svg pdfgen#:#reset_to_default#:#Réinitialiser les paramètres par défaut pdfgen#:#selected_renderer#:#Moteur de rendu sélectionné -pdfgen#:#spacing#:#Spacing###07 02 2020 new variable +pdfgen#:#spacing#:#Spacing pdfgen#:#text#:#Texte -pdfgen#:#user_stylesheet#:#User stylesheet###07 02 2020 new variable +pdfgen#:#user_stylesheet#:#User stylesheet pdfgen#:#viewport#:#Vue pdfgen#:#viewport_info#:#Vue en pixels, par ex. «1920*1080» -pdfgen#:#webkit#:#wkhtmltopdf###07 02 2020 new variable -pdfgen#:#wkhtml_config#:#Configuration for WKHTML###07 02 2020 new variable +pdfgen#:#webkit#:#wkhtmltopdf +pdfgen#:#wkhtml_config#:#Configuration for WKHTML pdfgen#:#zoom#:#Zoom poll#:#poll_absolute#:#Votes Actuels poll#:#poll_activation_online_info#:#Lorsque hors-ligne, seuls les administrateurs peuvent voir et éditer le vote. @@ -12564,154 +12566,154 @@ poll#:#poll_voting_period_and_results#:#Période de Vote et Résultats poll#:#poll_voting_period_full_info#:#Période de vote de %s à %s poll#:#poll_voting_period_info#:#Date limite de vote : %s poll#:#poll_voting_period_limited#:#Limité -prg#:#access_ctr_by_orgu_position#:#Access control according to Organisational Unit Positions###07 02 2020 new variable -prg#:#active_only#:#active users only###31 03 2023 new variable -prg#:#add_automembership_source#:#Add Source###07 02 2020 new variable -prg#:#add_category#:#Add Category###07 02 2020 new variable -prg#:#assignment_date#:#Assignment Date###07 02 2020 new variable -prg#:#assignments#:#Assignments###24 09 2021 new variable -prg#:#auto_add_success#:#Add automatism successfully.###30 04 2021 new variable -prg#:#auto_membership_description#:#Rules are only executed when a criterion gets fulfilled after activation of the rule. Deleting rules will not remove assignments if any other active criterion is fulfilled by that time.###24 09 2021 new variable -prg#:#auto_membership_src_type#:#Type###07 02 2020 new variable -prg#:#auto_membership_title#:#Sources for Membership Automation###07 02 2020 new variable -prg#:#auto_memberships#:#Membership Automation###07 02 2020 new variable -prg#:#category#:#Category###07 02 2020 new variable -prg#:#completion_date#:#Completion Date###07 02 2020 new variable -prg#:#confirm_to_remove_selected_assignments#:#Do you really want to remove the user assignment(s)?###24 09 2021 new variable -prg#:#content_automation#:#Content Automation###07 02 2020 new variable -prg#:#content_automation_title#:#Automatically add and remove Courses from these categories###07 02 2020 new variable -prg#:#could_not_add_users_no_permissons#:#Could not assign %d Users due to lacking permissions.###07 02 2020 new variable -prg#:#crs_affiliation_to_prg#:#Affiliation to study programmes###31 03 2023 new variable -prg#:#deadline_information#:#Information regarding processing period###07 02 2020 new variable -prg#:#deadline_updated#:#Updated deadline###24 09 2021 new variable -prg#:#edit_participants#:#Edit Members###07 02 2020 new variable -prg#:#error_updating_deadline#:#Error during updating deadline.###07 02 2020 new variable -prg#:#error_updating_expire_date#:#Error during updating expire date.###07 02 2020 new variable +prg#:#access_ctr_by_orgu_position#:#Access control according to Organisational Unit Positions +prg#:#active_only#:#active users only###31 10 2023 new variable +prg#:#add_automembership_source#:#Add Source +prg#:#add_category#:#Add Category +prg#:#assignment_date#:#Assignment Date +prg#:#assignments#:#Assignments +prg#:#auto_add_success#:#Add automatism successfully. +prg#:#auto_membership_description#:#Rules are only executed when a criterion gets fulfilled after activation of the rule. Deleting rules will not remove assignments if any other active criterion is fulfilled by that time. +prg#:#auto_membership_src_type#:#Type +prg#:#auto_membership_title#:#Sources for Membership Automation +prg#:#auto_memberships#:#Membership Automation +prg#:#category#:#Category +prg#:#completion_date#:#Completion Date +prg#:#confirm_to_remove_selected_assignments#:#Do you really want to remove the user assignment(s)? +prg#:#content_automation#:#Content Automation +prg#:#content_automation_title#:#Automatically add and remove Courses from these categories +prg#:#could_not_add_users_no_permissons#:#Could not assign %d Users due to lacking permissions. +prg#:#crs_affiliation_to_prg#:#Affiliation to study programmes###31 10 2023 new variable +prg#:#deadline_information#:#Information regarding processing period +prg#:#deadline_updated#:#Updated deadline +prg#:#edit_participants#:#Edit Members +prg#:#error_updating_deadline#:#Error during updating deadline. +prg#:#error_updating_expire_date#:#Error during updating expire date. prg#:#form_msg_file_wrong_file_type#:#Mauvais type de fichier. -prg#:#header_update_current_plan#:#Do you really want to reset all individual settings for the selected assignments?###31 03 2023 new variable -prg#:#inactive_only#:#inactive users only###31 03 2023 new variable -prg#:#info_to_re_assign_mail_body#:#%s %s,

The validity of their participation in the study programm '% s' expires soon. Please sign in again.###07 02 2020 new variable -prg#:#info_to_re_assign_mail_subject#:#Reminder of renewed participation in the study programm###07 02 2020 new variable -prg#:#invalidated#:#validity###31 03 2023 new variable -prg#:#label_crs#:#Course Name###07 02 2020 new variable -prg#:#label_grp#:#Group Name###07 02 2020 new variable -prg#:#label_role#:#Role Name###07 02 2020 new variable -prg#:#last_edited#:#Last edited###07 02 2020 new variable -prg#:#last_edited_by#:#Last Editor###07 02 2020 new variable -prg#:#mail_assignments#:#Mail to assigned Users###24 09 2021 new variable -prg#:#manage_assignments#:#Manage Assignments###24 09 2021 new variable -prg#:#membership_source_id#:#Id###07 02 2020 new variable -prg#:#membership_source_id_byline_objid#:#Please use the object-id###07 02 2020 new variable -prg#:#membership_source_id_byline_refid#:#Please use the reference-id###07 02 2020 new variable -prg#:#membership_source_type#:#Source###07 02 2020 new variable -prg#:#modal_automembership_title#:#Automatismus hinzufügen###07 02 2020 new variable -prg#:#modal_categories_title#:#Category to be monitored###07 02 2020 new variable -prg#:#modal_member_auto_select_title#:#Select Source for auto assignment###07 02 2020 new variable -prg#:#msg_change_deadline_date#:#Updated deadline for %s users.###24 09 2021 new variable -prg#:#msg_change_deadline_date_failed#:#Deadline not updated for:###24 09 2021 new variable -prg#:#msg_change_expire_date#:#Updated expire date for %s users.###24 09 2021 new variable -prg#:#msg_change_expire_date_failed#:#Expire date not updated for:###24 09 2021 new variable -prg#:#msg_fill_required#:#Please fill all required fields.###30 04 2021 new variable -prg#:#msg_impossible_target_status#:#Impossible target status###24 09 2021 new variable -prg#:#msg_mark_accredited#:#%s users successfully marked accredited###24 09 2021 new variable -prg#:#msg_mark_accredited_failed#:#Not marked accredited:###24 09 2021 new variable -prg#:#msg_mark_not_relevant#:#%s users successfully unmarked relevant###24 09 2021 new variable -prg#:#msg_mark_not_relevant_failed#:#Not unmarked relevant:###24 09 2021 new variable -prg#:#msg_mark_relevant#:#%s users successfully marked relevant###24 09 2021 new variable -prg#:#msg_mark_relevant_failed#:#Not marked marked relevant:###24 09 2021 new variable -prg#:#msg_points_must_be_positive#:#Only positive numbers are allowed.###24 09 2021 new variable -prg#:#msg_unmark_accredited#:#Unmarked %s users accredited.###24 09 2021 new variable -prg#:#msg_unmark_accredited_failed#:#Unmarking accredited not successful for:###24 09 2021 new variable -prg#:#msg_update_from_settings#:#Updated %s users from settings:###24 09 2021 new variable -prg#:#msg_update_from_settings_failed#:#Updated from settings failed:###24 09 2021 new variable -prg#:#msg_update_individual_plan#:#Successfully updated individual plan (%)###24 09 2021 new variable -prg#:#msg_update_individual_plan_failed#:#Update of individual plan failed###24 09 2021 new variable -prg#:#no_srctype_or_id#:#Id and type may not be empty.###30 04 2021 new variable -prg#:#not_a_valid_cat_id#:#%s is not a valid ref-id of a category.###07 02 2020 new variable -prg#:#obj_prg_select#:#-- Please select a study programme --###31 03 2023 new variable -prg#:#optgrp_label_restart#:#Restart###31 03 2023 new variable -prg#:#optgrp_label_validity#:#Expiry###31 03 2023 new variable -prg#:#orgu#:#Organisational Unit###07 02 2020 new variable -prg#:#percentage#:#%###07 02 2020 new variable -prg#:#prg_access_by_orgu#:#Access Control by Organisation Unit Positions###30 04 2021 new variable -prg#:#prg_access_by_orgu_byline#:#If enabled, additional access control rules can be defined by positions in organisational units.###30 04 2021 new variable +prg#:#header_update_current_plan#:#Do you really want to reset all individual settings for the selected assignments?###31 10 2023 new variable +prg#:#inactive_only#:#inactive users only###31 10 2023 new variable +prg#:#info_to_re_assign_mail_body#:#%s %s,

The validity of their participation in the study programm '% s' expires soon. Please sign in again. +prg#:#info_to_re_assign_mail_subject#:#Reminder of renewed participation in the study programm +prg#:#invalidated#:#validity###31 10 2023 new variable +prg#:#label_crs#:#Course Name +prg#:#label_grp#:#Group Name +prg#:#label_role#:#Role Name +prg#:#last_edited#:#Last edited +prg#:#last_edited_by#:#Last Editor +prg#:#mail_assignments#:#Mail to assigned Users +prg#:#manage_assignments#:#Manage Assignments +prg#:#membership_source_id#:#Id +prg#:#membership_source_id_byline_objid#:#Please use the object-id +prg#:#membership_source_id_byline_refid#:#Please use the reference-id +prg#:#membership_source_type#:#Source +prg#:#modal_automembership_title#:#Automatismus hinzufügen +prg#:#modal_categories_title#:#Category to be monitored +prg#:#modal_member_auto_select_title#:#Select Source for auto assignment +prg#:#msg_change_deadline_date#:#Updated deadline for %s users. +prg#:#msg_change_deadline_date_failed#:#Deadline not updated for: +prg#:#msg_change_expire_date#:#Updated expire date for %s users. +prg#:#msg_change_expire_date_failed#:#Expire date not updated for: +prg#:#msg_fill_required#:#Please fill all required fields. +prg#:#msg_impossible_target_status#:#Impossible target status +prg#:#msg_mark_accredited#:#%s users successfully marked accredited +prg#:#msg_mark_accredited_failed#:#Not marked accredited: +prg#:#msg_mark_not_relevant#:#%s users successfully unmarked relevant +prg#:#msg_mark_not_relevant_failed#:#Not unmarked relevant: +prg#:#msg_mark_relevant#:#%s users successfully marked relevant +prg#:#msg_mark_relevant_failed#:#Not marked marked relevant: +prg#:#msg_points_must_be_positive#:#Only positive numbers are allowed. +prg#:#msg_unmark_accredited#:#Unmarked %s users accredited. +prg#:#msg_unmark_accredited_failed#:#Unmarking accredited not successful for: +prg#:#msg_update_from_settings#:#Updated %s users from settings: +prg#:#msg_update_from_settings_failed#:#Updated from settings failed: +prg#:#msg_update_individual_plan#:#Successfully updated individual plan (%) +prg#:#msg_update_individual_plan_failed#:#Update of individual plan failed +prg#:#no_srctype_or_id#:#Id and type may not be empty. +prg#:#not_a_valid_cat_id#:#%s is not a valid ref-id of a category. +prg#:#obj_prg_select#:#-- Please select a study programme --###31 10 2023 new variable +prg#:#optgrp_label_restart#:#Restart###31 10 2023 new variable +prg#:#optgrp_label_validity#:#Expiry###31 10 2023 new variable +prg#:#orgu#:#Organisational Unit +prg#:#percentage#:#% +prg#:#prg_access_by_orgu#:#Access Control by Organisation Unit Positions +prg#:#prg_access_by_orgu_byline#:#If enabled, additional access control rules can be defined by positions in organisational units. prg#:#prg_acknowledge_completed_courses#:#Reconnaître les cours complétés prg#:#prg_add#:#Ajouter un programme d’étude prg#:#prg_added_course_ref_successful#:#New course-reference was added successfully prg#:#prg_added_member#:#Le nouveau membre a été ajouté avec succès. prg#:#prg_added_members#:#Les nouveaux membres ont été ajoutés avec succès. -prg#:#prg_additional_settings#:#Additional Features###30 04 2021 new variable +prg#:#prg_additional_settings#:#Additional Features prg#:#prg_assessment#:#Évaluation du programme d’étude prg#:#prg_assign_date#:#Date de la tâche prg#:#prg_assigned_by#:#Affectée par prg#:#prg_async_create#:#Ajouter une nouvelle structure de sous-dossiers prg#:#prg_async_settings#:#Paramètres -prg#:#prg_auto_member_select_crs#:#Courses###07 02 2020 new variable -prg#:#prg_auto_member_select_grp#:#Groups###07 02 2020 new variable -prg#:#prg_auto_member_select_role#:#Roles###07 02 2020 new variable -prg#:#prg_autoassignment#:#(auto)###07 02 2020 new variable +prg#:#prg_auto_member_select_crs#:#Courses +prg#:#prg_auto_member_select_grp#:#Groups +prg#:#prg_auto_member_select_role#:#Roles +prg#:#prg_autoassignment#:#(auto) prg#:#prg_belongs_to#:#Appartient à prg#:#prg_can_not_manage_in_repo#:#Vous n’êtes pas autorisé à gérer ce programme d’étude en raison des affectations d’utilisateurs. -prg#:#prg_cancel#:#Cancel###30 04 2021 new variable +prg#:#prg_cancel#:#Cancel prg#:#prg_cancel_tree_order#:#Rejeter l’ordre arborescent -prg#:#prg_change_deadline#:#Change deadline###28 07 2023 new variable -prg#:#prg_change_expire_date#:#Change expire date###28 07 2023 new variable +prg#:#prg_change_deadline#:#Change deadline###31 10 2023 new variable +prg#:#prg_change_expire_date#:#Change expire date###31 10 2023 new variable prg#:#prg_changed_by#:#Modifiée par -prg#:#prg_completed_by_subnodes#:#subprogrammes###31 03 2023 new variable +prg#:#prg_completed_by_subnodes#:#subprogrammes###31 10 2023 new variable prg#:#prg_completion_by#:#Complétée par -prg#:#prg_completion_date#:#Completion date###07 02 2020 new variable -prg#:#prg_confirm_delete#:#Delete###30 04 2021 new variable -prg#:#prg_copy_threads_info#:#Please decide which Study Programme elements are to be copied, linked or omitted.###31 03 2023 new variable +prg#:#prg_completion_date#:#Completion date +prg#:#prg_confirm_delete#:#Delete +prg#:#prg_copy_threads_info#:#Please decide which Study Programme elements are to be copied, linked or omitted.###31 10 2023 new variable prg#:#prg_create_new_leaf#:#Créer une nouvelle feuille prg#:#prg_create_new_node#:#Créer un nouveau nœud -prg#:#prg_cron_job_configuration#:#Configuration automatic Mails###07 02 2020 new variable +prg#:#prg_cron_job_configuration#:#Configuration automatic Mails prg#:#prg_custom_plan#:#Plan personnalisé -prg#:#prg_dash_label_finish_until#:#Finish until:###07 02 2020 new variable -prg#:#prg_dash_label_gain#:#Current Completion:###07 02 2020 new variable -prg#:#prg_dash_label_minimum#:#Minimum Completion:###07 02 2020 new variable -prg#:#prg_dash_label_restart_from#:#Restart from:###07 02 2020 new variable -prg#:#prg_dash_label_status#:#Status:###07 02 2020 new variable -prg#:#prg_dash_label_unreachable#:#- cannot be achieved###31 03 2023 new variable -prg#:#prg_dash_label_valid#:#Valid:###07 02 2020 new variable +prg#:#prg_dash_label_finish_until#:#Finish until: +prg#:#prg_dash_label_gain#:#Current Completion: +prg#:#prg_dash_label_minimum#:#Minimum Completion: +prg#:#prg_dash_label_restart_from#:#Restart from: +prg#:#prg_dash_label_status#:#Status: +prg#:#prg_dash_label_unreachable#:#- cannot be achieved###31 10 2023 new variable +prg#:#prg_dash_label_valid#:#Valid: prg#:#prg_deadline#:#Délai -prg#:#prg_deadline_date#:#Processing time expires at fixed date###07 02 2020 new variable -prg#:#prg_deadline_date_desc#:#The programme must be finished until a given date.###07 02 2020 new variable -prg#:#prg_deadline_date_label#:#Process until###31 03 2023 new variable -prg#:#prg_deadline_period#:#Processing time is determined inividually###07 02 2020 new variable -prg#:#prg_deadline_period_desc#:#The programme must be finished within a given timespan.###07 02 2020 new variable -prg#:#prg_deadline_period_label#:#Days after assignment###31 03 2023 new variable -prg#:#prg_deadline_settings#:#Processing Period###07 02 2020 new variable -prg#:#prg_delete_confirmation#:#Do you really want to delete the selected entries?###30 04 2021 new variable -prg#:#prg_delete_failure#:#Delete failed.###30 04 2021 new variable -prg#:#prg_delete_nothing_selected#:#Please select at least one entry to delete.###30 04 2021 new variable -prg#:#prg_delete_single_confirmation#:#Do you really want to delete the selected entry?###30 04 2021 new variable -prg#:#prg_delete_single_success#:#Successfuly delete entry.###30 04 2021 new variable -prg#:#prg_delete_success#:#Successfuly delete entries.###30 04 2021 new variable +prg#:#prg_deadline_date#:#Processing time expires at fixed date +prg#:#prg_deadline_date_desc#:#The programme must be finished until a given date. +prg#:#prg_deadline_date_label#:#Process until###31 10 2023 new variable +prg#:#prg_deadline_period#:#Processing time is determined inividually +prg#:#prg_deadline_period_desc#:#The programme must be finished within a given timespan. +prg#:#prg_deadline_period_label#:#Days after assignment###31 10 2023 new variable +prg#:#prg_deadline_settings#:#Processing Period +prg#:#prg_delete_confirmation#:#Do you really want to delete the selected entries? +prg#:#prg_delete_failure#:#Delete failed. +prg#:#prg_delete_nothing_selected#:#Please select at least one entry to delete. +prg#:#prg_delete_single_confirmation#:#Do you really want to delete the selected entry? +prg#:#prg_delete_single_success#:#Successfuly delete entry. +prg#:#prg_delete_success#:#Successfuly delete entries. prg#:#prg_deleted_safely#:#Le nœud a été supprimé en toute sécurité -prg#:#prg_description#:#Description###30 04 2021 new variable +prg#:#prg_description#:#Description prg#:#prg_edit#:#Éditer un programme d’étude -prg#:#prg_expiry_date#:#Expiry date###07 02 2020 new variable -prg#:#prg_formatted_period#:#%d days###07 02 2020 new variable -prg#:#prg_invalidate_expired_progresses_desc#:#Marks expired progresses at Studyprogrammes as 'not passed'###07 02 2020 new variable -prg#:#prg_invalidate_expired_progresses_title#:#Limited validity of Studyprogramme progress###07 02 2020 new variable -prg#:#prg_link#:#Link###30 04 2021 new variable -prg#:#prg_mail_context_info#:#For the participant e-mails on the member and learning progress screens of a study programme###30 04 2021 new variable -prg#:#prg_mail_context_title#:#Study Programme: Mail to Members###30 04 2021 new variable -prg#:#prg_mail_permanent_link#:#Click on the following link to find all of the information you need regarding the study programm:###07 02 2020 new variable +prg#:#prg_expiry_date#:#Expiry date +prg#:#prg_formatted_period#:#%d days +prg#:#prg_invalidate_expired_progresses_desc#:#Marks expired progresses at Studyprogrammes as 'not passed' +prg#:#prg_invalidate_expired_progresses_title#:#Limited validity of Studyprogramme progress +prg#:#prg_link#:#Link +prg#:#prg_mail_context_info#:#For the participant e-mails on the member and learning progress screens of a study programme +prg#:#prg_mail_context_title#:#Study Programme: Mail to Members +prg#:#prg_mail_permanent_link#:#Click on the following link to find all of the information you need regarding the study programm: prg#:#prg_manage#:#Gérer -prg#:#prg_manage_members#:#Manage Enrolments of Study Programme###31 03 2023 new variable -prg#:#prg_manage_members_short#:#Manage Assignments###24 09 2021 new variable +prg#:#prg_manage_members#:#Manage Enrolments of Study Programme###31 10 2023 new variable +prg#:#prg_manage_members_short#:#Manage Assignments prg#:#prg_manual_status#:#Statut manuel prg#:#prg_mark_accredited#:#Marquer comme accrédité prg#:#prg_mark_accredited_multi_success#:#Marquer les utilisateurs sélectionnés comme accrédités prg#:#prg_mark_accredited_success#:#Nœud de programme accrédité pour l’utilisateur avec succès. prg#:#prg_mark_not_relevant_multi_success#:#Ne plus marquer les utilisateurs sélectionnés comme pertinents -prg#:#prg_mark_relevant#:#Mark Relevant###28 07 2023 new variable +prg#:#prg_mark_relevant#:#Mark Relevant###31 10 2023 new variable prg#:#prg_mark_relevant_multi_success#:#Marquer les utilisateurs sélectionnés comme pertinents prg#:#prg_more_objects_without_read_permission#:#Le programme d’étude contient plus d’objets que vous ne pouvez pas voir car vous avez moins de permissions. -prg#:#prg_multi_change_deadline#:#Change deadline###07 02 2020 new variable -prg#:#prg_multi_change_expire_date#:#Change expire date###07 02 2020 new variable -prg#:#prg_multi_mail_user#:#Send Mail###31 03 2023 new variable +prg#:#prg_multi_change_deadline#:#Change deadline +prg#:#prg_multi_change_expire_date#:#Change expire date +prg#:#prg_multi_mail_user#:#Send Mail###31 10 2023 new variable prg#:#prg_multi_mark_accredited#:#Approuvé prg#:#prg_multi_mark_relevant#:#Marquer comme pertinents prg#:#prg_multi_remove_user#:#Supprimer utilisateur @@ -12719,74 +12721,74 @@ prg#:#prg_multi_unmark_accredited#:#Ne plus marquer comme approuvé prg#:#prg_multi_unmark_relevant#:#Ne plus marquer comme pertinents prg#:#prg_multi_update_from_current_plan#:#Mise à jour depuis le plan actuel prg#:#prg_new#:#Nouveau programme d’étude -prg#:#prg_no_deadline#:#No fixed prozessing time###07 02 2020 new variable +prg#:#prg_no_deadline#:#No fixed prozessing time prg#:#prg_no_members_not_active#:#Impossible d’ajouter des membres car ce programme n’est pas actif. -prg#:#prg_no_restart#:#No restart required###07 02 2020 new variable +prg#:#prg_no_restart#:#No restart required prg#:#prg_no_user_selected#:#Aucun utilisateur sélectionné -prg#:#prg_no_validity_qualification#:#Long-Lasting qualification###30 04 2021 new variable +prg#:#prg_no_validity_qualification#:#Long-Lasting qualification prg#:#prg_not_allowed_node_to_delete#:#Vous n’êtes pas autorisé à supprimer ce nœud -prg#:#prg_not_valid#:#not valid###07 02 2020 new variable +prg#:#prg_not_valid#:#not valid prg#:#prg_open_node#:#Passer sur ce mode -prg#:#prg_orgus#:#Organisational Units###07 02 2020 new variable +prg#:#prg_orgus#:#Organisational Units prg#:#prg_please_select_a_course_for_creating_a_leaf#:#Please select a course for creating a course-reference leaf prg#:#prg_points#:#Points -prg#:#prg_points_byline#:#Students get a certain amount of points when they succeed in this programme and need to get this many points in subsequent programmes.###30 04 2021 new variable +prg#:#prg_points_byline#:#Students get a certain amount of points when they succeed in this programme and need to get this many points in subsequent programmes. prg#:#prg_points_current#:#Points actuels prg#:#prg_points_reachable#:#Points à obtenir prg#:#prg_points_required#:#Points requis prg#:#prg_possible#:#Possible prg#:#prg_prg_type#:#Type de Programme d'Etude -prg#:#prg_processing_ends_no_success#:#Reminder mail failing###07 02 2020 new variable -prg#:#prg_processing_ends_no_success_info#:#Reminds the user x days before the program expires that he is at risk of failing.###07 02 2020 new variable -prg#:#prg_profile_not_public#:#Profile of the user is not public.###30 04 2021 new variable +prg#:#prg_processing_ends_no_success#:#Reminder mail failing +prg#:#prg_processing_ends_no_success_info#:#Reminds the user x days before the program expires that he is at risk of failing. +prg#:#prg_profile_not_public#:#Profile of the user is not public. prg#:#prg_progress_info#:#Vous avez %1$d points. Le programme d'étude est complété par %2$d points. prg#:#prg_progress_status#:# %1$d sur %2$d points prg#:#prg_progress_status_with_child_sp#:# %1$d of %2$d Points -prg#:#prg_quali_not_valid#:#Qualification not valid###07 02 2020 new variable -prg#:#prg_quali_still_valid#:#Qualification still valid###07 02 2020 new variable +prg#:#prg_quali_not_valid#:#Qualification not valid +prg#:#prg_quali_still_valid#:#Qualification still valid prg#:#prg_remove_user#:#Supprimer utilisateur prg#:#prg_remove_user_success#:#Utilisateur retiré avec succès. prg#:#prg_remove_users_not_possible#:#Impossible de retirer les utilisateurs sélectionnés -prg#:#prg_remove_users_partial_success#:#Assignments (partially) removed.###31 03 2023 new variable +prg#:#prg_remove_users_partial_success#:#Assignments (partially) removed.###31 10 2023 new variable prg#:#prg_remove_users_partitial_success#:#Retirer les utilisateurs sélectionnés partiellement prg#:#prg_remove_users_success#:#Retirer les utilisateurs sélectionnés -prg#:#prg_restart_assignments_temporal_progress_desc#:#Restart Studyprogramme assignments with progresses about to expire###07 02 2020 new variable -prg#:#prg_restart_assignments_temporal_progress_title#:#Restart Studyprogramme assignments###07 02 2020 new variable +prg#:#prg_restart_assignments_temporal_progress_desc#:#Restart Studyprogramme assignments with progresses about to expire +prg#:#prg_restart_assignments_temporal_progress_title#:#Restart Studyprogramme assignments prg#:#prg_save_tree_order#:#Sauvegarder l’ordre arborescent prg#:#prg_saved_order_successful#:#Ordre sauvegardé avec succès prg#:#prg_show_individual_plan#:#Montrer plan individuel prg#:#prg_show_programmes#:#Visibilité prg#:#prg_show_programmes_on_pd_always#:#Les programmes d'études sont toujours visibles sur le Bureau Personnel. prg#:#prg_show_programmes_on_pd_only_read#:#Les Programmes d'Etudes ne sont visibles sur Bureau Personnel qu'avec les autorisations 'lire'. -prg#:#prg_some_users_may_not_be_accredited#:#Partially marked users accredited.###07 02 2020 new variable -prg#:#prg_some_users_may_not_be_marked_not_relevant#:#Partially unmarked relevant.###07 02 2020 new variable -prg#:#prg_some_users_may_not_be_marked_relevant#:#Partially marked relevant.###07 02 2020 new variable -prg#:#prg_some_users_may_not_be_unmarked_accredited#:#Partially unmarked users accredited.###07 02 2020 new variable +prg#:#prg_some_users_may_not_be_accredited#:#Partially marked users accredited. +prg#:#prg_some_users_may_not_be_marked_not_relevant#:#Partially unmarked relevant. +prg#:#prg_some_users_may_not_be_marked_relevant#:#Partially marked relevant. +prg#:#prg_some_users_may_not_be_unmarked_accredited#:#Partially unmarked users accredited. prg#:#prg_status#:#Statut -prg#:#prg_status_1#:#In Progress###07 02 2020 new variable -prg#:#prg_status_2#:#Completed###07 02 2020 new variable -prg#:#prg_status_3#:#Accredited###07 02 2020 new variable -prg#:#prg_status_4#:#Not Relevant###07 02 2020 new variable -prg#:#prg_status_5#:#failed###07 02 2020 new variable +prg#:#prg_status_1#:#In Progress +prg#:#prg_status_2#:#Completed +prg#:#prg_status_3#:#Accredited +prg#:#prg_status_4#:#Not Relevant +prg#:#prg_status_5#:#failed prg#:#prg_status_accredited#:#Accrédité prg#:#prg_status_active#:#Actif -prg#:#prg_status_byline#:#Use the status to control if this programme is assigned to students.###30 04 2021 new variable +prg#:#prg_status_byline#:#Use the status to control if this programme is assigned to students. prg#:#prg_status_completed#:#Complétée prg#:#prg_status_draft#:#Brouillon prg#:#prg_status_failed#:#échec -prg#:#prg_status_hide_irrelevant#:#hide irrelevant###31 03 2023 new variable +prg#:#prg_status_hide_irrelevant#:#hide irrelevant###31 10 2023 new variable prg#:#prg_status_in_progress#:#En cours prg#:#prg_status_not_relevant#:#Non pertinente prg#:#prg_status_outdated#:#Obsolète -prg#:#prg_still_valid#:#still valid###07 02 2020 new variable +prg#:#prg_still_valid#:#still valid prg#:#prg_subtype_add#:#Ajouter un nouveau type prg#:#prg_subtypes#:#Types -prg#:#prg_title#:#Title###07 02 2020 new variable +prg#:#prg_title#:#Title prg#:#prg_type#:#Type de Programme d'Etude prg#:#prg_type_add#:#Type de Programme d'Etude prg#:#prg_type_assign_amd_sets#:#Assigner des jeux de métadonnées avancées prg#:#prg_type_available_amd_sets#:#Jeux de métadonnées avancées disponibles -prg#:#prg_type_byline#:#Set a type to use certain custom metadata sets or icons.###30 04 2021 new variable +prg#:#prg_type_byline#:#Set a type to use certain custom metadata sets or icons. prg#:#prg_type_custom_icon#:#Icônes Personnalisées prg#:#prg_type_custom_icon_info#:#Personnaliser les informations d’icône prg#:#prg_type_edit#:#Éditer sous-type @@ -12798,86 +12800,86 @@ prg#:#prg_type_msg_unable_delete#:#Impossible de supprimer l'objet car il est to prg#:#prg_unmark_accredited#:#Ne plus marquer comme accrédité prg#:#prg_unmark_accredited_multi_success#:#Ne plus marquer les utilisateurs sélectionnés comme accrédités prg#:#prg_unmark_accredited_success#:#Nœud de programme non accrédité pour l'utilisateur avec succès. -prg#:#prg_unmark_relevant#:#Unmark Relevant###28 07 2023 new variable +prg#:#prg_unmark_relevant#:#Unmark Relevant###31 10 2023 new variable prg#:#prg_update_from_current_plan#:#Mise à jour du plan actuel prg#:#prg_update_from_current_plan_not_possible#:#Mise à jour depuis le plan actuel impossible prg#:#prg_update_from_current_plan_partitial_success#:#Mise à jour depuis le plan actuel partielle prg#:#prg_update_from_current_plan_success#:#Mise à jour depuis le plan actuel prg#:#prg_update_from_plan_successful#:#Mis à jour depuis le plan actuel avec succès! -prg#:#prg_update_progress_description#:#Set Progress from 'In Progress' to 'failed' after crossing Deadline.###30 04 2021 new variable -prg#:#prg_update_progress_title#:#Set Progress to Failed after Deadline###30 04 2021 new variable +prg#:#prg_update_progress_description#:#Set Progress from 'In Progress' to 'failed' after crossing Deadline. +prg#:#prg_update_progress_title#:#Set Progress to Failed after Deadline prg#:#prg_update_successful#:#Changements Enregistrés avec succès ! -prg#:#prg_user_not_restarted_desc#:#Sends users a warning mail if a qualification at a study programme expires and they haven't restarted the program yet.###07 02 2020 new variable -prg#:#prg_user_not_restarted_time_input#:#Reminder mail restart###07 02 2020 new variable -prg#:#prg_user_not_restarted_time_input_info#:#Reminder Mail Reminds the user x days before the invalidation that he must restart the programm.###07 02 2020 new variable -prg#:#prg_user_not_restarted_title#:#Send warning mail about restart###07 02 2020 new variable -prg#:#prg_user_risky_to_fail_desc#:#Sends users a warning mail if they are at the risk to fail a study programme due to a deadline.###07 02 2020 new variable -prg#:#prg_user_risky_to_fail_title#:#Send warning mail about possible failure###07 02 2020 new variable -prg#:#prg_validity#:#Validity###07 02 2020 new variable -prg#:#prg_validity_of_qualification#:#Validity of Achieved Qualifications###07 02 2020 new variable -prg#:#prg_validity_of_qualification_limit#:#Qualification Expiry###07 02 2020 new variable -prg#:#prg_validity_of_qualification_restart#:#Restart###07 02 2020 new variable +prg#:#prg_user_not_restarted_desc#:#Sends users a warning mail if a qualification at a study programme expires and they haven't restarted the program yet. +prg#:#prg_user_not_restarted_time_input#:#Reminder mail restart +prg#:#prg_user_not_restarted_time_input_info#:#Reminder Mail Reminds the user x days before the invalidation that he must restart the programm. +prg#:#prg_user_not_restarted_title#:#Send warning mail about restart +prg#:#prg_user_risky_to_fail_desc#:#Sends users a warning mail if they are at the risk to fail a study programme due to a deadline. +prg#:#prg_user_risky_to_fail_title#:#Send warning mail about possible failure +prg#:#prg_validity#:#Validity +prg#:#prg_validity_of_qualification#:#Validity of Achieved Qualifications +prg#:#prg_validity_of_qualification_limit#:#Qualification Expiry +prg#:#prg_validity_of_qualification_restart#:#Restart prg#:#prg_view#:#Vue -prg#:#prgr_may_not_create_circular_reference#:#This Study Programme may not be linked here since the parent object is alredy linked within the target.###07 02 2020 new variable -prg#:#re_assigned_mail_body#:#%s %s,

you were reassigned to study program '%s' as participants.###07 02 2020 new variable -prg#:#re_assigned_mail_subject#:#Renewed participation in the study programm###07 02 2020 new variable -prg#:#restart_information#:#Information regarding automatic restart upon pending qualification expiration###07 02 2020 new variable -prg#:#restart_period#:#Restart obligatory###07 02 2020 new variable -prg#:#restart_period_desc#:#days before expiry###07 02 2020 new variable -prg#:#restart_period_info#:#Days before qualification expiration to restart qualification###07 02 2020 new variable -prg#:#restart_period_label#:#Days before expiry###31 03 2023 new variable -prg#:#risky_to_fail_mail_body#:#%s %s,

the deadline for completing the study program '%s' will soon be reached.###30 04 2021 new variable -prg#:#risky_to_fail_mail_subject#:#Reminder, that the deadline for the study program will soon be reached###30 04 2021 new variable -prg#:#rol#:#Role###07 02 2020 new variable -prg#:#select_crs#:#Search for Courses###07 02 2020 new variable -prg#:#select_grp#:#Search for Groups###07 02 2020 new variable -prg#:#select_org#:#Search for Organisational Unit###07 02 2020 new variable -prg#:#select_role#:#Search for Roles###07 02 2020 new variable -prg#:#send_info_to_re_assign_mail#:#E-mail reminder restart###07 02 2020 new variable -prg#:#send_info_to_re_assign_mail_info#:#Send an e-mail to remind the user to restart the study program.###07 02 2020 new variable -prg#:#send_re_assigned_mail#:#E-mail renewed participation###07 02 2020 new variable -prg#:#send_re_assigned_mail_info#:#Send an e-mail to automatically re-join the sudy program.###07 02 2020 new variable -prg#:#send_risky_to_fail_mail#:#E-mail in case of failure###07 02 2020 new variable -prg#:#send_risky_to_fail_mail_info#:#Send an e-mail if the user is at risk of failure of the study program.###07 02 2020 new variable -prg#:#sp_certificate_completion_date#:#Date of completion###07 02 2020 new variable -prg#:#sp_certificate_description#:#Description of the Study Programme###07 02 2020 new variable -prg#:#sp_certificate_points#:#Amount of points that have been acquired###07 02 2020 new variable -prg#:#sp_certificate_progress_expires_at#:#Date of expiry of qualification###07 02 2020 new variable -prg#:#sp_certificate_title#:#Title of the Study Programme###07 02 2020 new variable -prg#:#sp_certificate_type#:#Type of the Study Programme###07 02 2020 new variable -prg#:#status_changed#:#Updated status###24 09 2021 new variable -prg#:#status_changed_due_to_deadline#:#Status changed according to deadline.###31 03 2023 new variable -prg#:#status_transition_not_allowed#:#Status change not allowed###24 09 2021 new variable -prg#:#status_unchanged#:#Status unchanged###24 09 2021 new variable -prg#:#update_deadline#:#Successfuly update deadline.###07 02 2020 new variable -prg#:#update_expire_date#:#Successfuly update expire date.###07 02 2020 new variable -prg#:#updated_from_settings#:#Updated from settings###24 09 2021 new variable -prg#:#usr_active#:#User###31 03 2023 new variable -prg#:#validity_qualification_date#:#Qualification expires at fixed date###30 04 2021 new variable -prg#:#validity_qualification_date_desc#:#expiry date###30 04 2021 new variable -prg#:#validity_qualification_period#:#Qualification expires individually###30 04 2021 new variable -prg#:#validity_qualification_period_desc#:#days after completion###30 04 2021 new variable -prg#:#validity_updated#:#Updated validity###24 09 2021 new variable -prg#:#vq_date#:#Expiration###31 03 2023 new variable -prg#:#vq_date_info#:#Qualification expires at fixed date###07 02 2020 new variable -prg#:#vq_date_label#:#Expiry date###31 03 2023 new variable -prg#:#vq_information#:#Information regarding validity of achived qualification###07 02 2020 new variable -prg#:#vq_period_info#:#Days until qualification will expire after achivement###07 02 2020 new variable -prg#:#vq_period_label#:#Days after completion###31 03 2023 new variable +prg#:#prgr_may_not_create_circular_reference#:#This Study 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 reassigned to study program '%s' as participants. +prg#:#re_assigned_mail_subject#:#Renewed participation in the study programm +prg#:#restart_information#:#Information regarding automatic restart upon pending qualification expiration +prg#:#restart_period#:#Restart obligatory +prg#:#restart_period_desc#:#days before expiry +prg#:#restart_period_info#:#Days before qualification expiration to restart qualification +prg#:#restart_period_label#:#Days before expiry###31 10 2023 new variable +prg#:#risky_to_fail_mail_body#:#%s %s,

the deadline for completing the study program '%s' will soon be reached. +prg#:#risky_to_fail_mail_subject#:#Reminder, that the deadline for the study program will soon be reached +prg#:#rol#:#Role +prg#:#select_crs#:#Search for Courses +prg#:#select_grp#:#Search for Groups +prg#:#select_org#:#Search for Organisational Unit +prg#:#select_role#:#Search for Roles +prg#:#send_info_to_re_assign_mail#:#E-mail reminder restart +prg#:#send_info_to_re_assign_mail_info#:#Send an e-mail to remind the user to restart the study program. +prg#:#send_re_assigned_mail#:#E-mail renewed participation +prg#:#send_re_assigned_mail_info#:#Send an e-mail to automatically re-join the sudy program. +prg#:#send_risky_to_fail_mail#:#E-mail in case of failure +prg#:#send_risky_to_fail_mail_info#:#Send an e-mail if the user is at risk of failure of the study program. +prg#:#sp_certificate_completion_date#:#Date of completion +prg#:#sp_certificate_description#:#Description of the Study Programme +prg#:#sp_certificate_points#:#Amount of points that have been acquired +prg#:#sp_certificate_progress_expires_at#:#Date of expiry of qualification +prg#:#sp_certificate_title#:#Title of the Study Programme +prg#:#sp_certificate_type#:#Type of the Study Programme +prg#:#status_changed#:#Updated status +prg#:#status_changed_due_to_deadline#:#Status changed according to deadline.###31 10 2023 new variable +prg#:#status_transition_not_allowed#:#Status change not allowed +prg#:#status_unchanged#:#Status unchanged +prg#:#update_deadline#:#Successfuly update deadline. +prg#:#update_expire_date#:#Successfuly update expire date. +prg#:#updated_from_settings#:#Updated from settings +prg#:#usr_active#:#User###31 10 2023 new variable +prg#:#validity_qualification_date#:#Qualification expires at fixed date +prg#:#validity_qualification_date_desc#:#expiry date +prg#:#validity_qualification_period#:#Qualification expires individually +prg#:#validity_qualification_period_desc#:#days after completion +prg#:#validity_updated#:#Updated validity +prg#:#vq_date#:#Expiration###31 10 2023 new variable +prg#:#vq_date_info#:#Qualification expires at fixed date +prg#:#vq_date_label#:#Expiry date###31 10 2023 new variable +prg#:#vq_information#:#Information regarding validity of achived qualification +prg#:#vq_period_info#:#Days until qualification will expire after achivement +prg#:#vq_period_label#:#Days after completion###31 10 2023 new variable prg#:#warning#:#Attention! -prg#:#will_not_modify_deadline_on_successful_progress#:#No change because already completed or marked accredited###24 09 2021 new variable -prg#:#will_not_modify_irrelevant_progress#:#No change because not relevant###24 09 2021 new variable -prg#:#will_not_modify_relevant_progress#:#already relevant###24 09 2021 new variable -prg#:#will_not_modify_validity_on_non_successful_progress#:#Can change only when successful###24 09 2021 new variable -prg#:#will_not_set_top_progress_to_irrelevant#:#Cannot change top node to irrelevant.###24 09 2021 new variable +prg#:#will_not_modify_deadline_on_successful_progress#:#No change because already completed or marked accredited +prg#:#will_not_modify_irrelevant_progress#:#No change because not relevant +prg#:#will_not_modify_relevant_progress#:#already relevant +prg#:#will_not_modify_validity_on_non_successful_progress#:#Can change only when successful +prg#:#will_not_set_top_progress_to_irrelevant#:#Cannot change top node to irrelevant. prtf#:#pdf_export#:#Exporter PDF -prtf#:#prtf_add_assignment#:#Add Assignment###31 03 2023 new variable +prtf#:#prtf_add_assignment#:#Add Assignment###31 10 2023 new variable prtf#:#prtf_add_blog#:#Ajouter Blog prtf#:#prtf_add_existing_blog#:#Utiliser un blog existant prtf#:#prtf_add_new_blog#:#Ajouter un nouveau blog prtf#:#prtf_add_new_blog_info#:#Le nouveau blog sera ajouté à votre espace de travail personnel. prtf#:#prtf_add_page#:#Ajouter Page -prtf#:#prtf_add_portfolio#:#Ajouter Portfolio +prtf#:#prtf_add_portfolio#:#Ajouter un Portfolio prtf#:#prtf_all_pages#:#Toutes les pages prtf#:#prtf_allow_html#:#Autoriser HTML/Javascript prtf#:#prtf_allow_html_info#:#Permet aux utilisateurs d' inclure du code HTML et / ou Javascript dans les pages du portefeuille. Cela peut conduire à des problèmes de sécurité. @@ -12887,24 +12889,24 @@ prtf#:#prtf_author#:#Auteur prtf#:#prtf_back_to_portfolio_owner#:#Edit Portfolio prtf#:#prtf_banner#:#Bannière prtf#:#prtf_blog_page_created#:#Le blog a été ajouté. -prtf#:#prtf_copy_blog_pg#:#Copy Blog Page###29 06 2022 new variable +prtf#:#prtf_copy_blog_pg#:#Copy Blog Page prtf#:#prtf_copy_page#:#Copier Page(s) -prtf#:#prtf_copy_pg#:#Copy Page###29 06 2022 new variable +prtf#:#prtf_copy_pg#:#Copy Page prtf#:#prtf_copy_tab#:#Copy Tab prtf#:#prtf_create_portfolio#:#Ajouter Portfolio prtf#:#prtf_create_template_from_portfolio#:#Portfolio prtf#:#prtf_create_template_from_portfolio_info#:#Choisir un Portfolio à utiliser comme modèle. prtf#:#prtf_creation_mode#:#Nouveau Portfolio -prtf#:#prtf_creation_mode_scratch#:#Créer sans Modèle -prtf#:#prtf_creation_mode_template#:#Créer avec Modèle +prtf#:#prtf_creation_mode_scratch#:#Créer sans modèle +prtf#:#prtf_creation_mode_template#:#Créer avec modèle prtf#:#prtf_date_of_print#:#Date d’impression prtf#:#prtf_decl_authorship#:#Declaration of Authorship prtf#:#prtf_default_portfolio#:#Mon Profil -prtf#:#prtf_delete_assignment#:#Delete Assignments###31 03 2023 new variable -prtf#:#prtf_delete_assignment_sure#:#Do you really want to delete the following assignment(s)?###31 03 2023 new variable +prtf#:#prtf_delete_assignment#:#Delete Assignments###31 10 2023 new variable +prtf#:#prtf_delete_assignment_sure#:#Do you really want to delete the following assignment(s)?###31 10 2023 new variable prtf#:#prtf_download_submission#:#Download Submission -prtf#:#prtf_edit_content#:#Edit Content -prtf#:#prtf_edit_data#:#Edit Data###31 03 2023 new variable +prtf#:#prtf_edit_content#:#Editer le contenu +prtf#:#prtf_edit_data#:#Edit Data###31 10 2023 new variable prtf#:#prtf_edit_embedded_blog#:#Éditer blog «%s» prtf#:#prtf_edit_portfolio#:#Editer Portfolio prtf#:#prtf_exercise_info#:#Ce Portfolio fait partie de la tâche "%s" de l'exercice "%s". @@ -12919,7 +12921,7 @@ prtf#:#prtf_manage_portfolios#:#Gérer portfolios prtf#:#prtf_new_portfolio#:#Nouveau Portfolio prtf#:#prtf_no_blogs_info#:#Votre espace de travail ne contient pas de blog. Vous pouvez en créer pour les utiliser comme éléments de votre Portfolio. prtf#:#prtf_no_offline_share_info#:#A portfolio has to be online to be shared by other users. -prtf#:#prtf_no_submission#:#No Submission +prtf#:#prtf_no_submission#:#Non soumis prtf#:#prtf_page_created#:#Page créée prtf#:#prtf_page_element_my_courses_info#:#Ceci est une liste de tous mes cours qui sont actuellement en ligne et auxquels je suis inscrit. prtf#:#prtf_page_element_my_courses_title#:#Current Courses @@ -12928,8 +12930,8 @@ prtf#:#prtf_page_element_teaser_consultation_hours#:#Le portfolio affichera ici prtf#:#prtf_page_element_teaser_my_courses#:#Le portfolio affichera ici une liste de vos cours actuels. prtf#:#prtf_page_element_teaser_settings#:#Paramètres prtf#:#prtf_page_element_teaser_skills#:#Le portfolio affichera ici votre niveau de compétence. -prtf#:#prtf_page_type_prtf#:#Portfolio Page###30 04 2021 new variable -prtf#:#prtf_page_type_prtt#:#Portfolio Template Page###30 04 2021 new variable +prtf#:#prtf_page_type_prtf#:#Portfolio Page +prtf#:#prtf_page_type_prtt#:#Portfolio Template Page prtf#:#prtf_pages_copied#:#Les pages ont été copiées. prtf#:#prtf_pdf#:#PDF prtf#:#prtf_portfolio_created#:#Portfolio ajouté @@ -12946,16 +12948,16 @@ prtf#:#prtf_print_selection#:#Sélection de la page prtf#:#prtf_profile_picture#:#Afficher Image du Profil prtf#:#prtf_properties#:#Propriétés de Portfolio prtf#:#prtf_public_comments#:#Commentaires Publics -prtf#:#prtf_role_assignment#:#Role Assignment###31 03 2023 new variable -prtf#:#prtf_role_title#:#Role###31 03 2023 new variable +prtf#:#prtf_role_assignment#:#Role Assignment###31 10 2023 new variable +prtf#:#prtf_role_title#:#Role###31 10 2023 new variable prtf#:#prtf_save_status_and_titles#:#Enregistrer Statuts and Titres -prtf#:#prtf_sec_protected_info#:#Protected sections cannot be edited by portfolio owners.###31 03 2023 new variable +prtf#:#prtf_sec_protected_info#:#Protected sections cannot be edited by portfolio owners.###31 10 2023 new variable prtf#:#prtf_selected_pages#:#Pages sélectionnées -prtf#:#prtf_set_as_default#:#Utiliser Comme Profil +prtf#:#prtf_set_as_default#:#Utiliser comme profil prtf#:#prtf_set_default_publish_confirmation#:#Le Portfolio va être partagé au minimum avec les utilisateurs connectés. Doit-il aussi être visible par les utilisateurs non connectés ? prtf#:#prtf_set_default_publish_global#:#Partager aussi avec les utilisateurs non-inscrits prtf#:#prtf_set_default_publish_registered#:#Partager uniquement avec les utilisateurs inscrits -prtf#:#prtf_set_offline#:#Set Offline +prtf#:#prtf_set_offline#:#Mettre hors ligne prtf#:#prtf_set_online#:#Set Online prtf#:#prtf_settings#:#Administration du Portfolio prtf#:#prtf_shared_offline_info#:#Un portfolio doit être en ligne pour être accessible par les utilisateurs partagés. @@ -12966,17 +12968,17 @@ prtf#:#prtf_style#:#Style de Portfolio prtf#:#prtf_submission_on#:#Submitted on $1 prtf#:#prtf_sure_delete_portfolio_pages#:#Etes-vous sûr de vouloir supprimer les pages du Portfolio suivantes ? prtf#:#prtf_sure_delete_portfolios#:#Etes-vous sûr de vouloir supprimer les Portfolios suivants ? -prtf#:#prtf_tab_other_users#:#Portfolios d'Autres Utilisateurs +prtf#:#prtf_tab_other_users#:#Portfolios d'autres utilisateurs prtf#:#prtf_tab_portfolios#:#Mes Portfolios prtf#:#prtf_template_editor_placeholder_info#:#Cet emplacement sera remplacé dans le Portfolio prtf#:#prtf_template_import_blog_create#:#Créer Nouveau Blog prtf#:#prtf_template_import_blog_ignore#:#Supprimer Page de Blog prtf#:#prtf_template_import_blog_reuse#:#Utiliser Blog Existant prtf#:#prtf_template_import_new_skills#:#Lorsque activé, ces éléments sont ajoutés à vos compétences personnelles. -prtf#:#prtf_template_title#:#Portfolio Template###31 03 2023 new variable +prtf#:#prtf_template_title#:#Portfolio Template###31 10 2023 new variable prtf#:#prtf_unset_as_default#:#Ne Plus Utiliser Comme Profil prtf#:#prtf_unset_default_share_info#:#Les derniers changements ont été enregistrés. Veuillez vérifier les paramètres de partage du Portfolio. -prtf#:#prtf_use_page_layout#:#Utiliser Mise en Page +prtf#:#prtf_use_page_layout#:#Utiliser la mise en page prtf#:#prtt_title_info#:#Please note that this will be also the default title for all portfolios being created form this template. prtt#:#prtt_activation_limited_visibility_info#:#Lorsque choisi, le portfolio est visible y compris en dehors de ce contexte. prtt#:#prtt_activation_online_info#:#Activer cette option pour rendre ce modèle de portfolio accessible aux utilisateurs. @@ -12985,10 +12987,10 @@ prtt#:#prtt_copy#:#Copier Modèle de Portfolio prtt#:#prtt_edit#:#Editer Modèle de Portfolio prtt#:#prtt_import#:#Importer Modèle de Portfolio prtt#:#prtt_new#:#Nouveau Modèle de Portfolio -prtt#:#prtt_pfpg#:#Portfolio Page###31 03 2023 new variable +prtt#:#prtt_pfpg#:#Portfolio Page###31 10 2023 new variable prtt#:#prtt_portfolio_created#:#Modèle de portfolio ajouté prtt#:#prtt_properties#:#Propriétés du Modèle de Portfolio -prtt#:#prtt_select_datasets#:#Select Datasets###31 03 2023 new variable +prtt#:#prtt_select_datasets#:#Select Datasets###31 10 2023 new variable prtt#:#prtt_style#:#Style du Modèle de Portfolio ps#:#cdf_edited_by_self#:#par l’utilisateur ps#:#crs_ps_cdf_info#:#Donnée spécifique supplémentaire de cours : @@ -13046,9 +13048,9 @@ ps#:#ps_grp_user_fields#:#Zones utilisateurs spécifiques de groupe ps#:#ps_login_max_attempts#:#Tentatives de connexion maximum ps#:#ps_login_max_attempts_info#:#Définit le nombre maximun de tentatives en échec de connexion. Mettre 0 pour déactiver cette option. ps#:#ps_not_accepted#:#Refusé -ps#:#ps_participants_list_courses#:#Allow Activation of Participant Lists in the Member Gallery of Courses###30 04 2021 new variable -ps#:#ps_passwd_policy_change_force_user_reset_succ#:#The changes have been successfully applied.###07 02 2020 new variable -ps#:#ps_passwd_policy_changed_force_user_reset#:#The changes were saved successfully. You just modified at least one password policy setting. Should local users be forced to change their password after the next successful login?###07 02 2020 new variable +ps#:#ps_participants_list_courses#:#Allow Activation of Participant Lists in the Member Gallery of Courses +ps#:#ps_passwd_policy_change_force_user_reset_succ#:#The changes have been successfully applied. +ps#:#ps_passwd_policy_changed_force_user_reset#:#The changes were saved successfully. You just modified at least one password policy setting. Should local users be forced to change their password after the next successful login? ps#:#ps_password_change_on_first_login_enabled#:#Changer le Mot de Passe à la Première Connexion ps#:#ps_password_change_on_first_login_enabled_info#:#Si actif, les utilisateurs doivent modifier leur mot de passe lors de la première connexion (sauf utilisateurs enregistrés eux-mêmes). ps#:#ps_password_chars_and_numbers_enabled#:#Caractères et Nombres @@ -13071,7 +13073,7 @@ ps#:#ps_security_protection#:#Paramètres de Sécurité ps#:#ps_select_one#:#Veuillez sélectionner un fichier d'export ps#:#ps_show_crs_access#:#Afficher la dernière date d'accès des participants de cours ps#:#ps_show_grp_access#:#Montrer le Dernier Accès des Membres dans les Groupes -ps#:#ps_show_lso_access#:#Show last access time of learning sequence participants###26 04 2023 new variable +ps#:#ps_show_lso_access#:#Show last access time of learning sequence participants###31 10 2023 new variable ps#:#ps_size#:#Taille du Fichier ps#:#ps_type_select#:#Liste Déroulante ps#:#ps_type_select_long#:#Liste Déroulante (Valeurs Prédéfinies) @@ -13099,21 +13101,21 @@ pwassist#:#pwassist_password_assigned#:#Le mot de passe a été assigné avec su pwassist#:#pwassist_session_expired#:#Veuillez remplir à nouveau le formulaire.\nVotre session d'assistance de mot de passe a expiré. Cela peut être dû au fait que vous avez essayé d'utiliser plusieurs fois le lien que vous avez reçu, ou bien parce que trop de temps s'est écoulé depuis que le message vous a été envoyé. pwassist#:#pwassist_username_mail_body#:#Ce sont les noms d'utilisateur correspondant à l'adresse mail donnée :\n%s\n\n. Ce message a été créé automatiquement par le serveur ILIAS suivant : \n\t%s\n\n Vous (ou quelqu'un avec le numéro IP %s) a demandé le support d'aide 'nom d'utilisateur oublié' pour l'adresse mail '%s'.\n\nVérifier les informations contenues dans ce message et suivre les indications ::\n\n-Vous avez fait cette demande par erreur :\nSupprimer ce message.\n\nVous êtes certain de n'avoir jamais fait une telle demande :\nContactez %s.\n\n-Si vous avez fait cette demande, procédez comme suit ::\n\n1. Ouvrer votre navigateur internet.\n\n2. Saisir l'adresse internet (URL) suivante :\n\t%s\n\nImportant : l'adresse est d'une seule ligne. Si vous voyez cette adresse tronquée en plusieurs lignes, c'est que votre programme logiciel de mail a ajouté des retours chariot.\n\n3. Votre navigateur internet affiche maintenant le service 'mot de passe'. Utiliser cette page avec l'un des nom d'utilisateur et l'adresse mail correspondante pour obtenir un nouveau mot de passe. pwassist#:#unassist_disabled_no_access#:#L’assistance pour les noms d’utilisateur n’est pas activée. Veuillez contacter l’administration du système pour obtenir de l’aide supplémentaire: %s -pwsp#:#pwsp_enable_personal_resources#:#Enable personal resources###07 02 2020 new variable -pwsp#:#pwsp_enable_wsp_blogs#:#Enable Blogs###07 02 2020 new variable -pwsp#:#pwsp_enable_wsp_files#:#Enable Files###07 02 2020 new variable -pwsp#:#pwsp_enable_wsp_links#:#Enable Links###07 02 2020 new variable -qpl#:#qpl_page_type_qfbg#:#General Feedback###30 04 2021 new variable -qpl#:#qpl_page_type_qfbs#:#Special Feedback###30 04 2021 new variable -qpl#:#qpl_page_type_qht#:#Hint###30 04 2021 new variable -qpl#:#qpl_page_type_qpl#:#Question Page###30 04 2021 new variable +pwsp#:#pwsp_enable_personal_resources#:#Enable personal resources +pwsp#:#pwsp_enable_wsp_blogs#:#Enable Blogs +pwsp#:#pwsp_enable_wsp_files#:#Enable Files +pwsp#:#pwsp_enable_wsp_links#:#Enable Links +qpl#:#qpl_page_type_qfbg#:#General Feedback +qpl#:#qpl_page_type_qfbs#:#Special Feedback +qpl#:#qpl_page_type_qht#:#Hint +qpl#:#qpl_page_type_qpl#:#Question Page rating#:#rat_not_rated_yet#:#Pas Encore Noté rating#:#rat_nr_ratings#:#%s Notations rating#:#rat_one_rating#:#Une Notation rating#:#rating_activate_rating#:#Autoriser la Notation rating#:#rating_activate_rating_info#:#Lorsque activé, les utilisateurs peuvent noter cet objet rating#:#rating_add_category#:#Ajouter Catégorie -rating#:#rating_avg_rating#:#Average Rating###09 03 2022 new variable +rating#:#rating_avg_rating#:#Average Rating rating#:#rating_categories#:#Catégories de Notation rating#:#rating_category_add#:#Ajouter rating#:#rating_category_create#:#Créer Categorie @@ -13129,10 +13131,10 @@ rating#:#rating_export_rating#:#Notation rating#:#rating_new_objects_auto#:#Autoriser la Notation pour les Nouveaux Objets rating#:#rating_new_objects_auto_info#:#Lorsque activé, les nouveaux fichiers, modules et Wikis peuvent être notés. rating#:#rating_number_votes#:#%s Notations -rating#:#rating_open_dialog#:#Open rating dialog###09 03 2022 new variable +rating#:#rating_open_dialog#:#Open rating dialog rating#:#rating_overlay_submit#:#Soumettre Notation -rating#:#rating_personal_rating#:#Your Rating###09 03 2022 new variable -rating#:#rating_rate_x_of_5#:#Rate with %s of 5 stars###09 03 2022 new variable +rating#:#rating_personal_rating#:#Your Rating +rating#:#rating_rate_x_of_5#:#Rate with %s of 5 stars rating#:#rating_remove#:#Supprimer Notation rating#:#rating_update_positions#:#Enregistrer Positions rating#:#rating_your_rating#:#Votre Notation @@ -13143,17 +13145,17 @@ rbac#:#accs_write#:#Administration autorisée rbac#:#activate_wiki_protection#:#Lecture seule rbac#:#active_preconditions#:#Préconditions Actives rbac#:#add_consultation_hours#:#Ajouter heures de consultation à l'agenda -rbac#:#add_consume_provider#:#Add Own LTI Provider Settings###07 02 2020 new variable +rbac#:#add_consume_provider#:#Add Own LTI Provider Settings rbac#:#add_reply#:#Ajouter Réponse rbac#:#add_thread#:#Ajouter sujet rbac#:#adm_edit_permission#:#Permissions d'administration modifiables rbac#:#adm_read#:#Panneau d'administration accessible rbac#:#adm_visible#:#Panneau d'administration visible rbac#:#adm_write#:#Administration autorisée -rbac#:#adn_edit_permission#:#User can change permissions of Administrative Notifications' administration.###30 04 2021 new variable -rbac#:#adn_read#:#User has read access to administration of Administrative Notifications.###30 04 2021 new variable -rbac#:#adn_visible#:#Administration of Administrative Notifications is visible.###30 04 2021 new variable -rbac#:#adn_write#:#User can add and edit Administrative Notifications.###30 04 2021 new variable +rbac#:#adn_edit_permission#:#User can change permissions of Administrative Notifications' administration. +rbac#:#adn_read#:#User has read access to administration of Administrative Notifications. +rbac#:#adn_visible#:#Administration of Administrative Notifications is visible. +rbac#:#adn_write#:#User can add and edit Administrative Notifications. rbac#:#adopt_perm_from_template#:#Copier Permissions rbac#:#adve_edit_permission#:#Permissions d'administration modifiables rbac#:#adve_read#:#Panneau d'administration accessible @@ -13241,36 +13243,36 @@ rbac#:#change_existing_prefix#:#Modifier Objets Existants : rbac#:#change_existing_prefix_single#:#Modifier rbac#:#change_existing_suffix#:#  rbac#:#change_existing_suffix_single#:#  -rbac#:#change_presentation#:#Change Presentation###07 02 2020 new variable +rbac#:#change_presentation#:#Change Presentation rbac#:#chtr_delete#:#L'utilisateur peut déplacer et supprimer l'objet rbac#:#chtr_edit_permission#:#L'utilisateur peut modifier les permissions de l'objet rbac#:#chtr_moderate#:#L'utilisateur peut modérer les discussions rbac#:#chtr_read#:#L'utilisateur peut rejoindre la discussion et y participer rbac#:#chtr_visible#:#L'objet est visible rbac#:#chtr_write#:#L'utilisateur peut modifier les paramètres du Chat et bannir des utilisateurs -rbac#:#cmis_edit_permissions#:#User can change permission settings of xAPI/cmi5 administration.###30 04 2021 new variable -rbac#:#cmis_read#:#User has read access to xAPI/cmi5 administration.###30 04 2021 new variable -rbac#:#cmis_visible#:#Administration of xAPI/cmi5 is visible.###30 04 2021 new variable -rbac#:#cmis_write#:#User can edit settings of xAPI/cmi5 administration.###30 04 2021 new variable -rbac#:#cmix_copy#:#User can copy xAPI/cmi5 Object###07 02 2020 new variable -rbac#:#cmix_delete#:#User can move or delete xAPI/cmi5 Object###07 02 2020 new variable -rbac#:#cmix_edit_learning_progress#:#User can edit learning progress settings###07 02 2020 new variable -rbac#:#cmix_edit_permission#:#User can change permission settings###07 02 2020 new variable -rbac#:#cmix_read#:#User can see xAPI/cmi5 Object###07 02 2020 new variable -rbac#:#cmix_read_learning_progress#:#User can view learning progress of other users###07 02 2020 new variable -rbac#:#cmix_read_outcomes#:#User can see learning experiences and ranking of other users###07 02 2020 new variable -rbac#:#cmix_visible#:#xAPI/cmi5 Object is visible###07 02 2020 new variable -rbac#:#cmix_write#:#User can edit settings of xAPI/cmi5 Object###07 02 2020 new variable +rbac#:#cmis_edit_permissions#:#User can change permission settings of xAPI/cmi5 administration. +rbac#:#cmis_read#:#User has read access to xAPI/cmi5 administration. +rbac#:#cmis_visible#:#Administration of xAPI/cmi5 is visible. +rbac#:#cmis_write#:#User can edit settings of xAPI/cmi5 administration. +rbac#:#cmix_copy#:#User can copy xAPI/cmi5 Object +rbac#:#cmix_delete#:#User can move or delete xAPI/cmi5 Object +rbac#:#cmix_edit_learning_progress#:#User can edit learning progress settings +rbac#:#cmix_edit_permission#:#User can change permission settings +rbac#:#cmix_read#:#User can see xAPI/cmi5 Object +rbac#:#cmix_read_learning_progress#:#User can view learning progress of other users +rbac#:#cmix_read_outcomes#:#User can see learning experiences and ranking of other users +rbac#:#cmix_visible#:#xAPI/cmi5 Object is visible +rbac#:#cmix_write#:#User can edit settings of xAPI/cmi5 Object rbac#:#cmps_edit_permission#:#Permissions d'administration modifiables rbac#:#cmps_read#:#Accès aux paramètres de composant rbac#:#cmps_visible#:#Panneau d'administration visible rbac#:#cmps_write#:#Modifier paramètres du calendrier -rbac#:#coms_edit_permissions#:#User can change permission settings of administration of Comments.###30 04 2021 new variable -rbac#:#coms_read#:#User has read access to administration of Comments.###30 04 2021 new variable -rbac#:#coms_visible#:#Administration of Comments is visible.###30 04 2021 new variable -rbac#:#coms_write#:#User can edit settings of administration of Comments.###30 04 2021 new variable +rbac#:#coms_edit_permissions#:#User can change permission settings of administration of Comments. +rbac#:#coms_read#:#User has read access to administration of Comments. +rbac#:#coms_visible#:#Administration of Comments is visible. +rbac#:#coms_write#:#User can edit settings of administration of Comments. rbac#:#condition_failed#:#Échec -rbac#:#condition_learning_progress#:#Tirer de la progression d’apprentissage +rbac#:#condition_learning_progress#:#Selon la progression rbac#:#contribute#:#Contribuer rbac#:#copa_copy#:#Copy Content Page rbac#:#copa_delete#:#User can move or delete Content Page @@ -13280,10 +13282,10 @@ rbac#:#copa_read#:#User can read Content Page rbac#:#copa_read_learning_progress#:#User can view learning progress of other users rbac#:#copa_visible#:#Content Page is visible rbac#:#copa_write#:#User can edit Content Page -rbac#:#cpad_edit_permissions#:#User can change permission settings of administration of Content Pages.###30 04 2021 new variable -rbac#:#cpad_read#:#User has read access to administration of Content Pages.###30 04 2021 new variable -rbac#:#cpad_visible#:#Administration of Content Pages is visible.###30 04 2021 new variable -rbac#:#cpad_write#:#User can edit settings of administration of Content Pages.###30 04 2021 new variable +rbac#:#cpad_edit_permissions#:#User can change permission settings of administration of Content Pages. +rbac#:#cpad_read#:#User has read access to administration of Content Pages. +rbac#:#cpad_visible#:#Administration of Content Pages is visible. +rbac#:#cpad_write#:#User can edit settings of administration of Content Pages. rbac#:#crs_copy#:#L'utilisateur peut copier l'objet rbac#:#crs_delete#:#L'utilisateur peut déplacer et supprimer l'objet rbac#:#crs_edit_event#:#Modifier évènements de l'agenda @@ -13300,9 +13302,9 @@ rbac#:#crs_visible#:#L'objet est visible rbac#:#crs_write#:#L'utilisateur peut modifier les paramètres et gérer le contenu de l'objet rbac#:#crsr_copy#:#Copier référence de cours rbac#:#crsr_delete#:#Supprimer référence de cours -rbac#:#crsr_edit_learning_progress#:#User can edit learning progress settings###28 07 2023 new variable +rbac#:#crsr_edit_learning_progress#:#User can edit learning progress settings rbac#:#crsr_edit_permission#:#L'utilisateur peut modifier les permissions de l'objet -rbac#:#crsr_read_learning_progress#:#User can view learning progress of other users###28 07 2023 new variable +rbac#:#crsr_read_learning_progress#:#User can view learning progress of other users rbac#:#crsr_visible#:#La référence de cours est visible rbac#:#crsr_write#:#Modifier référence de cours rbac#:#crss_edit_permission#:#L'utilisateur peut modifier les permissions de l'objet @@ -13320,17 +13322,17 @@ rbac#:#dcl_write#:#L'utilisateur peut modifier les paramètres et éditer le con rbac#:#delete_files#:#Supprimer Fichiers rbac#:#delete_folders#:#Supprimer Dossiers rbac#:#delete_wiki_pages#:#Supprimer les pages -rbac#:#dshs_change_presentation#:#Change presentation of dashboard view###07 02 2020 new variable -rbac#:#dshs_edit_permission#:#User can change permission settings of Dashboard administration###07 02 2020 new variable -rbac#:#dshs_read#:#User has read access to Dashboard administration###07 02 2020 new variable -rbac#:#dshs_visible#:#Dashboard administration is visible###07 02 2020 new variable -rbac#:#dshs_write#:#Edit settings of Dashboard administration###07 02 2020 new variable +rbac#:#dshs_change_presentation#:#Change presentation of dashboard view +rbac#:#dshs_edit_permission#:#User can change permission settings of Dashboard administration +rbac#:#dshs_read#:#User has read access to Dashboard administration +rbac#:#dshs_visible#:#Dashboard administration is visible +rbac#:#dshs_write#:#Edit settings of Dashboard administration rbac#:#ecss_edit_permission#:#Permissions d'administration modifiables rbac#:#ecss_read#:#Panneau d'administration accessible rbac#:#ecss_visible#:#Paramètres ECS visibles rbac#:#ecss_write#:#L'utilisateur peut modifier les paramètres ECS rbac#:#edit_event#:#Modifier agenda -rbac#:#edit_in_online_editor#:#Open in online editor###30 04 2021 new variable +rbac#:#edit_in_online_editor#:#Open in online editor rbac#:#edit_learning_progress#:#Modifier suivi rbac#:#edit_members#:#Gérer les membres rbac#:#edit_permission#:#Modifier permissions @@ -13358,7 +13360,7 @@ rbac#:#extt_visible#:#Panneau d'administration visible rbac#:#extt_write#:#Configurer un logiciel tiers rbac#:#facs_edit_permission#:#Permissions d'administration modifiables rbac#:#facs_read#:#Lire les paramètres de fichiers et dossiers -rbac#:#facs_upload_blacklisted_files#:#Upload indexed file types despite blacklist###07 02 2020 new variable +rbac#:#facs_upload_blacklisted_files#:#Upload indexed file types despite blacklist rbac#:#facs_visible#:#Les paramètres des fichiers et dossiers sont visibles rbac#:#facs_write#:#Modifier paramètres des fichiers et dossiers rbac#:#feed_copy#:#L’utilisateur peut copier le flux web @@ -13375,10 +13377,10 @@ rbac#:#file_read_learning_progress#:#L’utilisateur peut voir la progression d rbac#:#file_visible#:#L'objet est visible rbac#:#file_write#:#L'utilisateur peut modifier les paramètres et déposer une nouvelle version du fichier rbac#:#files_visible#:#Fichiers Visibles -rbac#:#fils_edit_permissions#:#User can change permission settings of File Services administration.###30 04 2021 new variable -rbac#:#fils_read#:#User has read access to File Services administration.###30 04 2021 new variable -rbac#:#fils_visible#:#Administration of File Services is visible.###30 04 2021 new variable -rbac#:#fils_write#:#User can edit and configure File Services.###30 04 2021 new variable +rbac#:#fils_edit_permissions#:#User can change permission settings of File Services administration. +rbac#:#fils_read#:#User has read access to File Services administration. +rbac#:#fils_visible#:#Administration of File Services is visible. +rbac#:#fils_write#:#User can edit and configure File Services. rbac#:#filter_all_roles#:#Afficher tous les rôles du contexte courant rbac#:#filter_global_roles#:#Afficher seulement les rôles globaux rbac#:#filter_local_roles#:#Afficher uniquement les rôles locaux du contexte courant @@ -13450,7 +13452,7 @@ rbac#:#htlm_read#:#L'utilisateur peut lire le module HTML rbac#:#htlm_read_learning_progress#:#L'utilisateur peut afficher les progrès d'apprentissage des autres utilisateurs rbac#:#htlm_visible#:#L'objet est visible rbac#:#htlm_write#:#L'utilisateur peut modifier les paramètres et éditer le contenu de l'objet -rbac#:#iass_amend_grading#:#Amend gradings in an Individual Assessment###07 02 2020 new variable +rbac#:#iass_amend_grading#:#Amend gradings in an Individual Assessment rbac#:#iass_copy#:#Copy a Individual Assessment rbac#:#iass_delete#:#Delete a Individual Assessment rbac#:#iass_edit_learning_progress#:#Edit learning progress information of a Individual Assessment @@ -13460,7 +13462,7 @@ rbac#:#iass_read#:#Read content of a Individual Assessment rbac#:#iass_read_learning_progress#:#View learning progress information of a Individual Assessment rbac#:#iass_visible#:#L’évaluation individuelle est visible rbac#:#iass_write#:#Edit a Individual Assessment -rbac#:#il_lti_global_role#:#LTI User###24 09 2021 new variable +rbac#:#il_lti_global_role#:#LTI User rbac#:#il_sess_participant#:#Participant à la session rbac#:#il_sess_status_closed#:#Session fermée pour les non-participants rbac#:#ilias_id#:#ID ILIAS @@ -13474,10 +13476,10 @@ rbac#:#itgr_read#:#L'utilisateur a accès au groupe d'objets rbac#:#itgr_visible#:#L'objet est visible rbac#:#itgr_write#:#L'utilisateur peut modifier les paramètres et éditer le contenu de l'objet rbac#:#leave#:#Se désinscrire -rbac#:#lhts_edit_permissions#:#User can change permission settings of Learning History administration.###30 04 2021 new variable -rbac#:#lhts_read#:#User has read access to Learning History administration.###30 04 2021 new variable -rbac#:#lhts_visible#:#Administration of Learning History is visible.###30 04 2021 new variable -rbac#:#lhts_write#:#User can edit settings of Learning History administration.###30 04 2021 new variable +rbac#:#lhts_edit_permissions#:#User can change permission settings of Learning History administration. +rbac#:#lhts_read#:#User has read access to Learning History administration. +rbac#:#lhts_visible#:#Administration of Learning History is visible. +rbac#:#lhts_write#:#User can edit settings of Learning History administration. rbac#:#lm_copy#:#L'utilisateur peut copier l'objet rbac#:#lm_delete#:#L'utilisateur peut déplacer et supprimer l'objet rbac#:#lm_edit_learning_progress#:#L'utilisateur peut voir la progression et modifer ses paramètres @@ -13501,30 +13503,30 @@ rbac#:#lrss_visible#:#Panneau d'administration visible rbac#:#lrss_write#:#Administration autorisée rbac#:#lso_copy#:#User can copy Learning Sequence rbac#:#lso_delete#:#User can delete Learning Sequence -rbac#:#lso_edit_learning_progress#:#User can edit learning progress settings###07 02 2020 new variable -rbac#:#lso_edit_permission#:#User can change permission settings of Learning Sequence###07 02 2020 new variable -rbac#:#lso_lp_other_users#:#User can view learning progress of other users###07 02 2020 new variable -rbac#:#lso_manage_members#:#Manage members of Learning Sequence###07 02 2020 new variable -rbac#:#lso_participate#:#User can subscribe to a Learning Sequence###07 02 2020 new variable -rbac#:#lso_read#:#Users can access the Learning Sequence###07 02 2020 new variable -rbac#:#lso_read_learning_progress#:#User can view learning progress of other users###07 02 2020 new variable -rbac#:#lso_unparticipate#:#User can unsubscribe from a Learning Sequence###07 02 2020 new variable +rbac#:#lso_edit_learning_progress#:#User can edit learning progress settings +rbac#:#lso_edit_permission#:#User can change permission settings of Learning Sequence +rbac#:#lso_lp_other_users#:#User can view learning progress of other users +rbac#:#lso_manage_members#:#Manage members of Learning Sequence +rbac#:#lso_participate#:#User can subscribe to a Learning Sequence +rbac#:#lso_read#:#Users can access the Learning Sequence +rbac#:#lso_read_learning_progress#:#User can view learning progress of other users +rbac#:#lso_unparticipate#:#User can unsubscribe from a Learning Sequence rbac#:#lso_visible#:#Learning Sequence is visible rbac#:#lso_write#:#User can edit settings of Learning Sequence -rbac#:#lsos_edit_permissions#:#User can change permission settings of Learning Sequences administration.###30 04 2021 new variable -rbac#:#lsos_read#:#User has read access to Learning Sequences administration.###30 04 2021 new variable -rbac#:#lsos_visible#:#Administration of Learning Sequences is visible.###30 04 2021 new variable -rbac#:#lsos_write#:#User can edit settings of Learning Sequences administration.###30 04 2021 new variable -rbac#:#lti_copy#:#User can copy LTI consumer###07 02 2020 new variable -rbac#:#lti_delete#:#User can move or delete LTI consumer###07 02 2020 new variable -rbac#:#lti_edit_learning_progress#:#User can edit learning progress settings###07 02 2020 new variable -rbac#:#lti_edit_permission#:#User can change permission settings###07 02 2020 new variable -rbac#:#lti_read#:#User can see LTI consumer###07 02 2020 new variable -rbac#:#lti_read_learning_progress#:#User can view learning progress of other users###07 02 2020 new variable -rbac#:#lti_read_outcomes#:#User can see learning experiences and ranking of other users###07 02 2020 new variable -rbac#:#lti_visible#:#LTI consumer is visible###07 02 2020 new variable -rbac#:#lti_write#:#User can edit settings of LTI consumer###07 02 2020 new variable -rbac#:#ltis_add_consume_provider#:#User can add own provider settings for LTI consumer###07 02 2020 new variable +rbac#:#lsos_edit_permissions#:#User can change permission settings of Learning Sequences administration. +rbac#:#lsos_read#:#User has read access to Learning Sequences administration. +rbac#:#lsos_visible#:#Administration of Learning Sequences is visible. +rbac#:#lsos_write#:#User can edit settings of Learning Sequences administration. +rbac#:#lti_copy#:#User can copy LTI consumer +rbac#:#lti_delete#:#User can move or delete LTI consumer +rbac#:#lti_edit_learning_progress#:#User can edit learning progress settings +rbac#:#lti_edit_permission#:#User can change permission settings +rbac#:#lti_read#:#User can see LTI consumer +rbac#:#lti_read_learning_progress#:#User can view learning progress of other users +rbac#:#lti_read_outcomes#:#User can see learning experiences and ranking of other users +rbac#:#lti_visible#:#LTI consumer is visible +rbac#:#lti_write#:#User can edit settings of LTI consumer +rbac#:#ltis_add_consume_provider#:#User can add own provider settings for LTI consumer rbac#:#ltis_edit_permission#:#L’utilisateur peut modifier les paramètres de permission dans l’administration LTI rbac#:#ltis_read#:#L’utilisateur a un accès de lecture pour l’administration LTI rbac#:#ltis_release_objects#:#L’utilisateur peut relâcher les objets pour le consommateur LTI @@ -13537,13 +13539,13 @@ rbac#:#mail_smtp_mail#:#Envoi de messages par SMTP rbac#:#mail_to_global_roles#:#Envoyer un message aux rôles globaux rbac#:#mail_visible#:#Panneau d'administration visible rbac#:#mail_write#:#Administration autorisée -rbac#:#manage_comp#:#User can edit Competences###31 03 2023 new variable -rbac#:#manage_comp_temp#:#User can edit Competence Templates###31 03 2023 new variable +rbac#:#manage_comp#:#User can edit Competences###31 10 2023 new variable +rbac#:#manage_comp_temp#:#User can edit Competence Templates###31 10 2023 new variable rbac#:#manage_materials#:#Manage Materials -rbac#:#manage_profiles#:#User can edit Competence Profiles###31 03 2023 new variable +rbac#:#manage_profiles#:#User can edit Competence Profiles###31 10 2023 new variable rbac#:#mcst_copy#:#L'utilisateur peut copier l'objet rbac#:#mcst_delete#:#L'utilisateur peut déplacer et supprimer l'objet -rbac#:#mcst_edit_learning_progress#:#User can edit learning progress settings###07 02 2020 new variable +rbac#:#mcst_edit_learning_progress#:#User can edit learning progress settings rbac#:#mcst_edit_permission#:#L'utilisateur peut modifier les permissions de l'objet rbac#:#mcst_read#:#L'utilisateur peut lire le mediacast rbac#:#mcst_read_learning_progress#:#L’utilisateur peut voir la progression d’apprentissage d’autres utilisateurs @@ -13563,10 +13565,10 @@ rbac#:#mep_edit_permission#:#L'utilisateur peut modifier les permissions de l'ob rbac#:#mep_read#:#L'utilisateur a accès à la galerie et peut réutiliser les médias rbac#:#mep_visible#:#L'objet est visible rbac#:#mep_write#:#L'utilisateur peut modifier les paramètres et éditer le contenu de l'objet -rbac#:#mme_edit_permission#:#User can change permission settings of Main Menu administration###07 02 2020 new variable -rbac#:#mme_read#:#User has read access to administration of Main Menu###07 02 2020 new variable -rbac#:#mme_visible#:#Administration of Main Menu is visible###07 02 2020 new variable -rbac#:#mme_write#:#User can edit settings of Main Menu administration###07 02 2020 new variable +rbac#:#mme_edit_permission#:#User can change permission settings of Main Menu administration +rbac#:#mme_read#:#User has read access to administration of Main Menu +rbac#:#mme_visible#:#Administration of Main Menu is visible +rbac#:#mme_write#:#User can edit settings of Main Menu administration rbac#:#mobs_edit_permission#:#Permissions d'administration modifiables rbac#:#mobs_read#:#Panneau d'administration accessible rbac#:#mobs_visible#:#Panneau d'administration visible @@ -13575,21 +13577,21 @@ rbac#:#moderate#:#Modérer rbac#:#moderate_frm#:#Modérer rbac#:#msg_no_roles_of_type#:#Aucun rôle disponible rbac#:#news_add_news#:#Ajouter les nouvelles -rbac#:#nots_edit_permissions#:#User can change permission settings of Notes administration.###30 04 2021 new variable -rbac#:#nots_read#:#User has read access to Notes administration.###30 04 2021 new variable -rbac#:#nots_visible#:#Administration of Notes is visible.###30 04 2021 new variable -rbac#:#nots_write#:#User can edit settings of Notes administration.###30 04 2021 new variable +rbac#:#nots_edit_permissions#:#User can change permission settings of Notes administration. +rbac#:#nots_read#:#User has read access to Notes administration. +rbac#:#nots_visible#:#Administration of Notes is visible. +rbac#:#nots_write#:#User can edit settings of Notes administration. rbac#:#nwss_edit_permission#:#Permissions d'administration modifiables rbac#:#nwss_read#:#Panneau d'administration accessible rbac#:#nwss_visible#:#Panneau d'administration visible rbac#:#nwss_write#:#Administration autorisée -rbac#:#obj_skee#:#Competence Tree###31 03 2023 new variable +rbac#:#obj_skee#:#Competence Tree###31 10 2023 new variable rbac#:#org_op_access_results#:#Access Results of Subordinated Users rbac#:#org_op_edit_submissions_grades#:#Éditer les soumissions d’autres utilisateurs rbac#:#org_op_manage_participants#:#Manage Subordinated Participants rbac#:#org_op_score_participants#:#Score Subordinated Participants -rbac#:#org_op_view_certificates#:#View certificates of subordinated users###07 02 2020 new variable -rbac#:#org_op_view_competences#:#View competences of subordinated users###07 02 2020 new variable +rbac#:#org_op_view_certificates#:#View certificates of subordinated users +rbac#:#org_op_view_competences#:#View competences of subordinated users rbac#:#org_op_write_learning_progress#:#Définir la progression d’apprentissage des utilisateurs subalternes rbac#:#orgu_cat_administrate_users#:#L’utilisateur peut créer et administrer des comptes d’utilisateurs locaux dans cette unité organisationnelle rbac#:#orgu_copy#:#Copier Unité organisationnelle @@ -13643,19 +13645,19 @@ rbac#:#prg_manage_members#:#Gérer les membres du programme d’étude rbac#:#prg_read#:#L’utilisateur a un accès de lecture au programme d’étude rbac#:#prg_visible#:#Le programme d’étude est visible rbac#:#prg_write#:#L’utilisateur peut éditer les paramètres du programme d’étude -rbac#:#prgr_copy#:#User can copy links to study programmes###30 04 2021 new variable -rbac#:#prgr_delete#:#User can move or delete links to study programmes###30 04 2021 new variable -rbac#:#prgr_edit_permission#:#User can change permission settings###30 04 2021 new variable -rbac#:#prgr_visible#:#Links to study programmes are visible and can be used###30 04 2021 new variable -rbac#:#prgr_write#:#User can edit settings of links to study programmes###30 04 2021 new variable +rbac#:#prgr_copy#:#User can copy links to study programmes +rbac#:#prgr_delete#:#User can move or delete links to study programmes +rbac#:#prgr_edit_permission#:#User can change permission settings +rbac#:#prgr_visible#:#Links to study programmes are visible and can be used +rbac#:#prgr_write#:#User can edit settings of links to study programmes rbac#:#prgs_edit_permission#:#Modifier les paramètres de permission dans l’administration du programme d’étude rbac#:#prgs_read#:#L’utilisateur a un accès de lecture pour l’administration du programme d’étude rbac#:#prgs_visible#:#L’administration du programme d’étude est visible rbac#:#prgs_write#:#Éditer les paramètres dans l’administration du programme d’étude -rbac#:#prss_edit_permissions#:#User can change permission settings of Personal Resources administration.###30 04 2021 new variable -rbac#:#prss_read#:#User has read access to Personal Resources administration.###30 04 2021 new variable -rbac#:#prss_visible#:#Administration of Personal Resources is visible.###30 04 2021 new variable -rbac#:#prss_write#:#User can edit settings of Personal Resources administration.###30 04 2021 new variable +rbac#:#prss_edit_permissions#:#User can change permission settings of Personal Resources administration. +rbac#:#prss_read#:#User has read access to Personal Resources administration. +rbac#:#prss_visible#:#Administration of Personal Resources is visible. +rbac#:#prss_write#:#User can edit settings of Personal Resources administration. rbac#:#prtt_copy#:#L'utilisateur peut copier l'objet rbac#:#prtt_delete#:#L'utilisateur peut déplacer et supprimer l'objet rbac#:#prtt_edit_permission#:#Permissions d'administration modifiables @@ -13667,7 +13669,7 @@ rbac#:#ps_export_member_data#:#Export des données utilisateurs dans les cours e rbac#:#ps_read#:#Panneau d'administration accessible rbac#:#ps_visible#:#Panneau d'administration visible rbac#:#ps_write#:#Administration autorisée -rbac#:#push_desktop_items#:#Recommend Content###30 04 2021 new variable +rbac#:#push_desktop_items#:#Recommend Content rbac#:#qpl_copy#:#L'utilisateur peut copier l'objet rbac#:#qpl_delete#:#L'utilisateur peut déplacer et supprimer l'objet rbac#:#qpl_edit_permission#:#L'utilisateur peut modifier les permissions de l'objet @@ -13675,8 +13677,8 @@ rbac#:#qpl_read#:#L'utilisateur a accès à la banque de questions et peut les i rbac#:#qpl_visible#:#L'objet est visible rbac#:#qpl_write#:#L'utilisateur peut modifier les paramètres et éditer le contenu de l'objet rbac#:#rbac_add_new_local_role#:#Ajouter un nouveau rôle -rbac#:#rbac_add_recommended_content#:#Recommended Content###07 02 2020 new variable -rbac#:#rbac_add_recommended_content_info#:#Adds the current object '%1' for all members of the role as recommended content.###07 02 2020 new variable +rbac#:#rbac_add_recommended_content#:#Recommended Content +rbac#:#rbac_add_recommended_content_info#:#Adds the current object '%1' for all members of the role as recommended content. rbac#:#rbac_admin_permissions#:#Permissions d'administration rbac#:#rbac_auto_global#:#Rôle global généré automatiquement rbac#:#rbac_auto_local#:#Rôle local généré automatiquement @@ -13702,7 +13704,7 @@ rbac#:#rbac_create_cat#:#L'utilisateur peut créer des catégories rbac#:#rbac_create_catr#:#Créer une Référence de Catégorie rbac#:#rbac_create_chtr#:#Créer une Salle de Chat rbac#:#rbac_create_cld#:#Créer nouveau Objet Cloud -rbac#:#rbac_create_cmix#:#Create xAPI/cmi5 Object###07 02 2020 new variable +rbac#:#rbac_create_cmix#:#Create xAPI/cmi5 Object rbac#:#rbac_create_copa#:#Create Content Page rbac#:#rbac_create_crs#:#Créer un Cours rbac#:#rbac_create_crsr#:#Créer une Référence de Cours @@ -13719,13 +13721,13 @@ rbac#:#rbac_create_iass#:#Créer une évaluation individuelle rbac#:#rbac_create_itgr#:#Créer un Groupe d'Objets rbac#:#rbac_create_lm#:#Créer un Module ILIAS rbac#:#rbac_create_lso#:#Create Learning Sequence -rbac#:#rbac_create_lti#:#Create LTI Consumer###07 02 2020 new variable +rbac#:#rbac_create_lti#:#Create LTI Consumer rbac#:#rbac_create_mcst#:#Créer un Mediacast rbac#:#rbac_create_mep#:#Créer une Galerie de Médias rbac#:#rbac_create_orgu#:#Créer des unités organisationnelles rbac#:#rbac_create_poll#:#Créer un Vote rbac#:#rbac_create_prg#:#Créer un programme d’étude -rbac#:#rbac_create_prgr#:#Create link to study programme###30 04 2021 new variable +rbac#:#rbac_create_prgr#:#Create link to study programme rbac#:#rbac_create_prtt#:#Créer un Modèle de Portfolio rbac#:#rbac_create_qpl#:#Créer une Banque de Questions (Tests) rbac#:#rbac_create_rcrs#:#Créer un lien vers un Cours @@ -13743,26 +13745,26 @@ rbac#:#rbac_delete_local_policies#:#Supprimer polices locales rbac#:#rbac_delete_local_policies_info#:#Si actif, toutes les polices locales seront supprimées. Les permissions de l'objet seront réécrites et protégées. rbac#:#rbac_delete_role#:#Supprimer un rôle rbac#:#rbac_edit_condition#:#Edité Précondition -rbac#:#rbac_form_copy_roles_adjust_button#:#Rechte anpassen###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_adjust_type#:#Typ der Rechteanpassung###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_adjust_type_add#:#Rechte hinzufügen###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_adjust_type_add_info#:#Fügt MARKIERTE Rechte der ausgewählten globalen Rollenvorlage zu den lokalen Rechtevorgabe hinzu.###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_adjust_type_clone#:#Rechte kopieren###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_adjust_type_clone_info#:#Alle Rechte der ausgewählten globalen Rollenvorlage überschreiben alle lokalen Rechtevorgaben.###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_adjust_type_remove#:#Rechte entfernen###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_adjust_type_remove_info#:#Entfernt die MARKIERTEN Rechte der ausgewählten globalen Rollenvorlage aus den lokalen Rechtevorgaben.###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_add_no#:#Vorhandene Objekte NICHT anpassen###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_add_no_info#:#Vorhandene lokale Rechtevorgaben entsprechend ergänzt, die vorhandenen Objekte werden nicht in ihren Rechten angepasst.###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_add_yes#:#Vorhandene Objekte nur um ausgewählte Rechte ergänzen###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_add_yes_info#:#Vorhandene lokale Rechtevorgaben und die Rechteeinstellungen vorhandener Objekte werden entsprechend ergänzt.###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_clone_no#:#Vorhandene Objekte NICHT anpassen###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_clone_no_info#:#Vorhandene lokale Rechtevorgaben werden überschrieben, die vorhandenen Objekte werden nicht in ihren Rechten angepasst.###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_clone_yes#:#Vorhandene Objekte ändern###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_clone_yes_info#:#Vorhandene lokale Rechtevorgaben entsprechend überschreiben und IN GÄNZE mit allen gecheckten und ungecheckten Vorgaben auf vorhandene Objekte angewendet.###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_remove_no#:#Vorhandene Objekte NICHT anpassen###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_remove_no_info#:#Markierte Rechte werden aus vorhandenen lokalen Rechtevorgaben entfernt, die vorhandenen Objekte werden nicht in ihren Rechten angepasst.###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_remove_yes#:#Vorhandene Objekte nur um ausgewählte Rechte reduzieren###30 04 2021 new variable -rbac#:#rbac_form_copy_roles_ce_remove_yes_info#:#Vorhandene lokale Rechtevorgaben und die Rechteeinstellungen vorhandener Objekte werden entsprechend reduziert.###30 04 2021 new variable +rbac#:#rbac_form_copy_roles_adjust_button#:#Rechte anpassen +rbac#:#rbac_form_copy_roles_adjust_type#:#Typ der Rechteanpassung +rbac#:#rbac_form_copy_roles_adjust_type_add#:#Rechte hinzufügen +rbac#:#rbac_form_copy_roles_adjust_type_add_info#:#Fügt MARKIERTE Rechte der ausgewählten globalen Rollenvorlage zu den lokalen Rechtevorgabe hinzu. +rbac#:#rbac_form_copy_roles_adjust_type_clone#:#Rechte kopieren +rbac#:#rbac_form_copy_roles_adjust_type_clone_info#:#Alle Rechte der ausgewählten globalen Rollenvorlage überschreiben alle lokalen Rechtevorgaben. +rbac#:#rbac_form_copy_roles_adjust_type_remove#:#Rechte entfernen +rbac#:#rbac_form_copy_roles_adjust_type_remove_info#:#Entfernt die MARKIERTEN Rechte der ausgewählten globalen Rollenvorlage aus den lokalen Rechtevorgaben. +rbac#:#rbac_form_copy_roles_ce_add_no#:#Vorhandene Objekte NICHT anpassen +rbac#:#rbac_form_copy_roles_ce_add_no_info#:#Vorhandene lokale Rechtevorgaben entsprechend ergänzt, die vorhandenen Objekte werden nicht in ihren Rechten angepasst. +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#:#Vorhandene lokale Rechtevorgaben und die Rechteeinstellungen vorhandener Objekte werden entsprechend ergänzt. +rbac#:#rbac_form_copy_roles_ce_clone_no#:#Vorhandene Objekte NICHT anpassen +rbac#:#rbac_form_copy_roles_ce_clone_no_info#:#Vorhandene lokale Rechtevorgaben werden überschrieben, die vorhandenen Objekte werden nicht in ihren Rechten angepasst. +rbac#:#rbac_form_copy_roles_ce_clone_yes#:#Vorhandene Objekte ändern +rbac#:#rbac_form_copy_roles_ce_clone_yes_info#:#Vorhandene lokale Rechtevorgaben entsprechend überschreiben und IN GÄNZE mit allen gecheckten und ungecheckten Vorgaben auf vorhandene Objekte angewendet. +rbac#:#rbac_form_copy_roles_ce_remove_no#:#Vorhandene Objekte NICHT anpassen +rbac#:#rbac_form_copy_roles_ce_remove_no_info#:#Markierte Rechte werden aus vorhandenen lokalen Rechtevorgaben entfernt, die vorhandenen Objekte werden nicht in ihren Rechten angepasst. +rbac#:#rbac_form_copy_roles_ce_remove_yes#:#Vorhandene Objekte nur um ausgewählte Rechte reduzieren +rbac#:#rbac_form_copy_roles_ce_remove_yes_info#:#Vorhandene lokale Rechtevorgaben und die Rechteeinstellungen vorhandener Objekte werden entsprechend reduziert. rbac#:#rbac_global_rolt#:#Modèle de Rôle Global rbac#:#rbac_import_role#:#Importer Rôle rbac#:#rbac_info_only_position_access#:#Vous voyez uniquement les membres avec une position dans votre unité organisationnelle. Les membres avec d’autres positions organisationnelles ne sont pas affichés mais peuvent se trouver dans ce cours sans être affichés. @@ -13825,11 +13827,11 @@ rbac#:#rcrs_edit_permission#:#L'utilisateur peut modifier les permissions de l'o rbac#:#rcrs_read#:#Lire le Course-Link rbac#:#rcrs_visible#:#Le cours-link est visible rbac#:#rcrs_write#:#Modifier Course-Link -rbac#:#read_comp#:#User has read access to Competences and Competence Templates###31 03 2023 new variable +rbac#:#read_comp#:#User has read access to Competences and Competence Templates###31 10 2023 new variable rbac#:#read_learning_progress#:#Voir la progression d’apprentissage d’autres utilisateurs -rbac#:#read_outcomes#:#View learning experiences of other users###07 02 2020 new variable -rbac#:#read_profiles#:#User has read access to Competence Profiles###31 03 2023 new variable -rbac#:#read_results#:#Survey Results###07 02 2020 new variable +rbac#:#read_outcomes#:#View learning experiences of other users +rbac#:#read_profiles#:#User has read access to Competence Profiles###31 10 2023 new variable +rbac#:#read_results#:#Survey Results rbac#:#read_users#:#Lire les comptes utilisateurs locaux rbac#:#recf_edit_permission#:#Permissions d'administration modifiables rbac#:#recf_read#:#Lire les objects restaurés @@ -13900,7 +13902,7 @@ rbac#:#sess_copy#:#L'utilisateur peut copier l'objet rbac#:#sess_delete#:#Supprimer une session rbac#:#sess_edit_event#:#Modifier événements du calendrier rbac#:#sess_edit_learning_progress#:#L’utilisateur peut éditer les paramètres de progression -rbac#:#sess_edit_metadata#:#Edit Metadata###07 02 2020 new variable +rbac#:#sess_edit_metadata#:#Edit Metadata rbac#:#sess_edit_permission#:#L'utilisateur peut modifier les permissions de l'objet rbac#:#sess_manage_materials#:#Manage Session Materials rbac#:#sess_manage_members#:#Manage Participants of a Session @@ -13937,7 +13939,7 @@ rbac#:#svy_edit_permission#:#L'utilisateur peut modifier les permissions de l'ob rbac#:#svy_invite#:#L'utilisateur peut inviter des participants rbac#:#svy_read#:#L'utilisateur peut participer à l'enquête rbac#:#svy_read_learning_progress#:#L'utilisateur peut afficher les progrès d'apprentissage des autres utilisateurs -rbac#:#svy_read_results#:#User has access to survey results of others###07 02 2020 new variable +rbac#:#svy_read_results#:#User has access to survey results of others rbac#:#svy_visible#:#L'objet est visible rbac#:#svy_write#:#L'utilisateur peut modifier les paramètres et éditer le contenu de l'objet rbac#:#svyf_edit_permission#:#Permissions d'administration modifiables @@ -13952,10 +13954,10 @@ rbac#:#tags_edit_permission#:#Permissions d'administration modifiables rbac#:#tags_read#:#Panneau d'administration accessible rbac#:#tags_visible#:#Panneau d'administration visible rbac#:#tags_write#:#Administration autorisée -rbac#:#tala_edit_permission#:#User can change permission settings in Talk Templates administration###31 03 2023 new variable -rbac#:#tala_read#:#User has read access to Talk Templates administration###31 03 2023 new variable -rbac#:#tala_visible#:#Talk Templates administration is visible###31 03 2023 new variable -rbac#:#tala_write#:#User can create and edit Talk Templates###31 03 2023 new variable +rbac#:#tala_edit_permission#:#User can change permission settings in Talk Templates administration###31 10 2023 new variable +rbac#:#tala_read#:#User has read access to Talk Templates administration###31 10 2023 new variable +rbac#:#tala_visible#:#Talk Templates administration is visible###31 10 2023 new variable +rbac#:#tala_write#:#User can create and edit Talk Templates###31 10 2023 new variable rbac#:#taxs_edit_permission#:#L'utilisateur peut modifier les paramètres de permission dans l'administration de la Taxonomie rbac#:#taxs_read#:#L'utilisateur a accès en lecture à l'administration de la Taxonomie rbac#:#taxs_visible#:#L'administration de la Taxonomie est visible @@ -13980,7 +13982,7 @@ rbac#:#tst_tst_results#:#User has access to test results rbac#:#tst_tst_statistics#:#L'utilisateur a accès aux statistics du test rbac#:#tst_visible#:#L'objet est visible rbac#:#tst_write#:#L'utilisateur peut modifier les paramètres et éditer le contenu de l'objet -rbac#:#upload_blacklisted_files#:#Bypass blacklist###07 02 2020 new variable +rbac#:#upload_blacklisted_files#:#Bypass blacklist rbac#:#usrf_delete#:#Suppression des comptes utilisateurs rbac#:#usrf_edit_permission#:#Permissions d'administration modifiables rbac#:#usrf_edit_roleassignment#:#Attribution de rôles à un compte utilisateur @@ -13989,10 +13991,10 @@ rbac#:#usrf_read#:#Panneau d'administration accessible rbac#:#usrf_read_users#:#Panneau d'administration locale accessible rbac#:#usrf_visible#:#Panneau d'administration visible rbac#:#usrf_write#:#Administration autorisée -rbac#:#wbdv_edit_permissions#:#User can change permission settings of WebDAV administration.###30 04 2021 new variable -rbac#:#wbdv_read#:#User has read access to WebDAV administration.###30 04 2021 new variable -rbac#:#wbdv_visible#:#Administration of WebDAV is visible.###30 04 2021 new variable -rbac#:#wbdv_write#:#User can edit settings of WebDAV administration.###30 04 2021 new variable +rbac#:#wbdv_edit_permissions#:#User can change permission settings of WebDAV administration. +rbac#:#wbdv_read#:#User has read access to WebDAV administration. +rbac#:#wbdv_visible#:#Administration of WebDAV is visible. +rbac#:#wbdv_write#:#User can edit settings of WebDAV administration. rbac#:#wbrs_edit_permission#:#L'utilisateur peut modifier les permissions de l'objet rbac#:#wbrs_read#:#L'utilisateur a un accès en lecture à l'administration de l'objet rbac#:#wbrs_visible#:#L'administration de l'objet est visible @@ -14003,10 +14005,10 @@ rbac#:#webr_edit_permission#:#L'utilisateur peut modifier les permissions de l'o rbac#:#webr_read#:#L'utilisateur a accès aux liens Web rbac#:#webr_visible#:#L'objet est visible rbac#:#webr_write#:#L'utilisateur peut modifier les paramètres de l'objet -rbac#:#wfe_edit_permission#:#User can change permission settings of Workflow Engine administration###07 02 2020 new variable -rbac#:#wfe_read#:#User has read access to administration of Workflow Engine###07 02 2020 new variable -rbac#:#wfe_visible#:#Administration of Workflow Engine is visible###07 02 2020 new variable -rbac#:#wfe_write#:#User can edit settings of Workflow Engine administration###07 02 2020 new variable +rbac#:#wfe_edit_permission#:#User can change permission settings of Workflow Engine administration +rbac#:#wfe_read#:#User has read access to administration of Workflow Engine +rbac#:#wfe_visible#:#Administration of Workflow Engine is visible +rbac#:#wfe_write#:#User can edit settings of Workflow Engine administration rbac#:#wiki_activate_wiki_protection#:#Définir les pages Wiki en lecture seule rbac#:#wiki_copy#:#L'utilisateur peut copier l'objet rbac#:#wiki_delete#:#L'utilisateur peut déplacer et supprimer l'objet @@ -14054,7 +14056,7 @@ registration#:#reg_confirmation_hash_life_time#:#Durée de vie registration#:#reg_confirmation_hash_life_time_expired#:#Le lien de confirmation n'est plus valide. Veuillez vous enregistrer de nouveau ! registration#:#reg_confirmation_hash_life_time_info#:#Saisir la durée de vie (secondes) des liens de confirmation. registration#:#reg_confirmation_hash_not_found#:#Aucun compte utilisateur ne correspond à ce lien de confirmation. -registration#:#reg_confirmation_hash_not_passed#:#The confirmation link is incomplete.###01 02 2023 new variable +registration#:#reg_confirmation_hash_not_passed#:#The confirmation link is incomplete. registration#:#reg_confirmation_link_successful#:#Vous avez demandé un compte sur ILIAS. Vous allez recevoir un mail de confirmation d'ici peu. registration#:#reg_default#:#Défaut registration#:#reg_deleted_assignment#:#Assignation(s) supprimée(s). @@ -14128,8 +14130,8 @@ registration#:#registration_tab_codes#:#Codes d'inscription registration#:#registration_tab_settings#:#Paramètres d'inscription registration#:#registration_used#:#Date d'utilisation registration#:#registration_user_new_account_mail#:#Modifier le compte de messagerie -rep#:#btn_undelete_new_location#:#Restore (new location)###07 02 2020 new variable -rep#:#btn_undelete_origin_location#:#Restore (same location)###07 02 2020 new variable +rep#:#btn_undelete_new_location#:#Restore (new location) +rep#:#btn_undelete_origin_location#:#Restore (same location) rep#:#rep_activation_access#:#Accès rep#:#rep_activation_access_ref_info#:#Ce réglage n'affecte pas les autres références dans le catalogue. rep#:#rep_activation_availability#:#Disponibilité @@ -14141,35 +14143,35 @@ rep#:#rep_activation_online_object_info#:#Ce réglage affecte toutes les référ rep#:#rep_add_new_def_grp_assessment#:#Evaluation rep#:#rep_add_new_def_grp_communication#:#Communication rep#:#rep_add_new_def_grp_content#:#Contenu -rep#:#rep_add_new_def_grp_feedback#:#Retours et Evaluation +rep#:#rep_add_new_def_grp_feedback#:#Retours et évaluations rep#:#rep_add_new_def_grp_organisation#:#Organisation rep#:#rep_add_new_def_grp_templates#:#Modèles -rep#:#rep_add_to_favourites#:#Add to Favourites###07 02 2020 new variable -rep#:#rep_added_rec_content#:#Recommended content has been added.###07 02 2020 new variable -rep#:#rep_added_to_favourites#:#The item has been added to your favourites.###07 02 2020 new variable -rep#:#rep_allowed_types#:#Allowed Types###31 03 2023 new variable +rep#:#rep_add_to_favourites#:#Ajouter aux favoris +rep#:#rep_added_rec_content#:#Recommended content has been added. +rep#:#rep_added_to_favourites#:#The item has been added to your favourites. +rep#:#rep_allowed_types#:#Allowed Types###31 10 2023 new variable rep#:#rep_breadcr_crs#:#Breadcrumb starts with course -rep#:#rep_breadcr_crs_config#:#Configuration###24 11 2022 new variable +rep#:#rep_breadcr_crs_config#:#Configuration rep#:#rep_breadcr_crs_overwrite#:#Setting is changeable on course level rep#:#rep_breadcr_crs_overwrite_not#:#Setting is not changeable on course level -rep#:#rep_configure#:#Configure###07 02 2020 new variable -rep#:#rep_crs_default_shortened#:#Default: Breadcrumbs Shortened###24 11 2022 new variable +rep#:#rep_configure#:#Configure +rep#:#rep_crs_default_shortened#:#Default: Breadcrumbs Shortened rep#:#rep_custom_icons#:#Icônes Personnalisés rep#:#rep_default#:#Default rep#:#rep_dependencies#:#Dépendances rep#:#rep_dependency#:#Dépendance rep#:#rep_dependent_object#:#Document avec dépendance -rep#:#rep_export_limit_number#:#Number of Objects###07 02 2020 new variable -rep#:#rep_export_limitation#:#Container Export Limitation###07 02 2020 new variable -rep#:#rep_export_limitation_disabled#:#Container Export Disabled###07 02 2020 new variable -rep#:#rep_export_limitation_info#:#Limits the number of objects for container exports (courses, categories, ...) in the repository.###07 02 2020 new variable -rep#:#rep_export_limitation_limited#:#Limit Export###07 02 2020 new variable -rep#:#rep_failure_trashed_trash#:#You selected objects that cannot be restored to their original location, because their parent objects were deleted. Please uncheck the respective object in the table or select the Restore to New Location instead.###07 02 2020 new variable -rep#:#rep_fav_intro1#:#Sie haben aktuell noch keine Favoriten ausgewählt. Um dies zu tun, müssen Sie zwei Schritte machen:###07 02 2020 new variable -rep#:#rep_fav_intro2#:#Klicken Sie auf '%s' und wählen Sie aus dem verfügbaren Angebot ein Lernobjekt aus, z. B. ein Lernmodul oder ein Forum.###07 02 2020 new variable -rep#:#rep_fav_intro3#:#Wenn Sie etwas gefunden haben, das Sie interessiert, können Sie es ganz einfach zu Ihren Favoriten hinzufügen. Wählen Sie beim gewünschten Objekt im Aktionen-Menü die Option "Zu Favoriten hinzufügen".###07 02 2020 new variable -rep#:#rep_favourites#:#Favourites###09 03 2022 new variable -rep#:#rep_favourites_info#:#Users can mark single repository items as favourites. Favourites lists can be activated and configured in the dashboard and menu settings.###09 03 2022 new variable +rep#:#rep_export_limit_number#:#Number of Objects +rep#:#rep_export_limitation#:#Container Export Limitation +rep#:#rep_export_limitation_disabled#:#Container Export Disabled +rep#:#rep_export_limitation_info#:#Limits the number of objects for container exports (courses, categories, ...) in the repository. +rep#:#rep_export_limitation_limited#:#Limit Export +rep#:#rep_failure_trashed_trash#:#You selected objects that cannot be restored to their original location, because their parent objects were deleted. Please uncheck the respective object in the table or select the Restore to New Location instead. +rep#:#rep_fav_intro1#:#Vous n'avez pas encore sélectionné de favori. Pour le faire, suivez ces deux étapes : +rep#:#rep_fav_intro2#:#Cliquez sur '%s' et repérez le sujet qui vous intéresse dans l'offre disponible, par exemple un module ou un forum. +rep#:#rep_fav_intro3#:#
Cliquez sur le sujet souhaité, puis sur le menu Actions et choisissez l'option "Ajouter aux favoris". +rep#:#rep_favourites#:#Favourites +rep#:#rep_favourites_info#:#Users can mark single repository items as favourites. Favourites lists can be activated and configured in the dashboard and menu settings. rep#:#rep_intro#:#Bienvenue dans le Catalogue ILIAS ! rep#:#rep_intro1#:#Dans cette zone, vous pouvez créer des ressources pédagogiques pour tous les utilisateurs. Ces ressources sont organisées en catégories. Les catégories reflètent la structure de votre organisation (ex. départements), une hiérarchie de disciplines ou les classes d'une école. rep#:#rep_intro2#:#Trois étapes sont nécessaires pour commencer à structurer votre catalogue : @@ -14177,7 +14179,7 @@ rep#:#rep_intro3#:#Cliquer sur le bouton %s à côté de la liste de sé rep#:#rep_intro4#:#Dans le formulaire suivant, saisir un titre et une description, et cliquez sur %s. rep#:#rep_intro5#:#En cliquant sur le titre de la catégorie, vous entrez à l'intérieur de celle-ci. rep#:#rep_intro6#:#Après ces opérations, vous pourrez ajouter toutes les ressources que vous souhaitez à votre catégorie. -rep#:#rep_mo_mem_dash#:#Sie sind aktuell noch nicht Mitglied eines Kurses oder einer Gruppe.###07 02 2020 new variable +rep#:#rep_mo_mem_dash#:#Sie sind aktuell noch nicht Mitglied eines Kurses oder einer Gruppe. rep#:#rep_multiple_reference_deletion_instruction#:#Veuillez sélectionner celles que vous souhaitez aussi supprimer : rep#:#rep_multiple_reference_deletion_intro#:#D'autres références existent pour cet objet. rep#:#rep_new_item_group_add#:#Ajouter Groupe @@ -14191,24 +14193,24 @@ rep#:#rep_new_item_group_unassigned#:#Non Assigné rep#:#rep_new_item_group_unassigned_subitems#:#Nombre d'Objets Non Assignés : %s rep#:#rep_new_item_groups#:#Nouveau Groupe d'Objets rep#:#rep_new_item_menu#:#Menu "Ajouter Nouvel Objet" -rep#:#rep_no_last_visited_mess#:#You did not visited any resources yet.###30 04 2021 new variable +rep#:#rep_no_last_visited_mess#:#You did not visited any resources yet. rep#:#rep_no_permission_to_delete#:#Suppression non autorisée rep#:#rep_object_lists#:#Listes d'Objets rep#:#rep_object_references_cannot_be_read#:#Pas de permission pour les %s références. rep#:#rep_object_to_delete#:#A supprimer -rep#:#rep_rec_content_removed#:#Recommended content has been removed.###07 02 2020 new variable -rep#:#rep_recommended_content#:#Recommended Content###07 02 2020 new variable -rep#:#rep_remove_from_favourites#:#Remove from Favourites###07 02 2020 new variable -rep#:#rep_remove_rec_content#:#Are you sure you want to remove the following recommended content?###07 02 2020 new variable -rep#:#rep_removed_from_favourites#:#The item has been removed from your favourites.###07 02 2020 new variable -rep#:#rep_target_location#:#Target Location###07 02 2020 new variable -rep#:#rep_target_location_info#:#Bitte wählen Sie nun das Ziel aus, an dem die ausgewählten Objekte wiederhergestellt werden sollen.###07 02 2020 new variable +rep#:#rep_rec_content_removed#:#Recommended content has been removed. +rep#:#rep_recommended_content#:#Contenu recommandé +rep#:#rep_remove_from_favourites#:#Remove from Favourites +rep#:#rep_remove_rec_content#:#Are you sure you want to remove the following recommended content? +rep#:#rep_removed_from_favourites#:#The item has been removed from your favourites. +rep#:#rep_target_location#:#Target Location +rep#:#rep_target_location_info#:#Bitte wählen Sie nun das Ziel aus, an dem die ausgewählten Objekte wiederhergestellt werden sollen. rep#:#rep_time_period#:#Période -rep#:#rep_trash_deleted_by_unknown#:#Unknown###07 02 2020 new variable -rep#:#rep_trash_table_col_deleted_by#:#Deleted by###07 02 2020 new variable -rep#:#rep_trash_table_col_deleted_on#:#Deleted on###07 02 2020 new variable -rep#:#rep_trash_table_col_num_subs#:#Number Subitems###07 02 2020 new variable -rep#:#rep_trash_table_title#:#Deleted objects below:###07 02 2020 new variable +rep#:#rep_trash_deleted_by_unknown#:#Unknown +rep#:#rep_trash_table_col_deleted_by#:#Deleted by +rep#:#rep_trash_table_col_deleted_on#:#Deleted on +rep#:#rep_trash_table_col_num_subs#:#Number Subitems +rep#:#rep_trash_table_title#:#Deleted objects below: rep#:#rep_tree_limit#:#Limit Items in Tree rep#:#rep_tree_limit_info#:#The number of objects in the repository tree will be limited to enhance performance. rep#:#rep_tree_limit_number#:#Maximum Number @@ -14270,7 +14272,7 @@ sahs#:#sahs_std_sequencing#:#Séquencement Standard sahs#:#sahs_std_sequencing_info#:#Utiliser le séquencement standard d'ILIAS. sahs#:#sahs_unit#:#SCO sahs#:#scorm_create_export_file_html_one#:#Créer Fichier d'Export (HTML, 1 Page, Mode Révision) -sc13#:#sc13_page_type_sahs#:#SCORM Editor Page###30 04 2021 new variable +sc13#:#sc13_page_type_sahs#:#SCORM Editor Page scormdebug#:#API-call#:#Appel d’API scormdebug#:#Commit#:#Stocker données scormdebug#:#GetDiagnostic#:#Autorise le LMS (!) a définir des informations de diagnostic supplémentaires @@ -14524,7 +14526,7 @@ search#:#add_members_header#:#Ajouter Membres search#:#adv_md_search_title#:#Rechercher dans Métadonnées Etendues search#:#append_results#:#Ajouter aux résultats search#:#btn_search#:#Appliquer le Filtre -search#:#last_search_result#:#Résultat de la Dernière Recherche +search#:#last_search_result#:#Résultat de la dernière recherche search#:#lucene_activate_field#:#Activer recherche search#:#lucene_advanced_settings#:#Recherche Avancée search#:#lucene_advanced_settings_table#:#Paramètres de Recherche @@ -14564,7 +14566,7 @@ search#:#lucene_max_sub_info#:#Veuillez saisir le nombre maximum de sous-items ( search#:#lucene_more_hits_link#:#%s résultats trouvés supplémentaires... search#:#lucene_num_frag_info#:#Veuillez choisir le nombre maximum de fragments de texte mis en surbrillance. search#:#lucene_num_fragments#:#Nombre de Fragments de Texte -search#:#lucene_offline_filter#:#Statut Hors-Ligne +search#:#lucene_offline_filter#:#Statut hors-ligne search#:#lucene_or#:#OU search#:#lucene_port#:#Port search#:#lucene_prefix_wildcard#:#Requêtes avec Caractères Génériques @@ -14582,18 +14584,18 @@ search#:#lucene_tbl_create_ini#:#Créer fichier ini de serveur java search#:#search_add_members_from_container_crs#:#Ajouter Utilisateurs du Cours Courant search#:#search_add_members_from_container_grp#:#Ajouter Utilisateurs du Groupe Courant search#:#search_adv_md#:#Métadonnées Etendues -search#:#search_advanced#:#Recherche Avancée -search#:#search_all_words#:#Tous les mots (AND) +search#:#search_advanced#:#Recherche avancée +search#:#search_all_words#:#Tous les mots (AND) search#:#search_any#:#-- Sans préférence -- search#:#search_any_word#:#N'importe quel mot (OR) -search#:#search_area#:#Domaine de Recherche +search#:#search_area#:#Domaine de recherche search#:#search_area_info#:#Choisir un domaine où la recherche pourrait débuter. search#:#search_auto_complete_length#:#Nombre d'Entrées dans la Liste d'Auto-Complétion search#:#search_cdate_filter#:#Filtrer par Date de Création search#:#search_cdate_filter_info#:#Si activé, les recherches peuvent être filtrées par date de création. search#:#search_choose_object_type#:#Choisir au moins un type d'objet. search#:#search_content#:#Contenu de Page -search#:#search_created_after#:#Objets créés après +search#:#search_created_after#:#Objets créés après... search#:#search_created_before#:#Objets créés avant... search#:#search_created_on#:#Objets créés le... search#:#search_crs_title#:#Nom du Cours @@ -14601,13 +14603,13 @@ search#:#search_details_info#:#Recherche détaillée. Choisir au moins un objet search#:#search_direct#:#Recherche directe search#:#search_err_user_not_exist#:#Ce nom d'utilisateur n'existe pas. search#:#search_fast_info#:#Rechercher dans les titres, descriptions et mots-clés de tous les types d'objets -search#:#search_field#:#Search Input Field###30 04 2021 new variable -search#:#search_field_perform#:#Perform Search###31 03 2023 new variable -search#:#search_filter_by_type#:#Filtrer par Type -search#:#search_filter_cd#:#Filtrer par Date de Création +search#:#search_field#:#Champ de saisie pour la recherche +search#:#search_field_perform#:#Perform Search###31 10 2023 new variable +search#:#search_filter_by_type#:#Filtrer par type +search#:#search_filter_cd#:#Filtrer par date de création search#:#search_for_crs_members#:#Rechercher les Membres d'un Cours search#:#search_for_grp_members#:#Rechercher les Membres d'un Groupe -search#:#search_for_orgu_members#:#Search for Organisational Units###07 02 2020 new variable +search#:#search_for_orgu_members#:#Search for Organisational Units search#:#search_for_role_members#:#Rechercher des Utilisateurs par Rôle search#:#search_for_users#:#Rechercher des Utilisateurs search#:#search_grp_title#:#Nom du Groupe @@ -14620,7 +14622,7 @@ search#:#search_lom#:#Métadonnées LOM search#:#search_lucene#:#Recherche Lucene search#:#search_mime_excel#:#Fichiers Excel search#:#search_mime_filter_form#:#Filtre par Type Mime -search#:#search_mime_filter_form_info#:#Search can be restricted to the chosen mime types.###07 02 2020 new variable +search#:#search_mime_filter_form_info#:#Search can be restricted to the chosen mime types. search#:#search_mime_image#:#Images search#:#search_mime_pdf#:#Fichiers PDF search#:#search_mime_powerpoint#:#Fichiers Powerpoint @@ -14635,9 +14637,9 @@ search#:#search_no_selection#:#Vous n'avez fait aucune sélection. search#:#search_off#:#Désactivé search#:#search_option_offline#:#Hors-Ligne search#:#search_option_online#:#En-Ligne -search#:#search_results#:#Résultats de Recherche +search#:#search_results#:#Résultats de recherche search#:#search_role_title#:#Nom du Rôle -search#:#search_select_search_area#:#Choisir un Domaine de Recherche +search#:#search_select_search_area#:#Choisir un domaine de recherche search#:#search_show_inactive_user#:#Montrer les Utilisateurs Inactifs search#:#search_show_inactive_user_info#:#Si activé, les recherches affichent les utilisateurs inactifs. search#:#search_show_limited_user#:#Montrer les Utilisateurs Limités en Délai @@ -14650,26 +14652,26 @@ search#:#search_user#:#Utilisateurs search#:#search_user_extended#:#Recherche Avancée d'Utilisateurs search#:#search_user_search_form#:#Recherche d'Utilisateurs search#:#search_user_search_info_form#:#Lorsque activé, les données utilisateurs sont indexées et peuvent être recherchées. -search#:#search_users#:#Rechercher des Utilisateurs -search#:#select_orgu#:#Select Organisational Units###07 02 2020 new variable +search#:#search_users#:#Recherche d'utilisateurs +search#:#select_orgu#:#Select Organisational Units search#:#until#:#jusqu'à sess#:#il_sess_participant#:#Session Participants -sess#:#il_sess_status_open#:#Open Session###29 07 2022 new variable +sess#:#il_sess_status_open#:#Open Session sess#:#mail_sess_roles#:#Send Mail to Session Roles -sess#:#notification#:#Notification###07 02 2020 new variable +sess#:#notification#:#Notification sess#:#objs_crs_role#:#Rôles du cours sess#:#objs_grp_role#:#Rôles du groupe sess#:#send_mail_participants#:#All Participants of Session sess#:#sess_accept_request#:#Accepter la participation -sess#:#sess_assign#:#Assign###07 02 2020 new variable -sess#:#sess_bt_refuse#:#Cannot Participate###07 02 2020 new variable -sess#:#sess_change_type#:#Change Session Type###29 07 2022 new variable +sess#:#sess_assign#:#Assign +sess#:#sess_bt_refuse#:#Cannot Participate +sess#:#sess_change_type#:#Change Session Type sess#:#sess_contact#:#Contact sess#:#sess_copy#:#Copier Session sess#:#sess_filter_all_types#:#All types sess#:#sess_filter_not_assigned#:#Not Assigned sess#:#sess_import#:#Importer session -sess#:#sess_info_new_sess_type#:#New Session Type###29 07 2022 new variable +sess#:#sess_info_new_sess_type#:#New Session Type sess#:#sess_is_assigned#:#is Assigned sess#:#sess_list_reg_limit_places#:#Emplacements libres sess#:#sess_lp_preset#:#Activer la progression d’apprentissage @@ -14681,14 +14683,14 @@ sess#:#sess_mail_all_info#:#All participants can use the feature ‘Mail to Part sess#:#sess_mail_context_participant_info#:#For the participant e-mails on the participants and learning progress screens of a session sess#:#sess_mail_context_participant_title#:#Sitzung: Mail to Participants sess#:#sess_mail_permanent_link#:#Cliquez sur le lien suivant pour trouver toutes les informations dont vous avez besoin au sujet de la session: -sess#:#sess_mail_permanent_link_participants#:#Click on the following link to edit the participants of the session:###07 02 2020 new variable +sess#:#sess_mail_permanent_link_participants#:#Click on the following link to edit the participants of the session: sess#:#sess_mail_sub_acc_bod#:#Vous avez été enregistré pour la session "%s". sess#:#sess_mail_sub_acc_sub#:#Inscription à la session «%s» sess#:#sess_mail_sub_dec_bod#:#Nous sommes au regret de vous informer que votre inscription a été refusée pour la session «%s». sess#:#sess_mail_sub_dec_sub#:#Inscription refusée pour la session «%s» sess#:#sess_mail_type#:#Mail to Participants -sess#:#sess_material_assigned#:#Assigned###07 02 2020 new variable -sess#:#sess_material_not_assigned#:#Not Assigned###07 02 2020 new variable +sess#:#sess_material_assigned#:#Assigned +sess#:#sess_material_not_assigned#:#Not Assigned sess#:#sess_max_members_needed#:#Un nombre maximum de membres est nécessaire pour la fonction de liste d’attente. sess#:#sess_mem_contacts#:#Tutorial Support sess#:#sess_mem_tbl_header#:#Participants à la session @@ -14699,20 +14701,20 @@ sess#:#sess_members_print_title#:#Participants à la session sess#:#sess_msg_applicants_assigned#:#Postulant(s) inscrit(s) à la session. sess#:#sess_msg_applicants_removed#:#Postulant(s) supprimé(s) de la liste. sess#:#sess_new_registrations#:#Demande conjointe -sess#:#sess_notification_option#:#Option###07 02 2020 new variable -sess#:#sess_notification_option_inherit#:#Inherit from Parent###07 02 2020 new variable -sess#:#sess_notification_option_inherit_info#:#Use the parent notification settings (e.g. notification settings from course or group) for members of this session###07 02 2020 new variable -sess#:#sess_notification_option_manual#:#Set manually###07 02 2020 new variable -sess#:#sess_notification_option_manual_info#:#Notification setting for users has to be set manually in tab 'Participants'###07 02 2020 new variable +sess#:#sess_notification_option#:#Option +sess#:#sess_notification_option_inherit#:#Inherit from Parent +sess#:#sess_notification_option_inherit_info#:#Use the parent notification settings (e.g. notification settings from course or group) for members of this session +sess#:#sess_notification_option_manual#:#Set manually +sess#:#sess_notification_option_manual_info#:#Notification setting for users has to be set manually in tab 'Participants' sess#:#sess_open#:#Ouvrir session sess#:#sess_part_filter_participated#:#Présents uniquement sess#:#sess_part_filter_registered#:#Inscrits uniquement -sess#:#sess_part_table_excused#:#Excused###07 02 2020 new variable -sess#:#sess_participation_refused_info#:#Your participation for this event has been canceled.###07 02 2020 new variable +sess#:#sess_part_table_excused#:#Excused +sess#:#sess_participation_refused_info#:#Your participation for this event has been canceled. sess#:#sess_print_list#:#Générer liste sess#:#sess_reg_added_to_wl#:#Vous avez été ajouté à la liste d'attente. -sess#:#sess_reg_cannot_participate#:#Cannot Participate###30 04 2021 new variable -sess#:#sess_reg_cannot_participate_info#:#Users can indicate that they cannot participate in the session.###30 04 2021 new variable +sess#:#sess_reg_cannot_participate#:#Cannot Participate +sess#:#sess_reg_cannot_participate_info#:#Users can indicate that they cannot participate in the session. sess#:#sess_reg_direct#:#Direct Registration sess#:#sess_reg_direct_info#:#L'utilisateur doit cliquer sur «Joindre» pour participer à la session sess#:#sess_reg_disabled#:#No Self-enrolment @@ -14724,8 +14726,8 @@ sess#:#sess_reg_max_users_exceeded#:#Impossible de s’inscrire car le nombre ma sess#:#sess_reg_max_users_exceeded_wl#:#Le nombre maximum d'utilisateur pour cette session est dépassé. sess#:#sess_reg_request#:#Request Membership sess#:#sess_reg_request_info#:#Interested users can send a request/message to administrators. -sess#:#sess_reg_tutor#:#No Registration Possible###30 04 2021 new variable -sess#:#sess_reg_tutor_info#:#Users cannot register for this session on their own. Only administrators can register users.###30 04 2021 new variable +sess#:#sess_reg_tutor#:#No Registration Possible +sess#:#sess_reg_tutor_info#:#Users cannot register for this session on their own. Only administrators can register users. sess#:#sess_reg_type#:# Procédure d’inscription sess#:#sess_reg_waiting_list#:#Liste d’attente sess#:#sess_reg_waiting_list_autofill#:#Avec Liste d'Attente @@ -14734,17 +14736,17 @@ sess#:#sess_reg_waiting_list_no_autofill#:#Sans Liste d'Attente sess#:#sess_reg_waiting_list_no_autofill_info#:#Si le nombre maximum d’utilisateurs est dépassé, des nouvelles inscriptions seront placées dans une liste d’attente. sess#:#sess_reg_waiting_list_none#:#Aucun sess#:#sess_registered_confirm#:#The registration requires a confirmation of an administrator. You will be notified after the registration process is completed. -sess#:#sess_registration_notification#:#Notification###07 02 2020 new variable -sess#:#sess_registration_notification_info#:#Shows column in tab 'Participants' to select users being notified about new or leaving participants###07 02 2020 new variable +sess#:#sess_registration_notification#:#Notification +sess#:#sess_registration_notification_info#:#Shows column in tab 'Participants' to select users being notified about new or leaving participants sess#:#sess_section_reg#:#Paramètres d’inscription -sess#:#sess_setting_header_presentation#:#Presentation###30 04 2021 new variable +sess#:#sess_setting_header_presentation#:#Presentation sess#:#sess_show_members#:#Show Participants sess#:#sess_show_participants_info#:#If activated, session participants can access the participant gallery -sess#:#sess_title#:#Title of Session###30 04 2021 new variable +sess#:#sess_title#:#Title of Session sess#:#sess_users_added#:#Utilisateurs sélectionnés inscrits à la session. sess#:#sess_users_already_assigned#:#L’utilisateur est toujours inscrit à la session. sess#:#sess_users_removed_from_list#:#Les utilisateurs sélectionnés ont été supprimés de la liste d’attente. -sess#:#sess_warn_sess_type_changed#:#Do you really want to change the session type? All permission settings will be reset.###29 07 2022 new variable +sess#:#sess_warn_sess_type_changed#:#Do you really want to change the session type? All permission settings will be reset. shib#:#shib_activate_new#:#Nouveaux comptes avec approbation shib#:#shib_activate_new_info#:#Si cette option est validée, toute nouvelle création de compte doit être approuvée par un administrateur. shib#:#shib_add_missing#:#Assigner rôles manquants @@ -14786,31 +14788,31 @@ shib#:#shib_update_roles#:#Assignations de rôle skll#:#skll_competence_achievements#:#Nouveaux succès de compétence et évaluations skll#:#skll_intro_skill_notification_for#:#Ceci est un aperçu de vos derniers succès de compétences. skll#:#skll_lhist_skill_achieved#:#Status $4$ of $3$ was assigned in $1$. -skll#:#skll_lhist_skill_profile_fulfilled#:#Competence Profile $3$ was fulfilled.###31 03 2023 new variable -skll#:#skll_lhist_skill_self_eval#:#Status $4$ of $3$ was self-assigned.###07 02 2020 new variable -skll#:#skll_lhist_skill_self_eval_in#:#Status $4$ of $3$ was self-assigned in $1$.###07 02 2020 new variable +skll#:#skll_lhist_skill_profile_fulfilled#:#Competence Profile $3$ was fulfilled.###31 10 2023 new variable +skll#:#skll_lhist_skill_self_eval#:#Status $4$ of $3$ was self-assigned. +skll#:#skll_lhist_skill_self_eval_in#:#Status $4$ of $3$ was self-assigned in $1$. skll#:#skll_new_skill_achievements#:#Vous avez achevé de nouveaux niveaux de compétences de %1$s à %2$s: skll#:#skll_skill_notification#:#Notification de compétence skll#:#skll_skill_notification_desc#:#Informe l’utilisateur des niveaux de compétence récemment définis. skmg#:#scat#:#Catégorie de Compétence skmg#:#skll#:#Compétence de Base skmg#:#skmg_360_survey#:#Enquête 360° -skmg#:#skmg_add_assignment#:#Add Roles / Members###07 02 2020 new variable +skmg#:#skmg_add_assignment#:#Add Roles / Members skmg#:#skmg_add_level#:#Ajouter Niveau -skmg#:#skmg_add_local_profile#:#Add Local Profile###30 04 2021 new variable +skmg#:#skmg_add_local_profile#:#Add Local Profile skmg#:#skmg_add_profile#:#Ajouter Profil skmg#:#skmg_add_resource#:#Ajouter Ressource -skmg#:#skmg_add_skill#:#Ajouter Compétence -skmg#:#skmg_add_skill_tree#:#Add Competence Tree###31 03 2023 new variable -skmg#:#skmg_add_user_to_profile#:#Add users or roles to profile###07 02 2020 new variable -skmg#:#skmg_all#:#All -skmg#:#skmg_allow_local_profiles#:#Allow Creation of Local Profiles###30 04 2021 new variable -skmg#:#skmg_allow_local_profiles_info#:#Users with permission 'Edit Settings' in Courses and Groups can create local competence profiles using globally defined competences.###30 04 2021 new variable +skmg#:#skmg_add_skill#:#Ajouter une compétence +skmg#:#skmg_add_skill_tree#:#Add Competence Tree###31 10 2023 new variable +skmg#:#skmg_add_user_to_profile#:#Add users or roles to profile +skmg#:#skmg_all#:#Tout +skmg#:#skmg_allow_local_profiles#:#Allow Creation of Local Profiles +skmg#:#skmg_allow_local_profiles_info#:#Users with permission 'Edit Settings' in Courses and Groups can create local competence profiles using globally defined competences. skmg#:#skmg_ass_materials_from_workspace#:#Vous pouvez assigner des ressources (ex. fichiers de votre espace de travail au niveau de compétence). Si vous souhaitez ajouter des ressources à votre espace personnel, cliquez sur le lien suivant. skmg#:#skmg_assign_level#:#Assigner Niveau skmg#:#skmg_assign_materials#:#Assigner Ressources skmg#:#skmg_assign_user#:#Assigner Utilisateur -skmg#:#skmg_assigned_objects#:#Assigned Objects###30 04 2021 new variable +skmg#:#skmg_assigned_objects#:#Assigned Objects skmg#:#skmg_assigned_profiles#:#Profils assignés skmg#:#skmg_assigned_skill_levels#:#Niveaux de Compétence Assignés skmg#:#skmg_assigned_users#:#Utilisateurs Assignés @@ -14821,34 +14823,34 @@ skmg#:#skmg_cert_skill_trigger_title#:#Titre de Déclencheur de Compétence skmg#:#skmg_confirm_level_resources_removal#:#Souhaitez-vous vraiment supprimer ces ressources du niveau de compétences ? skmg#:#skmg_confirm_remove_level_ass#:#Souhaitez-vous vraiment supprimer ces niveaux de compétences de votre profil ? skmg#:#skmg_confirm_user_removal#:#Souhaitez-vous vraiment supprimer ces utilisateurs de ce profil ? -skmg#:#skmg_cont_profiles_info#:#In this view, you can select the competence profiles with competence entries, which are related to the currently open object (course/group). To get to the global view with all competence profiles you are assigned to and all competence entries, click on the link below.###31 08 2022 new variable -skmg#:#skmg_context_global#:#Global###30 04 2021 new variable -skmg#:#skmg_context_local#:#Local###30 04 2021 new variable -skmg#:#skmg_count_references#:#Number of referenced competences:###23 10 2023 new variable +skmg#:#skmg_cont_profiles_info#:#In this view, you can select the competence profiles with competence entries, which are related to the currently open object (course/group). To get to the global view with all competence profiles you are assigned to and all competence entries, click on the link below. +skmg#:#skmg_context_global#:#Global +skmg#:#skmg_context_local#:#Local +skmg#:#skmg_count_references#:#Number of referenced competences: skmg#:#skmg_create_sctp#:#Créer Catégorie de Modèle skmg#:#skmg_create_skill_category#:#Créer Catégorie de Compétence skmg#:#skmg_create_skill_template#:#Créer Modèle de Compétence skmg#:#skmg_create_skill_template_category#:#Créer Catégorie de Modèle de Compétence skmg#:#skmg_create_skill_template_reference#:#Créer Référence à Modèle de Compétence skmg#:#skmg_create_skll#:#Créer Compétence -skmg#:#skmg_custom_image_alt#:#Custom image for competence profile###31 03 2023 new variable +skmg#:#skmg_custom_image_alt#:#Custom image for competence profile###31 10 2023 new variable skmg#:#skmg_delete_profiles#:#Souhaitez-vous vraiment supprimer ces profils ? -skmg#:#skmg_description_info#:#The description comes from the template.###07 02 2020 new variable +skmg#:#skmg_description_info#:#The description comes from the template. skmg#:#skmg_edit_level#:#Editer Niveau skmg#:#skmg_edit_profile#:#Editer Profil skmg#:#skmg_edit_scat#:#Editer Catégorie de Compétence -skmg#:#skmg_edit_sctp#:#Edit Template Category###07 02 2020 new variable +skmg#:#skmg_edit_sctp#:#Edit Template Category skmg#:#skmg_edit_skll#:#Editer Paramètres de Compétence skmg#:#skmg_edit_sktr#:#Editer Référence à Modèle de Compétence skmg#:#skmg_enable_skmg#:#Activer la Gestion des Compétences skmg#:#skmg_eval_type_1#:#Évaluation skmg#:#skmg_eval_type_2#:#Mesure skmg#:#skmg_eval_type_3#:#Auto-évaluation -skmg#:#skmg_eval_type_latest_1#:#Latest Appraisal###31 03 2023 new variable -skmg#:#skmg_eval_type_latest_2#:#Latest Measurement###31 03 2023 new variable -skmg#:#skmg_eval_type_latest_3#:#Latest Self-Evaluation###31 03 2023 new variable +skmg#:#skmg_eval_type_latest_1#:#Latest Appraisal###31 10 2023 new variable +skmg#:#skmg_eval_type_latest_2#:#Latest Measurement###31 10 2023 new variable +skmg#:#skmg_eval_type_latest_3#:#Latest Self-Evaluation###31 10 2023 new variable skmg#:#skmg_execute_self_evaluation#:#Commencer -skmg#:#skmg_form_presentation#:#Presentation###31 03 2023 new variable +skmg#:#skmg_form_presentation#:#Presentation###31 10 2023 new variable skmg#:#skmg_from_lower_to_higher_levels#:#Veuillez classer les niveaux de compétence du plus faible vers le plus élevé, de haut en bas dans la page. skmg#:#skmg_hide_profile_self_eval#:#Masquer le profil sans auto-évaluation skmg#:#skmg_hide_profile_self_eval_info#:#Les valeurs cibles du profil ne seront pas montrées à l’utilisateur si aucune auto-évaluation n’a été faite pour une compétence spécifique. @@ -14863,21 +14865,21 @@ skmg#:#skmg_insert_template_category_from_clip#:#Insérer Catégorie de Modèle skmg#:#skmg_items#:#Eléments skmg#:#skmg_level#:#Niveau skmg#:#skmg_list_skills#:#Afficher Compétences -skmg#:#skmg_local_assignment_profiles#:#Allow Local Assignment of Global Profiles###30 04 2021 new variable +skmg#:#skmg_local_assignment_profiles#:#Allow Local Assignment of Global Profiles skmg#:#skmg_lp_triggers_level#:#Déclenché par achèvement skmg#:#skmg_materials#:#Ressources -skmg#:#skmg_materials_resources#:#Learning Materials###28 07 2023 new variable +skmg#:#skmg_materials_resources#:#Learning Materials###31 10 2023 new variable skmg#:#skmg_new_level#:#Nouveau Niveau skmg#:#skmg_new_sktr#:#Nouvelle Référence à Modèle de Compétence skmg#:#skmg_next_step#:#Etape Suivante skmg#:#skmg_no_nodes_selectable#:#Il n'y a actuellement aucune compétence sélectionnable. -skmg#:#skmg_no_skill_entries#:#You do not have any entries for this competence yet.###31 03 2023 new variable +skmg#:#skmg_no_skill_entries#:#You do not have any entries for this competence yet.###31 10 2023 new variable skmg#:#skmg_no_skills#:#Pas de Compétence -skmg#:#skmg_no_skills_selected_info#:#You have not selected or fulfilled any competences yet. Click on the "Add Competence"-button to select a competence. You can add any number of competences. If you fulfill competences by editing learning materials, they will be automatically listed here.###09 11 2022 new variable +skmg#:#skmg_no_skills_selected_info#:#Vous n'avez pas encore sélectionné ou rempli de compétences. Cliquez sur le bouton "Ajouter une compétence" pour sélectionner une compétence. Vous pouvez ajouter autant de compétences que vous le souhaitez. Si vous remplissez des compétences en éditant des contenus didactiques, elles seront automatiquement listées ici. skmg#:#skmg_no_trigger#:#Pas de Déclencheur skmg#:#skmg_nr#:#Ordre skmg#:#skmg_number#:#Nombre -skmg#:#skmg_open_all_assigned_profiles#:#Open All Assigned Competence Profiles###31 08 2022 new variable +skmg#:#skmg_open_all_assigned_profiles#:#Open All Assigned Competence Profiles skmg#:#skmg_order#:#Ordre skmg#:#skmg_order_nr#:#Numéro d'Ordre skmg#:#skmg_order_nr_info#:#Compétence des positions dans la liste des compétences. @@ -14887,10 +14889,10 @@ skmg#:#skmg_previous_step#:#Etape Précédente skmg#:#skmg_profile#:#Profil skmg#:#skmg_really_delete_levels#:#Voulez-vous vraiment supprimer les niveaux de compétence suivants ? skmg#:#skmg_really_remove_skills#:#Voulez-vous vraiment supprimer les compétences suivantes de votre liste ? -skmg#:#skmg_recommended_learning_material_crs#:#Achieve your targets in this course###28 07 2023 new variable -skmg#:#skmg_recommended_learning_material_global#:#Achieve your targets###28 07 2023 new variable -skmg#:#skmg_recommended_learning_material_grp#:#Achieve your targets in this group###28 07 2023 new variable -skmg#:#skmg_recommended_learning_material_info#:#Select exactly one of the following learning materials. Please work through it to achieve the competence target.###31 03 2023 new variable +skmg#:#skmg_recommended_learning_material_crs#:#Achieve your targets in this course###31 10 2023 new variable +skmg#:#skmg_recommended_learning_material_global#:#Achieve your targets###31 10 2023 new variable +skmg#:#skmg_recommended_learning_material_grp#:#Achieve your targets in this group###31 10 2023 new variable +skmg#:#skmg_recommended_learning_material_info#:#Select exactly one of the following learning materials. Please work through it to achieve the competence target.###31 10 2023 new variable skmg#:#skmg_refresh_view#:#Refresh skmg#:#skmg_remove_levels#:#Supprimer Niveaux skmg#:#skmg_remove_skill#:#Retirer Compétence @@ -14910,11 +14912,11 @@ skmg#:#skmg_selected_items_have_been_copied#:#Les éléments sélectionnés ont skmg#:#skmg_selected_items_have_been_cut#:#Les éléments sélectionnés ont été coupés. skmg#:#skmg_selected_skills#:#Compétences sélectionnées skmg#:#skmg_self_evaluation#:#Auto-Evaluation -skmg#:#skmg_self_evaluation_byline#:#The self-evaluation will be excluded from target achievement. It is used for your guidance.###31 03 2023 new variable +skmg#:#skmg_self_evaluation_byline#:#The self-evaluation will be excluded from target achievement. It is used for your guidance.###31 10 2023 new variable skmg#:#skmg_self_evaluations#:#Auto-Evaluations skmg#:#skmg_settings#:#Paramètres de Gestion des Compétences -skmg#:#skmg_show_all#:#Show All###31 03 2023 new variable -skmg#:#skmg_show_latest_entries#:#Show Latest Entries###31 03 2023 new variable +skmg#:#skmg_show_all#:#Show All###31 10 2023 new variable +skmg#:#skmg_show_latest_entries#:#Show Latest Entries###31 10 2023 new variable skmg#:#skmg_skill#:#Compétence skmg#:#skmg_skill_in_use#:#Cette compétence est utilisée par les utilisateurs ou par le contenu. Toutes les commandes ne sont pas disponibles. Veuillez garder à l’esprit que toute modification affectera les usages existants. skmg#:#skmg_skill_level#:#Niveau de Compétence @@ -14923,17 +14925,17 @@ skmg#:#skmg_skill_levels#:#Niveaux de Compétence skmg#:#skmg_skill_management_deactivated#:#La gestion des compétences est actuellement désactivée. skmg#:#skmg_skill_needs_impr_no_res#:#Vous devez améliorer cette compétence. Malheureusement, il n'y a actuellement aucune ressource pédagogique pour cela. skmg#:#skmg_skill_needs_impr_res#:#Vous devez améliorer cette compétence. Les ressources pédagogiques suivantes devraient vous y aider. -skmg#:#skmg_skill_needs_self_eval#:#Please conduct a self-evaluation first to see your competence target.###09 11 2022 new variable -skmg#:#skmg_skill_needs_self_eval_box#:#Please note that you have not conducted a self-evaluation for at least one competence in this profile. You will not see the competence target for the affected competences until a self-evaluation is done.###09 11 2022 new variable +skmg#:#skmg_skill_needs_self_eval#:#Please conduct a self-evaluation first to see your competence target. +skmg#:#skmg_skill_needs_self_eval_box#:#Please note that you have not conducted a self-evaluation for at least one competence in this profile. You will not see the competence target for the affected competences until a self-evaluation is done. skmg#:#skmg_skill_no_needs_impr#:#Votre niveau de compétences est suffisant pour le profil sélectionné. -skmg#:#skmg_skill_no_needs_impr_info#:#You achieved the target for this competence.###31 03 2023 new variable -skmg#:#skmg_skill_overview#:#Overview###28 07 2023 new variable -skmg#:#skmg_skill_profile_records#:#Competence Records###28 07 2023 new variable +skmg#:#skmg_skill_no_needs_impr_info#:#You achieved the target for this competence.###31 10 2023 new variable +skmg#:#skmg_skill_overview#:#Overview###31 10 2023 new variable +skmg#:#skmg_skill_profile_records#:#Competence Records###31 10 2023 new variable skmg#:#skmg_skill_profiles#:#Profils skmg#:#skmg_skill_template#:#Modèle de Compétence -skmg#:#skmg_skill_templates#:#Modèles de Compétence -skmg#:#skmg_skill_tree#:#Competence Tree###31 03 2023 new variable -skmg#:#skmg_skill_trees#:#Competence Trees###31 03 2023 new variable +skmg#:#skmg_skill_templates#:#Modèles de compétence +skmg#:#skmg_skill_tree#:#Competence Tree###31 10 2023 new variable +skmg#:#skmg_skill_trees#:#Competence Trees###31 10 2023 new variable skmg#:#skmg_skills#:#Compétences skmg#:#skmg_sktr#:#Référence à Modèle de Compétence skmg#:#skmg_status#:#Statut @@ -14947,10 +14949,10 @@ skmg#:#skmg_suggested#:#Ressource suggérée skmg#:#skmg_suggested_resources#:#Ressources Suggérées skmg#:#skmg_sure_delete_self_evaluation#:#Voulez-vous vraiment supprimer les auto-évaluations ? skmg#:#skmg_target_level#:#Niveau Ciblé -skmg#:#skmg_target_levels#:#Target Levels###30 04 2021 new variable +skmg#:#skmg_target_levels#:#Target Levels skmg#:#skmg_trigger#:#Déclencheur skmg#:#skmg_type#:#Type -skmg#:#skmg_type_of_formation#:#Type of Formation +skmg#:#skmg_type_of_formation#:#Type de formation skmg#:#skmg_update_order#:#Enregistrer l'Ordre skmg#:#skmg_usage#:#Usage skmg#:#skmg_usage_obj_objects#:#Objet(s) @@ -14963,7 +14965,7 @@ skmg#:#skmg_usage_type_info_prof#:#Utilisé dans les Profils de Compétences skmg#:#skmg_usage_type_info_res#:#Objets du Catalogue Assignés comme Ressources Suggérées skmg#:#skmg_usage_type_info_user#:#Assigné aux Utilisateurs skmg#:#skmg_your_self_evaluation#:#Votre Auto-Evaluation -style#:#Style#:#Style###07 02 2020 new variable +style#:#Style#:#Style style#:#adapt_icon#:#Adapter icône style#:#adapt_icon_description#:#Adapter les couleurs d’icônes ou changer l’icône. style#:#adapt_icons#:#Adapter les couleurs d’icônes @@ -15066,7 +15068,7 @@ style#:#sty_add_color#:#Ajouter Couleur style#:#sty_add_content_style#:#Ajouter Style de Contenu style#:#sty_add_image#:#Ajouter Image style#:#sty_add_media_query#:#Ajouter une demande de renseignement des médias -style#:#sty_add_media_query_info#:#E.g. "only screen and (max-width: 600px)" for browser window smaller than 600px or "print" for printing devices.###07 02 2020 new variable +style#:#sty_add_media_query_info#:#E.g. "only screen and (max-width: 600px)" for browser window smaller than 600px or "print" for printing devices. style#:#sty_add_pgl#:#Ajouter modèle de page style#:#sty_add_template#:#Ajouter template style#:#sty_added_characteristic#:#Classe de style ajoutée. @@ -15081,7 +15083,7 @@ style#:#sty_background_position#:#Position d'Arrière-Plan style#:#sty_background_repeat#:#Répétition d'Arrière-Plan style#:#sty_base_color#:#Couleur de base style#:#sty_based_on#:#Se baser sur -style#:#sty_bg_img_info#:#To add images to the dropdown selection please upload them in the "Images" section of the style first.###31 03 2023 new variable +style#:#sty_bg_img_info#:#To add images to the dropdown selection please upload them in the "Images" section of the style first.###31 10 2023 new variable style#:#sty_border#:#Bordure style#:#sty_border_color#:#Couleur de Bordure style#:#sty_border_style#:#Bordure du style @@ -15096,8 +15098,8 @@ style#:#sty_caption_class#:#Titre style#:#sty_carousel_templates#:#Modèles Carrousel style#:#sty_cat_assignments#:#Style/Assignations de Catégories style#:#sty_characteristic_already_exists#:#Une classe avec ce titre existe déjà dans ce style. -style#:#sty_class#:#Style Class###31 03 2023 new variable -style#:#sty_class_name#:#Class Name###31 03 2023 new variable +style#:#sty_class#:#Style Class###31 10 2023 new variable +style#:#sty_class_name#:#Class Name###31 10 2023 new variable style#:#sty_clear#:#CSS "Clear" style#:#sty_col_foot_class#:#Pied de colonne style#:#sty_col_head_class#:#En-tête de colonne @@ -15117,9 +15119,9 @@ style#:#sty_confirm_template_deletion#:#Confirmer la suppression de template style#:#sty_copied_please_select_target#:#Les classes de style ont été copiées. Veuillez ouvrir le style cible et cliquer "Coller classes de style". style#:#sty_copy_other_stylesheet#:#Copier Style depuis une Source Locale style#:#sty_copy_other_system_style#:#Clone an existing system style. -style#:#sty_copy_to#:#to:###30 04 2021 new variable +style#:#sty_copy_to#:#to: style#:#sty_create_ind_style#:#Créer Style Individuel -style#:#sty_create_new_class#:#Create new style class###31 03 2023 new variable +style#:#sty_create_new_class#:#Create new style class###31 10 2023 new variable style#:#sty_create_new_stylesheet#:#Créer Nouveau Style style#:#sty_create_new_system_style#:#Create a new system style. style#:#sty_create_new_system_sub_style#:#Create a new system sub style. @@ -15201,15 +15203,15 @@ style#:#sty_odd_row_class#:#Lignes impaires style#:#sty_opacity#:#Opacité style#:#sty_opt_saved#:#Options enregistrées style#:#sty_order#:#Ordre -style#:#sty_outdated#:#Outdated###31 03 2023 new variable +style#:#sty_outdated#:#Outdated###31 10 2023 new variable style#:#sty_overflow#:#Dépasser style#:#sty_overwrite#:#Ecraser -style#:#sty_overwrite_existing_class#:#Overwrite existing style class###31 03 2023 new variable +style#:#sty_overwrite_existing_class#:#Overwrite existing style class###31 10 2023 new variable style#:#sty_padding#:#Espacement style#:#sty_page_char#:#Page -style#:#sty_parameters#:#Parameters###31 03 2023 new variable +style#:#sty_parameters#:#Parameters###31 10 2023 new variable style#:#sty_paste_characteristics#:#Coller classes de style -style#:#sty_paste_chars#:#Paste Classes###31 03 2023 new variable +style#:#sty_paste_chars#:#Paste Classes###31 10 2023 new variable style#:#sty_paste_style_classes#:#Coller classes de style style#:#sty_position#:#Position style#:#sty_positioning#:#Positionnement @@ -15218,22 +15220,22 @@ style#:#sty_query#:#Question style#:#sty_question_char#:#Question style#:#sty_remove_global_default_state#:#Ne Plus Définir Comme Style par Défaut style#:#sty_remove_global_fixed_state#:#Ne Plus Imposer ce Style -style#:#sty_remove_outdated#:#Remove Outdated Status###31 03 2023 new variable -style#:#sty_resize#:#Resize###31 03 2023 new variable -style#:#sty_resize_image#:#Resize Image###31 03 2023 new variable +style#:#sty_remove_outdated#:#Remove Outdated Status###31 10 2023 new variable +style#:#sty_resize#:#Resize###31 10 2023 new variable +style#:#sty_resize_image#:#Resize Image###31 10 2023 new variable style#:#sty_right#:#Droite style#:#sty_row_foot_class#:#Ligne de pied de page style#:#sty_row_head_class#:#Ligne d'en-tête style#:#sty_rte_char#:#SCORM RTE style#:#sty_save_active_styles#:#Enregistrer Styles Actifs -style#:#sty_save_hide_order_status#:#Save Order and Hidden Status###31 03 2023 new variable +style#:#sty_save_hide_order_status#:#Save Order and Hidden Status###31 10 2023 new variable style#:#sty_save_hide_status#:#Enregistrer le statut Masquer style#:#sty_save_order#:#Enregistrer l'ordre -style#:#sty_save_order_status#:#Save Order###31 03 2023 new variable +style#:#sty_save_order_status#:#Save Order###31 10 2023 new variable style#:#sty_sco_char#:#SCO & Objectif style#:#sty_scope#:#Portée style#:#sty_section_char#:#Section -style#:#sty_set_outdated#:#Set Outdated###31 03 2023 new variable +style#:#sty_set_outdated#:#Set Outdated###31 10 2023 new variable style#:#sty_set_scope#:#Définir Portée du Style style#:#sty_some_styles_obligatory_delete_rest#:#Les classes de style suivantes sont obligatoirement et ne peuvent être supprimées. Désirez-vous continuer et supprimer les classes de style restantes sélectionnées ? style#:#sty_source#:#Source @@ -15265,7 +15267,7 @@ style#:#sty_text_decoration#:#Décoration de texte style#:#sty_text_indent#:#Indentation de texte style#:#sty_text_inline_char#:#Texte (Caractère) style#:#sty_text_transform#:#Transformation de texte -style#:#sty_titles#:#Titles###31 03 2023 new variable +style#:#sty_titles#:#Titles###31 10 2023 new variable style#:#sty_to#:#Vers style#:#sty_top#:#Haut style#:#sty_top_bottom_padding#:#Haut/bas espacement de cellule @@ -15276,8 +15278,8 @@ style#:#sty_type_ca_cntr#:#Conteneur Carrousel style#:#sty_type_ca_icntr#:#Conteneur d’articles Carrousel style#:#sty_type_ca_icont#:#Contenu d’articles Carrousel style#:#sty_type_ca_ihead#:#En-tête d’article Carrousel -style#:#sty_type_code_block#:#Code (Block)###07 02 2020 new variable -style#:#sty_type_code_inline#:#Code (Inline)###07 02 2020 new variable +style#:#sty_type_code_block#:#Code (Block) +style#:#sty_type_code_inline#:#Code (Inline) style#:#sty_type_flist#:#Liste de fichier style#:#sty_type_flist_a#:#Lien de l'item de la liste de fichier style#:#sty_type_flist_cont#:#Conteneur de la liste de fichier @@ -15374,7 +15376,7 @@ style#:#sty_white_space#:#Espace blanc style#:#sty_width#:#Largeur style#:#sty_width_height#:#Largeur x hauteur style#:#sty_word_spacing#:#Espacement de mot -style#:#style#:#Style +style#:#style#:#Style###31 10 2023 new variable style#:#style_assignments_deleted#:#Les affectations de styles du sous-style suivant ont été supprimés: style#:#style_copied#:#Le style a été copié avec succès. style#:#style_current_style#:#Style Actuel @@ -15387,11 +15389,11 @@ style#:#style_imported#:#Le style a été importé avec succès dans: style#:#style_name#:#Nom du style style#:#style_name_description#:#Le nom du style peut être utilisé pour décrire la zone d’application du style sous forme humainement lisible. Il apparaîtra dans tous les éléments d’interface utilisateur permettant de sélectionner les styles. style#:#style_not_deleted#:#Le style n’a pas pu être supprimé pour les raisons suivantes: -style#:#style_page_layout_module_learning_module#:#ILIAS Learning Module###07 02 2020 new variable +style#:#style_page_layout_module_learning_module#:#ILIAS Learning Module style#:#style_page_layout_module_portfolio#:#Portfolio style#:#style_page_layout_module_scorm#:#SCORM -style#:#style_support_reuse#:#Re-Use###31 03 2023 new variable -style#:#style_support_reuse_info#:#Allow sub-objects of the current container to re-use this content style.###31 03 2023 new variable +style#:#style_support_reuse#:#Re-Use###31 10 2023 new variable +style#:#style_support_reuse_info#:#Allow sub-objects of the current container to re-use this content style.###31 10 2023 new variable style#:#styles_not_deleted#:#Les styles n’ont pas pu être supprimés pour les raisons suivantes: style#:#sub_style#:#Sous-style style#:#sub_style_id#:#ID du sous style @@ -15409,25 +15411,25 @@ style#:#update_variables#:#Mettre les variables à jour style#:#usages#:#Usages: style#:#used_colors#:#Couleurs utilisées: style#:#zip_export_failed#:#L’exportation ZIP a échouée. L’erreur suivante est survenue: -survey#:#SurveyMatrixQuestion#:#Question à matrice -survey#:#SurveyMetricQuestion#:#Question Numérique +survey#:#SurveyMatrixQuestion#:#Question matrice +survey#:#SurveyMetricQuestion#:#Question métrique survey#:#SurveyMultipleChoiceQuestion#:#Question à choix multiples (QCM) survey#:#SurveySingleChoiceQuestion#:#Question à choix unique (QCU) -survey#:#SurveyTextQuestion#:#Rédaction +survey#:#SurveyTextQuestion#:#Texte libre survey#:#add_heading#:#Ajouter Introduction survey#:#add_material#:#Ajouter de la matière survey#:#add_phrase#:#Ajouter Modèle de Réponse survey#:#adm_no_special_users#:#Pas d'utilisateurs spéciaux définis capables d'exécuter l'enquête plus d'une fois. -survey#:#already_completed_survey#:#Vous avez déjà répondu à l'enquête ! Vous ne pouvez pas y répondre à nouveau. +survey#:#already_completed_survey#:#Vous avez déjà répondu au sondage ! Vous ne pouvez pas y répondre à nouveau. survey#:#anonymization#:#Anonymat -survey#:#anonymize_anonymous_introduction#:#Cette enquête préserve l'anonymat. Pour avoir accès à l'enquête, vous devez utiliser un code de 5 caractères que le créateur ou responsable de l'enquête a dû vous envoyer.
Veuillez entrer ce code dans le champ ci-dessous. +survey#:#anonymize_anonymous_introduction#:#Ce sondage préserve l'anonymat. Pour avoir accès au sondage, vous devez utiliser un code de 5 caractères que le créateur ou responsable du sondage a dû vous envoyer.
Veuillez entrer ce code dans le champ ci-dessous. survey#:#answer#:#Réponse survey#:#apply#:#Appliquer -survey#:#arithmetic_mean#:#Moyenne Arithmétique -survey#:#back#:#<< Retour +survey#:#arithmetic_mean#:#Moyenne arithmétique +survey#:#back#:#« Retour survey#:#before#:#avant survey#:#browse_for_questions#:#Ajouter depuis la Banque -survey#:#cancel_survey#:#Suspendre l'Enquête +survey#:#cancel_survey#:#Suspendre le sondage survey#:#cannot_manage_phrases#:#Vous n'avez pas les permissions nécessaires pour gérer les modèles de réponse ! survey#:#cannot_participate_survey#:#Vous n'avez pas le droit de participer à l'enquête ! survey#:#cannot_read_survey#:#Vous n'avez pas les permissions nécessaires pour lire les données de l'enquête ! @@ -15532,7 +15534,7 @@ survey#:#edit_heading#:#Editer Titre survey#:#edit_phrase#:#Modifier phrase survey#:#end_date#:#Date de Fin survey#:#end_date_reached#:#Vous ne pouvez pas commencer l'enquête. La date de fin est dépassée. -survey#:#enter_anonymous_id#:#Code d'Accès à l'Enquête +survey#:#enter_anonymous_id#:#Code d'accès au sondage survey#:#enter_phrase_title#:#Veuillez saisir un titre de modèle de réponse survey#:#enter_valid_number_of_codes#:#Veuillez saisir un nombre valide pour générer des codes d'accès à l'enquête. survey#:#err_external_rcp_no_email#:#Les données d'import doivent au moins contenir une zone 'email' @@ -15546,13 +15548,13 @@ survey#:#err_no_pool_name#:#Veuillez saisir le titre du jeu de question (enquêt survey#:#error_retrieving_anonymous_survey#:#Le système n'a pas trouvé vos données d'enquête pour le code %s. Veuillez vérifier le code d'enquête que vous avez saisi. survey#:#error_save_code#:#Valeur non sauvegardée correctement. L’e- mail: «%s» n’est pas valide. Prénom: «%s», nom de famille: «%s».
survey#:#evaluation#:#Résultats -survey#:#evaluation_access#:#Accès aux Résultats +survey#:#evaluation_access#:#Accès aux résultats survey#:#evaluation_access_all#:#Accès aux Résultats pour Tous les Utilisateurs -survey#:#evaluation_access_info#:#Vous avez accès aux résultats de l'enquête +survey#:#evaluation_access_info#:#Vous avez accès aux résultats du sondage survey#:#evaluation_access_off#:#Désactivé survey#:#evaluation_access_participants#:#Accès aux Résultats pour les Participants à l'Enquête survey#:#existing_constraints#:#Préconditions Existantes -survey#:#exp_type_csv#:#Valeurs Séparées par des Virgules (CSV) +survey#:#exp_type_csv#:#Valeurs séparées par des virgules (CSV) survey#:#exp_type_excel#:#Microsoft Excel survey#:#export_all_survey_codes#:#Exporter tous les Codes d'Accès survey#:#export_label_only#:#Exporter uniquement libellé @@ -15567,9 +15569,9 @@ survey#:#filter#:#Filtre survey#:#filter_all_question_types#:#Toutes les Types de Questions survey#:#filter_all_questionpools#:#Toutes les Banques de Questions survey#:#finished_mail_subject#:#L'enquête est achevée -survey#:#freetext_answers#:#Réponses Ouvertes +survey#:#freetext_answers#:#Réponses ouvertes survey#:#geometric_mean#:#Moyenne Géométrique -survey#:#given_answers#:#Réponses Fournies +survey#:#given_answers#:#Réponses fournies survey#:#glossary_term#:#Terme du Glossaire survey#:#harmonic_mean#:#Moyenne Harmonique survey#:#heading#:#Titre @@ -15587,7 +15589,7 @@ survey#:#insert_missing_question#:#Veuillez sélectionner au moins une question survey#:#insert_missing_questionblock#:#Veuillez sélectionner au moins un bloc de questions pour l'ajouter dans l'enquête. survey#:#insert_saved_message#:#Ajouter texte de message survey#:#internal_link#:#Lien interne -survey#:#introduction#:#Message d'Introduction +survey#:#introduction#:#Message d'introduction survey#:#invited_users#:#Utilisateurs Invités survey#:#label#:#Etiquette survey#:#label_info#:#Etiquette alternative pour traitement de données supplémentaires (e.g. dans SPSS) @@ -15647,8 +15649,8 @@ survey#:#metric_subtype_description_interval#:#Les valeurs négatives et décima survey#:#metric_subtype_description_ratioabsolute#:#La mesure absolue du ratio utilise des nombres naturels (virgule après le zéro). Par exemple le nombre d'enfants dans une famille ou une probabilité. survey#:#metric_subtype_description_rationonabsolute#:#Seules les valeurs positives sont autorisées (0 inclus). Les valeurs décimales sont aussi autorisées. Exemple : une mesure en cm. survey#:#minimum#:#Valeur Minimale -survey#:#mode#:#Valeur la Plus Choisie -survey#:#mode_nr_of_selections#:#Nombre de Fois +survey#:#mode#:#Valeur la plus choisie +survey#:#mode_nr_of_selections#:#Nombre de fois survey#:#mode_text#:#Valeur la Plus Choisie (Texte) survey#:#msg_deleted_export_files#:#Fichier(s) d'export supprimé(s) survey#:#msg_duplicate_scale#:#Veuillez saisir des valeurs uniques d'échelle @@ -15711,7 +15713,7 @@ survey#:#question_mr_not_checked#:#Veuillez cocher au moins une des réponses pr survey#:#question_not_checked#:#Veuillez cocher une des réponses proposées ! survey#:#question_obligatory#:#La question est obligatoire ! survey#:#question_sr_no_other_answer_checked#:#Pour saisir un texte pour une réponse, sélectionner le bouton radio -survey#:#question_type#:#Type de Question +survey#:#question_type#:#Type de question survey#:#questionblock#:#Bloc de Questions survey#:#questionblock_inserted#:#Bloc de question ajouté survey#:#questionblocks#:#Blocs de Questions @@ -15727,7 +15729,7 @@ survey#:#remove_question#:#Retirer survey#:#remove_questions#:#Etes-vous sûr de vouloir supprimer les questions et/ou blocs de questions suivants de l'enquête ? survey#:#reset_filter#:#Réinitialiser Filtre survey#:#results#:#Résultats -survey#:#resume_survey#:#Reprendre le Questionnaire +survey#:#resume_survey#:#Reprendre le sondage survey#:#row_text#:#Texte de ligne survey#:#save_obligatory_state#:#Enregistrer Obligations et Classement survey#:#save_phrase#:#Enregistrer comme Modèle de Réponse @@ -15803,18 +15805,18 @@ survey#:#survey_360_raters_status_info#:#Les évaluateurs ont terminé survey#:#survey_360_remove_appraisees#:#Supprimer Participant(s) survey#:#survey_360_results#:#Accès Aux Résultats par les Participants survey#:#survey_360_results_all#:#A Tous les Participants -survey#:#survey_360_results_all_info#:#todo11 +survey#:#survey_360_results_all_info#:#Toutes les personnes évaluées dans le cadre de l'enquête à 360° peuvent consulter tous les commentaires fournis par tous les évaluateurs de toutes les personnes évaluées, et pas seulement par leurs propres évaluateurs. survey#:#survey_360_results_none#:#Aucun -survey#:#survey_360_results_none_info#:#todo9 +survey#:#survey_360_results_none_info#:#Les personnes évaluées ne peuvent pas accéder au retour d'information fourni par les évaluateurs. survey#:#survey_360_results_own#:#Aux Auto-Evaluateurs -survey#:#survey_360_results_own_info#:#todo10 +survey#:#survey_360_results_own_info#:#Les évalués ne peuvent accéder qu'aux commentaires de leurs propres évaluateurs. survey#:#survey_360_select_appraisee#:#Selectionner survey#:#survey_360_self_appraisee#:#Les Utilisateurs Peuvent s'Ajouter Comme Participants -survey#:#survey_360_self_appraisee_info#:#todo8 +survey#:#survey_360_self_appraisee_info#:#Dans l'onglet « Info », un lien est affiché pour tous les utilisateurs. En cliquant sur ce lien, ils peuvent s'ajouter en tant qu'évalués et recevoir un retour d'information. survey#:#survey_360_self_evaluation#:#Les Participants Peuvent S'Auto-Evaluer -survey#:#survey_360_self_evaluation_info#:#todo6 +survey#:#survey_360_self_evaluation_info#:#Les évalués sont autorisés à s'auto-évaluer à l'aide des questions. survey#:#survey_360_self_raters#:#Les Participants Peuvent Gérer leurs Evaluateurs -survey#:#survey_360_self_raters_info#:#todo7 +survey#:#survey_360_self_raters_info#:#Les évalués choisissent et invitent de manière autonome les personnes qui sont censées leur fournir un retour d'information. survey#:#survey_360_sure_appraisee_close#:#Etes-vous sûr de vouloir fermer l'évaluation à tous vos évaluateurs ? survey#:#survey_360_sure_appraisee_close_admin#:#Etes-vous sûr de vouloir fermer l'évaluation aux participants suivants ? survey#:#survey_360_sure_delete_appraises#:#Etes-vous sûr de vouloir supprimer les participants suivants ? @@ -15822,7 +15824,7 @@ survey#:#survey_360_sure_delete_raters#:#Etes-vous sûr de vouloir supprimer les survey#:#survey_access_codes#:#Authentification par codes d’accès survey#:#survey_access_codes_info#:#Users get access to the survey by entering a code on the 'Info'-tab. These access codes are generated in a sub-tab 'Access Codes' in the tab 'Participants'. survey#:#survey_activate_skill_service#:#Activer le Service Compétences -survey#:#survey_activate_skill_service_info#:#todo12 +survey#:#survey_activate_skill_service_info#:#Un nouvel onglet "Compétences" s'affiche. Dans cet onglet, les questions sont assignées aux compétences, puis des seuils sont attribués pour atteindre un niveau spécifique d'une compétence. survey#:#survey_add_new_question#:#Ajouter une nouvelle question survey#:#survey_assign_competence#:#Assigner Compétence survey#:#survey_at_beginning#:#Au Début @@ -15832,8 +15834,8 @@ survey#:#survey_behind_page#:#Derrière survey#:#survey_block_hidden#:#caché survey#:#survey_block_visible#:#visible survey#:#survey_calc_skills#:#Déterminer Niveaux de Compétences -survey#:#survey_calculate_sum_score#:#Calculate Sum Score###30 04 2021 new variable -survey#:#survey_calculate_sum_score_info#:#Calculates the sum of all scale values for single choice, multiple choice and matrix questions for each participant. Caution: If participants skip these kind of questions, the whole sum score will not be calculated anymore.###30 04 2021 new variable +survey#:#survey_calculate_sum_score#:#Calculate Sum Score +survey#:#survey_calculate_sum_score_info#:#Calculates the sum of all scale values for single choice, multiple choice and matrix questions for each participant. Caution: If participants skip these kind of questions, the whole sum score will not be calculated anymore. survey#:#survey_cancel_preview#:#Sortir de la prévisualisation survey#:#survey_cannot_preview_survey#:#Prévisualisation non disponible survey#:#survey_clipboard_notice#:#Il y a des questions dans le presse-papier. Sélectionnez la position cible ou videz le presse-papier. @@ -15861,11 +15863,11 @@ survey#:#survey_edit_heading#:#Editer Introduction survey#:#survey_edit_settings#:#Modifier les paramètres survey#:#survey_error_insert_incomplete_question#:#Vous avez tenté d'ajouter une question incomplète à l'enquête. La question n'a pas été ajoutée. survey#:#survey_execution_exit#:#Retour au Catalogue -survey#:#survey_execution_exit_360#:#Back###31 03 2023 new variable +survey#:#survey_execution_exit_360#:#Back###31 10 2023 new variable survey#:#survey_execution_sure_finish#:#Êtes-vous sûr de vouloir finir cette enquête? Vous ne serez pas capable d’éditer vos réponses par la suite. survey#:#survey_existing_pool#:#Utiliser le réservoir de questions existant survey#:#survey_finish#:#Terminer le Questionnaire -survey#:#survey_finished#:#Le questionnaire est terminé. Merci de votre participation ! +survey#:#survey_finished#:#Le sondage est terminé. Merci de votre participation ! survey#:#survey_has_datasets_warning#:#L'enquête contient déjà des réponses. Vous ne pouvez pas modifier les questions de l'enquête tant que vous n'avez pas supprimé ces réponses dans l'onglet " maintenance ". survey#:#survey_has_datasets_warning_page_view#:#L'enquête contient déjà des réponses. Vous ne pouvez pas éditer les questions de l'enquête tant que vous n'avez pas supprimé ces réponses. survey#:#survey_has_datasets_warning_page_view_link#:#Editer Participants @@ -15881,7 +15883,7 @@ survey#:#survey_not_available#:#n/a survey#:#survey_notification_finished_introduction#:#L'utilisateur suivant a terminé son évaluation. survey#:#survey_notification_finished_reason#:#Vous recevez cet email car vous avez activé les notifications pour l'évaluation suivante. survey#:#survey_notification_target_group#:#Groupe Ciblé -survey#:#survey_notification_target_group_invited#:#All users manually invited to the survey###30 04 2021 new variable +survey#:#survey_notification_target_group_invited#:#All users manually invited to the survey survey#:#survey_notification_target_group_invited_info#:#Utilisateurs actuellement invités : %s survey#:#survey_notification_target_group_parent_course#:#Tous les membres des cours/groupes parents survey#:#survey_notification_target_group_parent_course_inactive#:#Aucun cours/groupe parent fourni - aucun rappel ne sera envoyé ! @@ -15916,7 +15918,7 @@ survey#:#survey_questions_to_clipboard_copy#:#Les questions ont été copiées d survey#:#survey_questions_to_clipboard_cut#:#Les questions ont été copiées dans le presse-papier. Veuillez sélectionner une cible ou vider le presse-papier. survey#:#survey_reached_level#:#Niveau Atteint survey#:#survey_reminder_body#:#Vous n'avez pas encore terminé l'évaluation suivante. -survey#:#survey_reminder_cron#:#Remind users to participate / Send results to tutors###30 04 2021 new variable +survey#:#survey_reminder_cron#:#Remind users to participate / Send results to tutors survey#:#survey_reminder_cron_info#:#Lorsque activé, les utilisateurs sont incités à participer aux enquêtes. survey#:#survey_reminder_end#:#Fin survey#:#survey_reminder_frequency#:#Fréquence @@ -15929,14 +15931,14 @@ survey#:#survey_reminder_subject#:#L'évaluation "%s" n'est pas terminée survey#:#survey_remove_competence#:#Supprimer Compétence survey#:#survey_results_anonymization#:#Vie privée survey#:#survey_results_anonymized#:#Without Names -survey#:#survey_results_anonymized_info#:#In the tab 'Results' participants' names are replaced by codes. Users having acces to this tab cannot attribute answers to named participants but only to user "iTXaF" (example). +survey#:#survey_results_anonymized_info#:#Dans l'onglet 'Résultats', les noms des participants sont remplacés par des codes. Les utilisateurs ayant accès à cet onglet ne peuvent pas attribuer les réponses aux participants nommés mais seulement à l'utilisateur "iTXaF" (exemple). survey#:#survey_results_finished#:#Enquête terminée survey#:#survey_results_not_started#:#Enquête pas commencée survey#:#survey_results_personalized#:#Avec noms survey#:#survey_results_personalized_info#:#Dans l'onglet "Résultats", les noms des participants et leurs réponses respectives sont répertoriés. Les utilisateurs ayant accès à cet onglet peuvent inspecter qui a fourni quelle réponse. survey#:#survey_results_started#:#Enquête commencée -survey#:#survey_results_tutor_body#:#Attached you will find the detailed results for the following survey###07 02 2020 new variable -survey#:#survey_results_tutor_subject#:#Results for survey "%s"###07 02 2020 new variable +survey#:#survey_results_tutor_body#:#Attached you will find the detailed results for the following survey +survey#:#survey_results_tutor_subject#:#Results for survey "%s" survey#:#survey_show_blocktitle#:#Afficher le Titre de Bloc survey#:#survey_show_blocktitle_description#:#Lorsque activé, le titre de bloc est affiché dans le questionnaire survey#:#survey_skill#:#Compétence @@ -15945,7 +15947,7 @@ survey#:#survey_skill_level#:#Niveau de Compétence survey#:#survey_skill_max_scale_points#:#Points Max. survey#:#survey_skill_nr_q#:#Nombre de Questions survey#:#survey_skill_thresholds#:#Seuil de Compétence -survey#:#survey_start#:#Aller à la Première Page +survey#:#survey_start#:#Aller à la première page survey#:#survey_sum_of_means#:#Somme des Moyennes Arithmétiques par Question survey#:#survey_sure_delete_constraint#:#Êtes-vous sûr de vouloir supprimer la règle d’acheminement «%1$s» pour la question «%2$s»? survey#:#survey_sure_delete_questions#:#Etes-vous sûr de vouloir supprimer les questions ou introductions suivantes ? @@ -15960,10 +15962,10 @@ survey#:#survey_using_template#:#Cette enquête utilise le modèle %s. Si vous n survey#:#survey_using_template_link#:#Ne plus utiliser de modèle survey#:#svy_activation_limited_visibility_info#:#Lorsque choisi, l'enquête est visible y compris en dehors de la période d'accès. survey#:#svy_activation_online_info#:#Activer ce paramètre pour rendre l'enquête accessible aux utilisateurs. -survey#:#svy_add_internal_user#:#Add User###31 03 2023 new variable -survey#:#svy_add_internal_user_info#:#The rater has a registered user on this platform.###31 03 2023 new variable -survey#:#svy_add_rater#:#Add Rater###31 03 2023 new variable -survey#:#svy_all_raters#:#All Raters###31 03 2023 new variable +survey#:#svy_add_internal_user#:#Add User###31 10 2023 new variable +survey#:#svy_add_internal_user_info#:#The rater has a registered user on this platform.###31 10 2023 new variable +survey#:#svy_add_rater#:#Add Rater###31 10 2023 new variable +survey#:#svy_all_raters#:#All Raters###31 10 2023 new variable survey#:#svy_all_survey_competences#:#Toutes les Compétences survey#:#svy_all_user_data_deleted#:#Toutes les données utilisateurs de cette enquête ont été supprimées ! survey#:#svy_analysis#:#Analyse @@ -15973,27 +15975,27 @@ survey#:#svy_anonymous_participants_min#:#Nombre minium de participants survey#:#svy_anonymous_participants_min_info#:#La liste sera uniquement disponible si le nombre minimum de participants est atteint. survey#:#svy_anonymous_participants_svy#:#Liste de participants survey#:#svy_anonymous_participants_svy_info#:#Si cette option est activée, une liste de participants est disponible après la date de fin. -survey#:#svy_answer_too_long#:#Your current answer is too long (%s characters). Please shorten your answer.###07 02 2020 new variable -survey#:#svy_app_see_rater_info#:#Appraisees can access rater information in the results screens, including names and e-mail addresses, if entered before when adding raters.###31 03 2023 new variable -survey#:#svy_appraisses_cannot_be_raters#:#User cannot be added as rater. Use self evaluation option in the survey settings instead.###07 02 2020 new variable +survey#:#svy_answer_too_long#:#Your current answer is too long (%s characters). Please shorten your answer. +survey#:#svy_app_see_rater_info#:#Appraisees can access rater information in the results screens, including names and e-mail addresses, if entered before when adding raters.###31 10 2023 new variable +survey#:#svy_appraisses_cannot_be_raters#:#User cannot be added as rater. Use self evaluation option in the survey settings instead. survey#:#svy_back#:#Retour -survey#:#svy_chart_download#:#Download Chart###07 02 2020 new variable +survey#:#svy_chart_download#:#Download Chart survey#:#svy_check_evaluation_access_introduction#:#Vous devez saisir votre code d'accès pour ouvrir le questionnaire. survey#:#svy_check_evaluation_authentication_needed#:#Authentification requise survey#:#svy_check_evaluation_wrong_key#:#Vous avez saisi un code d'accès erroné ou bien n'avez pas participé à l'enquête. L'accès vous est donc refusé. -survey#:#svy_compress_view#:#Compressed View###30 04 2021 new variable -survey#:#svy_compress_view_info#:#If activated, all single choice questions with similar scales will be presented matrix-like.###30 04 2021 new variable +survey#:#svy_compress_view#:#Compressed View +survey#:#svy_compress_view_info#:#If activated, all single choice questions with similar scales will be presented matrix-like. survey#:#svy_copy#:#Copier Enquête survey#:#svy_create_question#:#Créer une question survey#:#svy_delete_all_user_data#:#Supprimer Toutes les Données Utilisateurs -survey#:#svy_dont_send#:#Don't send a message###31 03 2023 new variable +survey#:#svy_dont_send#:#Don't send a message###31 10 2023 new variable survey#:#svy_eval_captions#:#Chiffres survey#:#svy_eval_captions_abs#:#Absolus survey#:#svy_eval_captions_abs_perc#:#Absolus et pourcentage survey#:#svy_eval_captions_perc#:#Pourcentage survey#:#svy_eval_competences#:#Résultats de Compétence -survey#:#svy_eval_cumulated#:#Résultats Cumulés -survey#:#svy_eval_detail#:#Résultats Cumulés (Détails) +survey#:#svy_eval_cumulated#:#Résultats cumulés +survey#:#svy_eval_detail#:#Résultats cumulés (Détails) survey#:#svy_eval_skipped_value#:#Résultats: 'Passer' survey#:#svy_eval_skipped_value_custom#:#Utiliser une valeur personnalisée survey#:#svy_eval_skipped_value_custom_info#:#Définir une valeur (ou une valeur vide) à utiliser pour passer les réponses @@ -16010,22 +16012,22 @@ survey#:#svy_evaluation_access_off_info#:#Seuls les utilisateurs qui peuvent éd survey#:#svy_evaluation_access_participants_info#:#All users that participated in the survey may choose to look at the results after finishing it. survey#:#svy_export_files#:#Fichiers d'Export survey#:#svy_export_format#:#Exporter les données d’enquête comme -survey#:#svy_export_pdf#:#Export PDF###07 02 2020 new variable -survey#:#svy_ext_rater_firstname#:#First name of external rater###31 03 2023 new variable -survey#:#svy_ext_rater_lastname#:#Last name of external rater###31 03 2023 new variable -survey#:#svy_external_rater#:#Add External Rater###31 03 2023 new variable -survey#:#svy_external_rater_info#:#The rater is not registered on this platform.###31 03 2023 new variable -survey#:#svy_fraction_of_selections#:#Fraction de sélections +survey#:#svy_export_pdf#:#Export PDF +survey#:#svy_ext_rater_firstname#:#First name of external rater###31 10 2023 new variable +survey#:#svy_ext_rater_lastname#:#Last name of external rater###31 10 2023 new variable +survey#:#svy_external_rater#:#Add External Rater###31 10 2023 new variable +survey#:#svy_external_rater_info#:#The rater is not registered on this platform.###31 10 2023 new variable +survey#:#svy_fraction_of_selections#:#Proportion du total des options de réponses sélectionnées survey#:#svy_gap_analysis#:#Analyse d'Ecart -survey#:#svy_general_properties#:#Propriétés Générales +survey#:#svy_general_properties#:#Propriétés générales survey#:#svy_import_codes#:#Codes d’importation survey#:#svy_import_codes_info#:#Cette importation nécessite un fichier d’exportation «%s». -survey#:#svy_ind_feedb_info#:#Users get distinct evaluations by others.###31 03 2023 new variable -survey#:#svy_ind_feedb_mode#:#Individual Feedback###31 03 2023 new variable +survey#:#svy_ind_feedb_info#:#Users get distinct evaluations by others.###31 10 2023 new variable +survey#:#svy_ind_feedb_mode#:#Individual Feedback###31 10 2023 new variable survey#:#svy_mail_confirmation_subject#:#Enquête «%s» - Votre confirmation de participation -survey#:#svy_mail_context_rater_invitation_info#:#Invite raters to participate in a survey.###31 03 2023 new variable -survey#:#svy_mail_context_rater_invitation_survey_title#:#Survey Title###31 03 2023 new variable -survey#:#svy_mail_context_rater_invitation_title#:#Survey: Rater Invitation###31 03 2023 new variable +survey#:#svy_mail_context_rater_invitation_info#:#Invite raters to participate in a survey.###31 10 2023 new variable +survey#:#svy_mail_context_rater_invitation_survey_title#:#Survey Title###31 10 2023 new variable +survey#:#svy_mail_context_rater_invitation_title#:#Survey: Rater Invitation###31 10 2023 new variable survey#:#svy_mail_context_reminder_info#:#Rappelle les utilisateurs de participer à l’enquête survey#:#svy_mail_context_reminder_survey_title#:#Titre de l’enquête survey#:#svy_mail_context_reminder_title#:#Rappel d’enquête @@ -16034,23 +16036,23 @@ survey#:#svy_mail_own_results_body#:#ce qui suit est un résumé complet de votr survey#:#svy_mail_own_results_subject#:#Enquête «%s» - Vos réponses survey#:#svy_mail_send_confirmation#:#Envoyer une confirmation de participation survey#:#svy_matrix_layout_percentages_sum_invalid#:#Les paramètres de colonnes ne totalisent pas à 100%. -survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable +survey#:#svy_max_sum_score#:#Maximum Sum Score survey#:#svy_neutral_answer#:#Texte pour réponse neutre ("Ne sait pas", "Sans opinion", etc.) -survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable -survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable -survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable -survey#:#svy_only_max_one_external_rater#:#Please select only one external rater.###31 03 2023 new variable +survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results +survey#:#svy_notification_tutor_results_alert#:#This requires an end date. +survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it. +survey#:#svy_only_max_one_external_rater#:#Please select only one external rater.###31 10 2023 new variable survey#:#svy_page_add_question#:#Ajouter nouvelle %s survey#:#svy_page_error#:#Une erreur s'est produite en répondant à une question de l'enquête. Veuillez vous reporter à cette question pour avoir plus d'informations sur cette erreur ! survey#:#svy_page_errors#:#Des erreurs se sont produites en répondant à des questions de l'enquête. Veuillez vous reporter aux questions pour avoir plus d'informations sur ces erreurs. survey#:#svy_participant#:#Participant survey#:#svy_participation#:#Participation -survey#:#svy_please_select_unused_codes#:#Please select at least one unused code.###31 03 2023 new variable +survey#:#svy_please_select_unused_codes#:#Please select at least one unused code.###31 10 2023 new variable survey#:#svy_print_hide_labels#:#Masquer les vignettes survey#:#svy_print_show_labels#:#Montrer les vignettes -survey#:#svy_privacy_info#:#Privacy###31 03 2023 new variable -survey#:#svy_rater#:#Rater###31 03 2023 new variable -survey#:#svy_rater_see_app_info#:#The names of appraisees will be presented to raters to enable them evaluating the questions.###31 03 2023 new variable +survey#:#svy_privacy_info#:#Privacy###31 10 2023 new variable +survey#:#svy_rater#:#Rater###31 10 2023 new variable +survey#:#svy_rater_see_app_info#:#The names of appraisees will be presented to raters to enable them evaluating the questions.###31 10 2023 new variable survey#:#svy_reminder_mail_template#:#Modèle d’e-mail survey#:#svy_reminder_mail_template_none#:#Ne pas utiliser un modèle d’e-mail survey#:#svy_result_mail_notification_info#:#A la fin de l'évaluation, les réponses de chaque participant seront envoyées aux destinataires suivants. @@ -16058,15 +16060,15 @@ survey#:#svy_results#:#Résultats survey#:#svy_results_mail_confirm#:#Les participants peuvent demander une confirmation de participation survey#:#svy_results_mail_confirm_info#:#Les participants peuvent demander un mail avec une confirmation de participation à la fin de l’enquête. survey#:#svy_results_mail_own#:#Participant can mail own answers -survey#:#svy_results_mail_own_info#:#todo5 +survey#:#svy_results_mail_own_info#:#Les réponses données seront incluses dans la confirmation de participation. survey#:#svy_results_view_own#:#Participant can view own answers -survey#:#svy_results_view_own_info#:#todo4 -survey#:#svy_save_and_continue#:#Save and Continue###31 03 2023 new variable +survey#:#svy_results_view_own_info#:#Une fois l'enquête terminée, les participants peuvent consulter la liste de toutes les réponses qu'ils ont fournies. Ils ne peuvent pas modifier leurs réponses. +survey#:#svy_save_and_continue#:#Save and Continue###31 10 2023 new variable survey#:#svy_save_sync#:#Enregistrer et Synchroniser les Copies de Questions -survey#:#svy_search_user#:#Search User###31 03 2023 new variable -survey#:#svy_search_user_info#:#Search for users or roles and pick participants.###31 03 2023 new variable +survey#:#svy_search_user#:#Search User###31 10 2023 new variable +survey#:#svy_search_user_info#:#Search for users or roles and pick participants.###31 10 2023 new variable survey#:#svy_search_users#:#Rechercher participants -survey#:#svy_select_rater#:#Select Rater###31 03 2023 new variable +survey#:#svy_select_rater#:#Select Rater###31 10 2023 new variable survey#:#svy_selected_user_data_deleted#:#Les données des utilisateurs sélectionnés ont été supprimées avec succès survey#:#svy_self_ev_access_results_all#:#Access to Self-Evaluations of All Participants survey#:#svy_self_ev_access_results_none#:#No Access to Results @@ -16081,10 +16083,10 @@ survey#:#svy_settings_section_reminders#:#Rappels survey#:#svy_settings_template#:#Modèle survey#:#svy_show_questiontitles#:#Montrer les Titres de Question dans l'Enquête survey#:#svy_skl_comp_assignm_not_supported#:#L'assignation de compétences n'est pas supportée pour ce type de question. -survey#:#svy_sum_score#:#Sum Score###30 04 2021 new variable -survey#:#svy_type_of_rater#:#Type of Rater###31 03 2023 new variable +survey#:#svy_sum_score#:#Somme des points +survey#:#svy_type_of_rater#:#Type of Rater###31 10 2023 new variable survey#:#svy_view_own_results#:#Voir les réponses données -survey#:#svy_wrong_or_expired_code#:#Sorry, you entered an invalid or expired code.###31 03 2023 new variable +survey#:#svy_wrong_or_expired_code#:#Sorry, you entered an invalid or expired code.###31 10 2023 new variable survey#:#text_maximum_chars_allowed#:#Veuillez ne pas saisir plus de %s caractères. Les caractères supplémentaires seront supprimés. survey#:#text_question_not_filled_out#:#Veuillez remplir le champ de réponse. survey#:#unfold#:#Dissocier @@ -16097,9 +16099,9 @@ survey#:#use_min_answers#:#Sélections de réponse survey#:#use_min_answers_option#:#Utiliser le nombre minimum de réponses sélectionnées survey#:#use_other_answer#:#Réponse ouverte survey#:#used#:#utilisé -survey#:#users_answered#:#Nombre d'utilisateurs qui ont répondu +survey#:#users_answered#:#Nombre d'utilisateurs ayant répondu survey#:#users_invited#:#%s utilisateurs ont été invités -survey#:#users_skipped#:#Ont Passé la Question +survey#:#users_skipped#:#Nombre d'utilisateurs ayant passé survey#:#values#:#Valeurs survey#:#vertical#:#Vertical survey#:#warning_question_not_complete#:#La question n'est pas complète ! @@ -16107,33 +16109,33 @@ survey#:#workingtime#:#Durée survey#:#wrong_survey_code_used#:#Vous ne pouvez pas accéder à l'enquête car vous avez saisi un code d'accès non autorisé. svy#:#survey_360_appraisees_remind_info#:#Si l’auto-évaluation est activée, les personnes évaluées qui n’ont pas encore terminé l’enquête recevront un rappel. svy#:#survey_360_raters_remind_info#:#Les évaluateurs qui n’ont pas encore terminé l’enquête recevront un rappel. -svy#:#svy_all_pages#:#All Pages###31 03 2023 new variable -svy#:#svy_all_participants#:#All Participants###31 03 2023 new variable -svy#:#svy_all_questions#:#All Questions###31 03 2023 new variable -svy#:#svy_codes#:#Access Codes###07 02 2020 new variable -svy#:#svy_current_page#:#Current Page###31 03 2023 new variable -svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable -svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable -svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable -svy#:#svy_part_overview#:#Overview###07 02 2020 new variable -svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable -svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable -svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable -svy#:#svy_selected_participants#:#Selected Participants###31 03 2023 new variable -svy#:#svy_selected_questions#:#Selected Questions###31 03 2023 new variable -svy#:#svy_selection#:#Selection###31 03 2023 new variable -svy#:#svy_status#:#Status###07 02 2020 new variable -svy#:#svy_status_finished#:#Finished###07 02 2020 new variable -svy#:#svy_status_in_progress#:#In Progress###07 02 2020 new variable -svy#:#svy_status_invited#:#Invited###07 02 2020 new variable -svy#:#svy_user_added_appraisee#:#Survey '%1'###31 03 2023 new variable -svy#:#svy_user_added_appraisee_close_mail#:#The survey has been closed for your raters.###31 03 2023 new variable -svy#:#svy_user_added_appraisee_mail#:#You have been added to the survey as an appraisee.###31 03 2023 new variable -svy#:#svy_user_added_rater#:#Survey '%1'###31 03 2023 new variable -svy#:#svy_user_added_rater_mail#:#You have been added as a rater to the survey.###31 03 2023 new variable -svy#:#svy_user_added_rater_reminder_mail#:#Please finish to rate the following appraisees:###31 03 2023 new variable -svy#:#svy_user_not_found#:#User not found.###31 03 2023 new variable -svy#:#svy_users_invited#:#Users have been invited.###07 02 2020 new variable +svy#:#svy_all_pages#:#All Pages###31 10 2023 new variable +svy#:#svy_all_participants#:#All Participants###31 10 2023 new variable +svy#:#svy_all_questions#:#All Questions###31 10 2023 new variable +svy#:#svy_codes#:#Access Codes +svy#:#svy_current_page#:#Current Page###31 10 2023 new variable +svy#:#svy_finish_survey#:#Finish survey '%1' +svy#:#svy_invite_participants#:#Invite Participants +svy#:#svy_link_to_svy#:#Link to Survey###31 10 2023 new variable +svy#:#svy_part_overview#:#Overview +svy#:#svy_print_selection#:#Print View Selection###31 10 2023 new variable +svy#:#svy_remove_all_participants#:#Remove all Participants +svy#:#svy_remove_participants#:#Remove Participants +svy#:#svy_selected_participants#:#Selected Participants###31 10 2023 new variable +svy#:#svy_selected_questions#:#Selected Questions###31 10 2023 new variable +svy#:#svy_selection#:#Selection###31 10 2023 new variable +svy#:#svy_status#:#Status +svy#:#svy_status_finished#:#Finished +svy#:#svy_status_in_progress#:#In Progress +svy#:#svy_status_invited#:#Invited +svy#:#svy_user_added_appraisee#:#Survey '%1'###31 10 2023 new variable +svy#:#svy_user_added_appraisee_close_mail#:#The survey has been closed for your raters.###31 10 2023 new variable +svy#:#svy_user_added_appraisee_mail#:#You have been added to the survey as an appraisee.###31 10 2023 new variable +svy#:#svy_user_added_rater#:#Survey '%1'###31 10 2023 new variable +svy#:#svy_user_added_rater_mail#:#You have been added as a rater to the survey.###31 10 2023 new variable +svy#:#svy_user_added_rater_reminder_mail#:#Please finish to rate the following appraisees:###31 10 2023 new variable +svy#:#svy_user_not_found#:#User not found.###31 10 2023 new variable +svy#:#svy_users_invited#:#Users have been invited. sysc#:#sysc_action_list_tree#:#Créer un dépôt pour l’arborescence du répertoire sysc#:#sysc_action_repair#:#Réparer sysc#:#sysc_action_show_tree#:#Montrer le dépôt de l’arborescence du répertoire @@ -16182,37 +16184,37 @@ sysc#:#sysc_tree_duplicate_failures#:#Found duplicate entries in tree structure. sysc#:#sysc_tree_list_failures#:#Un dépôt de l’arborescence du répertoire a été créé. Nombre d’erreurs dans la structure arborescente: sysc#:#sysc_tree_missing_failures#:#Entrées manquantes trouvées dans la structure arborescente. Nombre d’entrées manquantes: sysc#:#sysc_tree_structure_failures#:#Nombre d’échecs dans la structure arborescente (relation parent): -tagging#:#no_tag_text_1#:#You have not yet used any tags. To do this, you must take two steps:###30 04 2021 new variable -tagging#:#no_tag_text_2#:#Click on '%s' and select a learning object from the available offer, e.g. a learning module or a forum.###30 04 2021 new variable -tagging#:#no_tag_text_3#:#To attach any tags to the object select 'Set Tags' from the actions menu.###30 04 2021 new variable +tagging#:#no_tag_text_1#:#You have not yet used any tags. To do this, you must take two steps: +tagging#:#no_tag_text_2#:#Click on '%s' and select a learning object from the available offer, e.g. a learning module or a forum. +tagging#:#no_tag_text_3#:#To attach any tags to the object select 'Set Tags' from the actions menu. tagging#:#tag_remove_tags_of_obj_without_access#:#Supprimer le marquage tagging#:#tag_some_obj_tagged_without_access#:#Vous n’avez plus la permission d’accéder à certains objets marqués. Le marquage doit-il être supprimé de ces objets? tagging#:#tag_tags_deleted#:#Le marquage a été supprimé des objets inaccessibles. -tagging#:#tagging_all_users#:#Tous Utilisateurs +tagging#:#tagging_all_users#:#Tous les utilisateurs tagging#:#tagging_edit_settings#:#Modifier paramètres tagging#:#tagging_enable_all_users#:#Afficher tags de chaque utilisateurs tagging#:#tagging_enable_all_users_info#:#Ajouter une section "Tous utilisateurs" aux écrans d'infos qui liste tous les tags de tous les utilisateurs attaché à une ressource. tagging#:#tagging_enable_tagging#:#Activer Tagging tagging#:#tagging_forbidden_tags#:#Tags interdits -tagging#:#tagging_no_obj_for_tag#:#No Resources tagged with %s.###09 03 2022 new variable +tagging#:#tagging_no_obj_for_tag#:#No Resources tagged with %s. tagging#:#tagging_other_users#:#Other Users tagging#:#tagging_resources_for_tag#:#Ressources taggées avec %s tagging#:#tagging_search_users#:#Rechercher utilisateurs -tagging#:#tagging_set_tag#:#Mots-Clés +tagging#:#tagging_set_tag#:#Définir les mots-clés tagging#:#tagging_settings#:#Paramètres tagging#:#tagging_tag#:#Mot-Clé tagging#:#tagging_tag_info#:#Pour ajouter des mots clés à un objet, cliquez sur sa page "info" et saisir vos mots clés. -tagging#:#tagging_tags#:#Mots-Clés +tagging#:#tagging_tags#:#Mots-clés tagging#:#tagging_users_using_tag#:#Utilisateurs utilisant Tag -task#:#task_deadline#:#End###07 02 2020 new variable -task#:#task_derived_tasks#:#Tasks###07 02 2020 new variable -task#:#task_details#:#Details###07 02 2020 new variable -task#:#task_no_task_items#:#Es sind keine To-Dos für Sie vorhanden.###07 02 2020 new variable -task#:#task_no_tasks#:#You do not have any open tasks.###07 02 2020 new variable -task#:#task_start#:#Start###07 02 2020 new variable -task#:#task_task#:#Task###07 02 2020 new variable -task#:#task_tasks_with_deadline#:#With Deadline###07 02 2020 new variable -task#:#task_tasks_without_deadline#:#Without Deadline###07 02 2020 new variable +task#:#task_deadline#:#Fin +task#:#task_derived_tasks#:#Tâches +task#:#task_details#:#Details +task#:#task_no_task_items#:#Es sind keine To-Dos für Sie vorhanden. +task#:#task_no_tasks#:#You do not have any open tasks. +task#:#task_start#:#Début +task#:#task_task#:#Task +task#:#task_tasks_with_deadline#:#Avec date de fin +task#:#task_tasks_without_deadline#:#Sans date de fin tax#:#obj_taxn#:#Noeud tax#:#tax_add_taxonomy#:#Ajouter Taxinomie tax#:#tax_added#:#La taxinomie a été créée. @@ -16235,7 +16237,7 @@ tax#:#tax_target_within_nodes#:#La cible ne peut pas être un enfant des noeuds tax#:#tax_tax_assignment#:#Affectation de taxonomie tax#:#tax_tax_deleted#:#La taxinomie a été supprimée. tax#:#tax_tax_settings#:#Paramètres de taxonomie -tax#:#tax_taxonomy#:#Taxinomie +tax#:#tax_taxonomy#:#Taxonomie tbl#:#tbl_export_csv#:#Export .CSV tbl#:#tbl_export_excel#:#Export .XLS tbl#:#tbl_template_create#:#Enregistrer vue courante @@ -16243,8 +16245,8 @@ tbl#:#tbl_template_created#:#La vue courante a été enregistrée. tbl#:#tbl_template_delete#:#Supprimer vue enregistrée tbl#:#tbl_template_deleted#:#La vue courante a été supprimée. tbl#:#tbl_templates#:#Vue -tos#:#deleteDocument#:#Delete###31 03 2023 new variable -tos#:#detachCriterionAssignment#:#Delete###31 03 2023 new variable +tos#:#deleteDocument#:#Delete###31 10 2023 new variable +tos#:#detachCriterionAssignment#:#Delete###31 10 2023 new variable tos#:#tos_acceptance_history#:#Historique d'Acceptation tos#:#tos_account_reg_not_possible#:#A self registration is not possible because of a missing user agreement. Please contact your system administrator for further information. tos#:#tos_add_document_btn_label#:#Add Document @@ -16254,8 +16256,8 @@ tos#:#tos_agreement_document_missing#:#Manquant tos#:#tos_agreement_documents_tab_label#:#Terms of Service tos#:#tos_agreement_exists#:#Existant tos#:#tos_agreement_missing#:#Manquant -tos#:#tos_crit_type_usr_country#:#Profile Country###30 04 2021 new variable -tos#:#tos_crit_type_usr_country_info#:#The criterion is fulfilled if the selected country is set for a user profile. Please note that this criterion type can be attached only once.###30 04 2021 new variable +tos#:#tos_crit_type_usr_country#:#Profile Country +tos#:#tos_crit_type_usr_country_info#:#The criterion is fulfilled if the selected country is set for a user profile. Please note that this criterion type can be attached only once. tos#:#tos_crit_type_usr_global_role#:#User has Global Role tos#:#tos_crit_type_usr_global_role_info#:#The criterion is fulfilled if the user is assigned to the selected role. tos#:#tos_crit_type_usr_language#:#Profile Language @@ -16292,8 +16294,8 @@ tos#:#tos_no_documents_exist_cant_save#:#Il n’y a actuellement aucun terme de tos#:#tos_period#:#Période tos#:#tos_period_from#:#De tos#:#tos_period_until#:#Jusqu'au -tos#:#tos_reevaluate_on_login#:#Reevaluate on Successful Login###30 04 2021 new variable -tos#:#tos_reevaluate_on_login_desc#:#If enabled, ILIAS 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.###30 04 2021 new variable +tos#:#tos_reevaluate_on_login#:#Reevaluate on Successful Login +tos#:#tos_reevaluate_on_login_desc#:#If enabled, ILIAS 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_reset_successful#:#The terms of service have been reset successfully. tos#:#tos_reset_tos_for_all_users#:#Réinitialiser les Conditions d'Utilisation tos#:#tos_saved_sorting#:#The sorting has been saved. @@ -16318,18 +16320,18 @@ tos#:#tos_tbl_hist_head_firstname#:#Firstname tos#:#tos_tbl_hist_head_lastname#:#Lastname tos#:#tos_tbl_hist_head_login#:#Login tos#:#tos_tos_settings#:#Paramètres -tos#:#tos_withdrawal_usr_deletion#:#Account Deletion on Terms Of Service Withdrawal###30 04 2021 new variable -tos#:#tos_withdrawal_usr_deletion_info#:#If enabled, the withdrawal of the 'Terms of Service' provokes a deletion of the user account.###30 04 2021 new variable -trac#:#cmix_lp_mode_deactivated#:#Learning Progress is Deactivated###07 02 2020 new variable -trac#:#cmix_lp_mode_deactivated_info#:#The learning progress status is not displayed and does not influence parent objects.###07 02 2020 new variable -trac#:#cmix_lp_mode_when_completed#:#Completed when 'completed'###07 02 2020 new variable -trac#:#cmix_lp_mode_when_completed_info#:#ILIAS status 'completed' is set when verb of last relevant xAPI-Statement is 'completed'.###07 02 2020 new variable -trac#:#cmix_lp_mode_when_passed#:#Completed when 'passed'###07 02 2020 new variable -trac#:#cmix_lp_mode_when_passed_info#:#ILIAS status 'completed' is set when verb of last relevant xAPI-Statement is 'passed' or 'satisfied'.###07 02 2020 new variable -trac#:#cmix_lp_mode_when_passed_or_completed#:#Completed when passed or completed###07 02 2020 new variable -trac#:#cmix_lp_mode_when_passed_or_completed_info#:#ILIAS status 'completed' is set when verb of last relevant xAPI-Statement is 'completed' or 'passed' or 'satisfied'.###07 02 2020 new variable -trac#:#cmix_lp_mode_with_failed#:#Also consider failed###07 02 2020 new variable -trac#:#cmix_lp_mode_with_failed_info#:#The status could be 'failed' instead of 'in progress'.###07 02 2020 new variable +tos#:#tos_withdrawal_usr_deletion#:#Account Deletion on Terms Of Service Withdrawal +tos#:#tos_withdrawal_usr_deletion_info#:#If enabled, the withdrawal of the 'Terms of Service' provokes a deletion of the user account. +trac#:#cmix_lp_mode_deactivated#:#Learning Progress is Deactivated +trac#:#cmix_lp_mode_deactivated_info#:#The learning progress status is not displayed and does not influence parent objects. +trac#:#cmix_lp_mode_when_completed#:#Completed when 'completed' +trac#:#cmix_lp_mode_when_completed_info#:#ILIAS status 'completed' is set when verb of last relevant xAPI-Statement is 'completed'. +trac#:#cmix_lp_mode_when_passed#:#Completed when 'passed' +trac#:#cmix_lp_mode_when_passed_info#:#ILIAS status 'completed' is set when verb of last relevant xAPI-Statement is 'passed' or 'satisfied'. +trac#:#cmix_lp_mode_when_passed_or_completed#:#Completed when passed or completed +trac#:#cmix_lp_mode_when_passed_or_completed_info#:#ILIAS status 'completed' is set when verb of last relevant xAPI-Statement is 'completed' or 'passed' or 'satisfied'. +trac#:#cmix_lp_mode_with_failed#:#Also consider failed +trac#:#cmix_lp_mode_with_failed_info#:#The status could be 'failed' instead of 'in progress'. trac#:#create_date_max#:#Dernière inscription trac#:#create_date_min#:#Inscription précédente trac#:#info_valid_request#:#La durée maximum valide entre deux requêtes d'un utilisateur. @@ -16338,7 +16340,7 @@ trac#:#meta_typical_learning_time#:#Durée typique d'apprentissage trac#:#obj_types#:#Types d'Objet trac#:#read_count_avg#:#Moyenne des vues de page trac#:#registration_filter#:#Date d'Inscription -trac#:#search_area_info#:#Veuillez choisir un objet. +trac#:#search_area_info#:#Veuillez choisir un élément. trac#:#search_terms#:#Rechercher Terme(s) trac#:#select_one#:#Veuillez choisir un objet. trac#:#session_statistics#:#Statistiques de Sessions @@ -16380,17 +16382,17 @@ trac#:#trac_end_at#:#Date de Fin trac#:#trac_failed#:#Echec trac#:#trac_figure#:#Chiffre Clé trac#:#trac_filter_area#:#Zone : -trac#:#trac_filter_has_status#:#Afficher les objets non utilisés +trac#:#trac_filter_has_status#:#Afficher les éléments non utilisés trac#:#trac_filter_hidden#:#Caché trac#:#trac_first_access#:#Premier accès trac#:#trac_first_and_last_access#:#Premier et dernier accès -trac#:#trac_frm_contribution_num_postings#:#Minimum number of Postings###31 03 2023 new variable +trac#:#trac_frm_contribution_num_postings#:#Minimum number of Postings###31 10 2023 new variable trac#:#trac_group_materials#:#Regrouper les Objets trac#:#trac_group_materials_save#:#Enregistrer le Nombre d'Objets Obligatoires trac#:#trac_grouped_material_obligatory_err#:#Le nombre de ressources à réussir doit être supérieur à 0 et inférieur au nombre de ressources du groupe. trac#:#trac_hide#:#Cacher -trac#:#trac_hide_selected#:#Masquer items sélectionnés -trac#:#trac_in_progress#:#En Cours +trac#:#trac_hide_selected#:#Masquer les éléments sélectionnés +trac#:#trac_in_progress#:#En cours trac#:#trac_info_edited#:#Choisir le statut 'terminé' si vous pensez avoir traité tout le contenu. trac#:#trac_last_access#:#Dernier Accès trac#:#trac_last_aggregation#:#Dernière Agrégation @@ -16398,8 +16400,8 @@ trac#:#trac_last_maxed_out_sessions#:#Dernière Charge Maximale trac#:#trac_learning_progress#:#Progression trac#:#trac_learning_progress_of#:#Progression de %s trac#:#trac_learning_progress_settings_info#:#Activer l'affichage des valeurs suivantes dans les tables de suivi d'apprentissage : -trac#:#trac_lhist_obj_completed#:#$1$ was completed. -trac#:#trac_lhist_obj_completed_in#:#$1$ was completed in $2$. +trac#:#trac_lhist_obj_completed#:#$1$ a été complété +trac#:#trac_lhist_obj_completed_in#:#$1$ a été complété en $2$. trac#:#trac_log_info#:#Dernière Agrégation : %s (Objets non traités : %s) trac#:#trac_log_info_link#:#Mettre à Jour trac#:#trac_long_system_load#:#Long terme @@ -16410,7 +16412,7 @@ trac#:#trac_lp_determination_info_mob#:#Sélectionner les articles qui détermin trac#:#trac_lp_determination_info_sco#:#Sélectionner les objets qui déterminent l'état de progression du module SCORM. trac#:#trac_lp_determination_tutor#:#Affichage des objets en suivi d'apprentissage trac#:#trac_lp_filter#:#Filtre -trac#:#trac_lp_learner_access#:#View Own Learning Progress###30 04 2021 new variable +trac#:#trac_lp_learner_access#:#View Own Learning Progress trac#:#trac_lp_learner_access_info#:#Lorsque actif, les utilisateurs peuvent accéder à leur propre progression. trac#:#trac_lp_list_gui#:#Bureau Personnel, Catalogue, Recherche trac#:#trac_lp_list_gui_info#:#Lorsque activé, l'état de progression est affiché dans les listes d'objets. @@ -16427,18 +16429,18 @@ trac#:#trac_measure#:#Chiffre Clé trac#:#trac_members_short#:#Membres trac#:#trac_min_passed#:#Nombre Minimum d'Objets Réussis : trac#:#trac_mode#:#Mode -trac#:#trac_mode_cmix_compl_or_passed_with_failed#:#Completed when verb 'completed' or 'passed' or 'satisfied' was sent. Verb 'failed' sets status of ILIAS to 'Failed'.###30 04 2021 new variable -trac#:#trac_mode_cmix_compl_or_passed_with_failed_info#:# ###31 03 2023 new variable -trac#:#trac_mode_cmix_compl_with_failed#:#Completed when verb 'completed' was sent. Verb 'failed' sets status of ILIAS to 'Failed'.###30 04 2021 new variable -trac#:#trac_mode_cmix_compl_with_failed_info#:# ###31 03 2023 new variable -trac#:#trac_mode_cmix_completed#:#Completed when verb 'completed' was sent. Verb 'failed' sets status of ILIAS to 'In Progress'.###30 04 2021 new variable -trac#:#trac_mode_cmix_completed_info#:# ###31 03 2023 new variable -trac#:#trac_mode_cmix_completed_or_passed#:#Completed when verb 'completed' or 'passed' or 'satisfied' was sent. Verb 'failed' sets status of ILIAS to 'In Progress'.###30 04 2021 new variable -trac#:#trac_mode_cmix_completed_or_passed_info#:# ###31 03 2023 new variable -trac#:#trac_mode_cmix_passed#:#Completed when verb 'passed' or 'satisfied' was sent. Verb 'failed' sets status of ILIAS to 'In Progress'.###30 04 2021 new variable -trac#:#trac_mode_cmix_passed_info#:# ###31 03 2023 new variable -trac#:#trac_mode_cmix_passed_with_failed#:#Completed when verb 'passed' or 'satisfied' was sent. Verb 'failed' sets status of ILIAS to 'Failed'.###30 04 2021 new variable -trac#:#trac_mode_cmix_passed_with_failed_info#:# ###31 03 2023 new variable +trac#:#trac_mode_cmix_compl_or_passed_with_failed#:#Completed when verb 'completed' or 'passed' or 'satisfied' was sent. Verb 'failed' sets status of ILIAS to 'Failed'. +trac#:#trac_mode_cmix_compl_or_passed_with_failed_info#:# ###31 10 2023 new variable +trac#:#trac_mode_cmix_compl_with_failed#:#Completed when verb 'completed' was sent. Verb 'failed' sets status of ILIAS to 'Failed'. +trac#:#trac_mode_cmix_compl_with_failed_info#:# ###31 10 2023 new variable +trac#:#trac_mode_cmix_completed#:#Completed when verb 'completed' was sent. Verb 'failed' sets status of ILIAS to 'In Progress'. +trac#:#trac_mode_cmix_completed_info#:# ###31 10 2023 new variable +trac#:#trac_mode_cmix_completed_or_passed#:#Completed when verb 'completed' or 'passed' or 'satisfied' was sent. Verb 'failed' sets status of ILIAS to 'In Progress'. +trac#:#trac_mode_cmix_completed_or_passed_info#:# ###31 10 2023 new variable +trac#:#trac_mode_cmix_passed#:#Completed when verb 'passed' or 'satisfied' was sent. Verb 'failed' sets status of ILIAS to 'In Progress'. +trac#:#trac_mode_cmix_passed_info#:# ###31 10 2023 new variable +trac#:#trac_mode_cmix_passed_with_failed#:#Completed when verb 'passed' or 'satisfied' was sent. Verb 'failed' sets status of ILIAS to 'Failed'. +trac#:#trac_mode_cmix_passed_with_failed_info#:# ###31 10 2023 new variable trac#:#trac_mode_collection#:#Automatiquement par Collection d'Objets trac#:#trac_mode_collection_info#:#Définir les objets utilisés pour déterminer l'état de progression. trac#:#trac_mode_collection_manual#:#Manuel par l'Apprenant (par Chapitre) @@ -16449,10 +16451,10 @@ trac#:#trac_mode_collection_tlt#:#Temps d'Apprentissage Théorique (par Chapitre trac#:#trac_mode_collection_tlt_info#:#Les utilisateurs ayant passé le Temps d'Apprentissage Théorique sur tous les chapitres pertinents obtiendront l'état "Terminé". trac#:#trac_mode_content_visited#:#Visited trac#:#trac_mode_content_visited_info#:#Learning progress status is set to 'completed' when object has been presented to user. -trac#:#trac_mode_contribution_to_discussion#:#Contributions to Discussion###31 03 2023 new variable -trac#:#trac_mode_contribution_to_discussion_info#:#The learning progress status will be determined by the number of written postings.###31 03 2023 new variable -trac#:#trac_mode_course_reference#:#Adopted from Course###07 02 2020 new variable -trac#:#trac_mode_course_reference_info#:#The mode is automatically adopted from the course this course link points to.###07 02 2020 new variable +trac#:#trac_mode_contribution_to_discussion#:#Contributions to Discussion###31 10 2023 new variable +trac#:#trac_mode_contribution_to_discussion_info#:#The learning progress status will be determined by the number of written postings.###31 10 2023 new variable +trac#:#trac_mode_course_reference#:#Adopted from Course +trac#:#trac_mode_course_reference_info#:#The mode is automatically adopted from the course this course link points to. trac#:#trac_mode_deactivated#:#Désactivé trac#:#trac_mode_deactivated_info_new#:#Le suivi d'apprentissage ne sera pas affiché. trac#:#trac_mode_event#:#Participation en sessions @@ -16461,10 +16463,10 @@ trac#:#trac_mode_exercise_returned#:#Exercice Effectué trac#:#trac_mode_exercise_returned_info#:#Le statut "Terminé" ne peut être défini que par les tuteurs. trac#:#trac_mode_individual_assessment#:#Notée manuellement par le tuteur ou l’entraîneur trac#:#trac_mode_individual_assessment_info#:#Le dossier d’un utilisateur doit être finalisé par le tuteur afin de compléter l’évaluation individuelle. -trac#:#trac_mode_lti_outcome#:#Mastery Score Must be reached###07 02 2020 new variable -trac#:#trac_mode_lti_outcome_info#:#The Learning Progress will be evaluated from the LTI outcome and the mastery score threshold.###07 02 2020 new variable +trac#:#trac_mode_lti_outcome#:#Mastery Score Must be reached +trac#:#trac_mode_lti_outcome_info#:#The Learning Progress will be evaluated from the LTI outcome and the mastery score threshold. trac#:#trac_mode_manual#:#Manuel par l'Apprenant -trac#:#trac_mode_manual_by_tutor#:#Manuel par le Tuteur +trac#:#trac_mode_manual_by_tutor#:#Le tuteur décide de l'état de la progression de la formation trac#:#trac_mode_manual_by_tutor_info#:#L'état de progression (ex. "Terminé" ou "Echec") est défini par les tuteurs. trac#:#trac_mode_manual_info#:#Les utilisateurs définissent eux-mêmes leur état de progression (ex. "Terminé"). trac#:#trac_mode_objectives#:#Automatiquement par Objectifs Pédagogiques @@ -16477,7 +16479,7 @@ trac#:#trac_mode_scorm_info#:#L'état de progression est déterminé par l'état trac#:#trac_mode_scorm_package#:#Automatique via le suivi du contenu SCORM trac#:#trac_mode_scorm_package_info#:#Le suivi de l'apprentissage sera déterminé directement par le suvi du contenu SCORM. trac#:#trac_mode_study_programme#:#Programme d’étude complété -trac#:#trac_mode_survey_finished#:#Enquête terminée +trac#:#trac_mode_survey_finished#:#Sondage terminé trac#:#trac_mode_survey_finished_info#:#L’enquête doit être terminée par un utilisateur pour qu’elle reçoive le statut «Complétée». trac#:#trac_mode_test_finished#:#Test Terminé trac#:#trac_mode_test_finished_info#:#Les utilisateurs doivent achever entièrement le test. @@ -16490,10 +16492,10 @@ trac#:#trac_mode_visited_pages_info#:#Users who visited all pages will gain the trac#:#trac_mode_visits#:#Nombre de Visites trac#:#trac_mode_visits_info#:#Définir le nombre de visites nécessaires pour considérer la ressource comme "Terminée". trac#:#trac_name_of_installation#:#Nom de l'installation -trac#:#trac_no_attempted#:#Non Commencé +trac#:#trac_no_attempted#:#Pas encore traité trac#:#trac_not_accessed#:#Non Accédé trac#:#trac_not_assigned#:#Non Assigné -trac#:#trac_not_attempted#:#Non Commencé +trac#:#trac_not_attempted#:#Pas encore commencé trac#:#trac_not_completed#:#Non Terminé trac#:#trac_not_participated#:#Non Participation trac#:#trac_not_registered#:#Non Inscrit @@ -16513,14 +16515,14 @@ trac#:#trac_objects#:#Utilisateurs trac#:#trac_others#:#Autres trac#:#trac_participants#:#Afficher Participants trac#:#trac_participated#:#Participation -trac#:#trac_paths#:#Paths###31 03 2023 new variable +trac#:#trac_paths#:#Paths###31 10 2023 new variable trac#:#trac_percentage#:#Pourcentage trac#:#trac_periodic_system_load#:#Période -trac#:#trac_progress#:#Progression Personnelle +trac#:#trac_progress#:#Progression personnelle trac#:#trac_read_count#:#Nombre d'accès trac#:#trac_read_count_spent_seconds#:#Temps Passé / Accès trac#:#trac_reference#:#Références -trac#:#trac_reference_ids_column#:#Reference-Ids###31 03 2023 new variable +trac#:#trac_reference_ids_column#:#Reference-Ids###31 10 2023 new variable trac#:#trac_refresh#:#Actualiser trac#:#trac_registered#:#Inscrit trac#:#trac_release_materials#:#Dégrouper les Objets @@ -16529,7 +16531,7 @@ trac#:#trac_report_owner#:#Propriétaire du rapport trac#:#trac_required_visits#:#Nombre de Visites Requises trac#:#trac_sahs_relevant_items#:#Appartenant au SCO trac#:#trac_scale#:#Période -trac#:#trac_select_area#:#Sélectionner zone +trac#:#trac_select_area#:#Sélectionner une zone trac#:#trac_session_active_avg#:#Sessions Actives (Moyenne) trac#:#trac_session_active_max#:#Sessions Actives (Maximum) trac#:#trac_session_active_min#:#Sessions Actives (Minimum) @@ -16554,7 +16556,7 @@ trac#:#trac_spent_seconds#:#Durée trac#:#trac_spent_time#:#Temps Passé trac#:#trac_status#:#Statut trac#:#trac_status_changed#:#Modifier l'ordre de tri -trac#:#trac_subitems#:#Afficher sous-items +trac#:#trac_subitems#:#Afficher les sous-éléments trac#:#trac_sum#:#Somme trac#:#trac_summary#:#Sommaire trac#:#trac_sure_delete_data#:#Etes-vous sûr de vouloir supprimer les données pour les mois suivants ? @@ -16582,25 +16584,25 @@ trac#:#user_total#:#Total Utilisateur trac#:#view_mode#:#Mode de Visualisation tstv#:#tstv_create#:#Créer Certificat de Test tstv#:#tstv_create_info#:#Choisir un test terminé pour générer un cetificat -ui#:#datetime_required#:#Time/Date required###24 09 2021 new variable -ui#:#duration_default_label_end#:#end###31 03 2023 new variable -ui#:#duration_default_label_start#:#start###31 03 2023 new variable -ui#:#duration_end_must_not_be_earlier_than_start#:#Start must not be later than end.###24 09 2021 new variable +ui#:#datetime_required#:#Time/Date required +ui#:#duration_default_label_end#:#end###31 10 2023 new variable +ui#:#duration_default_label_start#:#start###31 10 2023 new variable +ui#:#duration_end_must_not_be_earlier_than_start#:#Start must not be later than end. ui#:#ui_chars_max#:#Maximum: ui#:#ui_chars_min#:#Minimum: ui#:#ui_chars_remaining#:#Characters remaining: -ui#:#ui_error_in_group#:#There is some error in this part.###30 04 2021 new variable -ui#:#ui_error_switchable_group_required#:#Please select an option.###31 03 2023 new variable -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 ILIAS system administration about this incident.###31 03 2023 new variable -ui#:#ui_file_input_invalid_amount#:#You cannot upload this many files, please remove some in order to continue.###31 03 2023 new variable -ui#:#ui_file_input_invalid_mime#:#Files of type '%s' are not allowed###31 03 2023 new variable -ui#:#ui_file_input_invalid_size#:#File exceeds the maximum size of %s MiB.###31 08 2022 new variable -ui#:#ui_invalid_url#:#Invalid URL-format###31 03 2023 new variable -ui#:#ui_link_label#:#Label###31 03 2023 new variable -ui#:#ui_link_url#:#URL###31 03 2023 new variable -ui#:#ui_numeric_only#:#Please insert a whole number.###30 04 2021 new variable -ui#:#ui_tag_required#:#Please insert at least one tag.###27 04 2022 new variable -ui#:#ui_transcription#:#Transcript###31 03 2023 new variable +ui#:#ui_error_in_group#:#There is some error in this part. +ui#:#ui_error_switchable_group_required#:#Please select an option.###31 10 2023 new variable +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 ILIAS system administration about this incident.###31 10 2023 new variable +ui#:#ui_file_input_invalid_amount#:#You cannot upload this many files, please remove some in order to continue.###31 10 2023 new variable +ui#:#ui_file_input_invalid_mime#:#Files of type '%s' are not allowed###31 10 2023 new variable +ui#:#ui_file_input_invalid_size#:#File exceeds the maximum size of %s MiB. +ui#:#ui_invalid_url#:#Invalid URL-format###31 10 2023 new variable +ui#:#ui_link_label#:#Label###31 10 2023 new variable +ui#:#ui_link_url#:#URL###31 10 2023 new variable +ui#:#ui_numeric_only#:#Please insert a whole number. +ui#:#ui_tag_required#:#Please insert at least one tag. +ui#:#ui_transcription#:#Transcript###31 10 2023 new variable user#:#all_roles_has_starting_point#:#Tous les rôles ont des points de départ user#:#back_to_starting_points_list#:#Retour aux points de départ user#:#clipboard_add_btn#:#Ajouter au presse-papier @@ -16610,7 +16612,7 @@ user#:#clipboard_remove_btn#:#Retirer du presse-papier user#:#clipboard_table_title#:#Presse-papier (comptes utilisateurs) user#:#clipboard_user_added#:#Utilisateurs sélectionnées ajoutés au presse-papier. user#:#confirm_delete_starting_point#:#Êtes-vous sûr de vouloir supprimer cette règle? -user#:#confirm_logout_for_email_change#:#You changed your email. To finalize this change, you will need to provide your password. The system is thus going to log you out and you will have 5 minutes to log in again. All other changes will be saved before logging you out.###23 10 2023 new variable +user#:#confirm_logout_for_email_change#:#You changed your email. To finalize this change, you will need to provide your password. The system is thus going to log you out and you will have 5 minutes to log in again. All other changes will be saved before logging you out. user#:#create_starting_point#:#Créer une règle user#:#criteria#:#Critères user#:#del_mail_body#:#Bonjour %1$s, %2$s vous ne vous êtes pas connecté depuis une longue période, depuis %3$s. Votre compte sera donc supprimé %4$s jours. Vous devez vous reconnecter pour éviter la suppression de votre compte. @@ -16618,7 +16620,7 @@ user#:#del_mail_subject#:#(ILIAS) – Votre compte sera supprimé user#:#delete_inactive_user_accounts_frequency#:#Fréquence user#:#delete_inactive_user_accounts_frequency_desc#:#Frequency, in which the deletion and email distibution will be tested. user#:#editing_this_role#:#Rôle -user#:#email_could_not_be_changed#:#The request to change your email could not be finalized.###23 10 2023 new variable +user#:#email_could_not_be_changed#:#The request to change your email could not be finalized. user#:#enable_local_user_administration#:#Activer l'administration des utilisateurs locaux user#:#enable_local_user_administration_info#:#Si actif, les comptes utilisateur locaux peuvent être administrés en catégories. user#:#feedhash#:#Identifiant unique du flux de nouvelles @@ -16626,11 +16628,11 @@ user#:#has_role#:#Rôle user#:#inform_user_mail_info#:#Lorsque activé, un email est envoyé à l'utilisateur. Son contenu peut être défini dans Administration > Gestion des Utilisateurs > Paramétrages > Mail de Nouveau Compte. user#:#interests#:#Intérêts user#:#interests_general#:#Intérêts généraux -user#:#interests_help_looking#:#Recherche de l'Aide -user#:#interests_help_offered#:#Propose de l'Aide -user#:#msg_spoint_not_modified#:#Starting point not modified###07 02 2020 new variable -user#:#no_deactivate_yourself#:#You cannot deactivate your own user account.###28 07 2023 new variable -user#:#obj_ref_id_not_exist#:#The entered Reference-Id does not exist###07 02 2020 new variable +user#:#interests_help_looking#:#Recherche de l'aide +user#:#interests_help_offered#:#Propose de l'aide +user#:#msg_spoint_not_modified#:#Starting point not modified +user#:#no_deactivate_yourself#:#You cannot deactivate your own user account. +user#:#obj_ref_id_not_exist#:#The entered Reference-Id does not exist user#:#restrict_user_access#:#Accès restreint aux comptes utilisateur user#:#restrict_user_access_info#:#Si actif, l'accès au compte utilisateur est restreint. L'accès dépends de la permission "Read Access to Local User Account" dans "User Accounts" et "Catégories". user#:#roles_without_starting_point#:#Rôles sans point de départ défini: @@ -16641,7 +16643,7 @@ user#:#send_mail_to_inactive_users_desc#:#A reminder mail will be send to user's user#:#send_mail_to_inactive_users_must_be_smaller_than#:#This value must be smaller than the value 'Days passed since last login'. user#:#send_mail_to_inactive_users_numbers_only#:#Seuls les nombres entiers positifs sont acceptés. user#:#send_mail_to_inactive_users_suffix#:#Jours avant suppression. -user#:#show_own_online_status#:#Show My Online Status###07 02 2020 new variable +user#:#show_own_online_status#:#Show My Online Status user#:#starting_page#:#Point de départ user#:#starting_point#:#Point de départ user#:#starting_point_settings#:#Paramétrages des points de départ @@ -16667,17 +16669,17 @@ user#:#user_account_codes_export#:#Export des codes user#:#user_account_codes_number#:#Nombre de Codes user#:#user_account_deleted_confirmation#:#Votre compte a été supprimé. Un email d'information vous a été envoyé. user#:#user_activate_public_profile#:#Activation -user#:#user_activate_public_profile_info#:#Activation globale du profil public. Si actif, votre prénom et votre nom seront visibles par les autres utilisateurs connectés +user#:#user_activate_public_profile_info#:#Activation globale du profil public. Si actif, votre prénom et votre nom seront visibles par les autres utilisateurs connectés. user#:#user_activation#:#Activation user#:#user_adm_enable_alpha_nav#:#Navigation alphabétique dans l'administration utilisateur user#:#user_all#:#Tous user#:#user_allow_delete_own_account#:#Autoriser les utilisateurs à supprimer leur propre compte user#:#user_any#:#Tous -user#:#user_awrn_all_users#:#Tous les Utilisateurs +user#:#user_awrn_all_users#:#Tous les utilisateurs user#:#user_awrn_all_users_info#:#Tous les utilisateurs de la plate-forme sont répertoriés. -user#:#user_check_profile_data#:#Check profile data###07 02 2020 new variable +user#:#user_check_profile_data#:#Vérifier les données du profil user#:#user_chooses_starting_page#:#L’utilisateur choisit le point de départ -user#:#user_delete_own_account#:#Supprimer Compte +user#:#user_delete_own_account#:#Supprimer le compte user#:#user_delete_own_account_aborted#:#Suppression abandonnée. user#:#user_delete_own_account_email_body#:#Votre compte "%s" a été supprimé de %s. user#:#user_delete_own_account_email_subject#:#Compte supprimé @@ -16690,10 +16692,10 @@ user#:#user_field#:#Zone de texte user#:#user_global_role#:#Rôle Global user#:#user_last_login_before#:#Dernière connexion avant le : user#:#user_limited_access#:#Accès Limité -user#:#user_local_role#:#Local Role###31 03 2023 new variable +user#:#user_local_role#:#Local Role###31 10 2023 new variable user#:#user_lv_do_not_store#:#Ne pas mémoriser les dernières pages visitées user#:#user_lv_keep_entries#:#Mémoriser les dernières pages visitées -user#:#user_lv_keep_only_for_session#:#Mémoriser uniquement pour la session courante +user#:#user_lv_keep_only_for_session#:#Mémoriser uniquement la session courante user#:#user_make_profile_public#:#Publier le profile user#:#user_member_of_course_group#:#Membre de cours/groupe user#:#user_no_courses#:#Pas de cours assignés @@ -16703,13 +16705,13 @@ user#:#user_ownership#:#Objets du Catalogue user#:#user_please_select_course_group#:#Veuillez sélectionner un cours ou un groupe. user#:#user_portfolios#:#Portfolios user#:#user_portfolios_desc#:#Les utilisateurs peuvent créer des Portfolios et les utiliser comme profils personnels. -user#:#user_privacy_checklist#:#Privacy Checklist###07 02 2020 new variable -user#:#user_profile_data#:#Profile Data###07 02 2020 new variable -user#:#user_profile_data_checked#:#Profile data checked###07 02 2020 new variable +user#:#user_privacy_checklist#:#Liste de contrôle +user#:#user_profile_data#:#Données de profil +user#:#user_profile_data_checked#:#Profile data checked user#:#user_profile_info#:#Informations du profil d'utilisateur -user#:#user_profile_info_std#:#Default User Profile Info###07 02 2020 new variable +user#:#user_profile_info_std#:#Default User Profile Info user#:#user_profile_info_text_info#:#Ce texte apparaît au-dessus du formulaire pour entrer les données personnelles. -user#:#user_profile_portfolio#:#Si vous souhaitez utiliser un Portfolio comme profil, allez dans la section Portfolio et cliquez sur le lien "Utiliser Comme Profil" du Portfolio souhaité. +user#:#user_profile_portfolio#:#Si vous souhaitez utiliser un Portfolio comme profil, allez dans la section Portfolio et cliquez sur le lien "Utiliser comme profil" du Portfolio souhaité. user#:#user_profile_portfolio_selected#:#Vous utilisez actuellement un Portfolio comme profil. user#:#user_profile_preview#:#Afficher user#:#user_profile_prompt_text_info#:#This text will replace the default info text, if a user has been prompted to the profile. @@ -16722,27 +16724,27 @@ user#:#user_prompt_repeat_info#:#The user will be prompted periodically with the user#:#user_prompting_recurrence#:#Prompting Recurrence user#:#user_prompting_settings#:#Prompting Settings user#:#user_public_profile_info#:#Veuillez cocher les données que vous souhaitez rendre visibles dans votre profil. -user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_publish_options#:#Publier le profil user#:#user_role_starting_point#:#Utilisateur - Point de départ -user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable +user#:#user_save_continue#:#Sauver et continuer user#:#user_save_ordering_and_titles#:#Enregistrer l'ordre et les titres user#:#user_select_course_group#:#Sélectionner cours/groupe -user#:#user_set_publishing_options#:#Set publishing options###07 02 2020 new variable -user#:#user_set_visibilty_options#:#Set visibility options###07 02 2020 new variable -user#:#user_store_last_visited#:#Dernières Pages Visitées -user#:#user_visibility_settings#:#Visibility###07 02 2020 new variable +user#:#user_set_publishing_options#:#Configurer la publication +user#:#user_set_visibilty_options#:#Configurer la visibilité +user#:#user_store_last_visited#:#Dernières pages visitées +user#:#user_visibility_settings#:#Visibilité user#:#user_visible_in_profile#:#Visible dans les Données Personnelles user#:#usr_id#:#System ID user#:#usr_letter_avatars#:#Avatars de lettres user#:#usr_letter_avatars_info#:#Montre la lettre initiale du nom d'utilisateur comme photo de profil si aucune photo publique n’est fournie. -user#:#usr_public_profile_disabled#:#Profil Désactivé +user#:#usr_public_profile_disabled#:#Profil désactivé user#:#usr_public_profile_disabled_info#:#Vos données personnelles ne sont visibles que pour les administrateurs. user#:#usr_public_profile_global#:#Visible en globalité -user#:#usr_public_profile_logged_in#:#Visible pour les Utilisateurs Connectés +user#:#usr_public_profile_logged_in#:#Visible pour les utilisateurs connectés usr#:#user_action#:#Action de l’utilisateur usr#:#user_actions#:#Actions des utilisateurs usr#:#user_actions_activation_info#:#Les actions seront listées uniquement pour les utilisateurs si les services correspondants sont activés et que toutes les conditions préalables sont données (par ex. exigences des permissions). -validation#:#no_array#:#Given value is not an array###31 03 2023 new variable +validation#:#no_array#:#Given value is not an array###31 10 2023 new variable validation#:#not_a_null#:#Value of type '%s' is not a null. validation#:#not_a_string#:#Value of type '%s' is not a string. validation#:#not_an_array#:#'%s' is not an array. @@ -16750,14 +16752,14 @@ validation#:#not_an_array_of#:#The elements of the array fail constraints: %s validation#:#not_an_int#:#Value of type '%s' is not an integer. validation#:#not_generic#:#It is not the case that: %s validation#:#not_greater_than#:#'%s' is not greater than '%s'. -validation#:#not_greater_than_or_equal#:#The value is not greater than or equal '%s'.###31 03 2023 new variable +validation#:#not_greater_than_or_equal#:#The value is not greater than or equal '%s'.###31 10 2023 new variable validation#:#not_less_than#:#'%s' is not less than '%s'. -validation#:#not_less_than_or_equal#:#The value is not less than or equal '%s'.###31 03 2023 new variable +validation#:#not_less_than_or_equal#:#The value is not less than or equal '%s'.###31 10 2023 new variable validation#:#not_max_length#:#The entered text has a length more than '%s'. validation#:#not_min_length#:#Your input has a length of %d and falls below the minimum length %d. validation#:#not_numeric#:#'%s' is not numeric. -validation#:#not_numeric_empty_string#:#Your input is not numeric.###07 02 2020 new variable -violation#:#not_a_string#:#Given value is not a String###31 03 2023 new variable +validation#:#not_numeric_empty_string#:#Your input is not numeric. +violation#:#not_a_string#:#Given value is not a String###31 10 2023 new variable webr#:#invalid_links_tbl#:#Liens Non Valides webr#:#webr_active#:#Actif webr#:#webr_container_info#:#Veuillez saisir un titre et éventuellement une description pour cette Liste de Liens Web. @@ -16771,16 +16773,16 @@ webr#:#webr_inactive_success#:#Le lien choisi est désactivé. webr#:#webr_link_added#:#Un nouveau lien a été créé. webr#:#webr_link_target#:#Cible du Lien Web webr#:#webr_link_title#:#Nom du Lien Web -webr#:#webr_link_type_list#:#Weblink List###30 04 2021 new variable -webr#:#webr_link_type_single#:#Single Weblink###30 04 2021 new variable -webr#:#webr_list_added#:#A new weblink list has been created.###30 04 2021 new variable +webr#:#webr_link_type_list#:#Weblink List +webr#:#webr_link_type_single#:#Single Weblink +webr#:#webr_list_added#:#A new weblink list has been created. webr#:#webr_list_desc#:#Description de la Liste de Liens Web -webr#:#webr_list_set#:#The weblink has been set to a weblink list.###30 04 2021 new variable +webr#:#webr_list_set#:#The weblink has been set to a weblink list. webr#:#webr_list_title#:#Titre de la Liste de Liens Web webr#:#webr_new_link#:#Ajouter Nouveau Lien Web -webr#:#webr_new_list#:#Add New Weblink List###30 04 2021 new variable -webr#:#webr_new_list_info#:#Please enter a title and optionally a description for the presentation of this Weblink List in the repository.###30 04 2021 new variable -webr#:#webr_set_to_list#:#Set to Weblink List###30 04 2021 new variable +webr#:#webr_new_list#:#Add New Weblink List +webr#:#webr_new_list_info#:#Please enter a title and optionally a description for the presentation of this Weblink List in the repository. +webr#:#webr_set_to_list#:#Set to Weblink List webr#:#webr_sort_manual#:#Trié manuellement webr#:#webr_sort_title#:#Trié par titre webr#:#webr_sorting#:#Lien trié @@ -16816,14 +16818,14 @@ wfe#:#wfe_started_listening#:#Processus activé wfe#:#wfe_stopped_listening#:#Processus désactivé wfe#:#wfe_sure_to_delete_process_def#:#Êtes-vous sûr de vouloir supprimer la définition? wfld#:#wfld_add#:#Créer Dossier -wfld#:#wfld_alphabetically_asc#:#Alphabetically, asc.###07 02 2020 new variable -wfld#:#wfld_alphabetically_desc#:#Alphabetically, desc.###07 02 2020 new variable -wfld#:#wfld_creation_asc#:#Creation Date, asc.###07 02 2020 new variable -wfld#:#wfld_creation_desc#:#Creation Date, desc.###07 02 2020 new variable -wfld#:#wfld_derive#:#Adopt from parent###07 02 2020 new variable +wfld#:#wfld_alphabetically_asc#:#Alphabétique, ordre croissant +wfld#:#wfld_alphabetically_desc#:#Alphabétique, ordre décroissant +wfld#:#wfld_creation_asc#:#Date de création, ordre croissant +wfld#:#wfld_creation_desc#:#Date de création, ordre décroissant +wfld#:#wfld_derive#:#Adopt from parent wfld#:#wfld_edit#:#Editer Dossier wfld#:#wfld_new#:#Créer Nouveau Dossier -wfld#:#wfld_sortation#:#Sortation###07 02 2020 new variable +wfld#:#wfld_sortation#:#Tri wiki#:#wiki_activate_extended_rating#:#Activer les Catégories de Notation wiki#:#wiki_activate_new_page_rating#:#Activer la Notation pour les Nouvelles Pages wiki#:#wiki_activate_page_rating#:#Activer la Notation @@ -16835,14 +16837,14 @@ wiki#:#wiki_all_pages#:#Toutes les Pages wiki#:#wiki_block_page#:#Bloquer la Page wiki#:#wiki_change_notification_body_new#:#La page wiki suivante a été créée wiki#:#wiki_change_notification_link#:#Lier au wiki : %s -wiki#:#wiki_change_notification_page_body_comment#:#a comment has been added to the following wiki page###07 02 2020 new variable -wiki#:#wiki_change_notification_page_body_delete#:#the following wiki page has been deleted###07 02 2020 new variable +wiki#:#wiki_change_notification_page_body_comment#:#a comment has been added to the following wiki page +wiki#:#wiki_change_notification_page_body_delete#:#the following wiki page has been deleted wiki#:#wiki_change_notification_page_body_update#:#Dans le wiki %s, la page %s a été modifiée. wiki#:#wiki_change_notification_page_link#:#Lier à la page wiki : %s wiki#:#wiki_change_notification_salutation#:#Bonjour %s, wiki#:#wiki_change_notification_subject#:#Le wiki %s a été modifié wiki#:#wiki_changed_by#:#Modifié par -wiki#:#wiki_commented_by#:#Commented by###07 02 2020 new variable +wiki#:#wiki_commented_by#:#Commented by wiki#:#wiki_contributor#:#Contributeur wiki#:#wiki_contributors#:#Contributeurs wiki#:#wiki_copy#:#Copier Wiki @@ -16867,7 +16869,7 @@ wiki#:#wiki_grading#:#Notation wiki#:#wiki_html_export#:#HTML exportieren wiki#:#wiki_imp_page_added#:#Page ajoutée. wiki#:#wiki_import#:#Importer Wiki -wiki#:#wiki_incl_comments#:#including comments###30 04 2021 new variable +wiki#:#wiki_incl_comments#:#including comments wiki#:#wiki_indentation#:#Indentation wiki#:#wiki_introduction#:#Introduction wiki#:#wiki_last_changed#:#Dernière Modification @@ -16892,8 +16894,8 @@ wiki#:#wiki_notgraded#:#Non Noté wiki#:#wiki_notification_activate_page#:#Activer la Notification pour la Page wiki#:#wiki_notification_activate_wiki#:#Activer la Notification pour le Wiki wiki#:#wiki_notification_activated#:#Notification Activée (pour le Wiki) -wiki#:#wiki_notification_comment#:#the following Wiki Page has been commented.###07 02 2020 new variable -wiki#:#wiki_notification_comment_subject#:#A comment was added to %s: %s###07 02 2020 new variable +wiki#:#wiki_notification_comment#:#the following Wiki Page has been commented. +wiki#:#wiki_notification_comment_subject#:#A comment was added to %s: %s wiki#:#wiki_notification_deactivate_page#:#Désactiver la Notification pour la Page wiki#:#wiki_notification_deactivate_wiki#:#Désactiver la Notification pour le Wiki wiki#:#wiki_notification_deactivated#:#Notification Désactivée @@ -16924,7 +16926,7 @@ wiki#:#wiki_page_templates#:#Modèles de Page wiki#:#wiki_page_title_too_long#:#Désolé, le titre de la page wiki est trop long. Veuillez le remplacer par un titre plus court. wiki#:#wiki_page_toc#:#Activer le Bloc d'Aperçu de Page wiki#:#wiki_page_toc_info#:#Liste les titres en début de page s'il y a au moins 2 titres dans la page. -wiki#:#wiki_page_type_wpg#:#Wiki Page###30 04 2021 new variable +wiki#:#wiki_page_type_wpg#:#Wiki Page wiki#:#wiki_page_unblocked#:#Page Wiki débloquée. wiki#:#wiki_pages#:#Pages wiki#:#wiki_pages_found#:#Les pages suivantes correspondent à votre terme de recherche '$1'. @@ -16946,7 +16948,7 @@ wiki#:#wiki_rename_page#:#Renommer la Page wiki#:#wiki_save_ordering_and_indent#:#Enregistrer Positions et Indentation wiki#:#wiki_search#:#Rechercher wiki#:#wiki_search_results#:#Résultats de Recherche -wiki#:#wiki_sec_protect_info#:#Protected sections can only be edited by users having "Edit Settings" permission.###31 03 2023 new variable +wiki#:#wiki_sec_protect_info#:#Protected sections can only be edited by users having "Edit Settings" permission.###31 10 2023 new variable wiki#:#wiki_select_one_item#:#Veuillez sélectionner un élément. wiki#:#wiki_selected_pages#:#Pages Sélectionnées wiki#:#wiki_set_as_start_page#:#Définir comme Page de Démarrage @@ -17016,10 +17018,10 @@ wsp#:#share_content#:#Share content wsp#:#share_with#:#Share with: wsp#:#wsp_copy_to_repository#:#Copier vers le Catalogue wsp#:#wsp_invalid_password#:#Mot de passe non valide. -wsp#:#wsp_list_cmxv#:#Certificate of xAPI/cmi5 Object###07 02 2020 new variable +wsp#:#wsp_list_cmxv#:#Certificate of xAPI/cmi5 Object wsp#:#wsp_list_crsv#:#Certificat de Cours wsp#:#wsp_list_excv#:#Certificat d'Exercice -wsp#:#wsp_list_ltiv#:#Certificate of LTI Consumer Object###07 02 2020 new variable +wsp#:#wsp_list_ltiv#:#Certificate of LTI Consumer Object wsp#:#wsp_list_scov#:#Certificat SCORM wsp#:#wsp_list_tstv#:#Certificat de Test wsp#:#wsp_move_to_repository#:#Déplacer vers le Catalogue @@ -17031,42 +17033,42 @@ wsp#:#wsp_permission_all_pw_info#:#Une fois le mot de passe donné, cet objet se wsp#:#wsp_permission_registered_info#:#Cet objet est partagé avec tous les utilisateurs enregistrés. wsp#:#wsp_permission_removed#:#L'élément a été supprimé. wsp#:#wsp_permissions#:#Partager -wsp#:#wsp_personal_resources_description#:#Here you can manage your private files, blogs and artifacts.###07 02 2020 new variable +wsp#:#wsp_personal_resources_description#:#Ici, vous pouvez gérer vos fichiers privés, vos blogs et vos éléments. wsp#:#wsp_set_permission_all#:#Publier wsp#:#wsp_set_permission_all_password#:#Publier (Mot de Passe Requis) wsp#:#wsp_set_permission_course#:#Cours wsp#:#wsp_set_permission_group#:#Groupe -wsp#:#wsp_set_permission_registered#:#Tous les Utilisateurs Enregistrés -wsp#:#wsp_set_permission_single_user#:#Utilisateur Unique +wsp#:#wsp_set_permission_registered#:#Tous les utilisateurs enregistrés +wsp#:#wsp_set_permission_single_user#:#Utilisateur unique wsp#:#wsp_share_search_users#:#Rechercher Utilisateurs wsp#:#wsp_share_success#:#Une nouvelle entrée a été ajoutée. wsp#:#wsp_share_with_members#:#Partager avec les membres wsp#:#wsp_share_with_users#:#Partager avec les utilisateurs -wsp#:#wsp_shared_date#:#Date de Partage -wsp#:#wsp_shared_date_filter#:#Partagé Par -wsp#:#wsp_shared_filter_button#:#Appliquer le Filtre -wsp#:#wsp_shared_filter_reset_button#:#Réinitialiser le Filtre +wsp#:#wsp_shared_date#:#Date de partage +wsp#:#wsp_shared_date_filter#:#Partagé par +wsp#:#wsp_shared_filter_button#:#Appliquer le filtre +wsp#:#wsp_shared_filter_reset_button#:#Réinitialiser le filtre wsp#:#wsp_shared_mandatory_filter_info#:#Veuillez préciser au moins un champ de filtrage. Les filtres textuels doivent comporter au moins 4 caractères. -wsp#:#wsp_shared_member_filter#:#Membres du Cours / Groupe -wsp#:#wsp_shared_object_type#:#Type de Ressource -wsp#:#wsp_shared_resources#:#Ressources Partagées +wsp#:#wsp_shared_member_filter#:#Membres du cours / groupe +wsp#:#wsp_shared_object_type#:#Type de ressource +wsp#:#wsp_shared_resources#:#Ressources partagées wsp#:#wsp_shared_table_title#:#Partages -wsp#:#wsp_shared_title#:#Titre de Ressource -wsp#:#wsp_shared_type#:#Partagé Avec -wsp#:#wsp_shared_user_filter#:#Nom d'Utilisateur/Nom +wsp#:#wsp_shared_title#:#Titre de ressource +wsp#:#wsp_shared_type#:#Partagé avec +wsp#:#wsp_shared_user_filter#:#Nom d'utilisateur/nom wsp#:#wsp_shared_with#:#Partagé Avec wsp#:#wsp_status_shared#:#Partagé -wsp#:#wsp_switch_to_repo_tree#:#Switch to Repository###07 02 2020 new variable -wsp#:#wsp_switch_to_wsp_tree#:#Switch to Personal Resources###07 02 2020 new variable -wsp#:#wsp_tab_ownership#:#Mes Objets du Catalogue -wsp#:#wsp_tab_personal#:#Mes Ressources -wsp#:#wsp_tab_shared#:#Ressources d'Autres Utilisateurs +wsp#:#wsp_switch_to_repo_tree#:#Switch to Repository +wsp#:#wsp_switch_to_wsp_tree#:#Switch to Personal Resources +wsp#:#wsp_tab_ownership#:#Mes éléments du catalogue +wsp#:#wsp_tab_personal#:#Mes ressources +wsp#:#wsp_tab_shared#:#Ressources d'autres utilisateurs wsp#:#wsp_type_blog#:#Blog -wsp#:#wsp_type_cmxv#:#Certificate: xAPI/cmi5###07 02 2020 new variable +wsp#:#wsp_type_cmxv#:#Certificate: xAPI/cmi5 wsp#:#wsp_type_crsv#:#Certificat : Cours wsp#:#wsp_type_excv#:#Certificat : Exercice wsp#:#wsp_type_file#:#Fichier -wsp#:#wsp_type_ltiv#:#Certificate: LTI Consumer###07 02 2020 new variable +wsp#:#wsp_type_ltiv#:#Certificate: LTI Consumer wsp#:#wsp_type_scov#:#Certificat : SCORM wsp#:#wsp_type_tstv#:#Certificat : Test wsp#:#wsp_type_webr#:#Lien Web From 5530c74f6938a601553f3da7a229b98cccdc6c1d Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 31 Oct 2023 23:16:19 +0100 Subject: [PATCH 027/497] exercise: add team check before getting user name --- .../Assignment/class.ilExAssignment.php | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Modules/Exercise/Assignment/class.ilExAssignment.php b/Modules/Exercise/Assignment/class.ilExAssignment.php index 670d6f8a22d2..a02f80055bec 100644 --- a/Modules/Exercise/Assignment/class.ilExAssignment.php +++ b/Modules/Exercise/Assignment/class.ilExAssignment.php @@ -1189,18 +1189,20 @@ public function getMemberListData(): array // users in idl may already exist before occuring in the members db table // if user starts an assignment with relative deadline $idl = $this->getIndividualDeadlines(); - foreach ($idl as $user_id => $v) { - if (!isset($mem[$user_id])) { - if (ilObjUser::_exists($user_id)) { - $name = ilObjUser::_lookupName($user_id); - $mem[$user_id] = - array( - "name" => $name["lastname"] . ", " . $name["firstname"], - "login" => $name["login"], - "usr_id" => $user_id, - "lastname" => $name["lastname"], - "firstname" => $name["firstname"] - ); + if (!$this->ass_type->usesTeams()) { + foreach ($idl as $user_id => $v) { + if (!isset($mem[$user_id])) { + if (ilObjUser::_exists($user_id)) { + $name = ilObjUser::_lookupName($user_id); + $mem[$user_id] = + array( + "name" => $name["lastname"] . ", " . $name["firstname"], + "login" => $name["login"], + "usr_id" => $user_id, + "lastname" => $name["lastname"], + "firstname" => $name["firstname"] + ); + } } } } From 2b8e0f2b67d329fba1f6b0c336845e0c86643dca Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 1 Nov 2023 08:02:23 +0100 Subject: [PATCH 028/497] 38311: Survey export broken --- Modules/Survey/Export/class.ilSurveyExporter.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Modules/Survey/Export/class.ilSurveyExporter.php b/Modules/Survey/Export/class.ilSurveyExporter.php index 7003b925e5e7..a15b63f31c8c 100644 --- a/Modules/Survey/Export/class.ilSurveyExporter.php +++ b/Modules/Survey/Export/class.ilSurveyExporter.php @@ -47,6 +47,15 @@ public function getXmlRepresentation( // Unzip, since survey deletes this dir ilFileUtils::unzip($zip); + // unzip does not extract the included directory + // Modules/Survey/set_1 anymore (since 7/2023) + $missing = $svy_exp->export_dir . "/" . $svy_exp->subdir . + "/Modules/Survey/set_1"; + ilFileUtils::makeDirParents($missing); + + // here: svy_data/svy_301/export/1698817474__0__svy_301 + // svy_301/export/1698817474__0__svy_301/Modules/Survey/set_1 + // svy_data/svy_301/export/1698817474__0__svy_301.zip $GLOBALS['ilLog']->write(__METHOD__ . ': Created zip file ' . $zip); return ""; } else { From 7eda5c3a49b63482118aeb04a262ffb471e27eb8 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 1 Nov 2023 08:40:31 +0100 Subject: [PATCH 029/497] =?UTF-8?q?36830:=20Verschieben=20eines=20Taxonomi?= =?UTF-8?q?eknotens=20in=20sich=20selbst=20=C2=BB=20Error=20moving=20subtr?= =?UTF-8?q?ee?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Services/Taxonomy/classes/class.ilObjTaxonomyGUI.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Services/Taxonomy/classes/class.ilObjTaxonomyGUI.php b/Services/Taxonomy/classes/class.ilObjTaxonomyGUI.php index 17a35a40223a..5de6d28b4d52 100755 --- a/Services/Taxonomy/classes/class.ilObjTaxonomyGUI.php +++ b/Services/Taxonomy/classes/class.ilObjTaxonomyGUI.php @@ -626,7 +626,8 @@ public function pasteItems(): void ($target_node->getTaxonomyId() == $tax->getId() || $target_node->getId() == $tree->readRootId())) { // check if target is not within the selected nodes - if ($tree->isGrandChild((int) $m_id, $target_node->getId())) { + if ($tree->isGrandChild((int) $m_id, $target_node->getId()) || + $m_id == $target_node->getId()) { $this->tpl->setOnScreenMessage('failure', $lng->txt("tax_target_within_nodes"), true); $this->ctrl->redirect($this, "listNodes"); } From 42f16ca8939d97b75d8f42297cec33e688911394 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 1 Nov 2023 09:14:37 +0100 Subject: [PATCH 030/497] 26889: Wiki Page Print View does not show contents of a file list --- Services/COPage/xsl/page.xsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/COPage/xsl/page.xsl b/Services/COPage/xsl/page.xsl index 5f140e727eb0..a09cca16f2b3 100755 --- a/Services/COPage/xsl/page.xsl +++ b/Services/COPage/xsl/page.xsl @@ -1909,9 +1909,9 @@ - + - + From 9f0ba35cdfc621d792d7f2696fb42544cb1509c7 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 1 Nov 2023 11:09:11 +0100 Subject: [PATCH 031/497] 33849: Footnote: Incorrect numbering for a new text paragraph --- Services/COPage/xsl/page.xsl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Services/COPage/xsl/page.xsl b/Services/COPage/xsl/page.xsl index a09cca16f2b3..d3b60be63a10 100755 --- a/Services/COPage/xsl/page.xsl +++ b/Services/COPage/xsl/page.xsl @@ -130,7 +130,7 @@
Break
- +
@@ -1174,8 +1174,7 @@ -
#fn[] - + #fn[][fn][/fn] From 1995fcea42261df9ce02f971fa4f442fc0db092e Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 1 Nov 2023 13:43:33 +0100 Subject: [PATCH 032/497] 21347: Exercise => Give Peerfeedback => User changes the Default Sorting Order => Edit entry --- .../Assignment/class.ilExAssignmentPeerReviewTableGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Exercise/Assignment/class.ilExAssignmentPeerReviewTableGUI.php b/Modules/Exercise/Assignment/class.ilExAssignmentPeerReviewTableGUI.php index 2017b580d65f..3839e27e4e77 100644 --- a/Modules/Exercise/Assignment/class.ilExAssignmentPeerReviewTableGUI.php +++ b/Modules/Exercise/Assignment/class.ilExAssignmentPeerReviewTableGUI.php @@ -43,7 +43,7 @@ public function __construct( $this->ass = $a_ass; $this->user_id = $a_user_id; $this->peer_data = $a_peer_data; - + $this->setId("exc_peer_rv_fb"); parent::__construct($a_parent_obj, $a_parent_cmd); $this->setLimit(9999); From 140827fb825b0396509658c4722cd81beb8fc04b Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 2 Nov 2023 08:19:46 +0100 Subject: [PATCH 033/497] Cron: Handle empty selection for actions See: https://mantis.ilias.de/view.php?id=38435 (cherry picked from commit a92f89febac286a9acea117b4992ec4f9c09da32) --- Services/Cron/classes/class.ilCronManagerGUI.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Services/Cron/classes/class.ilCronManagerGUI.php b/Services/Cron/classes/class.ilCronManagerGUI.php index ca792b09c04f..300c251ecee2 100644 --- a/Services/Cron/classes/class.ilCronManagerGUI.php +++ b/Services/Cron/classes/class.ilCronManagerGUI.php @@ -403,6 +403,8 @@ public function confirmedActivate(): void } $this->tpl->setOnScreenMessage('success', $this->lng->txt('cron_action_activate_success'), true); + } else { + $this->tpl->setOnScreenMessage('info', $this->lng->txt('no_checkbox'), true); } $this->ctrl->redirect($this, 'render'); @@ -428,6 +430,8 @@ public function confirmedDeactivate(): void } $this->tpl->setOnScreenMessage('success', $this->lng->txt('cron_action_deactivate_success'), true); + } else { + $this->tpl->setOnScreenMessage('info', $this->lng->txt('no_checkbox'), true); } $this->ctrl->redirect($this, 'render'); @@ -450,6 +454,8 @@ public function confirmedReset(): void $this->cronManager->resetJob($job, $this->actor); } $this->tpl->setOnScreenMessage('success', $this->lng->txt('cron_action_reset_success'), true); + } else { + $this->tpl->setOnScreenMessage('info', $this->lng->txt('no_checkbox'), true); } $this->ctrl->redirect($this, 'render'); @@ -469,7 +475,7 @@ protected function getMultiActionData(): array } catch (\ILIAS\Refinery\ConstraintViolationException | OutOfBoundsException $e) { $job_ids = $this->getRequestValue('mjid', $this->refinery->kindlyTo()->listOf( $this->refinery->kindlyTo()->string() - ), false); + ), false, []); } } catch (\ILIAS\Refinery\ConstraintViolationException | OutOfBoundsException $e) { } @@ -492,6 +498,7 @@ protected function confirm(string $a_action): void $jobs = $this->getMultiActionData(); if ($jobs === []) { + $this->tpl->setOnScreenMessage('info', $this->lng->txt('no_checkbox'), true); $this->ctrl->redirect($this, 'render'); } From 2f4423feaf4ca4bde1db8ba251c7ba460d252a9e Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 2 Nov 2023 10:39:30 +0100 Subject: [PATCH 034/497] Forum: Fix moving empty threads See: https://mantis.ilias.de/view.php?id=38451 (cherry picked from commit 23323d5a130f2a135b76fc20a65db717cace7556) --- Modules/Forum/classes/class.ilForum.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Modules/Forum/classes/class.ilForum.php b/Modules/Forum/classes/class.ilForum.php index 71031a19c318..674803d64fde 100755 --- a/Modules/Forum/classes/class.ilForum.php +++ b/Modules/Forum/classes/class.ilForum.php @@ -411,8 +411,11 @@ public function moveThreads(array $thread_ids, ilObjForum $src_forum, int $targe [$oldFrmData->getTopPk()] ); + $last_post_src = ''; $row = $this->db->fetchObject($res); - $last_post_src = $oldFrmData->getTopPk() . '#' . $row->pos_thr_fk . '#' . $row->pos_pk; + if ($row !== null) { + $last_post_src = $oldFrmData->getTopPk() . '#' . $row->pos_thr_fk . '#' . $row->pos_pk; + } $this->db->manipulateF( 'UPDATE frm_data ' . @@ -435,8 +438,11 @@ public function moveThreads(array $thread_ids, ilObjForum $src_forum, int $targe [$newFrmData->getTopPk()] ); + $last_post_dest = ''; $row = $this->db->fetchObject($res); - $last_post_dest = $newFrmData->getTopPk() . '#' . $row->pos_thr_fk . '#' . $row->pos_pk; + if ($row !== null) { + $last_post_dest = $newFrmData->getTopPk() . '#' . $row->pos_thr_fk . '#' . $row->pos_pk; + } $this->db->manipulateF( 'UPDATE frm_data SET top_num_posts = top_num_posts + %s, top_num_threads = top_num_threads + %s, ' . From 5a0564285d205d4772c1491704482a7634251249 Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 2 Nov 2023 12:47:22 +0100 Subject: [PATCH 035/497] Chatroom: Fix tab activation See: https://mantis.ilias.de/view.php?id=38468 --- .../classes/class.ilChatroomTabGUIFactory.php | 20 ++++++++++++++++++- .../classes/class.ilObjChatroomAdminGUI.php | 4 +--- .../classes/class.ilObjChatroomGUI.php | 7 +++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Modules/Chatroom/classes/class.ilChatroomTabGUIFactory.php b/Modules/Chatroom/classes/class.ilChatroomTabGUIFactory.php index 1376d347bd69..f1221a995105 100644 --- a/Modules/Chatroom/classes/class.ilChatroomTabGUIFactory.php +++ b/Modules/Chatroom/classes/class.ilChatroomTabGUIFactory.php @@ -35,6 +35,8 @@ class ilChatroomTabGUIFactory private ilRbacSystem $rbacSystem; private GlobalHttpState $http; private Refinery $refinery; + private ?string $activated_tab = null; + private ?string $activated_sub_tab = null; public function __construct(ilObjectGUI $gui) { @@ -132,7 +134,10 @@ public function getAdminTabsForCommand(string $command): void ]; $DIC->ctrl()->clearParametersByClass(ilPermissionGUI::class); - $is_in_permission_gui = strtolower($DIC->ctrl()->getCmdClass()) === strtolower(ilPermissionGUI::class); + $is_in_permission_gui = ( + strtolower($DIC->ctrl()->getCmdClass()) === strtolower(ilPermissionGUI::class) || + strtolower($DIC->ctrl()->getCmdClass()) === strtolower(ilObjectPermissionStatusGUI::class) + ); $commandParts = explode('_', $command, 2); if ($command === 'ban_show') { @@ -264,16 +269,29 @@ private function activateTab(array $commandParts, array $config): void if (count($commandParts) > 1) { if (isset($config[$commandParts[0]])) { $DIC->tabs()->activateTab($commandParts[0]); + $this->activated_tab = $commandParts[0]; if (isset($config[$commandParts[0]]['subtabs'][$commandParts[1]])) { $DIC->tabs()->activateSubTab($commandParts[1]); + $this->activated_sub_tab = $commandParts[1]; } } } elseif (count($commandParts) === 1) { $DIC->tabs()->activateTab($commandParts[0]); + $this->activated_tab = $commandParts[0]; } } + public function getActivatedTab(): ?string + { + return $this->activated_tab; + } + + public function getActivatedSubTab(): ?string + { + return $this->activated_sub_tab; + } + /** * Builds $config and $commandparts arrays to assign them as parameters * when calling $this->buildTabs and $this->activateTab. diff --git a/Modules/Chatroom/classes/class.ilObjChatroomAdminGUI.php b/Modules/Chatroom/classes/class.ilObjChatroomAdminGUI.php index ff12afe1a689..6858e53fca59 100644 --- a/Modules/Chatroom/classes/class.ilObjChatroomAdminGUI.php +++ b/Modules/Chatroom/classes/class.ilObjChatroomAdminGUI.php @@ -57,11 +57,8 @@ public function executeCommand(): void { $next_class = strtolower($this->ctrl->getNextClass()); - $tabFactory = new ilChatroomTabGUIFactory($this); - switch ($next_class) { case strtolower(ilPermissionGUI::class): - $tabFactory->getAdminTabsForCommand($this->ctrl->getCmd()); $this->prepareOutput(); $perm_gui = new ilPermissionGUI($this); $this->ctrl->forwardCommand($perm_gui); @@ -79,6 +76,7 @@ public function executeCommand(): void break; default: + $tabFactory = new ilChatroomTabGUIFactory($this); $tabFactory->getAdminTabsForCommand($this->ctrl->getCmd()); $res = explode('-', $this->ctrl->getCmd(), 2); if (!array_key_exists(1, $res)) { diff --git a/Modules/Chatroom/classes/class.ilObjChatroomGUI.php b/Modules/Chatroom/classes/class.ilObjChatroomGUI.php index bafe2e1e7ccf..1ee49caee50d 100644 --- a/Modules/Chatroom/classes/class.ilObjChatroomGUI.php +++ b/Modules/Chatroom/classes/class.ilObjChatroomGUI.php @@ -163,6 +163,7 @@ public function executeCommand(): void $next_class = $this->ctrl->getNextClass(); + $tabFactory = null; if (!$this->getCreationMode()) { $tabFactory = new ilChatroomTabGUIFactory($this); @@ -255,6 +256,12 @@ public function executeCommand(): void } break; } + + if ($tabFactory !== null && + $tabFactory->getActivatedTab() !== null && + $this->tabs_gui->getActiveTab() !== $tabFactory->getActivatedTab()) { + $this->tabs_gui->activateTab($tabFactory->getActivatedTab()); + } } public function getConnector(): ilChatroomServerConnector From a292ca0b02d4fbd9285389d0bf03897e9a7742bc Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 2 Nov 2023 13:00:48 +0100 Subject: [PATCH 036/497] User: Fix Local Role Selection Starting Point --- Services/User/classes/class.ilUserStartingPointGUI.php | 2 +- lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Services/User/classes/class.ilUserStartingPointGUI.php b/Services/User/classes/class.ilUserStartingPointGUI.php index a173eeee20e9..e1c6bc6321f0 100644 --- a/Services/User/classes/class.ilUserStartingPointGUI.php +++ b/Services/User/classes/class.ilUserStartingPointGUI.php @@ -472,7 +472,7 @@ protected function showRoleSelection( $table->addHiddenInput("role", $role); $table->addHiddenInput("role_type", 1); $table->setTitle($this->lng->txt('user_role_selection')); - $table->addMultiCommand('saveStartingPoint', $this->lng->txt('user_choose_role')); + $table->addMultiCommand('saveStartingPoint', $this->lng->txt('select')); $table->parse($entries); $this->tpl->setContent($table->getHTML()); diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index b44c0470ae4d..783c90ef33eb 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -16740,6 +16740,7 @@ user#:#user_prompting_recurrence#:#Häufigkeit user#:#user_prompting_settings#:#Aufforderung Profilveröffentlichung user#:#user_public_profile_info#:#Bitte wählen Sie aus, welche Daten in Ihrem Profil erscheinen sollen und welche Benutzer es betrachten können. user#:#user_publish_options#:#Profil veröffentlichen +user#:#user_role_selection#:#Rollenauswahl user#:#user_role_starting_point#:#Benutzer - Startseite user#:#user_save_continue#:#Speichern und weiter user#:#user_save_ordering_and_titles#:#Reihenfolge und Titel speichern diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 191a91ee0b61..11b347ef14d5 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -16740,6 +16740,7 @@ user#:#user_prompting_recurrence#:#When and How Often a User is Prompted user#:#user_prompting_settings#:#Prompting Settings user#:#user_public_profile_info#:#Please select which personal data you would like to have visible in your profile and which users should be able to visit your profile. user#:#user_publish_options#:#Publish Profile +user#:#user_role_selection#:#Role Selection user#:#user_role_starting_point#:#User - Starting Point user#:#user_save_continue#:#Save and Continue user#:#user_save_ordering_and_titles#:#Save Order and Titles From c472a284af8715992edfa680a7cca4e2a9b706b0 Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 2 Nov 2023 14:12:11 +0100 Subject: [PATCH 037/497] Badge: Fix inactive types results in error See: https://mantis.ilias.de/view.php?id=38471 --- Services/Badge/classes/class.ilBadgeHandler.php | 4 ++-- Services/Badge/classes/class.ilObjBadgeAdministrationGUI.php | 2 +- Services/Badge/classes/class.ilObjectBadgeTableGUI.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Services/Badge/classes/class.ilBadgeHandler.php b/Services/Badge/classes/class.ilBadgeHandler.php index 2cacdee505d3..25b78ee3a67c 100644 --- a/Services/Badge/classes/class.ilBadgeHandler.php +++ b/Services/Badge/classes/class.ilBadgeHandler.php @@ -208,7 +208,7 @@ public function setInactiveTypes(array $a_types = null): void * Get badges types * @return array */ - public function getAvailableTypes(): array + public function getAvailableTypes(bool $exclude_inactive = true): array { $res = []; @@ -218,7 +218,7 @@ public function getAvailableTypes(): array if ($provider) { foreach ($provider->getBadgeTypes() as $type) { $id = $this->getUniqueTypeId($component_id, $type); - if (!in_array($id, $inactive, true)) { + if (!$exclude_inactive || !in_array($id, $inactive, true)) { $res[$id] = $type; } } diff --git a/Services/Badge/classes/class.ilObjBadgeAdministrationGUI.php b/Services/Badge/classes/class.ilObjBadgeAdministrationGUI.php index 6183305b8289..a779ccbeab23 100644 --- a/Services/Badge/classes/class.ilObjBadgeAdministrationGUI.php +++ b/Services/Badge/classes/class.ilObjBadgeAdministrationGUI.php @@ -343,7 +343,7 @@ protected function initImageTemplateForm( $types->setRequired(true); $type_spec->addSubItem($types); - foreach (ilBadgeHandler::getInstance()->getAvailableTypes() as $id => $type) { + foreach (ilBadgeHandler::getInstance()->getAvailableTypes(false) as $id => $type) { $types->addOption(new ilCheckboxOption($type->getCaption(), $id)); } diff --git a/Services/Badge/classes/class.ilObjectBadgeTableGUI.php b/Services/Badge/classes/class.ilObjectBadgeTableGUI.php index 15c817f91b96..d83f008e3f64 100644 --- a/Services/Badge/classes/class.ilObjectBadgeTableGUI.php +++ b/Services/Badge/classes/class.ilObjectBadgeTableGUI.php @@ -113,7 +113,7 @@ public function getItems(): void $data = []; - $types = ilBadgeHandler::getInstance()->getAvailableTypes(); + $types = ilBadgeHandler::getInstance()->getAvailableTypes(false); foreach (ilBadge::getObjectInstances($this->filter) as $badge_item) { // :TODO: container presentation From 64cbde18ba3f1d5bf13eb2f95a329811d0867d80 Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 2 Nov 2023 16:30:58 +0100 Subject: [PATCH 038/497] Content Page: Fix editing title and description with enabled i18n See: https://mantis.ilias.de/view.php?id=38502 (cherry picked from commit 686a97726df6029e1c5762ab5025669690aeba9e) --- .../classes/class.ilObjContentPageGUI.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Modules/ContentPage/classes/class.ilObjContentPageGUI.php b/Modules/ContentPage/classes/class.ilObjContentPageGUI.php index 15a448abcd4d..e9f2dc1a2c9d 100644 --- a/Modules/ContentPage/classes/class.ilObjContentPageGUI.php +++ b/Modules/ContentPage/classes/class.ilObjContentPageGUI.php @@ -560,6 +560,20 @@ protected function initEditCustomForm(ilPropertyFormGUI $a_form): void ilObjectServiceSettingsGUI::INFO_TAB_VISIBILITY ] ); + + if ($this->getCreationMode() !== true && count($this->object->getObjectTranslation()->getLanguages()) > 1) { + $languages = ilMDLanguageItem::_getLanguages(); + $a_form->getItemByPostVar('title') + ->setInfo( + implode( + ': ', + [ + $this->lng->txt('language'), + $languages[$this->object->getObjectTranslation()->getDefaultLanguage()] + ] + ) + ); + } } private function addAvailabilitySection(ilPropertyFormGUI $form): void @@ -577,6 +591,11 @@ protected function getEditFormCustomValues(array &$a_values): void { $a_values['activation_online'] = $this->object->getOfflineStatus() === false; $a_values[ilObjectServiceSettingsGUI::INFO_TAB_VISIBILITY] = $this->infoScreenEnabled; + + if (count($this->object->getObjectTranslation()->getLanguages()) > 1) { + $a_values['title'] = $this->object->getObjectTranslation()->getDefaultTitle(); + $a_values['desc'] = $this->object->getObjectTranslation()->getDefaultDescription(); + } } protected function updateCustom(ilPropertyFormGUI $form): void From d3483ce4f542088100e95b9104652901800bc260 Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 2 Nov 2023 19:15:14 +0100 Subject: [PATCH 039/497] Chatroom: Fix tab activation See: https://mantis.ilias.de/view.php?id=38468 --- Modules/Chatroom/classes/class.ilObjChatroomAdminGUI.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Modules/Chatroom/classes/class.ilObjChatroomAdminGUI.php b/Modules/Chatroom/classes/class.ilObjChatroomAdminGUI.php index 6858e53fca59..3f34239667f3 100644 --- a/Modules/Chatroom/classes/class.ilObjChatroomAdminGUI.php +++ b/Modules/Chatroom/classes/class.ilObjChatroomAdminGUI.php @@ -57,8 +57,11 @@ public function executeCommand(): void { $next_class = strtolower($this->ctrl->getNextClass()); + $tabFactory = new ilChatroomTabGUIFactory($this); + switch ($next_class) { case strtolower(ilPermissionGUI::class): + $tabFactory->getAdminTabsForCommand($this->ctrl->getCmd()); $this->prepareOutput(); $perm_gui = new ilPermissionGUI($this); $this->ctrl->forwardCommand($perm_gui); @@ -76,7 +79,6 @@ public function executeCommand(): void break; default: - $tabFactory = new ilChatroomTabGUIFactory($this); $tabFactory->getAdminTabsForCommand($this->ctrl->getCmd()); $res = explode('-', $this->ctrl->getCmd(), 2); if (!array_key_exists(1, $res)) { @@ -85,6 +87,11 @@ public function executeCommand(): void $this->dispatchCall($res[0], $res[1]); } + + if ($tabFactory->getActivatedTab() !== null && + $this->tabs_gui->getActiveTab() !== $tabFactory->getActivatedTab()) { + $this->tabs_gui->activateTab($tabFactory->getActivatedTab()); + } } public function getConnector(): ilChatroomServerConnector From 3054d2bf53ceee55cfbe52d113f122f0cc1bf231 Mon Sep 17 00:00:00 2001 From: Thomas Famula Date: Fri, 3 Nov 2023 16:53:35 +0100 Subject: [PATCH 040/497] Fix 33585: Uncaught ReferenceError: $ is not defined when Filter is being deactivated --- Services/UI/classes/class.ilUIFilterService.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/UI/classes/class.ilUIFilterService.php b/Services/UI/classes/class.ilUIFilterService.php index 7548de822538..2d6647c121ca 100644 --- a/Services/UI/classes/class.ilUIFilterService.php +++ b/Services/UI/classes/class.ilUIFilterService.php @@ -112,8 +112,8 @@ public function standard( // get the filter $filter = $ui->input()->container()->filter()->standard( - $this->request->getAction($base_action, self::CMD_TOGGLE_ON), - $this->request->getAction($base_action, self::CMD_TOGGLE_OFF), + $this->request->getAction($base_action, self::CMD_TOGGLE_ON, true), + $this->request->getAction($base_action, self::CMD_TOGGLE_OFF, true), $this->request->getAction($base_action, self::CMD_EXPAND), $this->request->getAction($base_action, self::CMD_COLLAPSE), $this->request->getAction($base_action, self::CMD_APPLY, true), From 865910a1dc75c58a00f0e12028f4c46934c66107 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 5 Nov 2023 15:46:13 +0100 Subject: [PATCH 041/497] 37569: Title of the character format in page editor --- .../COPage/classes/class.ilPageObjectGUI.php | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/Services/COPage/classes/class.ilPageObjectGUI.php b/Services/COPage/classes/class.ilPageObjectGUI.php index 7f8b6d2b5e98..8761116fadd0 100755 --- a/Services/COPage/classes/class.ilPageObjectGUI.php +++ b/Services/COPage/classes/class.ilPageObjectGUI.php @@ -1778,18 +1778,37 @@ public static function getTinyMenu( $ctrl = $DIC->ctrl(); $ui = $DIC->ui(); + $style_service = $DIC->contentStyle()->internal(); + $style_access_manager = $style_service->domain()->access( + 0, + $DIC->user()->getId() + ); + $char_manager = $style_service->domain()->characteristic( + $a_style_id, + $style_access_manager + ); + $aset = new ilSetting("adve"); + $f = static function (string $type, string $code) use ($char_manager, $lng) : string { + $title = $char_manager->getPresentationTitle("text_inline", $type); + if ($title === $type) { + $title = $lng->txt("cont_char_style_" . $code); + } + return $title; + }; + // character styles $chars = array( - "Comment" => array("code" => "com", "txt" => $lng->txt("cont_char_style_com")), - "Quotation" => array("code" => "quot", "txt" => $lng->txt("cont_char_style_quot")), - "Accent" => array("code" => "acc", "txt" => $lng->txt("cont_char_style_acc")), - "Code" => array("code" => "code", "txt" => $lng->txt("cont_char_style_code")) + "Comment" => array("code" => "com", "txt" => $f("Comment", "com")), + "Quotation" => array("code" => "quot", "txt" => $f("Quotation", "quot")), + "Accent" => array("code" => "acc", "txt" => $f("Accent", "acc")), + "Code" => array("code" => "code", "txt" => $f("Code", "code")) ); foreach (ilPCParagraphGUI::_getTextCharacteristics($a_style_id) as $c) { if (!isset($chars[$c])) { - $chars[$c] = array("code" => "", "txt" => $c); + $title = $char_manager->getPresentationTitle("text_inline", $c); + $chars[$c] = array("code" => "", "txt" => $title); } } $char_formats = []; From af672671e01843c3cb8d4bf8e8419144d8313ec1 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 5 Nov 2023 22:06:35 +0100 Subject: [PATCH 042/497] =?UTF-8?q?28109:=20Beitrags=C3=BCbersicht=20in=20?= =?UTF-8?q?Blogs=20nicht=20aufrufbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Blog/classes/class.ilObjBlogGUI.php | 8 ++++++++ .../default/tpl.blog_list_navigation_by_date.html | 1 + lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 4 files changed, 11 insertions(+) diff --git a/Modules/Blog/classes/class.ilObjBlogGUI.php b/Modules/Blog/classes/class.ilObjBlogGUI.php index 879ab7bcc93f..90a75bcfe44f 100644 --- a/Modules/Blog/classes/class.ilObjBlogGUI.php +++ b/Modules/Blog/classes/class.ilObjBlogGUI.php @@ -1793,6 +1793,14 @@ protected function renderNavigationByDate( } $wtpl->parseCurrentBlock(); } + $this->ctrl->setParameterByClass(self::class, "bmn", null); + $wtpl->setVariable("STARTING_PAGE", + $this->ui->renderer()->render( + $this->ui->factory()->link()->standard( + $this->lng->txt("blog_starting_page"), + $this->ctrl->getLinkTargetByClass(self::class, "preview") + ) + )); } // single month else { diff --git a/Modules/Blog/templates/default/tpl.blog_list_navigation_by_date.html b/Modules/Blog/templates/default/tpl.blog_list_navigation_by_date.html index 5a4f0ea5f405..b8d76d375b4c 100644 --- a/Modules/Blog/templates/default/tpl.blog_list_navigation_by_date.html +++ b/Modules/Blog/templates/default/tpl.blog_list_navigation_by_date.html @@ -1,3 +1,4 @@ +

{STARTING_PAGE}

diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 783c90ef33eb..3e1429c2de0a 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -2462,6 +2462,7 @@ blog#:#blog_settings#:#Blog-Administration blog#:#blog_settings_navigation#:#Navigation blog#:#blog_show_latest#:#Neueste Beiträge/Entwürfe anzeigen blog#:#blog_show_print_view#:#Druckansicht +blog#:#blog_starting_page#:#Startseite blog#:#blog_style#:#Blog-Style blog#:#blog_task_publishing_draft_title#:#Veröffentlichen des Entwurfs "%s" blog#:#blog_toggle_draft#:#Veröffentlichung zurücknehmen diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 11b347ef14d5..f3903076cf79 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -2462,6 +2462,7 @@ blog#:#blog_settings#:#Blog Administration blog#:#blog_settings_navigation#:#Navigation Column blog#:#blog_show_latest#:#Show latest postings/drafts blog#:#blog_show_print_view#:#Show Print View +blog#:#blog_starting_page#:#Starting Page blog#:#blog_style#:#Blog Style blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s" blog#:#blog_toggle_draft#:#Withdraw Publication From 9c4e55f99ac0e79900f26aaf74f37e3720b04d58 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 6 Nov 2023 07:14:22 +0100 Subject: [PATCH 043/497] 35915: Submission & grades > Participant View: Participant does not remain selected --- Modules/Exercise/classes/class.ilExerciseManagementGUI.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Exercise/classes/class.ilExerciseManagementGUI.php b/Modules/Exercise/classes/class.ilExerciseManagementGUI.php index ef15d6ca49c7..4ceedfa8f920 100644 --- a/Modules/Exercise/classes/class.ilExerciseManagementGUI.php +++ b/Modules/Exercise/classes/class.ilExerciseManagementGUI.php @@ -143,6 +143,7 @@ public function __construct(InternalService $service, ilExAssignment $a_ass = nu $this->ctrl->saveParameter($this, array("vw", "member_id")); $this->http = $DIC->http(); + $this->ctrl->saveParameter($this, array("part_id")); } /** From e6a76759818e17c9890fb53c0f97806a7b816385 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 5 Nov 2023 16:24:49 +0100 Subject: [PATCH 044/497] 32543: LSO intro/extro page editor block styles have no effect --- .../classes/class.ilObjLearningSequenceGUI.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Modules/LearningSequence/classes/class.ilObjLearningSequenceGUI.php b/Modules/LearningSequence/classes/class.ilObjLearningSequenceGUI.php index 7e4c7874dd6a..739553734c9a 100644 --- a/Modules/LearningSequence/classes/class.ilObjLearningSequenceGUI.php +++ b/Modules/LearningSequence/classes/class.ilObjLearningSequenceGUI.php @@ -106,6 +106,7 @@ class ilObjLearningSequenceGUI extends ilContainerGUI implements ilCtrlBaseClass public const ACCESS_READ = 'read'; public const ACCESS_VISIBLE = 'visible'; + protected \ILIAS\Style\Content\Service $content_style; protected string $obj_type; protected ilNavigationHistory $navigation_history; @@ -222,6 +223,7 @@ public function __construct() $this->request_wrapper = $DIC->http()->wrapper()->query(); $this->post_wrapper = $DIC->http()->wrapper()->post(); $this->refinery = $DIC->refinery(); + $this->content_style = $DIC->contentStyle(); $this->help->setScreenIdComponent($this->obj_type); $this->lng->loadLanguageModule($this->obj_type); @@ -327,6 +329,7 @@ public function executeCommand(): void $gui_class = 'ilObjLearningSequenceEditExtroGUI'; } + $this->addContentStyleCss(); $this->addSubTabsForContent($which_tab); $page_id = $this->object->getContentPageId($which_page); @@ -453,6 +456,14 @@ public function executeCommand(): void } } + public function addContentStyleCss(): void + { + $this->content_style->gui()->addCss( + $this->tpl, + $this->object->getRefId() + ); + } + public function addToNavigationHistory(): void { if ( @@ -537,6 +548,7 @@ protected function manageContent(string $cmd = self::CMD_CONTENT): void protected function learnerView(string $cmd = self::CMD_LEARNER_VIEW): void { + $this->addContentStyleCss(); $this->tabs->activateTab(self::TAB_CONTENT_MAIN); $this->addSubTabsForContent(self::TAB_VIEW_CONTENT); From ed22848b88ead7ed215fdfbe896438e23e543100 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 6 Nov 2023 08:42:35 +0100 Subject: [PATCH 045/497] 32254: Advanced Table: Style Class only in edit mode visible --- Modules/Portfolio/classes/class.ilObjPortfolioGUI.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Modules/Portfolio/classes/class.ilObjPortfolioGUI.php b/Modules/Portfolio/classes/class.ilObjPortfolioGUI.php index b3ad2965f7db..c81c9068ad56 100644 --- a/Modules/Portfolio/classes/class.ilObjPortfolioGUI.php +++ b/Modules/Portfolio/classes/class.ilObjPortfolioGUI.php @@ -76,7 +76,6 @@ protected function checkPermissionBool( public function executeCommand(): void { $this->checkPermission("read"); - $this->setTitleAndDescription(); $next_class = $this->ctrl->getNextClass($this); @@ -96,7 +95,6 @@ public function executeCommand(): void // trigger assignment tool $this->triggerAssignmentTool(); - switch ($next_class) { case "ilworkspaceaccessgui": if ($this->checkPermissionBool("write")) { @@ -608,6 +606,7 @@ protected function getPageGUIInstance( 0, $this->object->hasPublicComments() ); + $page_gui->setStyleId($this->content_style_domain->getEffectiveStyleId()); $page_gui->setAdditional($this->getAdditional()); return $page_gui; } From c8a05593c81967ed2e06a88b8bf8b3a97d185bf0 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Tue, 17 Oct 2023 16:54:52 +0200 Subject: [PATCH 046/497] LSO: #35142, another safety around path for file deletion --- .../classes/Settings/class.ilLearningSequenceFilesystem.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/LearningSequence/classes/Settings/class.ilLearningSequenceFilesystem.php b/Modules/LearningSequence/classes/Settings/class.ilLearningSequenceFilesystem.php index 8e5614419da1..8f60e4e542c0 100644 --- a/Modules/LearningSequence/classes/Settings/class.ilLearningSequenceFilesystem.php +++ b/Modules/LearningSequence/classes/Settings/class.ilLearningSequenceFilesystem.php @@ -69,7 +69,7 @@ public function delete_image(string $which, ilLearningSequenceSettings $settings $delete = $settings->getExtroImage(); $settings = $settings->withExtroImage(); } - if (!empty($delete)) { + if ($delete !== '' && str_starts_with($delete, $this->getStoragePath())) { $this->deleteFile($delete); } return $settings; From dfc754a25849baa58488a057b0822d04b9a39089 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Mon, 6 Nov 2023 15:39:59 +0100 Subject: [PATCH 047/497] Calendar: type fix (38480) --- .../classes/Export/class.ilCalendarExport.php | 3 ++ .../class.ilCalendarMailNotification.php | 39 ++++++++----------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/Services/Calendar/classes/Export/class.ilCalendarExport.php b/Services/Calendar/classes/Export/class.ilCalendarExport.php index ebbd00717a31..c8c3703cc11b 100644 --- a/Services/Calendar/classes/Export/class.ilCalendarExport.php +++ b/Services/Calendar/classes/Export/class.ilCalendarExport.php @@ -67,6 +67,9 @@ public function getUserSettings(): ilCalendarUserSettings return $this->user_settings; } + /** + * @param int[] $a_apps + */ public function setAppointments(array $a_apps): void { $this->appointments = $a_apps; diff --git a/Services/Calendar/classes/class.ilCalendarMailNotification.php b/Services/Calendar/classes/class.ilCalendarMailNotification.php index 583e9ec45cf7..add740271f6f 100644 --- a/Services/Calendar/classes/class.ilCalendarMailNotification.php +++ b/Services/Calendar/classes/class.ilCalendarMailNotification.php @@ -1,27 +1,22 @@ setExportType(ilCalendarExport::EXPORT_APPOINTMENTS); - $export->setAppointments(array(new ilCalendarEntry($this->getAppointmentId()))); + $export->setAppointments([(int) $this->getAppointmentId()]); $export->export(); $attachment = new ilFileDataMail($this->getSender()); From aea445ecfca578027debbbb1c69b4cc7e7426bc5 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Mon, 6 Nov 2023 17:11:41 +0100 Subject: [PATCH 048/497] Session: fix table view controls (37575) --- Modules/Session/classes/class.ilSessionOverviewTableGUI.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/Session/classes/class.ilSessionOverviewTableGUI.php b/Modules/Session/classes/class.ilSessionOverviewTableGUI.php index 43ab86f896ef..043b66a4e2c0 100644 --- a/Modules/Session/classes/class.ilSessionOverviewTableGUI.php +++ b/Modules/Session/classes/class.ilSessionOverviewTableGUI.php @@ -1,7 +1,5 @@ setFormAction($this->ctrl->getFormAction($a_parent_obj, $a_parent_cmd)); + $this->setTitle($this->lng->txt('event_overview')); $this->addColumn($this->lng->txt('name'), 'name'); From e2434dbfa222cb0f79e0da342f7812b0b67e610d Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Tue, 17 Oct 2023 17:41:55 +0200 Subject: [PATCH 049/497] PRG: #38067, do no generate progress-trees for permission (delete) check --- .../classes/class.ilObjStudyProgramme.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php b/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php index e82c46882949..4795320dfa63 100644 --- a/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php +++ b/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php @@ -1146,12 +1146,16 @@ public function addMissingProgresses(): void */ public function hasRelevantProgresses(): bool { - $assignments = $this->getAssignments(); - $relevant = array_filter( - $assignments, - fn ($ass) => $ass->getProgressForNode($this->getId())->isRelevant() + $filter = new ilPRGAssignmentFilter($this->lng); + $filter = $filter->withValues([ + 'prg_status_hide_irrelevant'=> true + ]); + $count = $this->assignment_repository->countAllForNodeIsContained( + $this->getId(), + null, + $filter ); - return count($relevant) > 0; + return $count > 0; } public function getIdsOfUsersWithRelevantProgress(): array From 5d0c28734be1040392cae911af29cf6f636b4f15 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Tue, 17 Oct 2023 17:52:16 +0200 Subject: [PATCH 050/497] PRG: #38066, do no generate progress-trees for ListGUI check --- .../classes/class.ilObjStudyProgramme.php | 13 ++++++++++--- .../classes/class.ilObjStudyProgrammeListGUI.php | 7 +++---- .../model/Assignments/PRGAssignmentRepository.php | 13 +++++++++++-- Modules/StudyProgramme/test/prg_mocks.php | 8 ++++++-- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php b/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php index 4795320dfa63..598dd43653af 100644 --- a/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php +++ b/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php @@ -1,7 +1,5 @@ getAssignments()) > 0; + $filter = new ilPRGAssignmentFilter($this->lng); + $count = $this->assignment_repository->countAllForNodeIsContained( + $this->getId(), + null, + $filter + ); + return $count > 0; + } /** diff --git a/Modules/StudyProgramme/classes/class.ilObjStudyProgrammeListGUI.php b/Modules/StudyProgramme/classes/class.ilObjStudyProgrammeListGUI.php index 5280cdf5de75..bbf00787dbca 100644 --- a/Modules/StudyProgramme/classes/class.ilObjStudyProgrammeListGUI.php +++ b/Modules/StudyProgramme/classes/class.ilObjStudyProgrammeListGUI.php @@ -1,7 +1,5 @@ getAssignments(); - if ($this->getCheckboxStatus() && count($assignments) > 0) { + if ($this->getCheckboxStatus() && $prg->hasAssignments()) { $this->setAdditionalInformation($this->lng->txt("prg_can_not_manage_in_repo")); $this->enableCheckbox(false); } else { diff --git a/Modules/StudyProgramme/classes/model/Assignments/PRGAssignmentRepository.php b/Modules/StudyProgramme/classes/model/Assignments/PRGAssignmentRepository.php index 62969c7d7d40..1ab49ac567bf 100644 --- a/Modules/StudyProgramme/classes/model/Assignments/PRGAssignmentRepository.php +++ b/Modules/StudyProgramme/classes/model/Assignments/PRGAssignmentRepository.php @@ -1,7 +1,5 @@ Date: Mon, 6 Nov 2023 14:45:30 +0100 Subject: [PATCH 051/497] Test: Fix Uninitialized Original-Id --- Modules/TestQuestionPool/classes/class.assQuestion.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/TestQuestionPool/classes/class.assQuestion.php b/Modules/TestQuestionPool/classes/class.assQuestion.php index 561215a1e24c..13270a2a2e81 100755 --- a/Modules/TestQuestionPool/classes/class.assQuestion.php +++ b/Modules/TestQuestionPool/classes/class.assQuestion.php @@ -125,7 +125,7 @@ abstract class assQuestion */ protected array $suggested_solutions; - protected ?int $original_id; + protected ?int $original_id = null; /** * Page object From 541ece84fd21758594b269f86928fbdfeeb9b655 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 6 Nov 2023 17:22:31 +0100 Subject: [PATCH 052/497] Test: Fix Numeric Gap Points Should Return Float --- .../classes/class.assClozeTest.php | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assClozeTest.php b/Modules/TestQuestionPool/classes/class.assClozeTest.php index 866fe03a86cd..f345d743e6cb 100755 --- a/Modules/TestQuestionPool/classes/class.assClozeTest.php +++ b/Modules/TestQuestionPool/classes/class.assClozeTest.php @@ -1211,26 +1211,19 @@ public function getTextgapPoints($a_original, $a_entered, $max_points): float * * @param string $a_original The original (correct) text * @param string $a_entered The text entered by the user - * @param integer $max_points The maximum number of points for the solution + * @param float $max_points The maximum number of points for the solution * @access public */ - public function getNumericgapPoints($a_original, $a_entered, $max_points, $lowerBound, $upperBound): int + public function getNumericgapPoints($a_original, $a_entered, $max_points, $lowerBound, $upperBound): float { - // fau: fixGapFormula - check entered value by evalMath - // if( ! $this->checkForValidFormula($a_entered) ) - // { - // return 0; - // } - include_once "./Services/Math/classes/class.EvalMath.php"; $eval = new EvalMath(); $eval->suppress_errors = true; - $result = 0; + $result = 0.0; if ($eval->e($a_entered) === false) { - return 0; + return 0.0; } elseif (($eval->e($lowerBound) !== false) && ($eval->e($upperBound) !== false)) { - // fau. if (($eval->e($a_entered) >= $eval->e($lowerBound)) && ($eval->e($a_entered) <= $eval->e($upperBound))) { $result = $max_points; } @@ -1242,10 +1235,8 @@ public function getNumericgapPoints($a_original, $a_entered, $max_points, $lower if (($eval->e($a_entered) >= $eval->e($a_original)) && ($eval->e($a_entered) <= $eval->e($upperBound))) { $result = $max_points; } - } else { - if ($eval->e($a_entered) == $eval->e($a_original)) { - $result = $max_points; - } + } elseif ($eval->e($a_entered) == $eval->e($a_original)) { + $result = $max_points; } return $result; } From 58fabe7162a986f8fbf7124f9fd1879712d1fdf3 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 23 Oct 2023 17:49:04 +0200 Subject: [PATCH 053/497] Test: Fix Get Best Solution in Cloze Question See: https://mantis.ilias.de/view.php?id=38289 --- Modules/TestQuestionPool/classes/class.assClozeGap.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assClozeGap.php b/Modules/TestQuestionPool/classes/class.assClozeGap.php index 2009b75eecd9..fe226c75144d 100755 --- a/Modules/TestQuestionPool/classes/class.assClozeGap.php +++ b/Modules/TestQuestionPool/classes/class.assClozeGap.php @@ -385,11 +385,12 @@ public function getBestSolutionOutput(Transformation $shuffler, $combinations = array_push($best_solutions[$combinations['points']], $combinations['answer']); } else { foreach ($this->getItems($shuffler) as $answer) { - if (isset($best_solutions[$answer->getPoints()]) && is_array($best_solutions[$answer->getPoints()])) { - array_push($best_solutions[$answer->getPoints()], $answer->getAnswertext()); + $points_string_for_key = (string) $answer->getPoints(); + if (isset($best_solutions[$points_string_for_key]) && is_array($best_solutions[$points_string_for_key])) { + array_push($best_solutions[$points_string_for_key], $answer->getAnswertext()); } else { - $best_solutions[$answer->getPoints()] = []; - array_push($best_solutions[$answer->getPoints()], $answer->getAnswertext()); + $best_solutions[$points_string_for_key] = []; + array_push($best_solutions[$points_string_for_key], $answer->getAnswertext()); } } } From cbf69a8ee4fb45625f051cbf4aa140b52ba0a7f1 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 6 Nov 2023 17:39:46 +0100 Subject: [PATCH 054/497] Test: Fix Building Array from Floats --- Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php b/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php index c2b9e3024eb7..13248990d047 100755 --- a/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php +++ b/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php @@ -167,11 +167,12 @@ public function getSolutionOutput( } else { $rank = array(); foreach ($this->object->answers as $answer) { + $points_string_for_key = (string) $answer->getPoints(); if ($answer->getPoints() > 0) { if (!array_key_exists($answer->getPoints(), $rank)) { - $rank[$answer->getPoints()] = array(); + $rank[$points_string_for_key] = array(); } - array_push($rank[$answer->getPoints()], $answer->getAnswertext()); + array_push($rank[$points_string_for_key], $answer->getAnswertext()); } } krsort($rank, SORT_NUMERIC); From d3fa2dc3a6716a9ead853c0722135dcfb3091ed9 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 7 Nov 2023 12:42:31 +0100 Subject: [PATCH 055/497] 38021: Content Style Screen in Page Editor is a Dead Lock --- .../Category/classes/class.ilObjCategoryGUI.php | 2 +- Modules/Course/classes/class.ilObjCourseGUI.php | 1 + Modules/Folder/classes/class.ilObjFolderGUI.php | 2 +- Modules/Group/classes/class.ilObjGroupGUI.php | 1 + .../classes/class.ilObjRootFolderGUI.php | 2 +- .../Container/classes/class.ilContainerGUI.php | 14 ++------------ 6 files changed, 7 insertions(+), 15 deletions(-) diff --git a/Modules/Category/classes/class.ilObjCategoryGUI.php b/Modules/Category/classes/class.ilObjCategoryGUI.php index 76b44f88c7c7..f51e3475f543 100755 --- a/Modules/Category/classes/class.ilObjCategoryGUI.php +++ b/Modules/Category/classes/class.ilObjCategoryGUI.php @@ -199,7 +199,7 @@ public function executeCommand(): void case "ilobjectcontentstylesettingsgui": $this->checkPermission("write"); $this->setTitleAndDescription(); - //$this->showContainerPageTabs(); + $this->showContainerPageTabs(); $settings_gui = $this->content_style_gui ->objectSettingsGUIForRefId( null, diff --git a/Modules/Course/classes/class.ilObjCourseGUI.php b/Modules/Course/classes/class.ilObjCourseGUI.php index 82b0e7e19047..b1826072ff9b 100755 --- a/Modules/Course/classes/class.ilObjCourseGUI.php +++ b/Modules/Course/classes/class.ilObjCourseGUI.php @@ -2179,6 +2179,7 @@ public function executeCommand(): void $this->checkPermission("write"); $this->setTitleAndDescription(); + $this->showContainerPageTabs(); $settings_gui = $DIC->contentStyle()->gui() ->objectSettingsGUIForRefId( null, diff --git a/Modules/Folder/classes/class.ilObjFolderGUI.php b/Modules/Folder/classes/class.ilObjFolderGUI.php index de2534a6e83b..1a36ddc2bc63 100755 --- a/Modules/Folder/classes/class.ilObjFolderGUI.php +++ b/Modules/Folder/classes/class.ilObjFolderGUI.php @@ -161,7 +161,7 @@ public function executeCommand(): void case "ilobjectcontentstylesettingsgui": $this->checkPermission("write"); $this->setTitleAndDescription(); - //$this->showContainerPageTabs(); + $this->showContainerPageTabs(); $settings_gui = $this->content_style_gui ->objectSettingsGUIForRefId( null, diff --git a/Modules/Group/classes/class.ilObjGroupGUI.php b/Modules/Group/classes/class.ilObjGroupGUI.php index 607418af7ddf..51a5a9f08016 100755 --- a/Modules/Group/classes/class.ilObjGroupGUI.php +++ b/Modules/Group/classes/class.ilObjGroupGUI.php @@ -248,6 +248,7 @@ public function executeCommand(): void $this->checkPermission("write"); $this->setTitleAndDescription(); + $this->showContainerPageTabs(); $settings_gui = $DIC->contentStyle()->gui() ->objectSettingsGUIForRefId( null, diff --git a/Modules/RootFolder/classes/class.ilObjRootFolderGUI.php b/Modules/RootFolder/classes/class.ilObjRootFolderGUI.php index 49059c880f76..140230486ce9 100755 --- a/Modules/RootFolder/classes/class.ilObjRootFolderGUI.php +++ b/Modules/RootFolder/classes/class.ilObjRootFolderGUI.php @@ -139,7 +139,7 @@ public function executeCommand(): void case "ilobjectcontentstylesettingsgui": $this->checkPermission("write"); $this->setTitleAndDescription(); - //$this->showContainerPageTabs(); + $this->showContainerPageTabs(); $settings_gui = $this->content_style_gui ->objectSettingsGUIForRefId( null, diff --git a/Services/Container/classes/class.ilContainerGUI.php b/Services/Container/classes/class.ilContainerGUI.php index c0d2b7d7ded7..ee78c89ff25c 100644 --- a/Services/Container/classes/class.ilContainerGUI.php +++ b/Services/Container/classes/class.ilContainerGUI.php @@ -2059,19 +2059,9 @@ protected function showContainerPageTabs(): void { $ctrl = $this->ctrl; $tabs = $this->tabs; + $tabs->clearTargets(); $page_gui = new ilContainerPageGUI($this->object->getId()); - $style_id = $this->content_style_domain - ->styleForRefId($this->object->getRefId()) - ->getEffectiveStyleId(); - if (ilObject::_lookupType($style_id) === "sty") { - $page_gui->setStyleId($style_id); - } else { - $style_id = 0; - } - $page_gui->setTabHook($this, "addPageTabs"); - $ctrl->getHTML($page_gui); - $tabs->setTabActive("obj_sty"); - $tabs->setBackTarget($this->lng->txt('back'), ilLink::_getLink($this->ref_id)); + $tabs->setBackTarget($this->lng->txt('back'), $this->ctrl->getLinkTarget($page_gui, "edit")); } public function getAsynchItemListObject(): void From 95e9688c39bd8bd06fc7ddf56809a5d2b4b558a1 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Tue, 7 Nov 2023 14:56:13 +0100 Subject: [PATCH 056/497] Tracking: hide unused columns (27337) --- .../repository_statistics/class.ilTrSummaryTableGUI.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Services/Tracking/classes/repository_statistics/class.ilTrSummaryTableGUI.php b/Services/Tracking/classes/repository_statistics/class.ilTrSummaryTableGUI.php index cb2e9714cbe8..722b52283d0f 100644 --- a/Services/Tracking/classes/repository_statistics/class.ilTrSummaryTableGUI.php +++ b/Services/Tracking/classes/repository_statistics/class.ilTrSummaryTableGUI.php @@ -1,7 +1,5 @@ * @ilCtrl_Calls ilTrSummaryTableGUI: ilFormPropertyDispatchGUI @@ -87,7 +87,7 @@ public function __construct( } } - if ($this->rbacsystem->checkAccess('write', $this->ref_id)) { + if ($this->is_root) { $this->addColumn($this->lng->txt("path")); $this->addColumn($this->lng->txt("action")); } @@ -832,7 +832,7 @@ protected function fillRow(array $a_set): void break; } - // no break + // no break default: $value = $this->parseValue($c, $a_set[$c], $a_set["type"]); $this->tpl->setVariable(strtoupper($c), $value); From 92017e65b72dc4b324c9074d2c1bf43c3a926e14 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 7 Nov 2023 15:04:18 +0100 Subject: [PATCH 057/497] 33800: Test8 Sandbox Info tab broken by Tag Cloud? --- Services/Tagging/classes/class.ilTaggingGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Tagging/classes/class.ilTaggingGUI.php b/Services/Tagging/classes/class.ilTaggingGUI.php index bf1c763e7284..2113045c98d3 100644 --- a/Services/Tagging/classes/class.ilTaggingGUI.php +++ b/Services/Tagging/classes/class.ilTaggingGUI.php @@ -242,7 +242,7 @@ public function getAllUserTagsForObjectHTML(): string $ttpl->setCurrentBlock("unlinked_tag"); $ttpl->setVariable( "REL_CLASS", - ilTagging::getRelevanceClass((int) $tag["cnt"], $max) + ilTagging::getRelevanceClass((int) $tag["cnt"], (int) $max) ); $ttpl->setVariable("TAG_TITLE", $tag["tag"]); $ttpl->parseCurrentBlock(); From 283135070f8b58b9ca7737dce9dbb6ec890e7860 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 7 Nov 2023 16:27:25 +0100 Subject: [PATCH 058/497] 37878: Wrong URL to blog posting in footer --- Modules/Blog/Posting/class.ilBlogPostingGUI.php | 3 +-- Modules/Blog/classes/class.ilObjBlogGUI.php | 15 ++++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Modules/Blog/Posting/class.ilBlogPostingGUI.php b/Modules/Blog/Posting/class.ilBlogPostingGUI.php index 6ec4c71e0c4a..f1bfae072118 100644 --- a/Modules/Blog/Posting/class.ilBlogPostingGUI.php +++ b/Modules/Blog/Posting/class.ilBlogPostingGUI.php @@ -37,7 +37,7 @@ class ilBlogPostingGUI extends ilPageObjectGUI protected bool $enable_public_notes = false; protected bool $may_contribute = false; protected bool $fetchall = false; - protected bool $blpg = false; + protected int $blpg = 0; protected string $term = ""; public bool $add_date = false; @@ -212,7 +212,6 @@ public function preview( $callback )); } - // permanent link if ($a_mode !== "embedded") { $append = ($this->blpg > 0) diff --git a/Modules/Blog/classes/class.ilObjBlogGUI.php b/Modules/Blog/classes/class.ilObjBlogGUI.php index 90a75bcfe44f..232624a44eca 100644 --- a/Modules/Blog/classes/class.ilObjBlogGUI.php +++ b/Modules/Blog/classes/class.ilObjBlogGUI.php @@ -489,6 +489,7 @@ protected function setTabs(): void $ilHelp->setScreenIdComponent("blog"); if ($this->checkPermissionBool("read")) { + $this->ctrl->setParameterByClass(self::class, "bmn", null); $this->tabs_gui->addTab( "content", $lng->txt("content"), @@ -718,7 +719,9 @@ public function executeCommand(): void if ($public_action) { $this->tpl->setOnScreenMessage('success', implode("
", $info)); } else { - $this->tpl->setOnScreenMessage('info', implode("
", $info)); + if (count($info) > 0) { + $this->tpl->setOnScreenMessage('info', implode("
", $info)); + } } // revert to edit cmd to avoid confusion @@ -1024,7 +1027,7 @@ public function render(): void $list = $nav = ""; if ($list_items) { $list = $this->renderList($list_items, "preview", "", $is_owner); - $nav = $this->renderNavigation("render", "preview", "", $is_owner); + $nav = $this->renderNavigation("render", "edit", "", $is_owner); } $this->setContentStyleSheet(); @@ -1794,13 +1797,15 @@ protected function renderNavigationByDate( $wtpl->parseCurrentBlock(); } $this->ctrl->setParameterByClass(self::class, "bmn", null); - $wtpl->setVariable("STARTING_PAGE", + $wtpl->setVariable( + "STARTING_PAGE", $this->ui->renderer()->render( $this->ui->factory()->link()->standard( $this->lng->txt("blog_starting_page"), - $this->ctrl->getLinkTargetByClass(self::class, "preview") + $this->ctrl->getLinkTargetByClass(self::class, $a_list_cmd) ) - )); + ) + ); } // single month else { From afa4000e7ea1a12dd0ce8902e51d224c60468bec Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 7 Nov 2023 17:05:39 +0100 Subject: [PATCH 059/497] 36115: Anzeige von Who-is-online, ohne das jemand angezeigt wird. --- .../classes/class.ilAwarenessMetaBarProvider.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Services/Awareness/GlobalScreen/classes/class.ilAwarenessMetaBarProvider.php b/Services/Awareness/GlobalScreen/classes/class.ilAwarenessMetaBarProvider.php index f376a4468b28..5339c57fc4a2 100644 --- a/Services/Awareness/GlobalScreen/classes/class.ilAwarenessMetaBarProvider.php +++ b/Services/Awareness/GlobalScreen/classes/class.ilAwarenessMetaBarProvider.php @@ -67,10 +67,13 @@ public function getMetaBarItems(): array $counter = $manager->processMetaBar(); - $content = function () use ($gui) { - $result = $gui->getAwarenessList(true); - return $this->dic->ui()->factory()->legacy($result["html"]); - }; + $result = $gui->getAwarenessList(true); + $online = explode(":", $result["cnt"]); + $online = (int) $online[0]; + $content = $this->dic->ui()->factory()->legacy($result["html"]); + if ($online === 0) { + $is_widget_visible = false; + } $mb = $this->globalScreen()->metaBar(); @@ -88,7 +91,7 @@ public function getMetaBarItems(): array } return $c; }) - ->withLegacyContent($content()) + ->withLegacyContent($content) ->withSymbol( $this->dic->ui()->factory() ->symbol() From 04fe81014db7fe6c88546f259d5fc5850094dd75 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 7 Nov 2023 17:16:52 +0100 Subject: [PATCH 060/497] 35176: Offline status not shown under title and description of HTML module --- .../HTMLLearningModule/classes/class.ilObjFileBasedLMGUI.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Modules/HTMLLearningModule/classes/class.ilObjFileBasedLMGUI.php b/Modules/HTMLLearningModule/classes/class.ilObjFileBasedLMGUI.php index de1958c50283..c1479e1f5d35 100755 --- a/Modules/HTMLLearningModule/classes/class.ilObjFileBasedLMGUI.php +++ b/Modules/HTMLLearningModule/classes/class.ilObjFileBasedLMGUI.php @@ -518,9 +518,8 @@ public function showInfoScreen(): void protected function setTabs(): void { - $this->tpl->setTitleIcon(ilUtil::getImagePath("icon_lm.svg")); $this->getTabs(); - $this->tpl->setTitle($this->object->getTitle()); + $this->setTitleAndDescription(); } protected function getTabs(): void From 8e6b033df0c497c366012fad20baa8bf8f33776d Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 7 Nov 2023 20:33:18 +0100 Subject: [PATCH 061/497] 37186: Administration/Legal Notice: active tab not highlighted --- Services/Imprint/classes/class.ilImprintGUI.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Services/Imprint/classes/class.ilImprintGUI.php b/Services/Imprint/classes/class.ilImprintGUI.php index a5b96ae4a001..d6926d9ea3b9 100644 --- a/Services/Imprint/classes/class.ilImprintGUI.php +++ b/Services/Imprint/classes/class.ilImprintGUI.php @@ -86,7 +86,9 @@ public function executeCommand(): string $title, $this->ctrl->getLinkTarget($this, "preview") ); - return parent::executeCommand(); + $ret = parent::executeCommand(); + $this->tabs_gui->activateTab("pg"); + return $ret; } } From 860a10155ac45fdfbec92e02cf89b3df2010b1db Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 7 Nov 2023 20:39:13 +0100 Subject: [PATCH 062/497] =?UTF-8?q?36690:=20privater=20Feed-URL=20=C2=BB?= =?UTF-8?q?=20Undefined=20array=20key=20agg=5Fref=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Services/Feeds/classes/class.ilUserFeedWriter.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/Feeds/classes/class.ilUserFeedWriter.php b/Services/Feeds/classes/class.ilUserFeedWriter.php index 73ed3fa0b26b..cba638cf5660 100644 --- a/Services/Feeds/classes/class.ilUserFeedWriter.php +++ b/Services/Feeds/classes/class.ilUserFeedWriter.php @@ -84,9 +84,9 @@ public function __construct( $title = ilNewsItem::determineNewsTitle( $item["context_obj_type"], $item["title"], - $item["content_is_lang_var"], - $item["agg_ref_id"], - $item["aggregation"] + (bool) $item["content_is_lang_var"], + (int) ($item["agg_ref_id"] ?? 0), + $item["aggregation"] ?? [] ); // path From 9c6e108235d1ce13eb6b040fadc6eef58b87ff19 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 7 Nov 2023 21:52:35 +0100 Subject: [PATCH 063/497] 36945: ILIAS shows a qtitle-quest and other names in ILIAS Page Editor -> in ILIAS LearningModule --- .../COPage/Editor/Server/class.UIWrapper.php | 25 ++++++++++++++++++- .../COPage/classes/class.ilPCQuestion.php | 2 +- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Services/COPage/Editor/Server/class.UIWrapper.php b/Services/COPage/Editor/Server/class.UIWrapper.php index cbded5884e0f..cbb783f368d7 100644 --- a/Services/COPage/Editor/Server/class.UIWrapper.php +++ b/Services/COPage/Editor/Server/class.UIWrapper.php @@ -198,7 +198,7 @@ public function sendPage( } $data = new \stdClass(); - $data->renderedContent = $page_data; + $data->renderedContent = $page_data . $this->getOnloadCode($page_gui); $data->pcModel = $pc_model; $data->error = $error; if ($last_change) { @@ -209,6 +209,29 @@ public function sendPage( return new Response($data); } + protected function getOnloadCode(\ilPageObjectGUI $page_gui) : string + { + $page = $page_gui->getPageObject(); + $defs = \ilCOPagePCDef::getPCDefinitions(); + $all_onload_code = []; + foreach ($defs as $def) { + $pc_class = $def["pc_class"]; + /** @var \ilPageContent $pc_obj */ + $pc_obj = new $pc_class($page); + + // onload code + $onload_code = $pc_obj->getOnloadCode("edit"); + foreach ($onload_code as $code) { + $all_onload_code[] = $code; + } + } + $code_str = ""; + if (count($all_onload_code) > 0) { + $code_str = ""; + } + return $code_str; + } + public function sendFormError( string $form ): Response { diff --git a/Services/COPage/classes/class.ilPCQuestion.php b/Services/COPage/classes/class.ilPCQuestion.php index f49ab3930266..ec59d2a1fec1 100755 --- a/Services/COPage/classes/class.ilPCQuestion.php +++ b/Services/COPage/classes/class.ilPCQuestion.php @@ -314,7 +314,7 @@ public function getOnloadCode(string $a_mode): array if ($this->getPage()->getPageConfig()->getEnableSelfAssessment()) { if (!$this->getPage()->getPageConfig()->getEnableSelfAssessmentScorm() && $a_mode != ilPageObjectGUI::PREVIEW - && $a_mode != "offline") { + && $a_mode != "offline" && $a_mode !== "edit") { $ilCtrl->setParameterByClass(strtolower(get_class($this->getPage())) . "gui", "page_id", $this->getPage()->getId()); $url = $ilCtrl->getLinkTargetByClass(strtolower(get_class($this->getPage())) . "gui", "processAnswer", "", true, false); $code[] = "ilCOPageQuestionHandler.initCallback('" . $url . "');"; From 88601912e80f4db950cab9115d6f2b1103a33d22 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 7 Nov 2023 22:10:30 +0100 Subject: [PATCH 064/497] =?UTF-8?q?38610:=20Pr=C3=A4sentationsansicht=20de?= =?UTF-8?q?s=20Lernmoduls=20wirft=20sofort=20einen=20Fehler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/LearningModule/classes/class.ilLMObject.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/LearningModule/classes/class.ilLMObject.php b/Modules/LearningModule/classes/class.ilLMObject.php index 25839a2b48eb..7e4cf53b24a9 100755 --- a/Modules/LearningModule/classes/class.ilLMObject.php +++ b/Modules/LearningModule/classes/class.ilLMObject.php @@ -702,7 +702,7 @@ public static function _lookupContObjID(int $a_id): int $obj_set = $ilDB->query($query); $obj_rec = $ilDB->fetchAssoc($obj_set); - return (int) $obj_rec["lm_id"]; + return (int) ($obj_rec["lm_id"] ?? 0); } /** From 239c13a305102e0579f3e34aafd9c477bc1ee1b8 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Wed, 8 Nov 2023 08:06:38 +0100 Subject: [PATCH 065/497] Test: Fix Applying Old Personal Defaults See: https://mantis.ilias.de/view.php?id=38634 --- Modules/Test/classes/class.assMark.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Modules/Test/classes/class.assMark.php b/Modules/Test/classes/class.assMark.php index e4618345ffa4..6f0870591a70 100755 --- a/Modules/Test/classes/class.assMark.php +++ b/Modules/Test/classes/class.assMark.php @@ -60,6 +60,18 @@ public function __construct( $this->setPassed($passed); } + /** + * Stephan Kergomard, 2023-11-08: We need an explicit __unserialize function + * here because of changes to the corresponding classes with ILIAS 8. + */ + public function __unserialize(array $data): void + { + $this->short_name = $data['short_name']; + $this->official_name = $data['short_name']; + $this->minimum_level = (float) $data['minimum_level']; + $this->passed = (int) $data['passed']; + } + public function getShortName(): string { return $this->short_name; From a64ed3ee1e6f803a5b30162d609cc7c46bad2510 Mon Sep 17 00:00:00 2001 From: kergomard <13102171+kergomard@users.noreply.github.com> Date: Wed, 8 Nov 2023 14:07:27 +0100 Subject: [PATCH 066/497] Exercise: Fix Removal of Background Task (#6558) See: https://mantis.ilias.de/view.php?id=38620 --- .../class.ilExDownloadSubmissionsZipInteraction.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Modules/Exercise/classes/BackgroundTasks/class.ilExDownloadSubmissionsZipInteraction.php b/Modules/Exercise/classes/BackgroundTasks/class.ilExDownloadSubmissionsZipInteraction.php index 6a481c9fa25c..d77079d25238 100644 --- a/Modules/Exercise/classes/BackgroundTasks/class.ilExDownloadSubmissionsZipInteraction.php +++ b/Modules/Exercise/classes/BackgroundTasks/class.ilExDownloadSubmissionsZipInteraction.php @@ -99,9 +99,8 @@ public function interaction( $this->logger->debug("Delete dir: " . dirname($path)); $filesystem->deleteDir(dirname($path)); } - $out = new StringValue(); - $out->setValue($input); - return $out; + + return $download_name; } $this->logger->info("Delivering File."); @@ -121,8 +120,6 @@ public function interaction( $this->logger->debug("As: " . $zip_name); ilFileDelivery::deliverFileAttached($download_name->getValue(), $zip_name); - $out = new StringValue(); - $out->setValue($input); - return $out; + return $download_name; } } From 146a47a186be1c141c581e95251e4483b3551c9d Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 8 Nov 2023 14:26:08 +0100 Subject: [PATCH 067/497] exc: added logging --- Modules/Exercise/Submission/class.ilExSubmission.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Modules/Exercise/Submission/class.ilExSubmission.php b/Modules/Exercise/Submission/class.ilExSubmission.php index 425b355f6650..4269460e2da9 100644 --- a/Modules/Exercise/Submission/class.ilExSubmission.php +++ b/Modules/Exercise/Submission/class.ilExSubmission.php @@ -1022,6 +1022,7 @@ public static function downloadAllAssignmentFiles( global $DIC; $lng = $DIC->language(); + $log = ilLoggerFactory::getLogger("exc"); $storage = new ilFSStorageExercise($a_ass->getExerciseId(), $a_ass->getId()); $storage->create(); @@ -1101,8 +1102,11 @@ public static function downloadAllAssignmentFiles( $targetdir = $team_dir . $targetdir; } } + + $log->debug("Creation target directory: " . $targetdir); ilFileUtils::makeDir($targetdir); + $log->debug("Scanning source directory: " . $sourcedir); $sourcefiles = scandir($sourcedir); $duplicates = array(); foreach ($sourcefiles as $sourcefile) { @@ -1150,6 +1154,8 @@ public static function downloadAllAssignmentFiles( $targetfile = $targetdir . DIRECTORY_SEPARATOR . $targetfile; $sourcefile = $sourcedir . DIRECTORY_SEPARATOR . $sourcefile; + $log->debug("Copying: " . $sourcefile . " -> " . $targetfile); + if (!copy($sourcefile, $targetfile)) { throw new ilExerciseException("Could not copy " . basename($sourcefile) . " to '" . $targetfile . "'."); } else { @@ -1159,6 +1165,9 @@ public static function downloadAllAssignmentFiles( // blogs and portfolios are stored as zip and have to be unzipped if ($ass_type == ilExAssignment::TYPE_PORTFOLIO || $ass_type == ilExAssignment::TYPE_BLOG) { + $log->debug("Unzipping: " . $targetfile); + $log->debug("Current directory is: " . getcwd()); + ilFileUtils::unzip($targetfile); unlink($targetfile); } From bc9f6e3cf9022ff1417193f217fa1bc5ccd9f58c Mon Sep 17 00:00:00 2001 From: Thomas Famula Date: Wed, 8 Nov 2023 14:41:44 +0100 Subject: [PATCH 068/497] Fix 37990: Back from competence category almost always leads to root category --- Services/Skill/Node/class.ilBasicSkillGUI.php | 49 ++++++++++++----- .../Node/class.ilBasicSkillTemplateGUI.php | 29 ++++++++-- .../Skill/Node/class.ilSkillCategoryGUI.php | 50 +++++++++++------ .../Node/class.ilSkillTemplateCategoryGUI.php | 54 ++++++++++++------- Services/Skill/README.md | 16 +++++- .../Tree/class.ilSkillTreeDBRepository.php | 14 +++++ .../interface.ilSkillTreeRepository.php | 2 + 7 files changed, 162 insertions(+), 52 deletions(-) diff --git a/Services/Skill/Node/class.ilBasicSkillGUI.php b/Services/Skill/Node/class.ilBasicSkillGUI.php index 663a7c256246..161460464202 100644 --- a/Services/Skill/Node/class.ilBasicSkillGUI.php +++ b/Services/Skill/Node/class.ilBasicSkillGUI.php @@ -554,20 +554,41 @@ public function setTabs(string $a_tab = "levels"): void // assigned objects $this->addObjectsTab($ilTabs); - $ilCtrl->setParameterByClass( - "ilskillrootgui", - "node_id", - $this->skill_tree_node_manager->getRootId() - ); - $ilTabs->setBackTarget( - $lng->txt("skmg_skills"), - $ilCtrl->getLinkTargetByClass("ilskillrootgui", "listSkills") - ); - $ilCtrl->setParameterByClass( - "ilskillrootgui", - "node_id", - $this->requested_node_id - ); + $parent_node_id = $this->tree_repo->getParentNodeIdForNodeId($this->requested_node_id); + $parent_title = ilSkillTreeNode::_lookupTitle($parent_node_id); + $parent_type = ilSkillTreeNode::_lookupType($parent_node_id); + + if ($parent_type === "scat") { + $ilCtrl->setParameterByClass( + "ilskillcategorygui", + "node_id", + $parent_node_id + ); + $ilTabs->setBackTarget( + $parent_title, + $ilCtrl->getLinkTargetByClass("ilskillcategorygui", "listItems") + ); + $ilCtrl->setParameterByClass( + "ilskillcategorygui", + "node_id", + "" + ); + } else { + $ilCtrl->setParameterByClass( + "ilskillrootgui", + "node_id", + $this->skill_tree_node_manager->getRootId() + ); + $ilTabs->setBackTarget( + $lng->txt("skmg_skills"), + $ilCtrl->getLinkTargetByClass("ilskillrootgui", "listSkills") + ); + $ilCtrl->setParameterByClass( + "ilskillrootgui", + "node_id", + $this->requested_node_id + ); + } $ilTabs->activateTab($a_tab); diff --git a/Services/Skill/Node/class.ilBasicSkillTemplateGUI.php b/Services/Skill/Node/class.ilBasicSkillTemplateGUI.php index 94d6842c15ef..9f9741759e28 100644 --- a/Services/Skill/Node/class.ilBasicSkillTemplateGUI.php +++ b/Services/Skill/Node/class.ilBasicSkillTemplateGUI.php @@ -161,11 +161,32 @@ public function setTabs(string $a_tab = "levels"): void $ilTabs->clearTargets(); $ilHelp->setScreenIdComponent("skmg_sktp"); + $parent_node_id = $this->tree_repo->getParentNodeIdForNodeId($this->requested_node_id); + $parent_title = ilSkillTreeNode::_lookupTitle($parent_node_id); + $parent_type = ilSkillTreeNode::_lookupType($parent_node_id); + if ($this->tref_id == 0) { - $ilTabs->setBackTarget( - $lng->txt("skmg_skill_templates"), - $ilCtrl->getLinkTargetByClass("ilobjskilltreegui", "editSkillTemplates") - ); + if ($parent_type === "sctp") { + $ilCtrl->setParameterByClass( + "ilskilltemplatecategorygui", + "node_id", + $parent_node_id + ); + $ilTabs->setBackTarget( + $parent_title, + $ilCtrl->getLinkTargetByClass("ilskilltemplatecategorygui", "listItems") + ); + $ilCtrl->setParameterByClass( + "ilskilltemplatecategorygui", + "node_id", + "" + ); + } else { + $ilTabs->setBackTarget( + $lng->txt("skmg_skill_templates"), + $ilCtrl->getLinkTargetByClass("ilobjskilltreegui", "editSkillTemplates") + ); + } } if (is_object($this->node_object)) { diff --git a/Services/Skill/Node/class.ilSkillCategoryGUI.php b/Services/Skill/Node/class.ilSkillCategoryGUI.php index 5a97ee389458..56abbb7e32fb 100644 --- a/Services/Skill/Node/class.ilSkillCategoryGUI.php +++ b/Services/Skill/Node/class.ilSkillCategoryGUI.php @@ -101,22 +101,42 @@ public function setTabs(string $a_tab): void // usage $this->addUsageTab($ilTabs); - // back link - $ilCtrl->setParameterByClass( - "ilskillrootgui", - "node_id", - $this->skill_tree_node_manager->getRootId() - ); - $ilTabs->setBackTarget( - $lng->txt("skmg_skills"), - $ilCtrl->getLinkTargetByClass("ilskillrootgui", "listSkills") - ); - $ilCtrl->setParameterByClass( - "ilskillrootgui", - "node_id", - $this->requested_node_id - ); + $parent_node_id = $this->tree_repo->getParentNodeIdForNodeId($this->requested_node_id); + $parent_title = ilSkillTreeNode::_lookupTitle($parent_node_id); + $parent_type = ilSkillTreeNode::_lookupType($parent_node_id); + // back link + if ($parent_type === "scat") { + $ilCtrl->setParameter( + $this, + "node_id", + $parent_node_id + ); + $ilTabs->setBackTarget( + $parent_title, + $ilCtrl->getLinkTarget($this, "listItems") + ); + $ilCtrl->setParameter( + $this, + "node_id", + $this->requested_node_id + ); + } else { + $ilCtrl->setParameterByClass( + "ilskillrootgui", + "node_id", + $this->skill_tree_node_manager->getRootId() + ); + $ilTabs->setBackTarget( + $lng->txt("skmg_skills"), + $ilCtrl->getLinkTargetByClass("ilskillrootgui", "listSkills") + ); + $ilCtrl->setParameterByClass( + "ilskillrootgui", + "node_id", + $this->requested_node_id + ); + } parent::setTitleIcon(); $tpl->setTitle( diff --git a/Services/Skill/Node/class.ilSkillTemplateCategoryGUI.php b/Services/Skill/Node/class.ilSkillTemplateCategoryGUI.php index 9a0c0eee7cb4..7470ed0477fc 100644 --- a/Services/Skill/Node/class.ilSkillTemplateCategoryGUI.php +++ b/Services/Skill/Node/class.ilSkillTemplateCategoryGUI.php @@ -106,22 +106,43 @@ public function setTabs(string $a_tab): void // usage $this->addUsageTab($ilTabs); + $parent_node_id = $this->tree_repo->getParentNodeIdForNodeId($this->requested_node_id); + $parent_title = ilSkillTreeNode::_lookupTitle($parent_node_id); + $parent_type = ilSkillTreeNode::_lookupType($parent_node_id); + // back link if ($this->tref_id == 0) { - $ilCtrl->setParameterByClass( - "ilskillrootgui", - "node_id", - $this->skill_tree_node_manager->getRootId() - ); - $ilTabs->setBackTarget( - $lng->txt("skmg_skill_templates"), - $ilCtrl->getLinkTargetByClass("ilskillrootgui", "listTemplates") - ); - $ilCtrl->setParameterByClass( - "ilskillrootgui", - "node_id", - $this->requested_node_id - ); + if ($parent_type === "sctp") { + $ilCtrl->setParameter( + $this, + "node_id", + $parent_node_id + ); + $ilTabs->setBackTarget( + $parent_title, + $ilCtrl->getLinkTarget($this, "listItems") + ); + $ilCtrl->setParameter( + $this, + "node_id", + $this->requested_node_id + ); + } else { + $ilCtrl->setParameterByClass( + "ilskillrootgui", + "node_id", + $this->skill_tree_node_manager->getRootId() + ); + $ilTabs->setBackTarget( + $lng->txt("skmg_skill_templates"), + $ilCtrl->getLinkTargetByClass("ilskillrootgui", "listTemplates") + ); + $ilCtrl->setParameterByClass( + "ilskillrootgui", + "node_id", + $this->requested_node_id + ); + } } parent::setTitleIcon(); @@ -322,9 +343,6 @@ public function showUsage(): void public function redirectToParent(bool $a_tmp_mode = false): void { - $ilCtrl = $this->ctrl; - - $ilCtrl->setParameterByClass("ilskillrootgui", "node_id", $this->requested_node_id); - $ilCtrl->redirectByClass("ilskillrootgui", "listTemplates"); + parent::redirectToParent(true); } } diff --git a/Services/Skill/README.md b/Services/Skill/README.md index 46d9f08f8993..1aecb8b8f4ab 100644 --- a/Services/Skill/README.md +++ b/Services/Skill/README.md @@ -82,7 +82,7 @@ Skills are organised in a hierarchical structure called the [Skill Tree](#skill- * **Code**: `class ilSkillRoot` -The root node of a skill tree. There can be more than one. +The root node of a skill tree. There can be more than one skill trees. ## Basic Skill @@ -96,6 +96,13 @@ Represents a standard skill. A basic skill has a number of [Skill Levels](#skill A skill category is kind of a "folder" for skills. Skill Category nodes have either another [Skill Category](#skill-category) or the [Root](#root) as parent in the [Skill Tree](#skill-tree). +**Business Rules** + +* When navigating in a Skill Category, an additional tab is shown in the first place. This tab always navigates the user +to the parent node, that means one [Skill Category](#skill-category) up or the [Root](#root), no matter from which +context the user opened the current node. If the parent node is a [Skill Category](#skill-category), the tab is named +after its title. If the parent node is the [Root](#root), the tab is called "Competences". + ## Skill Template * **Code**: `class ilSkillTemplate` @@ -108,6 +115,13 @@ A skill template is like a basic skill, but serves as a template for re-use. A s A skill template category is kind of a "folder" for skill templates. Skill Template Category nodes have either another [Skill Template Category](#skill-template-category) or the [Root](#root) as parent in the [Skill Tree](#skill-tree). +**Business Rules** + +* When navigating in a Skill Template Category, an additional tab is shown in the first place. This tab always navigates +the user to the parent node, that means one [Skill Template Category](#skill-template-category) up or the [Root](#root), +no matter from which context the user opened the current node. If the parent node is a [Skill Template Category](#skill-template-category), +the tab is named after its title. If the parent node is the [Root](#root), the tab is called "Competence Templates". + ## Skill Template Reference * **Code**: `class ilSkillTemplateReference` diff --git a/Services/Skill/Tree/class.ilSkillTreeDBRepository.php b/Services/Skill/Tree/class.ilSkillTreeDBRepository.php index 8944d40e00d4..6db076758b1c 100644 --- a/Services/Skill/Tree/class.ilSkillTreeDBRepository.php +++ b/Services/Skill/Tree/class.ilSkillTreeDBRepository.php @@ -149,4 +149,18 @@ public function getVirtualTreeForNodeId(int $node_id): ilVirtualSkillTree $tree_id = $this->getTreeIdForNodeId($node_id); return $this->tree_factory->getVirtualTreeById($tree_id); } + + public function getParentNodeIdForNodeId(int $node_id): int + { + $db = $this->db; + + $set = $db->queryF( + "SELECT * FROM skl_tree " . + " WHERE child = %s ", + ["integer"], + [$node_id] + ); + $rec = $db->fetchAssoc($set); + return (int) ($rec["parent"] ?? 0); + } } diff --git a/Services/Skill/interfaces/interface.ilSkillTreeRepository.php b/Services/Skill/interfaces/interface.ilSkillTreeRepository.php index 25eb5757cecf..0edd08ad87b8 100644 --- a/Services/Skill/interfaces/interface.ilSkillTreeRepository.php +++ b/Services/Skill/interfaces/interface.ilSkillTreeRepository.php @@ -52,4 +52,6 @@ public function getTreeIdForNodeId(int $node_id): int; public function getTreeForNodeId(int $node_id): ilSkillTree; public function getVirtualTreeForNodeId(int $node_id): ilVirtualSkillTree; + + public function getParentNodeIdForNodeId(int $node_id): int; } From 8c8a6e0796874cf662dd378d8b142cf35980dbb0 Mon Sep 17 00:00:00 2001 From: Stefan Hecken Date: Wed, 8 Nov 2023 15:19:50 +0100 Subject: [PATCH 069/497] MediaCast: 31722 fix ordering issues at copying object (#6428) * MediaCast: 31722 save ordering after delete of items * MediaCast: 31722 check old order id is available in mapping if not continue --- Modules/MediaCast/classes/class.ilObjMediaCast.php | 3 +++ Modules/MediaCast/classes/class.ilObjMediaCastGUI.php | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Modules/MediaCast/classes/class.ilObjMediaCast.php b/Modules/MediaCast/classes/class.ilObjMediaCast.php index 0d6e85a34357..2baf5b392501 100755 --- a/Modules/MediaCast/classes/class.ilObjMediaCast.php +++ b/Modules/MediaCast/classes/class.ilObjMediaCast.php @@ -389,6 +389,9 @@ protected function copyOrder( ): void { $items = []; foreach ($this->readOrder() as $i) { + if(!array_key_exists($i, $mapping)) { + continue; + } $items[] = $mapping[$i]; } $newObj->saveOrder($items); diff --git a/Modules/MediaCast/classes/class.ilObjMediaCastGUI.php b/Modules/MediaCast/classes/class.ilObjMediaCastGUI.php index b5b173a0be60..a482d839b07b 100755 --- a/Modules/MediaCast/classes/class.ilObjMediaCastGUI.php +++ b/Modules/MediaCast/classes/class.ilObjMediaCastGUI.php @@ -943,7 +943,7 @@ public function deleteItemsObject(): void $mc_item = new ilNewsItem($item_id); $mc_item->delete(); } - + $this->object->saveOrder($this->object->readItems()); $ilCtrl->redirect($this, "listItems"); } From 53a1acf0ce7569b3c2bf726199b0c0a385baa63d Mon Sep 17 00:00:00 2001 From: Thomas Famula Date: Wed, 8 Nov 2023 15:43:11 +0100 Subject: [PATCH 070/497] Fix 38649: Deleting sub-node in competence template category will delete top-node references --- Services/Skill/Node/class.ilBasicSkillTemplate.php | 2 +- Services/Skill/Node/class.ilSkillTemplateCategory.php | 2 +- Services/Skill/Tree/class.ilObjSkillTreeGUI.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/Skill/Node/class.ilBasicSkillTemplate.php b/Services/Skill/Node/class.ilBasicSkillTemplate.php index dd90c8cfc06b..cda1fc54d7b1 100644 --- a/Services/Skill/Node/class.ilBasicSkillTemplate.php +++ b/Services/Skill/Node/class.ilBasicSkillTemplate.php @@ -57,7 +57,7 @@ public function delete(): void { $ilDB = $this->db; - foreach (\ilSkillTemplateReference::_lookupTrefIdsForTemplateId($this->getId()) as $tref_id) { + foreach (\ilSkillTemplateReference::_lookupTrefIdsForTopTemplateId($this->getId()) as $tref_id) { $obj = ilSkillTreeNodeFactory::getInstance($tref_id); $skill_tree = $this->skill_service->internal()->repo()->getTreeRepo()->getTreeForNodeId($tref_id); $node_data = $skill_tree->getNodeData($tref_id); diff --git a/Services/Skill/Node/class.ilSkillTemplateCategory.php b/Services/Skill/Node/class.ilSkillTemplateCategory.php index 8565894e1d95..c9bb0ed70b05 100644 --- a/Services/Skill/Node/class.ilSkillTemplateCategory.php +++ b/Services/Skill/Node/class.ilSkillTemplateCategory.php @@ -66,7 +66,7 @@ public function delete(): void } } - foreach (\ilSkillTemplateReference::_lookupTrefIdsForTemplateId($sctp_id) as $tref_id) { + foreach (\ilSkillTemplateReference::_lookupTrefIdsForTopTemplateId($sctp_id) as $tref_id) { $obj = ilSkillTreeNodeFactory::getInstance($tref_id); $skill_tree = $this->skill_service->internal()->repo()->getTreeRepo()->getTreeForNodeId($tref_id); $node_data = $skill_tree->getNodeData($tref_id); diff --git a/Services/Skill/Tree/class.ilObjSkillTreeGUI.php b/Services/Skill/Tree/class.ilObjSkillTreeGUI.php index 3de3d6598a8e..43160a61b347 100644 --- a/Services/Skill/Tree/class.ilObjSkillTreeGUI.php +++ b/Services/Skill/Tree/class.ilObjSkillTreeGUI.php @@ -695,7 +695,7 @@ public function deleteNodes(object $a_gui): void : $node_obj->getTitle() . " (" . $this->lng->txt("skmg_count_references") . " " . - count(ilSkillTemplateReference::_lookupTrefIdsForTemplateId($node_obj->getId())) . + count(ilSkillTemplateReference::_lookupTrefIdsForTopTemplateId($node_obj->getId())) . ")"; } $confirmation_gui->addItem( From a5d913c928469da783a255bd98f8e2fa07009975 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 8 Nov 2023 15:53:03 +0100 Subject: [PATCH 071/497] 37041: Filter is not executed when Enter key is pressed but is collapsed --- Services/Table/templates/default/tpl.table2.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/Table/templates/default/tpl.table2.html b/Services/Table/templates/default/tpl.table2.html index b5d0a32dcb27..acc6ff5e55a5 100755 --- a/Services/Table/templates/default/tpl.table2.html +++ b/Services/Table/templates/default/tpl.table2.html @@ -20,9 +20,6 @@
{TXT_FILTER} -
-
-
{FILTER_SELECTOR}
@@ -51,6 +48,9 @@ +
+
+
From 392ed0c9b37e9e1e2510d35f2f4ddd79dac10fd6 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 8 Nov 2023 16:21:07 +0100 Subject: [PATCH 072/497] 37912: Multiactions Missing On Manage Screens of Containers On Mobile --- Services/Container/classes/class.ilContainerGUI.php | 2 ++ Services/UICore/classes/MetaTemplate/PageContentGUI.php | 1 + 2 files changed, 3 insertions(+) diff --git a/Services/Container/classes/class.ilContainerGUI.php b/Services/Container/classes/class.ilContainerGUI.php index ee78c89ff25c..f44c9d63b851 100644 --- a/Services/Container/classes/class.ilContainerGUI.php +++ b/Services/Container/classes/class.ilContainerGUI.php @@ -463,6 +463,7 @@ public function showAdministrationPanel(): void $main_tpl->setPageFormAction($this->ctrl->getFormAction($this)); $toolbar = new ilToolbarGUI(); + $toolbar->setId("admclip"); $this->ctrl->setParameter($this, "type", ""); $this->ctrl->setParameter($this, "item_ref_id", ""); @@ -482,6 +483,7 @@ public function showAdministrationPanel(): void $main_tpl->setPageFormAction($this->ctrl->getFormAction($this)); $toolbar = new ilToolbarGUI(); + $toolbar->setId("adm"); $this->ctrl->setParameter($this, "type", ""); $this->ctrl->setParameter($this, "item_ref_id", ""); diff --git a/Services/UICore/classes/MetaTemplate/PageContentGUI.php b/Services/UICore/classes/MetaTemplate/PageContentGUI.php index de59e9ac9e7e..e693946de2e5 100644 --- a/Services/UICore/classes/MetaTemplate/PageContentGUI.php +++ b/Services/UICore/classes/MetaTemplate/PageContentGUI.php @@ -576,6 +576,7 @@ protected function fillAdminPanel(): void $current_toolbar->setLeadingImage(\ilUtil::getImagePath("arrow_downright.svg"), $lng->txt("actions")); } + $current_toolbar->setId($current_toolbar->getId() . "2"); $this->template->setVariable("ADM_PANEL2", $current_toolbar->getHTML()); $this->template->parseCurrentBlock(); } From a2ec2a8eda576135ed11cb4f173bd2dcea987078 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 8 Nov 2023 19:07:39 +0100 Subject: [PATCH 073/497] 34050: Portfolio of Other Users --- Modules/Portfolio/Page/class.ilPortfolioPageGUI.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Modules/Portfolio/Page/class.ilPortfolioPageGUI.php b/Modules/Portfolio/Page/class.ilPortfolioPageGUI.php index 5993ad411350..e950b5ba3537 100644 --- a/Modules/Portfolio/Page/class.ilPortfolioPageGUI.php +++ b/Modules/Portfolio/Page/class.ilPortfolioPageGUI.php @@ -1179,7 +1179,11 @@ private function createPersistentCertificateUrl( ilUserCertificateRepository $userCertificateRepository, string $url ): string { - $presentation = $userCertificateRepository->fetchActiveCertificateForPresentation($this->user->getId(), $a_id); + try { + $presentation = $userCertificateRepository->fetchActiveCertificateForPresentation($this->user->getId(), $a_id); + } catch (Exception $e) { + return ""; + } $caption = $this->lng->txt('certificate') . ': '; $caption .= $this->lng->txt($presentation->getUserCertificate()->getObjType()) . ' '; $caption .= '"' . $presentation->getObjectTitle() . '"'; From b316737fb23322f8a8640f8f839e81755558f2bb Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 8 Nov 2023 19:21:04 +0100 Subject: [PATCH 074/497] =?UTF-8?q?37392:=20Standardeinstellung=20der=20Da?= =?UTF-8?q?rstellung=20von=20Seiten=C3=BCberschrift=20in=20Lernmodulen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/LearningModule/classes/class.ilObjContentObject.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/LearningModule/classes/class.ilObjContentObject.php b/Modules/LearningModule/classes/class.ilObjContentObject.php index e83eb992d5fe..5f8d86f70735 100755 --- a/Modules/LearningModule/classes/class.ilObjContentObject.php +++ b/Modules/LearningModule/classes/class.ilObjContentObject.php @@ -972,8 +972,10 @@ public function createProperties(): void { $ilDB = $this->db; - $q = "INSERT INTO content_object (id) VALUES (" . $ilDB->quote($this->getId(), "integer") . ")"; - $ilDB->manipulate($q); + $this->db->insert("content_object", [ + "id" => ["integer", $this->getId()], + "page_header" => ["text", ilLMObject::PAGE_TITLE] + ]); // #14661 $this->notes->domain()->activateComments($this->getId()); From d4c641ff624ff433aa952976a46d0ff4d6853ab3 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 8 Nov 2023 19:29:22 +0100 Subject: [PATCH 075/497] 35460: Missing variable -svy_no_appraisees_found- --- lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 2 files changed, 2 insertions(+) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 3e1429c2de0a..7400c80ff830 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -16057,6 +16057,7 @@ survey#:#svy_neutral_answer#:#Text für eine neutrale Antwort ("Nicht definiert" survey#:#svy_notification_tutor_results#:#Eine E-Mail mit den Umfrageergebnissen survey#:#svy_notification_tutor_results_alert#:#Diese Funktion erfordert ein Enddatum. survey#:#svy_notification_tutor_results_info#:#Nach dem Ablauf des Enddatum wird eine E-Mail mit den detailierten Umfrageergebnissen versendet. +survey#:#svy_no_appraisees_found#:#Es liegen keine Feedback-Nehmer mit abgegebenen Feedbacks vor. survey#:#svy_only_max_one_external_rater#:#Bitte wählen Sie nur einen externen Feedback-Geber aus. survey#:#svy_page_add_question#:#Neue %s hinzufügen survey#:#svy_page_error#:#Beim Beantworten einer Frage ist ein Fehler aufgetreten. Die Fehlermeldung finden Sie bei der betroffenen Frage! diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index f3903076cf79..d12ddde94061 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -16058,6 +16058,7 @@ survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results survey#:#svy_notification_tutor_results_alert#:#This requires an end date. survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it. survey#:#svy_only_max_one_external_rater#:#Please select only one external rater. +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found. survey#:#svy_page_add_question#:#Add new %s survey#:#svy_page_error#:#There was an error answering a survey question. Please refer to the question to get more information on the error! survey#:#svy_page_errors#:#There were errors answering the survey questions. Please refer to the questions to get more information on the errors! From d48a3ec104192182aadd5b403b50d78dde7375db Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 8 Nov 2023 22:49:01 +0100 Subject: [PATCH 076/497] 36960: Internally linked glossary term always opens in new browser tab --- Services/COPage/classes/class.ilPageLinker.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/COPage/classes/class.ilPageLinker.php b/Services/COPage/classes/class.ilPageLinker.php index 5c45dbd556f5..535a5eef8578 100644 --- a/Services/COPage/classes/class.ilPageLinker.php +++ b/Services/COPage/classes/class.ilPageLinker.php @@ -121,8 +121,8 @@ public function getLinkXML(array $int_links): string break; case "GlossaryItem": - if ($targetframe == "None") { - $targetframe = "Glossary"; + if ($targetframe == "Glossary") { + $ltarget = ""; } $href = "./goto.php?target=git_" . $target_id; break; From 449f074b6cb148c56819dbd1ba320e4c470c66d6 Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Thu, 9 Nov 2023 08:38:14 +0100 Subject: [PATCH 077/497] [FIX] 0038644: Unzip does not work on relative paths anymore --- .../FileServices/classes/class.ilFileUtils.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Services/FileServices/classes/class.ilFileUtils.php b/Services/FileServices/classes/class.ilFileUtils.php index 38ba0cb4127f..b38fd102e10d 100644 --- a/Services/FileServices/classes/class.ilFileUtils.php +++ b/Services/FileServices/classes/class.ilFileUtils.php @@ -899,7 +899,12 @@ public static function unzip( // rename executables self::renameExecutables($unzippable_zip_directory); - // now we have to move the files to the original directory. if $a_flat is true, we move the files only without directories, otherwise we move the whole directory + // now we have to move the files to the original directory. + // if $a_flat is true, we move the files only without directories, otherwise we move the whole directory. + // since some provide a realtive path here, we have to get the absolute path first + $target_dir_name = $original_zip_path_info["dirname"]; + $target_dir_name = realpath($target_dir_name); + if ($unpack_flat) { $file_array = []; self::recursive_dirscan($temporary_unzip_directory, $file_array); @@ -911,13 +916,17 @@ public static function unzip( ) { copy( $file_array["path"][$k] . $f, - $original_zip_path_info["dirname"] . DIRECTORY_SEPARATOR . $f + $target_dir_name . DIRECTORY_SEPARATOR . $f ); } } } } else { - self::rCopy($temporary_unzip_directory, $original_zip_path_info["dirname"]); + $target_directory = $target_dir_name; + self::rCopy( + $temporary_unzip_directory, + $target_directory + ); } self::delDir($temporary_unzip_directory); From 86ea63bbf747ab92527ac3aeb758152ff853631c Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 9 Nov 2023 09:16:39 +0100 Subject: [PATCH 078/497] AdvMD: potentially fix update from 7 (38328) --- setup/sql/dbupdate_05.php | 119 +++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 61 deletions(-) diff --git a/setup/sql/dbupdate_05.php b/setup/sql/dbupdate_05.php index 9de4b7151d95..b9d0f3b67411 100755 --- a/setup/sql/dbupdate_05.php +++ b/setup/sql/dbupdate_05.php @@ -823,7 +823,7 @@ <#5487> dropPrimaryKey('post_conditions'); - $ilDB->addPrimaryKey('post_conditions', ['ref_id', 'condition_operator', 'value']); +$ilDB->addPrimaryKey('post_conditions', ['ref_id', 'condition_operator', 'value']); ?> <#5488> @@ -2808,14 +2808,14 @@ ["integer"], [0] ); - while ($rec = $ilDB->fetchAssoc($set)) { - $ilDB->manipulateF( - "DELETE FROM svy_inv_usr WHERE " . - " survey_fi = %s", - ["integer"], - [$rec["survey_id"]] - ); - } +while ($rec = $ilDB->fetchAssoc($set)) { + $ilDB->manipulateF( + "DELETE FROM svy_inv_usr WHERE " . + " survey_fi = %s", + ["integer"], + [$rec["survey_id"]] + ); +} ?> <#5585> @@ -2841,16 +2841,16 @@ <#5586> queryF( - "SELECT DISTINCT survey_fi, user_fi FROM svy_inv_usr ", - [], - [] -); - while ($rec = $ilDB->fetchAssoc($set)) { - $ilDB->insert("svy_invitation", [ - "survey_id" => ["integer", $rec["survey_fi"]], - "user_id" => ["integer", $rec["user_fi"]] - ]); - } + "SELECT DISTINCT survey_fi, user_fi FROM svy_inv_usr ", + [], + [] + ); +while ($rec = $ilDB->fetchAssoc($set)) { + $ilDB->insert("svy_invitation", [ + "survey_id" => ["integer", $rec["survey_fi"]], + "user_id" => ["integer", $rec["user_fi"]] + ]); +} ?> <#5587> @@ -2905,13 +2905,13 @@ $tree = new \ilTree(1); switch ($tree_type) { - case \ilTree::TREE_TYPE_NESTED_SET: - $tree->renumber(); - break; + case \ilTree::TREE_TYPE_NESTED_SET: + $tree->renumber(); + break; - case \ilTree::TREE_TYPE_MATERIALIZED_PATH: - \ilMaterializedPathTree::createFromParentRelation($ilDB); - break; + case \ilTree::TREE_TYPE_MATERIALIZED_PATH: + \ilMaterializedPathTree::createFromParentRelation($ilDB); + break; } @@ -3670,30 +3670,30 @@ <#5627> <#5628> @@ -4002,16 +4002,16 @@ 'fixed' => false )); } - ?> +?> <#5644> tableColumnExists('svy_svy', 'tutor_res_cron')) { - $ilDB->addTableColumn('svy_svy', 'tutor_res_cron', array( - "type" => "integer", - "notnull" => false, - "length" => 1 - )); - } +if (!$ilDB->tableColumnExists('svy_svy', 'tutor_res_cron')) { + $ilDB->addTableColumn('svy_svy', 'tutor_res_cron', array( + "type" => "integer", + "notnull" => false, + "length" => 1 + )); +} ?> <#5645> quote($row->field_id, ilDBConstants::T_INTEGER) . ' ' . 'and lang_code = ' . $ilDB->quote($row->lang_default, ilDBConstants::T_TEXT) . ' ' . - 'and idx = ' . $ilDB->quote($index, ilDBConstants::T_INTEGER); + 'and idx = ' . $ilDB->quote($idx, ilDBConstants::T_INTEGER); $exists_res = $ilDB->query($exists_query); if ($exists_res->numRows() > 0) { continue; @@ -6282,11 +6281,10 @@ } $idx = 0; foreach ($options as $option) { - $index = $idx + 1; $exists_query = 'select field_id from adv_mdf_enum ' . 'where field_id = ' . $ilDB->quote($row->field_id, ilDBConstants::T_INTEGER) . ' ' . 'and lang_code = ' . $ilDB->quote($lang, ilDBConstants::T_TEXT) . ' ' . - 'and idx = ' . $ilDB->quote($index, ilDBConstants::T_INTEGER); + 'and idx = ' . $ilDB->quote($idx, ilDBConstants::T_INTEGER); $exists_res = $ilDB->query($exists_query); if ($exists_res->numRows() > 0) { continue; @@ -6309,11 +6307,10 @@ ) { $idx = 0; foreach ($values as $option) { - $index = $idx + 1; $exists_query = 'select field_id from adv_mdf_enum ' . 'where field_id = ' . $ilDB->quote($row->field_id, ilDBConstants::T_INTEGER) . ' ' . 'and lang_code = ' . $ilDB->quote($row->lang_default, ilDBConstants::T_TEXT) . ' ' . - 'and idx = ' . $ilDB->quote($index, ilDBConstants::T_INTEGER); + 'and idx = ' . $ilDB->quote($idx, ilDBConstants::T_INTEGER); $exists_res = $ilDB->query($exists_query); if ($exists_res->numRows() > 0) { continue; From 42ec4b16dbbd2b0499890b184519b32ea42abd22 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Thu, 9 Nov 2023 09:56:43 +0100 Subject: [PATCH 079/497] 37406: Copying a Wiki with someone having enabled notifications crashes because of ctrl_struture --- Modules/Wiki/classes/class.ilWikiUtil.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Modules/Wiki/classes/class.ilWikiUtil.php b/Modules/Wiki/classes/class.ilWikiUtil.php index dffd66b29a13..61127555df16 100755 --- a/Modules/Wiki/classes/class.ilWikiUtil.php +++ b/Modules/Wiki/classes/class.ilWikiUtil.php @@ -468,6 +468,10 @@ public static function sendNotification( $ilObjDataCache = $DIC["ilObjDataCache"]; $ilAccess = $DIC->access(); + if ($a_wiki_ref_id === 0) { + return; + } + $wiki_id = $ilObjDataCache->lookupObjId($a_wiki_ref_id); $wiki = new ilObjWiki($a_wiki_ref_id, true); $page = new ilWikiPage($a_page_id); From 18e29f697f055603c3ac3e18a9860b512f33d10a Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Thu, 2 Nov 2023 07:18:15 +0100 Subject: [PATCH 080/497] [FIX] 0038295: Aggregated by First Table in SQL: ErrorException Undefined array key "cnt" # Conflicts: # Modules/SystemFolder/classes/class.ilBenchmarkTableGUI.php --- .../classes/class.ilBenchmarkTableGUI.php | 62 ++++++++----------- 1 file changed, 26 insertions(+), 36 deletions(-) diff --git a/Modules/SystemFolder/classes/class.ilBenchmarkTableGUI.php b/Modules/SystemFolder/classes/class.ilBenchmarkTableGUI.php index 82121e382531..8efddc6f0880 100644 --- a/Modules/SystemFolder/classes/class.ilBenchmarkTableGUI.php +++ b/Modules/SystemFolder/classes/class.ilBenchmarkTableGUI.php @@ -23,11 +23,7 @@ */ class ilBenchmarkTableGUI extends ilTable2GUI { - /** - * @var ilAccessHandler - */ - protected $access; - + protected ilAccessHandler $access; /** * Constructor @@ -85,24 +81,18 @@ public function __construct($a_parent_obj, $a_parent_cmd, $a_records, $a_mode = $this->setRowTemplate("tpl.db_bench.html", "Modules/SystemFolder"); $this->disable("footer"); $this->setEnableTitle(true); - - // $this->addMultiCommand("", $lng->txt("")); -// $this->addCommandButton("", $lng->txt("")); } /** * Get first occurence of string - * - * @param - * @return */ - public function getFirst($a_str, $a_needles) + public function getFirst(string $a_str, array $a_needles): int { $pos = 0; foreach ($a_needles as $needle) { - $pos2 = strpos($a_str, $needle); + $pos2 = strpos($a_str, (string) $needle); - if ($pos2 > 0 && ($pos2 < $pos || $pos == 0)) { + if ($pos2 > 0 && ($pos2 < $pos || $pos === 0)) { $pos = $pos2; } } @@ -112,49 +102,49 @@ public function getFirst($a_str, $a_needles) /** * Extract first table from sql - * - * @param - * @return */ - public function extractFirstTableFromSQL($a_sql) + public function extractFirstTableFromSQL(string $a_sql): string { - $pos1 = $this->getFirst(strtolower($a_sql), array("from ", "from\n", "from\t", "from\r")); + $pos1 = $this->getFirst(strtolower($a_sql), ["from ", "from\n", "from\t", "from\r"]); $table = ""; if ($pos1 > 0) { $tablef = substr(strtolower($a_sql), $pos1 + 5); - $pos2 = $this->getFirst($tablef, array(" ", "\n", "\t", "\r")); - if ($pos2 > 0) { - $table = substr($tablef, 0, $pos2); - } else { - $table = $tablef; - } + $pos2 = $this->getFirst($tablef, [" ", "\n", "\t", "\r"]); + $table = $pos2 > 0 ? substr($tablef, 0, $pos2) : $tablef; } - if (trim($table) != "") { + if (trim($table) !== "") { return $table; } return ""; } - /** * Get data by first table - * - * @param - * @return */ - public function getDataByFirstTable($a_records) + public function getDataByFirstTable(array $a_records): array { - $data = array(); + $data = []; foreach ($a_records as $r) { $table = $this->extractFirstTableFromSQL($r["sql"]); + if (trim($table) === '') { + continue; + } $data[$table]["table"] = $table; - $data[$table]["cnt"]++; - $data[$table]["time"] += $r["time"]; + if (!isset($data[$table]["cnt"])) { + $data[$table]["cnt"] = 1; + } else { + $data[$table]["cnt"]++; + } + if (!isset($data[$table]["time"])) { + $data[$table]["time"] = $r["time"]; + } else { + $data[$table]["time"] += $r["time"]; + } } - if (count($data) > 0) { - $data = ilArrayUtil::sortArray($data, "time", "desc", true); + if ($data !== []) { + return ilArrayUtil::sortArray($data, "time", "desc", true); } return $data; From 81a6bd494f469e68815fc3428e739ae0710f8969 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Tue, 7 Nov 2023 17:07:34 +0100 Subject: [PATCH 081/497] LSO: 34712, return LP_MODE_COLLECTION in LP defaults --- .../classes/LearnerProgress/class.ilLSLP.php | 14 +++++++++--- .../test/LearnerProgress/ilLSLPTest.php | 22 ++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/Modules/LearningSequence/classes/LearnerProgress/class.ilLSLP.php b/Modules/LearningSequence/classes/LearnerProgress/class.ilLSLP.php index 0e99b8c9547b..4cfb9ade49fc 100644 --- a/Modules/LearningSequence/classes/LearnerProgress/class.ilLSLP.php +++ b/Modules/LearningSequence/classes/LearnerProgress/class.ilLSLP.php @@ -1,7 +1,5 @@ assertIsArray($result); $this->assertNotEmpty($result); - $this->assertEquals(ilLPObjSettings::LP_MODE_DEACTIVATED, array_pop($result)); + $this->assertEquals( + [ilLPObjSettings::LP_MODE_DEACTIVATED, ilLPObjSettings::LP_MODE_COLLECTION], + $result + ); + } + + public function testGetDefaultModesLPDeactive(): void + { + $obj = new ilLSLPStub(); + $result = $obj->getDefaultModes(false); + + $this->assertIsArray($result); + $this->assertNotEmpty($result); + $this->assertEquals( + [ilLPObjSettings::LP_MODE_DEACTIVATED], + $result + ); } public function testGetDefaultMode(): void From a2ce8b3f5bb466ec4356fcbfd95636b5b7335c29 Mon Sep 17 00:00:00 2001 From: Thomas Famula Date: Thu, 9 Nov 2023 10:14:56 +0100 Subject: [PATCH 082/497] Fix 38573: Missing language variables for Skill Tree permissions --- lang/ilias_de.lang | 17 +++++++++++++++-- lang/ilias_en.lang | 23 ++++++++++++++++++----- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 7400c80ff830..b7cde5553fe1 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -5136,6 +5136,7 @@ common#:#objs_rtst#:#ECS-Tests common#:#objs_rwik#:#ECS-Wikis common#:#objs_sahs#:#SCORM-Lernmodule common#:#objs_sess#:#Sitzungen +common#:#objs_skee#:#Kompetenzbäume common#:#objs_spl#:#Fragenpools für Umfragen common#:#objs_st#:#Kapitel common#:#objs_svy#:#Umfragen @@ -13751,6 +13752,7 @@ rbac#:#rbac_create_role#:#Rolle anlegen rbac#:#rbac_create_rolt#:#Rollenvorlage anlegen rbac#:#rbac_create_sahs#:#SCORM-Lernmodul anlegen rbac#:#rbac_create_sess#:#Sitzung anlegen +rbac#:#rbac_create_skee#:#Kompetenzbaum anlegen rbac#:#rbac_create_spl#:#Fragenpool für Umfragen anlegen rbac#:#rbac_create_svy#:#Umfrage anlegen rbac#:#rbac_create_tst#:#Test anlegen @@ -13843,10 +13845,10 @@ rbac#:#rcrs_edit_permission#:#Rechteeinstellungen ändern rbac#:#rcrs_read#:#Lesezugriff auf ECS-Kurs rbac#:#rcrs_visible#:#ECS-Kurs ist sichtbar rbac#:#rcrs_write#:#ECS-Kurs bearbeiten -rbac#:#read_comp#:#Lesezugriff auf Kompetenzen und Kompetenzvorlagen +rbac#:#read_comp#:#Lesezugriff Kompetenzen rbac#:#read_learning_progress#:#Lernfortschritt anderer Benutzer einsehen rbac#:#read_outcomes#:#Lernerfahrungen anderer Benutzer anzeigen -rbac#:#read_profiles#:#Lesezugriff auf Kompetenzprofile +rbac#:#read_profiles#:#Lesezugriff Kompetenzprofile rbac#:#read_results#:#Umfrageergebnisse rbac#:#read_users#:#Lokale Anmeldekonten einsehen rbac#:#recf_edit_permission#:#Rechteeinstellungen in der Verwaltung wiederhergestellter Objekte ändern @@ -13926,6 +13928,17 @@ rbac#:#sess_read#:#Lesezugriff auf Sitzungen rbac#:#sess_read_learning_progress#:#Benutzer kann Lernfortschritt anderer Benutzer einsehen rbac#:#sess_visible#:#Sitzungen sind sichtbar rbac#:#sess_write#:#Sitzungen bearbeiten +rbac#:#skee_copy#:#Kompetenzbaum kopieren (derzeit nicht verfügbar) +rbac#:#skee_delete#:#Kompetenzbaum löschen +rbac#:#skee_edit_permission#:#Rechteeinstellungen der Kompetenzbaum-Administration ändern +rbac#:#skee_manage_comp#:#Kompetenzen in Kompetenzbaum bearbeiten +rbac#:#skee_manage_comp_temp#:#Kompetenzvorlagen in Kompetenzbaum bearbeiten +rbac#:#skee_manage_profiles#:#Kompetenzprofile in Kompetenzbaum bearbeiten +rbac#:#skee_read#:#Lesezugriff auf Administration für Kompetenzbaum +rbac#:#skee_read_comp#:#Lesezugriff auf Kompetenzen und Kompetenzvorlagen in Kompetenzbaum +rbac#:#skee_read_profiles#:#Lesezugriff auf Kompetenzprofile in Kompetenzbaum +rbac#:#skee_visible#:#Kompetenzbaum ist sichtbar +rbac#:#skee_write#:#Einstellungen für Kompetenzbaum bearbeiten rbac#:#skmg_edit_permission#:#Rechteeinstellungen für die Verwaltung des Kompetenzmanagements ändern rbac#:#skmg_read#:#Lesezugriff auf Kompetenzmanagement rbac#:#skmg_visible#:#Kompetenzmanagement ist sichtbar diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index d12ddde94061..4c36768bcfe4 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -5136,6 +5136,7 @@ common#:#objs_rtst#:#ECS Tests common#:#objs_rwik#:#ECS Wikis common#:#objs_sahs#:#SCORM Learning Modules common#:#objs_sess#:#Sessions +common#:#objs_skee#:#Competence Trees common#:#objs_spl#:#Question Pools Survey common#:#objs_st#:#Chapters common#:#objs_svy#:#Surveys @@ -13555,10 +13556,10 @@ rbac#:#mail_smtp_mail#:#User can send e-mails per SMTP to external addresses rbac#:#mail_to_global_roles#:#Global Mails rbac#:#mail_visible#:#Mail administration is visible rbac#:#mail_write#:#User can edit settings in Mail administration -rbac#:#manage_comp#:#User can edit Competences -rbac#:#manage_comp_temp#:#User can edit Competence Templates +rbac#:#manage_comp#:#Edit Competences +rbac#:#manage_comp_temp#:#Edit Competence Templates rbac#:#manage_materials#:#Manage Materials -rbac#:#manage_profiles#:#User can edit Competence Profiles +rbac#:#manage_profiles#:#Edit Competence Profiles rbac#:#mcst_copy#:#User can copy mediacast rbac#:#mcst_delete#:#User can move or delete mediacast rbac#:#mcst_edit_learning_progress#:#User can edit learning progress settings @@ -13751,6 +13752,7 @@ rbac#:#rbac_create_role#:#Create new Role rbac#:#rbac_create_rolt#:#Create new Role Template rbac#:#rbac_create_sahs#:#Create SCORM Learning Module rbac#:#rbac_create_sess#:#Create Session +rbac#:#rbac_create_skee#:#Create Competence Tree rbac#:#rbac_create_spl#:#Create Question Pool Survey rbac#:#rbac_create_svy#:#Create Survey rbac#:#rbac_create_tst#:#Create Test @@ -13843,10 +13845,10 @@ rbac#:#rcrs_edit_permission#:#User can change permission settings rbac#:#rcrs_read#:#User can use ECS Course rbac#:#rcrs_visible#:#ECS Course is visible rbac#:#rcrs_write#:#User can edit settings of ECS Course -rbac#:#read_comp#:#User has read access to Competences and Competence Templates +rbac#:#read_comp#:#Read Competences rbac#:#read_learning_progress#:#View learning progress of other users rbac#:#read_outcomes#:#View learning experiences of other users -rbac#:#read_profiles#:#User has read access to Competence Profiles +rbac#:#read_profiles#:#Read Profiles rbac#:#read_results#:#Survey Results rbac#:#read_users#:#Read Access to User Accounts rbac#:#recf_edit_permission#:#User can change permission settings of Restored Objects administration @@ -13926,6 +13928,17 @@ rbac#:#sess_read#:#User has read access to sessions rbac#:#sess_read_learning_progress#:#User can view learning progress of other users rbac#:#sess_visible#:#Sessions are visible rbac#:#sess_write#:#User can edit session content and settings +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available) +rbac#:#skee_delete#:#User can delete Competence Tree +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree +rbac#:#skee_read#:#User has read access to administration of Competence Tree +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree +rbac#:#skee_visible#:#Competence Tree is visible +rbac#:#skee_write#:#User can edit settings of Competence Tree rbac#:#skmg_edit_permission#:#User can change permission settings of Competence Management administration rbac#:#skmg_read#:#User has read access to administration of Competence Management rbac#:#skmg_visible#:#Competence Management administration is visible From 360717aee64bc9c035cc02ba2e50ad1c6fe2c476 Mon Sep 17 00:00:00 2001 From: Thomas Famula Date: Thu, 9 Nov 2023 10:33:24 +0100 Subject: [PATCH 083/497] Sort language files --- lang/ilias_de.lang | 2 +- lang/ilias_en.lang | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index b7cde5553fe1..3c00a566789c 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -16067,10 +16067,10 @@ survey#:#svy_mail_send_confirmation#:#Teilnahmebestätigung senden survey#:#svy_matrix_layout_percentages_sum_invalid#:#Die Spalten-Einstellungen summieren sich nicht auf 100%. survey#:#svy_max_sum_score#:#Maximale Skalenpunktesumme survey#:#svy_neutral_answer#:#Text für eine neutrale Antwort ("Nicht definiert", "Ich weiß nicht", "Keine Angabe" etc.) +survey#:#svy_no_appraisees_found#:#Es liegen keine Feedback-Nehmer mit abgegebenen Feedbacks vor. survey#:#svy_notification_tutor_results#:#Eine E-Mail mit den Umfrageergebnissen survey#:#svy_notification_tutor_results_alert#:#Diese Funktion erfordert ein Enddatum. survey#:#svy_notification_tutor_results_info#:#Nach dem Ablauf des Enddatum wird eine E-Mail mit den detailierten Umfrageergebnissen versendet. -survey#:#svy_no_appraisees_found#:#Es liegen keine Feedback-Nehmer mit abgegebenen Feedbacks vor. survey#:#svy_only_max_one_external_rater#:#Bitte wählen Sie nur einen externen Feedback-Geber aus. survey#:#svy_page_add_question#:#Neue %s hinzufügen survey#:#svy_page_error#:#Beim Beantworten einer Frage ist ein Fehler aufgetreten. Die Fehlermeldung finden Sie bei der betroffenen Frage! diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 4c36768bcfe4..b661eb902137 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -16067,11 +16067,11 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score survey#:#svy_neutral_answer#:#Text for a Neutral Answer (‘Not Specified’, ‘I don't know’ etc.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found. survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results survey#:#svy_notification_tutor_results_alert#:#This requires an end date. survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it. survey#:#svy_only_max_one_external_rater#:#Please select only one external rater. -survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found. survey#:#svy_page_add_question#:#Add new %s survey#:#svy_page_error#:#There was an error answering a survey question. Please refer to the question to get more information on the error! survey#:#svy_page_errors#:#There were errors answering the survey questions. Please refer to the questions to get more information on the errors! From c6a29c5024db43c5fc05f35dbc49764aead6b75e Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Thu, 9 Nov 2023 11:00:33 +0100 Subject: [PATCH 084/497] =?UTF-8?q?37389:=20Keine=20Erfolgsmeldung=20nach?= =?UTF-8?q?=20dem=20Einf=C3=BCgen=20einer=20neuen=20Seite=20in=20Lernmodul?= =?UTF-8?q?en?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/class.ilStructureObjectGUI.php | 14 +++++++++++++- lang/ilias_de.lang | 2 ++ lang/ilias_en.lang | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Modules/LearningModule/classes/class.ilStructureObjectGUI.php b/Modules/LearningModule/classes/class.ilStructureObjectGUI.php index 55b61d308cba..0fb4ab8f823a 100755 --- a/Modules/LearningModule/classes/class.ilStructureObjectGUI.php +++ b/Modules/LearningModule/classes/class.ilStructureObjectGUI.php @@ -44,7 +44,7 @@ public function __construct( $this->lng = $DIC->language(); $this->tabs = $DIC->tabs(); $this->log = $DIC["ilLog"]; - $this->tpl = $DIC["tpl"]; + $this->tpl = $DIC->ui()->mainTemplate(); parent::__construct($a_content_obj); $this->tree = $a_tree; } @@ -750,6 +750,12 @@ public function insertPage(): void ilLMObject::putInTree($page, $parent_id, $target); } + if ($num == 1) { + $this->tpl->setOnScreenMessage("success", $this->lng->txt("lm_page_added"), true); + } else { + $this->tpl->setOnScreenMessage("success", $this->lng->txt("lm_pages_added"), true); + } + $ilCtrl->redirect($this, "showHierarchy"); } @@ -966,6 +972,12 @@ public function insertPageFromTemplate(): void $data["sec"]["title"] ); + if ($this->request->getMulti() <= 1) { + $this->tpl->setOnScreenMessage("success", $this->lng->txt("lm_page_added"), true); + } else { + $this->tpl->setOnScreenMessage("success", $this->lng->txt("lm_pages_added"), true); + } + //$ilCtrl->setParameter($this, "highlight", $page_ids); $ilCtrl->redirect($this, "showHierarchy", "node_" . $node_id); } diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 3c00a566789c..de88aa7f047d 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -10346,7 +10346,9 @@ lm#:#lm_edit_chapters#:#Kapitel bearbeiten lm#:#lm_edit_lm_settings#:#Lernmoduleinstellungen bearbeiten lm#:#lm_est_reading_time#:#Geschätzte Lesedauer lm#:#lm_est_reading_time_info#:#In Lernmodulen kann eine geschätzte Lesezeit ermittelt und angezeigt werden. +lm#:#lm_page_added#:#Eine Seite wurde hinzugefügt. lm#:#lm_page_type_lm#:#Lernmodulseite +lm#:#lm_pages_added#:#Die Seiten wurden hinzugefügt. lm#:#lm_save_titles#:#Titel wurden gespeichert. lng#:#language_detection#:#Automatische Spracherkennung lng#:#lng_disable_language_detection#:#Automatische Spracherkennung deaktivieren diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index b661eb902137..13f1dbbd7a6d 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -10346,7 +10346,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings lm#:#lm_est_reading_time#:#Estimated Reading Time lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed. +lm#:#lm_page_added#:#Page has been added. lm#:#lm_page_type_lm#:#LM Page +lm#:#lm_pages_added#:#Pages have been added. lm#:#lm_save_titles#:#Titles saved. lng#:#language_detection#:#Language Detection lng#:#lng_disable_language_detection#:#Disable Language Detection From 6d7c9de9c0ad1149469b7157593272e79e66dddf Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Thu, 9 Nov 2023 11:16:13 +0100 Subject: [PATCH 085/497] learning history: clarify deletion behaviour --- Services/LearningHistory/README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Services/LearningHistory/README.md b/Services/LearningHistory/README.md index fff3a57653a5..65043ec3ba5c 100644 --- a/Services/LearningHistory/README.md +++ b/Services/LearningHistory/README.md @@ -1,4 +1,4 @@ -#Learning History Service +# Learning History Service Welcome to the history of learning. @@ -26,9 +26,10 @@ trac#:#trac_lhist_obj_completed_in#:#$1$ was completed in $2$. If you additionally want to emphasize certain words (mostly titles) in your text, please use the method `$this->getEmphasizedTitle($string)`. -# JF Decisions +## Deletion Behaviour -8 Oct 2018 +The service will keep entries even if the referenced objects ($ref_id, $obj_id) are deleted in the meantime. However the consuming components must take care of their own deletion processes and historise data that is necessary to provide older entries for the learning history. [^2] -- General introduction of the service -- https://github.com/ILIAS-eLearning/ILIAS/pull/1210 \ No newline at end of file +[^1] 8 Oct 2018, General introduction of the service: https://github.com/ILIAS-eLearning/ILIAS/pull/1210 + +[^2] 18 Sep 2023, Clarification Deletion Behaviour, 4.5: https://docu.ilias.de/goto_docu_wiki_wpage_8022_1357.html \ No newline at end of file From 70b2ee0366240ffefc24505284bec14f2c262a69 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 9 Nov 2023 11:23:01 +0100 Subject: [PATCH 086/497] Container: fix filtering by default copyright (36679) --- .../Container/classes/class.ilContainer.php | 63 +++++++++++++++---- 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/Services/Container/classes/class.ilContainer.php b/Services/Container/classes/class.ilContainer.php index c09877ec8af6..71627bbf0ea3 100755 --- a/Services/Container/classes/class.ilContainer.php +++ b/Services/Container/classes/class.ilContainer.php @@ -1105,19 +1105,7 @@ protected function applyContainerUserFilter( } $obj_ids = array_intersect($obj_ids, $result_obj_ids); } elseif ((int) $field_id === ilContainerFilterField::STD_FIELD_COPYRIGHT) { - $result = null; - $set = $db->queryF( - "SELECT DISTINCT(rbac_id) FROM il_meta_rights " . - " WHERE " . $db->in("rbac_id", $obj_ids, false, "integer") . - " AND description = %s ", - ["text"], - ['il_copyright_entry__' . IL_INST_ID . '__' . $val] - ); - $result_obj_ids = []; - while ($rec = $db->fetchAssoc($set)) { - $result_obj_ids[] = $rec["rbac_id"]; - } - $obj_ids = array_intersect($obj_ids, $result_obj_ids); + $obj_ids = $this->filterObjIdsByCopyright($obj_ids, $val); } else { #$query_parser->setCombination($this->options['title_ao']); $query_parser->setCombination(ilQueryParser::QP_COMBINATION_OR); @@ -1202,6 +1190,55 @@ static function (array $i): int { return $objects; } + protected function filterObjIdsByCopyright(array $obj_ids, string $copyright_id): array + { + $identifier = \ilMDCopyrightSelectionEntry::createIdentifier($copyright_id); + $default_identifier = \ilMDCopyrightSelectionEntry::createIdentifier( + \ilMDCopyrightSelectionEntry::getDefault() + ); + + if ($identifier === $default_identifier) { + return $this->filterObjIdsByDefaultCopyright($obj_ids, $default_identifier); + } + + $db = $this->db; + $set = $db->queryF( + "SELECT DISTINCT(rbac_id) FROM il_meta_rights " . + " WHERE " . $db->in("rbac_id", $obj_ids, false, "integer") . + " AND description = %s ", + array("text"), + array($identifier) + ); + $result_obj_ids = []; + while ($rec = $db->fetchAssoc($set)) { + $result_obj_ids[] = $rec["rbac_id"]; + } + return array_intersect($obj_ids, $result_obj_ids); + } + + protected function filterObjIdsByDefaultCopyright( + array $obj_ids, + string $default_identifier + ): array { + /* + * Objects with no entry in il_meta_rights need to be treated like they + * have the default copyright. + */ + $db = $this->db; + $set = $db->queryF( + "SELECT DISTINCT(rbac_id) FROM il_meta_rights " . + " WHERE " . $db->in("rbac_id", $obj_ids, false, "integer") . + " AND NOT description = %s ", + array("text"), + array($default_identifier) + ); + $filtered_out_obj_ids = []; + while ($rec = $db->fetchAssoc($set)) { + $filtered_out_obj_ids[] = $rec["rbac_id"]; + } + return array_diff($obj_ids, $filtered_out_obj_ids); + } + /** * Legacy online filter * From b672f24d721c605a07501d0f1456155e6d2e2996 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 9 Nov 2023 11:51:15 +0100 Subject: [PATCH 087/497] User: Fix Use of $this in _goto See: https://mantis.ilias.de/view.php?id=38673 --- Services/User/classes/class.ilObjUserFolderGUI.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Services/User/classes/class.ilObjUserFolderGUI.php b/Services/User/classes/class.ilObjUserFolderGUI.php index cc9184b19f95..f4b94ff5c605 100755 --- a/Services/User/classes/class.ilObjUserFolderGUI.php +++ b/Services/User/classes/class.ilObjUserFolderGUI.php @@ -3708,6 +3708,7 @@ public static function _goto(int $a_user): void $ilAccess = $DIC['ilAccess']; $ilErr = $DIC['ilErr']; $lng = $DIC['lng']; + $ctrl = $DIC['ilCtrl']; $a_target = USER_FOLDER_ID; @@ -3716,7 +3717,7 @@ public static function _goto(int $a_user): void "", $a_target )) { - $this->ctrl->redirectToURL("ilias.php?baseClass=ilAdministrationGUI&ref_id=" . $a_target . "&jmpToUser=" . $a_user); + $ctrl->redirectToURL("ilias.php?baseClass=ilAdministrationGUI&ref_id=" . $a_target . "&jmpToUser=" . $a_user); exit; } else { if ($ilAccess->checkAccess( From aa7ceac488c933abd2f129fce8a448b29866302d Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Thu, 9 Nov 2023 12:10:18 +0100 Subject: [PATCH 088/497] =?UTF-8?q?37384:=20Portfolio=20=C3=BCbernimmt=20F?= =?UTF-8?q?ragenplatzhalter=20von=20Page=20Templates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/class.ilObjPortfolioBaseGUI.php | 2 +- .../Layout/classes/class.ilPageLayout.php | 6 ++++++ .../COPage/classes/class.ilPCPlaceHolder.php | 21 +++++++++++++++++++ .../COPage/classes/class.ilPageObject.php | 7 ++++--- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/Modules/Portfolio/classes/class.ilObjPortfolioBaseGUI.php b/Modules/Portfolio/classes/class.ilObjPortfolioBaseGUI.php index 3c8628d03403..65d751bbc7f9 100644 --- a/Modules/Portfolio/classes/class.ilObjPortfolioBaseGUI.php +++ b/Modules/Portfolio/classes/class.ilObjPortfolioBaseGUI.php @@ -487,7 +487,7 @@ public function savePage(): void $layout_id = $form->getInput("tmpl"); if ($layout_id) { $layout_obj = new ilPageLayout($layout_id); - $page->setXMLContent($layout_obj->getXMLContent()); + $page->setXMLContent($layout_obj->copyXmlContent(false)); } $page->create(); diff --git a/Services/COPage/Layout/classes/class.ilPageLayout.php b/Services/COPage/Layout/classes/class.ilPageLayout.php index f5b084ef20dd..e6f8ace86a68 100644 --- a/Services/COPage/Layout/classes/class.ilPageLayout.php +++ b/Services/COPage/Layout/classes/class.ilPageLayout.php @@ -207,6 +207,12 @@ public function getXMLContent(): string return $layout_page->getXMLContent(); } + public function copyXmlContent(bool $self_ass = true): string + { + $layout_page = new ilPageLayoutPage($this->layout_id); + return $layout_page->copyXmlContent(true, 0, 0, $self_ass); + } + public function getPreview(): string { return $this->generatePreview(); diff --git a/Services/COPage/classes/class.ilPCPlaceHolder.php b/Services/COPage/classes/class.ilPCPlaceHolder.php index e7d5d36f3dd3..b2ff26823e85 100644 --- a/Services/COPage/classes/class.ilPCPlaceHolder.php +++ b/Services/COPage/classes/class.ilPCPlaceHolder.php @@ -166,4 +166,25 @@ public function getCssFiles(string $a_mode): array { return [ilObjStyleSheet::getPlaceHolderStylePath()]; } + + public static function handleCopiedContent( + DOMDocument $a_domdoc, + bool $a_self_ass = true, + bool $a_clone_mobs = false, + int $new_parent_id = 0, + int $obj_copy_id = 0 + ): void { + // remove question placholders + if (!$a_self_ass) { + // Get question IDs + $path = "//PlaceHolder[@ContentClass = 'Question']"; + $xpath = new DOMXPath($a_domdoc); + $nodes = $xpath->query($path); + + foreach ($nodes as $node) { + $parent = $node->parentNode; + $parent->parentNode->removeChild($parent); + } + } + } } diff --git a/Services/COPage/classes/class.ilPageObject.php b/Services/COPage/classes/class.ilPageObject.php index af7a417fe973..f0bae0fcec7b 100755 --- a/Services/COPage/classes/class.ilPageObject.php +++ b/Services/COPage/classes/class.ilPageObject.php @@ -903,7 +903,8 @@ public function getXMLContent(bool $a_incl_head = false): string public function copyXmlContent( bool $a_clone_mobs = false, int $a_new_parent_id = 0, - int $obj_copy_id = 0 + int $obj_copy_id = 0, + bool $self_ass = true ): string { $xml = $this->getXMLContent(); $temp_dom = domxml_open_mem( @@ -912,7 +913,7 @@ public function copyXmlContent( $error ); if (empty($error)) { - $this->handleCopiedContent($temp_dom, true, $a_clone_mobs, $a_new_parent_id, $obj_copy_id); + $this->handleCopiedContent($temp_dom, $self_ass, $a_clone_mobs, $a_new_parent_id, $obj_copy_id); } $xml = $temp_dom->dump_mem(0, $this->encoding); $xml = preg_replace('/<\?xml[^>]*>/i', "", $xml); @@ -4276,7 +4277,7 @@ public function compareVersion( ); } - protected function preparePageForCompare(ilPageObject $page) : void + protected function preparePageForCompare(ilPageObject $page): void { } From d588186399792ecf97b5186575ef7060ff598ddd Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 9 Nov 2023 12:54:04 +0100 Subject: [PATCH 089/497] Search: offer title and description separately in advanced search (36686, 36687) --- .../Container/classes/class.ilContainer.php | 6 ++- .../Like/class.ilLikeAdvancedSearch.php | 49 +++++++++---------- .../Search/classes/class.ilAdvancedSearch.php | 37 +++++++++++--- 3 files changed, 57 insertions(+), 35 deletions(-) diff --git a/Services/Container/classes/class.ilContainer.php b/Services/Container/classes/class.ilContainer.php index 71627bbf0ea3..665fd49da7dd 100755 --- a/Services/Container/classes/class.ilContainer.php +++ b/Services/Container/classes/class.ilContainer.php @@ -1115,9 +1115,13 @@ protected function applyContainerUserFilter( //$meta_search->setFilter($this->filter); // object types ['lm', ...] switch ($field_id) { case ilContainerFilterField::STD_FIELD_TITLE_DESCRIPTION: + $meta_search->setMode('title_description'); + break; case ilContainerFilterField::STD_FIELD_DESCRIPTION: + $meta_search->setMode('description'); + break; case ilContainerFilterField::STD_FIELD_TITLE: - $meta_search->setMode('title_description'); + $meta_search->setMode('title'); break; case ilContainerFilterField::STD_FIELD_KEYWORD: $meta_search->setMode('keyword_all'); diff --git a/Services/Search/classes/Like/class.ilLikeAdvancedSearch.php b/Services/Search/classes/Like/class.ilLikeAdvancedSearch.php index 8dbe9af6383c..153a8f600851 100644 --- a/Services/Search/classes/Like/class.ilLikeAdvancedSearch.php +++ b/Services/Search/classes/Like/class.ilLikeAdvancedSearch.php @@ -1,27 +1,22 @@ db->concat( - array( - array('title','text'), - array('description','text')) - ); + $concat_array = []; + foreach ($fields as $field) { + $concat_array[] = [$field, 'text']; + } + $concat = $this->db->concat($concat_array); $where = " WHERE ("; diff --git a/Services/Search/classes/class.ilAdvancedSearch.php b/Services/Search/classes/class.ilAdvancedSearch.php index c9abbc1fc94a..d247fecff8e2 100644 --- a/Services/Search/classes/class.ilAdvancedSearch.php +++ b/Services/Search/classes/class.ilAdvancedSearch.php @@ -1,4 +1,4 @@ -getMode()) { case 'requirement': @@ -96,6 +97,12 @@ public function performSearch() : ?ilSearchResult case 'title_description': return $this->__searchTitleDescription(); + case 'title': + return $this->__searchTitle(); + + case 'description': + return $this->__searchDescription(); + case 'language': return $this->__searchLanguage(); @@ -106,10 +113,26 @@ public function performSearch() : ?ilSearchResult public function &__searchTitleDescription(): ilSearchResult { - $this->setFields(array('title','description')); + $this->searchObjectProperties('title', 'description'); + return $this->search_result; + } + + public function __searchTitle(): ilSearchResult + { + return $this->searchObjectProperties('title'); + } + + public function __searchDescription(): ilSearchResult + { + return $this->searchObjectProperties('description'); + } + + protected function searchObjectProperties(string ...$fields): ilSearchResult + { + $this->setFields($fields); $and = ("AND type " . $this->__getInStatement($this->getFilter())); - $where = $this->__createTitleDescriptionWhereCondition(); + $where = $this->__createObjectPropertiesWhereCondition(...$fields); $locate = $this->__createLocateString(); $query = "SELECT obj_id,type " . @@ -135,7 +158,7 @@ public function __searchGeneral(): ?ilSearchResult global $DIC; $ilDB = $DIC->database(); - + if ( !($this->options['lom_coverage'] ?? null) and !($this->options['lom_structure'] ?? null) @@ -449,7 +472,7 @@ public function __searchLifecycle(): ilSearchResult $where = "WHERE 1 = 1 "; } $and = ("AND obj_type " . $this->__getInStatement($this->getFilter())); - + if ($this->options['lom_status'] ?? null) { $and .= (" AND lifecycle_status = " . $this->db->quote($this->options['lom_status'], 'text') . ""); } From c7cb2aa5728671aa93156ecfce838da67eb21e7f Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Thu, 9 Nov 2023 15:25:29 +0100 Subject: [PATCH 090/497] 34302: Podcast View does not Update Learning Progress --- Services/Tracking/classes/class.ilTrQuery.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/Tracking/classes/class.ilTrQuery.php b/Services/Tracking/classes/class.ilTrQuery.php index 3a02441ac480..dbc2c6982756 100644 --- a/Services/Tracking/classes/class.ilTrQuery.php +++ b/Services/Tracking/classes/class.ilTrQuery.php @@ -251,11 +251,11 @@ public static function getSubItemsStatusForUser( } if (in_array($a_user_id, ($status_info["completed"][$item_id] ?? []))) { - $status = ilLPStatus::LP_STATUS_COMPLETED; + $status = ilLPStatus::LP_STATUS_COMPLETED_NUM; } elseif (in_array($a_user_id, ($status_info["in_progress"][$item_id] ?? []))) { - $status = ilLPStatus::LP_STATUS_IN_PROGRESS; + $status = ilLPStatus::LP_STATUS_IN_PROGRESS_NUM; } else { - $status = ilLPStatus::LP_STATUS_NOT_ATTEMPTED; + $status = ilLPStatus::LP_STATUS_NOT_ATTEMPTED_NUM; } $items[$item_id] = array( From 67c404414cbea89d7896f28ac9645378a81e622d Mon Sep 17 00:00:00 2001 From: Thomas Famula Date: Thu, 9 Nov 2023 16:58:46 +0100 Subject: [PATCH 091/497] Fix 37967: Competence Profiles should be deleted when a Competence Tree is deleted --- Services/Skill/Tree/class.ilObjSkillTreeGUI.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Services/Skill/Tree/class.ilObjSkillTreeGUI.php b/Services/Skill/Tree/class.ilObjSkillTreeGUI.php index 43160a61b347..8bd78321a34d 100644 --- a/Services/Skill/Tree/class.ilObjSkillTreeGUI.php +++ b/Services/Skill/Tree/class.ilObjSkillTreeGUI.php @@ -21,6 +21,7 @@ use ILIAS\Skill\Service; use ILIAS\Skill\Tree; use ILIAS\Skill\Access; +use ILIAS\Skill\Profile; use ILIAS\UI\Component\Input\Container\Form; use ILIAS\GlobalScreen\ScreenContext; @@ -42,6 +43,8 @@ class ilObjSkillTreeGUI extends ilObjectGUI protected Tree\SkillTreeNodeManager $skill_tree_node_manager; protected Access\SkillTreeAccess $skill_tree_access_manager; protected Access\SkillManagementAccess $skill_management_access_manager; + protected Profile\SkillProfileManager $profile_manager; + protected Profile\SkillProfileCompletionManager $profile_completion_manager; protected ilSkillTreeRepository $skill_tree_repo; protected Tree\SkillTreeFactory $skill_tree_factory; protected UIServices $ui; @@ -124,6 +127,8 @@ public function init(Service\SkillInternalManagerService $skill_manager): void $this->skill_management_access_manager = $skill_manager->getManagementAccessManager( $this->skill_tree_manager->getSkillManagementRefId() ); + $this->profile_manager = $skill_manager->getProfileManager(); + $this->profile_completion_manager = $skill_manager->getProfileCompletionManager(); } public function executeCommand(): void @@ -733,6 +738,14 @@ public function confirmedDeleteTrees(): void $tree = $this->skill_tree_repo->getTreeForNodeId($id); $tree_obj = $this->skill_tree_manager->getTree($tree->getTreeId()); $node_data = $tree->getNodeData($id); + + // delete competence profiles of tree + $tree_profiles = $this->profile_manager->getProfilesForSkillTree($tree->getTreeId()); + foreach ($tree_profiles as $profile) { + $this->profile_manager->delete((int) $profile["id"]); + $this->profile_completion_manager->deleteEntriesForProfile((int) $profile["id"]); + } + if (is_object($obj)) { $obj->delete(); } From 5f9a1ba3e4934793be40115008ed403d87421599 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Thu, 9 Nov 2023 17:07:38 +0100 Subject: [PATCH 092/497] 31260: Video not shown correctly when using option constrain proportions --- .../classes/class.ilObjMediaObjectGUI.php | 17 +++++++- .../classes/class.ilWidthHeightInputGUI.php | 39 +++++++++++++------ .../default/tpl.prop_width_height.html | 6 ++- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/Services/MediaObjects/classes/class.ilObjMediaObjectGUI.php b/Services/MediaObjects/classes/class.ilObjMediaObjectGUI.php index e81630540457..83d2a9f7d618 100755 --- a/Services/MediaObjects/classes/class.ilObjMediaObjectGUI.php +++ b/Services/MediaObjects/classes/class.ilObjMediaObjectGUI.php @@ -335,7 +335,11 @@ public function initForm(string $a_mode = "create"): void // width height $width_height = new ilWidthHeightInputGUI($lng->txt("cont_width") . " / " . $lng->txt("cont_height"), "standard_width_height"); - $width_height->setConstrainProportions(true); + if ($a_mode == "edit" && is_int(strpos($std_item->getFormat(), "image")) + && $std_item->getLocationType() == "LocalFile") { + $width_height->setSupportConstraintsProps(true); + $width_height->setConstrainProportions(true); + } $op2->addSubItem($width_height); // resize image @@ -437,11 +441,17 @@ public function initForm(string $a_mode = "create"): void } // fullscreen size + $full_support_constraint_props = false; $radio_size = new ilRadioGroupInputGUI($lng->txt("size"), "full_size"); if ($a_mode == "edit") { $add_str = ""; if ($this->object->hasFullscreenItem() && ($orig_size = $full_item->getOriginalSize())) { $add_str = " (" . ($orig_size["width"] ?? "") . " x " . ($orig_size["height"] ?? "") . ")"; + + if (is_int(strpos($full_item->getFormat(), "image")) + && $full_item->getLocationType() == "LocalFile") { + $full_support_constraint_props = true; + } } $op1 = new ilRadioOption($lng->txt("cont_resource_size") . $add_str, "original"); $op1->setInfo($lng->txt("cont_resource_size_info")); @@ -456,7 +466,10 @@ public function initForm(string $a_mode = "create"): void // width/height $width_height = new ilWidthHeightInputGUI($lng->txt("cont_width") . " / " . $lng->txt("cont_height"), "full_width_height"); - $width_height->setConstrainProportions(true); + if ($full_support_constraint_props) { + $width_height->setSupportConstraintsProps(true); + $width_height->setConstrainProportions(true); + } $op2->addSubItem($width_height); // resize image diff --git a/Services/MediaObjects/classes/class.ilWidthHeightInputGUI.php b/Services/MediaObjects/classes/class.ilWidthHeightInputGUI.php index f955fd592dc1..5f23f4459368 100755 --- a/Services/MediaObjects/classes/class.ilWidthHeightInputGUI.php +++ b/Services/MediaObjects/classes/class.ilWidthHeightInputGUI.php @@ -23,6 +23,7 @@ */ class ilWidthHeightInputGUI extends ilFormPropertyGUI { + protected $support_constraint_props = false; protected bool $constrainproportions; protected ?int $height = null; protected ?int $width = null; @@ -43,6 +44,16 @@ public function __construct( $this->main_tpl = $DIC->ui()->mainTemplate(); } + public function setSupportConstraintsProps(bool $a_val): void + { + $this->support_constraint_props = $a_val; + } + + public function getSupportConstraintsProps(): bool + { + return $this->support_constraint_props; + } + public function setWidth(?int $a_width): void { $this->width = $a_width; @@ -99,19 +110,28 @@ public function insert(ilTemplate $a_tpl): void $tpl = new ilTemplate("tpl.prop_width_height.html", true, true, "Services/MediaObjects"); - $tpl->setVariable("VAL_WIDTH", strtolower(trim($this->getWidth()))); - $tpl->setVariable("VAL_HEIGHT", strtolower(trim($this->getHeight()))); - if ($this->getConstrainProportions()) { - $tpl->setVariable("CHECKED", 'checked="checked"'); - } - - $tpl->setVariable("POST_VAR", $this->getPostVar()); - $tpl->setVariable("TXT_CONSTR_PROP", $lng->txt("cont_constrain_proportions")); $wh_ratio = 0; if ((int) $this->getHeight() > 0) { $wh_ratio = (int) $this->getWidth() / (int) $this->getHeight(); } $ratio = str_replace(",", ".", round($wh_ratio, 6)); + if ($this->getSupportConstraintsProps() && $wh_ratio > 0) { + $tpl->setCurrentBlock("cs_prop"); + $tpl->setVariable("TXT_CONSTR_PROP", $lng->txt("cont_constrain_proportions")); + $tpl->setVariable("CS_POST_VAR", $this->getPostVar()); + if ($this->getConstrainProportions()) { + $tpl->setVariable("CHECKED", 'checked="checked"'); + } + $tpl->parseCurrentBlock(); + $this->main_tpl->addOnLoadCode( + 'prop_width_height["prop_' . $this->getPostVar() . '"] = ' . $ratio . ';' + ); + } + + $tpl->setVariable("VAL_WIDTH", strtolower(trim($this->getWidth()))); + $tpl->setVariable("VAL_HEIGHT", strtolower(trim($this->getHeight()))); + + $tpl->setVariable("POST_VAR", $this->getPostVar()); $a_tpl->setCurrentBlock("prop_generic"); $a_tpl->setVariable("PROP_GENERIC", $tpl->get()); @@ -119,9 +139,6 @@ public function insert(ilTemplate $a_tpl): void $this->main_tpl ->addJavaScript("./Services/MediaObjects/js/ServiceMediaObjectPropWidthHeight.js"); - $this->main_tpl->addOnLoadCode( - 'prop_width_height["prop_'.$this->getPostVar().'"] = '.$ratio.';' - ); } public function setValueByArray(array $a_values): void diff --git a/Services/MediaObjects/templates/default/tpl.prop_width_height.html b/Services/MediaObjects/templates/default/tpl.prop_width_height.html index b97ea0c17af1..11592f4d7be8 100644 --- a/Services/MediaObjects/templates/default/tpl.prop_width_height.html +++ b/Services/MediaObjects/templates/default/tpl.prop_width_height.html @@ -3,5 +3,7 @@
-{TXT_CONSTR_PROP} -
\ No newline at end of file + +{TXT_CONSTR_PROP} + + \ No newline at end of file From f66490da2f38985f699bd4373bb614cc66a0c5ab Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Thu, 9 Nov 2023 20:07:32 +0100 Subject: [PATCH 093/497] =?UTF-8?q?38690:=20Wiki-Seite=20nicht=20zu=20?= =?UTF-8?q?=C3=B6ffnen=20=C2=BB=20Argument=201=20passed=20to=20ilWikiPage:?= =?UTF-8?q?:setBlocked()=20must=20=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Wiki/classes/class.ilWikiPage.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/Wiki/classes/class.ilWikiPage.php b/Modules/Wiki/classes/class.ilWikiPage.php index 755cfc90c029..9b90864c5abd 100755 --- a/Modules/Wiki/classes/class.ilWikiPage.php +++ b/Modules/Wiki/classes/class.ilWikiPage.php @@ -236,10 +236,10 @@ public function read( $rec = $ilDB->fetchAssoc($set); $this->setTitle($rec["title"]); - $this->setWikiId($rec["wiki_id"]); - $this->setBlocked($rec["blocked"]); - $this->setRating($rec["rating"]); - $this->hideAdvancedMetadata($rec["hide_adv_md"]); + $this->setWikiId((int) $rec["wiki_id"]); + $this->setBlocked((bool) $rec["blocked"]); + $this->setRating((bool) $rec["rating"]); + $this->hideAdvancedMetadata((bool) $rec["hide_adv_md"]); // get co page if (!$a_omit_page_read) { From e5ba4c3b0ac64ab768dc41adf49fd2c7ac0ff1be Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Thu, 9 Nov 2023 21:11:48 +0100 Subject: [PATCH 094/497] 28868: Actions-drop-down gets wider --- Services/JavaScript/js/Basic.js | 3 +-- .../AdvancedSelectionList/js/AdvancedSelectionList.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Services/JavaScript/js/Basic.js b/Services/JavaScript/js/Basic.js index c4691e35e3b8..14a36bd0c71d 100644 --- a/Services/JavaScript/js/Basic.js +++ b/Services/JavaScript/js/Basic.js @@ -224,13 +224,12 @@ il.Util = { fixPosition: function (el) { var r = il.Util.getRegion(el), vp = il.Util.getViewportRegion(); - // we only fix absolute positioned items if ($(el).css("position") != "absolute") { return; } - if (vp.right - 20 < r.right) { + if (vp.right - 15 < r.right) { il.Util.setX(el, r.x - (r.right - vp.right + 20)); } diff --git a/Services/UIComponent/AdvancedSelectionList/js/AdvancedSelectionList.js b/Services/UIComponent/AdvancedSelectionList/js/AdvancedSelectionList.js index 3ae85cb2e550..b17e391c69ce 100755 --- a/Services/UIComponent/AdvancedSelectionList/js/AdvancedSelectionList.js +++ b/Services/UIComponent/AdvancedSelectionList/js/AdvancedSelectionList.js @@ -31,7 +31,7 @@ il.AdvancedSelectionList = // hide all overlays on trigger $("#ilAdvSelListAnchorText_" + id).click(function(e) { if (typeof il.Overlay != "undefined") { - il.Overlay.hideAllOverlays(e, true); + //il.Overlay.hideAllOverlays(e, true); } }); }, From 98a845e28e85314f6766525a1c8e18017bb3950e Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 10 Nov 2023 14:28:39 +0100 Subject: [PATCH 095/497] Membership: fix type error (38697) --- .../Membership/classes/class.ilAttendanceList.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Services/Membership/classes/class.ilAttendanceList.php b/Services/Membership/classes/class.ilAttendanceList.php index 04aa09ce50d4..08a6a59ebce4 100644 --- a/Services/Membership/classes/class.ilAttendanceList.php +++ b/Services/Membership/classes/class.ilAttendanceList.php @@ -1,8 +1,5 @@ @@ -101,7 +100,7 @@ public function __construct( $this->addRole($role_id, $DIC->language()->txt('event_tbl_member'), 'member'); break; - // local + // local default: $this->has_local_role = true; $this->addRole($role_id, $title, 'local'); @@ -603,7 +602,7 @@ public function getHTML(): string $valid_user_ids = array_merge($valid_user_ids, $this->participants->getTutors()); break; - // member/local + // member/local default: if (!$this->has_local_role) { $valid_user_ids = array_merge($valid_user_ids, $members); @@ -641,7 +640,7 @@ public function getHTML(): string if ($item[1]) { switch ($id) { case 'org_units': - $value = ilOrgUnitPathStorage::getTextRepresentationOfUsersOrgUnits($user_id); + $value = ilOrgUnitPathStorage::getTextRepresentationOfUsersOrgUnits((int) $user_id); break; case "name": @@ -650,14 +649,14 @@ public function getHTML(): string $value = $name["lastname"] . ", " . $name["firstname"]; break; } - // no break + // no break case "login": if (!($user_data[$id] ?? false)) { $value = ilObjUser::_lookupLogin((int) $user_id); break; } - // no break + // no break default: $value = (string) ($user_data[$id] ?? ''); break; From ca9e8f1f9d1a7e45ed2cd84daf76c8db07c68e3e Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 10 Nov 2023 15:41:13 +0100 Subject: [PATCH 096/497] 32264: Blog comments by readers aren't properly sent --- Modules/Blog/classes/class.ilObjBlogGUI.php | 16 ++++++++++++---- .../Portfolio/Page/class.ilPortfolioPageGUI.php | 3 ++- .../classes/class.ilObjPortfolioBaseGUI.php | 6 ++++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Modules/Blog/classes/class.ilObjBlogGUI.php b/Modules/Blog/classes/class.ilObjBlogGUI.php index 232624a44eca..480aa1d2a408 100644 --- a/Modules/Blog/classes/class.ilObjBlogGUI.php +++ b/Modules/Blog/classes/class.ilObjBlogGUI.php @@ -29,6 +29,7 @@ */ class ilObjBlogGUI extends ilObject2GUI implements ilDesktopItemHandling { + protected string $rendered_content = ""; protected \ILIAS\Notes\Service $notes; protected \ILIAS\Blog\ReadingTime\BlogSettingsGUI $reading_time_gui; protected \ILIAS\Blog\ReadingTime\ReadingTimeManager $reading_time_manager; @@ -587,6 +588,7 @@ public function executeCommand(): void switch ($next_class) { case 'ilblogpostinggui': + $this->ctrl->saveParameter($this, "user_page"); if (!$this->prtf_embed) { $tpl->loadStandardTemplate(); } @@ -692,7 +694,8 @@ public function executeCommand(): void $this->addHeaderActionForCommand($cmd); $this->filterInactivePostings(); $nav = $this->renderNavigation("gethtml", $cmd); - $this->buildEmbedded($ret, $nav); + // this is important for embedded blog pages! + $this->rendered_content = $this->buildEmbedded($ret, $nav); return; // ilias/editor @@ -854,10 +857,15 @@ public function executeCommand(): void if (!$cmd) { $cmd = "render"; } - $this->$cmd(); + $this->rendered_content = (string) $this->$cmd(); } } + public function getRenderedContent(): string + { + return $this->rendered_content; + } + protected function triggerAssignmentTool(): void { $be = new ilBlogExercise($this->node_id); @@ -2070,9 +2078,9 @@ public function renderToolbarNavigation( $ctrl->setParameterByClass("ilblogpostinggui", "blpg", $this->blpg); - if ($this->prtf_embed) { + /*if ($this->prtf_embed) { $this->ctrl->setParameterByClass("ilobjportfoliogui", "ppage", $this->user_page); - } + }*/ $link = $ctrl->getLinkTargetByClass("ilblogpostinggui", "edit"); $toolbar->addComponent($f->button()->standard($lng->txt("blog_edit_posting"), $link)); } diff --git a/Modules/Portfolio/Page/class.ilPortfolioPageGUI.php b/Modules/Portfolio/Page/class.ilPortfolioPageGUI.php index e950b5ba3537..26f6aef5d17d 100644 --- a/Modules/Portfolio/Page/class.ilPortfolioPageGUI.php +++ b/Modules/Portfolio/Page/class.ilPortfolioPageGUI.php @@ -125,7 +125,8 @@ public function executeCommand(): string $blog_gui = new ilObjBlogGUI($blog_node_id, ilObject2GUI::WORKSPACE_NODE_ID); $blog_gui->disableNotes(!$this->enable_comments); $blog_gui->prtf_embed = true; // disables prepareOutput()/getStandardTemplate() in blog - return (string) $ilCtrl->forwardCommand($blog_gui); + $ilCtrl->forwardCommand($blog_gui); + return $blog_gui->getRenderedContent(); case "ilcalendarmonthgui": $this->ctrl->saveParameter($this, "chuid"); diff --git a/Modules/Portfolio/classes/class.ilObjPortfolioBaseGUI.php b/Modules/Portfolio/classes/class.ilObjPortfolioBaseGUI.php index 65d751bbc7f9..5ed5b4039dc7 100644 --- a/Modules/Portfolio/classes/class.ilObjPortfolioBaseGUI.php +++ b/Modules/Portfolio/classes/class.ilObjPortfolioBaseGUI.php @@ -157,7 +157,6 @@ protected function handlePageCall(string $a_cmd): void $page_gui->setStyleId($this->content_style_domain->getEffectiveStyleId()); $ret = $this->ctrl->forwardCommand($page_gui); - if ($ret != "" && $ret !== true) { // preview (fullscreen) if ($this->page_mode === "preview") { @@ -613,9 +612,12 @@ public function deletePortfolioPages(): void $this->ctrl->redirect($this, "view"); } + /** + * @param string|bool $a_content (may be content from embedded blog) + */ public function preview( bool $a_return = false, - bool $a_content = false, + $a_content = false, bool $a_show_notes = true ): string { $ilSetting = $this->settings; From a0268d91ac4d9f99020f56495c516c057990ecd1 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 10 Nov 2023 15:57:32 +0100 Subject: [PATCH 097/497] 36367: Error after Click in the Bread Crumb Navigation without Read-Access --- Services/Locator/classes/class.ilLocatorGUI.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Services/Locator/classes/class.ilLocatorGUI.php b/Services/Locator/classes/class.ilLocatorGUI.php index 5af73af5380d..7fc0bbf0ed1d 100755 --- a/Services/Locator/classes/class.ilLocatorGUI.php +++ b/Services/Locator/classes/class.ilLocatorGUI.php @@ -144,14 +144,12 @@ public function addRepositoryItems(int $a_ref_id = 0): void $row["title"] = $this->lng->txt("repository"); } - $ilCtrl->setParameterByClass("ilrepositorygui", "ref_id", $row["child"]); $this->addItem( $row["title"], - $ilCtrl->getLinkTargetByClass("ilrepositorygui", ""), + ilLink::_getLink((int) $row["child"]), ilFrameTargetInfo::_getFrame("MainContent"), $row["child"] ); - $ilCtrl->setParameterByClass("ilrepositorygui", "ref_id", $this->ref_id); } } } From da6981fb9522a4aa5d95ed873b8ffb103e6c3eeb Mon Sep 17 00:00:00 2001 From: Thomas Famula Date: Fri, 10 Nov 2023 16:47:15 +0100 Subject: [PATCH 098/497] Fix 35876: different handling of mail-links --- ...lass.ilAccessibilitySupportContactsGUI.php | 107 +++++++----------- 1 file changed, 40 insertions(+), 67 deletions(-) diff --git a/Modules/SystemFolder/classes/class.ilAccessibilitySupportContactsGUI.php b/Modules/SystemFolder/classes/class.ilAccessibilitySupportContactsGUI.php index 9c1531c83508..332fbc67eb34 100644 --- a/Modules/SystemFolder/classes/class.ilAccessibilitySupportContactsGUI.php +++ b/Modules/SystemFolder/classes/class.ilAccessibilitySupportContactsGUI.php @@ -1,6 +1,20 @@ ctrl(); - $tpl = $DIC["tpl"]; $lng = $DIC->language(); $http = $DIC->http(); $this->ctrl = $ctrl; - $this->tpl = $tpl; $this->lng = $lng; $this->http = $http; } - - /** - * Execute command - */ - public function executeCommand() + public function executeCommand(): void { $cmd = $this->ctrl->getCmd("sendIssueMail"); if (in_array($cmd, array("sendIssueMail"))) { @@ -59,31 +48,27 @@ public function executeCommand() } } - public function sendIssueMail(): void { - $back_url = $this->http->request()->getServerParams()['HTTP_REFERER']; + $back_url = $this->http->request()->getServerParams()["HTTP_REFERER"]; $this->ctrl->redirectToURL( ilMailFormCall::getRedirectTarget( $back_url, - '', + "", [], [ - 'type' => 'new', - 'rcp_to' => $this->getContactLogins(), - 'sig' => $this->getAccessibilityIssueMailMessage($back_url) + "type" => "new", + "rcp_to" => $this->getContactLogins(), + "sig" => $this->getAccessibilityIssueMailMessage($back_url) ] ) ); } - /** - * @return string - */ private function getAccessibilityIssueMailMessage(string $back_url): string { $sig = chr(13) . chr(10) . chr(13) . chr(10) . chr(13) . chr(10); - $sig .= $this->lng->txt('report_accessibility_link'); + $sig .= $this->lng->txt("report_accessibility_link"); $sig .= chr(13) . chr(10); $sig .= $back_url; $sig = rawurlencode(base64_encode($sig)); @@ -93,8 +78,6 @@ private function getAccessibilityIssueMailMessage(string $back_url): string /** * Get accessibility support contacts as comma separated string - * - * @return string */ private function getContactLogins(): string { @@ -104,15 +87,10 @@ private function getContactLogins(): string $logins[] = ilObjUser::_lookupLogin($contact_id); } - return implode(',', $logins); + return implode(",", $logins); } - /** - * Get footer link - * - * @return string footer link - */ - public static function getFooterLink() + public static function getFooterLink(): string { global $DIC; @@ -120,35 +98,30 @@ public static function getFooterLink() $user = $DIC->user(); $http = $DIC->http(); $lng = $DIC->language(); + $rbac_system = $DIC->rbac()->system(); - - $users = ilAccessibilitySupportContacts::getValidSupportContactIds(); - if (count($users) > 0) { - if (!$user->getId() || $user->getId() == ANONYMOUS_USER_ID) { + $contacts = ilAccessibilitySupportContacts::getValidSupportContactIds(); + if (count($contacts) > 0) { + if ($rbac_system->checkAccess("internal_mail", ilMailGlobalServices::getMailObjectRefId())) { + return $ctrl->getLinkTargetByClass("ilaccessibilitysupportcontactsgui", ""); + } else { $mails = ilLegacyFormElementsUtil::prepareFormOutput( ilAccessibilitySupportContacts::getMailsToAddress() ); $request_scheme = - isset($http->request()->getServerParams()['HTTPS']) - && $http->request()->getServerParams()['HTTPS'] !== 'off' - ? 'https' : 'http'; - $url = $request_scheme . '://' - . $http->request()->getServerParams()['HTTP_HOST'] - . $http->request()->getServerParams()['REQUEST_URI']; + isset($http->request()->getServerParams()["HTTPS"]) + && $http->request()->getServerParams()["HTTPS"] !== "off" + ? "https" : "http"; + $url = $request_scheme . "://" + . $http->request()->getServerParams()["HTTP_HOST"] + . $http->request()->getServerParams()["REQUEST_URI"]; return "mailto:" . $mails . "?body=%0D%0A%0D%0A" . $lng->txt("report_accessibility_link_mailto") . "%0A" . rawurlencode($url); - } else { - return $ctrl->getLinkTargetByClass("ilaccessibilitysupportcontactsgui", ""); } } return ""; } - /** - * Get footer text - * - * @return string footer text - */ - public static function getFooterText() + public static function getFooterText(): string { global $DIC; From 7fbe542eba00cc5cf3f2842edc7cd831eb0166b3 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 10 Nov 2023 16:53:19 +0100 Subject: [PATCH 099/497] Course: skip unmapped tests in dependencies of LOK (38692) --- .../classes/Objectives/class.ilCourseObjectiveQuestion.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Modules/Course/classes/Objectives/class.ilCourseObjectiveQuestion.php b/Modules/Course/classes/Objectives/class.ilCourseObjectiveQuestion.php index d51729992970..43abc8323772 100644 --- a/Modules/Course/classes/Objectives/class.ilCourseObjectiveQuestion.php +++ b/Modules/Course/classes/Objectives/class.ilCourseObjectiveQuestion.php @@ -1,6 +1,5 @@ @@ -127,6 +128,9 @@ public function cloneDependencies(int $a_new_objective, int $a_copy_id): void // Copy tests foreach ($this->getTests() as $test) { + if (!isset($mappings["$test[ref_id]"])) { + continue; + } $new_test_id = $mappings["$test[ref_id]"]; $query = "UPDATE crs_objective_tst " . From 47b316788a8a5fe144186286daabd14d0b73bbe7 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 10 Nov 2023 17:34:12 +0100 Subject: [PATCH 100/497] Course: fix array access when cloning conditions (38653) --- Services/Conditions/classes/class.ilConditionHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Conditions/classes/class.ilConditionHandler.php b/Services/Conditions/classes/class.ilConditionHandler.php index 0107a7877df9..e925b7a33073 100755 --- a/Services/Conditions/classes/class.ilConditionHandler.php +++ b/Services/Conditions/classes/class.ilConditionHandler.php @@ -1114,7 +1114,7 @@ public static function cloneDependencies(int $a_src_ref_id, int $a_target_ref_id ilObject::_lookupObjId($a_src_ref_id) ); foreach ($conditions as $con) { - if ($mappings[$con['trigger_ref_id']]) { + if ($mappings[$con['trigger_ref_id']] ?? false) { $newCondition = new ilConditionHandler(); $target_obj = ilObject::_lookupObjId($a_target_ref_id); From 6ef94e62ec8df3fdadf306db163d3d6f29911717 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 10 Nov 2023 17:56:12 +0100 Subject: [PATCH 101/497] 32261: Load Resource Action Lists Asynchronously affects HTML-download --- Modules/Blog/classes/class.ilObjBlogGUI.php | 5 +++++ Modules/Blog/classes/class.ilObjBlogListGUI.php | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/Modules/Blog/classes/class.ilObjBlogGUI.php b/Modules/Blog/classes/class.ilObjBlogGUI.php index 480aa1d2a408..a431c53680a8 100644 --- a/Modules/Blog/classes/class.ilObjBlogGUI.php +++ b/Modules/Blog/classes/class.ilObjBlogGUI.php @@ -3007,4 +3007,9 @@ public function printPostings(): void $print_view = $this->getPrintView(); $print_view->sendPrintView(); } + + protected function forwardExport() : void + { + $this->ctrl->redirectByClass(ilExportGUI::class); + } } diff --git a/Modules/Blog/classes/class.ilObjBlogListGUI.php b/Modules/Blog/classes/class.ilObjBlogListGUI.php index 62ec6c5f00dc..c13c92811a0a 100644 --- a/Modules/Blog/classes/class.ilObjBlogListGUI.php +++ b/Modules/Blog/classes/class.ilObjBlogListGUI.php @@ -69,6 +69,13 @@ public function insertCommand( ): void { $ctrl = $this->ctrl; + if ($cmd === "export" + && ilObjBlogAccess::isCommentsExportPossible($this->obj_id) + && (bool) $this->settings->get('item_cmd_asynch')) { + $href = $this->getCommandLink("forwardExport"); + $cmd = "forwardExport"; + $onclick = ""; + } if ($cmd !== "export" || !ilObjBlogAccess::isCommentsExportPossible($this->obj_id)) { parent::insertCommand($href, $text, $frame, $img, $cmd, $onclick); return; From 3de15dfc9daa07da4d9bd04ae6b6c4e202dda979 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 10 Nov 2023 18:10:55 +0100 Subject: [PATCH 102/497] type fix --- Modules/Portfolio/Template/class.ilObjPortfolioTemplateGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Portfolio/Template/class.ilObjPortfolioTemplateGUI.php b/Modules/Portfolio/Template/class.ilObjPortfolioTemplateGUI.php index 84c3a807cb09..d4b30eb69ffd 100644 --- a/Modules/Portfolio/Template/class.ilObjPortfolioTemplateGUI.php +++ b/Modules/Portfolio/Template/class.ilObjPortfolioTemplateGUI.php @@ -510,7 +510,7 @@ protected function saveBlog(): void public function preview( bool $a_return = false, - bool $a_content = false, + $a_content = false, bool $a_show_notes = true ): string { if (!$this->checkPermissionBool("write") && From 5aee34e97389869350b82df7b02de1efbe720a37 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 10 Nov 2023 18:40:37 +0100 Subject: [PATCH 103/497] Course: highlight current object in adopt content tree (36702) --- Services/Object/classes/class.ilObjectCopyGUI.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Services/Object/classes/class.ilObjectCopyGUI.php b/Services/Object/classes/class.ilObjectCopyGUI.php index 966c924781ab..f3a45f49b8f1 100644 --- a/Services/Object/classes/class.ilObjectCopyGUI.php +++ b/Services/Object/classes/class.ilObjectCopyGUI.php @@ -382,6 +382,7 @@ public function showSourceSelectionTree(): void $exp->setTargetGet('ref_id'); $exp->setPostVar('source'); $exp->setCheckedItems($this->getSources()); + $exp->highlightNode((string) $this->getFirstTarget()); // Filter to container foreach (['cat', 'root', 'fold'] as $container) { From 89817a7eb2f5c3f0e3288b05f91d7a5bfa9cfbfd Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 10 Nov 2023 19:10:44 +0100 Subject: [PATCH 104/497] 29671: Competence thresholds are lost when copying a survey --- .../Skills/class.ilSurveySkillThresholds.php | 18 ++++++++++++++++++ Modules/Survey/classes/class.ilObjSurvey.php | 3 +++ 2 files changed, 21 insertions(+) diff --git a/Modules/Survey/Skills/class.ilSurveySkillThresholds.php b/Modules/Survey/Skills/class.ilSurveySkillThresholds.php index a24d66934847..5623ae899ede 100644 --- a/Modules/Survey/Skills/class.ilSurveySkillThresholds.php +++ b/Modules/Survey/Skills/class.ilSurveySkillThresholds.php @@ -75,4 +75,22 @@ public function writeThreshold( array("threshold" => array("integer", $a_threshold)) ); } + + public function cloneTo(ilObjSurvey $target_survey, array $mapping) : void + { + $target_thresholds = new self($target_survey); + $set = $this->db->queryF("SELECT * FROM svy_skill_threshold " . + " WHERE survey_id = %s ", + ["integer"], + [$this->survey->getId()] + ); + while ($rec = $this->db->fetchAssoc($set)) { + $target_thresholds->writeThreshold( + (int) $rec["base_skill_id"], + (int) $rec["tref_id"], + (int) $rec["level_id"], + (int) $rec["threshold"] + ); + } + } } diff --git a/Modules/Survey/classes/class.ilObjSurvey.php b/Modules/Survey/classes/class.ilObjSurvey.php index aee8f6dc26bf..69b33a5b046c 100755 --- a/Modules/Survey/classes/class.ilObjSurvey.php +++ b/Modules/Survey/classes/class.ilObjSurvey.php @@ -3346,6 +3346,9 @@ public function cloneObject(int $target_id, int $copy_id = 0, bool $omit_tree = $tgt_skills->addQuestionSkillAssignment($tgt_qst_id, $qst_skill["base_skill_id"], $qst_skill["tref_id"]); } } + + $thresholds = new ilSurveySkillThresholds($this); + $thresholds->cloneTo($newObj, $mapping); } // clone the questionblocks From a5480c7b2700776db029d34dbda53e7053e00000 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 10 Nov 2023 19:51:21 +0100 Subject: [PATCH 105/497] 31937: CoPage/ExportImport: XML export/import issue with multiple ContentPage references in a container --- Services/COPage/classes/class.ilCOPageImporter.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Services/COPage/classes/class.ilCOPageImporter.php b/Services/COPage/classes/class.ilCOPageImporter.php index ba63b11afc79..43a52d215399 100644 --- a/Services/COPage/classes/class.ilCOPageImporter.php +++ b/Services/COPage/classes/class.ilCOPageImporter.php @@ -102,6 +102,9 @@ public function importXmlRepresentation( $page->updateFromXML(); $this->extractPluginProperties($page); } else { + if (ilPageObject::_exists($id[0], (int) $id[1], "-", true)) { + return; + } $new_page = ilPageObjectFactory::getInstance($id[0]); $new_page->setImportMode(true); $new_page->setId($id[1]); From 379960117f00bcd46c6d3db98c1c54280ff1279a Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 12 Nov 2023 15:53:38 +0100 Subject: [PATCH 106/497] 38590: Pre9 Failed test: Kriterien bearbeiten/erstellen --- Modules/Exercise/PeerReview/Criteria/class.ilExcCriteriaGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Exercise/PeerReview/Criteria/class.ilExcCriteriaGUI.php b/Modules/Exercise/PeerReview/Criteria/class.ilExcCriteriaGUI.php index 9c3a8b3d3b61..62532eed74a7 100644 --- a/Modules/Exercise/PeerReview/Criteria/class.ilExcCriteriaGUI.php +++ b/Modules/Exercise/PeerReview/Criteria/class.ilExcCriteriaGUI.php @@ -238,7 +238,7 @@ protected function importForm( $lng = $this->lng; $is_edit = (bool) $a_crit_obj->getId(); - + $ilCtrl->setParameter($this, "type", $this->request->getCriteriaType()); $form = $this->initForm($a_crit_obj); if ($form->checkInput()) { $a_crit_obj->setTitle($form->getInput("title")); From 66433f7a88f2bb2af4525df6f01a80be4cf7eda0 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 13 Nov 2023 07:54:45 +0100 Subject: [PATCH 107/497] Object: Fix Time Period Suggestions See: https://mantis.ilias.de/view.php?id=38657 --- .../Chatroom/classes/class.ilObjChatroom.php | 6 - .../Export/class.ilContainerXmlParser.php | 5 - .../classes/class.ilObjectActivation.php | 128 ++++-------------- 3 files changed, 28 insertions(+), 111 deletions(-) diff --git a/Modules/Chatroom/classes/class.ilObjChatroom.php b/Modules/Chatroom/classes/class.ilObjChatroom.php index 3b8133b0d599..d1405120538e 100644 --- a/Modules/Chatroom/classes/class.ilObjChatroom.php +++ b/Modules/Chatroom/classes/class.ilObjChatroom.php @@ -90,12 +90,6 @@ public function update(): bool $activation->setTimingStart($this->getAccessBegin()); $activation->setTimingEnd($this->getAccessEnd()); $activation->toggleVisible((bool) $this->getAccessVisibility()); - $activation->setSuggestionStart(0); - $activation->setSuggestionStartRelative(0); - $activation->setSuggestionEnd(0); - $activation->setSuggestionEndRelative(0); - $activation->setEarliestStart(0); - $activation->setEarliestStartRelative(0); $activation->toggleChangeable(true); $activation->update($this->ref_id); } diff --git a/Services/Container/Export/class.ilContainerXmlParser.php b/Services/Container/Export/class.ilContainerXmlParser.php index 95bb0222fec8..e3fda2f5ce7a 100644 --- a/Services/Container/Export/class.ilContainerXmlParser.php +++ b/Services/Container/Export/class.ilContainerXmlParser.php @@ -160,11 +160,6 @@ protected function parseTiming( $crs_item->setSuggestionEnd($dt->get(IL_CAL_UNIX)); break; - case 'EarliestStart': - $dt = new ilDateTime((string) $sub, IL_CAL_DATETIME, ilTimeZone::UTC); - $crs_item->setEarliestStart($dt->get(IL_CAL_UNIX)); - break; - case 'LatestEnd': break; } diff --git a/Services/Object/classes/class.ilObjectActivation.php b/Services/Object/classes/class.ilObjectActivation.php index b3af34924e47..d5c21746021d 100644 --- a/Services/Object/classes/class.ilObjectActivation.php +++ b/Services/Object/classes/class.ilObjectActivation.php @@ -42,15 +42,13 @@ class ilObjectActivation protected int $timing_type = 0; protected ?int $timing_start = null; protected ?int $timing_end = null; - protected int $suggestion_start = 0; - protected int $suggestion_end = 0; - protected int $visible = 0; + protected ?int $suggestion_start = null; + protected ?int $suggestion_end = null; + protected bool $visible = false; protected int $changeable = 0; - protected int $earliest_start_rel = 0; - protected int $earliest_start = 0; - protected int $suggestion_start_rel = 0; - protected int $suggestion_end_rel = 0; + protected ?int $suggestion_start_rel = null; + protected ?int $suggestion_end_rel = null; public function __construct() { @@ -91,75 +89,46 @@ public function getTimingEnd(): ?int return $this->timing_end; } - public function setSuggestionStart(int $start): void + public function setSuggestionStart(?int $start): void { + if ($start === 0) { + $start = null; + } $this->suggestion_start = $start; } - public function getSuggestionStart(): int - { - return $this->suggestion_start; - } - - public function getSuggestionStartRelative(): int - { - return $this->suggestion_start_rel; - } - - public function setSuggestionStartRelative(int $start): void + public function setSuggestionStartRelative(?int $start): void { + if ($start === 0) { + $start = null; + } $this->suggestion_start_rel = $start; } - public function getSuggestionEndRelative(): int - { - return $this->suggestion_end_rel; - } - public function setSuggestionEndRelative(int $end): void { + if ($end === 0) { + $end = null; + } $this->suggestion_end_rel = $end; } - public function getEaliestStartRelative(): int - { - return $this->earliest_start_rel; - } - - public function setEarliestStartRelative(int $start): void - { - $this->earliest_start_rel = $start; - } - - public function setSuggestionEnd(int $end): void + public function setSuggestionEnd(?int $end): void { + if ($end === 0) { + $end = null; + } $this->suggestion_end = $end; } - public function getSuggestionEnd(): int - { - return $this->suggestion_end; - } - - public function setEarliestStart(int $start): void - { - $this->earliest_start = $start; - } - - public function getEarliestStart(): int - { - return $this->earliest_start; - } - - public function toggleVisible(bool $status): void { - $this->visible = (int) $status; + $this->visible = $status; } public function enabledVisible(): bool { - return (bool) $this->visible; + return $this->visible; } public function toggleChangeable(bool $status): void @@ -172,57 +141,17 @@ public function enabledChangeable(): bool return (bool) $this->changeable; } - // Validate current properties - public function validateActivation(): bool - { - $ilErr = $this->error; - $lng = $this->lng; - - $ilErr->setMessage(''); - - if ($this->getTimingType() == self::TIMINGS_ACTIVATION) { - if ($this->getTimingStart() > $this->getTimingEnd()) { - $ilErr->appendMessage($lng->txt("crs_activation_start_invalid")); - } - } elseif ($this->getTimingType() == self::TIMINGS_PRESETTING) { - if ($this->getSuggestionStart() > $this->getSuggestionEnd()) { - $ilErr->appendMessage($lng->txt('crs_timing_err_sug_start_end')); - } - } - - if ($ilErr->getMessage()) { - return false; - } - return true; - } - - // TODO: found no usages, can this be removed in the next iteration? - public function validateRelativePlaning(): array - { - $errors = array(); - - if ($this->getSuggestionStartRelative() >= $this->getSuggestionEndRelative()) { - $errors[] = self::ERR_SUG_START_END; - } elseif ($this->getSuggestionStartRelative() < 0) { - $errors[] = self::ERR_SUG_START_END; - } - return $errors; - } - public function update(int $ref_id, ?int $parent_id = null): bool { - $db = $this->db; - - // #10110 $values = [ "timing_type" => ["integer", $this->getTimingType()], "timing_start" => ["integer", $this->getTimingStart() ?? 0], "timing_end" => ["integer", $this->getTimingEnd() ?? 0], - "suggestion_start" => ["integer", $this->getSuggestionStart()], - "suggestion_end" => ["integer", $this->getSuggestionEnd()], - "changeable" => ["integer", $this->enabledChangeable()], - "suggestion_start_rel" => ["integer", $this->getSuggestionStartRelative()], - "suggestion_end_rel" => ["integer", $this->getSuggestionEndRelative()], + "suggestion_start" => ["integer", $this->suggestion_start ?? 0], + "suggestion_end" => ["integer", $this->suggestion_end ?? 0], + "changeable" => ["integer", (int) $this->enabledChangeable()], + "suggestion_start_rel" => ["integer", $this->suggestion_start_rel ?? 0], + "suggestion_end_rel" => ["integer", $this->suggestion_end_rel ?? 0], "visible" => ["integer", $this->enabledVisible()] ]; @@ -234,7 +163,7 @@ public function update(int $ref_id, ?int $parent_id = null): bool "obj_id" => ["integer", $ref_id] ]; - $db->update("crs_items", $values, $where); + $this->db->update("crs_items", $values, $where); unset(self::$preloaded_data[$ref_id]); @@ -264,7 +193,6 @@ public static function preloadData(array $ref_ids): void public static function getItem(int $ref_id): array { global $DIC; - $db = $DIC->database(); if (isset(self::$preloaded_data[$ref_id])) { From d42d60356d0c529c381cc4d619ace31d8e2c8530 Mon Sep 17 00:00:00 2001 From: Thomas Famula Date: Mon, 13 Nov 2023 10:17:43 +0100 Subject: [PATCH 108/497] Fix undefined array key --- Services/Skill/Tree/class.ilVirtualSkillTree.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Skill/Tree/class.ilVirtualSkillTree.php b/Services/Skill/Tree/class.ilVirtualSkillTree.php index daa2ebb5dfdd..a953825c14dc 100644 --- a/Services/Skill/Tree/class.ilVirtualSkillTree.php +++ b/Services/Skill/Tree/class.ilVirtualSkillTree.php @@ -262,7 +262,7 @@ public function getSubTreeForCSkillId(string $a_cskill_id, bool $a_only_basic = $result = []; $node = $this->getNode($id); - if (!$a_only_basic || in_array($node["type"], array("skll", "sktp")) || + if (!$a_only_basic || isset($node["type"]) && in_array($node["type"], array("skll", "sktp")) || ($node["type"] == "sktr" && ilSkillTreeNode::_lookupType($node["skill_id"]) == "sktp")) { $result[] = $node; } From a47d93fe3c34900089b78f8b5f8ad9aa7d6732dd Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 13 Nov 2023 10:47:45 +0100 Subject: [PATCH 109/497] Test: Fix Regexp Too Greedy See: https://mantis.ilias.de/view.php?id=38605 and https://mantis.ilias.de/view.php?id=38584 --- Modules/TestQuestionPool/classes/class.assClozeTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/TestQuestionPool/classes/class.assClozeTest.php b/Modules/TestQuestionPool/classes/class.assClozeTest.php index f345d743e6cb..77f20ef273fa 100755 --- a/Modules/TestQuestionPool/classes/class.assClozeTest.php +++ b/Modules/TestQuestionPool/classes/class.assClozeTest.php @@ -593,7 +593,7 @@ public function getClozeText(): string public function getClozeTextForHTMLOutput(): string { $gaps = []; - preg_match_all('/\[gap\].*\[\/gap\]/', $this->getClozeText(), $gaps); + preg_match_all('/\[gap\].*?\[\/gap\]/', $this->getClozeText(), $gaps); $string_with_replaced_gaps = str_replace($gaps[0], '######GAP######', $this->getClozeText()); $cleaned_text = $this->getHtmlQuestionContentPurifier()->purify( $string_with_replaced_gaps From fde26e33643c00c78d6515ad99f20718a8d9d2e0 Mon Sep 17 00:00:00 2001 From: c-knof <100784517+c-knof@users.noreply.github.com> Date: Mon, 13 Nov 2023 12:02:18 +0100 Subject: [PATCH 110/497] Mantis Bug 38443: Import language file error (#6583) * fixed bug, stricter check for duplicate entries * removed unnecessary dic-usage * fixed check * reduced indentation * update plugins after deletion of local changes * fixed copyright --- .../Language/classes/class.ilObjLanguage.php | 7 +- .../classes/class.ilObjLanguageDBAccess.php | 18 ++-- .../classes/class.ilObjLanguageExt.php | 46 ++++---- .../classes/class.ilObjLanguageFolder.php | 100 ++++++++++-------- .../classes/class.ilObjLanguageFolderGUI.php | 15 ++- lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 7 files changed, 93 insertions(+), 95 deletions(-) diff --git a/Services/Language/classes/class.ilObjLanguage.php b/Services/Language/classes/class.ilObjLanguage.php index d0b9e70a6992..515fcd76b18c 100755 --- a/Services/Language/classes/class.ilObjLanguage.php +++ b/Services/Language/classes/class.ilObjLanguage.php @@ -1,7 +1,5 @@ key] ?? false) { global $DIC; - /** @var ilErrorHandling $ilErr */ - $ilErr = $DIC["ilErr"]; - $ilErr->raiseError( + $DIC->ui()->mainTemplate()->setOnScreenMessage( + 'failure', "Duplicate Language Entry in $lang_file:\n$val", - $ilErr->MESSAGE - ); + true); + $DIC->ctrl()->redirectByClass(ilobjlanguagefoldergui::class, 'view'); } $double_checker[$separated[0]][$separated[1]][$this->key] = true; @@ -167,13 +166,12 @@ protected function checkModules(): void $unserialied = unserialize($module["lang_array"], ["allowed_classes" => false]); if (!is_array($unserialied)) { global $DIC; - /** @var ilErrorHandling $ilErr */ - $ilErr = $DIC["ilErr"]; - $ilErr->raiseError( + $DIC->ui()->mainTemplate()->setOnScreenMessage( + 'failure', "Data for module '" . $module["module"] . "' of language '" . $this->key . "' is not correctly saved. " . "Please check the collation of your database tables lng_data and lng_modules. It must be utf8_unicode_ci.", - $ilErr->MESSAGE - ); + true); + $DIC->ctrl()->redirectByClass(ilobjlanguagefoldergui::class, 'view'); } } } diff --git a/Services/Language/classes/class.ilObjLanguageExt.php b/Services/Language/classes/class.ilObjLanguageExt.php index e4837dd8e1da..3cf191a4a5a4 100644 --- a/Services/Language/classes/class.ilObjLanguageExt.php +++ b/Services/Language/classes/class.ilObjLanguageExt.php @@ -18,8 +18,6 @@ declare(strict_types=1); -require_once "./Services/Language/classes/class.ilObjLanguage.php"; - /** * Class ilObjLanguageExt * @@ -411,11 +409,10 @@ public static function _saveValues(string $a_lang_key, array $a_values = array() if (!is_array($a_values)) { return; } - $save_array = array(); - $save_date = date("Y-m-d H:i:s", time()); + $save_array = []; + $save_date = (new DateTime())->format("Y-m-d H:i:s"); // read and get the global values - require_once "./Services/Language/classes/class.ilLanguageFile.php"; $global_file_obj = ilLanguageFile::_getGlobalLanguageFile($a_lang_key); $file_values = $global_file_obj->getAllValues(); $file_comments = $global_file_obj->getAllComments(); @@ -427,25 +424,26 @@ public static function _saveValues(string $a_lang_key, array $a_values = array() // save the single translations in lng_data foreach ($a_values as $key => $value) { $keys = explode($lng->separator, $key); - if (count($keys) === 2) { - $module = $keys[0]; - $topic = $keys[1]; - $save_array[$module][$topic] = $value; - - if (!isset($global_values[$key])) continue; - $are_comments_set = isset($global_comments[$key]) && isset($a_remarks[$key]); - $are_changes_made = $global_values[$key] != $value || $db_values[$key] != $value; - if ($are_changes_made || ($are_comments_set ? $global_comments[$key] != $a_remarks[$key] : $are_comments_set)) { - $local_change = $db_values[$key] == $value || $global_values[$key] != $value ? $save_date : null; - ilObjLanguage::replaceLangEntry( - $module, - $topic, - $a_lang_key, - $value, - $local_change, - $a_remarks[$key] ?? null - ); - } + + if (count($keys) !== 2) { + continue; + } + + list($module, $topic) = $keys; + $save_array[$module][$topic] = $value; + + $are_comments_set = array_key_exists($key, $global_comments) && array_key_exists($key, $a_remarks); + $are_changes_made = (isset($global_values[$key]) ? $global_values[$key] != $value : true) || (isset($db_values[$key]) ? $db_values[$key] != $value : true); + if ($are_changes_made || ($are_comments_set ? $global_comments[$key] != $a_remarks[$key] : $are_comments_set)) { + $local_change = (isset($db_values[$key]) ? $db_values[$key] == $value : true) || (isset($global_values[$key]) ? $global_values[$key] != $value : true) ? $save_date : null; + ilObjLanguage::replaceLangEntry( + $module, + $topic, + $a_lang_key, + $value, + $local_change, + $a_remarks[$key] ?? null + ); } } diff --git a/Services/Language/classes/class.ilObjLanguageFolder.php b/Services/Language/classes/class.ilObjLanguageFolder.php index 9f9d12a28537..7529541418bb 100755 --- a/Services/Language/classes/class.ilObjLanguageFolder.php +++ b/Services/Language/classes/class.ilObjLanguageFolder.php @@ -1,7 +1,5 @@ language(); - $this->type = "lngf"; parent::__construct($a_id, $a_call_by_reference); - $this->lang_path = $lng->lang_path; - $this->lang_default = $lng->lang_default; - $this->lang_user = $lng->lang_user; - $this->separator = $lng->separator; + $this->lang_path = $this->lng->lang_path; + $this->lang_default = $this->lng->lang_default; + $this->lang_user = $this->lng->lang_user; + $this->separator = $this->lng->separator; } /** @@ -99,10 +92,7 @@ public function __construct(int $a_id, bool $a_call_by_reference = true) */ public function getLanguages(): array { - global $DIC; - $lng = $DIC->language(); - - $lng->loadLanguageModule("meta"); + $this->lng->loadLanguageModule("meta"); // set path to directory where lang-files reside $d = dir($this->lang_path); @@ -169,7 +159,7 @@ public function getLanguages(): array // setting language's full names foreach ($languages as $lang_key => $lang_data) { - $languages[$lang_key]["name"] = $lng->txt("meta_l_" . $lang_key); + $languages[$lang_key]["name"] = $this->lng->txt("meta_l_" . $lang_key); } $this->languages = $languages; @@ -223,9 +213,6 @@ public function addNewLanguages(array $a_languages): array */ public function removeLanguages(array $a_languages): array { - global $DIC; - $ilDB = $DIC->database(); - foreach ($a_languages as $lang_key => $lang_data) { if ($lang_data["desc"] === "not_installed" && $lang_data["info"] === "file_not_found") { // update languages array @@ -233,9 +220,9 @@ public function removeLanguages(array $a_languages): array // update object_data table $query = "DELETE FROM object_data " . - "WHERE type = " . $ilDB->quote("lng", "text") . " " . - "AND title = " . $ilDB->quote($lang_key, "text"); - $ilDB->manipulate($query); + "WHERE type = " . $this->db->quote("lng", "text") . " " . + "AND title = " . $this->db->quote($lang_key, "text"); + $this->db->manipulate($query); } } @@ -252,10 +239,6 @@ public function removeLanguages(array $a_languages): array */ public function checkAllLanguages(): string { - global $DIC; - // TODO: lng object should not be used in this class - $lng = $DIC->language(); - // set path to directory where lang-files reside $d = dir($this->lang_path); $tmpPath = getcwd(); @@ -269,53 +252,76 @@ public function checkAllLanguages(): string while ($entry = $d->read()) { if (is_file($entry) && (preg_match("~(^ilias_.{2}\.lang$)~", $entry))) { // textmeldung, wenn langfile gefunden wurde - $output .= "

" . $lng->txt("langfile_found") . ": " . $entry; + $output .= "

" . $this->lng->txt("langfile_found") . ": " . $entry; $content = file($entry); - + $lines_full = count($content); $found = true; - $error = false; + $error_param = false; + $error_double = false; + $double_checker = []; if ($content = ilObjLanguage::cut_header($content)) { + $lines_cut = count($content); foreach ($content as $key => $val) { $separated = explode($this->separator, trim($val)); $num = count($separated); + $line = $key + $lines_full - $lines_cut + 1; if ($num !== 3) { - $error = true; - $line = $key + 37; + $error_param = true; - $output .= "
" . $lng->txt("err_in_line") . " " . $line . " !  "; - $output .= $lng->txt("module") . ": " . $separated[0]; - $output .= ", " . $lng->txt("identifier") . ": " . $separated[1]; - $output .= ", " . $lng->txt("value") . ": " . $separated[2]; + $output .= "
" . $this->lng->txt("err_in_line") . " " . $line . " !  "; switch ($num) { case 1: if (empty($separated[0])) { - $output .= "
" . $lng->txt("err_no_param") . " " . $lng->txt("check_langfile"); + $output .= "
" . $this->lng->txt("err_no_param") . " " . $this->lng->txt("check_langfile"); } else { - $output .= "
" . $lng->txt("err_1_param") . " " . $lng->txt("check_langfile"); + $output .= $this->lng->txt("module") . ": " . $separated[0]; + $output .= "
" . $this->lng->txt("err_1_param") . " " . $this->lng->txt("check_langfile"); } break; case 2: - $output .= "
" . $lng->txt("err_2_param") . " " . $lng->txt("check_langfile"); + $output .= $this->lng->txt("module") . ": " . $separated[0]; + $output .= ", " . $this->lng->txt("identifier") . ": " . $separated[1]; + $output .= "
" . $this->lng->txt("err_2_param") . " " . $this->lng->txt("check_langfile"); break; default: - $output .= "
" . $lng->txt("err_over_3_param") . " " . $lng->txt("check_langfile"); + $output .= $this->lng->txt("module") . ": " . $separated[0]; + $output .= ", " . $this->lng->txt("identifier") . ": " . $separated[1]; + $output .= ", " . $this->lng->txt("value") . ": " . $separated[2]; + $output .= "
" . $this->lng->txt("err_over_3_param") . " " . $this->lng->txt("check_langfile"); break; } + continue; } + if ($double_checker[strtolower($separated[0])][strtolower($separated[1])] ?? false) { + $error_double = true; + + $output .= "
" . $this->lng->txt("err_in_line") . " " . $double_checker[strtolower($separated[0])][strtolower($separated[1])] . " " . $this->lng->txt("and") . " " . $line . " !  "; + $output .= $this->lng->txt("module") . ": " . $separated[0]; + $output .= ", " . $this->lng->txt("identifier") . ": " . $separated[1]; + $output .= ", " . $this->lng->txt("value") . ": " . $separated[2]; + } + $double_checker[strtolower($separated[0])][strtolower($separated[1])] = $line; } - if ($error) { - $output .= "
" . $lng->txt("file_not_valid") . " " . $lng->txt("err_count_param"); + if ($error_param || $error_double) { + $reason = ""; + if ($error_param) { + $reason .= " " . $this->lng->txt("err_count_param"); + } + if ($error_double) { + $reason .= " " . $this->lng->txt("err_double_entries"); + } + $output .= "
" . $this->lng->txt("file_not_valid") . $reason; } else { - $output .= "
" . $lng->txt("file_valid"); + $output .= "
" . $this->lng->txt("file_valid"); } } else { - $output .= "
" . $lng->txt("file_not_valid") . " " . $lng->txt("err_wrong_header"); + $output .= "
" . $this->lng->txt("file_not_valid") . " " . $this->lng->txt("err_wrong_header"); } } } @@ -323,7 +329,7 @@ public function checkAllLanguages(): string $d->close(); if (!$found) { - $output .= "
" . $lng->txt("err_no_langfile_found"); + $output .= "
" . $this->lng->txt("err_no_langfile_found"); } chdir($tmpPath); diff --git a/Services/Language/classes/class.ilObjLanguageFolderGUI.php b/Services/Language/classes/class.ilObjLanguageFolderGUI.php index 25c20650ce14..851e872be1d9 100755 --- a/Services/Language/classes/class.ilObjLanguageFolderGUI.php +++ b/Services/Language/classes/class.ilObjLanguageFolderGUI.php @@ -1,7 +1,5 @@ data = $this->lng->txt("selected_languages_updated"); $this->lng->loadLanguageModule("meta"); + $refreshed = []; foreach ($this->getPostId() as $id) { $langObj = new ilObjLanguage((int) $id, false); @@ -263,13 +259,14 @@ public function uninstallChangesObject(): void $langObj->setTitle($langObj->getKey()); $langObj->setDescription("installed"); $langObj->update(); + $refreshed[] = $langObj->getKey(); } $this->data .= "
" . $this->lng->txt("meta_l_" . $langObj->getKey()); } unset($langObj); } - + ilObjLanguage::refreshPlugins($refreshed); $this->out(); } diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index de88aa7f047d..bc02192aad8c 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -3980,6 +3980,7 @@ common#:#err_auth_mode_inactive#:#Zur Zeit ist leider keine Anmeldung möglich. common#:#err_auth_soap_no_ilias_user#:#Anmeldung fehlgeschlagen! Die SOAP-Authentifizierung war erfolgreich, aber es existiert kein entsprechender ILIAS-Benutzer. Bitte kontaktieren Sie Ihren Systemadministrator. common#:#err_check_input#:#Die Einstellungen konnten nicht gespeichert werden. Bitte überprüfen Sie Ihre Eingaben. common#:#err_count_param#:#Grund: Falsche Parameteranzahl +common#:#err_double_entries#:#Grund: Doppelte Einträge common#:#err_in_line#:#Fehler in Zeile common#:#err_inactive#:#Dieses ILIAS-Konto ist nicht aktiv bzw. noch nicht aktiviert worden. Bitte kontaktieren Sie den Technischen Support (siehe Link unten) für weitere Unterstützung. common#:#err_inactive_login_attempts#:#Ihr ILIAS-Konto wurde wegen falscher Login-Versuche deaktiviert. Klicken Sie auf „Technische Betreuung kontaktieren“ am Fuße dieser Seite, um die Administratoren zu informieren, dass diese Ihr ILIAS-Konto wieder aktivieren sollen. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 13f1dbbd7a6d..612e7fa9c043 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -3980,6 +3980,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated. common#:#err_auth_soap_no_ilias_user#:#Login failed. SOAP authentication successful, but no corresponding ILIAS user exists. Please contact your system administrator. common#:#err_check_input#:#The settings could not be saved. Please check your input. common#:#err_count_param#:#Reason: Wrong parameter count +common#:#err_double_entries#:#Reason: Duplicate Entries common#:#err_in_line#:#Error in line common#:#err_inactive#:#This account has not been activated. Please contact the system administrator for access. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. From 9f3b7cc465cc30be7834eaa25487704146e8d047 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 13 Nov 2023 15:20:50 +0100 Subject: [PATCH 111/497] User: Fix Missing Line Brake After Until See: https://mantis.ilias.de/view.php?id=38681 --- Services/User/classes/class.ilObjUser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/User/classes/class.ilObjUser.php b/Services/User/classes/class.ilObjUser.php index 92a83457eff2..f375609797cf 100755 --- a/Services/User/classes/class.ilObjUser.php +++ b/Services/User/classes/class.ilObjUser.php @@ -3110,7 +3110,7 @@ public function getProfileAsString(ilLanguage $language): string $body .= $language->txt('time_limit') . ': ' . $language->txt('from') . " " . $start->get(IL_CAL_DATETIME) . " "; - $body .= $language->txt('to') . ' ' . $end->get(IL_CAL_DATETIME); + $body .= $language->txt('to') . ' ' . $end->get(IL_CAL_DATETIME) . "\n"; } /** From 7cb715961a800873d3a5b3a8378b639c28b2df77 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 13 Nov 2023 16:09:42 +0100 Subject: [PATCH 112/497] Scorm/Certificate: Fix number formatting See: https://mantis.ilias.de/view.php?id=38744 --- .../Values/class.ilScormPlaceholderValues.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Services/Certificate/classes/Placeholder/Values/class.ilScormPlaceholderValues.php b/Services/Certificate/classes/Placeholder/Values/class.ilScormPlaceholderValues.php index 994a4d414cd1..cb2eb033dd45 100644 --- a/Services/Certificate/classes/Placeholder/Values/class.ilScormPlaceholderValues.php +++ b/Services/Certificate/classes/Placeholder/Values/class.ilScormPlaceholderValues.php @@ -98,14 +98,15 @@ public function getPlaceholderValues(int $userId, int $objId): array $object = $this->objectHelper->getInstanceByObjId($objId); $points = $object->getPointsInPercent(); - $txtPoints = number_format( - $points, - 1, - $this->language->txt('lang_sep_decimal'), - $this->language->txt('lang_sep_thousand') - ) . ' %'; if (is_null($points)) { $txtPoints = $this->language->txt('certificate_points_notavailable'); + } else { + $txtPoints = number_format( + $points, + 1, + $this->language->txt('lang_sep_decimal'), + $this->language->txt('lang_sep_thousand') + ) . ' %'; } $max_points = $object->getMaxPoints(); From 8b294ef57710fc8874be8e383bbc5d7eae7e92a2 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 13 Nov 2023 17:45:41 +0100 Subject: [PATCH 113/497] Test: Fix Call to Non-Existend Method in EvalTable See: https://mantis.ilias.de/view.php?id=38603 --- Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php b/Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php index eeb49c7b9729..6ea23d6b76fd 100644 --- a/Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php +++ b/Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php @@ -63,7 +63,7 @@ public function __construct($a_parent_obj, $a_parent_cmd, $anonymity = false, $o if (strcmp($c, 'email') == 0) { $this->addColumn($this->lng->txt("email"), 'email', ''); } - if (strcmp($c, 'exam_id') == 0 && $this->parent_obj->getTestObject()->isShowExamIdInTestResultsEnabled()) { + if (strcmp($c, 'exam_id') == 0 && $this->parent_obj->getObject()->isShowExamIdInTestResultsEnabled()) { $this->addColumn($this->lng->txt("exam_id_label"), 'exam_id', ''); } if (strcmp($c, 'institution') == 0) { From 069fd074eaa1cb9f36a254d5dc016ab34ddcc84f Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 14 Nov 2023 09:24:12 +0100 Subject: [PATCH 114/497] Test: Fix Wrong Name in Table See: https://mantis.ilias.de/view.php?id=38404 --- .../classes/tables/class.ilParticipantsTestResultsTableGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Test/classes/tables/class.ilParticipantsTestResultsTableGUI.php b/Modules/Test/classes/tables/class.ilParticipantsTestResultsTableGUI.php index 4c0d3a03ac08..b901bbd53aa3 100644 --- a/Modules/Test/classes/tables/class.ilParticipantsTestResultsTableGUI.php +++ b/Modules/Test/classes/tables/class.ilParticipantsTestResultsTableGUI.php @@ -117,7 +117,7 @@ public function initColumns(): void $this->addColumn($this->lng->txt("login"), 'login'); $this->addColumn($this->lng->txt("tst_tbl_col_scored_pass"), 'scored_pass'); - $this->addColumn($this->lng->txt("tst_tbl_col_pass_finished"), 'pass_finished'); + $this->addColumn($this->lng->txt("tst_tbl_col_pass_finished"), 'scored_pass_finished_timestamp'); $this->addColumn($this->lng->txt("tst_tbl_col_answered_questions"), 'answered_questions'); $this->addColumn($this->lng->txt("tst_tbl_col_reached_points"), 'reached_points'); From b63559afe57e12d56b4f0d27a4597cf5d9412cab Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 14 Nov 2023 09:41:31 +0100 Subject: [PATCH 115/497] Test: Fix Lock Answers On No Reply Ordering See: https://mantis.ilias.de/view.php?id=38398 --- .../classes/forms/class.ilIdentifiedMultiValuesInputGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/TestQuestionPool/classes/forms/class.ilIdentifiedMultiValuesInputGUI.php b/Modules/TestQuestionPool/classes/forms/class.ilIdentifiedMultiValuesInputGUI.php index 9b569430d7b1..eea91e38938b 100644 --- a/Modules/TestQuestionPool/classes/forms/class.ilIdentifiedMultiValuesInputGUI.php +++ b/Modules/TestQuestionPool/classes/forms/class.ilIdentifiedMultiValuesInputGUI.php @@ -213,7 +213,7 @@ protected function buildMultiValueSubmitVar($identifier, $positionIndex, $submit final public function setValueByArray(array $a_values): void { - if (!is_array($a_values[$this->getPostVar()])) { + if (!isset($a_values[$this->getPostVar()]) || !is_array($a_values[$this->getPostVar()])) { $a_values[$this->getPostVar()] = []; } From 7228ba72c2d97ca13d47706cd5ef6f81f9a1300d Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 13 Nov 2023 07:54:45 +0100 Subject: [PATCH 116/497] Object: Fix Time Period Suggestions See: https://mantis.ilias.de/view.php?id=38694 --- Services/Object/classes/class.ilObjectActivation.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/Object/classes/class.ilObjectActivation.php b/Services/Object/classes/class.ilObjectActivation.php index d5c21746021d..61e2562c3545 100644 --- a/Services/Object/classes/class.ilObjectActivation.php +++ b/Services/Object/classes/class.ilObjectActivation.php @@ -455,8 +455,8 @@ public static function cloneDependencies(int $ref_id, int $target_id, int $copy_ $new_item->toggleChangeable((bool) $item['changeable']); $new_item->toggleVisible((bool) $item['visible']); $new_item->update($new_item_id, $new_parent); - $new_item->setSuggestionStartRelative((int) $item['suggestion_start_rel']); - $new_item->setSuggestionEndRelative((int) $item['suggestion_end_rel']); + $new_item->setSuggestionStartRelative($item['suggestion_start_rel'] ?? 0); + $new_item->setSuggestionEndRelative($item['suggestion_end_rel'] ?? 0); $new_item->createDefaultEntry($new_item_id); $new_item->update($new_item_id); } From f9e4eb826ea46b7d42c0f7ceac142bf2c81f70e5 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 14 Nov 2023 11:19:55 +0100 Subject: [PATCH 117/497] Object: Fix Time Period Suggestions Part 2 See: https://mantis.ilias.de/view.php?id=38694 --- Services/Object/classes/class.ilObjectActivation.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/Object/classes/class.ilObjectActivation.php b/Services/Object/classes/class.ilObjectActivation.php index 61e2562c3545..069415115ab2 100644 --- a/Services/Object/classes/class.ilObjectActivation.php +++ b/Services/Object/classes/class.ilObjectActivation.php @@ -455,8 +455,8 @@ public static function cloneDependencies(int $ref_id, int $target_id, int $copy_ $new_item->toggleChangeable((bool) $item['changeable']); $new_item->toggleVisible((bool) $item['visible']); $new_item->update($new_item_id, $new_parent); - $new_item->setSuggestionStartRelative($item['suggestion_start_rel'] ?? 0); - $new_item->setSuggestionEndRelative($item['suggestion_end_rel'] ?? 0); + $new_item->setSuggestionStartRelative((int) ($item['suggestion_start_rel'] ?? 0)); + $new_item->setSuggestionEndRelative((int) ($item['suggestion_end_rel'] ?? 0)); $new_item->createDefaultEntry($new_item_id); $new_item->update($new_item_id); } From 28fde70999e3939518879386dedf4f1bd12ee181 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 14 Nov 2023 11:43:22 +0100 Subject: [PATCH 118/497] init flag --- Services/MediaObjects/classes/class.ilWidthHeightInputGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/MediaObjects/classes/class.ilWidthHeightInputGUI.php b/Services/MediaObjects/classes/class.ilWidthHeightInputGUI.php index 5f23f4459368..f6a3284717a4 100755 --- a/Services/MediaObjects/classes/class.ilWidthHeightInputGUI.php +++ b/Services/MediaObjects/classes/class.ilWidthHeightInputGUI.php @@ -24,7 +24,7 @@ class ilWidthHeightInputGUI extends ilFormPropertyGUI { protected $support_constraint_props = false; - protected bool $constrainproportions; + protected bool $constrainproportions = false; protected ?int $height = null; protected ?int $width = null; protected array $dirs = []; From 07195aa73ce3fe6118138468a882f0ee08bcc7de Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 14 Nov 2023 11:37:25 +0100 Subject: [PATCH 119/497] User: Update Lang-Files See: https://mantis.ilias.de/view.php?id=7181 --- lang/ilias_de.lang | 6 +++--- lang/ilias_en.lang | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index bc02192aad8c..4d96f421e664 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -4283,7 +4283,7 @@ common#:#icon_settings#:#Icon common#:#id#:#ID common#:#identifier#:#Identifier common#:#if_no_title_then_filename#:#Geben Sie keinen Titel ein, wird stattdessen der Dateiname angezeigt -common#:#ignore_on_conflict#:#Ignoriere bei Konflikt +common#:#ignore_on_conflict#:#Insert/Update Aktion wird strikt befolgt common#:#ignore_required_fields#:#Benutzerpflichtfelder ignorieren 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 Benutzer nach der nächsten Anmeldung sein Profil vervollständigen muss. common#:#il_astpl_loc_initial#:#Einstiegstest @@ -5777,7 +5777,7 @@ common#:#up#:#Hoch common#:#update#:#Übernehmen common#:#update_applied#:#Datenbankupdate erfolgreich common#:#update_language#:#Sprache aktualisieren -common#:#update_on_conflict#:#Aktualisiere bei Konflikt +common#:#update_on_conflict#:#Insert/Update Aktion wird automatisch ermittelt common#:#update_orgunits#:#Benutzerfeld 'Organisationseinheiten' aktualisieren common#:#update_orgunits_desc#:#Wenn eingeschaltet, werden bei allen Benutzern das Feld 'Organisationseinheiten' aktualisiert und so allfällige Fehler behoben. common#:#upload#:#Hochladen @@ -5867,7 +5867,7 @@ common#:#usrimport_action_replaced#:#Aktion %1$s durch %2$s ersetzt. common#:#usrimport_cant_delete#:#Kann „Delete“ Aktion nicht ausführen. Kein passendes ILIAS-Konto in der Datenbank vorhanden. common#:#usrimport_cant_insert#:#Kann „Insert“ Aktion nicht ausführen. ILIAS-Konto ist bereits in der Datenbank vorhanden. common#:#usrimport_cant_update#:#Kann „Update“ Aktion nicht ausführen. Kein passendes ILIAS-Konto in der Datenbank vorhanden. -common#:#usrimport_conflict_handling_info#:#Bei „Ignoriere bei Konflikt“ überspringt ILIAS alle Daten, die nicht problemlos importiert werden können. In diesem Fall würde zum Beispiel eine „Insert“-Aktion nicht ausgeführt, wenn bereits ein Konto mit dem gleichen Anmeldenamen in der Datenbank vorhanden ist. Sie erhalten einen Fehlerbericht, um Ihre Importdatei zu korrigieren.
Bei „Aktualisieren bei Konflikt“ überschreibt ILIAS bei Problemen die Inhalte auf der Datenbank. Hierbei kann es zu einem Datenverlust kommen. Nutzen Sie diese Option nur, wenn Sie sicher sind, dass Ihre Importdatei fehlerfrei ist. +common#:#usrimport_conflict_handling_info#:#Bei der Option „Aktualisieren bei Konflikt“ überschreibt ILIAS bei Problemen die Inhalte auf der Datenbank. Hierbei kann es zu einem Datenverlust kommen. Nutzen Sie diese Option nur, wenn Sie sicher sind, dass Ihre Importdatei fehlerfrei ist. common#:#usrimport_form_not_evaluabe#:#Das Formular konnte nicht ausgelesen werden. common#:#usrimport_global_role_for_action_required#:#Für die "%1$s" Aktion muss mindestens eine globale Rolle angegeben werden. common#:#usrimport_ignore_role#:#Rolle ignorieren diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 612e7fa9c043..3546b1128400 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -4283,7 +4283,7 @@ common#:#icon_settings#:#Custom Icons common#:#id#:#ID common#:#identifier#:#identifier common#:#if_no_title_then_filename#:#Leave blank to use file name as title. -common#:#ignore_on_conflict#:#Ignore on conflict +common#:#ignore_on_conflict#:#Insert/Update action will be followed strictly common#:#ignore_required_fields#:#Ignore required fields common#:#ignore_required_fields_info#:#If activated, you can submit this form without filling out all mandatory fields. The new user has to add the missing information on the personal profile after the next login. common#:#il_astpl_loc_initial#:#Initial Test @@ -5777,7 +5777,7 @@ common#:#up#:#Up common#:#update#:#Edit common#:#update_applied#:#Update Applied common#:#update_language#:#Update Language -common#:#update_on_conflict#:#Update on conflict +common#:#update_on_conflict#:#Insert/Update action will be detected automatically common#:#update_orgunits#:#Update assigned organisational units common#:#update_orgunits_desc#:#If enabled, the field 'Organisational Units' will be updated for all user accounts. common#:#upload#:#Upload @@ -5867,7 +5867,7 @@ common#:#usrimport_action_replaced#:#Replaced action %1$s by %2$s. common#:#usrimport_cant_delete#:#Can't perform ‘Delete’ action. No such user in database. common#:#usrimport_cant_insert#:#Can't perform ‘Insert’ action. User is already in database. common#:#usrimport_cant_update#:#Can't perform ‘Update’ action. No such user in database. -common#:#usrimport_conflict_handling_info#:#When ‘Ignore on conflict’ is selected, ILIAS 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, ILIAS 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#:#usrimport_conflict_handling_info#:#When ‘Ignore on conflict’ is selected, ILIAS ignores an action, if it can not be performed (e. g. an ‘Insert’ action is not done, if there already is a user with the same login in the database.) When ‘Update on conflict’ is selected, ILIAS 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#:#usrimport_form_not_evaluabe#:#The form data couldn't be read. common#:#usrimport_global_role_for_action_required#:#At least one global role must be specified for "%1$s" action. common#:#usrimport_ignore_role#:#Ignore role From b7301083fb22f15b1a3611e16b74ec0a55e2e56b Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 14 Nov 2023 14:18:01 +0100 Subject: [PATCH 120/497] =?UTF-8?q?8733:=20Failed=20test:=20Einzelne=20W?= =?UTF-8?q?=C3=B6rter/S=C3=A4tze=20im=20Text=20formatierten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Services/COPage/classes/class.ilPCParagraph.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/COPage/classes/class.ilPCParagraph.php b/Services/COPage/classes/class.ilPCParagraph.php index 28cc8ca0e5b8..9d3fe4790c8f 100755 --- a/Services/COPage/classes/class.ilPCParagraph.php +++ b/Services/COPage/classes/class.ilPCParagraph.php @@ -1276,18 +1276,18 @@ public static function xml2output( // anchor while (preg_match('~~i', $a_text, $found)) { $attribs = self::attribsToArray($found[1]); - $a_text = str_replace("", "[anc name=\"" . $attribs["Name"] . "\"][/anc]", $a_text); + $a_text = str_replace("", "[anc name=\"" . ($attribs["Name"] ?? ""). "\"][/anc]", $a_text); } while (preg_match('~~i', $a_text, $found)) { $attribs = self::attribsToArray($found[1]); - $a_text = str_replace("", "[anc name=\"" . $attribs["Name"] . "\"]", $a_text); + $a_text = str_replace("", "[anc name=\"" . ($attribs["Name"] ?? "") . "\"]", $a_text); } $a_text = str_replace("", "[/anc]", $a_text); // marked text while (preg_match('~~i', $a_text, $found)) { $attribs = self::attribsToArray($found[1]); - $a_text = str_replace("", "[marked class=\"" . $attribs["Class"] . "\"]", $a_text); + $a_text = str_replace("", "[marked class=\"" . ($attribs["Class"] ?? "") . "\"]", $a_text); } $a_text = str_replace("", "[/marked]", $a_text); From 61d0c28996d40a4342827a3976d2bfce2c5f17c0 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 14 Nov 2023 15:57:21 +0100 Subject: [PATCH 121/497] Test: Fix Score Reporting Date See: https://mantis.ilias.de/view.php?id=38258 --- .../classes/ScoreReporting/ilObjTestSettingsResultSummary.php | 4 ++-- .../Test/classes/class.ilObjTestSettingsScoringResultsGUI.php | 2 +- Modules/Test/test/ScoreSettingsTest.php | 4 +--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Modules/Test/classes/ScoreReporting/ilObjTestSettingsResultSummary.php b/Modules/Test/classes/ScoreReporting/ilObjTestSettingsResultSummary.php index 1e6a1adce077..9a4fbefdf1fa 100644 --- a/Modules/Test/classes/ScoreReporting/ilObjTestSettingsResultSummary.php +++ b/Modules/Test/classes/ScoreReporting/ilObjTestSettingsResultSummary.php @@ -66,7 +66,7 @@ function ($v) { if ($reporting_date !== null) { $reporting_date = $reporting_date->setTimezone( new DateTimeZone($environment['user_time_zone']) - )->format($environment['user_date_format']); + )->format($environment['user_date_format']->toString() . ' H:m'); } $results_time_group = $f->switchableGroup( @@ -79,6 +79,7 @@ function ($v) { $f->dateTime($lng->txt('tst_reporting_date'), "") ->withTimezone($environment['user_time_zone']) ->withUseTime(true) + ->withFormat($environment['user_date_format']) ->withValue( $reporting_date ) @@ -98,7 +99,6 @@ function ($v) { $results_time_group = $results_time_group->withValue($this->getScoreReporting()); } - $optional_group = $f->optionalGroup( [ 'score_reporting_mode' => $results_time_group, diff --git a/Modules/Test/classes/class.ilObjTestSettingsScoringResultsGUI.php b/Modules/Test/classes/class.ilObjTestSettingsScoringResultsGUI.php index c0804df46c15..b3893242b90d 100644 --- a/Modules/Test/classes/class.ilObjTestSettingsScoringResultsGUI.php +++ b/Modules/Test/classes/class.ilObjTestSettingsScoringResultsGUI.php @@ -239,7 +239,7 @@ private function buildForm(): Form default: $date_format = $df->standard(); } - $environment['user_date_format'] = $date_format->toString() . 'H:i'; + $environment['user_date_format'] = $date_format; $environment['user_time_zone'] = $this->active_user->getTimeZone(); $disabled_flag = ($this->areScoringSettingsWritable() === false); diff --git a/Modules/Test/test/ScoreSettingsTest.php b/Modules/Test/test/ScoreSettingsTest.php index e32db4997cb0..5ad3f0ea5d72 100644 --- a/Modules/Test/test/ScoreSettingsTest.php +++ b/Modules/Test/test/ScoreSettingsTest.php @@ -261,9 +261,7 @@ public function testScoreSettingsSectionSummary(): void $actual = $this->getDefaultRenderer()->render( $s->toForm(...array_merge($ui, [[ 'user_time_zone' => 'Europe/Berlin', - 'user_date_format' => $data_factory->dateFormat()->withTime24( - $data_factory->dateFormat()->standard() - ) + 'user_date_format' => $data_factory->dateFormat()->standard() ]])) ); From 479a4dc0a09f0481dd8f8a56089956c0c361a2ac Mon Sep 17 00:00:00 2001 From: Thomas Famula Date: Tue, 14 Nov 2023 16:52:01 +0100 Subject: [PATCH 122/497] =?UTF-8?q?36114:=20Hinzuf=C3=BCgen=20weiterer=20F?= =?UTF-8?q?ilterkriterien=20angeboten,=20obwohl=20nicht=20m=C3=B6glich?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/UI/templates/js/Input/Container/dist/filter.js | 9 +++++++-- src/UI/templates/js/Input/Container/src/filter.main.js | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/UI/templates/js/Input/Container/dist/filter.js b/src/UI/templates/js/Input/Container/dist/filter.js index f90fa4768e3e..a87140fe9909 100644 --- a/src/UI/templates/js/Input/Container/dist/filter.js +++ b/src/UI/templates/js/Input/Container/dist/filter.js @@ -58,8 +58,13 @@ var filter = function($) { $('.input-group .btn.btn-bulky').attr('data-placement', 'bottom'); //Hide Add-Button when all Input Fields are shown in the Filter at the beginning - var addable_inputs = $(".il-popover-container:hidden").length; - if (addable_inputs === 0) { + var empty_list = true; + var addable_inputs = $($filter).find(".il-filter-add-list").find("li").each(function() { + if ($(this).css("display") !== "none" && $(this).css("visibility") !== "hidden") { + empty_list = false; + } + }); + if (empty_list) { $(".btn-bulky").parents(".il-popover-container").hide(); } diff --git a/src/UI/templates/js/Input/Container/src/filter.main.js b/src/UI/templates/js/Input/Container/src/filter.main.js index f87b494da723..2004992b4620 100644 --- a/src/UI/templates/js/Input/Container/src/filter.main.js +++ b/src/UI/templates/js/Input/Container/src/filter.main.js @@ -58,8 +58,13 @@ var filter = function($) { $('.input-group .btn.btn-bulky').attr('data-placement', 'bottom'); //Hide Add-Button when all Input Fields are shown in the Filter at the beginning - var addable_inputs = $(".il-popover-container:hidden").length; - if (addable_inputs === 0) { + var empty_list = true; + var addable_inputs = $($filter).find(".il-filter-add-list").find("li").each(function() { + if ($(this).css("display") !== "none" && $(this).css("visibility") !== "hidden") { + empty_list = false; + } + }); + if (empty_list) { $(".btn-bulky").parents(".il-popover-container").hide(); } From e2a664d43c12c4cadd9a897cd7f13e90c7880c50 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 14 Nov 2023 17:42:17 +0100 Subject: [PATCH 123/497] Test: Fix String of Float Instead of Int as Key See: https://mantis.ilias.de/view.php?id=38773 --- Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php b/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php index 13248990d047..4930e280da33 100755 --- a/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php +++ b/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php @@ -169,7 +169,7 @@ public function getSolutionOutput( foreach ($this->object->answers as $answer) { $points_string_for_key = (string) $answer->getPoints(); if ($answer->getPoints() > 0) { - if (!array_key_exists($answer->getPoints(), $rank)) { + if (!array_key_exists($points_string_for_key, $rank)) { $rank[$points_string_for_key] = array(); } array_push($rank[$points_string_for_key], $answer->getAnswertext()); From c89236b2b2dd4b7a2df52f2f3fd4208b1b1a600a Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 14 Nov 2023 18:28:31 +0100 Subject: [PATCH 124/497] Test: Remove Access to Non-Existent Field See: https://mantis.ilias.de/view.php?id=38774 --- Modules/Test/classes/class.ilObjTestAccess.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Test/classes/class.ilObjTestAccess.php b/Modules/Test/classes/class.ilObjTestAccess.php index 9416774fb743..be9b54eae13f 100644 --- a/Modules/Test/classes/class.ilObjTestAccess.php +++ b/Modules/Test/classes/class.ilObjTestAccess.php @@ -220,7 +220,7 @@ public static function isFailed($user_id, $a_obj_id): bool if (!$result->numRows()) { $result = $ilDB->queryF( - "SELECT tst_pass_result.*, tst_tests.pass_scoring, tst_tests.random_test, tst_tests.test_id FROM tst_pass_result, tst_active, tst_tests WHERE tst_active.test_fi = tst_tests.test_id AND tst_active.user_fi = %s AND tst_tests.obj_fi = %s AND tst_pass_result.active_fi = tst_active.active_id ORDER BY tst_pass_result.pass", + "SELECT tst_pass_result.*, tst_tests.pass_scoring FROM tst_pass_result, tst_active, tst_tests WHERE tst_active.test_fi = tst_tests.test_id AND tst_active.user_fi = %s AND tst_tests.obj_fi = %s AND tst_pass_result.active_fi = tst_active.active_id ORDER BY tst_pass_result.pass", array('integer','integer'), array($user_id, $a_obj_id) ); From 115264be84189a8184cbcf7767ddfbae5fb0777e Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 14 Nov 2023 18:49:39 +0100 Subject: [PATCH 125/497] =?UTF-8?q?38589:=20Pre9=20Failed=20test:=20Fragen?= =?UTF-8?q?=20aus=20Pool=20einf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Survey/classes/class.ilObjSurvey.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Survey/classes/class.ilObjSurvey.php b/Modules/Survey/classes/class.ilObjSurvey.php index 69b33a5b046c..c575cafc9f26 100755 --- a/Modules/Survey/classes/class.ilObjSurvey.php +++ b/Modules/Survey/classes/class.ilObjSurvey.php @@ -2905,7 +2905,7 @@ public function getQuestionblocksTable( $questions_array[$key] = "$counter. $value"; $counter++; } - if (strlen($surveytitles[$row["obj_fi"]])) { // only questionpools which are not in trash + if (strlen($surveytitles[$row["obj_fi"]] ?? "")) { // only questionpools which are not in trash $rows[$row["questionblock_id"]] = array( "questionblock_id" => $row["questionblock_id"], "title" => $row["title"], From 3cdf73bc9026e6b2798867ad75c2b85b16c2f412 Mon Sep 17 00:00:00 2001 From: mjansen Date: Tue, 14 Nov 2023 20:22:52 +0100 Subject: [PATCH 126/497] Forum: Fix language for `CoPage` See: https://mantis.ilias.de/view.php?id=38448 (cherry picked from commit a7dddaf612d02354ca430443d7b4e9bc3db52981) --- .../CoPage/class.ilForumPageCommandForwarder.php | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Modules/Forum/classes/CoPage/class.ilForumPageCommandForwarder.php b/Modules/Forum/classes/CoPage/class.ilForumPageCommandForwarder.php index 3ad5764ce92d..a7bcce4ac3c4 100644 --- a/Modules/Forum/classes/CoPage/class.ilForumPageCommandForwarder.php +++ b/Modules/Forum/classes/CoPage/class.ilForumPageCommandForwarder.php @@ -37,6 +37,7 @@ class ilForumPageCommandForwarder implements ilForumObjectConstants * presentation mode for embedded presentation, e.g. in a kiosk mode */ public const PRESENTATION_MODE_EMBEDDED_PRESENTATION = 'PRESENTATION_MODE_EMBEDDED_PRESENTATION'; + public const DEFAULT_LANGUAGE = '-'; protected string $presentationMode = self::PRESENTATION_MODE_EDITING; protected ilCtrlInterface $ctrl; @@ -195,14 +196,11 @@ public function forward(string $ctrlLink = ''): string switch ($this->presentationMode) { case self::PRESENTATION_MODE_EDITING: - $pageObjectGui = $this->buildEditingPageObjectGUI(''); + $pageObjectGui = $this->buildEditingPageObjectGUI(self::DEFAULT_LANGUAGE); return (string) $this->ctrl->forwardCommand($pageObjectGui); case self::PRESENTATION_MODE_PRESENTATION: - $ot = ilObjectTranslation::getInstance($this->parentObject->getId()); - $language = $ot->getEffectiveContentLang($this->actor->getCurrentLanguage(), $this->parentObject->getType()); - - $pageObjectGUI = $this->buildPresentationPageObjectGUI($language); + $pageObjectGUI = $this->buildPresentationPageObjectGUI(self::DEFAULT_LANGUAGE); if (is_string($ctrlLink) && $ctrlLink !== '') { $pageObjectGUI->setFileDownloadLink($ctrlLink . '&cmd=' . self::UI_CMD_COPAGE_DOWNLOAD_FILE); @@ -213,10 +211,7 @@ public function forward(string $ctrlLink = ''): string return $this->ctrl->getHTML($pageObjectGUI); case self::PRESENTATION_MODE_EMBEDDED_PRESENTATION: - $ot = ilObjectTranslation::getInstance($this->parentObject->getId()); - $language = $ot->getEffectiveContentLang($this->actor->getCurrentLanguage(), $this->parentObject->getType()); - - $pageObjectGUI = $this->buildEmbeddedPresentationPageObjectGUI($language); + $pageObjectGUI = $this->buildEmbeddedPresentationPageObjectGUI(self::DEFAULT_LANGUAGE); if (is_string($ctrlLink) && $ctrlLink !== '') { $pageObjectGUI->setFileDownloadLink($ctrlLink . '&cmd=' . self::UI_CMD_COPAGE_DOWNLOAD_FILE); From bf1f1acc5b84771fa0bd9e153e65d3ca2e542b4e Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Wed, 15 Nov 2023 08:18:56 +0100 Subject: [PATCH 127/497] User: Remove Unnecessary Check --- Services/User/classes/class.ilObjUserFolderGUI.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Services/User/classes/class.ilObjUserFolderGUI.php b/Services/User/classes/class.ilObjUserFolderGUI.php index f4b94ff5c605..ba4d68a026d6 100755 --- a/Services/User/classes/class.ilObjUserFolderGUI.php +++ b/Services/User/classes/class.ilObjUserFolderGUI.php @@ -4021,13 +4021,6 @@ protected function mailObject(): void $umail = new ilFormatMail($ilUser->getId()); $mail_data = $umail->getSavedData(); - if (!is_array($mail_data)) { - $mail_data = array("user_id" => $ilUser->getId()); - } - - // ??? - // $mail_data = $umail->appendSearchResult(array('#il_ml_'.$list_id), 'to'); - $umail->savePostData( $mail_data['user_id'], $mail_data['attachments'], From ba7fe708f5d57d650dcecc8eda44ebcb00a37ba8 Mon Sep 17 00:00:00 2001 From: mjansen Date: Wed, 15 Nov 2023 08:23:40 +0100 Subject: [PATCH 128/497] Mail: Fix potential non-array value for attachments --- Services/Mail/classes/class.ilMail.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Services/Mail/classes/class.ilMail.php b/Services/Mail/classes/class.ilMail.php index 10a3c36e5288..107e8eb749e9 100755 --- a/Services/Mail/classes/class.ilMail.php +++ b/Services/Mail/classes/class.ilMail.php @@ -384,7 +384,8 @@ protected function fetchMailData(?array $row): ?array } if (isset($row['attachments'])) { - $row['attachments'] = unserialize(stripslashes($row['attachments']), ['allowed_classes' => false]); + $unserialized = unserialize(stripslashes($row['attachments']), ['allowed_classes' => false]); + $row['attachments'] = is_array($unserialized) ? $unserialized : []; } else { $row['attachments'] = []; } From 11ad6850f83f850fbadf00b07205c8d755a9bd1d Mon Sep 17 00:00:00 2001 From: mjansen Date: Wed, 15 Nov 2023 08:36:32 +0100 Subject: [PATCH 129/497] Mail: Fix potential non-array value for attachments --- Services/Mail/classes/class.ilMail.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Services/Mail/classes/class.ilMail.php b/Services/Mail/classes/class.ilMail.php index 107e8eb749e9..f5feb3fff6ee 100755 --- a/Services/Mail/classes/class.ilMail.php +++ b/Services/Mail/classes/class.ilMail.php @@ -417,6 +417,13 @@ protected function fetchMailData(?array $row): ?array $row['use_placeholders'] = (bool) $row['use_placeholders']; } + $null_to_string_properties = ['m_subject', 'm_message', 'rcp_to', 'rcp_cc', 'rcp_bcc']; + foreach ($null_to_string_properties as $null_to_string_property) { + if (!isset($row[$null_to_string_property])) { + $row[$null_to_string_property] = ''; + } + } + return $row; } From b06a56549110b2ac1b9438922069bd2efc493722 Mon Sep 17 00:00:00 2001 From: mjansen Date: Wed, 15 Nov 2023 08:48:36 +0100 Subject: [PATCH 130/497] Mail: Rename public methods for staged data --- Services/Contact/classes/class.ilContactGUI.php | 6 +++--- Services/Contact/classes/class.ilMailSearchGUI.php | 4 ++-- .../Contact/classes/class.ilMailSearchObjectGUI.php | 10 +++++----- Services/Contact/classes/class.ilMailingListsGUI.php | 4 ++-- Services/Mail/classes/class.ilMail.php | 8 ++++---- Services/Mail/classes/class.ilMailAttachmentGUI.php | 4 ++-- Services/Mail/classes/class.ilMailFormGUI.php | 12 ++++++------ Services/Mail/test/ilMailTest.php | 4 ++-- Services/User/classes/class.ilObjUserFolderGUI.php | 4 ++-- webservice/soap/classes/class.ilSoapUtils.php | 2 +- 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Services/Contact/classes/class.ilContactGUI.php b/Services/Contact/classes/class.ilContactGUI.php index f8dcbe3806a5..0e0f6e2ded71 100644 --- a/Services/Contact/classes/class.ilContactGUI.php +++ b/Services/Contact/classes/class.ilContactGUI.php @@ -79,7 +79,7 @@ public function executeCommand(): bool $forward_class = $this->ctrl->getNextClass($this); - $this->umail->savePostData($this->user->getId(), [], '', '', '', '', '', false); + $this->umail->persistToStage($this->user->getId(), [], '', '', '', '', '', false); switch (strtolower($forward_class)) { case strtolower(ilMailSearchCoursesGUI::class): @@ -408,7 +408,7 @@ protected function mailToUsers(): void } $logins = []; - $mail_data = $this->umail->getSavedData(); + $mail_data = $this->umail->retrieveFromStage(); foreach ($usr_ids as $usr_id) { $login = ilObjUser::_lookupLogin($usr_id); if (!$this->umail->existsRecipient($login, (string) $mail_data['rcp_to'])) { @@ -419,7 +419,7 @@ protected function mailToUsers(): void if ($logins !== []) { $mail_data = $this->umail->appendSearchResult($logins, 'to'); - $this->umail->savePostData( + $this->umail->persistToStage( (int) $mail_data['user_id'], $mail_data['attachments'], $mail_data['rcp_to'], diff --git a/Services/Contact/classes/class.ilMailSearchGUI.php b/Services/Contact/classes/class.ilMailSearchGUI.php index 095058978282..4e7105b08474 100644 --- a/Services/Contact/classes/class.ilMailSearchGUI.php +++ b/Services/Contact/classes/class.ilMailSearchGUI.php @@ -130,8 +130,8 @@ public function adopt(): void private function saveMailData(): void { - $mail_data = $this->umail->getSavedData(); - $this->umail->savePostData( + $mail_data = $this->umail->retrieveFromStage(); + $this->umail->persistToStage( (int) $mail_data['user_id'], $mail_data['attachments'], $mail_data['rcp_to'], diff --git a/Services/Contact/classes/class.ilMailSearchObjectGUI.php b/Services/Contact/classes/class.ilMailSearchObjectGUI.php index eef78369edfe..276df86d7785 100644 --- a/Services/Contact/classes/class.ilMailSearchObjectGUI.php +++ b/Services/Contact/classes/class.ilMailSearchObjectGUI.php @@ -260,7 +260,7 @@ protected function mail(): void protected function mailObjects(): void { $members = []; - $mail_data = $this->umail->getSavedData(); + $mail_data = $this->umail->retrieveFromStage(); $obj_ids = []; if ($this->http->wrapper()->query()->has('search_' . $this->getObjectType())) { @@ -301,9 +301,9 @@ protected function mailObjects(): void } } - $mail_data = $members !== [] ? $this->umail->appendSearchResult(array_unique($members), 'to') : $this->umail->getSavedData(); + $mail_data = $members !== [] ? $this->umail->appendSearchResult(array_unique($members), 'to') : $this->umail->retrieveFromStage(); - $this->umail->savePostData( + $this->umail->persistToStage( (int) $mail_data['user_id'], $mail_data['attachments'], $mail_data['rcp_to'], @@ -337,7 +337,7 @@ public function mailMembers(): void ); } - $mail_data = $this->umail->getSavedData(); + $mail_data = $this->umail->retrieveFromStage(); foreach ($usr_ids as $usr_id) { $login = ilObjUser::_lookupLogin($usr_id); if (!$this->umail->existsRecipient($login, (string) $mail_data['rcp_to'])) { @@ -346,7 +346,7 @@ public function mailMembers(): void } $mail_data = $this->umail->appendSearchResult(array_unique($members), 'to'); - $this->umail->savePostData( + $this->umail->persistToStage( (int) $mail_data['user_id'], $mail_data['attachments'], $mail_data['rcp_to'], diff --git a/Services/Contact/classes/class.ilMailingListsGUI.php b/Services/Contact/classes/class.ilMailingListsGUI.php index 6883aa81b39e..5ee7137298d1 100644 --- a/Services/Contact/classes/class.ilMailingListsGUI.php +++ b/Services/Contact/classes/class.ilMailingListsGUI.php @@ -195,7 +195,7 @@ public function mailToList(): bool return true; } - $mail_data = $this->umail->getSavedData(); + $mail_data = $this->umail->retrieveFromStage(); $lists = []; foreach ($ml_ids as $id) { if ($this->mlists->isOwner($id, $this->user->getId()) && @@ -206,7 +206,7 @@ public function mailToList(): bool if (count($lists)) { $mail_data = $this->umail->appendSearchResult(array_values($lists), 'to'); - $this->umail->savePostData( + $this->umail->persistToStage( (int) $mail_data['user_id'], $mail_data['attachments'], $mail_data['rcp_to'], diff --git a/Services/Mail/classes/class.ilMail.php b/Services/Mail/classes/class.ilMail.php index f5feb3fff6ee..9a028113ea4f 100755 --- a/Services/Mail/classes/class.ilMail.php +++ b/Services/Mail/classes/class.ilMail.php @@ -969,7 +969,7 @@ protected function checkRecipients(string $recipients): array * @param array|null $a_tpl_ctx_params * @return bool */ - public function savePostData( + public function persistToStage( int $a_user_id, array $a_attachments, string $a_rcp_to, @@ -999,12 +999,12 @@ public function savePostData( ] ); - $this->getSavedData(); + $this->retrieveFromStage(); return true; } - public function getSavedData(): array + public function retrieveFromStage(): array { $res = $this->db->queryF( "SELECT * FROM $this->table_mail_saved WHERE user_id = %s", @@ -1014,7 +1014,7 @@ public function getSavedData(): array $this->mail_data = $this->fetchMailData($this->db->fetchAssoc($res)); if (!is_array($this->mail_data)) { - $this->savePostData($this->user_id, [], '', '', '', '', '', false); + $this->persistToStage($this->user_id, [], '', '', '', '', '', false); } return $this->mail_data; diff --git a/Services/Mail/classes/class.ilMailAttachmentGUI.php b/Services/Mail/classes/class.ilMailAttachmentGUI.php index e64b2ace0243..f943140ad66e 100644 --- a/Services/Mail/classes/class.ilMailAttachmentGUI.php +++ b/Services/Mail/classes/class.ilMailAttachmentGUI.php @@ -180,7 +180,7 @@ public function confirmDeleteAttachments(): void if ($error !== '') { $this->tpl->setOnScreenMessage('failure', $this->lng->txt('mail_error_delete_file') . ' ' . $error); } else { - $mail_data = $this->umail->getSavedData(); + $mail_data = $this->umail->retrieveFromStage(); if (is_array($mail_data['attachments'])) { $tmp = []; foreach ($mail_data['attachments'] as $attachment) { @@ -244,7 +244,7 @@ public function showAttachments(): void $table = new ilMailAttachmentTableGUI($this, 'showAttachments'); - $mail_data = $this->umail->getSavedData(); + $mail_data = $this->umail->retrieveFromStage(); $files = $this->mfile->getUserFilesData(); $data = []; $counter = 0; diff --git a/Services/Mail/classes/class.ilMailFormGUI.php b/Services/Mail/classes/class.ilMailFormGUI.php index 599e56b3a811..79dbcbf4dfd3 100644 --- a/Services/Mail/classes/class.ilMailFormGUI.php +++ b/Services/Mail/classes/class.ilMailFormGUI.php @@ -205,7 +205,7 @@ public function sendMessage(): void $this->requestAttachments = $files; $this->showSubmissionErrors($errors); } else { - $mailer->savePostData( + $mailer->persistToStage( $this->user->getId(), [], '', @@ -307,7 +307,7 @@ public function searchUsers(bool $save = true): void ); // Note: For security reasons, ILIAS only allows Plain text strings in E-Mails. - $this->umail->savePostData( + $this->umail->persistToStage( $this->user->getId(), $files, ilUtil::securePlainString($this->getBodyParam('rcp_to', $this->refinery->kindlyTo()->string(), '')), @@ -409,7 +409,7 @@ public function editAttachments(): void ); // Note: For security reasons, ILIAS only allows Plain text strings in E-Mails. - $this->umail->savePostData( + $this->umail->persistToStage( $this->user->getId(), $files, ilUtil::securePlainString($this->getBodyParam('rcp_to', $this->refinery->kindlyTo()->string(), '')), @@ -533,7 +533,7 @@ public function showForm(): void break; case self::MAIL_FORM_TYPE_SEARCH_RESULT: - $mailData = $this->umail->getSavedData(); + $mailData = $this->umail->retrieveFromStage(); if (ilSession::get('mail_search_results_to')) { $mailData = $this->umail->appendSearchResult( @@ -566,7 +566,7 @@ public function showForm(): void break; case self::MAIL_FORM_TYPE_ATTACH: - $mailData = $this->umail->getSavedData(); + $mailData = $this->umail->retrieveFromStage(); break; case self::MAIL_FORM_TYPE_DRAFT: @@ -932,7 +932,7 @@ protected function saveMailBeforeSearch(): void [] ); - $this->umail->savePostData( + $this->umail->persistToStage( $this->user->getId(), $files, ilUtil::securePlainString($this->getBodyParam('rcp_to', $this->refinery->kindlyTo()->string(), '')), diff --git a/Services/Mail/test/ilMailTest.php b/Services/Mail/test/ilMailTest.php index 99765cea1b71..de45307d3b4f 100644 --- a/Services/Mail/test/ilMailTest.php +++ b/Services/Mail/test/ilMailTest.php @@ -430,7 +430,7 @@ public function testSavePostData(): void 'rcp_to' => 'phpunit' ]); - $instance->savePostData( + $instance->persistToStage( 78979078, $attachments, $rcpTo, @@ -454,7 +454,7 @@ public function testGetSavedData(): void 'rcp_to' => 'phpunit' ]); - $mail_data = $instance->getSavedData(); + $mail_data = $instance->retrieveFromStage(); $this->assertIsArray($mail_data); $this->assertEquals('phpunit', $mail_data['rcp_to']); diff --git a/Services/User/classes/class.ilObjUserFolderGUI.php b/Services/User/classes/class.ilObjUserFolderGUI.php index ba4d68a026d6..a569b32fb36e 100755 --- a/Services/User/classes/class.ilObjUserFolderGUI.php +++ b/Services/User/classes/class.ilObjUserFolderGUI.php @@ -4019,9 +4019,9 @@ protected function mailObject(): void } $umail = new ilFormatMail($ilUser->getId()); - $mail_data = $umail->getSavedData(); + $mail_data = $umail->retrieveFromStage(); - $umail->savePostData( + $umail->persistToStage( $mail_data['user_id'], $mail_data['attachments'], '#il_ml_' . $list_id, diff --git a/webservice/soap/classes/class.ilSoapUtils.php b/webservice/soap/classes/class.ilSoapUtils.php index ff816bbf0372..d329c4182b27 100644 --- a/webservice/soap/classes/class.ilSoapUtils.php +++ b/webservice/soap/classes/class.ilSoapUtils.php @@ -105,7 +105,7 @@ public function distributeMails(string $sid, string $a_mail_xml) foreach ($attachments as $att) { $file->unlinkFile($att); } - $mail_obj->savePostData( + $mail_obj->persistToStage( $ilUser->getId(), [], '', From 6d7f6b46f20161ad41672c2cdaa1b20b47f5c3da Mon Sep 17 00:00:00 2001 From: Tim Schmitz <104776863+schmitz-ilias@users.noreply.github.com> Date: Wed, 15 Nov 2023 08:58:50 +0100 Subject: [PATCH 131/497] AdvMD/Wiki: fix updating page lists on reordering select options (#6596) Thanks. This fixes the reordering issue on my installation. I will check 7, too. --- .../Wiki/classes/class.ilPCAMDPageList.php | 43 +++++++++++-------- Services/AdvancedMetaData/ROADMAP.md | 11 +++++ ...lass.ilAdvancedMDFieldDefinitionSelect.php | 17 +++++--- 3 files changed, 45 insertions(+), 26 deletions(-) create mode 100644 Services/AdvancedMetaData/ROADMAP.md diff --git a/Modules/Wiki/classes/class.ilPCAMDPageList.php b/Modules/Wiki/classes/class.ilPCAMDPageList.php index 55384e99e107..9f350a5d7dcf 100644 --- a/Modules/Wiki/classes/class.ilPCAMDPageList.php +++ b/Modules/Wiki/classes/class.ilPCAMDPageList.php @@ -268,14 +268,14 @@ public function modifyPageContentPostXsl( } /** - * Migrate search/filter values on advmd change + * Migrate search/filter values on advmd change. In the mapping, keys are + * indices of old options, and values indices of associated new options. + * @param int $a_field_id + * @param string[] $mapping */ public static function migrateField( - int $a_obj_id, int $a_field_id, - string $old_option, - string $new_option, - bool $a_is_multi = false + array $mapping ): void { global $DIC; @@ -287,24 +287,29 @@ public static function migrateField( " WHERE field_id = " . $ilDB->quote($a_field_id, "integer")); while ($row = $ilDB->fetchAssoc($set)) { $data = unserialize(unserialize($row["sdata"], ["allowed_classes" => false]), ["allowed_classes" => false]); - if (is_array($data) && - in_array($old_option, $data)) { + if (!is_array($data)) { + continue; + } + $updated_data = $data; + foreach ($mapping as $old_option => $new_option) { + if (!in_array($old_option, $data)) { + continue; + } $idx = array_search($old_option, $data); - if ($new_option) { - $data[$idx] = $new_option; + if ($new_option !== '') { + $updated_data[$idx] = $new_option; } else { - unset($data[$idx]); + unset($updated_data[$idx]); } - - $fields = array( - "sdata" => array("text", serialize(serialize($data))) - ); - $primary = array( - "id" => array("integer", $row["id"]), - "field_id" => array("integer", $row["field_id"]) - ); - $ilDB->update("pg_amd_page_list", $fields, $primary); } + $fields = array( + "sdata" => array("text", serialize(serialize($updated_data))) + ); + $primary = array( + "id" => array("integer", $row["id"]), + "field_id" => array("integer", $row["field_id"]) + ); + $ilDB->update("pg_amd_page_list", $fields, $primary); } } } diff --git a/Services/AdvancedMetaData/ROADMAP.md b/Services/AdvancedMetaData/ROADMAP.md new file mode 100644 index 000000000000..994ad9dfb8e0 --- /dev/null +++ b/Services/AdvancedMetaData/ROADMAP.md @@ -0,0 +1,11 @@ +# Roadmap + +## Short Term + +## Mid Term + +Enum entries (for select and multiselect fields) should get an actual ID. +The current ID acts more like a ordering parameter, which makes mapping entries +during editing of the fields unnecessarily tedious and error prone. + +## Long Term diff --git a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionSelect.php b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionSelect.php index 9cbedba3fa98..d98df9613492 100644 --- a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionSelect.php +++ b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionSelect.php @@ -547,6 +547,8 @@ public function update(): void $search = ilADTFactory::getInstance()->getSearchBridgeForDefinitionInstance($def, false, true); ilADTFactory::initActiveRecordByType(); + $page_list_mappings = []; + foreach ($this->confirmed_objects as $old_option => $item_ids) { // get complete old values $old_values = array(); @@ -603,17 +605,18 @@ public function update(): void if ($sub_type == "wpg") { // #15763 - adapt advmd page lists - ilPCAMDPageList::migrateField( - (int) $obj_id, - $this->getFieldId(), - (string) $old_option, - (string) $new_option, - true - ); + $page_list_mappings[(string) $old_option] = (string) $new_option; } } } + if (!empty($page_list_mappings)) { + ilPCAMDPageList::migrateField( + $this->getFieldId(), + $page_list_mappings + ); + } + $this->confirmed_objects = array(); } From 80f3d6daa35bcbb6b1668aab2a303775d7a9d264 Mon Sep 17 00:00:00 2001 From: mjansen Date: Wed, 15 Nov 2023 08:59:17 +0100 Subject: [PATCH 132/497] Mail: Fix tests --- Services/Mail/test/ilMailTest.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Services/Mail/test/ilMailTest.php b/Services/Mail/test/ilMailTest.php index de45307d3b4f..ee98a29e2c9b 100644 --- a/Services/Mail/test/ilMailTest.php +++ b/Services/Mail/test/ilMailTest.php @@ -262,7 +262,15 @@ public function testGetMailsOfFolder(): void { $filter = ['status' => 'yes']; $rowData = ['mail_id' => 8908]; - $one = $rowData + ['attachments' => [], 'tpl_ctx_params' => []]; + $one = $rowData + [ + 'attachments' => [], + 'tpl_ctx_params' => [], + 'm_subject' => '', + 'm_message' => '', + 'rcp_to' => '', + 'rcp_cc' => '', + 'rcp_bcc' => '', + ]; $expected = [$one, $one]; $folderId = 89; $userId = 901; From cc82c7fc7d5020994554571a0acc630da999dfb2 Mon Sep 17 00:00:00 2001 From: mjansen Date: Wed, 15 Nov 2023 09:02:34 +0100 Subject: [PATCH 133/497] Mail: PSR-12 --- Services/Mail/classes/class.ilMail.php | 2 +- Services/Mail/classes/class.ilMailFolderTableGUI.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/Mail/classes/class.ilMail.php b/Services/Mail/classes/class.ilMail.php index 9a028113ea4f..389e355ed5c4 100755 --- a/Services/Mail/classes/class.ilMail.php +++ b/Services/Mail/classes/class.ilMail.php @@ -385,7 +385,7 @@ protected function fetchMailData(?array $row): ?array if (isset($row['attachments'])) { $unserialized = unserialize(stripslashes($row['attachments']), ['allowed_classes' => false]); - $row['attachments'] = is_array($unserialized) ? $unserialized : []; + $row['attachments'] = is_array($unserialized) ? $unserialized : []; } else { $row['attachments'] = []; } diff --git a/Services/Mail/classes/class.ilMailFolderTableGUI.php b/Services/Mail/classes/class.ilMailFolderTableGUI.php index e1b642e02ec4..8fabbf920d62 100644 --- a/Services/Mail/classes/class.ilMailFolderTableGUI.php +++ b/Services/Mail/classes/class.ilMailFolderTableGUI.php @@ -479,7 +479,7 @@ protected function fetchTableData(): self ); } else { $mail['img_sender'] = ''; - $mail['from'] = $mail['mail_login'] = trim(($mail['import_name'] ?? ''). ' (' + $mail['from'] = $mail['mail_login'] = trim(($mail['import_name'] ?? '') . ' (' . $this->lng->txt('user_deleted') . ')'); } } From fa92d9dc5cefd5389944570e241516cf8b78a615 Mon Sep 17 00:00:00 2001 From: mjansen Date: Wed, 15 Nov 2023 09:04:22 +0100 Subject: [PATCH 134/497] Mail: Rename tests --- Services/Mail/test/ilMailTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/Mail/test/ilMailTest.php b/Services/Mail/test/ilMailTest.php index ee98a29e2c9b..b8b5ca325456 100644 --- a/Services/Mail/test/ilMailTest.php +++ b/Services/Mail/test/ilMailTest.php @@ -403,7 +403,7 @@ public function testUpdateDraft(): void $this->assertSame($draftId, $instance->updateDraft($folderId, [], $to, $cc, $bcc, $subject, $message, $draftId, $usePlaceholders, $contextId, $params)); } - public function testSavePostData(): void + public function testPersistingToStage(): void { $userId = 897; $attachments = []; @@ -452,7 +452,7 @@ public function testSavePostData(): void ); } - public function testGetSavedData(): void + public function testRetrievalFromStage(): void { $userId = 789; $instance = $this->create(67, $userId); From d19478cf450d95dd06e2788144f2f8b240ac14c4 Mon Sep 17 00:00:00 2001 From: Marvin Beym Date: Wed, 16 Aug 2023 10:23:48 +0200 Subject: [PATCH 135/497] Default certificate background image versioning --- ...ss.ilCertificateSettingsFormRepository.php | 31 ++-- ...class.ilCertificateDatabaseUpdateSteps.php | 21 ++- .../Clone/class.ilCertificateCloneAction.php | 17 ++- ...lass.ilCertificateTemplateDeleteAction.php | 26 +--- ...lCertificateTemplateDatabaseRepository.php | 54 ++++++- .../class.ilUserCertificateRepository.php | 27 +++- .../classes/class.ilCertificateGUI.php | 11 +- .../class.ilObjCertificateSettings.php | 135 +++++++++++------- .../class.ilObjCertificateSettingsAccess.php | 49 +------ .../test/ilCertificateCloneActionTest.php | 9 +- .../ilCertificateTemplateDeleteActionTest.php | 55 +------ 11 files changed, 235 insertions(+), 200 deletions(-) diff --git a/Services/Certificate/classes/Form/Repository/class.ilCertificateSettingsFormRepository.php b/Services/Certificate/classes/Form/Repository/class.ilCertificateSettingsFormRepository.php index 996300f212bb..67b25309a4b0 100644 --- a/Services/Certificate/classes/Form/Repository/class.ilCertificateSettingsFormRepository.php +++ b/Services/Certificate/classes/Form/Repository/class.ilCertificateSettingsFormRepository.php @@ -1,7 +1,5 @@ toolbar = $toolbar; $this->placeholderDescriptionObject = $placeholderDescriptionObject; $this->hasAdditionalElements = $hasAdditionalElements; + $this->global_certificate_settings = new ilObjCertificateSettings(); $database = $DIC->database(); @@ -206,22 +208,31 @@ public function createForm(ilCertificateGUI $certificateGUI): ilPropertyFormGUI $bgimage->setAllowDeletion(true); if (!$this->backGroundImageFileService->hasBackgroundImage($certificateTemplate)) { - if (ilObjCertificateSettingsAccess::hasBackgroundImage()) { + if ($this->global_certificate_settings->hasBackgroundImage()) { ilWACSignedPath::setTokenMaxLifetimeInSeconds(15); - $imagePath = ilWACSignedPath::signFile(ilObjCertificateSettingsAccess::getBackgroundImageThumbPathWeb()); + $imagePath = ilWACSignedPath::signFile($this->global_certificate_settings->getBackgroundImageThumbPathWeb()); $bgimage->setImage($imagePath); $bgimage->setAllowDeletion(false); } } else { ilWACSignedPath::setTokenMaxLifetimeInSeconds(15); - $thumbnailPath = $this->backGroundImageFileService->getBackgroundImageThumbPath(); - - if (!is_file($thumbnailPath)) { - $thumbnailPath = ilObjCertificateSettingsAccess::getBackgroundImageThumbPath(); - $bgimage->setAllowDeletion(false); + $thumbnail_path = $this->backGroundImageFileService->getBackgroundImageThumbPath(); + + if (!is_file($thumbnail_path)) { + //Trying if it uses default image path + $thumbnail_path = CLIENT_WEB_DIR . $certificateTemplate->getBackgroundImagePath() . '.thumb.jpg'; + if (!is_file($thumbnail_path)) { + //Trying to use global default image + $thumbnail_path = $this->global_certificate_settings->getDefaultBackgroundImageThumbPath(); + if (!is_file($thumbnail_path)) { + //No image global default configured + $thumbnail_path = ''; + } + } + $bgimage->setALlowDeletion(false); } - $imagePath = ilWACSignedPath::signFile($thumbnailPath); + $imagePath = ilWACSignedPath::signFile($thumbnail_path); $bgimage->setImage($imagePath); } diff --git a/Services/Certificate/classes/Setup/class.ilCertificateDatabaseUpdateSteps.php b/Services/Certificate/classes/Setup/class.ilCertificateDatabaseUpdateSteps.php index b79b86d6cb6c..13c537e50380 100644 --- a/Services/Certificate/classes/Setup/class.ilCertificateDatabaseUpdateSteps.php +++ b/Services/Certificate/classes/Setup/class.ilCertificateDatabaseUpdateSteps.php @@ -1,7 +1,5 @@ db->renameTableColumn('il_cert_user_cert', 'user_id', 'usr_id'); } } + + public function step_5(): void + { + if ( + $this->db->tableExists('il_cert_template') + && !$this->db->indexExistsByFields('il_cert_template', ['obj_id', 'background_image_path']) + ) { + $this->db->addIndex('il_cert_template', ['background_image_path', 'currently_active'], 'i5'); + } + + if ( + $this->db->tableExists('il_cert_user_cert') + && !$this->db->indexExistsByFields('il_cert_user_cert', ['obj_id', 'background_image_path']) + ) { + $this->db->addIndex('il_cert_user_cert', ['background_image_path', 'currently_active'], 'i7'); + } + } } diff --git a/Services/Certificate/classes/Template/Action/Clone/class.ilCertificateCloneAction.php b/Services/Certificate/classes/Template/Action/Clone/class.ilCertificateCloneAction.php index 332ef09e556e..e7f5728d5208 100644 --- a/Services/Certificate/classes/Template/Action/Clone/class.ilCertificateCloneAction.php +++ b/Services/Certificate/classes/Template/Action/Clone/class.ilCertificateCloneAction.php @@ -1,7 +1,5 @@ objectHelper = $objectHelper; + if (!$global_certificate_settings) { + $global_certificate_settings = new ilObjCertificateSettings(); + } + $this->global_certificate_settings = $global_certificate_settings; + if (null === $global_certificate_path) { - $global_certificate_path = str_replace( - '[CLIENT_WEB_DIR]', - '', - ilObjCertificateSettingsAccess::getBackgroundImagePath(true) - ); + $global_certificate_path = $this->global_certificate_settings->getDefaultBackgroundImagePath(true); } $this->global_certificate_path = $global_certificate_path; diff --git a/Services/Certificate/classes/Template/Action/Delete/class.ilCertificateTemplateDeleteAction.php b/Services/Certificate/classes/Template/Action/Delete/class.ilCertificateTemplateDeleteAction.php index 2afeed16938d..39711559e194 100644 --- a/Services/Certificate/classes/Template/Action/Delete/class.ilCertificateTemplateDeleteAction.php +++ b/Services/Certificate/classes/Template/Action/Delete/class.ilCertificateTemplateDeleteAction.php @@ -1,7 +1,5 @@ */ @@ -75,27 +75,5 @@ public function delete(int $templateId, int $objectId): void ); $this->templateRepository->save($certificateTemplate); - - $this->overwriteBackgroundImageThumbnail($certificateTemplate); - } - - private function overwriteBackgroundImageThumbnail(ilCertificateTemplate $previousTemplate): void - { - $relativePath = $previousTemplate->getBackgroundImagePath(); - - if ('' === $relativePath) { - $relativePath = '/certificates/default/background.jpg'; - } - - $pathInfo = pathinfo($relativePath); - - $newFilePath = $pathInfo['dirname'] . '/background.jpg.thumb.jpg'; - - $this->utilHelper->convertImage( - $this->rootDirectory . $relativePath, - $this->rootDirectory . $newFilePath, - 'JPEG', - "100" - ); } } diff --git a/Services/Certificate/classes/Template/class.ilCertificateTemplateDatabaseRepository.php b/Services/Certificate/classes/Template/class.ilCertificateTemplateDatabaseRepository.php index da6dd94ce666..fe6e89f2813f 100644 --- a/Services/Certificate/classes/Template/class.ilCertificateTemplateDatabaseRepository.php +++ b/Services/Certificate/classes/Template/class.ilCertificateTemplateDatabaseRepository.php @@ -1,7 +1,5 @@ * Repository that allows interaction with the database @@ -392,6 +392,56 @@ private function deactivatePreviousTemplates(int $objId): void $this->logger->debug(sprintf('END - Certificate template deactivated for object: "%s"', $objId)); } + public function updateDefaultBackgroundImagePaths(string $old_relative_path, string $new_relative_path): void + { + $this->logger->debug(sprintf( + 'START - Update all default background image paths from "%s" to "%s"', + $old_relative_path, + $new_relative_path + )); + + $affected_rows = $this->database->manipulateF( + 'UPDATE il_cert_template SET background_image_path = %s WHERE currently_active = 1 AND (background_image_path = %s OR background_image_path = %s )', + [ + 'text', + 'text', + 'text' + ], + [ + $new_relative_path, + $old_relative_path, + '/certificates/default/background.jpg'] + ); + + $this->logger->debug(sprintf( + 'END - Updated %s certificate templates using old path', + $affected_rows + )); + } + + public function isBackgroundImageUsed(string $relative_image_path): bool + { + $this->logger->debug(sprintf( + 'START - Checking if any certificate template uses background image path "%s"', + $relative_image_path + )); + + $result = $this->database->queryF( + 'SELECT EXISTS(SELECT 1 FROM il_cert_template WHERE background_image_path = %s AND currently_active = 1) AS does_exist', + ['text'], + [$relative_image_path] + ); + + $exists = (bool) ($this->database->fetchAssoc($result)['does_exist'] ?? false); + + $this->logger->debug(sprintf( + 'END - Image path "%s" is ' . $exists ? "in use" : "unused", + $relative_image_path + )); + + return $exists; + } + /** * @param array $row * @return ilCertificateTemplate diff --git a/Services/Certificate/classes/User/class.ilUserCertificateRepository.php b/Services/Certificate/classes/User/class.ilUserCertificateRepository.php index c1f060205453..e712e2f8ee44 100644 --- a/Services/Certificate/classes/User/class.ilUserCertificateRepository.php +++ b/Services/Certificate/classes/User/class.ilUserCertificateRepository.php @@ -1,7 +1,5 @@ */ @@ -583,6 +583,29 @@ private function deactivatePreviousCertificates(int $objId, int $userId): void )); } + public function isBackgroundImageUsed(string $relative_image_path): bool + { + $this->logger->debug(sprintf( + 'START - Checking if any certificate template uses background image path "%s"', + $relative_image_path + )); + + $result = $this->database->queryF( + 'SELECT EXISTS(SELECT 1 FROM il_cert_user_cert WHERE background_image_path = %s AND currently_active = 1) AS does_exist', + ['text'], + [$relative_image_path] + ); + + $exists = (bool) ($this->database->fetchAssoc($result)['does_exist'] ?? false); + + $this->logger->debug(sprintf( + 'END - Image path "%s" is ' . $exists ? "in use" : "unused", + $relative_image_path + )); + + return $exists; + } + /** * @param array $row * @return ilUserCertificate diff --git a/Services/Certificate/classes/class.ilCertificateGUI.php b/Services/Certificate/classes/class.ilCertificateGUI.php index c1cf51bf7ecd..9851acf75387 100644 --- a/Services/Certificate/classes/class.ilCertificateGUI.php +++ b/Services/Certificate/classes/class.ilCertificateGUI.php @@ -1,7 +1,5 @@ access = $DIC['ilAccess']; $this->toolbar = $DIC['ilToolbar']; + $this->global_certificate_settings = new ilObjCertificateSettings(); + $this->lng->loadLanguageModule('certificate'); $this->lng->loadLanguageModule('cert'); $this->lng->loadLanguageModule("trac"); @@ -462,8 +465,8 @@ private function saveCertificate(ilPropertyFormGUI $form, array $form_fields, $o } if ($backgroundImagePath === '') { if ($backgroundDelete || $previousCertificateTemplate->getBackgroundImagePath() === '') { - $globalBackgroundImagePath = ilObjCertificateSettingsAccess::getBackgroundImagePath(true); - $backgroundImagePath = str_replace('[CLIENT_WEB_DIR]', '', $globalBackgroundImagePath); + $backgroundImagePath = $this->global_certificate_settings->getDefaultBackgroundImagePath(true); + } else { $backgroundImagePath = $previousCertificateTemplate->getBackgroundImagePath(); } diff --git a/Services/Certificate/classes/class.ilObjCertificateSettings.php b/Services/Certificate/classes/class.ilObjCertificateSettings.php index a27f6d87afa7..d4cca2a341a4 100644 --- a/Services/Certificate/classes/class.ilObjCertificateSettings.php +++ b/Services/Certificate/classes/class.ilObjCertificateSettings.php @@ -18,6 +18,9 @@ declare(strict_types=1); +use ILIAS\Data\UUID\Factory; +use ILIAS\FileUpload\DTO\UploadResult; + /** * Class ilObjCertificateSettings * @author Helmut Schottmüller @@ -27,14 +30,22 @@ class ilObjCertificateSettings extends ilObject { private ilLogger $cert_logger; + private Factory $uuid_factory; + private ilSetting $certificate_settings; + private ilCertificateTemplateDatabaseRepository $certificate_repo; + private ilUserCertificateRepository $user_certificate_repo; public function __construct(int $a_id = 0, bool $a_reference = true) { global $DIC; parent::__construct($a_id, $a_reference); - $this->type = "cert"; + $this->type = 'cert'; $this->cert_logger = $DIC->logger()->cert(); + $this->uuid_factory = new Factory(); + $this->certificate_settings = new ilSetting('certificate'); + $this->certificate_repo = new ilCertificateTemplateDatabaseRepository($DIC->database()); + $this->user_certificate_repo = new ilUserCertificateRepository($DIC->database()); } /** @@ -43,83 +54,95 @@ public function __construct(int $a_id = 0, bool $a_reference = true) * @return bool True on success, otherwise false * @throws ilException */ - public function uploadBackgroundImage(\ILIAS\FileUpload\DTO\UploadResult $upload_result): bool + public function uploadBackgroundImage(UploadResult $upload_result): bool { - $image_tempfilename = $upload_result->getPath(); - if ($image_tempfilename !== '') { + $image_temp_file_name = $upload_result->getPath(); + if ($image_temp_file_name !== '') { $extension = pathinfo($upload_result->getName(), PATHINFO_EXTENSION); + $image_path = $this->getBackgroundImageDefaultFolder(); + $new_image_file_name = "background_{$this->uuid_factory->uuid4AsString()}.jpg"; + $new_image_path = $image_path . $new_image_file_name; - $convert_filename = ilCertificateBackgroundImageFileService::BACKGROUND_IMAGE_NAME; - $imagepath = $this->getBackgroundImageDefaultFolder(); - if (!is_dir($imagepath)) { - ilFileUtils::makeDirParents($imagepath); + if (!is_dir($image_path)) { + ilFileUtils::makeDirParents($image_path); } // upload the file if (!ilFileUtils::moveUploadedFile( - $image_tempfilename, - basename($this->getDefaultBackgroundImageTempfilePath($extension)), - $this->getDefaultBackgroundImageTempfilePath($extension) + $image_temp_file_name, + basename($this->getDefaultBackgroundImageTempFilePath($extension)), + $this->getDefaultBackgroundImageTempFilePath($extension) )) { $this->cert_logger->error(sprintf( "Could not upload certificate background image from '%s' to temporary file '%s' (name: '%s')", - $image_tempfilename, - $this->getDefaultBackgroundImageTempfilePath($extension), - basename($this->getDefaultBackgroundImageTempfilePath($extension)) + $image_temp_file_name, + $this->getDefaultBackgroundImageTempFilePath($extension), + basename($this->getDefaultBackgroundImageTempFilePath($extension)) )); return false; } - if (!is_file($this->getDefaultBackgroundImageTempfilePath($extension))) { + if (!is_file($this->getDefaultBackgroundImageTempFilePath($extension))) { $this->cert_logger->error(sprintf( "Uploaded certificate background image could not be moved to temporary file '%s'", - $this->getDefaultBackgroundImageTempfilePath($extension) + $this->getDefaultBackgroundImageTempFilePath($extension) )); return false; } // convert the uploaded file to JPEG ilShellUtil::convertImage( - $this->getDefaultBackgroundImageTempfilePath($extension), - $this->getDefaultBackgroundImagePath(), + $this->getDefaultBackgroundImageTempFilePath($extension), + $new_image_path, 'JPEG' ); ilShellUtil::convertImage( - $this->getDefaultBackgroundImageTempfilePath($extension), - $this->getDefaultBackgroundImageThumbPath(), + $this->getDefaultBackgroundImageTempFilePath($extension), + $new_image_path . ilCertificateBackgroundImageFileService::BACKGROUND_THUMBNAIL_FILE_ENDING, 'JPEG', '100' ); - if (!is_file($this->getDefaultBackgroundImagePath())) { + if (!is_file($new_image_path) || !file_exists($new_image_path)) { // Something went wrong converting the file. Use the original file and hope, that PDF can work with it. $this->cert_logger->error(sprintf( - "Could not convert certificate background image from '%s' as JPEG to '%s', trying fallback ...", - $this->getDefaultBackgroundImageTempfilePath($extension), - $this->getDefaultBackgroundImagePath() + "Could not convert certificate background image from '%s' as JPEG to '%s', trying fallbacj ...", + $this->getDefaultBackgroundImageTempFilePath($extension), + $new_image_path )); if (!ilFileUtils::moveUploadedFile( - $this->getDefaultBackgroundImageTempfilePath($extension), - $convert_filename, - $this->getDefaultBackgroundImagePath() + $this->getDefaultBackgroundImageTempFilePath($extension), + $new_image_file_name, + $new_image_path )) { $this->cert_logger->error(sprintf( "Could not upload certificate background image from '%s' to final file '%s' (name: '%s')", - $this->getDefaultBackgroundImageTempfilePath($extension), - $this->getDefaultBackgroundImagePath(), - $convert_filename + $this->getDefaultBackgroundImageTempFilePath($extension), + $new_image_path, + $new_image_file_name )); return false; } } - unlink($this->getDefaultBackgroundImageTempfilePath($extension)); - if (is_file($this->getDefaultBackgroundImagePath()) && filesize($this->getDefaultBackgroundImagePath()) > 0) { + if ( + is_file($this->getDefaultBackgroundImageTempFilePath($extension)) + && file_exists($this->getDefaultBackgroundImageTempFilePath($extension)) + ) { + unlink($this->getDefaultBackgroundImageTempFilePath($extension)); + } + + if (file_exists($new_image_path) && (filesize($new_image_path) > 0)) { + $old_relative_path = $this->getDefaultBackgroundImagePath(true); + $this->certificate_settings->set('defaultImageFileName', $new_image_file_name); + $new_relative_path = $this->getDefaultBackgroundImagePath(true); + + $this->certificate_repo->updateDefaultBackgroundImagePaths($old_relative_path, $new_relative_path); return true; } $this->cert_logger->error(sprintf( "Final background image '%s' does not exist or is empty", - $this->getDefaultBackgroundImagePath() + $new_image_path )); } @@ -129,39 +152,53 @@ public function uploadBackgroundImage(\ILIAS\FileUpload\DTO\UploadResult $upload public function deleteBackgroundImage(): bool { $result = true; - if (is_file($this->getDefaultBackgroundImageThumbPath())) { - $result &= unlink($this->getDefaultBackgroundImageThumbPath()); - } - if (is_file($this->getDefaultBackgroundImagePath())) { - $result &= unlink($this->getDefaultBackgroundImagePath()); - } - foreach (ilCertificateBackgroundImageFileService::VALID_BACKGROUND_IMAGE_EXTENSIONS as $extension) { - if (file_exists($this->getDefaultBackgroundImageTempfilePath($extension))) { - $result &= unlink($this->getDefaultBackgroundImageTempfilePath($extension)); + + + if ( + $this->certificate_settings->get('defaultImageFileName', '') + && !$this->certificate_repo->isBackgroundImageUsed($this->getDefaultBackgroundImagePath(true)) + && !$this->user_certificate_repo->isBackgroundImageUsed($this->getDefaultBackgroundImagePath(true)) + ) { + //No certificates exist using the currently configured file, deleting file possible. + + if (is_file($this->getDefaultBackgroundImageThumbPath())) { + $result &= unlink($this->getDefaultBackgroundImageThumbPath()); + } + if (is_file($this->getDefaultBackgroundImagePath())) { + $result &= unlink($this->getDefaultBackgroundImagePath()); + } + + foreach (ilCertificateBackgroundImageFileService::VALID_BACKGROUND_IMAGE_EXTENSIONS as $extension) { + if (is_file($this->getDefaultBackgroundImageTempFilePath($extension))) { + $result &= unlink($this->getDefaultBackgroundImageTempFilePath($extension)); + } } } + $this->certificate_settings->set('defaultImageFileName', ''); + /** @noinspection PhpCastIsUnnecessaryInspection */ /** @noinspection UnnecessaryCastingInspection */ return (bool) $result; // Don't remove the cast, otherwise $result will be 1 or 0 } - private function getBackgroundImageDefaultFolder(): string + public function getBackgroundImageDefaultFolder(bool $relativePath = false): string { - return CLIENT_WEB_DIR . "/certificates/default/"; + return ($relativePath ? '' : CLIENT_WEB_DIR) . '/certificates/default/'; } - private function getDefaultBackgroundImagePath(): string + public function getDefaultBackgroundImagePath(bool $relativePath = false): string { - return $this->getBackgroundImageDefaultFolder() . ilCertificateBackgroundImageFileService::BACKGROUND_IMAGE_NAME; + return $this->getBackgroundImageDefaultFolder($relativePath) + . $this->certificate_settings->get('defaultImageFileName', ''); } - private function getDefaultBackgroundImageThumbPath(): string + public function getDefaultBackgroundImageThumbPath(bool $relativePath = false): string { - return $this->getBackgroundImageDefaultFolder() . ilCertificateBackgroundImageFileService::BACKGROUND_IMAGE_NAME . ilCertificateBackgroundImageFileService::BACKGROUND_THUMBNAIL_FILE_ENDING; + return $this->getDefaultBackgroundImagePath($relativePath) . ilCertificateBackgroundImageFileService::BACKGROUND_THUMBNAIL_FILE_ENDING; } - private function getDefaultBackgroundImageTempfilePath(string $extension): string + private function getDefaultBackgroundImageTempFilePath(string $extension): string { return implode('', [ $this->getBackgroundImageDefaultFolder(), diff --git a/Services/Certificate/classes/class.ilObjCertificateSettingsAccess.php b/Services/Certificate/classes/class.ilObjCertificateSettingsAccess.php index 03839456a7a9..8ae5562da7a4 100644 --- a/Services/Certificate/classes/class.ilObjCertificateSettingsAccess.php +++ b/Services/Certificate/classes/class.ilObjCertificateSettingsAccess.php @@ -1,7 +1,5 @@ @@ -25,49 +25,4 @@ */ class ilObjCertificateSettingsAccess extends ilObjectAccess { - public static function hasBackgroundImage(): bool - { - return is_file(self::getBackgroundImagePath()) && filesize(self::getBackgroundImagePath()) > 0; - } - - public static function getBackgroundImageDefaultFolder(): string - { - return CLIENT_WEB_DIR . "/certificates/default/"; - } - - public static function getBackgroundImagePath(bool $asRelative = false): string - { - $imagePath = self::getBackgroundImageDefaultFolder() . self::getBackgroundImageName(); - - if ($asRelative) { - return str_replace( - [CLIENT_WEB_DIR, '//'], - ['[CLIENT_WEB_DIR]', '/'], - $imagePath - ); - } - - return $imagePath; - } - - public static function getBackgroundImageName(): string - { - return "background.jpg"; - } - - public static function getBackgroundImageThumbPath(): string - { - return self::getBackgroundImageDefaultFolder() . self::getBackgroundImageName() . ".thumb.jpg"; - } - - public static function getBackgroundImageThumbPathWeb(): string - { - return str_replace( - ilFileUtils::removeTrailingPathSeparators( - ILIAS_ABSOLUTE_PATH - ), - ilFileUtils::removeTrailingPathSeparators(ILIAS_HTTP_PATH), - self::getBackgroundImageThumbPath() - ); - } } diff --git a/Services/Certificate/test/ilCertificateCloneActionTest.php b/Services/Certificate/test/ilCertificateCloneActionTest.php index f6a0e209a378..86ab41df7ff3 100644 --- a/Services/Certificate/test/ilCertificateCloneActionTest.php +++ b/Services/Certificate/test/ilCertificateCloneActionTest.php @@ -1,7 +1,5 @@ */ @@ -116,6 +116,10 @@ public function testCloneCertificate(): void $objectHelper->method('lookupObjId') ->willReturn(1000); + $global_certificate_settings = $this->getMockBuilder(ilObjCertificateSettings::class) + ->disableOriginalConstructor() + ->getMock(); + $cloneAction = new ilCertificateCloneAction( $database, new ilCertificatePathFactory(), @@ -123,6 +127,7 @@ public function testCloneCertificate(): void $fileSystem, $logger, $objectHelper, + $global_certificate_settings, 'some/web/directory', '/certificates/default/background.jpg' ); diff --git a/Services/Certificate/test/ilCertificateTemplateDeleteActionTest.php b/Services/Certificate/test/ilCertificateTemplateDeleteActionTest.php index 5bbead9eca55..2bd0608a438b 100644 --- a/Services/Certificate/test/ilCertificateTemplateDeleteActionTest.php +++ b/Services/Certificate/test/ilCertificateTemplateDeleteActionTest.php @@ -1,7 +1,5 @@ */ @@ -46,59 +46,12 @@ public function testDeleteTemplateAndUseOldThumbnail(): void 'samples/background.jpg' )); - $utilHelper = $this->getMockBuilder(ilCertificateUtilHelper::class) - ->getMock(); - - $utilHelper - ->expects($this->once()) - ->method('convertImage'); - - $objectHelper = $this->getMockBuilder(ilCertificateObjectHelper::class) - ->getMock(); - - $objectHelper->method('lookUpType') - ->willReturn('crs'); - - $action = new ilCertificateTemplateDeleteAction( - $templateRepositoryMock, - __DIR__, - $utilHelper, - $objectHelper, - 'v5.4.0' - ); - - $action->delete(100, 2000); - } - - public function testDeleteTemplateButNoThumbnailWillBeCopiedFromOldCertificate(): void - { - $templateRepositoryMock = $this->getMockBuilder(ilCertificateTemplateRepository::class)->getMock(); - - $templateRepositoryMock - ->method('deleteTemplate') - ->with(100, 2000); - - $templateRepositoryMock->method('activatePreviousCertificate') - ->with(2000) - ->willReturn(new ilCertificateTemplate( - 2000, - 'crs', - 'something', - md5('something'), - '[]', - 1, - 'v5.4.0', - 1234567890, - true - )); + $templateRepositoryMock->expects($this->once())->method("deleteTemplate"); + $templateRepositoryMock->expects($this->once())->method("save"); $utilHelper = $this->getMockBuilder(ilCertificateUtilHelper::class) ->getMock(); - $utilHelper - ->expects($this->once()) - ->method('convertImage'); - $objectHelper = $this->getMockBuilder(ilCertificateObjectHelper::class) ->getMock(); From 27c07b1135f57066ba23e9fc220189c394f2b587 Mon Sep 17 00:00:00 2001 From: Marvin Beym Date: Wed, 15 Nov 2023 11:28:05 +0100 Subject: [PATCH 136/497] Fix not deleting old now unused default image --- .../class.ilObjCertificateSettings.php | 10 ++++++++++ .../class.ilObjCertificateSettingsGUI.php | 20 +++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/Services/Certificate/classes/class.ilObjCertificateSettings.php b/Services/Certificate/classes/class.ilObjCertificateSettings.php index d4cca2a341a4..51cc445e94d6 100644 --- a/Services/Certificate/classes/class.ilObjCertificateSettings.php +++ b/Services/Certificate/classes/class.ilObjCertificateSettings.php @@ -132,11 +132,21 @@ public function uploadBackgroundImage(UploadResult $upload_result): bool } if (file_exists($new_image_path) && (filesize($new_image_path) > 0)) { + $old_path = $this->getDefaultBackgroundImagePath(); + $old_path_thumb = $this->getDefaultBackgroundImageThumbPath(); $old_relative_path = $this->getDefaultBackgroundImagePath(true); $this->certificate_settings->set('defaultImageFileName', $new_image_file_name); $new_relative_path = $this->getDefaultBackgroundImagePath(true); $this->certificate_repo->updateDefaultBackgroundImagePaths($old_relative_path, $new_relative_path); + + if (is_file($old_path) && file_exists($old_path)) { + unlink($old_path); + } + + if (is_file($old_path_thumb) && file_exists($old_path_thumb)) { + unlink($old_path_thumb); + } return true; } diff --git a/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php b/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php index 3a64e543b0f0..c413caf8a2a4 100644 --- a/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php +++ b/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php @@ -112,6 +112,16 @@ public function settings(): void $bgimage = new ilImageFileInputGUI($this->lng->txt('certificate_background_image'), 'background'); $bgimage->setRequired(false); + if (strcmp($this->ctrl->getCmd(), 'save') === 0) { + $backgroundDelete = $this->httpState->wrapper()->post()->has('background_delete') && $this->httpState->wrapper()->post()->retrieve( + 'background_delete', + $this->refinery->kindlyTo()->bool() + ); + if ($backgroundDelete) { + $this->object->deleteBackgroundImage(); + } + } + if ( $this->upload->hasUploads() && $this->httpState->request()->getMethod() === 'POST' && @@ -194,16 +204,6 @@ public function settings(): void $form->addItem($persistentCertificateMode); $this->tpl->setContent($form->getHTML()); - - if (strcmp($this->ctrl->getCmd(), 'save') === 0) { - $backgroundDelete = $this->httpState->wrapper()->post()->has('background_delete') && $this->httpState->wrapper()->post()->retrieve( - 'background_delete', - $this->refinery->kindlyTo()->bool() - ); - if ($backgroundDelete) { - $this->object->deleteBackgroundImage(); - } - } } public function save(): void From d6dff56680d9c5b5b07bd6e4b20f768201f9c311 Mon Sep 17 00:00:00 2001 From: Marvin Beym Date: Wed, 15 Nov 2023 12:38:29 +0100 Subject: [PATCH 137/497] Fix deleting old image without checking if used --- .../classes/class.ilObjCertificateSettings.php | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Services/Certificate/classes/class.ilObjCertificateSettings.php b/Services/Certificate/classes/class.ilObjCertificateSettings.php index 51cc445e94d6..c632963cb136 100644 --- a/Services/Certificate/classes/class.ilObjCertificateSettings.php +++ b/Services/Certificate/classes/class.ilObjCertificateSettings.php @@ -140,12 +140,17 @@ public function uploadBackgroundImage(UploadResult $upload_result): bool $this->certificate_repo->updateDefaultBackgroundImagePaths($old_relative_path, $new_relative_path); - if (is_file($old_path) && file_exists($old_path)) { - unlink($old_path); - } - - if (is_file($old_path_thumb) && file_exists($old_path_thumb)) { - unlink($old_path_thumb); + if ( + !$this->certificate_repo->isBackgroundImageUsed($old_relative_path) + && !$this->user_certificate_repo->isBackgroundImageUsed($old_relative_path) + ) { + if (is_file($old_path) && file_exists($old_path)) { + unlink($old_path); + } + + if (is_file($old_path_thumb) && file_exists($old_path_thumb)) { + unlink($old_path_thumb); + } } return true; } From dcf93c53c549309f6905344088dfe0904bc156dc Mon Sep 17 00:00:00 2001 From: Marvin Beym Date: Wed, 15 Nov 2023 12:45:31 +0100 Subject: [PATCH 138/497] Fix license header --- .../Certificate/classes/class.ilObjCertificateSettingsGUI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php b/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php index c413caf8a2a4..2cd5c1e09576 100644 --- a/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php +++ b/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php @@ -1,7 +1,5 @@ From aced180b6003da7a07942479407da25d356f3354 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 15 Nov 2023 15:52:20 +0100 Subject: [PATCH 139/497] =?UTF-8?q?38758:=20Der=20Men=C3=BCpunkt=20Abgaben?= =?UTF-8?q?=20und=20Noten=20wirft=20in=20bestimmten=20F=C3=A4llen=20einen?= =?UTF-8?q?=20Fehler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Exercise/Assignment/class.ilExAssignment.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Exercise/Assignment/class.ilExAssignment.php b/Modules/Exercise/Assignment/class.ilExAssignment.php index a02f80055bec..a15616ebfb47 100644 --- a/Modules/Exercise/Assignment/class.ilExAssignment.php +++ b/Modules/Exercise/Assignment/class.ilExAssignment.php @@ -1192,7 +1192,7 @@ public function getMemberListData(): array if (!$this->ass_type->usesTeams()) { foreach ($idl as $user_id => $v) { if (!isset($mem[$user_id])) { - if (ilObjUser::_exists($user_id)) { + if (ilObjUser::_exists((int) $user_id)) { $name = ilObjUser::_lookupName($user_id); $mem[$user_id] = array( From ee9ae8b0187b7250e6230f13e35c92685890b6e0 Mon Sep 17 00:00:00 2001 From: mjansen Date: Wed, 15 Nov 2023 16:17:32 +0100 Subject: [PATCH 140/497] ContentPage: Do not use `CoPage` for critical actions (deletion, import etc.) See: https://mantis.ilias.de/view.php?id=31937 --- .../ContentPage/classes/PageMetrics/PageMetricsService.php | 2 +- Modules/ContentPage/classes/class.ilObjContentPage.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/ContentPage/classes/PageMetrics/PageMetricsService.php b/Modules/ContentPage/classes/PageMetrics/PageMetricsService.php index d501cacc2df4..a714cb190c79 100644 --- a/Modules/ContentPage/classes/PageMetrics/PageMetricsService.php +++ b/Modules/ContentPage/classes/PageMetrics/PageMetricsService.php @@ -47,7 +47,7 @@ public function __construct(PageMetricsRepository $pageMetricsRepository, Factor protected function doesPageExistsForLanguage(int $contentPageId, string $language): bool { - return ilContentPagePage::_exists(self::OBJ_TYPE, $contentPageId, $language); + return ilContentPagePage::_exists(self::OBJ_TYPE, $contentPageId, $language, true); } protected function ensurePageObjectExists(int $contentPageId, string $language): void diff --git a/Modules/ContentPage/classes/class.ilObjContentPage.php b/Modules/ContentPage/classes/class.ilObjContentPage.php index c6e0bf9f1db5..b41f09fabb70 100644 --- a/Modules/ContentPage/classes/class.ilObjContentPage.php +++ b/Modules/ContentPage/classes/class.ilObjContentPage.php @@ -74,7 +74,7 @@ protected function doCloneObject(ilObject2 $new_obj, int $a_target_id, ?int $a_c $ot = ilObjectTranslation::getInstance($this->getId()); $ot->copy($new_obj->getId()); - if (ilContentPagePage::_exists($this->getType(), $this->getId())) { + if (ilContentPagePage::_exists($this->getType(), $this->getId(), '', true)) { $translations = ilContentPagePage::lookupTranslations($this->getType(), $this->getId()); foreach ($translations as $language) { $originalPageObject = new ilContentPagePage($this->getId(), 0, $language); @@ -161,7 +161,7 @@ protected function doDelete(): void { parent::doDelete(); - if (ilContentPagePage::_exists($this->getType(), $this->getId())) { + if (ilContentPagePage::_exists($this->getType(), $this->getId(), '', true)) { $originalPageObject = new ilContentPagePage($this->getId()); $originalPageObject->delete(); } From 1b68d739f05bc951170cb02d8002f78466010a55 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Wed, 15 Nov 2023 15:35:55 +0100 Subject: [PATCH 141/497] UI/Page: #38315, eval engaged-state only if mainbar is present (#6576) (cherry picked from commit 085c983974a8a859a321f36754f93542740854df) --- .../Implementation/Component/Layout/Page/Renderer.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/UI/Implementation/Component/Layout/Page/Renderer.php b/src/UI/Implementation/Component/Layout/Page/Renderer.php index 515079e1b18b..747c89c03010 100644 --- a/src/UI/Implementation/Component/Layout/Page/Renderer.php +++ b/src/UI/Implementation/Component/Layout/Page/Renderer.php @@ -64,6 +64,11 @@ protected function renderStandardPage( } if ($component->hasMainbar()) { $tpl->setVariable('MAINBAR', $default_renderer->render($component->getMainbar())); + // There is a roadmap entry for this. + $slates_cookie = $_COOKIE[self::COOKIE_NAME_SLATES_ENGAGED] ?? ''; + if ($slates_cookie && json_decode($slates_cookie, true)['engaged']) { + $tpl->touchBlock('slates_engaged'); + } } if ($component->hasModeInfo()) { $tpl->setVariable('MODEINFO', $default_renderer->render($component->getModeInfo())); @@ -88,12 +93,6 @@ protected function renderStandardPage( $tpl->setVariable('RESPONSIVE_LOGO', $default_renderer->render($component->getLogo())); } - // There is a roadmap entry for this. - $slates_cookie = $_COOKIE[self::COOKIE_NAME_SLATES_ENGAGED] ?? ''; - if ($slates_cookie && json_decode($slates_cookie, true)['engaged']) { - $tpl->touchBlock('slates_engaged'); - } - $tpl->setVariable("TITLE", $component->getTitle()); $tpl->setVariable("SHORT_TITLE", $component->getShortTitle()); $tpl->setVariable("VIEW_TITLE", $component->getViewTitle()); From 225870aa0cfd93b3b9c37c77c12f9054a12b8091 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Wed, 15 Nov 2023 17:53:02 +0100 Subject: [PATCH 142/497] User: Fix Changing Users Rights See: https://mantis.ilias.de/view.php?id=38330 --- Services/User/classes/class.ilObjUserGUI.php | 30 +++++++++---------- .../User/classes/class.ilUserTableGUI.php | 19 ++++++------ 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/Services/User/classes/class.ilObjUserGUI.php b/Services/User/classes/class.ilObjUserGUI.php index fbaf785ced1f..a85942f6c04f 100755 --- a/Services/User/classes/class.ilObjUserGUI.php +++ b/Services/User/classes/class.ilObjUserGUI.php @@ -538,6 +538,7 @@ public function saveObject(): void */ public function editObject(): void { + /** @var ILIAS\DI\Container $DIC */ global $DIC; $rbacsystem = $DIC->rbac()->system(); @@ -545,23 +546,20 @@ public function editObject(): void // User folder // User folder && access granted by rbac or by org unit positions - if ($this->usrf_ref_id == USER_FOLDER_ID && - ( - !$rbacsystem->checkAccess('visible,read', $this->usrf_ref_id) || - !$access->checkRbacOrPositionPermissionAccess( - 'write', - \ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, - $this->usrf_ref_id - ) || - !in_array( - $this->object->getId(), - $access->filterUserIdsByRbacOrPositionOfCurrentUser( - 'write', - \ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, - USER_FOLDER_ID, - [$this->object->getId()] + if ($this->usrf_ref_id == USER_FOLDER_ID + && ( + !$rbacsystem->checkAccess('visible,read', $this->usrf_ref_id) + || !$rbacsystem->checkAccess('write', $this->usrf_ref_id) + && !$access->checkPositionAccess(\ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, $this->usrf_ref_id) + || $access->checkPositionAccess(\ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, $this->usrf_ref_id) + && !in_array( + $this->object->getId(), + $access->filterUserIdsByPositionOfCurrentUser( + \ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, + USER_FOLDER_ID, + [$this->object->getId()] + ) ) - ) ) ) { $this->ilias->raiseError($this->lng->txt("msg_no_perm_modify_user"), $this->ilias->error_obj->MESSAGE); diff --git a/Services/User/classes/class.ilUserTableGUI.php b/Services/User/classes/class.ilUserTableGUI.php index 4dd54bf1e85b..e99fb710948f 100644 --- a/Services/User/classes/class.ilUserTableGUI.php +++ b/Services/User/classes/class.ilUserTableGUI.php @@ -45,12 +45,14 @@ public function __construct( $ilCtrl = $DIC->ctrl(); $lng = $DIC->language(); - if ($DIC->access()->checkAccess('write', '', $a_parent_obj->getObject()->getRefId())) { - $this->with_write_access = true; - } $this->user_folder_id = $a_parent_obj->getObject()->getRefId(); + if ($DIC['rbacsystem']->checkAccess('write', $this->user_folder_id) + || $DIC['rbacsystem']->checkAccess('cat_administrate_users', $this->user_folder_id)) { + $this->with_write_access = true; + } + $this->setMode($a_mode); $this->setId("user" . $this->getUserFolderId()); $this->readUserDefinedFieldsDefinitions(); @@ -656,12 +658,11 @@ protected function fillRow(array $a_set): void // Missing array type. $this->tpl->parseCurrentBlock(); } - if ($a_set["usr_id"] != 6) { - if ($this->getMode() == self::MODE_USER_FOLDER or $a_set['time_limit_owner'] == $this->getUserFolderId()) { - $this->tpl->setCurrentBlock("checkb"); - $this->tpl->setVariable("ID", $a_set["usr_id"]); - $this->tpl->parseCurrentBlock(); - } + if ($a_set["usr_id"] != 6 + && $this->getMode() == self::MODE_USER_FOLDER || $a_set['time_limit_owner'] == $this->getUserFolderId()) { + $this->tpl->setCurrentBlock("checkb"); + $this->tpl->setVariable("ID", $a_set["usr_id"]); + $this->tpl->parseCurrentBlock(); } if ($this->with_write_access From 18f07e623bc517a447ceddca2ee44589eb3cca7a Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Wed, 15 Nov 2023 18:39:32 +0100 Subject: [PATCH 143/497] User: Fix Root Deletion Possible --- Services/User/classes/class.ilUserTableGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/User/classes/class.ilUserTableGUI.php b/Services/User/classes/class.ilUserTableGUI.php index e99fb710948f..3da77f72e70f 100644 --- a/Services/User/classes/class.ilUserTableGUI.php +++ b/Services/User/classes/class.ilUserTableGUI.php @@ -659,7 +659,7 @@ protected function fillRow(array $a_set): void // Missing array type. } if ($a_set["usr_id"] != 6 - && $this->getMode() == self::MODE_USER_FOLDER || $a_set['time_limit_owner'] == $this->getUserFolderId()) { + && ($this->getMode() == self::MODE_USER_FOLDER || $a_set['time_limit_owner'] == $this->getUserFolderId())) { $this->tpl->setCurrentBlock("checkb"); $this->tpl->setVariable("ID", $a_set["usr_id"]); $this->tpl->parseCurrentBlock(); From 0fe00c92498b42a5cf5769f60dbd134b8d639855 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Wed, 15 Nov 2023 19:05:07 +0100 Subject: [PATCH 144/497] User: Fix Access-Rights Check --- .../User/classes/class.ilObjUserFolderGUI.php | 33 +++---------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/Services/User/classes/class.ilObjUserFolderGUI.php b/Services/User/classes/class.ilObjUserFolderGUI.php index a569b32fb36e..a15360f98766 100755 --- a/Services/User/classes/class.ilObjUserFolderGUI.php +++ b/Services/User/classes/class.ilObjUserFolderGUI.php @@ -230,29 +230,6 @@ public function executeCommand(): void } } - protected function checkAccess(string $a_permission): void - { - global $DIC; - - $ilErr = $DIC['ilErr']; - - if (!$this->checkAccessBool($a_permission)) { - $ilErr->raiseError( - $this->lng->txt('msg_no_perm_read'), - $ilErr->WARNING - ); - } - } - - protected function checkAccessBool(string $a_permission): bool - { - return $this->access->checkAccess( - $a_permission, - '', - $this->ref_id - ); - } - public function resetFilterObject(): void { $utab = new ilUserTableGUI( @@ -3813,7 +3790,7 @@ public function getUserMultiCommands(bool $a_search_form = false): array // Miss $cmds = []; // see searchResultHandler() if ($a_search_form) { - if ($this->checkAccessBool('write')) { + if ($rbacsystem->checkAccess('write', $this->object->getRefId())) { $cmds = [ 'activate' => $this->lng->txt('activate'), 'deactivate' => $this->lng->txt('deactivate'), @@ -3822,12 +3799,12 @@ public function getUserMultiCommands(bool $a_search_form = false): array // Miss ]; } - if ($this->checkAccessBool('delete')) { + if ($rbacsystem->checkAccess('delete', $this->object->getRefId())) { $cmds["delete"] = $this->lng->txt("delete"); } } // show confirmation else { - if ($this->checkAccessBool('write')) { + if ($rbacsystem->checkAccess('write', $this->object->getRefId())) { $cmds = [ 'activateUsers' => $this->lng->txt('activate'), 'deactivateUsers' => $this->lng->txt('deactivate'), @@ -3836,12 +3813,12 @@ public function getUserMultiCommands(bool $a_search_form = false): array // Miss ]; } - if ($this->checkAccessBool('delete')) { + if ($rbacsystem->checkAccess('delete', $this->object->getRefId())) { $cmds["deleteUsers"] = $this->lng->txt("delete"); } } - if ($this->checkAccessBool('write')) { + if ($rbacsystem->checkAccess('write', $this->object->getRefId())) { $export_types = array("userfolder_export_excel_x86", "userfolder_export_csv", "userfolder_export_xml"); foreach ($export_types as $type) { $cmd = explode( From 72006fc5ba5ec2ab5a3079e5f875ecadbaaa3e0b Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Thu, 16 Nov 2023 13:23:46 +0100 Subject: [PATCH 145/497] 38796: Survey shows competence entries which do not belong to it --- Modules/Survey/Evaluation/class.ilSurveyEvaluationGUI.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Modules/Survey/Evaluation/class.ilSurveyEvaluationGUI.php b/Modules/Survey/Evaluation/class.ilSurveyEvaluationGUI.php index 082cad922567..81acd4297dbf 100644 --- a/Modules/Survey/Evaluation/class.ilSurveyEvaluationGUI.php +++ b/Modules/Survey/Evaluation/class.ilSurveyEvaluationGUI.php @@ -1213,17 +1213,13 @@ public function competenceEval(): void $sskill = new ilSurveySkill($survey); $self_levels = array(); foreach ($sskill->determineSkillLevelsForAppraisee($appr_id, true) as $sl) { - $self_levels[$sl["base_skill_id"]][$sl["tref_id"]] = $sl["new_level_id"]; + $self_levels[$sl["base_skill_id"]][$sl["tref_id"]] = $sl["new_level_id"] ?? 0; } $pskills_gui->setGapAnalysisSelfEvalLevels($self_levels); } $html = $pskills_gui->getGapAnalysisHTML($appr_id); } else { // must be all survey competences - #23743 - if ($survey->getMode() !== ilObjSurvey::MODE_SELF_EVAL && - $survey->getMode() !== ilObjSurvey::MODE_IND_FEEDB) { - $pskills_gui->setGapAnalysisActualStatusModePerObject($survey->getId(), $lng->txt("skmg_eval_type_1")); - } + $pskills_gui->setGapAnalysisActualStatusModePerObject($survey->getId(), $lng->txt("skmg_eval_type_1")); if ($survey->getFinishedIdForAppraiseeIdAndRaterId($appr_id, $appr_id) > 0) { $sskill = new ilSurveySkill($survey); $self_levels = array(); From 9434062842c0f29c8969d11657ff0b13f52e0a19 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 16 Nov 2023 14:16:38 +0100 Subject: [PATCH 146/497] Course: add undefined property (38769) --- .../classes/Objectives/class.ilCourseObjectiveMaterials.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Course/classes/Objectives/class.ilCourseObjectiveMaterials.php b/Modules/Course/classes/Objectives/class.ilCourseObjectiveMaterials.php index b4ceb26ac6cd..ac49ae0f3752 100644 --- a/Modules/Course/classes/Objectives/class.ilCourseObjectiveMaterials.php +++ b/Modules/Course/classes/Objectives/class.ilCourseObjectiveMaterials.php @@ -43,6 +43,7 @@ public function __construct(int $a_objective_id = 0) $this->tree = $DIC->repositoryTree(); $this->db = $DIC->database(); $this->objective_id = $a_objective_id; + $this->logger = $DIC->logger()->crs(); $this->__read(); } From cccd7b5537bc299791600750453a28237e44bfc9 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 16 Nov 2023 13:55:56 +0100 Subject: [PATCH 147/497] Test: Fix Trimming in Cloze Question See: https://mantis.ilias.de/view.php?id=35462 --- .../Form/class.ilClozeGapInputBuilderGUI.php | 4 +- .../classes/class.assClozeTest.php | 15 +++--- .../default/clozeQuestionGapBuilder.js | 49 ------------------- .../default/tpl.il_as_cloze_gap_builder.html | 8 ++- lang/ilias_ar.lang | 3 -- lang/ilias_bg.lang | 3 -- lang/ilias_cs.lang | 3 -- lang/ilias_da.lang | 3 -- lang/ilias_de.lang | 4 +- lang/ilias_el.lang | 3 -- lang/ilias_en.lang | 4 +- lang/ilias_es.lang | 3 -- lang/ilias_et.lang | 3 -- lang/ilias_fa.lang | 3 -- lang/ilias_fr.lang | 3 -- lang/ilias_hr.lang | 3 -- lang/ilias_hu.lang | 3 -- lang/ilias_it.lang | 3 -- lang/ilias_ja.lang | 19 +++---- lang/ilias_ka.lang | 3 -- lang/ilias_lt.lang | 3 -- lang/ilias_nl.lang | 3 -- lang/ilias_pl.lang | 3 -- lang/ilias_pt.lang | 3 -- lang/ilias_ro.lang | 3 -- lang/ilias_ru.lang | 3 -- lang/ilias_sk.lang | 3 -- lang/ilias_sl.lang | 5 +- lang/ilias_sq.lang | 3 -- lang/ilias_sr.lang | 3 -- lang/ilias_tr.lang | 3 -- lang/ilias_uk.lang | 3 -- lang/ilias_vi.lang | 3 -- lang/ilias_zh.lang | 3 -- 34 files changed, 22 insertions(+), 164 deletions(-) diff --git a/Modules/TestQuestionPool/classes/Form/class.ilClozeGapInputBuilderGUI.php b/Modules/TestQuestionPool/classes/Form/class.ilClozeGapInputBuilderGUI.php index a4d16621fb75..5d275b86a4ea 100644 --- a/Modules/TestQuestionPool/classes/Form/class.ilClozeGapInputBuilderGUI.php +++ b/Modules/TestQuestionPool/classes/Form/class.ilClozeGapInputBuilderGUI.php @@ -294,6 +294,7 @@ public function insert(ilTemplate $template): void $custom_template->setVariable('GAP_SIZE', $lng->txt('cloze_fixed_textlength')); $custom_template->setVariable('GAP_SIZE_INFO', $lng->txt('cloze_gap_size_info')); $custom_template->setVariable('ANSWER_TEXT', $lng->txt('answer_text')); + $custom_template->setVariable('ANSWER_BYLINE', $lng->txt('cloze_answer_text_info')); $custom_template->setVariable('POINTS', $lng->txt('points')); $custom_template->setVariable('VALUE', $lng->txt('value')); $custom_template->setVariable('UPPER_BOUND', $lng->txt('range_upper_limit')); @@ -315,9 +316,6 @@ public function insert(ilTemplate $template): void $custom_template->setVariable('VALUES', $lng->txt('values')); $custom_template->setVariable('GAP_COMBINATION', $lng->txt('gap_combination')); $custom_template->setVariable('COPY', $lng->txt('copy_of')); - $custom_template->setVariable('WHITESPACE_FRONT', $lng->txt('cloze_textgap_whitespace_before')); - $custom_template->setVariable('WHITESPACE_BACK', $lng->txt('cloze_textgap_whitespace_after')); - $custom_template->setVariable('WHITESPACE_MULTIPLE', $lng->txt('cloze_textgap_multiple_whitespace')); $template->setCurrentBlock('prop_generic'); $template->setVariable('PROP_GENERIC', $custom_template->get()); $template->parseCurrentBlock(); diff --git a/Modules/TestQuestionPool/classes/class.assClozeTest.php b/Modules/TestQuestionPool/classes/class.assClozeTest.php index 77f20ef273fa..ed2de5d45ed9 100755 --- a/Modules/TestQuestionPool/classes/class.assClozeTest.php +++ b/Modules/TestQuestionPool/classes/class.assClozeTest.php @@ -775,7 +775,7 @@ public function addGapAnswer($gap_index, $order, $answer): void // only allow notation with "." for real numbers $answer = str_replace(",", ".", $answer); } - $this->gaps[$gap_index]->addItem(new assAnswerCloze($answer, 0, $order)); + $this->gaps[$gap_index]->addItem(new assAnswerCloze(trim($answer), 0, $order)); } } @@ -1327,11 +1327,11 @@ public function fetchSolutionSubmit($submit): array if (!$post_wrapper->has("gap_$index")) { continue; } - $value = $post_wrapper->retrieve( + $value = trim($post_wrapper->retrieve( "gap_$index", $this->dic->refinery()->kindlyTo()->string() - ); - if ($value === "") { + )); + if ($value === '') { continue; } @@ -1400,13 +1400,12 @@ public function saveWorkingData($active_id, $pass = null, $authorized = true): b $this->getProcessLocker()->executeUserSolutionUpdateLockOperation(function () use (&$entered_values, $active_id, $pass, $authorized) { $this->removeCurrentSolution($active_id, $pass, $authorized); - foreach ($this->getSolutionSubmit() as $val1 => $val2) { - $value = trim($val2); + foreach ($this->getSolutionSubmit() as $key => $value) { if ($value !== null && $value !== '') { - $gap = $this->getGap(trim(ilUtil::stripSlashes($val1))); + $gap = $this->getGap(trim(ilUtil::stripSlashes($key))); if (is_object($gap)) { if (!(($gap->getType() == CLOZE_SELECT) && ($value == -1))) { - $this->saveCurrentSolution($active_id, $pass, $val1, $value, $authorized); + $this->saveCurrentSolution($active_id, $pass, $key, $value, $authorized); $entered_values++; } } diff --git a/Modules/TestQuestionPool/templates/default/clozeQuestionGapBuilder.js b/Modules/TestQuestionPool/templates/default/clozeQuestionGapBuilder.js index 60d9e213f078..5f2fed15e7f0 100644 --- a/Modules/TestQuestionPool/templates/default/clozeQuestionGapBuilder.js +++ b/Modules/TestQuestionPool/templates/default/clozeQuestionGapBuilder.js @@ -19,7 +19,6 @@ var ClozeGlobals = { form_error: 'form_error', form_warning: 'form_warning', best_combination: '', - whitespace_cleaner: false, best_possible_solution_error: false, debug: false, jour_fixe_incompatible: false, @@ -863,8 +862,6 @@ var ClozeQuestionGapBuilder = (function () { $('#gap_error_' + gap_id).find('.value.form_error').addClass('prototype'); } } - pro.checkInputTextForWhitespaces(gap_id, selector, selector.val()); - ClozeGlobals.whitespace_cleaner = false; }; pro.checkForm = function () { @@ -935,9 +932,6 @@ var ClozeQuestionGapBuilder = (function () { } var failed = pro.checkInputElementNotEmpty($('#gap_' + row + '\\[answer\\]\\[' + counter + '\\]'), values.answer); input_failed += failed; - if (entry.type == 'text' && failed === 0) { - pro.checkInputTextForWhitespaces(row, $('#gap_' + row + '\\[answer\\]\\[' + counter + '\\]'), values.answer); - } counter++; }); if (input_failed > 0) { @@ -974,7 +968,6 @@ var ClozeQuestionGapBuilder = (function () { } } row++; - ClozeGlobals.whitespace_cleaner = false; }); $('#gap_json_post').val(JSON.stringify(ClozeSettings.gaps_php)); $('#gap_json_combination_post').val(JSON.stringify(ClozeSettings.gaps_combination)); @@ -1040,48 +1033,6 @@ var ClozeQuestionGapBuilder = (function () { } }; - pro.checkInputTextForWhitespaces = function (id, selector, value) { - var error = false; - if (/^\s/.test(value)) { - pro.showHidePrototypes(id, 'wsB', true); - error = true; - ClozeGlobals.whitespace_cleaner = true; - } - else if (!error && !ClozeGlobals.whitespace_cleaner) { - pro.showHidePrototypes(id, 'wsB', false); - } - if (/\s$/.test(value)) { - pro.showHidePrototypes(id, 'wsA', true); - error = true; - ClozeGlobals.whitespace_cleaner = true; - } - else if (!error && !ClozeGlobals.whitespace_cleaner) { - pro.showHidePrototypes(id, 'wsA', false); - } - if (/\s{2,}/.test(value)) { - pro.showHidePrototypes(id, 'wsM', true); - error = true; - ClozeGlobals.whitespace_cleaner = true; - } - else if (!error && !ClozeGlobals.whitespace_cleaner) { - pro.showHidePrototypes(id, 'wsM', false); - } - if (error === true) { - pro.highlightYellow(selector); - } - else if (!error && !ClozeGlobals.whitespace_cleaner) { - pro.removeHighlightYellow(selector); - } - - }; - - pro.clearInputTextWithWhitespaces = function (value) { - value = value.replace(/\s{2,}/g, ''); - value = value.replace(/^\s/, ''); - value = value.replace(/\s$/, ''); - return value; - }; - pro.focusOnFormular = function (pos) { pro.cloneFormPart(pos[0]); //ToDo: fix fokus diff --git a/Modules/TestQuestionPool/templates/default/tpl.il_as_cloze_gap_builder.html b/Modules/TestQuestionPool/templates/default/tpl.il_as_cloze_gap_builder.html index 52fdac4398bf..9427c3314d09 100644 --- a/Modules/TestQuestionPool/templates/default/tpl.il_as_cloze_gap_builder.html +++ b/Modules/TestQuestionPool/templates/default/tpl.il_as_cloze_gap_builder.html @@ -121,6 +121,7 @@

+
{ANSWER_BYLINE}
@@ -207,9 +208,6 @@

{MISSING_VALUE}
{NOT_A_FORMULA}
{NOT_A_NUMBER}
- {WHITESPACE_FRONT}
- {WHITESPACE_BACK}
- {WHITESPACE_MULTIPLE}
@@ -248,7 +246,7 @@

GAP_COMBINATION

{POINTS}
- +
@@ -274,4 +272,4 @@

{BEST_POSSIBLE_SOLUTION_HEADER}

- + diff --git a/lang/ilias_ar.lang b/lang/ilias_ar.lang index 96f60f2a28a2..0a37919819a9 100644 --- a/lang/ilias_ar.lang +++ b/lang/ilias_ar.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Cloze Text assessment#:#cloze_textgap_case_insensitive#:#Case Insensitive assessment#:#cloze_textgap_case_sensitive#:#Case Sensitive assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein Distance of %s -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Code assessment#:#codebase#:#Codebase assessment#:#concatenation#:#Concatenation diff --git a/lang/ilias_bg.lang b/lang/ilias_bg.lang index f56d322c2e0b..32fb74c00d04 100644 --- a/lang/ilias_bg.lang +++ b/lang/ilias_bg.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Затваряне на текста assessment#:#cloze_textgap_case_insensitive#:#Нечувствителност към големи букви assessment#:#cloze_textgap_case_sensitive#:#чувствителност към големи букви assessment#:#cloze_textgap_levenshtein_of#:#Разстояние на Левенщайн от %s -assessment#:#cloze_textgap_multiple_whitespace#:#Многобройни бели полета -assessment#:#cloze_textgap_whitespace_after#:#Белият интервал зад стойността -assessment#:#cloze_textgap_whitespace_before#:#Белият интервал преди стойността assessment#:#code#:#Код###22 06 2022 new variable assessment#:#codebase#:#Програмен код assessment#:#concatenation#:#Свързване diff --git a/lang/ilias_cs.lang b/lang/ilias_cs.lang index b086bd751900..cca1c2eb4fc3 100644 --- a/lang/ilias_cs.lang +++ b/lang/ilias_cs.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Doplňovaný text assessment#:#cloze_textgap_case_insensitive#:#Nerozlišuje velká/malá písmena assessment#:#cloze_textgap_case_sensitive#:#Rozlišuje velká/malá písmena assessment#:#cloze_textgap_levenshtein_of#:#Vzdálenost Levenshtein %s -assessment#:#cloze_textgap_multiple_whitespace#:#Více prázdných míst -assessment#:#cloze_textgap_whitespace_after#:#Prázdné místo za hodnotou -assessment#:#cloze_textgap_whitespace_before#:#Prázdné místo před hodnotou assessment#:#code#:#Kód assessment#:#codebase#:#Databáze kódu assessment#:#concatenation#:#Sřetězení diff --git a/lang/ilias_da.lang b/lang/ilias_da.lang index 98191d53d3ef..3cd1cfff04b6 100644 --- a/lang/ilias_da.lang +++ b/lang/ilias_da.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Luk tekst assessment#:#cloze_textgap_case_insensitive#:#Ingen forskel på store og små bogstaver assessment#:#cloze_textgap_case_sensitive#:#Forskel på store og små bogstaver assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein afstand på %s -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Kode assessment#:#codebase#:#Codebase assessment#:#concatenation#:#Konkatnering diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 4d96f421e664..c748f6918843 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -614,6 +614,7 @@ assessment#:#circle_click_center#:#Bitte klicken Sie auf den Mittelpunkt der gew assessment#:#circle_click_circle#:#Bitte klicken Sie auf einen Punkt auf dem Umkreis der gewünschten Region assessment#:#clientip#:#Client IP assessment#:#close_text_hint#:#Um eine Lücke in den Text einzufügen, setzen Sie den Cursor an die entsprechende Position und nutzen Sie die Schaltfläche "Textlücke". Anschließend stehen weiter unten entsprechende Bearbeitungsbereiche zur Verfügung. Ebenso können Sie die Lücken zur Bearbeitung im Lückentext direkt anklicken. +assessment#:#cloze_answer_text_info#:#Vorangestellte oder nachfolgende Leerzeichen werden beim Speichern aus der Antwort gelöscht. assessment#:#cloze_fixed_textlength#:#Länge des Textfeldes assessment#:#cloze_fixed_textlength_description#:#Wenn Sie hier einen Wert eintragen, werden Textlücken, welche keinen eigenen Wert für eine maximale Länge definieren, sowie numerische Lücken mit dieser Länge erzeugt, so dass es nicht möglich ist eine größere Anzahl an Zeichen einzugeben. Für numerische Lücken ist darüber hinaus zu beachten, dass das Dezimaltrennzeichen dabei mit gezählt wird. assessment#:#cloze_gap_size_info#:#Ist ein Wert größer 0 eingetragen, wird diese Lücke mit der hier angegebenen Länge erzeugt. Ist kein Wert angegeben, wird diese Lücke mit der global angegebenen Textfeldlänge erzeugt. @@ -621,9 +622,6 @@ assessment#:#cloze_text#:#Lückentextfrage assessment#:#cloze_textgap_case_insensitive#:#Zwischen Groß- und Kleinschreibung wird nicht unterschieden assessment#:#cloze_textgap_case_sensitive#:#Groß- und Kleinschreibung beachten assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein-Abstand von %s -assessment#:#cloze_textgap_multiple_whitespace#:#Mehrere Leerzeichen hintereinander -assessment#:#cloze_textgap_whitespace_after#:#Leerzeichen nach dem Begriff -assessment#:#cloze_textgap_whitespace_before#:#Leerzeichen vor dem Begriff assessment#:#code#:#Code assessment#:#codebase#:#Codebase assessment#:#concatenation#:#Verknüpfung diff --git a/lang/ilias_el.lang b/lang/ilias_el.lang index 63d4357307b8..c640a6755847 100644 --- a/lang/ilias_el.lang +++ b/lang/ilias_el.lang @@ -607,9 +607,6 @@ assessment#:#cloze_text#:#Κείμενο με κενά assessment#:#cloze_textgap_case_insensitive#:#Χωρίς ταίριασμα πεζών-κεφαλαίων assessment#:#cloze_textgap_case_sensitive#:#Με ταίριασμα πεζών-κεφαλαίων assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein απόσταση του %s -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Κώδικας assessment#:#codebase#:#Κωδικοσελίδα assessment#:#concatenation#:#Συγχώνευση diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 3546b1128400..00c77ecfeca4 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -614,6 +614,7 @@ assessment#:#circle_click_center#:#Please click on center of the desired area. assessment#:#circle_click_circle#:#Please click on a circle point of the desired area. assessment#:#clientip#:#Client IP assessment#:#close_text_hint#:#To add a new gap set the cursor to the position of your choice and use the dropdown ‘Text Gap’. Corresponding editing sections will appear below. You can also edit gaps by clicking on the gaps within the gap text. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved. assessment#:#cloze_fixed_textlength#:#Text Field Length assessment#:#cloze_fixed_textlength_description#:#If you enter a value, all text gap fields, not providing an own maximum character limitation, as well as all numeric gap fields will be created with a fixed length of this value, so entering more than the allowed characters is not possible. Note, that for numeric gaps the decimal separator is counted as a regular character. assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value, the gap text field will be created with the value of the global fixed length. @@ -621,9 +622,6 @@ assessment#:#cloze_text#:#Cloze Text assessment#:#cloze_textgap_case_insensitive#:#Case Insensitive assessment#:#cloze_textgap_case_sensitive#:#Case Sensitive assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein Distance of %s -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value assessment#:#code#:#Code assessment#:#codebase#:#Codebase assessment#:#concatenation#:#Concatenation diff --git a/lang/ilias_es.lang b/lang/ilias_es.lang index ee433eaf2a8b..8bf8b0ed4617 100644 --- a/lang/ilias_es.lang +++ b/lang/ilias_es.lang @@ -608,9 +608,6 @@ assessment#:#cloze_text#:#Texto relleno assessment#:#cloze_textgap_case_insensitive#:#No sensible a mayúscula assessment#:#cloze_textgap_case_sensitive#:#Sensible a mayúscula assessment#:#cloze_textgap_levenshtein_of#:#Distancia Levenshtein de %s -assessment#:#cloze_textgap_multiple_whitespace#:#Varios espacios en blanco -assessment#:#cloze_textgap_whitespace_after#:#Espacio en blanco después del valor -assessment#:#cloze_textgap_whitespace_before#:#Espacio en blanco antes del valor assessment#:#code#:#Código assessment#:#codebase#:#URL Base (Localización en Internet) assessment#:#concatenation#:#Concatenación diff --git a/lang/ilias_et.lang b/lang/ilias_et.lang index 68022a8101ad..377468f008e2 100644 --- a/lang/ilias_et.lang +++ b/lang/ilias_et.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Lünktekst assessment#:#cloze_textgap_case_insensitive#:#Mittetundlik variant assessment#:#cloze_textgap_case_sensitive#:#Tundlik variant assessment#:#cloze_textgap_levenshtein_of#:#Levenšteini kaugus of %s -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value assessment#:#code#:#Kood assessment#:#codebase#:#Koodibaas assessment#:#concatenation#:#Jätkamine diff --git a/lang/ilias_fa.lang b/lang/ilias_fa.lang index fd8526d8e7cb..6deeb8019ca4 100644 --- a/lang/ilias_fa.lang +++ b/lang/ilias_fa.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#متن assessment#:#cloze_textgap_case_insensitive#:#غیر حساس به کوچک و بزرگی حروف assessment#:#cloze_textgap_case_sensitive#:#حساس به کوچک و بزرگی حروف assessment#:#cloze_textgap_levenshtein_of#:#فاصله Levenshtein %s -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#کد assessment#:#codebase#:#پایگاه کد assessment#:#concatenation#:#Concatenation diff --git a/lang/ilias_fr.lang b/lang/ilias_fr.lang index e05fc7843da5..1317451072fb 100644 --- a/lang/ilias_fr.lang +++ b/lang/ilias_fr.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Texte à trous assessment#:#cloze_textgap_case_insensitive#:#Ne pas distinguer majuscules et minuscules assessment#:#cloze_textgap_case_sensitive#:#Distinguer majuscules et minuscules assessment#:#cloze_textgap_levenshtein_of#:#Distance Levenshtein de %s -assessment#:#cloze_textgap_multiple_whitespace#:#Espaces multiples -assessment#:#cloze_textgap_whitespace_after#:#Espace derrière la valeur -assessment#:#cloze_textgap_whitespace_before#:#Espace avant la valeur assessment#:#code#:#Code assessment#:#codebase#:#Codebase assessment#:#concatenation#:#Concaténation diff --git a/lang/ilias_hr.lang b/lang/ilias_hr.lang index 2dee7232bb96..c50beff0d750 100644 --- a/lang/ilias_hr.lang +++ b/lang/ilias_hr.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Pitanje s prazninom u tekstu assessment#:#cloze_textgap_case_insensitive#:#Neosjetljivo na velika i mala slova assessment#:#cloze_textgap_case_sensitive#:#Osjetljivo na velika i mala slova assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein razmak od%s -assessment#:#cloze_textgap_multiple_whitespace#:#Višestruki razmaci -assessment#:#cloze_textgap_whitespace_after#:#Razmak iza vrijednosti -assessment#:#cloze_textgap_whitespace_before#:#Razmak ispred vrijednosti assessment#:#code#:#Kod assessment#:#codebase#:#Kodna osnova assessment#:#concatenation#:#Povezivanje diff --git a/lang/ilias_hu.lang b/lang/ilias_hu.lang index 2717ed63633b..4e870a8693f9 100644 --- a/lang/ilias_hu.lang +++ b/lang/ilias_hu.lang @@ -621,9 +621,6 @@ assessment#:#cloze_text#:#Kiegészítendő szöveg assessment#:#cloze_textgap_case_insensitive#:#Kis-/nagybetűre nem érzékeny assessment#:#cloze_textgap_case_sensitive#:#Kis-/nagybetűre érzékeny assessment#:#cloze_textgap_levenshtein_of#:#'%s' Levenshtein-távolsága -assessment#:#cloze_textgap_multiple_whitespace#:#Több nem látható karakter -assessment#:#cloze_textgap_whitespace_after#:#Nem látható karakter az érték után -assessment#:#cloze_textgap_whitespace_before#:#Nem látható karakter az érték előtt assessment#:#code#:#Kód assessment#:#codebase#:#Kódbázis assessment#:#concatenation#:#Szavak összekapcsolása diff --git a/lang/ilias_it.lang b/lang/ilias_it.lang index feab05fc8653..361bda843ecd 100644 --- a/lang/ilias_it.lang +++ b/lang/ilias_it.lang @@ -620,9 +620,6 @@ assessment#:#cloze_text#:#Testo corrispondente assessment#:#cloze_textgap_case_insensitive#:#No Maiuscole/minuscole assessment#:#cloze_textgap_case_sensitive#:#Maiuscole/minuscole assessment#:#cloze_textgap_levenshtein_of#:#Distanza di Levenshtein del %s -assessment#:#cloze_textgap_multiple_whitespace#:#Diversi spazi vuoti -assessment#:#cloze_textgap_whitespace_after#:#Spazio vuoto dopo il valore -assessment#:#cloze_textgap_whitespace_before#:#Spazio vuoto prima del valore assessment#:#code#:#Codice assessment#:#codebase#:#Base dei codici assessment#:#concatenation#:#Concatenazione diff --git a/lang/ilias_ja.lang b/lang/ilias_ja.lang index 706734df4bf7..ef1ec068c49e 100644 --- a/lang/ilias_ja.lang +++ b/lang/ilias_ja.lang @@ -58,7 +58,7 @@ acc#:#acc_tree_off#:#ツリー表示しない acc#:#acc_tree_on#:#ツリー表示する adm#:#adm_acc_ctrl_cpt_desc#:#有効にするとアクセッシビリティコントロールコンセプト用のリンクはフッタ-内に表示されます。 adm#:#adm_acc_ctrl_cpt_enable#:#アクセッシビリティコントロールコンセプトを有効にする -adm#:#adm_accessibility_contacts#:#コンタクトのAccessibility Point +adm#:#adm_accessibility_contacts#:#コンタクトのAccessibility Point adm#:#adm_accessibility_contacts_info#:#フッターリンクのaccessibility issue報告用コンタクト。ログインアカウントのコンマ区切りリスト adm#:#adm_awrn_support_contacts_info#:#全てのテクニカルサポートコンタクトが表示されます。ユーザは"全般設定" > "コンタクト情報" セクションのテクニカルサポートコンタクトとして定義されます。 adm#:#adm_support_contacts#:#テクニカルサポート @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#穴埋め問題のテキスト assessment#:#cloze_textgap_case_insensitive#:#大文字・小文字を非区分 assessment#:#cloze_textgap_case_sensitive#:#大文字・小文字を区分 assessment#:#cloze_textgap_levenshtein_of#:#%sのレーベンシュタイン距離 -assessment#:#cloze_textgap_multiple_whitespace#:#複数の白スペース -assessment#:#cloze_textgap_whitespace_after#:#値の後の白スペース -assessment#:#cloze_textgap_whitespace_before#:#値の前の白スペース assessment#:#code#:#コード assessment#:#codebase#:#コードベース assessment#:#concatenation#:#結び付け @@ -2042,7 +2039,7 @@ auth#:#auth_oidc_settings_discovery_error#:#ディスカバリーURLの読込み auth#:#auth_oidc_settings_discovery_url#:#プロバイダーのDiscovery URL auth#:#auth_oidc_settings_img#:#Bild auth#:#auth_oidc_settings_img_file_info#:#ログインページに表示する写真をアップロードします。画像は自動的にOpenId コンテンツログインスクリプトにリンクします。 -auth#:#auth_oidc_settings_invalid_scopes#:#次の値には有効な範囲がありません: %s +auth#:#auth_oidc_settings_invalid_scopes#:#次の値には有効な範囲がありません: %s auth#:#auth_oidc_settings_le#:#プレゼンテーションログインページ auth#:#auth_oidc_settings_login_option_default#:#強制的にログオンしない auth#:#auth_oidc_settings_login_option_default_info#:#有効なセッションがすでに存在する場合は、OpenIdコンテンツサーバーにログインする必要はありません。 @@ -5507,7 +5504,7 @@ common#:#session_config#:#セッション設定 common#:#session_config_maintenance_disabled#:#クライアントによるメンテナンスを禁止する common#:#session_mail_subject_deletion#:# セッション "%s"からユーザ "%s"の登録解除 common#:#session_mail_subject_entered#:#セッション "%s"内ユーザ"%s" の参加 -common#:#session_mail_subject_registered#:#セッション "%s"のユーザ"%s"の登録 +common#:#session_mail_subject_registered#:#セッション "%s"のユーザ"%s"の登録 common#:#session_max_count#:#Maxアクティブセッション common#:#session_max_count_info#:#同時に確立可能な最大セッション数を定義します。"0"の場合この機能はOFFとなります。 common#:#session_max_idle#:#Maxセッションアイドル(分単位) @@ -5949,7 +5946,7 @@ common#:#withdrawal_complete_redirect#:#完全に承諾を取り下げます。 common#:#withdrawal_mail_info#:#取り下げ確認後に以下のメールが管理者へ送られます。:[BR][BR] common#:#withdrawal_mail_subject#:#利用規約承諾の取り下げ common#:#withdrawal_mail_text#:#担当の方へ,[BR][BR]ILIASシステムの利用規約をここに取り下げます。適時アカウントの更新または削除をお願いします。[BR][BR]名前: %1$s[BR]Login: %2$s[BR]External Account: %3$s[BR][BR]早々[BR]%1$s -common#:#withdrawal_sure_account#:#承諾を本当に取り下げますか? +common#:#withdrawal_sure_account#:#承諾を本当に取り下げますか? common#:#withdrawal_sure_account_deletion#:#承諾を本当に取り下げますか? アカウントは取り消し不可能で削除されます。 common#:#withdrawal_sure_account_deletion_no_consent_yet#:#本当に使用許諾を承認しませんか? ユーザアカウントは取消不可で削除されます。 common#:#withdrawal_sure_account_no_consent_yet#:#本当に使用許諾を承認しませんか? @@ -6210,7 +6207,7 @@ content#:#cont_citation_selection_not_valid#:#選択は無効です content#:#cont_click_br_corner#:#希望範囲の右下の角をクリックしてください。 content#:#cont_click_center#:#希望範囲の中央をクリックしてください。 content#:#cont_click_circle#:#希望範囲の円のポイントをクリックしてください。 -content#:#cont_click_edit#:#プロパティを編集するには要素をクリック +content#:#cont_click_edit#:#プロパティを編集するには要素をクリック content#:#cont_click_multi_select#:#要素を 選択クリック または解除する。 content#:#cont_click_next_or_save#:#多角形あるいは保存範囲の次のポイントをクリックしてください。(この多角形の開始点を再度クリックする必要はありません !) content#:#cont_click_next_point#:#多角形の次のポイントをクリックしてください。 @@ -6295,7 +6292,7 @@ content#:#cont_download_title#:#ダウンロード タイトル content#:#cont_downloads#:#ダウンロード content#:#cont_downloads_desc#:#ダウンロード用(オフライン利用やインポート等)に全ての公開エクスポートファイルを提供します。 content#:#cont_downloads_public_desc#:#匿名ユーザに対してもダウンロードを許可する。(共用範囲に限る) -content#:#cont_drag_and_drop_elements#:#Drag and dropでプレースフォルダのコンテンツ要素へ移動 +content#:#cont_drag_and_drop_elements#:#Drag and dropでプレースフォルダのコンテンツ要素へ移動 content#:#cont_drag_element_click_save#:#希望する位置に要素をドラッグアナドドロップする。その後"保存"する。 content#:#cont_ed_align_center#:#整列:中央 content#:#cont_ed_align_left#:#整列:左 @@ -10665,7 +10662,7 @@ lti#:#lti_consumer_set_active#:#Consumerを有効にしました lti#:#lti_consumer_set_inactive#:#Consumerを解除しました lti#:#lti_consumer_updated#:#Consumerを更新しました lti#:#lti_consuming_tab#:#LTI ConsumerとしてのILIAS -lti#:#lti_copy#:#ConsumerをCopy +lti#:#lti_copy#:#ConsumerをCopy lti#:#lti_create_consumer#:#Consumerを作成 lti#:#lti_create_lti_user_role#:#LTI ユーザ用の推奨グローバル役割を作成 lti#:#lti_cron_title#:#LTI Outcome Service @@ -16183,7 +16180,7 @@ sysc#:#sysc_tree_list_failures#:#リポジトリツリーのダンプが作成 sysc#:#sysc_tree_missing_failures#:#ツリー構造内の欠損エントリーが見つかりました欠損エントリー数 sysc#:#sysc_tree_structure_failures#:#ツリー構造(親-関係)内の不良数: tagging#:#no_tag_text_1#:#まだタグは未利用です。実行するには2つのステップを実行する必要があります。 -tagging#:#no_tag_text_2#:# '%s'をクリックして利用可能な提案から学習オブジェクト(例. 学習モジュールまたは掲示板)を選択 +tagging#:#no_tag_text_2#:# '%s'をクリックして利用可能な提案から学習オブジェクト(例. 学習モジュールまたは掲示板)を選択 tagging#:#no_tag_text_3#:#オブジェクトへタグを添付するには、アクションメニューから'タグ設定'を選択します。 tagging#:#tag_remove_tags_of_obj_without_access#:#タグを削除 tagging#:#tag_some_obj_tagged_without_access#:#タグされたオブジェクトにはアクセス権のないものがあります。これらのオブジェクト用のタグを削除しますか? diff --git a/lang/ilias_ka.lang b/lang/ilias_ka.lang index 01b546074c24..227fd2e522ef 100644 --- a/lang/ilias_ka.lang +++ b/lang/ilias_ka.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#ტექსტის დახურვა assessment#:#cloze_textgap_case_insensitive#:#შემთხვევა აუთვისებადია assessment#:#cloze_textgap_case_sensitive#:#შემთხვევა ათვისებულია assessment#:#cloze_textgap_levenshtein_of#:# -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#კოდი assessment#:#codebase#:#კოდების ბაზა assessment#:#concatenation#:#ურთიერთაკვშირი, დამთხვევა diff --git a/lang/ilias_lt.lang b/lang/ilias_lt.lang index 080ca7c5eecb..9a32eeda7b32 100644 --- a/lang/ilias_lt.lang +++ b/lang/ilias_lt.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Sąlygos tekstas assessment#:#cloze_textgap_case_insensitive#:#ABC/abc nesvarbu assessment#:#cloze_textgap_case_sensitive#:#ABC/abc svarbu assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein atstumas iš %s -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Kodas assessment#:#codebase#:#Kodo bazė assessment#:#concatenation#:#Tarpusavio ryšis diff --git a/lang/ilias_nl.lang b/lang/ilias_nl.lang index cdb77c8d2f45..6dea524e523c 100644 --- a/lang/ilias_nl.lang +++ b/lang/ilias_nl.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Verhaspelde zin assessment#:#cloze_textgap_case_insensitive#:#Hoofdletter ongevoelig assessment#:#cloze_textgap_case_sensitive#:#Hoofdletter gevoelig assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein afstand van %s -assessment#:#cloze_textgap_multiple_whitespace#:#Meerdere Whitespaces -assessment#:#cloze_textgap_whitespace_after#:#Whitespace na de waarde -assessment#:#cloze_textgap_whitespace_before#:#Whitespace voor de waarde assessment#:#code#:#Code assessment#:#codebase#:#Codebase assessment#:#concatenation#:#Aaneenschakeling diff --git a/lang/ilias_pl.lang b/lang/ilias_pl.lang index c0300a525d4b..c57e190eca73 100644 --- a/lang/ilias_pl.lang +++ b/lang/ilias_pl.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Uzupełnij tekst assessment#:#cloze_textgap_case_insensitive#:#Nie uwzględniaj wielkości liter assessment#:#cloze_textgap_case_sensitive#:#Uwzględniaj wielkość liter assessment#:#cloze_textgap_levenshtein_of#:#Odległość Levenshtein %s -assessment#:#cloze_textgap_multiple_whitespace#:#Kilka znaków pustych jeden po drugim -assessment#:#cloze_textgap_whitespace_after#:#Znak pusty po pojęciu -assessment#:#cloze_textgap_whitespace_before#:#Znak pusty przed pojęciem assessment#:#code#:#Kod assessment#:#codebase#:#Baza kodu assessment#:#concatenation#:#Złączenie diff --git a/lang/ilias_pt.lang b/lang/ilias_pt.lang index 2f7c5cecaad2..6d7709b1161c 100644 --- a/lang/ilias_pt.lang +++ b/lang/ilias_pt.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Fechar texto assessment#:#cloze_textgap_case_insensitive#:#Caso insensível assessment#:#cloze_textgap_case_sensitive#:#Caso sensível assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein distância de %s -assessment#:#cloze_textgap_multiple_whitespace#:#Múltiplos espaços em branco -assessment#:#cloze_textgap_whitespace_after#:#Espaço branco depois do valor -assessment#:#cloze_textgap_whitespace_before#:#Espaço branco antes do valor assessment#:#code#:#Código assessment#:#codebase#:#Base do código assessment#:#concatenation#:#Concatenação diff --git a/lang/ilias_ro.lang b/lang/ilias_ro.lang index a1c83eefd772..447afe68ce2a 100644 --- a/lang/ilias_ro.lang +++ b/lang/ilias_ro.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Text cu spatii se completat assessment#:#cloze_textgap_case_insensitive#:#Case insensitive###03 Nov 2005 new variable assessment#:#cloze_textgap_case_sensitive#:#Case sensitive###03 Nov 2005 new variable assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein distance of %s###03 Nov 2005 new variable -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Cod assessment#:#codebase#:#Codebase###10 Jul 2006 new variable assessment#:#concatenation#:#Concatenare diff --git a/lang/ilias_ru.lang b/lang/ilias_ru.lang index b324c8f8189a..cdef10034273 100644 --- a/lang/ilias_ru.lang +++ b/lang/ilias_ru.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Текст с пропусками assessment#:#cloze_textgap_case_insensitive#:#Нечувствительный к регистру assessment#:#cloze_textgap_case_sensitive#:#Чувствительный к регистру assessment#:#cloze_textgap_levenshtein_of#:#Расстояние Левинштейна %s -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Код assessment#:#codebase#:#Кодовая база assessment#:#concatenation#:#Конкатенация diff --git a/lang/ilias_sk.lang b/lang/ilias_sk.lang index 62c532b1dbbe..68f6841c0b0a 100644 --- a/lang/ilias_sk.lang +++ b/lang/ilias_sk.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Doplňovaný text assessment#:#cloze_textgap_case_insensitive#:#Nerozlišuje velká/malá písmena assessment#:#cloze_textgap_case_sensitive#:#Rozlišuje velká/malá písmena assessment#:#cloze_textgap_levenshtein_of#:#Vzdálenost Levenshtein %s -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Kód assessment#:#codebase#:#Databáze kódu assessment#:#concatenation#:#Sřetězení diff --git a/lang/ilias_sl.lang b/lang/ilias_sl.lang index 82db949cbbf2..1aa554c806c5 100644 --- a/lang/ilias_sl.lang +++ b/lang/ilias_sl.lang @@ -620,9 +620,6 @@ assessment#:#cloze_text#:#Vprašanje s praznino v besedilu assessment#:#cloze_textgap_case_insensitive#:#Ni razlikovanja med velikimi in malimi črkami assessment#:#cloze_textgap_case_sensitive#:#Upoštevaj razlikovanje velikih in malih črk assessment#:#cloze_textgap_levenshtein_of#:#Levenshteinov razmik v %s -assessment#:#cloze_textgap_multiple_whitespace#:#Več zaporednih presledkov -assessment#:#cloze_textgap_whitespace_after#:#Presledek za pojmom -assessment#:#cloze_textgap_whitespace_before#:#Presledek pred pojmom assessment#:#code#:#Koda assessment#:#codebase#:#Osnova kode assessment#:#concatenation#:#Povezava @@ -3031,7 +3028,7 @@ classification#:#clsfct_block_info#:#Your Selection filters the objects. classification#:#clsfct_block_title#:#Selection by Topics classification#:#clsfct_content_no_match#:#No objects match your selected criteria. classification#:#clsfct_content_title#:#Objects matching your selection -classification#:#clsfct_selected_objects#:#Selected Objects +classification#:#clsfct_selected_objects#:#Selected Objectsd cmix#:#achieved_info#:#Successfully bring about or reach a desired objective, level, or result by effort, skill, or courage. cmix#:#achieved_label#:#Statements with the verb 'achieved' cmix#:#activity_id#:#Activity-ID diff --git a/lang/ilias_sq.lang b/lang/ilias_sq.lang index 929441021d1d..d3d6ecc0531c 100644 --- a/lang/ilias_sq.lang +++ b/lang/ilias_sq.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Mbyll tekstin###20 Jun 2005 content changed assessment#:#cloze_textgap_case_insensitive#:#Case insensitive###03 Nov 2005 new variable assessment#:#cloze_textgap_case_sensitive#:#Case sensitive###03 Nov 2005 new variable assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein distance of %s###03 Nov 2005 new variable -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Kod assessment#:#codebase#:#Codebase###10 Jul 2006 new variable assessment#:#concatenation#:#Concatenation ### 2006-8-11 --- Add new translation here. diff --git a/lang/ilias_sr.lang b/lang/ilias_sr.lang index 6386db2b7992..656247773be0 100644 --- a/lang/ilias_sr.lang +++ b/lang/ilias_sr.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Zatvori tekst###20 Jun 2005 content changed assessment#:#cloze_textgap_case_insensitive#:#Case insensitive###03 Nov 2005 new variable assessment#:#cloze_textgap_case_sensitive#:#Case sensitive###03 Nov 2005 new variable assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein distance of %s###03 Nov 2005 new variable -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Kod assessment#:#codebase#:#Codebase###10 Jul 2006 new variable assessment#:#concatenation#:#Concatenation ### 2006-8-11 --- Add new translation here. diff --git a/lang/ilias_tr.lang b/lang/ilias_tr.lang index 9c4d6253afc9..de20220b12cd 100644 --- a/lang/ilias_tr.lang +++ b/lang/ilias_tr.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Boşluklu Metin assessment#:#cloze_textgap_case_insensitive#:#Büyük/Küçük Harf Duyarsız assessment#:#cloze_textgap_case_sensitive#:#Büyük/Küçük Harf Duyarlı assessment#:#cloze_textgap_levenshtein_of#:#%S in Levenshtein Uzaklığı -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Kod assessment#:#codebase#:#Codebase assessment#:#concatenation#:#Birleştirme diff --git a/lang/ilias_uk.lang b/lang/ilias_uk.lang index 386cfdf06ab3..d0bb32b6c1a6 100644 --- a/lang/ilias_uk.lang +++ b/lang/ilias_uk.lang @@ -606,9 +606,6 @@ assessment#:#cloze_text#:#Закрити текст###20 Jun 2005 content change assessment#:#cloze_textgap_case_insensitive#:#Case insensitive###03 Nov 2005 new variable assessment#:#cloze_textgap_case_sensitive#:#Case sensitive###03 Nov 2005 new variable assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein distance of %s###03 Nov 2005 new variable -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Код assessment#:#codebase#:#Codebase###25 02 2007 new variable assessment#:#concatenation#:#Об'єднання diff --git a/lang/ilias_vi.lang b/lang/ilias_vi.lang index 9a79811aa637..5e481c04daef 100644 --- a/lang/ilias_vi.lang +++ b/lang/ilias_vi.lang @@ -608,9 +608,6 @@ assessment#:#cloze_text#:#Đoạn văn điền chỗ trống assessment#:#cloze_textgap_case_insensitive#:#Không phân biệt chữ hoa chữ thường assessment#:#cloze_textgap_case_sensitive#:#Phân biệt chữ hoa chữ thường assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein distance of %s/// -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#Mã assessment#:#codebase#:#Codebase###25 02 2007 new variable assessment#:#concatenation#:#Kết hợp diff --git a/lang/ilias_zh.lang b/lang/ilias_zh.lang index 4818e2189769..3dbc8bee06ef 100644 --- a/lang/ilias_zh.lang +++ b/lang/ilias_zh.lang @@ -605,9 +605,6 @@ assessment#:#cloze_text#:#填充测验文本 assessment#:#cloze_textgap_case_insensitive#:#不区分大小写 assessment#:#cloze_textgap_case_sensitive#:#区分大小定 assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein distance of %s -assessment#:#cloze_textgap_multiple_whitespace#:#Multiple Whitespaces###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_after#:#Whitespace behind the value###07 11 2014 new variable -assessment#:#cloze_textgap_whitespace_before#:#Whitespace before the value###07 11 2014 new variable assessment#:#code#:#代码 assessment#:#codebase#:#代码库 assessment#:#concatenation#:#级联 From 77be86fc5a72bdbf8388d0851e6404ea7e3bfef3 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 16 Nov 2023 15:45:11 +0100 Subject: [PATCH 148/497] Calendar: introduce language var for editing either single or all appointments (38775) --- Services/Calendar/classes/class.ilCalendarAppointmentGUI.php | 2 +- lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Services/Calendar/classes/class.ilCalendarAppointmentGUI.php b/Services/Calendar/classes/class.ilCalendarAppointmentGUI.php index 9fcec2cdb2fc..e46395c99aba 100644 --- a/Services/Calendar/classes/class.ilCalendarAppointmentGUI.php +++ b/Services/Calendar/classes/class.ilCalendarAppointmentGUI.php @@ -650,7 +650,7 @@ protected function askEdit(): void $this->ctrl->saveParameter($this, array('seed', 'app_id', 'dt', 'idate')); $confirm = new ilConfirmationGUI(); - $confirm->setHeaderText($this->lng->txt('cal_delete_cal')); + $confirm->setHeaderText($this->lng->txt('cal_edit_single_or_all_info')); $confirm->setFormAction($this->ctrl->getFormAction($this)); $confirm->setCancel($this->lng->txt('cancel'), 'cancel'); $confirm->addItem('appointments[]', (string) $this->app->getEntryId(), $this->app->getTitle()); diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index c748f6918843..02bd51be1018 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -8203,6 +8203,7 @@ dateplaner#:#cal_edit_category#:#Kalender bearbeiten dateplaner#:#cal_edit_milestone#:#Meilenstein bearbeiten dateplaner#:#cal_edit_recurrences#:#Alle Termine bearbeiten dateplaner#:#cal_edit_single#:#Diesen Termin bearbeiten +dateplaner#:#cal_edit_single_or_all_info#:#Wollen Sie nur diesen Termin bearbeiten, oder alle Termine der Serie? dateplaner#:#cal_enable_group_milestones#:#Meilensteine aktivieren dateplaner#:#cal_enable_group_milestones_desc#:#Diese Option aktiviert das Management von Meilensteinen im Kalender (Kurse und Gruppen). dateplaner#:#cal_err_invalid_notification_rcps#:#Bitte korrigieren Sie Ihre Eingabe. Geben Sie ausschließlich ILIAS-Anmeldenamen oder gültige E-Mail-Adressen an. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 00c77ecfeca4..ca8e1294e353 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -8203,6 +8203,7 @@ dateplaner#:#cal_edit_category#:#Edit Calendar dateplaner#:#cal_edit_milestone#:#Edit Milestone dateplaner#:#cal_edit_recurrences#:#Edit all Appointments dateplaner#:#cal_edit_single#:#Edit this Appointment +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series? dateplaner#:#cal_enable_group_milestones#:#Enable Milestones dateplaner#:#cal_enable_group_milestones_desc#:#This option enables milestone planning in the calendar. dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid e-mail addresses. From 7f4cd59668c0f0b7ab670bf4c14d7e59efcc0560 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 16 Nov 2023 16:13:13 +0100 Subject: [PATCH 149/497] Calendar: fix form validation (38776) --- Services/Calendar/classes/class.ilCalendarEntry.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/Calendar/classes/class.ilCalendarEntry.php b/Services/Calendar/classes/class.ilCalendarEntry.php index c99a37f01b59..e104b0c63fcc 100644 --- a/Services/Calendar/classes/class.ilCalendarEntry.php +++ b/Services/Calendar/classes/class.ilCalendarEntry.php @@ -118,7 +118,7 @@ public function getStart(): ?ilDateTime return $this->start; } - public function setStart(ilDateTime $a_start): void + public function setStart(?ilDateTime $a_start): void { $this->start = $a_start; } @@ -128,7 +128,7 @@ public function getEnd(): ?ilDateTime return $this->end; } - public function setEnd(ilDateTime $a_end): void + public function setEnd(?ilDateTime $a_end): void { $this->end = $a_end; } From c0bd3049d274bdd48ba78fddb5161043802f5268 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 16 Nov 2023 16:56:21 +0100 Subject: [PATCH 150/497] Calendar: remove duplicate search field (26442, 38806) --- Services/Calendar/classes/class.ilCalendarCategoryGUI.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Services/Calendar/classes/class.ilCalendarCategoryGUI.php b/Services/Calendar/classes/class.ilCalendarCategoryGUI.php index 2d8acd649a9c..d0a887a0bb84 100644 --- a/Services/Calendar/classes/class.ilCalendarCategoryGUI.php +++ b/Services/Calendar/classes/class.ilCalendarCategoryGUI.php @@ -498,7 +498,6 @@ public function sharePerformSearch(): void return; } - $this->getSearchToolbar(); $res_sum = new ilSearchResult(); $query_parser = new ilQueryParser(ilUtil::stripSlashes($query)); @@ -553,6 +552,8 @@ public function sharePerformSearch(): void $this->showRoleList($res_sum->getResultIds()); break; } + + $this->getSearchToolbar(); } /** From 6670bd6dc20c4ce6cef005d83ee14d89a0d1ea39 Mon Sep 17 00:00:00 2001 From: lscharmer <52695099+lscharmer@users.noreply.github.com> Date: Fri, 17 Nov 2023 10:16:41 +0100 Subject: [PATCH 151/497] Add wac check for question file upload preview images (#6501) --- .../Test/classes/AccessFileUploadPreview.php | 115 ++++++++++++++++ Modules/Test/classes/AccessQuestionImage.php | 2 - .../Test/classes/class.ilObjTestAccess.php | 2 + .../Test/test/AccessFileUploadPreviewTest.php | 125 ++++++++++++++++++ 4 files changed, 242 insertions(+), 2 deletions(-) create mode 100644 Modules/Test/classes/AccessFileUploadPreview.php create mode 100644 Modules/Test/test/AccessFileUploadPreviewTest.php diff --git a/Modules/Test/classes/AccessFileUploadPreview.php b/Modules/Test/classes/AccessFileUploadPreview.php new file mode 100644 index 000000000000..49c09b5efaa4 --- /dev/null +++ b/Modules/Test/classes/AccessFileUploadPreview.php @@ -0,0 +1,115 @@ + */ + private Closure $references_of; + /** @var Closure(int, bool): string */ + private Closure $type_of; + + /** + * @param ilDBInterface $database + * @param ilAccess $access + * @param Incident $incident + * @param Closure(int): list $references_of + * @param Closure(int, bool): string $type_of + */ + public function __construct( + ilDBInterface $database, + ilAccess $access, + ?Incident $incident = null, + $references_of = [ilObject::class, '_getAllReferences'], + $type_of = [ilObject::class, '_lookupType'] + ) { + $this->database = $database; + $this->access = $access; + $this->incident = $incident ?? new Incident(); + $this->references_of = Closure::fromCallable($references_of); + $this->type_of = Closure::fromCallable($type_of); + } + + public function isPermitted(string $path): Result + { + $question_id = $this->questionId($path); + if (!$question_id) { + return new Error('Not a question image path of test questions.'); + } + + $object_id = $this->objectId($question_id); + if (!$object_id) { + return new Ok(false); + } + + $permitted = $this->incident->any([$this, 'refIdPermitted'], ($this->references_of)($object_id)); + + return new Ok($permitted); + } + + /** + * @param int $ref_id + */ + public function refIdPermitted(int $ref_id): bool + { + $ref_id = $ref_id; + $type = ($this->type_of)($ref_id, true); + + switch ($type) { + case 'qpl': return $this->access->checkAccess('read', '', $ref_id); + case 'tst': return $this->access->checkAccess('write', '', $ref_id); + default: return false; + } + } + + private function questionId(string $path): ?int + { + $results = []; + if (!preg_match(':/assessment/qst_preview/\d+/(\d+)/fileuploads/([^/]+)$:', $path, $results)) { + return null; + } + + return (int) $results[1]; + } + + private function objectId(int $question_id): ?int + { + $object_id = $this->database->fetchAssoc($this->database->queryF( + 'SELECT obj_fi FROM qpl_questions WHERE question_id = %s', + [ilDBConstants::T_INTEGER], + [$question_id] + ))['obj_fi'] ?? null; + + return $object_id ? (int) $object_id : null; + } +} diff --git a/Modules/Test/classes/AccessQuestionImage.php b/Modules/Test/classes/AccessQuestionImage.php index d719472c5df1..39858a367b66 100644 --- a/Modules/Test/classes/AccessQuestionImage.php +++ b/Modules/Test/classes/AccessQuestionImage.php @@ -23,8 +23,6 @@ use ILIAS\Data\Result; use ILIAS\Data\Result\Ok; use ILIAS\Data\Result\Error; -use ILIAS\DI\Container; -use Closure; class AccessQuestionImage implements SimpleAccess { diff --git a/Modules/Test/classes/class.ilObjTestAccess.php b/Modules/Test/classes/class.ilObjTestAccess.php index be9b54eae13f..26e6f08dc409 100644 --- a/Modules/Test/classes/class.ilObjTestAccess.php +++ b/Modules/Test/classes/class.ilObjTestAccess.php @@ -18,6 +18,7 @@ use ILIAS\Modules\Test\AccessFileUploadAnswer; use ILIAS\Modules\Test\AccessQuestionImage; +use ILIAS\Modules\Test\AccessFileUploadPreview; use ILIAS\Modules\Test\SimpleAccess; use ILIAS\Modules\Test\Readable; use ILIAS\Data\Result; @@ -45,6 +46,7 @@ public function canBeDelivered(ilWACPath $ilWACPath): bool $can_it = $this->findMatch($ilWACPath->getPath(), [ new AccessFileUploadAnswer($DIC, $readable), new AccessQuestionImage($readable), + new AccessFileUploadPreview($DIC->database(), $DIC->access()), ]); diff --git a/Modules/Test/test/AccessFileUploadPreviewTest.php b/Modules/Test/test/AccessFileUploadPreviewTest.php new file mode 100644 index 000000000000..1e2de67719cc --- /dev/null +++ b/Modules/Test/test/AccessFileUploadPreviewTest.php @@ -0,0 +1,125 @@ +getMockBuilder(ilDBInterface::class)->disableOriginalConstructor()->getMock(); + $access = $this->getMockBuilder(ilAccess::class)->disableOriginalConstructor()->getMock(); + $this->assertInstanceOf(AccessFileUploadPreview::class, new AccessFileUploadPreview($database, $access)); + } + + public function testNoUploadPath() : void + { + $database = $this->getMockBuilder(ilDBInterface::class)->disableOriginalConstructor()->getMock(); + $access = $this->getMockBuilder(ilAccess::class)->disableOriginalConstructor()->getMock(); + + $instance = new AccessFileUploadPreview($database, $access); + $result = $instance->isPermitted('/data/some/path/file.pdf'); + $this->assertFalse($result->isOk()); + } + + public function testFalseWithInvalidId() : void + { + $database = $this->getMockBuilder(ilDBInterface::class)->disableOriginalConstructor()->getMock(); + $access = $this->getMockBuilder(ilAccess::class)->disableOriginalConstructor()->getMock(); + $statement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock(); + + $database->expects(self::once())->method('queryF')->with('SELECT obj_fi FROM qpl_questions WHERE question_id = %s', [ilDBConstants::T_INTEGER], [383])->willReturn($statement); + $database->expects(self::once())->method('fetchAssoc')->with($statement)->willReturn(null); + + $instance = new AccessFileUploadPreview($database, $access); + $result = $instance->isPermitted('http://my-ilias/assessment/qst_preview/123/383/fileuploads/my-file.pdf'); + $this->assertTrue($result->isOk()); + $this->assertFalse($result->value()); + } + + /** + * @dataProvider types + */ + public function testWithTypes(?string $type, bool $permitted, ?string $requires_permission) : void + { + $database = $this->getMockBuilder(ilDBInterface::class)->disableOriginalConstructor()->getMock(); + $access = $this->getMockBuilder(ilAccess::class)->disableOriginalConstructor()->getMock(); + $statement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock(); + $incident = $this->getMockBuilder(Incident::class)->disableOriginalConstructor()->getMock(); + + $ref_called = 0; + $type_called = 0; + $references_of = $this->expectCall(383, [987], $ref_called); + $type_of = $this->expectCall(987, $type, $type_called); + + $database->expects(self::once())->method('queryF')->with('SELECT obj_fi FROM qpl_questions WHERE question_id = %s', [ilDBConstants::T_INTEGER], [383])->willReturn($statement); + $database->expects(self::once())->method('fetchAssoc')->with($statement)->willReturn(['obj_fi' => '383']); + + $incident->expects(self::once())->method('any')->willReturnCallback(function (callable $call_me, array $ref_ids) : bool { + $this->assertEquals([987], $ref_ids); + return $call_me(987); + }); + + if (null === $requires_permission) { + $access->expects(self::never())->method('checkAccess'); + } else { + $access->expects(self::once())->method('checkAccess')->with($requires_permission, '', 987)->willReturn($permitted); + } + + + $instance = new AccessFileUploadPreview($database, $access, $incident, $references_of, $type_of); + $result = $instance->isPermitted('http://my-ilias/assessment/qst_preview/123/383/fileuploads/my-file.pdf'); + $this->assertTrue($result->isOk()); + $this->assertSame($permitted, $result->value()); + + $this->assertSame(1, $ref_called); + $this->assertSame(1, $type_called); + } + + public function types() : array + { + return [ + 'Type qpl with access rights.' => ['qpl', false, 'read'], + 'Type qpl without access rights.' => ['qpl', true, 'read'], + 'Type tst with access rights.' => ['tst', false, 'write'], + 'Type tst without access rights.' => ['tst', true, 'write'], + 'Type crs will never has access rights.' => ['crs', false, null], + 'Unknown types will never have access rights.' => [null, false, null], + ]; + } + + private function expectCall($expected, $return, &$called): Closure + { + return function ($value) use ($expected, $return, &$called) { + $this->assertSame($expected, $value); + $called++; + return $return; + }; + } +} From c6f24abf77bf915e0ae5e654d97f74eab1b7d882 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 17 Nov 2023 13:56:06 +0100 Subject: [PATCH 152/497] MetaData: render copyright badges as icons, add docu (38300) for R8 --- Services/MetaData/README.md | 38 +++++++++++++++++++ .../MetaData/classes/Copyright/Renderer.php | 24 +++++------- .../Setup/class.ilMDCopyrightMigration.php | 29 ++++++++++++++ 3 files changed, 77 insertions(+), 14 deletions(-) create mode 100644 Services/MetaData/README.md diff --git a/Services/MetaData/README.md b/Services/MetaData/README.md new file mode 100644 index 000000000000..c5b7de51c75b --- /dev/null +++ b/Services/MetaData/README.md @@ -0,0 +1,38 @@ +# MetaData + +## Copyright Administration + +ILIAS 8 comes pre-installed with six Creative Commons licenses as well +as 'All rights reserved'. Copyright can be selected for objects that support +LOM when 'Enable Copyright Selection' is checked in the 'Copyright'-tab +of the Metadata Administration. The copyright of an object can be chosen +along with and is persisted in its LOM, see the subtab 'LOM' of the +'Metadata'-tab in the object. + +Installations which were not set up from scratch, but upgraded from a +lower ILIAS version, are not retroactively equipped with the current +version of the CC licenses. These can however be added manually. + +### Pre-Installed Licenses + +| Title | Full Name | URL | Image URL | +|------------------------------------------------------|------------------------------------------------------------------------------------|---------------------------------------------------|-----------------------------------------------------------------------------| +| All rights reserved | This work has all rights reserved by the owner. | - | - | +| Attribution Non-commercial No Derivatives (by-nc-nd) | Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License | http://creativecommons.org/licenses/by-nc-nd/4.0/ | https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nc-nd.svg | +| Attribution Non-commercial Share Alike (by-nc-sa) | Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License | http://creativecommons.org/licenses/by-nc-sa/4.0/ | https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nc-sa.svg | +| Attribution Non-commercial (by-nc) | Creative Commons Attribution-NonCommercial 4.0 International License | http://creativecommons.org/licenses/by-nc/4.0/ | https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nc.svg | +| Attribution No Derivatives (by-nd) | Creative Commons Attribution-NoDerivatives 4.0 International License | http://creativecommons.org/licenses/by-nd/4.0/ | https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nd.svg | +| Attribution Share Alike (by-sa) | Creative Commons Attribution-ShareAlike 4.0 International License | http://creativecommons.org/licenses/by-sa/4.0/ | https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-sa.svg | +| Attribution (by) | Creative Commons Attribution 4.0 International License | http://creativecommons.org/licenses/by/4.0/ | https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by.svg | + +### Default License + +As long as copyright selection is active, every ILIAS object which supports +LOM is shown as being under one of the available licenses. Objects for which +no copyright is explicitely chosen are shown as being under the default +license. This license is always listed first in the 'Available Copyrights' table in +the Metadata Administration and cannot be deleted, but it can be edited. If +not configured otherwise, 'All rights reserved' is the default. + +When no other image is added to the default license, it will be +displayed along with an ©-icon. diff --git a/Services/MetaData/classes/Copyright/Renderer.php b/Services/MetaData/classes/Copyright/Renderer.php index 4b4954e84682..d0afe3106533 100644 --- a/Services/MetaData/classes/Copyright/Renderer.php +++ b/Services/MetaData/classes/Copyright/Renderer.php @@ -21,7 +21,7 @@ namespace ILIAS\MetaData\Copyright; use ILIAS\UI\Factory; -use ILIAS\UI\Component\Image\Image; +use ILIAS\UI\Component\Symbol\Icon\Icon; use ILIAS\UI\Component\Link\Link; use ILIAS\UI\Component\Legacy\Legacy; @@ -36,13 +36,13 @@ public function __construct( } /** - * @return Image[]|Link[]|Legacy[] + * @return Icon[]|Link[]|Legacy[] */ public function toUIComponents(CopyrightDataInterface $copyright): array { $res = []; $has_link = false; - if (!is_null($image = $this->buildImage($copyright))) { + if (!is_null($image = $this->buildIcon($copyright))) { $res[] = $image; } if (!is_null($link = $this->buildLink($copyright))) { @@ -55,24 +55,20 @@ public function toUIComponents(CopyrightDataInterface $copyright): array return $res; } - protected function buildImage(CopyrightDataInterface $copyright): ?Image + protected function buildIcon(CopyrightDataInterface $copyright): ?Icon { if (!$copyright->imageLink()) { return null; } - return $this->getImage( + return $this->getIcon( (string) $copyright->imageLink(), - $copyright->altText(), - (string) $copyright->link() + $copyright->altText() ); } - protected function getImage(string $src, string $alt, string $link): Image + protected function getIcon(string $src, string $alt): Icon { - $image = $this->standardImage($src, $alt); - if ($link !== '') { - $image = $image->withAction($link); - } + $image = $this->customIcon($src, $alt); return $image; } @@ -87,9 +83,9 @@ protected function buildLink(CopyrightDataInterface $copyright): ?Link ); } - protected function standardImage(string $src, string $alt): Image + protected function customIcon(string $src, string $alt): Icon { - return $this->factory->image()->standard($src, $alt); + return $this->factory->symbol()->icon()->custom($src, $alt, Icon::MEDIUM); } protected function standardLink(string $label, string $action): Link diff --git a/Services/MetaData/classes/Setup/class.ilMDCopyrightMigration.php b/Services/MetaData/classes/Setup/class.ilMDCopyrightMigration.php index f5404266b27b..17bc5b3f00a0 100644 --- a/Services/MetaData/classes/Setup/class.ilMDCopyrightMigration.php +++ b/Services/MetaData/classes/Setup/class.ilMDCopyrightMigration.php @@ -109,6 +109,8 @@ protected function extractFields(string $copyright): array $full_name = strip_tags($copyright); } + $image_link = $this->translatePreInstalledLinksToSVG($image_link); + return [ 'full_name' => [\ilDBConstants::T_TEXT, $full_name], 'link' => [\ilDBConstants::T_TEXT, $link], @@ -116,4 +118,31 @@ protected function extractFields(string $copyright): array 'alt_text' => [\ilDBConstants::T_TEXT, $alt_text] ]; } + + protected function translatePreInstalledLinksToSVG(string $image_link): string + { + $mapping = [ + // 4.0 + 'https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nc-nd.svg', + 'https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nc-sa.svg', + 'https://i.creativecommons.org/l/by-nc/4.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nc.svg', + 'https://i.creativecommons.org/l/by-nd/4.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nd.svg', + 'https://i.creativecommons.org/l/by-sa/4.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-sa.svg', + 'https://i.creativecommons.org/l/by/4.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by.svg', + // CC0 + 'https://licensebuttons.net/p/zero/1.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg', + // 3.0 + 'http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nc-nd.svg', + 'http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nc-sa.svg', + 'http://i.creativecommons.org/l/by-nc/3.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nc.svg', + 'http://i.creativecommons.org/l/by-nd/3.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nd.svg', + 'http://i.creativecommons.org/l/by-sa/3.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-sa.svg', + 'http://i.creativecommons.org/l/by/3.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by.svg' + ]; + + if (key_exists($image_link, $mapping)) { + return $mapping[$image_link]; + } + return $image_link; + } } From 54bb9fea9a5c6355034ce6dd081c0ca1e2231ca8 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 17 Nov 2023 14:20:55 +0100 Subject: [PATCH 153/497] 38854: ILIAS Repository page editore freezes: undefinedSyntaxError: Unexpected token '<', --- Services/COPage/classes/class.ilPCParagraph.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Services/COPage/classes/class.ilPCParagraph.php b/Services/COPage/classes/class.ilPCParagraph.php index 9d3fe4790c8f..857b1344d5d5 100755 --- a/Services/COPage/classes/class.ilPCParagraph.php +++ b/Services/COPage/classes/class.ilPCParagraph.php @@ -1229,7 +1229,7 @@ public static function xml2output( $a_text = preg_replace('~~i', "[iln " . $inst_str . "media=\"" . $target_id . "\"/]", $a_text); } else { $a_text = preg_replace('~~i', "[iln media=\"" . $target_id . "\"" . - " target=\"" . $attribs["TargetFrame"] . "\"]", $a_text); + " target=\"" . ($attribs["TargetFrame"] ?? "") . "\"]", $a_text); } break; @@ -1267,16 +1267,16 @@ public static function xml2output( //$found[1] = str_replace("?", "\?", $found[1]); $tstr = ""; if (in_array(($attribs["TargetFrame"] ?? ""), array("FAQ", "Glossary", "Media"))) { - $tstr = ' target="' . $attribs["TargetFrame"] . '"'; + $tstr = ' target="' . ($attribs["TargetFrame"] ?? "") . '"'; } - $a_text = str_replace("", "[xln url=\"" . $attribs["Href"] . "\"$tstr]", $a_text); + $a_text = str_replace("", "[xln url=\"" . ($attribs["Href"] ?? "") . "\"$tstr]", $a_text); } $a_text = str_replace("", "[/xln]", $a_text); // anchor while (preg_match('~~i', $a_text, $found)) { $attribs = self::attribsToArray($found[1]); - $a_text = str_replace("", "[anc name=\"" . ($attribs["Name"] ?? ""). "\"][/anc]", $a_text); + $a_text = str_replace("", "[anc name=\"" . ($attribs["Name"] ?? "") . "\"][/anc]", $a_text); } while (preg_match('~~i', $a_text, $found)) { $attribs = self::attribsToArray($found[1]); From 534ce164efb4eb15f348ea8cdc165d3ca7903252 Mon Sep 17 00:00:00 2001 From: mjansen Date: Fri, 17 Nov 2023 14:29:42 +0100 Subject: [PATCH 154/497] Badges: Cast ids for course learning progress badges --- Modules/Course/classes/Badges/class.ilCourseLPBadge.php | 2 +- Modules/Course/classes/Badges/class.ilCourseLPBadgeGUI.php | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/Course/classes/Badges/class.ilCourseLPBadge.php b/Modules/Course/classes/Badges/class.ilCourseLPBadge.php index 8805e0eb0234..cb0dcf45b392 100644 --- a/Modules/Course/classes/Badges/class.ilCourseLPBadge.php +++ b/Modules/Course/classes/Badges/class.ilCourseLPBadge.php @@ -76,7 +76,7 @@ public function evaluate(int $a_user_id, array $a_params, ?array $a_config): boo // check if all subitems are completed now if ($a_config !== null && isset($a_config['subitems'])) { foreach ($a_config['subitems'] as $subitem_id) { - $subitem_obj_id = $subitem_obj_ids[$subitem_id]; + $subitem_obj_id = (int) $subitem_obj_ids[$subitem_id]; if (ilLPStatus::_lookupStatus($subitem_obj_id, $a_user_id) !== ilLPStatus::LP_STATUS_COMPLETED_NUM) { $completed = false; break; diff --git a/Modules/Course/classes/Badges/class.ilCourseLPBadgeGUI.php b/Modules/Course/classes/Badges/class.ilCourseLPBadgeGUI.php index e080fa866edf..44ca14589b7b 100644 --- a/Modules/Course/classes/Badges/class.ilCourseLPBadgeGUI.php +++ b/Modules/Course/classes/Badges/class.ilCourseLPBadgeGUI.php @@ -55,6 +55,8 @@ public function initConfigForm(ilPropertyFormGUI $a_form, int $a_parent_ref_id): } $exp->setTypeWhiteList($white); $subitems->setTitleModifier(function ($a_id): string { + $a_id = (int) $a_id; + $obj_id = ilObject::_lookupObjId($a_id); $olp = ilObjectLP::getInstance($obj_id); $invalid_modes = ilCourseLPBadgeGUI::getInvalidLPModes(); @@ -147,7 +149,7 @@ public function validateForm(ilPropertyFormGUI $a_form): bool $invalid = array(); $invalid_modes = self::getInvalidLPModes(); foreach ($a_form->getInput("subitems") as $ref_id) { - $obj_id = ilObject::_lookupObjId($ref_id); + $obj_id = ilObject::_lookupObjId((int) $ref_id); $olp = ilObjectLP::getInstance($obj_id); if (in_array($olp->getCurrentMode(), $invalid_modes)) { $invalid[] = ilObject::_lookupTitle($obj_id); From 19b210216ff989b753d67ab77e2f0f0200ff9d36 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 17 Nov 2023 15:07:28 +0100 Subject: [PATCH 155/497] MetaData: some clean-up --- Services/MetaData/README.md | 3 --- Services/MetaData/classes/Copyright/Renderer.php | 8 +------- .../classes/Setup/class.ilMDCopyrightMigration.php | 2 -- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/Services/MetaData/README.md b/Services/MetaData/README.md index c5b7de51c75b..ec0d28661670 100644 --- a/Services/MetaData/README.md +++ b/Services/MetaData/README.md @@ -33,6 +33,3 @@ no copyright is explicitely chosen are shown as being under the default license. This license is always listed first in the 'Available Copyrights' table in the Metadata Administration and cannot be deleted, but it can be edited. If not configured otherwise, 'All rights reserved' is the default. - -When no other image is added to the default license, it will be -displayed along with an ©-icon. diff --git a/Services/MetaData/classes/Copyright/Renderer.php b/Services/MetaData/classes/Copyright/Renderer.php index d0afe3106533..36e3dc3f1b72 100644 --- a/Services/MetaData/classes/Copyright/Renderer.php +++ b/Services/MetaData/classes/Copyright/Renderer.php @@ -60,18 +60,12 @@ protected function buildIcon(CopyrightDataInterface $copyright): ?Icon if (!$copyright->imageLink()) { return null; } - return $this->getIcon( + return $this->customIcon( (string) $copyright->imageLink(), $copyright->altText() ); } - protected function getIcon(string $src, string $alt): Icon - { - $image = $this->customIcon($src, $alt); - return $image; - } - protected function buildLink(CopyrightDataInterface $copyright): ?Link { if (!$copyright->link()) { diff --git a/Services/MetaData/classes/Setup/class.ilMDCopyrightMigration.php b/Services/MetaData/classes/Setup/class.ilMDCopyrightMigration.php index 17bc5b3f00a0..57e150e93796 100644 --- a/Services/MetaData/classes/Setup/class.ilMDCopyrightMigration.php +++ b/Services/MetaData/classes/Setup/class.ilMDCopyrightMigration.php @@ -129,8 +129,6 @@ protected function translatePreInstalledLinksToSVG(string $image_link): string 'https://i.creativecommons.org/l/by-nd/4.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nd.svg', 'https://i.creativecommons.org/l/by-sa/4.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-sa.svg', 'https://i.creativecommons.org/l/by/4.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by.svg', - // CC0 - 'https://licensebuttons.net/p/zero/1.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg', // 3.0 'http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nc-nd.svg', 'http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png' => 'https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by-nc-sa.svg', From 7d3b86e1d6124fca87c22950ac8d802e5409a96c Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 17 Nov 2023 16:46:44 +0100 Subject: [PATCH 156/497] 38810: Syntax error after attempting to edit an image --- .../MediaObject/class.ilPCMediaObjectEditorGUI.php | 4 ++++ Services/COPage/classes/class.ilPCMediaObject.php | 7 +++++-- .../COPage/classes/class.ilPCMediaObjectQuickEdit.php | 6 ++++-- Services/COPage/classes/class.ilPageObject.php | 4 +--- Services/MediaObjects/classes/class.ilObjMediaObject.php | 8 ++++---- lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 7 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Services/COPage/Editor/Components/MediaObject/class.ilPCMediaObjectEditorGUI.php b/Services/COPage/Editor/Components/MediaObject/class.ilPCMediaObjectEditorGUI.php index 4f831c539675..0c171ec22398 100644 --- a/Services/COPage/Editor/Components/MediaObject/class.ilPCMediaObjectEditorGUI.php +++ b/Services/COPage/Editor/Components/MediaObject/class.ilPCMediaObjectEditorGUI.php @@ -81,6 +81,10 @@ public function getEditComponentForm( $pc_media_gui->setStyleId($style_id); $pc_media_gui->getCharacteristicsOfCurrentStyle(["media_cont"]); + if (is_null($pc_media->getMediaObject())) { + return "
" . $ui_wrapper->getRenderedInfoBox($lng->txt("copg_pc_mob_does_not_exist")) . + $ui_wrapper->getRenderedButton($lng->txt("cancel"), "form-button", "component.cancel", null, "Page") . "
"; + } $media = $pc_media->getMediaObject()->getMediaItem("Standard"); // title diff --git a/Services/COPage/classes/class.ilPCMediaObject.php b/Services/COPage/classes/class.ilPCMediaObject.php index dffb212abaeb..e9dea62306e0 100755 --- a/Services/COPage/classes/class.ilPCMediaObject.php +++ b/Services/COPage/classes/class.ilPCMediaObject.php @@ -328,7 +328,7 @@ public static function beforePageDelete( ilObjMediaObject::_deleteAllUsages( $a_page->getParentType() . ":pg", $a_page->getId(), - false, + null, $a_page->getLanguage() ); @@ -364,8 +364,9 @@ public static function saveMobUsage( DOMDocument $a_domdoc, int $a_old_nr = 0 ): array { - $usages = array(); + $log = ilLoggerFactory::getLogger("copg"); + $usages = array(); // media aliases $xpath = new DOMXPath($a_domdoc); $nodes = $xpath->query('//MediaAlias'); @@ -410,9 +411,11 @@ public static function saveMobUsage( $a_old_nr, $a_page->getLanguage() ); + $log->debug("Deleted all mob usages page id: " . $a_page->getId() . ", lang" . $a_page->getLanguage() . ", old nr: " . $a_old_nr); foreach ($usages as $mob_id => $val) { // save usage, if object exists... if (ilObject::_lookupType($mob_id) == "mob") { + $log->debug("Save usage mob id: " . $mob_id . ", old nr: " . $a_old_nr); ilObjMediaObject::_saveUsage( $mob_id, $a_page->getParentType() . ":pg", diff --git a/Services/COPage/classes/class.ilPCMediaObjectQuickEdit.php b/Services/COPage/classes/class.ilPCMediaObjectQuickEdit.php index be5f0a958b0b..dbe2fcffc1fa 100644 --- a/Services/COPage/classes/class.ilPCMediaObjectQuickEdit.php +++ b/Services/COPage/classes/class.ilPCMediaObjectQuickEdit.php @@ -24,7 +24,7 @@ class ilPCMediaObjectQuickEdit { protected ilPCMediaObject $pcmedia; - protected ilObjMediaObject $mob; + protected ?ilObjMediaObject $mob; protected int $usage_cnt; public function __construct( @@ -32,7 +32,9 @@ public function __construct( ) { $this->pcmedia = $pcmedia; $this->mob = $pcmedia->getMediaObject(); - $this->usage_cnt = count($this->mob->getUsages()); + if (!is_null($this->mob)) { + $this->usage_cnt = count($this->mob->getUsages()); + } } // TITLE diff --git a/Services/COPage/classes/class.ilPageObject.php b/Services/COPage/classes/class.ilPageObject.php index f0bae0fcec7b..ecd926af4e5e 100755 --- a/Services/COPage/classes/class.ilPageObject.php +++ b/Services/COPage/classes/class.ilPageObject.php @@ -2606,7 +2606,6 @@ public function update(bool $a_validate = true, bool $a_no_history = false) $old_rec["lang"] ) ); - // the following lines are a workaround for // bug 6741 $last_c = $old_rec["last_change"]; @@ -2625,14 +2624,13 @@ public function update(bool $a_validate = true, bool $a_no_history = false) "ilias_version" => array("text", ILIAS_VERSION_NUMERIC), "nr" => array("integer", (int) $last_nr["mnr"] + 1) )); - $old_content = $old_rec["content"]; $old_domdoc = new DOMDocument(); $old_nr = $last_nr["mnr"] + 1; $old_domdoc->loadXML('' . $old_content); // after history entry creation event - $this->log->debug("calling __afterHistoryEntry"); + $this->log->debug("calling __afterHistoryEntry $old_nr"); $this->__afterHistoryEntry($old_domdoc, $old_content, $old_nr); // only save one time diff --git a/Services/MediaObjects/classes/class.ilObjMediaObject.php b/Services/MediaObjects/classes/class.ilObjMediaObject.php index e4ab4d32add8..e1a835872170 100755 --- a/Services/MediaObjects/classes/class.ilObjMediaObject.php +++ b/Services/MediaObjects/classes/class.ilObjMediaObject.php @@ -800,7 +800,7 @@ public function containsIntLink(): bool public static function _deleteAllUsages( string $a_type, int $a_id, - int $a_usage_hist_nr = 0, + ?int $a_usage_hist_nr = 0, string $a_lang = "-" ): void { global $DIC; @@ -808,7 +808,7 @@ public static function _deleteAllUsages( $ilDB = $DIC->database(); $and_hist = ""; - if ($a_usage_hist_nr > 0) { + if (!is_null($a_usage_hist_nr)) { $and_hist = " AND usage_hist_nr = " . $ilDB->quote($a_usage_hist_nr, "integer"); } @@ -885,7 +885,8 @@ public static function _saveUsage( global $DIC; $ilDB = $DIC->database(); - + $log = ilLoggerFactory::getLogger('mob'); + $log->debug("save usage mob: " . $a_mob_id . ", type " . $a_type . " id: " . $a_id . ", hist: " . $a_usage_hist_nr . ", lang: " . $a_lang); $ilDB->replace( "mob_usage", array( @@ -952,7 +953,6 @@ public static function lookupUsages( if ($a_include_history) { $hist_str = ", usage_hist_nr"; } - // get usages in pages $q = "SELECT DISTINCT usage_type, usage_id, usage_lang" . $hist_str . " FROM mob_usage WHERE id = " . $ilDB->quote($a_id, "integer"); diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 02bd51be1018..adb8d9b0a1d1 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -7263,6 +7263,7 @@ copg#:#copg_history_cleanup_cron#:#Seiteneditor Verlaufsbereinigung copg#:#copg_history_cleanup_cron_info#:#Löscht ältere Einträge aus dem Seiteneditorverlauf. copg#:#copg_page_element_not_found#:#Unbekanntes Seitenelement. copg#:#copg_page_type_stys#:#Seitenlayout +copg#:#copg_pc_mob_does_not_exist#:#Das Medienobjekt wurde nicht gefunden. copg#:#copg_questions_not_supported_here#:#In diesem Kontext werden keine Fragen unterstützt. copg#:#copg_reload_page#:#Seite neu laden copg#:#copg_sec_link_info#:#Wählen Sie ein Ziel für die Verlinkung des Blocks. Achtung: In diesem Fall darf der Inhalt des Blocks dann selbst keine weiteren Links enthalten! diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index ca8e1294e353..b9fd0b55656c 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -7263,6 +7263,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history. copg#:#copg_page_element_not_found#:#Page element not found. copg#:#copg_page_type_stys#:#Layout Page +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist. copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context. copg#:#copg_reload_page#:#Reload Page copg#:#copg_sec_link_info#:#Select a target for linking the block. Attention: In this case, the content of the block must not contain any further links itself! From b5d203171ba44d711255873cb72cdfee11b55b13 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 17 Nov 2023 16:53:35 +0100 Subject: [PATCH 157/497] Poll: show disabled block content to anonymous user (35586) --- Modules/Poll/classes/class.ilObjPollGUI.php | 2 +- Modules/Poll/classes/class.ilPollBlock.php | 15 +++--- Modules/Poll/classes/class.ilPollBlockGUI.php | 53 +++++++++++++------ Modules/Poll/templates/default/tpl.block.html | 10 +++- 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/Modules/Poll/classes/class.ilObjPollGUI.php b/Modules/Poll/classes/class.ilObjPollGUI.php index acfb14531d9b..8f6b23f192af 100644 --- a/Modules/Poll/classes/class.ilObjPollGUI.php +++ b/Modules/Poll/classes/class.ilObjPollGUI.php @@ -524,7 +524,7 @@ public function vote(): void } $session_last_poll_vote = ilSession::get('last_poll_vote'); - if ($valid) { + if ($valid && $this->user->getId() != ANONYMOUS_USER_ID) { unset($session_last_poll_vote[$this->object->getId()]); ilSession::set('last_poll_vote', $session_last_poll_vote); $this->object->saveVote($this->user->getId(), $aw); diff --git a/Modules/Poll/classes/class.ilPollBlock.php b/Modules/Poll/classes/class.ilPollBlock.php index bcaf30f111c2..b1aa629cfcd1 100644 --- a/Modules/Poll/classes/class.ilPollBlock.php +++ b/Modules/Poll/classes/class.ilPollBlock.php @@ -68,7 +68,7 @@ public function hasAnyContent(int $a_user_id, int $a_ref_id): bool return false; } - if (!$this->mayVote($a_user_id) && + if (!$this->maySeeQuestion($a_user_id) && !$this->maySeeResults($a_user_id)) { return false; } @@ -76,16 +76,12 @@ public function hasAnyContent(int $a_user_id, int $a_ref_id): bool return true; } - public function mayVote(int $a_user_id): bool + public function maySeeQuestion($a_user_id): bool { if (!$this->active) { return false; } - if ($a_user_id === ANONYMOUS_USER_ID) { - return false; - } - if ($this->poll->hasUserVoted($a_user_id)) { return false; } @@ -99,6 +95,11 @@ public function mayVote(int $a_user_id): bool return true; } + public function mayVote($a_user_id): bool + { + return $this->maySeeQuestion($a_user_id) && $a_user_id != ANONYMOUS_USER_ID; + } + public function mayNotResultsYet(): bool { if ($this->poll->getViewResults() === ilObjPoll::VIEW_RESULTS_AFTER_PERIOD && @@ -122,7 +123,7 @@ public function maySeeResults(int $a_user_id): bool case ilObjPoll::VIEW_RESULTS_ALWAYS: // fallthrough - // #12023 - see mayNotResultsYet() + // #12023 - see mayNotResultsYet() case ilObjPoll::VIEW_RESULTS_AFTER_PERIOD: return true; diff --git a/Modules/Poll/classes/class.ilPollBlockGUI.php b/Modules/Poll/classes/class.ilPollBlockGUI.php index 0de9096d92cf..58fe991d7c46 100644 --- a/Modules/Poll/classes/class.ilPollBlockGUI.php +++ b/Modules/Poll/classes/class.ilPollBlockGUI.php @@ -123,7 +123,7 @@ public function fillRow(array $a_set): void if (!$this->container_view_manager->isAdminView()) { // vote - if ($this->poll_block->mayVote($this->user->getId())) { + if ($this->poll_block->maySeeQuestion($this->user->getId())) { $this->tpl->setCurrentBlock("mode_info_bl"); if ($this->poll_block->getPoll()->getNonAnonymous()) { $mode_info = $this->lng->txt("poll_non_anonymous_warning"); @@ -157,6 +157,7 @@ public function fillRow(array $a_set): void $this->tpl->setCurrentBlock("answer"); foreach ($a_set->getAnswers() as $item) { + $status = []; $id = (int) ($item['id'] ?? 0); $answer = (string) ($item['answer'] ?? 0); if (!$is_multi_answer) { @@ -167,30 +168,41 @@ public function fillRow(array $a_set): void $this->tpl->setVariable("ANSWER_NAME", "aw[]"); if (!empty($last_vote) && is_array($last_vote) && in_array($id, $last_vote)) { - $this->tpl->setVariable("ANSWER_STATUS", 'checked="checked"'); + $status[] = 'checked="checked"'; } } + + if (!$this->poll_block->mayVote($this->user->getId())) { + $status[] = 'disabled'; + } + + if (!empty($status)) { + $this->tpl->setVariable("ANSWER_STATUS", implode(' ', $status)); + } + $this->tpl->setVariable("VALUE_ANSWER", $id); $this->tpl->setVariable("TXT_ANSWER_VOTE", nl2br($answer)); $this->tpl->parseCurrentBlock(); } - $this->ctrl->setParameterByClass( - $this->getRepositoryObjectGUIName(), - "ref_id", - $this->getRefId() - ); - $url = $this->ctrl->getLinkTargetByClass( - array("ilrepositorygui", $this->getRepositoryObjectGUIName()), - "vote" - ); - $this->ctrl->clearParametersByClass($this->getRepositoryObjectGUIName()); + if ($this->poll_block->mayVote($this->user->getId())) { + $this->ctrl->setParameterByClass( + $this->getRepositoryObjectGUIName(), + "ref_id", + $this->getRefId() + ); + $url = $this->ctrl->getLinkTargetByClass( + array("ilrepositorygui", $this->getRepositoryObjectGUIName()), + "vote" + ); + $this->ctrl->clearParametersByClass($this->getRepositoryObjectGUIName()); - $url .= "#poll" . $a_set->getID(); + $url .= "#poll" . $a_set->getID(); - $this->tpl->setVariable("URL_FORM", $url); - $this->tpl->setVariable("CMD_FORM", "vote"); - $this->tpl->setVariable("TXT_SUBMIT", $this->lng->txt("poll_vote")); + $this->tpl->setVariable("URL_FORM", $url); + $this->tpl->setVariable("CMD_FORM", "vote"); + $this->tpl->setVariable("TXT_SUBMIT", $this->lng->txt("poll_vote")); + } if ($this->poll_block->getPoll()->getVotingPeriod()) { $this->tpl->setVariable( @@ -293,7 +305,7 @@ public function fillRow(array $a_set): void } } - if (!$this->poll_block->mayVote($this->user->getId()) && !$this->poll_block->getPoll()->hasUserVoted($this->user->getId())) { + if (!$this->poll_block->maySeeQuestion($this->user->getId()) && !$this->poll_block->getPoll()->hasUserVoted($this->user->getId())) { if ($this->poll_block->getPoll()->getVotingPeriod()) { $this->tpl->setVariable( "TXT_VOTING_PERIOD", @@ -323,6 +335,13 @@ public function fillRow(array $a_set): void } + if ($this->user->getId() == ANONYMOUS_USER_ID) { + $this->tpl->setCurrentBlock("anon_warning"); + $this->tpl->setVariable("ANON_WARNING", $this->lng->txt('no_access_item_public')); + $this->tpl->parseCurrentBlock(); + } + + if ($this->poll_block->showComments()) { $this->tpl->setCurrentBlock("comment_link"); $this->tpl->setVariable("LANG_COMMENTS", $this->lng->txt('poll_comments')); diff --git a/Modules/Poll/templates/default/tpl.block.html b/Modules/Poll/templates/default/tpl.block.html index decf778429cb..11f29853e997 100644 --- a/Modules/Poll/templates/default/tpl.block.html +++ b/Modules/Poll/templates/default/tpl.block.html @@ -31,8 +31,10 @@ + - + +
{TXT_VOTING_END_PERIOD}
@@ -40,7 +42,7 @@ - + @@ -65,6 +67,10 @@ + + +
{ANON_WARNING}
+
From e1294323f31463e2e1102a2cf1552be5ca3f9e84 Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Fri, 17 Nov 2023 17:39:00 +0100 Subject: [PATCH 158/497] Fixed Mantis 38601: Lang var #adm_support_contacts_info --- lang/ilias_de.lang | 2 +- lang/ilias_en.lang | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index adb8d9b0a1d1..d9b12206fe69 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -77,7 +77,7 @@ adm#:#adm_accessibility_contacts#:#Anlaufstelle für Barrierefreiheit adm#:#adm_accessibility_contacts_info#:#Kontaktpersonen zur Meldung von Problemen mit der Barrierefreiheit in der Fußzeile. Komma-separierte Liste von ILIAS-Konten. adm#:#adm_awrn_support_contacts_info#:#Alle Benutzer für die technische Betreuung werden aufgelistet. Der technischen Betreuung zugeordnet werden Benutzer im Administrationsbereich „Systemeinstellungen und Wartung » Allgemeine Einstellungen“, Reiter „Kontaktinformationen”. adm#:#adm_support_contacts#:#Technische Betreuung -adm#:#adm_support_contacts_info#:#Komma-separierte Liste von Anmeldenamen. Die hier eingetragenen Personen werden in der Fußzeile als Betreuung verlinkt. Falls die „Wer ist online?“-Anzeige genutzt wird, werden die Personen auch dort als technische Betreuung angezeigt. +adm#:#adm_support_contacts_info#:#Bitte tragen Sie hier komma-separiert die Anmeldenamen der Personen ein, die bei Fragen und technischen Problemen kontaktiert werden können. Die Kontaktaufnahme erfolgt per Mail über den Link „Technische Betreuung kontaktieren“ im Footer von ILIAS. Ist die „Wer ist online?“-Anzeige aktiv, werden diese Personen auch dort als technische Betreuung angezeigt. administration#:#adm_achievements#:#Lernerfolge administration#:#adm_activate_db_benchmark#:#Messung aktivieren administration#:#adm_activate_db_benchmark_desc#:#Die Messung wird automatisch nach einem Server-Request beendet. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index b9fd0b55656c..bf43510d3b6a 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -77,7 +77,7 @@ adm#:#adm_accessibility_contacts#:#Contact Point for Accessibility Issues adm#:#adm_accessibility_contacts_info#:#Contacts for the ‘Report Accessibility Issue’ link in your installation’s footer. Comma-separated list of account usernames (logins). adm#:#adm_awrn_support_contacts_info#:#All users assigned as contacts for technical support are listed. Users can be assigned to the list of technical support contacts in the administration section 'System Settings and Maintenance » General Settings', tab 'Contact Information'. adm#:#adm_support_contacts#:#Technical Support -adm#:#adm_support_contacts_info#:#Technical support contacts accessible via link in footer and (if activated) in the ‘Who is online?’ Tool. Comma-separated list of account usernames (logins). +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 ILIAS footer. If the "Who is online?" display is active, these people will also be displayed there as technical support. administration#:#adm_achievements#:#Achievements administration#:#adm_activate_db_benchmark#:#Activate Benchmarking administration#:#adm_activate_db_benchmark_desc#:#Benchmarking will be automatically disabled after one request. From 3366be0d8b601868fb6e7ed49abb9675cb140b6e Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sat, 18 Nov 2023 15:49:59 +0100 Subject: [PATCH 159/497] fixed 38891: Rename wiki page does not update links in other pages --- Modules/Wiki/classes/class.ilWikiPage.php | 21 ++++++++++++++++++--- Modules/Wiki/classes/class.ilWikiUtil.php | 15 ++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/Modules/Wiki/classes/class.ilWikiPage.php b/Modules/Wiki/classes/class.ilWikiPage.php index 9b90864c5abd..3b5afeef7597 100755 --- a/Modules/Wiki/classes/class.ilWikiPage.php +++ b/Modules/Wiki/classes/class.ilWikiPage.php @@ -539,6 +539,7 @@ public function saveInternalLinks( // *** STEP 2: Other Pages -> This Page *** + $this->log->debug("this page <- other pages."); // Check, whether ANOTHER page links to this page as a "missing" page // (this is the case, when this page is created newly) @@ -549,6 +550,8 @@ public function saveInternalLinks( array($this->getWikiId(), ilWikiUtil::makeDbTitle($this->getTitle())) ); while ($anmiss = $ilDB->fetchAssoc($set)) { // insert internal links instead + $this->log->debug("link found, source: " . $anmiss["source_id"] . ", target" . + $this->getId()); //echo "adding link"; ilInternalLink::_saveLink( "wpg:pg", @@ -569,6 +572,7 @@ public function saveInternalLinks( // *** STEP 3: This Page -> Other Pages *** + $this->log->debug("this page -> other pages."); // remove the exising "missing page" links for THIS page (they will be re-inserted below) $ilDB->manipulateF( @@ -582,9 +586,11 @@ public function saveInternalLinks( $xml = $a_domdoc->saveXML(); $int_wiki_links = ilWikiUtil::collectInternalLinks($xml, $this->getWikiId(), true); foreach ($int_wiki_links as $wlink) { + $this->log->debug("found link : " . $wlink); $page_id = self::_getPageIdForWikiTitle($this->getWikiId(), $wlink); - if ($page_id > 0) { // save internal link for existing page + $this->log->debug("save link " . + $this->getId() . ", target " . $page_id); ilInternalLink::_saveLink( "wpg:pg", $this->getId(), @@ -599,6 +605,8 @@ public function saveInternalLinks( array("integer", "integer", "text"), array($this->getWikiId(), $this->getId(), $wlink) ); + $this->log->debug("target does not exist, save missing page source" . + $this->getId() . ", target " . $wlink); $ilDB->manipulateF( "INSERT INTO il_wiki_missing_page (wiki_id, source_id, target_name)" . " VALUES (%s,%s,%s)", @@ -738,17 +746,24 @@ public function rename( if ($pg_id == 0 || $pg_id == $this->getId()) { $sources = ilInternalLink::_getSourcesOfTarget("wpg", $this->getId(), 0); + $this->log->debug("nr of pages linking to renamed page: " . count($sources)); foreach ($sources as $s) { if ($s["type"] === "wpg:pg" && ilPageObject::_exists("wpg", $s["id"])) { $wpage = new ilWikiPage($s["id"]); - + $wiki_id = ilWikiPage::lookupWikiId($s["id"]); + $this->log->debug("Getting links of page " . $s["id"]); $col = ilWikiUtil::collectInternalLinks( $wpage->getXMLContent(), - 0 + $wiki_id, + false, + IL_WIKI_MODE_EXT_COLLECT ); + $this->log->debug("nr internal links: " . count($col)); $new_content = $wpage->getXMLContent(); foreach ($col as $c) { + $this->log->debug("found link " . print_r($c, true)); + // this complicated procedure is needed due to the fact // that depending on the collation e = é is true // in the (mysql) database diff --git a/Modules/Wiki/classes/class.ilWikiUtil.php b/Modules/Wiki/classes/class.ilWikiUtil.php index 61127555df16..400f259ef9be 100755 --- a/Modules/Wiki/classes/class.ilWikiUtil.php +++ b/Modules/Wiki/classes/class.ilWikiUtil.php @@ -69,14 +69,22 @@ public static function replaceInternalLinks( public static function collectInternalLinks( string $s, int $a_wiki_id, - bool $a_collect_non_ex = false + bool $a_collect_non_ex = false, + string $mode = IL_WIKI_MODE_COLLECT ): array { - return self::processInternalLinks( + $log = ilLoggerFactory::getLogger("wiki"); + + $log->debug("collect interna links wiki id: " . $a_wiki_id . ", collect nonex: " . $a_collect_non_ex); + + $result = self::processInternalLinks( $s, $a_wiki_id, - IL_WIKI_MODE_COLLECT, + $mode, $a_collect_non_ex ); + $log->debug("content: " . $s); + $log->debug("found: " . print_r($result, true)); + return $result; } /** @@ -91,6 +99,7 @@ public static function processInternalLinks( bool $a_collect_non_ex = false, bool $a_offline = false ) { + include_once("./Modules/Wiki/libs/Sanitizer.php"); $collect = array(); // both from mediawiki DefaulSettings.php From 9a6d876abbf8c4c64c6a50b0e25926d22f6b32ef Mon Sep 17 00:00:00 2001 From: mjansen Date: Sat, 18 Nov 2023 20:09:54 +0100 Subject: [PATCH 160/497] Certificate: Fix indexes --- .../classes/Setup/class.ilCertificateDatabaseUpdateSteps.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/Certificate/classes/Setup/class.ilCertificateDatabaseUpdateSteps.php b/Services/Certificate/classes/Setup/class.ilCertificateDatabaseUpdateSteps.php index 13c537e50380..4aad39124252 100644 --- a/Services/Certificate/classes/Setup/class.ilCertificateDatabaseUpdateSteps.php +++ b/Services/Certificate/classes/Setup/class.ilCertificateDatabaseUpdateSteps.php @@ -65,14 +65,14 @@ public function step_5(): void { if ( $this->db->tableExists('il_cert_template') - && !$this->db->indexExistsByFields('il_cert_template', ['obj_id', 'background_image_path']) + && !$this->db->indexExistsByFields('il_cert_template', ['background_image_path', 'currently_active']) ) { $this->db->addIndex('il_cert_template', ['background_image_path', 'currently_active'], 'i5'); } if ( $this->db->tableExists('il_cert_user_cert') - && !$this->db->indexExistsByFields('il_cert_user_cert', ['obj_id', 'background_image_path']) + && !$this->db->indexExistsByFields('il_cert_user_cert', ['background_image_path', 'currently_active']) ) { $this->db->addIndex('il_cert_user_cert', ['background_image_path', 'currently_active'], 'i7'); } From 092946e6bc7deadbe604b09d058c80661237c02b Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Fri, 17 Nov 2023 15:10:53 +0100 Subject: [PATCH 161/497] OpenId: Fix post_logout_redirect_uri Relative See: https://mantis.ilias.de/view.php?id=38873 --- .../OpenIdConnect/classes/class.ilAuthProviderOpenIdConnect.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/OpenIdConnect/classes/class.ilAuthProviderOpenIdConnect.php b/Services/OpenIdConnect/classes/class.ilAuthProviderOpenIdConnect.php index 8e81f69d53c6..71c2cf32edab 100644 --- a/Services/OpenIdConnect/classes/class.ilAuthProviderOpenIdConnect.php +++ b/Services/OpenIdConnect/classes/class.ilAuthProviderOpenIdConnect.php @@ -60,7 +60,7 @@ public function handleLogout(): void try { $oidc->signOut( $id_token, - ilStartUpGUI::logoutUrl() + ILIAS_HTTP_PATH . '/' . ilStartUpGUI::logoutUrl() ); } catch (\Jumbojett\OpenIDConnectClientException $e) { $this->logger->warning("Logging out of OIDC provider failed with: " . $e->getMessage()); From aafb8b8a51f123ab8825bd7a4b7fc6b30b91595e Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 19 Nov 2023 09:35:52 +0100 Subject: [PATCH 162/497] wiki: added tests for link handling --- Modules/Wiki/classes/class.ilWikiUtil.php | 3 +- Modules/Wiki/test/WikiUtilTest.php | 223 +++++++++++++++++++++- 2 files changed, 220 insertions(+), 6 deletions(-) diff --git a/Modules/Wiki/classes/class.ilWikiUtil.php b/Modules/Wiki/classes/class.ilWikiUtil.php index 400f259ef9be..bc52e0324b4f 100755 --- a/Modules/Wiki/classes/class.ilWikiUtil.php +++ b/Modules/Wiki/classes/class.ilWikiUtil.php @@ -267,8 +267,7 @@ public function lc($a_key): bool } else { $db_title = self::makeDbTitle($nt->mTextform); - if ((ilWikiPage::_wikiPageExists($a_wiki_id, $db_title) || - $a_collect_non_ex) + if (($a_collect_non_ex || ilWikiPage::_wikiPageExists($a_wiki_id, $db_title)) && !in_array($db_title, $collect)) { $collect[] = $db_title; diff --git a/Modules/Wiki/test/WikiUtilTest.php b/Modules/Wiki/test/WikiUtilTest.php index 46a42625084c..a88829d002da 100644 --- a/Modules/Wiki/test/WikiUtilTest.php +++ b/Modules/Wiki/test/WikiUtilTest.php @@ -13,10 +13,7 @@ protected function tearDown(): void { } - /** - * Test make URL title - */ - public function testRefId(): void + public function testMakeUrlTitle(): void { $input_expected = [ ["a", "a"] @@ -36,6 +33,7 @@ public function testRefId(): void ,[":", "%3A"] ,["-", "-"] ,["#", "%23"] + ,["?", "%3F"] ,["\x00", ""] ,["\n", ""] ,["\r", ""] @@ -49,4 +47,221 @@ public function testRefId(): void ); } } + + public function testMakeDbTitle(): void + { + $input_expected = [ + ["a", "a"] + ,["z", "z"] + ,["0", "0"] + ,[" ", " "] + ,["_", " "] + ,["!", "!"] + ,["§", "§"] + ,["$", "$"] + ,["%", "%"] + ,["&", "&"] + ,["/", "/"] + ,["(", "("] + ,["+", "+"] + ,[";", ";"] + ,[":", ":"] + ,["-", "-"] + ,["#", "#"] + ,["?", "?"] + ,["\x00", ""] + ,["\n", ""] + ,["\r", ""] + ]; + foreach ($input_expected as $ie) { + $result = ilWikiUtil::makeDbTitle($ie[0]); + + $this->assertEquals( + $ie[1], + $result + ); + } + } + + protected function processInternalLinksExtCollect(string $xml):array + { + return ilWikiUtil::processInternalLinks( + $xml, + 0, + IL_WIKI_MODE_EXT_COLLECT + ); + } + + public function testProcessInternalLinksExtCollect(): void + { + $input_expected = [ + ["", []] + ,["", []] + ]; + foreach ($input_expected as $ie) { + $result = $this->processInternalLinksExtCollect($ie[0]); + + $this->assertEquals( + $ie[1], + $result + ); + } + } + + public function testProcessInternalLinksExtCollectOneSimple(): void + { + $xml = "[[bar]]"; + $r = $this->processInternalLinksExtCollect($xml); + $this->assertEquals( + "bar", + $r[0]["nt"]->mTextform + ); + $this->assertEquals( + "bar", + $r[0]["text"] + ); + } + + public function testProcessInternalLinksExtCollectMultipleSimple(): void + { + $xml = "[[bar]][[bar1]] some text [[bar2]]"; + $r = $this->processInternalLinksExtCollect($xml); + $this->assertEquals( + "bar", + $r[0]["nt"]->mTextform + ); + $this->assertEquals( + "bar1", + $r[1]["nt"]->mTextform + ); + $this->assertEquals( + "bar2", + $r[2]["nt"]->mTextform + ); + } + + public function testProcessInternalLinksExtCollectMultipleSame(): void + { + $xml = "[[bar]][[bar1]] some text [[bar]]"; + $r = $this->processInternalLinksExtCollect($xml); + $this->assertEquals( + "bar", + $r[0]["nt"]->mTextform + ); + $this->assertEquals( + "bar1", + $r[1]["nt"]->mTextform + ); + $this->assertEquals( + "bar", + $r[2]["nt"]->mTextform + ); + } + + public function testProcessInternalLinksExtCollectOneText(): void + { + $xml = "[[bar|some text]]"; + $r = $this->processInternalLinksExtCollect($xml); + $this->assertEquals( + "bar", + $r[0]["nt"]->mTextform + ); + $this->assertEquals( + "some text", + $r[0]["text"] + ); + } + + public function testProcessInternalLinksExtCollectMultiText(): void + { + $xml = "lore [[bar|some text]] ipsumMore [[second link|some text for second]]"; + $r = $this->processInternalLinksExtCollect($xml); + $this->assertEquals( + "bar", + $r[0]["nt"]->mTextform + ); + $this->assertEquals( + "some text", + $r[0]["text"] + ); + $this->assertEquals( + "second link", + $r[1]["nt"]->mTextform + ); + $this->assertEquals( + "some text for second", + $r[1]["text"] + ); + } + + protected function processInternalLinksCollect(string $xml):array + { + return ilWikiUtil::processInternalLinks( + $xml, + 0, + IL_WIKI_MODE_COLLECT, + true + ); + } + + public function testProcessInternalLinksCollectOneSimple(): void + { + $xml = "[[bar]]"; + $r = $this->processInternalLinksCollect($xml); + $this->assertEquals( + ["bar"], + $r + ); + } + + public function testProcessInternalLinksCollectMultipleSame(): void + { + $xml = "[[bar]][[bar1]] some text [[bar]]"; + $r = $this->processInternalLinksCollect($xml); + $this->assertEquals( + ["bar", "bar1"], + $r + ); + } + + public function testProcessInternalLinksCollectMultiText(): void + { + $xml = "lore [[bar|some text]] ipsumMore [[second link|some text for second]]"; + $r = $this->processInternalLinksCollect($xml); + $this->assertEquals( + ["bar", "second link"], + $r + ); + } + + protected function processInternalLinksReplace(string $xml):string + { + return ilWikiUtil::processInternalLinks( + $xml, + 0, + IL_WIKI_MODE_REPLACE + ); + } + + public function testProcessInternalLinksReplaceWithoutLink(): void + { + $xml = "Some text without a link"; + $r = $this->processInternalLinksReplace($xml); + $this->assertEquals( + $xml, + $r + ); + } + + /* + public function testProcessInternalLinksReplaceSimple(): void + { + $xml = "Some text with [[simple]] a link"; + $r = $this->processInternalLinksReplace($xml); + $this->assertEquals( + "todo", + $r + ); + }*/ + } From fa7f84fc752189fa125575972a691438d2bde52b Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 19 Nov 2023 10:00:20 +0100 Subject: [PATCH 163/497] wiki: added tests for link handling --- Modules/Wiki/test/WikiUtilTest.php | 61 +++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/Modules/Wiki/test/WikiUtilTest.php b/Modules/Wiki/test/WikiUtilTest.php index a88829d002da..430a39ef5b38 100644 --- a/Modules/Wiki/test/WikiUtilTest.php +++ b/Modules/Wiki/test/WikiUtilTest.php @@ -1,6 +1,25 @@ createMock(ilDBInterface::class); + $this->setGlobalVariable( + "ilDB", + $db_mock + ); + } + protected function tearDown(): void { } @@ -85,9 +133,10 @@ public function testMakeDbTitle(): void protected function processInternalLinksExtCollect(string $xml):array { - return ilWikiUtil::processInternalLinks( + return ilWikiUtil::collectInternalLinks( $xml, 0, + true, IL_WIKI_MODE_EXT_COLLECT ); } @@ -196,11 +245,11 @@ public function testProcessInternalLinksExtCollectMultiText(): void protected function processInternalLinksCollect(string $xml):array { - return ilWikiUtil::processInternalLinks( + return ilWikiUtil::collectInternalLinks( $xml, 0, - IL_WIKI_MODE_COLLECT, - true + true, + IL_WIKI_MODE_COLLECT ); } @@ -236,10 +285,10 @@ public function testProcessInternalLinksCollectMultiText(): void protected function processInternalLinksReplace(string $xml):string { - return ilWikiUtil::processInternalLinks( + return ilWikiUtil::replaceInternalLinks( $xml, 0, - IL_WIKI_MODE_REPLACE + false ); } From 97f43cbb2eb61d8c7f047314df5a1bf83a694170 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Sun, 19 Nov 2023 10:35:04 +0100 Subject: [PATCH 164/497] Test: Add Confirmation Modal to Mark Schema Reset See: https://mantis.ilias.de/view.php?id=38371 --- .../Test/classes/class.ilMarkSchemaGUI.php | 78 +++++++++++++------ .../Test/classes/class.ilTestTabsManager.php | 2 +- Modules/Test/test/ilMarkSchemaGUITest.php | 2 + lang/ilias_ar.lang | 2 +- lang/ilias_bg.lang | 2 +- lang/ilias_cs.lang | 2 +- lang/ilias_da.lang | 2 +- lang/ilias_de.lang | 3 +- lang/ilias_el.lang | 2 +- lang/ilias_en.lang | 3 +- lang/ilias_es.lang | 2 +- lang/ilias_et.lang | 2 +- lang/ilias_fa.lang | 2 +- lang/ilias_fr.lang | 2 +- lang/ilias_hr.lang | 2 +- lang/ilias_hu.lang | 2 +- lang/ilias_it.lang | 2 +- lang/ilias_ja.lang | 2 +- lang/ilias_ka.lang | 2 +- lang/ilias_lt.lang | 2 +- lang/ilias_nl.lang | 2 +- lang/ilias_pl.lang | 2 +- lang/ilias_pt.lang | 2 +- lang/ilias_ro.lang | 2 +- lang/ilias_ru.lang | 2 +- lang/ilias_sk.lang | 2 +- lang/ilias_sl.lang | 2 +- lang/ilias_sq.lang | 2 +- lang/ilias_sr.lang | 2 +- lang/ilias_tr.lang | 2 +- lang/ilias_uk.lang | 2 +- lang/ilias_vi.lang | 2 +- lang/ilias_zh.lang | 2 +- 33 files changed, 90 insertions(+), 54 deletions(-) diff --git a/Modules/Test/classes/class.ilMarkSchemaGUI.php b/Modules/Test/classes/class.ilMarkSchemaGUI.php index 8a4b11009e98..815d52a132d2 100644 --- a/Modules/Test/classes/class.ilMarkSchemaGUI.php +++ b/Modules/Test/classes/class.ilMarkSchemaGUI.php @@ -19,6 +19,10 @@ use ILIAS\HTTP\Wrapper\RequestWrapper; use GuzzleHttp\Psr7\Request; use ILIAS\Refinery\Factory as Refinery; +use ILIAS\UI\Factory as UIFactory; +use ILIAS\UI\Renderer as UIRenderer; +use ILIAS\UI\Component\Button\Standard as StandardButton; +use ILIAS\UI\Component\Modal\Interruptive as InterruptiveModal; /** * Class ilMarkSchemaGUI @@ -27,6 +31,7 @@ */ class ilMarkSchemaGUI { + private const RESET_MARK_BUTTON_LABEL = 'tst_mark_reset_to_simple_mark_schema'; private RequestWrapper $post_wrapper; private Request $request; private Refinery $refinery; @@ -39,6 +44,9 @@ class ilMarkSchemaGUI protected ilCtrl $ctrl; protected ilGlobalPageTemplate $tpl; protected ilToolbarGUI $toolbar; + protected ilTabsGUI $tabs; + protected UIFactory $ui_factory; + protected UIRenderer $ui_renderer; /** * @param ilMarkSchemaAware|ilEctsGradesEnabled $object @@ -56,6 +64,8 @@ public function __construct($object) $this->post_wrapper = $DIC->http()->wrapper()->post(); $this->request = $DIC->http()->request(); $this->refinery = $DIC->refinery(); + $this->ui_factory = $DIC['ui.factory']; + $this->ui_renderer = $DIC['ui.renderer']; } public function executeCommand(): void @@ -64,6 +74,9 @@ public function executeCommand(): void $DIC->tabs()->activateTab(ilTestTabsManager::TAB_ID_SETTINGS); $cmd = $this->ctrl->getCmd('showMarkSchema'); + if ($cmd === self::RESET_MARK_BUTTON_LABEL) { + $cmd = 'resetToSimpleMarkSchema'; + } $this->$cmd(); } @@ -127,7 +140,7 @@ protected function saveMarkSchemaFormData(): bool return $no_save_error; } - protected function addSimpleMarkSchema(): void + protected function resetToSimpleMarkSchema(): void { $this->ensureMarkSchemaCanBeEdited(); @@ -231,34 +244,53 @@ protected function showMarkSchema(?ilPropertyFormGUI $ects_form = null): void $mark_schema_table = new ilMarkSchemaTableGUI($this, 'showMarkSchema', '', $this->object); $mark_schema_table->setShowRowsSelector(false); + $rendered_modal = ''; if ($this->object->canEditMarks()) { - require_once 'Services/UIComponent/Button/classes/class.ilSubmitButton.php'; - $create_simple_mark_schema_button = ilSubmitButton::getInstance(); - $create_simple_mark_schema_button->setCaption($this->lng->txt('tst_mark_create_simple_mark_schema'), false); - $create_simple_mark_schema_button->setCommand('addSimpleMarkSchema'); - $this->toolbar->addButtonInstance($create_simple_mark_schema_button); - - require_once 'Services/UIComponent/Button/classes/class.ilButton.php'; - $create_new_mark_step_button = ilButton::getInstance(); - $create_new_mark_step_button->setCaption($this->lng->txt('tst_mark_create_new_mark_step'), false); - $create_new_mark_step_button->setButtonType(ilButton::BUTTON_TYPE_SUBMIT); - $create_new_mark_step_button->setForm('form_' . $mark_schema_table->getId()); - $create_new_mark_step_button->setName('addMarkStep'); - $this->toolbar->addButtonInstance($create_new_mark_step_button); + $confirmation_modal = $this->ui_factory->modal()->interruptive( + $this->lng->txt(self::RESET_MARK_BUTTON_LABEL), + $this->lng->txt('tst_mark_reset_to_simple_mark_schema_confirmation'), + $this->ctrl->getFormAction($this, 'resetToSimpleMarkSchema') + )->withActionButtonLabel(self::RESET_MARK_BUTTON_LABEL); + $this->populateToolbar($confirmation_modal, $mark_schema_table->getId()); + $rendered_modal = $this->ui_renderer->render($confirmation_modal); } + $this->tpl->setContent( + $mark_schema_table->getHTML() . $rendered_modal + ); + } - $content_parts = array($mark_schema_table->getHTML()); + private function populateToolbar(InterruptiveModal $confirmation_modal, string $mark_schema_id): void + { + $create_simple_schema_button = $this->ui_factory->button()->standard( + $this->lng->txt(self::RESET_MARK_BUTTON_LABEL), + $confirmation_modal->getShowSignal() + ); + $this->toolbar->addComponent($create_simple_schema_button); - if ($this->objectSupportsEctsGrades() && $this->object->canShowEctsGrades()) { - if (!($ects_form instanceof ilPropertyFormGUI)) { - $ects_form = $this->getEctsForm(); - $this->populateEctsForm($ects_form); - } - $content_parts[] = $ects_form->getHTML(); - } + $create_step_button = $this->buildCreateStepButton($mark_schema_id); + $this->toolbar->addComponent($create_step_button); + } - $this->tpl->setContent(implode('
', $content_parts)); + private function buildCreateStepButton(string $mark_schema_id): StandardButton + { + return $this->ui_factory->button()->standard( + $this->lng->txt('tst_mark_create_new_mark_step'), + '' + )->withAdditionalOnLoadCode( + fn (string $id): string => + "{$id}.addEventListener('click', " + . ' (e) => {' + . ' e.preventDefault();' + . ' e.target.name = "cmd[addMarkStep]";' + . " let form = document.getElementById('form_{$mark_schema_id}');" + . ' let submitter = e.target.cloneNode();' + . ' submitter.style.visibility = "hidden";' + . ' form.appendChild(submitter);' + . ' form.requestSubmit(submitter);' + . ' }' + . ');' + ); } protected function populateEctsForm(ilPropertyFormGUI $form): void diff --git a/Modules/Test/classes/class.ilTestTabsManager.php b/Modules/Test/classes/class.ilTestTabsManager.php index 8e09236e7d97..0cf7596354c5 100644 --- a/Modules/Test/classes/class.ilTestTabsManager.php +++ b/Modules/Test/classes/class.ilTestTabsManager.php @@ -569,7 +569,7 @@ protected function setupTabsGuiConfig() if ($this->isWriteAccessGranted()) { if (!$this->isHiddenTab('settings')) { $settingsCommands = array( - "marks", "showMarkSchema","addMarkStep", "deleteMarkSteps", "addSimpleMarkSchema", "saveMarks", + "marks", "showMarkSchema","addMarkStep", "deleteMarkSteps", "resetToSimpleMarkSchema", "saveMarks", "certificate", "certificateEditor", "certificateRemoveBackground", "certificateSave", "certificatePreview", "certificateDelete", "certificateUpload", "certificateImport", "scoring", "defaults", "addDefaults", "deleteDefaults", "applyDefaults", diff --git a/Modules/Test/test/ilMarkSchemaGUITest.php b/Modules/Test/test/ilMarkSchemaGUITest.php index 3fb5d0ac14b9..b727383a6498 100644 --- a/Modules/Test/test/ilMarkSchemaGUITest.php +++ b/Modules/Test/test/ilMarkSchemaGUITest.php @@ -34,6 +34,8 @@ protected function setUp(): void $this->addGlobal_lng(); $this->addGlobal_tpl(); $this->addGlobal_ilToolbar(); + $this->addGlobal_uiFactory(); + $this->addGlobal_uiRenderer(); $this->testObj = new ilMarkSchemaGUI( $this->createMock(ilMarkSchemaAware::class) diff --git a/lang/ilias_ar.lang b/lang/ilias_ar.lang index 0a37919819a9..6f37ce3ec9f0 100644 --- a/lang/ilias_ar.lang +++ b/lang/ilias_ar.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s assessment#:#tst_manscoring_user_notification#:#Send Notification assessment#:#tst_mark#:#Mark assessment#:#tst_mark_create_new_mark_step#:#Create New Mark Step -assessment#:#tst_mark_create_simple_mark_schema#:#Create Simple Mark Schema assessment#:#tst_mark_minimum_level#:#Minimum Level (in %) assessment#:#tst_mark_official_form#:#Official Form assessment#:#tst_mark_passed#:#Passed +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Create Simple Mark Schema assessment#:#tst_mark_short_form#:#Short Form assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding. diff --git a/lang/ilias_bg.lang b/lang/ilias_bg.lang index 32fb74c00d04..e2fed8264efc 100644 --- a/lang/ilias_bg.lang +++ b/lang/ilias_bg.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Въпрос: %s assessment#:#tst_manscoring_user_notification#:#Изпращане на известие assessment#:#tst_mark#:#Оценка assessment#:#tst_mark_create_new_mark_step#:#Създаване на нова стъпка в оценките -assessment#:#tst_mark_create_simple_mark_schema#:#Създаване на проста схема на оценките assessment#:#tst_mark_minimum_level#:#Минимално ниво (в %) assessment#:#tst_mark_official_form#:#Официална форма assessment#:#tst_mark_passed#:#Издържан +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Създаване на проста схема на оценките assessment#:#tst_mark_short_form#:#Кратка форма assessment#:#tst_max_allowed_users_heading#:#Максималният брой едновременни потребители в този тест е достигнат assessment#:#tst_max_allowed_users_message#:#Максималният брой едновременно активни потребители в теста е достигнат. Моля, опитайте отново по-късно, за да стартирате или възобновите теста. Ако един от активните потребители е неактивен за повече от %s секунди, може да успеете да въведете този тест. Благодарим ви за разбирането. diff --git a/lang/ilias_cs.lang b/lang/ilias_cs.lang index cca1c2eb4fc3..89d87c112524 100644 --- a/lang/ilias_cs.lang +++ b/lang/ilias_cs.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Otázka: %s assessment#:#tst_manscoring_user_notification#:#Zaslat upozornění assessment#:#tst_mark#:#Známka assessment#:#tst_mark_create_new_mark_step#:#Vytvořit nový známkovací stupeň -assessment#:#tst_mark_create_simple_mark_schema#:#Vytvořit jednoduché schéma známkování assessment#:#tst_mark_minimum_level#:#Minimální hladina (v %) assessment#:#tst_mark_official_form#:#Oficiální tvar assessment#:#tst_mark_passed#:#Prošel +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Vytvořit jednoduché schéma známkování assessment#:#tst_mark_short_form#:#Zkrácený tvar assessment#:#tst_max_allowed_users_heading#:#Dosažen maximální počet simultánních účastníků v tomto testu assessment#:#tst_max_allowed_users_message#:#Maximální počet simultánních účastníků v tomto testu byl dosažen. Zkuste začít nebo pokračovat znovu později. Pokud bude některý z aktivních účastníků nenaktivní déle než %s s., můžete namísto něj do testu vstoupit. Děkujeme za pochopení. diff --git a/lang/ilias_da.lang b/lang/ilias_da.lang index 3cd1cfff04b6..4ab81f79b666 100644 --- a/lang/ilias_da.lang +++ b/lang/ilias_da.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s###28 08 2012 assessment#:#tst_manscoring_user_notification#:#Send Notification###28 08 2012 new variable assessment#:#tst_mark#:#Karakter assessment#:#tst_mark_create_new_mark_step#:#Opret ny karakter -assessment#:#tst_mark_create_simple_mark_schema#:#Opret simpel karakterskala assessment#:#tst_mark_minimum_level#:#Min. niveau (i %) assessment#:#tst_mark_official_form#:#Officiel form assessment#:#tst_mark_passed#:#Bestået +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Opret simpel karakterskala assessment#:#tst_mark_short_form#:#Kort form assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding. diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index d9b12206fe69..f3d4db684ede 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -1548,10 +1548,11 @@ assessment#:#tst_manscoring_question_section_header#:#Frage: %s assessment#:#tst_manscoring_user_notification#:#Benachrichtigung senden assessment#:#tst_mark#:#Note assessment#:#tst_mark_create_new_mark_step#:#Neue Notenstufe erzeugen -assessment#:#tst_mark_create_simple_mark_schema#:#Auf Einfaches Notenschema zurücksetzen assessment#:#tst_mark_minimum_level#:#Mindestprozentsatz assessment#:#tst_mark_official_form#:#Offizielle Bezeichnung assessment#:#tst_mark_passed#:#Bestanden +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Auf Einfaches Notenschema zurücksetzen +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#Das aktuelle Schema wird durch ein einfaches Notenschema ersetzt. Es werden alle in diesem Test am Notenschema vorgenommenen Änderungen verworfen. assessment#:#tst_mark_short_form#:#Kurzbezeichnung assessment#:#tst_max_allowed_users_heading#:#Die maximale Anzahl von gleichzeitiger Teilnehmern für diesen Test wurde erreicht assessment#:#tst_max_allowed_users_message#:#Die maximale Anzahl gleichzeitiger Teilnehmer für diesen Test wurde erreicht. Bitte versuchen Sie etwas später wieder den Test zu starten oder fortzusetzen. Wenn aktive Teilnehmer 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. diff --git a/lang/ilias_el.lang b/lang/ilias_el.lang index c640a6755847..43f51f321897 100644 --- a/lang/ilias_el.lang +++ b/lang/ilias_el.lang @@ -1533,10 +1533,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s###28 08 2012 assessment#:#tst_manscoring_user_notification#:#Send Notification###28 08 2012 new variable assessment#:#tst_mark#:#Βαθμός assessment#:#tst_mark_create_new_mark_step#:#Δημιουργία νέου βαθμολογικού βήματος -assessment#:#tst_mark_create_simple_mark_schema#:#Δημιουργία απλού βαθμολογικού σχήματος assessment#:#tst_mark_minimum_level#:#Ελάχιστο επίπεδο (σε %) assessment#:#tst_mark_official_form#:#Επίσημη μορφή assessment#:#tst_mark_passed#:#Πέρασε +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Δημιουργία απλού βαθμολογικού σχήματος assessment#:#tst_mark_short_form#:#Σύντομη μορφή assessment#:#tst_max_allowed_users_heading#:#Έχετε φθάσει το μέγιστο αριθμό ταυτόχρονων χρηστών γι' αυτό το διαγώνισμα assessment#:#tst_max_allowed_users_message#:#Έχετε φθάσει το μέγιστο αριθμό ταυτόχρονων χρηστών γι' αυτό το διαγώνισμα. Παρακαλώ ξαναπροσπαθήστε αργότερα να ξεκινήσετε ή να συνεχίσετε το διαγώνισμα. Αν κάποιος από τους ενεργούς χρήστες μείνει ανενεργός για περισσότερα από %s δευτερόλεπτα, ίσως να έχετε τη δυνατότητα να δώσετε το διαγώνισμα. Σας ευχαριστούμε για την κατανόηση. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index bf43510d3b6a..159e9ce6dbc6 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -1548,10 +1548,11 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s assessment#:#tst_manscoring_user_notification#:#Send Notification assessment#:#tst_mark#:#Mark assessment#:#tst_mark_create_new_mark_step#:#Create New Grade Category -assessment#:#tst_mark_create_simple_mark_schema#:#Reset to Simple Pass/Fail Grading System assessment#:#tst_mark_minimum_level#:#Minimum Score Required (in %) assessment#:#tst_mark_official_form#:#Official Form assessment#:#tst_mark_passed#:#Passed +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Reset to Simple Mark Schema +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes. assessment#:#tst_mark_short_form#:#Short Form assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding. diff --git a/lang/ilias_es.lang b/lang/ilias_es.lang index 8bf8b0ed4617..ab32c41215d2 100644 --- a/lang/ilias_es.lang +++ b/lang/ilias_es.lang @@ -1534,10 +1534,10 @@ assessment#:#tst_manscoring_question_section_header#:#Pregunta: %s assessment#:#tst_manscoring_user_notification#:#Enviar notificación assessment#:#tst_mark#:#Nota assessment#:#tst_mark_create_new_mark_step#:#Crear nuevo rango de calificación -assessment#:#tst_mark_create_simple_mark_schema#:#Crear un esquema simple de calificación assessment#:#tst_mark_minimum_level#:#Nivel Mínimo (en %) assessment#:#tst_mark_official_form#:#Forma oficial assessment#:#tst_mark_passed#:#Superado +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Crear un esquema simple de calificación assessment#:#tst_mark_short_form#:#Forma abreviada assessment#:#tst_max_allowed_users_heading#:#Se ha superado el número máximo de usuarios simultáneos en este test assessment#:#tst_max_allowed_users_message#:#El máximo número de usuarios activos simultáneos en el test ha sido alcanzado. Por favor intenta otra vez comenzar o retomar el test. Si uno de los usuarios activos está inactivo más de %s segundos, podrás entrar al test. Esto mejora el rendimiento en la ejecución. Disculpa las molestias diff --git a/lang/ilias_et.lang b/lang/ilias_et.lang index 377468f008e2..f9eaca4d6507 100644 --- a/lang/ilias_et.lang +++ b/lang/ilias_et.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s assessment#:#tst_manscoring_user_notification#:#Send Notification assessment#:#tst_mark#:#Hinne assessment#:#tst_mark_create_new_mark_step#:#Loo uus hinne -assessment#:#tst_mark_create_simple_mark_schema#:#Loo lihtne hindesüsteem assessment#:#tst_mark_minimum_level#:#Miinimumtase (protsentides) assessment#:#tst_mark_official_form#:#Hinne assessment#:#tst_mark_passed#:#Läbitud +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Loo lihtne hindesüsteem assessment#:#tst_mark_short_form#:#Hinne (sõnaline) assessment#:#tst_max_allowed_users_heading#:#Selle testi samaaegsete kasutajate maksimumarv on täis! assessment#:#tst_max_allowed_users_message#:#Testi samaaegsete kasutajate maksimumarv on täis. Palun proovi hiljem testi alustada või testi jätkata. Kui üks kasutajatest on mitteaktiivne olnud juba kauem kui %s sekundit, saad testi siseneda. Aitäh arusaava suhtumise eest. diff --git a/lang/ilias_fa.lang b/lang/ilias_fa.lang index 6deeb8019ca4..cc5b3917bc0b 100644 --- a/lang/ilias_fa.lang +++ b/lang/ilias_fa.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s###28 08 2012 assessment#:#tst_manscoring_user_notification#:#Send Notification###28 08 2012 new variable assessment#:#tst_mark#:#نمره assessment#:#tst_mark_create_new_mark_step#:#Create New Mark Step -assessment#:#tst_mark_create_simple_mark_schema#:#ساختن ساده طرح نمره assessment#:#tst_mark_minimum_level#:#کمترین سطح (در %) assessment#:#tst_mark_official_form#:#فرم رسمی assessment#:#tst_mark_passed#:#موفق +assessment#:#tst_mark_reset_to_simple_mark_schema#:#ساختن ساده طرح نمره assessment#:#tst_mark_short_form#:#فرم کوتاه assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding. diff --git a/lang/ilias_fr.lang b/lang/ilias_fr.lang index 1317451072fb..a57b229bef40 100644 --- a/lang/ilias_fr.lang +++ b/lang/ilias_fr.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question : %s assessment#:#tst_manscoring_user_notification#:#Envoyer une Notification assessment#:#tst_mark#:#Appréciation assessment#:#tst_mark_create_new_mark_step#:#Créer un Nouveau Pallier -assessment#:#tst_mark_create_simple_mark_schema#:#Créer une Echelle d'Evaluation Simple assessment#:#tst_mark_minimum_level#:#Niveau Minimum (en %) assessment#:#tst_mark_official_form#:#Forme Officielle assessment#:#tst_mark_passed#:#Validé +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Créer une Echelle d'Evaluation Simple assessment#:#tst_mark_short_form#:#Forme Courte assessment#:#tst_max_allowed_users_heading#:#Le nombre maximum d'utilisateurs simultanés de ce test a été atteint assessment#:#tst_max_allowed_users_message#:#Le nombre maximum d'utilisateurs simultanés de ce test a été atteint. Veuillez effectuer ou reprendre ce test ultérieurement. Si l'un des participants au test est inactif pendant plus de %s secondes, vous serez autorisé à passer ce test. Merci de votre compréhension. diff --git a/lang/ilias_hr.lang b/lang/ilias_hr.lang index c50beff0d750..cff448a456a0 100644 --- a/lang/ilias_hr.lang +++ b/lang/ilias_hr.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Pitanje: %s assessment#:#tst_manscoring_user_notification#:#Pošalji obavijest assessment#:#tst_mark#:#Ocjena assessment#:#tst_mark_create_new_mark_step#:#Kreiraj novu ocjenu -assessment#:#tst_mark_create_simple_mark_schema#:#Vrati na jednostavnu shemu ocjena assessment#:#tst_mark_minimum_level#:#Minimalna razina (u %) assessment#:#tst_mark_official_form#:#Službeni naziv assessment#:#tst_mark_passed#:#Položeno +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Vrati na jednostavnu shemu ocjena assessment#:#tst_mark_short_form#:#Skraćeni naziv assessment#:#tst_max_allowed_users_heading#:#Dosegnut je maksimalan broj istovremenih korisnika za ovaj test assessment#:#tst_max_allowed_users_message#:#Dosegnut je maksimalan broj istovremenih aktivnih korisnika za ovaj test Pokušajte ponovno kasnije započeti ili nastaviti test. Ako je neki aktivan korisnik više od %s sekundi neaktivan, možda ćete biti u mogućnosti sudjelovati u ovom testu. Zahvaljujemo na razumijevanju. diff --git a/lang/ilias_hu.lang b/lang/ilias_hu.lang index 4e870a8693f9..de3f5461132a 100644 --- a/lang/ilias_hu.lang +++ b/lang/ilias_hu.lang @@ -1547,10 +1547,10 @@ assessment#:#tst_manscoring_question_section_header#:#Kérdés: %s assessment#:#tst_manscoring_user_notification#:#Értesítés küldése assessment#:#tst_mark#:#Jegy assessment#:#tst_mark_create_new_mark_step#:#Új értékelésséma létrehozása -assessment#:#tst_mark_create_simple_mark_schema#:#Egyszerű (Teljesített/Nem teljesítette) értékelésséma visszaállítása assessment#:#tst_mark_minimum_level#:#Minimumszint (%-ban) assessment#:#tst_mark_official_form#:#Hivatalos forma assessment#:#tst_mark_passed#:#Sikeres teljesítés-e +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Egyszerű (Teljesített/Nem teljesítette) értékelésséma visszaállítása assessment#:#tst_mark_short_form#:#Rövid forma assessment#:#tst_max_allowed_users_heading#:#Ebben a tesztben egyidejűleg jelen lévő felhasználók száma elérte a maximális számot assessment#:#tst_max_allowed_users_message#:#A tesztben egyidejűleg engedélyezett résztvevőszám elérte a maximumot. Próbálja később elkezdeni, illetve folytatni a tesztet. Ha egy jelenleg aktív felhasználó több mint %s másodpercig tétlen, Ön beléphet a tesztbe. Köszönjük megértését! diff --git a/lang/ilias_it.lang b/lang/ilias_it.lang index 361bda843ecd..88535239c4d9 100644 --- a/lang/ilias_it.lang +++ b/lang/ilias_it.lang @@ -1546,10 +1546,10 @@ assessment#:#tst_manscoring_question_section_header#:#Domanda: %s assessment#:#tst_manscoring_user_notification#:#Invia notifica assessment#:#tst_mark#:#Voto assessment#:#tst_mark_create_new_mark_step#:#Crea un nuovo voto -assessment#:#tst_mark_create_simple_mark_schema#:#Crea uno schema voti assessment#:#tst_mark_minimum_level#:#Livello minimo (in %) assessment#:#tst_mark_official_form#:#Form ufficiale assessment#:#tst_mark_passed#:#Superato +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Crea uno schema voti assessment#:#tst_mark_short_form#:#Form ridotto assessment#:#tst_max_allowed_users_heading#:#È stato raggiunto il numero massimo di partecipanti a questo test assessment#:#tst_max_allowed_users_message#:#È stato raggiunto il numero massimo di utenti attivi simultanei nel test. Riprovare più tardi per avviare o riprendere il test. Se uno degli utenti attivi è inattivo per più di %s secondi, potresti essere in grado di accedere a questo test. Grazie per la vostra comprensione. diff --git a/lang/ilias_ja.lang b/lang/ilias_ja.lang index ef1ec068c49e..425c529e17bd 100644 --- a/lang/ilias_ja.lang +++ b/lang/ilias_ja.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#問題:%s assessment#:#tst_manscoring_user_notification#:#通知送付 assessment#:#tst_mark#:#マーク assessment#:#tst_mark_create_new_mark_step#:#新規評価尺度を作成 -assessment#:#tst_mark_create_simple_mark_schema#:#シンプル評価尺度を作成 assessment#:#tst_mark_minimum_level#:#最低レベル (%中) assessment#:#tst_mark_official_form#:#正式書式 assessment#:#tst_mark_passed#:#合格 +assessment#:#tst_mark_reset_to_simple_mark_schema#:#シンプル評価尺度を作成 assessment#:#tst_mark_short_form#:#略式書式 assessment#:#tst_max_allowed_users_heading#:#テストの同時最大ユーザ数に達しました assessment#:#tst_max_allowed_users_message#:#テストの同時最大ユーザ数に達しました。 後でやり直すかもしくはテストを再開してください。 受験中のユーザのだれかが %s 以上中断すると入力できるようになる場合があります。ご理解ありがとうございます。 diff --git a/lang/ilias_ka.lang b/lang/ilias_ka.lang index 227fd2e522ef..63c71d7e8d7f 100644 --- a/lang/ilias_ka.lang +++ b/lang/ilias_ka.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s assessment#:#tst_manscoring_user_notification#:#Send Notification assessment#:#tst_mark#:#ნიშანი assessment#:#tst_mark_create_new_mark_step#:#ახალი სანიშნე ნაბიჯის შექმნა -assessment#:#tst_mark_create_simple_mark_schema#:#საკუთარი სანიშნე სქემის შექმნა assessment#:#tst_mark_minimum_level#:#მინიმალური დონე %s ებში assessment#:#tst_mark_official_form#:#ოფიციალური ფორმა assessment#:#tst_mark_passed#:#ჩაბარებული +assessment#:#tst_mark_reset_to_simple_mark_schema#:#საკუთარი სანიშნე სქემის შექმნა assessment#:#tst_mark_short_form#:#მოკლე ფორმა assessment#:#tst_max_allowed_users_heading#:#ტესტს ერთდროულად მონაწილეთა მაქსიმალური რაოდენობა წერს assessment#:#tst_max_allowed_users_message#:#ტესტს ერთდროულად მონაწილეთა მაქსიმალური რაოდენობა წერს. გთხოვთ მოგვიანებით სცადოთ ან განაახლოთ ტესტი. თუ რომელიმე აქტიურმ მომხმარებელთაგან არააქტიურია %s წამზე მეტი ხანია, თქვენ შეძლებთ ამ ტესტის დაწყებას. Mადლობას გიხდით გაგებისთვის. diff --git a/lang/ilias_lt.lang b/lang/ilias_lt.lang index 9a32eeda7b32..95e52163c063 100644 --- a/lang/ilias_lt.lang +++ b/lang/ilias_lt.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s###28 08 2012 assessment#:#tst_manscoring_user_notification#:#Send Notification###28 08 2012 new variable assessment#:#tst_mark#:#Įvertinimas assessment#:#tst_mark_create_new_mark_step#:#Sukurti naują įvertinimo žingsnį -assessment#:#tst_mark_create_simple_mark_schema#:#Sukurti paprastą įvertinimo schemą assessment#:#tst_mark_minimum_level#:#Minimalus lygis (%) assessment#:#tst_mark_official_form#:#Oficiali forma assessment#:#tst_mark_passed#:#Išlaikyta +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Sukurti paprastą įvertinimo schemą assessment#:#tst_mark_short_form#:#Trumpa forma assessment#:#tst_max_allowed_users_heading#:#Maksimalus vartotojų skaičius šiame teste pasiektas assessment#:#tst_max_allowed_users_message#:#Maksimalus aktyvių vartotojų skaičius šiame teste pasiektas. Norėdami pradėti ar tęsti testą, bandykite vėliaut. Jei vienas iš aktyvių vartotojų tampa neaktyvus daugiau nei %s sekundžių, jūs galėsite spręsti šį testą. Dėkojame už supratimą. diff --git a/lang/ilias_nl.lang b/lang/ilias_nl.lang index 6dea524e523c..5deb3b79dee1 100644 --- a/lang/ilias_nl.lang +++ b/lang/ilias_nl.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Vraag: %s assessment#:#tst_manscoring_user_notification#:#Bericht sturen assessment#:#tst_mark#:#Cijfer assessment#:#tst_mark_create_new_mark_step#:#Aanmaken van een nieuwe nootstap -assessment#:#tst_mark_create_simple_mark_schema#:#Een simpel nootschema aanmaken assessment#:#tst_mark_minimum_level#:#Minimum niveau (in % assessment#:#tst_mark_official_form#:#Officiëel formulier assessment#:#tst_mark_passed#:#Geslaagd +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Een simpel nootschema aanmaken assessment#:#tst_mark_short_form#:#Korte aanduiding assessment#:#tst_max_allowed_users_heading#:#Het maximum aantal gebruikers voor de toets is bereikt. assessment#:#tst_max_allowed_users_message#:#Het maximum aantal gebruikers voor de toets is bereikt. Probeer laten opnieuw diff --git a/lang/ilias_pl.lang b/lang/ilias_pl.lang index c57e190eca73..cd01911c1b82 100644 --- a/lang/ilias_pl.lang +++ b/lang/ilias_pl.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Pytanie: %s assessment#:#tst_manscoring_user_notification#:#Wyślij powiadomienie assessment#:#tst_mark#:#Wybór assessment#:#tst_mark_create_new_mark_step#:#Twórz nową pozycję wyboru -assessment#:#tst_mark_create_simple_mark_schema#:#Twórz prosty schemat wyboru assessment#:#tst_mark_minimum_level#:#Minimalny poziom (w %) assessment#:#tst_mark_official_form#:#Oficjalna forma assessment#:#tst_mark_passed#:#Wykonany +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Twórz prosty schemat wyboru assessment#:#tst_mark_short_form#:#Krótka forma assessment#:#tst_max_allowed_users_heading#:#Została przekroczona maksymalna liczba jednocześnie wykonujących test. assessment#:#tst_max_allowed_users_message#:#Została przekroczona maksymalna liczba jednocześnie aktywnych użytkowników teście. Spróbuj później rozpocząć lub odzyskać test. Jeśli jeden z aktywnych użytkowników będzie bezczynny więcej niż %s sekund, to będziesz mógł podejść do testu. Dziękujemy za zrozumienie i cierpliwość. diff --git a/lang/ilias_pt.lang b/lang/ilias_pt.lang index 6d7709b1161c..20ee9eb016ca 100644 --- a/lang/ilias_pt.lang +++ b/lang/ilias_pt.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Pergunta: %s assessment#:#tst_manscoring_user_notification#:#Enviar notificação assessment#:#tst_mark#:#A configuração para o conjunto aleatório de perguntas foi modificada com sucesso. assessment#:#tst_mark_create_new_mark_step#:#Não é possível um teste com um conjunto aleatório de perguntas sem uma quantidade de perguntas corretamente definida. -assessment#:#tst_mark_create_simple_mark_schema#:#Não é possível um teste com um conjunto aleatório de perguntas sem selecionar pelo menos um banco de perguntas. assessment#:#tst_mark_minimum_level#:#Não é possível um teste com um conjunto aleatório de perguntas com a seleção atual de bancos de perguntas e a quantidade de perguntas.
assessment#:#tst_mark_official_form#:#Date da última sincronização dos bancos de perguntas selecionados: %s assessment#:#tst_mark_passed#:#Os pontos de competência foram guardados. +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Não é possível um teste com um conjunto aleatório de perguntas sem selecionar pelo menos um banco de perguntas. assessment#:#tst_mark_short_form#:#A regra foi removida com sucesso. assessment#:#tst_max_allowed_users_heading#:#Foi alcançado o número máximo de utilizadores simultâneos no teste assessment#:#tst_max_allowed_users_message#:#Foi alcançado o número máximo de utilizadores ativos simultâneos no teste. Tente novamente mais tarde reiniciar ou retomar o teste. Se um dos utilizadores ativos estiver inativo durante mais de %s segundos, pode introduzir este teste. Obrigado pela sua compreensão. diff --git a/lang/ilias_ro.lang b/lang/ilias_ro.lang index 447afe68ce2a..ac502988a3ef 100644 --- a/lang/ilias_ro.lang +++ b/lang/ilias_ro.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s###28 08 2012 assessment#:#tst_manscoring_user_notification#:#Send Notification###28 08 2012 new variable assessment#:#tst_mark#:#Nota assessment#:#tst_mark_create_new_mark_step#:#Creati o nota intermediara -assessment#:#tst_mark_create_simple_mark_schema#:#Creati o schema de notare simpla assessment#:#tst_mark_minimum_level#:#Nivelul minim (in %) assessment#:#tst_mark_official_form#:#Forma oficiala assessment#:#tst_mark_passed#:#Trecut +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Creati o schema de notare simpla assessment#:#tst_mark_short_form#:#Forma la limita assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached###10 Jul 2006 new variable assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding.###10 Jul 2006 new variable diff --git a/lang/ilias_ru.lang b/lang/ilias_ru.lang index cdef10034273..bd1153cb8e34 100644 --- a/lang/ilias_ru.lang +++ b/lang/ilias_ru.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Вопрос: %s assessment#:#tst_manscoring_user_notification#:#Отправить уведомление assessment#:#tst_mark#:#Отметка assessment#:#tst_mark_create_new_mark_step#:#Создать новый пункт оценки -assessment#:#tst_mark_create_simple_mark_schema#:#Создать простую схему оценки assessment#:#tst_mark_minimum_level#:#Минимальный уровень (в %) assessment#:#tst_mark_official_form#:#Официальная форма assessment#:#tst_mark_passed#:#Сдан +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Создать простую схему оценки assessment#:#tst_mark_short_form#:#Короткая форма assessment#:#tst_max_allowed_users_heading#:#Максимальное число пользователей, которые могут одновременно проходить этот тест assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding. diff --git a/lang/ilias_sk.lang b/lang/ilias_sk.lang index 68f6841c0b0a..86d9145f34e6 100644 --- a/lang/ilias_sk.lang +++ b/lang/ilias_sk.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s###28 08 2012 assessment#:#tst_manscoring_user_notification#:#Send Notification###28 08 2012 new variable assessment#:#tst_mark#:#Známka assessment#:#tst_mark_create_new_mark_step#:#Vytvořit nový známkovací stupeň -assessment#:#tst_mark_create_simple_mark_schema#:#Vytvořit jednoduché schéma známkování assessment#:#tst_mark_minimum_level#:#Minimální hladina (v %) assessment#:#tst_mark_official_form#:#Oficiální tvar assessment#:#tst_mark_passed#:#Prošel +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Vytvořit jednoduché schéma známkování assessment#:#tst_mark_short_form#:#Zkrácený tvar assessment#:#tst_max_allowed_users_heading#:#Dosažen maximální počet simultánních účastníků v tomto testu assessment#:#tst_max_allowed_users_message#:#Maximální počet simultánních účastníků v tomto testu byl dosažen. Zkuste začít nebo pokračovat znovu později. Pokud bude některý z aktivních účastníků nenaktivní déle než %s s., můžete namísto něj do testu vstoupit. Děkujeme za pochopení. diff --git a/lang/ilias_sl.lang b/lang/ilias_sl.lang index 1aa554c806c5..edbb08c4473d 100644 --- a/lang/ilias_sl.lang +++ b/lang/ilias_sl.lang @@ -1546,10 +1546,10 @@ assessment#:#tst_manscoring_question_section_header#:#Vprašanje: %s assessment#:#tst_manscoring_user_notification#:#Pošlji obvestilo assessment#:#tst_mark#:#Ocena assessment#:#tst_mark_create_new_mark_step#:#Ustvarite novo stopnjo ocene -assessment#:#tst_mark_create_simple_mark_schema#:#Vrnite se na preprosto ocenjevalno shemo assessment#:#tst_mark_minimum_level#:#Najnižji odstotek (v %) assessment#:#tst_mark_official_form#:#Uradno ime assessment#:#tst_mark_passed#:#Opravljeno +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Vrnite se na preprosto ocenjevalno shemo assessment#:#tst_mark_short_form#:#Kratko ime assessment#:#tst_max_allowed_users_heading#:#Doseženo je bilo maksimalno število sočasnih uporabnikov za ta test assessment#:#tst_max_allowed_users_message#:#Doseženo je bilo maksimalno število sočasnih udeležencev za ta test Poskusite test ponovno odpreti ali nadaljevati nekoliko pozneje. Če so aktivni udeleženci neaktivni več kot %s sekund, imate možnost, da opravljate ta test. Hvala za razumevanje. diff --git a/lang/ilias_sq.lang b/lang/ilias_sq.lang index d3d6ecc0531c..8aaffb8eb5b2 100644 --- a/lang/ilias_sq.lang +++ b/lang/ilias_sq.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s###28 08 2012 assessment#:#tst_manscoring_user_notification#:#Send Notification###28 08 2012 new variable assessment#:#tst_mark#:#Shënjo assessment#:#tst_mark_create_new_mark_step#:#Krijo rresht të ri të notimit -assessment#:#tst_mark_create_simple_mark_schema#:#Krijo skemë të notimit të thjesht assessment#:#tst_mark_minimum_level#:#Përqindja minimale assessment#:#tst_mark_official_form#:#Formë zyrtare assessment#:#tst_mark_passed#:#Kalon +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Krijo skemë të notimit të thjesht assessment#:#tst_mark_short_form#:#Formë e shkurtër assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached###10 Jul 2006 new variable assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding.###10 Jul 2006 new variable diff --git a/lang/ilias_sr.lang b/lang/ilias_sr.lang index 656247773be0..5ae372f1a48c 100644 --- a/lang/ilias_sr.lang +++ b/lang/ilias_sr.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s###28 08 2012 assessment#:#tst_manscoring_user_notification#:#Send Notification###28 08 2012 new variable assessment#:#tst_mark#:#Ocena assessment#:#tst_mark_create_new_mark_step#:#Kreirajte novi postupak ocenjivanja -assessment#:#tst_mark_create_simple_mark_schema#:#Krirajte jednostavnu znakovnu šemu assessment#:#tst_mark_minimum_level#:#Najniži nivo (u %) assessment#:#tst_mark_official_form#:#Zvanicna forma assessment#:#tst_mark_passed#:#Prošao +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Krirajte jednostavnu znakovnu šemu assessment#:#tst_mark_short_form#:#Kratka forma assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached###10 Jul 2006 new variable assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding.###10 Jul 2006 new variable diff --git a/lang/ilias_tr.lang b/lang/ilias_tr.lang index de20220b12cd..78ddc768e579 100644 --- a/lang/ilias_tr.lang +++ b/lang/ilias_tr.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Soru:% s assessment#:#tst_manscoring_user_notification#:#Gönder Bildirim assessment#:#tst_mark#:#Not assessment#:#tst_mark_create_new_mark_step#:#Yeni Not Tanımı Oluştur -assessment#:#tst_mark_create_simple_mark_schema#:#Basit Not Şeması Oluştur assessment#:#tst_mark_minimum_level#:#Asgari Seviye (% olarak) assessment#:#tst_mark_official_form#:#Resmi Hali assessment#:#tst_mark_passed#:#Geçti +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Basit Not Şeması Oluştur assessment#:#tst_mark_short_form#:#Kısa Hali assessment#:#tst_max_allowed_users_heading#:#Bu testte eşzamanlı kullanıcı maksimum sayısına ulaşıldı assessment#:#tst_max_allowed_users_message#:#Test eşzamanlı aktif kullanıcı maksimum sayısına ulaşıldı. Testi başlatmak veya sürdürmek için daha sonra tekrar deneyin. Aktif kullanıcı biri% s saniye daha hareketsiz ise, bu test girmek mümkün olabilir. Anlayışınız için teşekkür ederiz. diff --git a/lang/ilias_uk.lang b/lang/ilias_uk.lang index d0bb32b6c1a6..405ba1a94818 100644 --- a/lang/ilias_uk.lang +++ b/lang/ilias_uk.lang @@ -1532,10 +1532,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s###28 08 2012 assessment#:#tst_manscoring_user_notification#:#Send Notification###28 08 2012 new variable assessment#:#tst_mark#:#Оцінка assessment#:#tst_mark_create_new_mark_step#:#Створити новий шаг оцінки -assessment#:#tst_mark_create_simple_mark_schema#:#Створити просту схему оцінок assessment#:#tst_mark_minimum_level#:#Мінімальний рівень (в %) assessment#:#tst_mark_official_form#:#Офіціальна форма assessment#:#tst_mark_passed#:#Пройдений +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Створити просту схему оцінок assessment#:#tst_mark_short_form#:#Коротка форма assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached###25 02 2007 new variable assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding.###25 02 2007 new variable diff --git a/lang/ilias_vi.lang b/lang/ilias_vi.lang index 5e481c04daef..1edf22a1b443 100644 --- a/lang/ilias_vi.lang +++ b/lang/ilias_vi.lang @@ -1534,10 +1534,10 @@ assessment#:#tst_manscoring_question_section_header#:#Question: %s###28 08 2012 assessment#:#tst_manscoring_user_notification#:#Send Notification###28 08 2012 new variable assessment#:#tst_mark#:#Điểm assessment#:#tst_mark_create_new_mark_step#:#Tạo thang điểm mới -assessment#:#tst_mark_create_simple_mark_schema#:#Tạo giản đồ điểm assessment#:#tst_mark_minimum_level#:#Mức tối thiểu (dạng %) assessment#:#tst_mark_official_form#:#Mẫu chính thức assessment#:#tst_mark_passed#:#Đạt +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Tạo giản đồ điểm assessment#:#tst_mark_short_form#:#Mẫu ngắn assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached###25 02 2007 new variable assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding.###25 02 2007 new variable diff --git a/lang/ilias_zh.lang b/lang/ilias_zh.lang index 3dbc8bee06ef..d9e28a24bef6 100644 --- a/lang/ilias_zh.lang +++ b/lang/ilias_zh.lang @@ -1531,10 +1531,10 @@ assessment#:#tst_manscoring_question_section_header#:#题目:%s assessment#:#tst_manscoring_user_notification#:#发送通知 assessment#:#tst_mark#:#标记 assessment#:#tst_mark_create_new_mark_step#:#创建新的标记步骤 -assessment#:#tst_mark_create_simple_mark_schema#:#创建简单标记模式 assessment#:#tst_mark_minimum_level#:#Minimum level (in %) assessment#:#tst_mark_official_form#:#Official form官方形式 assessment#:#tst_mark_passed#:#已通过 +assessment#:#tst_mark_reset_to_simple_mark_schema#:#创建简单标记模式 assessment#:#tst_mark_short_form#:#Short form assessment#:#tst_max_allowed_users_heading#:#已经达到此次测试中同时允许的用户人数上限 assessment#:#tst_max_allowed_users_message#:#已经达到此次测试中同翻搅时允许的活跃用户人数上限。请稍后再尝试启动或恢复测试。如果其中某位活跃用户超过 %s 秒未活动,您将有可能进入此次测试。感谢您的理解。 From 21a5f2b44775a4c9287f9d1049f4c0c5462c4307 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 19 Nov 2023 19:09:10 +0100 Subject: [PATCH 165/497] 36087: Copying a course fails, gets stuck at 0 percent (ReferenceError) --- Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php b/Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php index 5b8991517133..47124e111725 100644 --- a/Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php +++ b/Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php @@ -357,7 +357,7 @@ public static function _cloneValues( } $target_sel[] = $record_id; } - ilAdvancedMDRecord::saveObjRecSelection($a_target_id, $a_sub_type, $target_sel); + ilAdvancedMDRecord::saveObjRecSelection($a_target_id, (string) $a_sub_type, $target_sel); } // clone values From fcde605cfce1e159f75ac6ace02df5e5933d8562 Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Mon, 20 Nov 2023 12:12:44 +0100 Subject: [PATCH 166/497] Fixed Mantis #38917: Missing text: -obj_conf_delete_lang- --- lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 2 files changed, 2 insertions(+) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index f3d4db684ede..190076f342b9 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -12242,6 +12242,7 @@ obj#:#obj_activation#:#Aktivierung obj#:#obj_activation_list_gui#:#Verfügbarkeit obj#:#obj_add_languages#:#Sprachen hinzufügen obj#:#obj_additional_langs#:#Zusätzliche Sprachen +obj#:#obj_conf_delete_lang#:#Wollen Sie die Anzeige von Titel und Beschreibung für diese Sprachen wirklich beenden? obj#:#obj_cont_transl_deactivated#:#Die Unterstützung für mehrsprachige Inhalte im Seiteneditor wurde deaktiviert. obj#:#obj_copy_progress#:#Fortschritt des Kopierens obj#:#obj_deactivate_content_lang#:#Mehrsprachigkeit für Seiteneditor deaktivieren. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 159e9ce6dbc6..c0a5cb84baca 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -12242,6 +12242,7 @@ obj#:#obj_activation#:#Activation obj#:#obj_activation_list_gui#:#Availability obj#:#obj_add_languages#:#Add Languages obj#:#obj_additional_langs#:#Additional Languages +obj#:#obj_conf_delete_lang#:#obj#:#Do you really want to stop the presentation of title and description in these languages? obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated. obj#:#obj_copy_progress#:#Copy Progress obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing From 30ec7612bfe085ae573a4f5c1973d03cc8b47249 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 20 Nov 2023 12:40:46 +0100 Subject: [PATCH 167/497] 38582: Eigenschaften der Instanz nur angezeigt, wenn Medienobjekt mehrfach genutzt --- Services/COPage/classes/class.ilPCMediaObject.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Services/COPage/classes/class.ilPCMediaObject.php b/Services/COPage/classes/class.ilPCMediaObject.php index e9dea62306e0..5e462bb47b01 100755 --- a/Services/COPage/classes/class.ilPCMediaObject.php +++ b/Services/COPage/classes/class.ilPCMediaObject.php @@ -569,7 +569,9 @@ public function checkInstanceEditing(): bool return true; } } - return false; + // see https://mantis.ilias.de/view.php?id=38582 + // we allow instance editing regardless of number of usages + return true; } public static function deleteHistoryLowerEqualThan( From 62a4fdb50e4a15d7fd0655ff0051eb5425120d7f Mon Sep 17 00:00:00 2001 From: Maximilian Lemmer Date: Mon, 20 Nov 2023 12:10:13 +0100 Subject: [PATCH 168/497] Add language svensk version --- lang/ilias_sv.lang | 17089 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 17089 insertions(+) create mode 100755 lang/ilias_sv.lang diff --git a/lang/ilias_sv.lang b/lang/ilias_sv.lang new file mode 100755 index 000000000000..2b7c32a95ee6 --- /dev/null +++ b/lang/ilias_sv.lang @@ -0,0 +1,17089 @@ +/** +* 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 Svensk +* @modulegroup language +* @author Maximilian Lemmer +* @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 + +acc#:#acc_add_document_btn_label#:#Lägg till dokument +acc#:#acc_crit_type_usr_language#:#Användarspråk +acc#:#acc_criterion_assignment_must_be_unique_insert#:#Du kan inte tilldela mallkriteriet med motsvarande konfiguration. En identisk tilldelning finns redan. +acc#:#acc_criterion_assignment_must_be_unique_update#:#Du kan inte ändra konfigurationen av mallkriteriet efter önskemål. En identisk tilldelning finns redan. +acc#:#acc_ctrl_cpt_txt#:#Info om tillgänglighet +acc#:#acc_deleted_documents_p#:#De valda dokumenten har raderats. +acc#:#acc_deleted_documents_s#:#Dokumentet har tagits bort. +acc#:#acc_doc_crit_attached#:#Mallkriteriet har tilldelats. +acc#:#acc_doc_crit_changed#:#Mallkriteriet har uppdaterats. +acc#:#acc_doc_crit_detached#:#Mallkriteriet har tagits bort. +acc#:#acc_doc_delete#:#Radera dokument +acc#:#acc_doc_detach_crit_confirm_title#:#Ta bort kriteriet för mall +acc#:#acc_doc_sure_detach_crit#:#Är du säker på att mallkriteriet ska tas bort? +acc#:#acc_document#:#Dokument +acc#:#acc_form_attach_criterion_head#:#Lägg till mallkriterium +acc#:#acc_form_criterion#:#Kriterium för mall +acc#:#acc_form_document#:#Dokument +acc#:#acc_form_document_content_changed#:#Innehållet i den uppladdade filen har rensats av ILIAS. Kontrollera resultatet och ladda upp en ny fil om du är osäker. +acc#:#acc_form_document_info#:#Välj en lämplig fil från ditt lokala filsystem. Du kan ladda upp en enkel textfil eller en HTML-fil. Endast delar av HTML-språket stöds. Observera att HTML-filer rensas under uppladdningen och att endast innehållet i body-elementet övertas. +acc#:#acc_form_document_new#:#Ändra innehåll +acc#:#acc_form_document_new_info#:#Här kan du välja en ny fil från ditt lokala filsystem för att ändra dokumentet. Du kan ladda upp en enkel textfil eller en HTML-fil. Hela HTML-språket stöds inte. Observera att HTML-filer rensas under uppladdningen och att endast innehållet i body-elemen +acc#:#acc_form_document_title#:#Titel +acc#:#acc_form_document_title_info#:# Ange en titel för dokumentet här. +acc#:#acc_form_edit_criterion_head#:#Redigera kriterium för mall +acc#:#acc_form_edit_doc_head#:#Redigera dokument +acc#:#acc_form_new_doc_head#:#Skapa dokument +acc#:#acc_forward_mail#:#Framåt +acc#:#acc_function#:#Funktion +acc#:#acc_last_rep_visited#:#Magazine/Last visited +acc#:#acc_saved_sorting#:#Sorteringen har sparats. +acc#:#acc_sure_delete_documents_p#:#Är du säker på att du vill radera de valda dokumenten? +acc#:#acc_sure_delete_documents_s#:#Är du säker på att du vill ta bort det markerade dokumentet? +acc#:#acc_tbl_docs_action_add_criterion#:#Lägg till mallkriterium +acc#:#acc_tbl_docs_cell_not_criterion#:#Inget mallkriterium tilldelat +acc#:#acc_tbl_docs_head_created#:#Datum för skapande +acc#:#acc_tbl_docs_head_criteria#:#Kriterier för mall +acc#:#acc_tbl_docs_head_last_change#:#Sista förändringen +acc#:#acc_tbl_docs_head_sorting#:#Sortering +acc#:#acc_tbl_docs_head_title#:#Titel +acc#:#acc_tbl_docs_title#:#Dokument +acc#:#acc_tree_off#:#Trädvy av +acc#:#acc_tree_on#:#Trädutsikt på +adm#:#adm_acc_ctrl_cpt_desc#:#Om den är aktiverad visas länken till "Tillgänglighetsinformation" i sidfoten. +adm#:#adm_acc_ctrl_cpt_enable#:#Info Aktivera tillgänglighet +adm#:#adm_accessibility_contacts#:#Kontaktpunkt för tillgänglighet +adm#:#adm_accessibility_contacts_info#:#Kontaktpersoner för att rapportera tillgänglighetsproblem i sidfoten. Kommaseparerad lista över ILIAS-konton. +adm#:#adm_awrn_support_contacts_info#:#Alla användare för teknisk support listas. Användare tilldelas teknisk support i administrationsområdet "Systeminställningar och underhåll " Allmänna inställningar", fliken "Kontaktinformation". +adm#:#adm_support_contacts#:#Tekniskt stöd +adm#:#adm_support_contacts_info#:#Kommaseparerad lista med inloggningsnamn. De personer som anges här länkas i sidfoten som support. Om visningen "Vem är online?" används, visas personerna även där som teknisk support. +administration#:#adm_achievements#:#lärande framgångar +administration#:#adm_activate_db_benchmark#:# Aktivera mätning +administration#:#adm_activate_db_benchmark_desc#:#Mätningen avslutas automatiskt efter en serverbegäran. +administration#:#adm_add_settings_template#:#Lägg till mallar +administration#:#adm_adm_role_protect#:#Skydda administratörens roll +administration#:#adm_adm_role_protect_info#:#När detta är aktiverat får endast administratörer tilldela eller ta bort användare från administratörsrollen. +administration#:#adm_auth_login#:#Autentisering Inloggning +administration#:#adm_auth_reg#:#Registrering av autentisering +administration#:#adm_communication#:#Kommunikation +administration#:#adm_db_bench_by_first_table#:#Aggregerad av det första tabellnamnet +administration#:#adm_db_bench_chronological#:#Kronologisk +administration#:#adm_db_bench_slowest_first#:#Snabbast först +administration#:#adm_db_bench_sorted_by_sql#:#Sortera efter SQL +administration#:#adm_db_benchmark#:#Benchmark för databaser +administration#:#adm_db_benchmark_user#:#Login namn +administration#:#adm_db_benchmark_user_desc#:#Mätningen utförs för detta ILIAS-konto. Aktivera inte denna funktion för ditt eget konto. +administration#:#adm_edit_settings_template#:#Redigera mallar +administration#:#adm_extending_ilias#:#ILIAS expandera +administration#:#adm_external_setting_edit#:#Redigera inställningar +administration#:#adm_hide#:#Dölj i formuläret för inställningar +administration#:#adm_hide_tabs#:# Dölj flik +administration#:#adm_https#:#HTTPS +administration#:#adm_imprint#:#Imprint +administration#:#adm_imprint_inactive#:#Avtrycket är inte aktiverat och därför inte tillgängligt för användare. +administration#:#adm_item_cmd_asynch#:#Asynkron laddning av rullgardinsmenyerna i magasinet +administration#:#adm_item_cmd_asynch_info#:#Aktionsmenyer, t.ex. i magasinet, laddas asynkront. Detta ökar prestandan i allmänhet. I enskilda fall kan det förekomma korta fördröjningar vid visning av popup-menyn. +administration#:#adm_layout_and_navigation#:#Layout och navigering +administration#:#adm_locale#:#Locale +administration#:#adm_locale_info#:#Lokalinställningen påverkar den alfabetiska sorteringen i listor. Exempel är nl_NL eller de_DE. Flera värden kan anges (kommaseparerade). Det första giltiga värdet används. +administration#:#adm_maintenance#:#Systeminställningar och underhåll +administration#:#adm_missing_entries#:#Saknade poster +administration#:#adm_missing_entry_add#:#Skapa ny post +administration#:#adm_missing_entry_add_action#:#Add +administration#:#adm_nr_statements#:#Antal visningar +administration#:#adm_personal_workspace#:#Personlig arbetsyta +administration#:#adm_predefined_settings#:#Fördefinierade inställningar +administration#:#adm_pub_section_domain_filter#:#Domänfilter +administration#:#adm_pub_section_domain_filter_info#:#Domänfilter för anonym åtkomst. Ange ett eller flera domännamn för vilka anonym åtkomst är aktiverad. Domäner som inte finns med i listan tillåter inte anonym åtkomst. +administration#:#adm_rep_shorten_description#:#Maximal längd för beskrivningar +administration#:#adm_rep_shorten_description_info#:#Om aktiverat visas alla beskrivningar i objektlistor endast upp till en definierad längd. +administration#:#adm_rep_shorten_description_length#:#Maximalt antal tecken +administration#:#adm_rep_tree_all_types#:#Alla objekttyper +administration#:#adm_rep_tree_all_types_info#:#I trädvyn visas alla objekttyper. +administration#:#adm_rep_tree_limit_grp_crs#:#Begränsning till kurser och grupper +administration#:#adm_rep_tree_limit_grp_crs_info#:#Endast i kurser och grupper visas alla objekttyper i trädvyn. Utanför visar trädvyn endast behållarobjekt. +administration#:#adm_rep_tree_only_cntr#:#Endast behållarobjekt +administration#:#adm_rep_tree_only_cntr_info#:#Trädvyn visar endast studieprogram, kategorier, kurser, grupper och inlärningssekvenser. +administration#:#adm_rep_tree_presentation#:#Presentation av trädvyn +administration#:#adm_repository_and_objects#:#Magasin och föremål +administration#:#adm_search_and_find#:#Sök och hitta +administration#:#adm_settings_templates#:#Inställning av mallar +administration#:#adm_show_comments_tagging_in_lists#:#Visa antal noteringar, kommentarer och taggar i objektlistor +administration#:#adm_show_comments_tagging_in_lists_tags#:#Lista enskilda taggar istället för antal +administration#:#adm_sql#:#SQL +administration#:#adm_sure_delete_settings_template#:#Vill du verkligen ta bort följande mallar? +administration#:#adm_table#:#Tabell +administration#:#adm_time#:#Tid +administration#:#adm_user_administration#:#Konton och roller +administration#:#adm_user_starting_point#:#Personlig hemsida +administration#:#adm_user_starting_point_info#:#Välj den sida eller det objekt som ska visas efter inloggning. +administration#:#adm_user_starting_point_inherit#:#Tillämpa standardinställningar +administration#:#adm_user_starting_point_inherit_info#:#Inställningarna antas eftersom de aktiverades globalt av administratören för hela plattformen. +administration#:#adm_user_starting_point_invalid_info#:#Den här funktionen är för närvarande inte aktiverad. +administration#:#adm_user_starting_point_object#:#Magasinobjekt +administration#:#adm_user_starting_point_personal#:#Personlig attityd +administration#:#adm_user_starting_point_personal_info#:#När den är aktiverad får användarna välja sin egen startsida. +administration#:#adm_user_starting_point_ref_id#:#Reference ID +administration#:#adm_user_starting_point_ref_id_info#:# Öppna det objekt som du vill ange som din personliga startsida. Kopiera numret bakom "ref_id=" från webbläsarraden och skriv in det i inmatningsfältet. +administration#:#adm_value#:#Fördefinierat värde +administration#:#allow_change_loginname#:#Tillåt ändring av inloggningsnamn +administration#:#analysis_options#:#Analys av alternativ +administration#:#analyze_data#:#Analysera och reparera dataintegritet +administration#:#analyzing_tree_structure#:#Kontrollera trädstrukturen... +administration#:#apache_auth_authenticate_on_login_page#:#Automatiskt autentiseringsförsök när du går in på inloggningssidan +administration#:#apache_auth_domains#:#Tillåtna domäner för omdirigering +administration#:#apache_auth_domains_description#:#Ange en tillåten domän per rad till vilken omdirigering är tillåten.
Om ILIAS kan nås under en unik domän, behöver ingen separat post göras för detta. I annat fall anger du alla domäner.
Exempel +administration#:#apache_auth_enable_override_login#:#Överskriv standardinloggningssida +administration#:#apache_auth_indicator_name#:#Indikatorfält för lyckad Apache-autentisering +administration#:#apache_auth_indicator_value#:#Indikatorvärde för lyckad Apache-autentisering +administration#:#apache_auth_security#:#Säkerhetsinställningar +administration#:#apache_auth_settings#:#Apache +administration#:#apache_auth_target_override_login#:#Mål-URL för inloggningssida +administration#:#apache_auth_username_by_function#:#Uppdrag med egen funktion +administration#:#apache_auth_username_config#:#Konfiguration för inloggningsnamn +administration#:#apache_auth_username_config_type#:#Typ +administration#:#apache_auth_username_direct_mapping#:#Direkt tilldelning +administration#:#apache_auth_username_direct_mapping_fieldname#:#Uppgiftsfält +administration#:#apache_auth_username_extended_mapping#:#Utökat uppdrag +administration#:#apache_autocreate#:#Aktivera automatiskt skapande av konto +administration#:#apache_default_role#:#Förvald roll för nya användare +administration#:#apache_enable_auth#:#Aktivera Apache-autentisering +administration#:#apache_enable_ldap#:#Aktivera LDAP för Apache-autentisering +administration#:#apache_enable_local#:#Aktivera lokal användarmappning för Apache-autentisering +administration#:#apache_ldap_hint_ldap_must_be_configured#:#LDAP måste konfigureras i administrationssystemet +administration#:#apache_settings#:#Konfigurera Apache-autentisering +administration#:#apache_settings_changed_success#:#Konfiguration sparad +administration#:#auth_apache#:#Apache +administration#:#auth_auth_mode_determination#:#Bestämning av autentiseringsmetod vid inloggning +administration#:#auth_automatic#:#Fast order +administration#:#auth_by_user#:#Av användaren +administration#:#auth_kind_determination#:#Typ av destination +administration#:#auth_mode_determination_info#:#Här kan du ange om autentiseringsmetoden måste väljas av användarna vid inloggning eller om autentiseringsdata ska kontrolleras med hjälp av en fördefinierad sekvens. +administration#:#clean#:#Rensa upp +administration#:#clean_desc#:#Ta bort ogiltiga referenser och trädposter. Initiera luckor i trädstrukturen +administration#:#cleaning#:#Cleanup... +administration#:#cleaning_final#:#Finally clean up.... +administration#:#course_export#:#Synlig i "Medlemmar" i kurser +administration#:#disabled#:#Funktionshindrad +administration#:#done#:#Gjort +administration#:#dump_tree#:#Lista träd +administration#:#dump_tree_desc#:#Analysera trädstrukturen och lista alla trädnoder tillsammans med analysdata. +administration#:#dumping_tree#:#Listan kan göras lång... +administration#:#found#:#Hittad +administration#:#found_none#:#Hittades inte +administration#:#frm_disp_info_desc#:#Välj vilken information som ska visas i översikterna. +administration#:#frm_displayed_infos#:#Information visas +administration#:#git_hash_short#:#Commit Hash (kort) +administration#:#git_last_commit#:#Sista åtagande +administration#:#git_revision#:#Nummer +administration#:#group_export#:#Visible i "Medlemmar" i grupper +administration#:#history_loginname#:#Historik över inloggningsnamn +administration#:#initializing_gaps#:#Initialisera luckor i trädstrukturen ... +administration#:#language_all_modules#:#Alla moduler +administration#:#language_change_settings#:#Ändra språkinställningar +administration#:#language_clear_local_changes#:#radera lokala ändringar i databasen +administration#:#language_clear_local_changes_info#:#Återställer posterna för detta språk i databasen till standardposterna i filen lang/ilias_%s.lang. Alla lokala ändringar eller tillägg tas bort. +administration#:#language_cleared_local#:#De lokala ändringarna har tagits bort från databasen. +administration#:#language_compare#:#Jämförelser med +administration#:#language_default_entries#:# (standardinmatningar) +administration#:#language_delete_local_additions#:#Radera lokala tillägg i databasen +administration#:#language_delete_local_additions_info#:#Raderar alla poster i databasen som har lagts till lokalt. +administration#:#language_error_clear_local#:#De lokala ändringarna kunde inte raderas i databasen! +administration#:#language_error_delete_local#:#Den anpassade språkfilen kunde inte raderas! +administration#:#language_error_local_missed#:#Den anpassade språkfilen existerar inte! +administration#:#language_error_read_local#:#Den anpassade språkfilen finns inte eller kan inte läsas! +administration#:#language_error_write_global#:#Filen med standardspråk kan inte skrivas! +administration#:#language_export_file#:#Exportera språkfil +administration#:#language_file_imported#:# Språkfilen %s har importerats. +administration#:#language_file_scope#:#Omfattning av språkfilen +administration#:#language_former_file_description#:#För att jämföra dina lokala ändringar med ändringarna i den senaste uppdateringen, kopiera den ursprungliga språkfilen för den tidigare installerade ILIAS-versionen till den katalog som anges ovan. Innan nästa uppdatering kan du göra detta med alternativ +administration#:#language_former_file_equal#:#Filen %s matchar den aktuella originalspråkfilen. +administration#:#language_former_file_missing#:#Filen %s existerar inte. +administration#:#language_import_file#:#Importera språkfil +administration#:#language_load_local_changes#:#Ladda in anpassad språkfil i databasen +administration#:#language_load_local_changes_info#:#Laddar in filen customising/global/lang/ilias_%s.lang.local i databasen. Nya poster från filen läggs till och befintliga poster i databasen skrivs över. +administration#:#language_loaded_local#:#Den anpassade språkfilen har laddats in i databasen. +administration#:#language_local_file_deleted#:#Den anpassade språkfilen har tagits bort. +administration#:#language_maintain#:#Underhåll +administration#:#language_maintain_local_changes#:#Lokala förändringar väntar +administration#:#language_maintenance#:#Språkhantering +administration#:#language_merge_local_changes#:#Införa lokala ändringar i standardspråkfilen +administration#:#language_merge_local_changes_info#:#Mixar alla lokala ändringar eller tillägg till standardspråksfilen lang/ilias_%s.lang. Webbservern måste ha skrivrättigheter till denna fil. +administration#:#language_merged_global#:#De lokala ändringarna har infogats i standardspråkfilen. +administration#:#language_mode_existing#:#Befintliga poster +administration#:#language_mode_existing_delete#:#Radera befintliga poster +administration#:#language_mode_existing_delete_info#:# Raderar alla databasposter före import.
VARNING +administration#:#language_mode_existing_keepall#:#Behåll befintliga poster +administration#:#language_mode_existing_keepall_info#:#Importerar endast nya poster som ännu inte finns i databasen. +administration#:#language_mode_existing_keepnew#:#Bevara lokala förändringar +administration#:#language_mode_existing_keepnew_info#:#Importerar nya poster och skriver över alla som fortfarande har standardvärden. Poster som redan har ändrats i databasen behålls. +administration#:#language_mode_existing_replace#:#Byt ut befintliga poster +administration#:#language_mode_existing_replace_info#:#Importerar nya poster och skriver över befintliga poster med de nya värdena från filen. +administration#:#language_note_translation#:#Sidöversättning aktiveras separat för varje språk. Dessutom måste en användare ha rättigheterna "Läs" och "Skriv" i språkmappen. +administration#:#language_process_maintenance#:#Utför underhåll +administration#:#language_remove_local_file#:#Ta bort anpassad språkfil +administration#:#language_remove_local_file_info#:#Tar bort filen customising/global/lang/ilias_%s.lang.local och ändrar språkets status från "Installerat med lokal version" till "Installerat". Posterna i databasen påverkas inte. +administration#:#language_save_dist#:#Skapa säkerhetskopia av standardspråkfilen +administration#:#language_save_dist_failed#:#Säkerhetskopian av standardspråkfilen kunde inte skrivas. +administration#:#language_save_dist_info#:#Skapar en säkerhetskopia av standardspråkfilen i den externa ILIAS-datakatalogen. Detta underlättar efter en ILIAS-uppdatering för att hitta konflikter mellan egna ändringar och uppdaterade språkvariabler. +administration#:#language_save_local_changes#:#Spara alla ändringar i den anpassade språkfilen +administration#:#language_save_local_changes_info#:#Sparar alla lokala ändringar eller tillägg i filen customising/global/lang/ilias_%s.lang.local och sätter status för språket till "Installerat med lokal version". Webbservern måste ha skrivrättigheter i katalogen. Observera att denna fil är densamma för +administration#:#language_saved_dist#:#Säkerhetskopian av standardspråkfilen har skapats och lagrats i den externa ILIAS-datakatalogen. +administration#:#language_scope_added#:#Endast lokala tillägg +administration#:#language_scope_added_info#:#exporterar alla poster som har lagts till i databasen lokalt. Detta kan användas för att spara ytterligare utvecklingsposter innan du återställer de lokala ändringarna på fliken "Underhåll". +administration#:#language_scope_commented#:# Visar endast poster med kommentarer i språkfilen +administration#:#language_scope_conflicts#:#Lokala och uppdaterade förändringar +administration#:#language_scope_dbremarks#:# Visar endast poster med kommentarer i databasen +administration#:#language_scope_different#:#Särskilt från språket för jämförelse +administration#:#language_scope_equal#:#Identiskt till språket för jämförelse +administration#:#language_scope_global#:#Alla poster +administration#:#language_scope_global_info#:#Exporterar alla databasposter. Detta kan användas för säkerhetskopiering. +administration#:#language_scope_local#:#Endast lokala ändringar +administration#:#language_scope_local_info#:#exporterar alla poster som har lagts till eller ändrats lokalt i databasen. +administration#:#language_scope_merged#:#Standardspråkfil med lokala ändringar +administration#:#language_scope_merged_info#:#exporterar standardspråkfilen för ILIAS, där alla lokala ändringar och tillägg blandas i alfabetisk ordning efter modul och språkvariabel. Detta kan användas för att uppdatera språkfilen på SVN-servern. +administration#:#language_scope_unchanged#:#Oförändrade poster +administration#:#language_scope_unchanged_info#:#exporterar alla databasposter som inte har ändrats från standardvärdena. Detta är motsatsen till "Endast lokala ändringar". Båda filerna utgör tillsammans en total säkerhetskopia av språket i databasen. +administration#:#language_settings#:#Språkinställningar +administration#:#language_statistics#:#Statistik +administration#:#language_translation_enabled#:#Sidöversättning aktiverad +administration#:#language_variables_saved#:#Ändringarna av språkvariablerna har sparats framgångsrikt. +administration#:#log_scan#:#Registrera resultaten av undersökningen +administration#:#log_scan_desc#:#Spara undersökningsresultaten i filen 'scanlog.log' i kundens datakatalog +administration#:#loginname_change_blocking_time#:#Blockeringstid för ändring av inloggningsnamn +administration#:#loginname_change_blocking_time_info#:#Ange den period i dagar efter vilken en person kan ändra sitt eget inloggningsnamn igen. Om du anger 0 kan det egna inloggningsnamnet ändras när som helst. +administration#:#loginname_change_blocking_time_invalidity_info#:#Var god ange ett numeriskt värde. +administration#:#loginname_history_info#:#Tidigare inloggningsnamn kan visas i databastabellen "loginname_history". +administration#:#nothing_to_purge#:#Inget att eliminera... +administration#:#nothing_to_remove#:#Inget att ta bort... +administration#:#nothing_to_restore#:#Inget att återställa... +administration#:#obj_blga#:#Blogg +administration#:#obj_blga_desc#:#Globala blogginställningar +administration#:#obj_chta_desc#:#Administration av chattobjektet och chatt-servern +administration#:#obj_excs#:#Träning +administration#:#obj_excs_desc#:#Globala övningsinställningar +administration#:#obj_mds#:#Metadata +administration#:#obj_mds_desc#:#Inställningar för metadata +administration#:#obj_otpl#:#Didaktiska mallar +administration#:#obj_otpl_desc#:#Mallar för skapande av nya objekt med fördefinierade rättighetsinställningar +administration#:#obj_prfa#:#Portfölj +administration#:#obj_prfa_desc#:#Globala portföljinställningar +administration#:#obj_taxs#:#Taxonomi +administration#:#obj_taxs_desc#:#Globala inställningar för taxonomi +administration#:#options#:#Alternativ +administration#:#org_op_edit_user_accounts#:#Redigera inloggningskonton +administration#:#output_options#:#Alternativ för utmatning +administration#:#path_to_mkisofs#:#Mkisofs väg +administration#:#purge_age_limit#:#Åldersgräns +administration#:#purge_age_limit_desc#:#Om det här fältet innehåller ett värde tas endast objekt som har tagits bort för mer än det angivna antalet dagar sedan bort från systemet. +administration#:#purge_count_limit#:#Nummer gräns +administration#:#purge_count_limit_desc#:#Om detta fält innehåller ett värde, kommer högst det angivna antalet objekt att tas bort från systemet. +administration#:#purge_missing#:#Ta bort saknade objekt +administration#:#purge_missing_desc#:#Ta bort alla saknade och otilldelade objekt från systemet +administration#:#purge_trash#:#Eliminera borttagna objekt +administration#:#purge_trash_desc#:#Ta bort alla objekt i papperskorgen från systemet +administration#:#purge_type_limit#:#Typ av gränsvärde +administration#:#purge_type_limit_desc#:#Om detta fält innehåller ett värde, tas endast objekt av den angivna typen bort från systemet. +administration#:#purging#:#Eliminerad... +administration#:#purging_missing_objs#:#Eliminerar saknade objekt... +administration#:#purging_trash#:#Empty Trash... +administration#:#purging_unbound_objs#:#Eliminerar ej tilldelade objekt +administration#:#removing_invalid_childs#:#Raderar ogiltiga poster i trädstrukturen... +administration#:#removing_invalid_refs#:#Tar bort ogiltiga hänvisningar... +administration#:#removing_invalid_rolfs#:#Tar bort ogiltiga rollmappar... +administration#:#repair_options#:#Alternativ för reparation +administration#:#restore_missing#:#Återställ förlorade föremål... +administration#:#restore_missing_desc#:#Återställ borttappade och icke tilldelade föremål och placera dem i räddningsmappen. +administration#:#restore_trash#:#Återställ raderade objekt +administration#:#restore_trash_desc#:#Återställ alla objekt i papperskorgen och flytta dem till räddningsmappen. +administration#:#restoring#:#Restaurerad... +administration#:#restoring_missing_objs#:#Återskapa förlorade föremål +administration#:#restoring_trash#:#Återställer raderade objekt... +administration#:#restoring_unbound_objs#:#återställer ej tilldelade objekt och underobjekt... +administration#:#reuse_of_loginnames_contained_in_history#:#Återanvändning av inloggningsnamn +administration#:#reuse_of_loginnames_contained_in_history_info#:#Login-namn som har använts av en person tidigare kan användas igen. +administration#:#scan#:#Investigate +administration#:#scan_desc#:#Sök igenom systemet efter korrupta/invalida/förlorade/ej tilldelade objekt +administration#:#scan_details#:#Detaljer om undersökningen +administration#:#scan_modes#:#Använda examinationsmetoder +administration#:#scanning_system#:#Investigate system... +administration#:#searching_deleted_objs#:#Sökning efter borttagna objekt.... +administration#:#searching_invalid_childs#:#Sök efter ogiltiga poster i trädstrukturen... +administration#:#searching_invalid_refs#:#Sökning efter ogiltiga referenser.... +administration#:#searching_invalid_rolfs#:#Sökning efter ogiltiga rollmappar.... +administration#:#searching_missing_objs#:#Söka efter förlorade föremål.... +administration#:#searching_unbound_objs#:#Sök efter ej tilldelade objekt... +administration#:#skipped#:#utställd +administration#:#start_scan#:#Start! +administration#:#svn_path#:#Stig +administration#:#svn_revision_current#:#Aktuell revidering +administration#:#svn_revision_last_change#:#Senast ändrade revision +administration#:#svn_root#:#Root +administration#:#system_check_no_owner#:#Objects without indication of ownership###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +administration#:#systemcheck#:#Systemkontroll +administration#:#tree_corrupt#:#Tree är skadad! Se skanningsloggen för detaljer +administration#:#user_criteria#:#Unik användarfunktion +administration#:#user_criteria_desc#:#Unik användaregenskap för import/export av testresultat. Egenskapen behövs för att identifiera en identisk användare i olika ILIAS-system. +administration#:#usr_loginname_history_info#:#Personen ändrade senast inloggningsnamnet den %s. Det tidigare inloggningsnamnet var +administration#:#vc_information#:# Visa information om versionskontroll +administration#:#vc_information_not_determined#:#Ingen information om versionskontroll kunde fastställas. +administration#:#view_last_log#:#Visa loggen för senaste skanning +administration#:#view_log#:#Visa detaljer +adn#:#administrative_notification_description#:#Gå ut systemövergripande meddelanden i rubriken för ILIAS +adn#:#btn_cancel#:#Avbryt +adn#:#btn_delete#:#Radera +adn#:#btn_delete_confirm#:#Vill du ta bort detta meddelande? +adn#:#btn_edit#:#Redigera +adn#:#btn_reset#:#Återställ +adn#:#btn_reset_confirm#:#Vill du återställa detta meddelande för alla användare? +adn#:#common_actions#:#Åtgärder +adn#:#common_add_msg#:#Lägg till tillkännagivande +adn#:#main#:#Meddelanden +adn#:#msg_body#:#Text +adn#:#msg_body_info#:#Texten för tillkännagivandena +adn#:#msg_dismissable#:#Manuell stängning +adn#:#msg_dismissable_info#:#Användare kan stänga meddelanden och inte längre se dem i framtiden. +adn#:#msg_display_date_end#:#Visa till +adn#:#msg_display_date_start#:#Visa från +adn#:#msg_error_false_date_configuration#:#Notification kan inte skapas med denna konfiguration av data. Händelsen måste vara inom visningstiden. +adn#:#msg_event_date_end#:#Avsluta händelse +adn#:#msg_event_date_start#:#Börja evenemang +adn#:#msg_form_title#:#Tillkännagivande +adn#:#msg_limit_to_roles#:#Begränsad till utvalda roller +adn#:#msg_limit_to_roles_info#:#Notification visas endast för personer med någon av de roller som valts nedan. +adn#:#msg_limited_to_role_ids#:#Display +adn#:#msg_permanent#:#Display +adn#:#msg_permanent_info#:#Visa meddelanden permanent eller under en begränsad tidsperiod +adn#:#msg_permanent_no#:#Tillfälligt +adn#:#msg_permanent_yes#:#Permanent +adn#:#msg_presentation#:#Display +adn#:#msg_show_to_all_roles#:#Visa alla roller +adn#:#msg_show_to_all_roles_info#:#Meddelandet visas för alla användare och är även synligt i det offentliga området för personer som inte är inloggade. +adn#:#msg_success_created#:#Anmälan skapad +adn#:#msg_success_deleted#:#Announcement framgångsrikt raderat +adn#:#msg_success_reset#:#Återställning av tillkännagivandet +adn#:#msg_success_updated#:#Anmälan uppdaterad +adn#:#msg_table_title#:#Meddelanden +adn#:#msg_title#:#Titel +adn#:#msg_title_info#:#Kort titel på meddelandet +adn#:#msg_type#:#betydelse +adn#:#msg_type_0#:#Note +adn#:#msg_type_1#:#Note +adn#:#msg_type_2#:#Viktigt +adn#:#msg_type_3#:#Brytande nyheter +adn#:#msg_type_during_event#:#Under evenemanget +adn#:#msg_type_info#:#Viktigheten avgör färgvisningen av tillkännagivandena +adn#adn#:#administrative_notification#:#Administrativa meddelanden###31 03 2023 ny variabel +adve#:#advanced_editing_excass_settings#:#Settings Övningsenheter (textleveranser) +adve#:#advanced_editing_tst_editing#:#Sidredigerare för ytterligare frågeinnehåll +adve#:#advanced_editing_tst_editing_desc#:#Aktiverar ILIAS sidredigerare för feedback och notistexter. +adve#:#adve_activation#:#Aktivering +adve#:#adve_auto_url_linking#:#URL Automatisk länkning +adve#:#adve_auto_url_linking_info#:#ILIAS söker i textstycken efter URL-adresser (t.ex. "http +adve#:#adve_autosave#:#Automatiskt sparintervall +adve#:#adve_autosave_info#:#Textinnehåll sparas automatiskt vid detta intervall. Kortare intervall leder till högre serverbelastning och lägre systemprestanda. +adve#:#adve_autosave_info_min_10#:#Ställ in värdet på minst 10 sekunder om du använder funktionen. +adve#:#adve_blocking_mode#:#Redigera lås +adve#:#adve_char_selector_settings#:#Urval av karaktärer +adve#:#adve_excass_settings#:#Träningsenheter +adve#:#adve_grp_copa#:#Innehållssidor +adve#:#adve_grp_frm#:#Forum +adve#:#adve_grp_glo#:#Glossarier +adve#:#adve_grp_lm#:#ILIAS utbildningsmoduler +adve#:#adve_grp_rep#:#Sidor i tidskrifter +adve#:#adve_grp_scorm#:#SCORM-moduler +adve#:#adve_grp_test#:#Test och bedömning +adve#:#adve_grp_wiki#:#Wikis +adve#:#adve_minutes#:#minuter +adve#:#adve_minutes_info#:#Tidsperiod i minuter tills sidan kan släppas igen på grund av brist på aktivitet och sedan redigeras av en annan användare. +adve#:#adve_page_editor_settings#:#ILIAS sidredigerare +adve#:#adve_pe_general#:#Inställningar +adve#:#adve_rte_settings#:#TinyMCE-editor +adve#:#adve_text_content_features#:#Text Innehåll Meny +adve#:#adve_use_physical#:#Ersätt #str|emp|imp med B|I|U +adve#:#adve_use_physical_info#:#Inställningen ersätter knapparna i de semantiska stilklasserna för stark, eftertrycklig och viktig med de fast definierade distinktionerna B (fet), I (kursiv) och U (understruken). Uppmärksamhet +adve#:#adve_use_tiny_mce#:#Aktivera TinyMCE för WYSIWYG-redigering +adve#:#char_selector_admin#:#Välj meny med specialtecken (Unicode) för tester och frågepooler +adve#:#char_selector_blocks#:#Tillgängliga specialtecken (Unicode) +adve#:#char_selector_blocks_info#:#Alla tecken i de valda blocken listas, även om webbläsarens teckensnitt inte stöder dem alla. +adve#:#char_selector_custom_items#:#Särskilt urval +adve#:#char_selector_custom_items_info1#:#Det särskilda urvalet listas före Unicode-blocken. Infoga tecknen här i följande format +adve#:#char_selector_custom_items_info2a#:#A B C +adve#:#char_selector_custom_items_info2b#:#Enskilda tecken separeras med mellanslag och får därmed separata valknappar +adve#:#char_selector_custom_items_info3a#:#A BC D +adve#:#char_selector_custom_items_info3b#:#Connected characters landar tillsammans på en väljarknapp +adve#:#char_selector_custom_items_info4a#:#A-Z +adve#:#char_selector_custom_items_info4b#:#Teckenintervall kan definieras med ett "-". +adve#:#char_selector_custom_items_info5a#:#U+00C0 +adve#:#char_selector_custom_items_info5b#:#Ett tecken kan också anges i Unicode-notation (skiftlägeskänsligt). +adve#:#char_selector_custom_items_info6a#:#U+00C0-U+00CF +adve#:#char_selector_custom_items_info6b#:#Teckenintervall kan också anges i Unicode-notation +adve#:#char_selector_disabled_admin#:#Knapp ? för att aktivera valmenyn för specialtecken måste vara tillkopplad separat +adve#:#char_selector_disabled_info_admin#:#Valmenyn för specialtecken (Unicode) är aktiverad för tester och frågepooler, men användarna måste göra motsvarande inställningar i de personliga inställningarna eller så kan testet eller frågepoolen konfigureras på fliken "Inställningar" så att valmenyn +adve#:#char_selector_disabled_info_test#:#Beroende på användarens inställningar är menyn för val av specialtecken (Unicode) avstängd när testet utförs, tecken kan endast anges via tangentbordet. +adve#:#char_selector_disabled_info_user#:#Normalt visas ingen urvalsmeny för specialtecken i tester. Enskilda tester kan dock tvinga fram att denna meny visas trots denna inställning. +adve#:#char_selector_disabled_test#:#Visa inte val av specialtecken +adve#:#char_selector_disabled_user#:#Visa ingen urvalsmeny för specialtecken i tester +adve#:#char_selector_enabled_admin#:#? för att aktivera menyn för val av specialtecken visas som standard +adve#:#char_selector_enabled_info_admin#:#Valmenyn för specialtecken (Unicode) är aktiverad. Den innehåller de Unicode-block som är valda i den här inställningen. Användarna kan dock göra individuella inställningar i de personliga inställningarna eller så kan tester konfigureras på fliken "Instä +adve#:#char_selector_enabled_info_test#:#Oberoende av användarens inställningar visas menyn för val av specialtecken (Unicode) när testet utförs; specialtecken kan anges via menyn. +adve#:#char_selector_enabled_info_user#:#En urvalsmeny för specialtecken visas i tester. Enskilda tester kan dock undertrycka visningen av denna meny trots denna inställning. +adve#:#char_selector_enabled_test#:#Visa val av specialtecken +adve#:#char_selector_enabled_user#:#Aktivera urvalsmeny för specialtecken +adve#:#char_selector_inactive_admin#:#Deaktivera valmenyn för specialtecken globalt +adve#:#char_selector_inactive_info_admin#:#Valmenyn för specialtecken är avaktiverad för hela plattformen. Möjligheten att göra individuella inställningar i de personliga inställningarna eller på fliken "Inställningar" i tester är också dold. +adve#:#char_selector_inherit_info_test#:#Beroende på inställningarna i administrationen och de individuella inställningar som en användare har gjort i de personliga inställningarna, kan urvalsmenyn för specialtecken (Unicode) visas eller inte visas i testkörningen. +adve#:#char_selector_inherit_info_user#:#Inställningarna antas eftersom de aktiverades globalt av administratören för hela plattformen. +adve#:#char_selector_inherit_test#:#Tillämpa plattforms- och individuella användarinställningar +adve#:#char_selector_inherit_user#:#Tillämpa standardinställningar +adve#:#char_selector_menu_close#:#Dölj val av specialtecken +adve#:#char_selector_menu_open#:#Visa val av specialtecken +adve#:#char_selector_msg_blocks_or_custom_needed#:#Om du aktiverar urvalet, välj ett karaktärsblock eller ange ditt eget urval av karaktärer! +adve#:#char_selector_test#:#Välj meny med specialtecken +adve#:#char_selector_unicode_all#:#Alla Unicode-block +adve#:#char_selector_user#:#Välj meny med specialtecken (Unicode) för tester +assessment#:#action#:#Åtgärder +assessment#:#addSuggestedSolution#:#Innehåll för repetition +assessment#:#add_answers#:#Lägg till svar +assessment#:#add_circle#:#Lägg till cirkel +assessment#:#add_gap#:#Lägg till cloze +assessment#:#add_imagemap#:#Importera imagemap +assessment#:#add_poly#:#Lägg till Polygon +assessment#:#add_rect#:#Lägg till rektangel +assessment#:#additional_rating_info#:#Observera att de värden som anges här är i procent och måste summeras till 100. +assessment#:#adm_settings_templates#:#Inställning av mallar +assessment#:#advanced_rating#:#Avancerad utvärdering +assessment#:#advanced_rating_info#:#Den utökade utvärderingen är endast möjlig om du har angett en enhet för resultatet. Ytterligare utvärderingsinställningar visas efter att de angivna enheterna har sparats. +assessment#:#all_available_question_pools#:#Alla befintliga frågepooler +assessment#:#all_participants#:#Alla deltagare +assessment#:#allow_images#:#Grafiskt stöd för svar +assessment#:#allowedextensions#:#Tillåtna filtillägg +assessment#:#allowedextensions_info#:#Ange en kommaseparerad lista över tillåtna filändelser om du vill begränsa uppladdningen till vissa filtyper (t.ex. doc, pdf, odt). +assessment#:#analyze_errortext#:#Analysera text +assessment#:#answer#:#Svar +assessment#:#answer_characters#:# tillåtna tecken, antal tecken som anges +assessment#:#answer_image#:#Svar grafik +assessment#:#answer_is_not_correct_but_positive#:#Du har fått poäng för din lösning. Det är dock inte den bästa lösningen. +assessment#:#answer_is_right#:#Din lösning är korrekt. +assessment#:#answer_is_wrong#:#Din lösning är fel. +assessment#:#answer_of#:#Reply från +assessment#:#answer_options#:#Alternativ för svar +assessment#:#answer_question#:#Svar på fråga +assessment#:#answer_text#:#Svar text +assessment#:#answer_types#:#Svar redaktör +assessment#:#answered#:#Besvarad +assessment#:#answers_multiline#:#Svar från Multiline +assessment#:#answers_of#:#Svar från +assessment#:#answers_select#:#Urval +assessment#:#answers_singleline#:#Svar på en rad +assessment#:#answers_text_box#:#Textfält +assessment#:#applet_attributes#:#Applet-attribut +assessment#:#applet_parameter#:#Parametrar +assessment#:#applet_parameters#:#Parametrar för applet +assessment#:#apply#:#Takeover +assessment#:#apply_def_settings_to_tst#:#Tillämpa inställningar för test +assessment#:#assClozeTest#:#Cloze fråga +assessment#:#assErrorText#:#Markera fel/ord +assessment#:#assFileUpload#:#Ladda upp fil +assessment#:#assFlashQuestion#:#Inbäddad fråga +assessment#:#assFormulaQuestion#:#formelfråga +assessment#:#assImagemapQuestion#:#Hotspot/Imagemap +assessment#:#assKprimChoice#:#Kprim Val +assessment#:#assLongMenu#:#"Lång meny" fråga +assessment#:#assMatchingQuestion#:#Uppgiftsfråga +assessment#:#assMultipleChoice#:#Multipla valmöjligheter +assessment#:#assNumeric#:#Numeriskt svar +assessment#:#assOrderingHorizontal#:#Arrangemang fråga +assessment#:#assOrderingQuestion#:#Arrangemang fråga +assessment#:#assQuestions#:#Frågor och svar +assessment#:#assSingleChoice#:#Enskilt val +assessment#:#assTextQuestion#:#Ange fri text +assessment#:#assTextSubset#:#Namn termer +assessment#:#ass_cloze_fb_mode#:#Metod för återkoppling +assessment#:#ass_cloze_fb_mode_gap_answ#:#Svarsspecifik feedback +assessment#:#ass_cloze_fb_mode_gap_answ_info#:#För varje gap kan olika feedback lagras för varje svar. +assessment#:#ass_cloze_fb_mode_gap_qst#:#Avkastning per gap +assessment#:#ass_cloze_fb_mode_gap_qst_info#:#För varje gap kan en återkoppling deponeras. +assessment#:#ass_cloze_gap_fb_gap_label#:#Gap %s +assessment#:#ass_cloze_gap_fb_num_empty_label#:#Gap %s - Ingen inmatning +assessment#:#ass_cloze_gap_fb_num_rangehit_label#:#Gap %s - Värdeintervall +assessment#:#ass_cloze_gap_fb_num_toohigh_label#:#Gap %s - Värde för högt +assessment#:#ass_cloze_gap_fb_num_toolow_label#:#Gap %s - värde för lågt +assessment#:#ass_cloze_gap_fb_num_valuehit_label#:#Gap %s - Exakt värde +assessment#:#ass_cloze_gap_fb_sel_empty_label#:#Gap %s - Inget urval +assessment#:#ass_cloze_gap_fb_sel_opt_label#:#Gap %s - Valmöjlighet +assessment#:#ass_cloze_gap_fb_txt_empty_label#:#Gap %s - Ingen inmatning +assessment#:#ass_cloze_gap_fb_txt_match_label#:#Gap %s - Specificerat svar +assessment#:#ass_cloze_gap_fb_txt_nomatch_label#:#Gap %s - Felaktig inmatning +assessment#:#ass_commented_questions_only#:#Endast kommenterade frågor +assessment#:#ass_comments#:#Kommentarer +assessment#:#ass_competence_respect_level_ordering#:#Observera att tröskelvärdena för kompetens måste definieras i enlighet med kompetensnivåerna i stigande ordning. +assessment#:#ass_completion_by_submission#:#Passera genom att lämna in +assessment#:#ass_completion_by_submission_info#:#Om den är aktiverad leder inlämnandet av en lösningsfil till att maximalt antal poäng tilldelas för denna fråga. Poängen kan justeras manuellt när som helst. Ändring av denna inställning har ingen efterföljande effekt på redan inlämnade lösningar. +assessment#:#ass_create_export_file#:#Skapa exportfil +assessment#:#ass_create_export_file_with_results#:#Skapa exportfil (inkl. deltagarresultat) +assessment#:#ass_create_export_test_archive#:#Skapa arkivfil för test +assessment#:#ass_create_export_test_results#:#Skapa resultatfil +assessment#:#ass_create_question#:#Skapa fråga +assessment#:#ass_imap_hint#:#Note (visas som verktygstips) +assessment#:#ass_imap_map_file_not_readable#:#Den uppladdade bildkartan kan inte läsas. +assessment#:#ass_imap_no_map_found#:#Ingen stödd form kunde hittas i den uppladdade bildkartan. +assessment#:#ass_lac_expression#:#Uttryck +assessment#:#ass_lac_show_legend_btn#:#Visa legend +assessment#:#ass_lac_unable_to_parse_condition#:#Uttrycket "%s" kan inte valideras. +assessment#:#ass_lac_validation_error#:#Det finns fel i valideringen av villkoret/villkoren! +assessment#:#ass_location#:#Plats +assessment#:#ass_mc_sel_lim_exhausted_hint#:#Var vänlig välj inte fler än %s av %s svar! +assessment#:#ass_mc_sel_lim_hint#:#Välj högst %s av %s svar! +assessment#:#ass_mc_sel_lim_setting#:#Begränsning av svar +assessment#:#ass_mc_sel_lim_setting_desc#:#Med denna inställning kan antalet svar som kan väljas av deltagaren begränsas. +assessment#:#ass_process_lock#:#Använd låsmekanism under testkörningar +assessment#:#ass_process_lock_desc#:#Race-förhållanden är möjliga utan användning av en låsmekanism. Dessa kan leda till inkonsekventa testresultat. +assessment#:#ass_process_lock_mode#:#Låst läge under inlämning av deltagarlösningar +assessment#:#ass_process_lock_mode_db#:#Använd låsning av databastabeller +assessment#:#ass_process_lock_mode_db_desc#:#Denna låsmekanism skapar lås på motsvarande tabeller i databasen. Konkurrerande processer för samma eller olika användare i samma eller olika test för samma eller olika frågor måste vänta tills den andra processen släpper låset. +assessment#:#ass_process_lock_mode_file#:#Använda filsystemlås +assessment#:#ass_process_lock_mode_file_desc#:#Den här låsmekanismen skapar lås på tomma filer i filsystemet. Konkurrerande processer för samma användare och samma test/fråga måste vänta tills den andra processen släpper låset. +assessment#:#ass_question#:#Fråga +assessment#:#ass_size#:#Storlek +assessment#:#ass_skl_import_fails_remove_btn#:#Ta bort detta meddelande +assessment#:#assessment_existing_pool#:#Använda befintlig frågepool +assessment#:#assessment_log_scoring_adjustment_activate#:#Tillgängliga frågetyper för läget efter korrigering +assessment#:#assessment_log_scoring_adjustment_desc#:#Valda frågetyper är tillgängliga i efterkorrigeringsläge. Den här inställningen tar inte hänsyn till om frågan kan redigeras i efterkorrigeringsläget. +assessment#:#assessment_new_pool#:#Skapa och använd en ny frågepool +assessment#:#assessment_no_pool#:#Använd inte en frågepool +assessment#:#assessment_pool_selection#:#Val av pool +assessment#:#assessment_scoring_adjust#:# Aktivera läge efter korrigering +assessment#:#assessment_scoring_adjust_desc#:#Aktiverar efterkorrigeringsläget för att i efterhand justera poängsättningen av frågor i tester. +assessment#:#autocomplete_error#:#Ditt autokompletteringsvärde är för stort, du har svar i dina svarsalternativ som har färre tecken och därför aldrig kan väljas. +assessment#:#autoparticipants_subtab#:#Deltagare +assessment#:#autosave#:#Automatiskt sparande +assessment#:#autosave_failed#:#Automatisk räddning misslyckades! +assessment#:#autosave_info#:#Deltagarnas svar på den senast öppnade frågan sparas automatiskt av ILIAS. Dessa automatiskt sparade svar räknas inte som svar som godkänts av deltagaren. De beaktas därför inte av ILIAS under den automatiska utvärderingen. Automatiskt sparade sva +assessment#:#autosave_ival#:#Spara intervall +assessment#:#autosave_success#:#Automatisk besparing framgångsrikt genomförd... +assessment#:#autosavecontent#:#Automatisk lagring av innehåll +assessment#:#average_reached_points#:#Genomsnittlig uppnådd poäng +assessment#:#back_to_objective_container#:#Tillbaka till kursen +assessment#:#backtocallingpage#:#Tillbaka till frågesidan +assessment#:#backtocallingpool#:#Tillbaka till frågepoolen +assessment#:#backtocallingtest#:#Tillbaka till testet +assessment#:#baseunit#:#Basenhet +assessment#:#button_request_next_question_hint#:#Förfrågan om nästa lösning +assessment#:#button_request_question_hint#:#Förfrågan om lösning +assessment#:#button_show_requested_question_hints#:#Visa begärda lösningsanteckningar +assessment#:#by#:#till +assessment#:#cancel_test#:#Test av avbrott +assessment#:#cannot_edit_marks#:#Testet har redan genomförts av deltagarna. Du kan bara ändra bedömningen om ett datum har fastställts för resultatutmatningen som för närvarande fortfarande ligger i framtiden. +assessment#:#cannot_edit_test#:#Du har inte tillräckliga rättigheter för att redigera testet! +assessment#:#cannot_execute_test#:#Du har inte tillräckliga rättigheter för att utföra testet! +assessment#:#cannot_export_archive#:#Arkivexport kan inte skapas. +assessment#:#cannot_read_questionpool#:#Du har inte tillräckliga rättigheter för att komma åt frågepoolen! +assessment#:#cannot_save_metaobject#:#Du har inte tillräckliga rättigheter för att spara metadata! +assessment#:#cannot_switch_to_online_no_questions_andor_no_mark_steps#:#Statusen kan inte ändras till "online (aktiverad)" eftersom inga frågor och/eller markeringar har lagts till i testet ännu! +assessment#:#categories#:#Kategorier +assessment#:#category#:#Kategori +assessment#:#changeSuggestedSolution#:#Välj typ av innehåll som ska upprepas +assessment#:#change_adm_categories_not_allowed#:#I detta skede har du inte skrivrättigheter till kategorin. +assessment#:#char_selector_btn_label#:# ? +assessment#:#checkbox_checked#:#Vald +assessment#:#checkbox_unchecked#:#Inte vald +assessment#:#circle#:#Cirkel +assessment#:#circle_click_center#:#Klicka på mitten av den önskade regionen +assessment#:#circle_click_circle#:#Klicka på en punkt på omkretsen av den önskade regionen +assessment#:#clientip#:#Klient IP +assessment#:#close_text_hint#:#För att infoga ett mellanrum i texten, placera markören på motsvarande position och använd knappen "Textmellanrum". Därefter finns motsvarande redigeringsområden tillgängliga längre ner. Du kan också klicka direkt på luckorna för att redigera i lucktexte +assessment#:#cloze_fixed_textlength#:#Längd på textfältet +assessment#:#cloze_fixed_textlength_description#:#Om du anger ett värde här skapas textgap som inte definierar ett eget värde för en maximal längd, samt numeriska gap med denna längd, så att det inte är möjligt att ange ett större antal tecken. För numeriska luckor, observera att decimalavgränsaren ocks +assessment#:#cloze_gap_size_info#:#Om ett värde större än 0 anges skapas detta mellanrum med den längd som anges här. Om inget värde anges skapas detta mellanrum med den globalt angivna textfältslängden. +assessment#:#cloze_text#:#Cloze fråga +assessment#:#cloze_textgap_case_insensitive#:#Ingen skillnad görs mellan stora och små bokstäver +assessment#:#cloze_textgap_case_sensitive#:#Känsliga gemener +assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein avstånd från %s +assessment#:#cloze_textgap_multiple_whitespace#:#Flera utrymmen i rad +assessment#:#cloze_textgap_whitespace_after#:#Space efter terminen +assessment#:#cloze_textgap_whitespace_before#:#Space före terminen +assessment#:#code#:#Kod +assessment#:#codebase#:#Codebase +assessment#:#concatenation#:#Länk +assessment#:#conf_delete_pass#:#Vill du verkligen ta bort passagen? +assessment#:#conf_delete_pass_ctm#:#Vill du verkligen radera dina tidigare svar? +assessment#:#confirm_delete_all_user_data#:#Är du säker på att du vill radera alla poster från undersökningen? +assessment#:#confirm_delete_single_user_data#:#Är du säker på att du vill ta bort alla testdata för de valda användarna? +assessment#:#confirm_sync_questions#:#Frågan du ändrade skapades som en kopia av ett original när du infogade den i testet. Vill du nu tillämpa dina ändringar på den ursprungliga frågan? +assessment#:#coordinates#:#Koordinater +assessment#:#copy_and_link_to_questionpool#:#Lägg till frågepoolen +assessment#:#copy_no_questions_selected#:#Välj minst en fråga att kopiera. +assessment#:#copy_questions_success#:#Frågorna har kopierats. +assessment#:#correct_answers#:#Rätt svar +assessment#:#counter#:#Counter +assessment#:#create_date#:#Skapad +assessment#:#create_gaps#:#Skapa och uppdatera luckor +assessment#:#create_new#:#Skapa ny +assessment#:#ctm_cannot_be_changed#:#Resubmission tests kan inte längre ändras. +assessment#:#ctm_cannot_be_started#:#Återinlämningstest kan inte längre påbörjas. +assessment#:#customstyle#:#Egen formatmall +assessment#:#dashboard_tab#:#Deltagare +assessment#:#definition#:#Definition +assessment#:#definition_image#:#Image +assessment#:#definition_text#:#Text +assessment#:#definitions#:#Definitioner +assessment#:#deleteSuggestedSolution#:#Ta bort innehåll för upprepning +assessment#:#delete_all_user_data#:#Ta bort testdata från alla deltagare +assessment#:#delete_all_user_data_confirmation#:#Vill du verkligen radera testdata för alla deltagare? +assessment#:#delete_image_header#:#Ta bort bild +assessment#:#delete_image_question#:#Vill du verkligen ta bort bilden? +assessment#:#delete_user_data#:#Ta bort testdata +assessment#:#description_maxchars#:#Om inget anges är det maximala antalet tecken för detta textsvar obegränsat. +assessment#:#detail_ending_time_reached#:#Du har överskridit den längsta möjliga behandlingstiden för testet. Testet kunde endast slutföras av %s. +assessment#:#detail_max_processing_time_reached#:#Du har överskridit den maximala tidsgränsen för testet. Du får inte fortsätta att arbeta på provet! +assessment#:#detail_starting_time_not_reached#:#Testet kan ännu inte bearbetas. Bearbetning är möjlig tidigast från %s. +assessment#:#detailed_evaluation#:#Detaljerad statistik +assessment#:#detailed_evaluation_for#:#Detaljerad statistik för %s +assessment#:#detailed_evaluation_missing_active_id#:#Du behöver ta fram detaljerad statistik för en specifik deltagare! +assessment#:#detailed_evaluation_show#:#Visa detaljerad statistik +assessment#:#detailed_output_printview#:#Detaljutskrift med utskriftsvy av frågorna +assessment#:#detailed_output_solutions#:#Detaljera resultatet med lösningar +assessment#:#direct_feedback#:#Kontrollera din lösning +assessment#:#discard_answer#:#Radera svar +assessment#:#discard_answer_confirmation#:#Ditt svar kommer att raderas fullständigt och permanent. Du kan dock svara på frågan igen vid ett senare tillfälle.

Ska ditt svar raderas permanent? +assessment#:#dont_use_questionpool#:#Lägg inte in frågor i en frågepool, utan använd dem endast i detta test. +assessment#:#duplicate#:#Kopia +assessment#:#duplicate_matching_values_selected#:#Du har valt minst ett värde för dubbel tilldelning! +assessment#:#duplicate_order_values_entered#:#Du har gett minst en dubbelbeställning! +assessment#:#ects_allow_ects_grades#:#Visa ECTS-betyg utöver det uppnådda betyget +assessment#:#ects_fx_threshold#:#Begränsning +assessment#:#ects_fx_threshold_info#:#Ange tröskelvärdet över vilket underkända deltagare får ECTS-betyget "FX". +assessment#:#ects_grade#:#ECTS-klass +assessment#:#ects_grade_a_desc#:#excellenta prestationer och endast ett fåtal obetydliga misstag +assessment#:#ects_grade_b_desc#:#prestationer över genomsnittet, men vissa misstag +assessment#:#ects_grade_c_desc#:#överlag bra och gediget arbete, men med några grundläggande brister +assessment#:#ects_grade_d_desc#:#medium, men tydliga brister +assessment#:#ects_grade_desc_prefix#:#Betydelsen av noten +assessment#:#ects_grade_e_desc#:#de visade prestandan uppfyller minimikraven +assessment#:#ects_grade_f_desc#:#Betydande förbättringar behövs +assessment#:#ects_grade_fx_desc#:#förbättringar behövs innan prestationen erkänns +assessment#:#ects_output_of_ects_grades#:#Utmatning av ECTS-betyg +assessment#:#edit_answer#:#Ändra svar +assessment#:#edit_page#:#Redigera sida +assessment#:#edit_question#:#Redigera fråga +assessment#:#edit_test_questions#:#Listvy +assessment#:#element_height#:#Minsta höjd +assessment#:#element_height_info#:#Detta värde anger minsta höjd för termer och definitioner/bilder vid testutskrift. +assessment#:#enable_examview#:#Översikt över givna svar +assessment#:#enable_examview_desc#:#Deltagarna presenteras med alla frågor och de svar de har gett innan de skickar in testet. +assessment#:#end_tag#:#Slutmarkör +assessment#:#enlarge#:#enlarge +assessment#:#enter_anonymous_code#:#Ange åtkomstnyckel för att fortsätta tester som redan har påbörjats. +assessment#:#enter_enough_positive_points#:#Det maximala antalet poäng för frågan måste vara större än noll! Ange tillräckligt många icke-negativa poäng för svaren. +assessment#:#enter_enough_positive_points_checked#:#Minst ett svar måste ge poäng. Ange en positiv poäng för att välja ett svar. +assessment#:#enter_valid_values#:#Se till att du anger giltiga värden. Om du anger bokstäver kommer det att bedömas som fel! +assessment#:#errFormulaQuestion#:#En formelfråga innehåller felaktig information +assessment#:#errRecursionInResult#:#Formeln innehåller en icke-lösbar rekursion. +assessment#:#err_category_in_use#:#Kategorin kan inte raderas. En eller flera enheter i kategorin används redan. +assessment#:#err_divider_too_big#:#Divisorn för en av variablerna i denna fråga är för stor. +assessment#:#err_division#:#Det värde du anger gör det omöjligt att generera ett giltigt värde för variabeln. +assessment#:#err_duplicate_results#:#Du har använt en resultatvariabel mer än en gång. Detta är inte tillåtet i uppgiftstexten! +assessment#:#err_no_formula#:#Ange en formel för att beräkna resultatet. +assessment#:#err_no_numeric_value#:#Var god ange ett numeriskt värde +assessment#:#err_range#:#Den övre gränsen måste vara större än den undre gränsen. +assessment#:#err_rating_advanced_not_allowed#:#Du kan bara använda den enkla klassificeringen eftersom du använder flera resultatenheter med en identisk basenhet. +assessment#:#err_unit_in_results#:#Enheten kan inte raderas. Den används redan i testfrågor. +assessment#:#err_unit_in_variables#:#Enheten kan inte raderas. Den används redan i testfrågor. +assessment#:#err_unit_is_baseunit#:#Enheten kan inte raderas. Den används som basenhet av andra enheter. +assessment#:#err_wrong_categoryname#:#Kategorin finns redan. +assessment#:#err_wrong_rating_advanced#:#Se till att summan av de utökade betygsalternativen är exakt 100 procent. +assessment#:#error_importing_question#:#Ett fel uppstod vid import av frågorna! +assessment#:#error_open_image_file#:#Fel vid öppning av en bildfil! +assessment#:#error_random_question_generation#:#Ett okänt fel uppstod när slumpmässiga frågor genererades. Vänligen kontakta din ILIAS-administration och vidarebefordra följande information +assessment#:#errors#:#Fel +assessment#:#errors_section#:#Felaktiga data +assessment#:#errortext#:# Markera fel/ord +assessment#:#errortext_info#:#Vänligen ange en text. För att markera ett ord som felaktigt, placera en hash (#) direkt framför det önskade ordet. För att definiera en grupp av felaktiga ord, sätt orden inom dubbla parenteser och utelämna hashtecknet i detta fall. Exempel +assessment#:#essay_scoring_mode#:#Utvärderingssätt +assessment#:#essay_scoring_mode_keyword_relation_all#:#Automatisk utvärdering när alla termer är namngivna +assessment#:#essay_scoring_mode_keyword_relation_all_desc#:#Poängen tilldelas automatiskt om alla villkor har hittats. +assessment#:#essay_scoring_mode_keyword_relation_any#:#Automatisk utvärdering när enskilda termer nämns +assessment#:#essay_scoring_mode_keyword_relation_any_desc#:#För varje term som hittas tilldelas motsvarande poäng. +assessment#:#essay_scoring_mode_keyword_relation_one#:#Automatisk utvärdering när en term är namngiven +assessment#:#essay_scoring_mode_keyword_relation_one_desc#:#Poängen tilldelas automatiskt om minst en term hittas. +assessment#:#essay_scoring_mode_without_keywords#:#Ingen automatisk klassificering +assessment#:#essay_scoring_mode_without_keywords_desc#:#Inga poäng tilldelas automatiskt. Poäng kan endast tilldelas med manuell bedömning. +assessment#:#eval_all_users#:#Utvärdering för alla användare +assessment#:#eval_legend_link#:#För innebörden av kolumnrubrikerna, se teckenförklaringen +assessment#:#evaluated_users#:#Rated användare +assessment#:#exam_id#:#ILIAS examensnummer +assessment#:#exam_id_label#:#ILIAS examensnummer +assessment#:#examid_in_test_pass#:#Visa ILIAS provnummer +assessment#:#examid_in_test_pass_desc#:#Ett ILIAS-examensnummer visas i testet. Ett separat nummer genereras för varje testkörning. +assessment#:#examid_in_test_res#:#Visa ILIAS provnummer +assessment#:#examid_in_test_res_desc#:#I testresultaten, statistiken och Excel-exporten visas ILIAS-examensnumret. +assessment#:#exp_eval_data#:#Exportera utvärderingsdata som +assessment#:#exp_file_created#:#Exportfil genererad. +assessment#:#exp_type_certificate#:#Certifikat (PDF) +assessment#:#exp_type_excel#:#Microsoft Excel +assessment#:#exp_type_spss#:#Kommaseparerade värden (CSV) +assessment#:#expected_result_type#:#Typ av förväntat resultat +assessment#:#export#:#Export +assessment#:#export_essay_qst_with_html#:#Exportera fritextfrågor med HTML-kod +assessment#:#export_essay_qst_with_html_desc#:#Om aktiverat har du möjlighet att exportera fritextfrågor med den angivna HTML-koden till Excel. +assessment#:#extratime#:#Tidsförlängning +assessment#:#factor#:#Faktor +assessment#:#failed_official#:#Misslyckad +assessment#:#failed_short#:#Misslyckad +assessment#:#false#:#Fel +assessment#:#feedback_all#:#Visa feedback på alla svarsalternativ. +assessment#:#feedback_answers#:#Olika feedback per givet svar +assessment#:#feedback_checked#:#Visa feedback på utvalda svar från deltagaren. +assessment#:#feedback_complete_solution#:#Rätt lösning +assessment#:#feedback_correct_kprim#:#Visa feedback för korrekta svar (korrekta svar är de där det positiva alternativet ska väljas). +assessment#:#feedback_correct_sc_mc#:#Visa feedback för korrekta svar (korrekta svar är de för vilka det finns positiva poäng när de väljs). +assessment#:#feedback_generic#:#Feedback på den korrekta lösningen +assessment#:#feedback_incomplete_solution#:#Minst ett svar är inte korrekt +assessment#:#feedback_setting#:#Mode +assessment#:#fileDownload#:#Ladda ner filer +assessment#:#file_uploads#:#Uppladdade filer +assessment#:#fill_out_all_required_fields_add_answer#:#Du måste först fylla i alla obligatoriska fält innan du kan lägga till svar! +assessment#:#filter#:#Filter +assessment#:#filter_all_question_types#:#Alla typer av frågor +assessment#:#filter_all_questionpools#:#Alla frågepooler +assessment#:#filter_show_question_types#:#Visa följande typer av frågor +assessment#:#filter_show_questionpools#:#Visa följande frågepooler +assessment#:#final_statement#:#Avslutande anmärkning +assessment#:#final_statement_show_desc#:#Visar den slutliga kommentaren efter att testet har skickats in. +assessment#:#finalized_by#:#Rating genomförd av +assessment#:#finalized_evaluation#:#Final betygsatt +assessment#:#finalized_on#:#Värderingen slutförd den +assessment#:#finish_all_user_passes#:#Avsluta alla testkörningar +assessment#:#finish_pass_for_all_users#:#Vill du verkligen stoppa testkörningarna för alla användare? +assessment#:#finish_pass_for_all_users_in_processing_time#:#Du kan inte avsluta körningarna för alla användare tillsammans, eftersom behandlingstiden för minst en användare ännu inte är över. +assessment#:#finish_pass_for_user_confirmation#:#Vill du verkligen avsluta testkörningen för deltagaren "%s"? +assessment#:#finish_pass_for_user_in_processing_time#:#VARNING +assessment#:#finish_test#:#Avsluta test +assessment#:#finish_unfinished_passes#:#Avslutar testkörningar som fortfarande är öppna +assessment#:#finish_unfinished_passes_desc#:#Test som ännu inte har slutförts avslutas automatiskt - förutsatt att en sluttid har fastställts för dessa test eller att deltagarna har överskridit den maximala sluttiden. +assessment#:#fixed_participants_hint#:#Detta test är endast tillgängligt för denna fasta grupp av deltagare. Om du vill göra testet tillgängligt för alla deltagare måste du ändra markeringen i kryssrutan för fasta deltagare i testinställningarna. +assessment#:#fixedparticipants_subtab#:#Utvalda deltagare +assessment#:#flashfile#:#Flash-fil +assessment#:#for#:#för +assessment#:#forcejs#:#Tvinga JavaScript för utdata från testfrågor +assessment#:#form_msg_area_missing_points#:#Ange en poäng för alla regioner. +assessment#:#formula#:#Formel +assessment#:#fq_formula_desc#:#Tillåtet är användning av redan definierade variabler ($v1 till $vn), av redan definierade resultat (t.ex. $r1), godtycklig parentesering av uttryck, de matematiska operatorerna + (addition), - (subtraktion), * (multiplikation), / (division), ^ (exponent +assessment#:#fq_no_restriction_info#:#Både decimaltal och bråktal accepteras som indata. +assessment#:#fq_precision_info#:#Ange det antal decimaler du vill ha här. +assessment#:#fq_question_desc#:#Du definierar variabler genom att ange $v1, $v2 ... $vn, resultatfält med $r1, $r2 .... $rn på önskade positioner i texten. Klicka sedan på knappen "Analysera fråga" för att generera redigeringsformulär för alla variabler och resultat. +assessment#:#gap#:#Gap +assessment#:#gap_combination#:#Cloze kombination +assessment#:#general#:#Allmänna inställningar +assessment#:#glossary_term#:#Glossarisk term +assessment#:#grading_mark_msg#:#Du har uppnått märket "[märke]". +assessment#:#grading_obligations_answered_listentry#:#Besvarad +assessment#:#grading_obligations_answered_msg#:#Alla obligatoriska frågor har besvarats. +assessment#:#grading_obligations_listlabel#:#Obligatoriska frågor +assessment#:#grading_obligations_missing_listentry#:#Öppen +assessment#:#grading_obligations_missing_msg#:#Alla obligatoriska frågor besvarades inte. +assessment#:#grading_status_failed_msg#:#Synd, tyvärr klarade du inte testet. +assessment#:#grading_status_passed_msg#:#Grattis! Du har klarat provet. +assessment#:#height#:#Höjd +assessment#:#identical_scoring#:#Identisk utvärdering +assessment#:#identical_scoring_desc#:#Om den är markerad kommer luckor med identiska lösningar att poängsättas enligt specifikationerna, även om samma lösning har använts flera gånger. Om kryssrutan inte är markerad kommer endast den första identiska lösningen som används att poängsättas. +assessment#:#imagemap#:#Imagemap +assessment#:#import_question#:#Importfrågor +assessment#:#imported#:#importerad +assessment#:#info_answer_type_change#:#Frågan innehåller redan bilder. Frågetypen kunde därför inte ändras till flerradiga svar. +assessment#:#info_text_upload#:#Välj en textfil (UTF-8) med svar som ska laddas upp. +assessment#:#insert_after#:#Insätt bakom +assessment#:#insert_before#:#Infoga före +assessment#:#insert_gap#:#Insert gap +assessment#:#internal_links#:#Interna referenser +assessment#:#intprecision#:#Kan delas av +assessment#:#intprecision_info#:#Divisible by" påverkar endast skapandet av variabler om värdet för precision är 0. I detta fall bestämmer "Delbar med" med vilket heltal den skapade variabeln måste vara delbar. Ett värde på 10 genererar därför bara heltal som är delbara med 10, ett värd +assessment#:#javaapplet#:#Java-applet +assessment#:#kiosk#:#Examensvy +assessment#:#kiosk_description#:#Provvyn visar testet i kioskläge. Alla skärmelement som inte hör till testet är dolda. För att effektivt förhindra att deltagarna öppnar andra webbplatser under provet bör du dessutom använda en webbläsare som är specialiserad på e-prov (t.ex. "Safe Exam +assessment#:#kiosk_options#:#Information visas +assessment#:#kiosk_options_desc#:#Den valda informationen visas i sidhuvudet. +assessment#:#kiosk_show_participant#:#Namn på deltagaren +assessment#:#kiosk_show_title#:#Titel på testet +assessment#:#kprim_answers_info#:#Flervalsfrågan "Fyrfaldigt beslut rätt/fel" (typ K', kallad Kprim) kännetecknas av att en fråga eller ett ofullständigt påstående följs av fyra svar eller tillägg. För vart och ett av dessa fyra alternativ måste ett beslut fattas om huruvida det är korre +assessment#:#kprim_instruction_text#:#För varje uttalande måste beslut fattas +assessment#:#lacex_assClozeTest_NumberOfResultExpression_d#:#Det 4:e svarsalternativet är ett urvalsgap och det 2:a alternativet valdes där. +assessment#:#lacex_assClozeTest_NumberOfResultExpression_e#:#R[4] = +2+ +assessment#:#lacex_assClozeTest_NumericResultExpression_d#:#Det andra svarsalternativet är ett numeriskt gap och besvarades med det numeriska värdet 5. +assessment#:#lacex_assClozeTest_NumericResultExpression_e#:#R[2] = #5# +assessment#:#lacex_assClozeTest_StringResultExpression_1_d#:#Det 1:a svarsalternativet är ett textgap och besvarades med "Måndag". +assessment#:#lacex_assClozeTest_StringResultExpression_1_e#:#R[1] = ~Montag~ +assessment#:#lacex_assClozeTest_StringResultExpression_2_d#:#Det 4:e svarsalternativet är ett urvalsgap och det svarsalternativ vars etikett motsvarar "Grön" valdes. +assessment#:#lacex_assClozeTest_StringResultExpression_2_e#:#R[4] = ~Grün~ +assessment#:#lacex_assErrorText_ExclusiveResultExpression_d#:#Exakt de svarsalternativ 1, 3 och 4 som valdes för frågan +assessment#:#lacex_assErrorText_ExclusiveResultExpression_e#:#R = *1,3,4* +assessment#:#lacex_assErrorText_NumberOfResultExpression_d#:#När du besvarade frågan valdes det andra svarsalternativet. +assessment#:#lacex_assErrorText_NumberOfResultExpression_e#:#R = +2+ +assessment#:#lacex_assFormulaQuestion_NumericResultExpression_d#:#Det 1:a svarsalternativet besvarades med det numeriska värdet 3.14159 +assessment#:#lacex_assFormulaQuestion_NumericResultExpression_e#:#R[1] = #3.14159# +assessment#:#lacex_assImagemapQuestion_ExclusiveResultExpression_d#:#Exakt de svarsalternativ 1, 3 och 4 som valdes för frågan +assessment#:#lacex_assImagemapQuestion_ExclusiveResultExpression_e#:#R = *1,3,4* +assessment#:#lacex_assImagemapQuestion_NumberOfResultExpression_d#:#När du besvarade frågan valdes det andra svarsalternativet. +assessment#:#lacex_assImagemapQuestion_NumberOfResultExpression_e#:#R = +2+ +assessment#:#lacex_assMatchingQuestion_MatchingResultExpression_d#:#Elementen tilldelades enligt följande +assessment#:#lacex_assMatchingQuestion_MatchingResultExpression_e#:#R = ;1 +assessment#:#lacex_assMultipleChoice_ExclusiveResultExpression_d#:#Exakt de svarsalternativ 1, 3 och 4 som valdes för frågan +assessment#:#lacex_assMultipleChoice_ExclusiveResultExpression_e#:#R = *1,3,4* +assessment#:#lacex_assMultipleChoice_NumberOfResultExpression_d#:#När du besvarade frågan valdes det andra svarsalternativet. +assessment#:#lacex_assMultipleChoice_NumberOfResultExpression_e#:#R = +2+ +assessment#:#lacex_assNumeric_NumericResultExpression_d#:#Frågan besvarades med det numeriska värdet 4.7 +assessment#:#lacex_assNumeric_NumericResultExpression_e#:#R = #4.7# +assessment#:#lacex_assOrderingHorizontal_OrderingResultExpression_d#:#Elementen som skulle sorteras arrangerades i följande ordning +assessment#:#lacex_assOrderingHorizontal_OrderingResultExpression_e#:#R = $2,5,1,4,3$ +assessment#:#lacex_assOrderingQuestion_OrderingResultExpression_d#:#Elementen som skulle sorteras arrangerades i följande ordning +assessment#:#lacex_assOrderingQuestion_OrderingResultExpression_e#:#R = $2,5,1,4,3$ +assessment#:#lacex_assQuestion_EmptyAnswerExpression_d#:#Inget svar gavs på frågan +assessment#:#lacex_assQuestion_EmptyAnswerExpression_e#:#R = ? +assessment#:#lacex_assQuestion_PercentageResultExpression_d#:#Fick den aktuella frågan exakt eller mer än 75% av de möjliga poängen? +assessment#:#lacex_assQuestion_PercentageResultExpression_e#:#R >= %75% +assessment#:#lacex_assSingleChoice_NumberOfResultExpression_d#:#När du besvarade frågan valdes det andra svarsalternativet. +assessment#:#lacex_assSingleChoice_NumberOfResultExpression_e#:#R = +2+ +assessment#:#lacex_assTextSubset_StringResultExpression_d#:#För det andra svarsalternativet angavs texten "Natriumklorid". +assessment#:#lacex_assTextSubset_StringResultExpression_e#:#R[2] = ~natriumklorid~ +assessment#:#lacex_example_header#:#Exempel +assessment#:#last_update#:#Uppdaterad +assessment#:#legend#:#Legend +assessment#:#locked#:#låst +assessment#:#log_added_extratime#:#Ytterligare %d minuter av behandlingstid har lagts till för deltagar-ID %d +assessment#:#log_answer_changed_points#:#Manuellt ställa in punkterna för deltagaren %s från %d till %d punkter med %s +assessment#:#log_could_not_enter_test_due_to_simultaneous_users#:#Deltagaren kunde inte starta testet eftersom det maximala antalet samtidiga deltagare för denna kurs redan har uppnåtts. +assessment#:#log_create_new_test#:#Nytt test skapat +assessment#:#log_manual_feedback#:#%s har skapat en manuell bedömning för deltagaren %s och frågan %s +assessment#:#log_mark_added#:#Note tillagd +assessment#:#log_mark_changed#:#Note ändrad +assessment#:#log_mark_removed#:#Note borttagen +assessment#:#log_modified_test#:#Testet har ändrats +assessment#:#log_question_added#:#Fråga tillagd till position +assessment#:#log_question_position_changed#:#Fråga position ändrad +assessment#:#log_question_removed#:#Fråga borttagen +assessment#:#log_selected_user_data_removed#:#Ta bort användaren %s testdata +assessment#:#log_user_answered_question#:#En användare har svarat på en fråga och fått %s poäng +assessment#:#log_user_entered_values#:#Användaren har angett värden +assessment#:#log_user_not_entered_values#:#Användaren har inte angett några värden +assessment#:#log_user_solution_willingly_deleted#:#Användaren har tagit bort sitt svar. +assessment#:#log_wrong_test_password_entered#:#Deltagaren har angett fel testlösenord. +assessment#:#longmenu#:#Lång meny +assessment#:#longmenu_answeroptions_differ#:#Den här frågan fungerar inte korrekt eftersom den inte har samma antal luckor i texten som i svarsalternativen. +assessment#:#longmenu_text#:#"Lång meny" text +assessment#:#mailnottype#:#En sändning sker också när enskilda testkörningar avslutas +assessment#:#mailnottype_desc#:#Testets ägare meddelas även om antalet körningar inte är begränsat. +assessment#:#maintenance#:#Underhåll +assessment#:#manscoring#:#Manuell bedömning +assessment#:#manscoring_done#:#Redan betygsatta deltagare +assessment#:#manscoring_hint#:#Testet innehåller minst en fråga som kan poängsättas manuellt. Om du planerar att poängsätta testfrågor manuellt bör du ange ett lämpligt sent datum för deltagarna att komma åt sina testresultat så att du fortfarande kan poängsätta i förväg. +assessment#:#manscoring_none#:#Ej betygsatta deltagare +assessment#:#manscoring_not_allowed#:#Manuell poängsättning har inte aktiverats för någon frågetyp. Du kan därför inte använda denna funktion! +assessment#:#manscoring_questions_not_found#:#Den här testkörningen inkluderar inte frågetyper som kan poängsättas manuellt. +assessment#:#manscoring_results_pass#:#Manuellt poängsatta frågor för testkörning %s +assessment#:#manual_editing#:#Manuell redigering +assessment#:#mark_schema#:#Notschema +assessment#:#mark_schema_invalid#:#Bedömningsschemat kunde inte valideras framgångsrikt. Vänligen skapa ett giltigt schema. +assessment#:#mark_tst_ects#:#Ditt ECTS-betyg är "[markects]" (Europeiska systemet för överföring av studiemeriter) +assessment#:#matches#:#fits +assessment#:#matching_pairs#:#Associationspar +assessment#:#matching_shuffle_definitions#:#Endast definitioner +assessment#:#matching_shuffle_terms#:#Endast villkor +assessment#:#matching_shuffle_terms_definitions#:#Båda (termer och definitioner) +assessment#:#matching_type#:#Subtyp av uppdragsfrågan +assessment#:#material#:#Material +assessment#:#material_file#:#Material fil +assessment#:#maxchars#:#Maximalt antal tecken +assessment#:#maximum_nr_of_tries_reached#:#Du har förbrukat det maximala antalet testkörningar för detta test. Testet kan inte startas igen. +assessment#:#maximum_points#:#Maximalt uppnåelig poäng +assessment#:#maxsize#:#Maximal filstorlek +assessment#:#maxsize_info#:#Anger den maximala storleken i bytes som en uppladdad fil får ha. Om du lämnar fältet tomt används inställningen för det underliggande systemet. +assessment#:#min_auto_complete#:#Autokomplett +assessment#:#min_percentage_ne_0#:#Du måste ange en lägsta procentsats på 0 procent. Betygsschemat har inte sparats. +assessment#:#misc#:#Olika alternativ +assessment#:#msg_circle_added#:#Circle tillagd +assessment#:#msg_deleted_export_files#:#Exportfil(er) raderad(e) +assessment#:#msg_number_of_terms_too_low#:#Antalet termer måste vara större än eller lika med antalet definitioner. +assessment#:#msg_poly_added#:#Polygon tillagd +assessment#:#msg_questions_moved#:#Frågeställningar uppskjutna +assessment#:#msg_rect_added#:#Rektangel tillagd +assessment#:#msg_selected_for_move#:#Frågor om att flytta utvalda +assessment#:#new_category#:#Nya enheter Kategori +assessment#:#new_unit#:#Ny enhet +assessment#:#next_question#:#Fortsättning +assessment#:#next_question_rows#:#Frågor %d - %d från %d >> +assessment#:#no_manual_feedback_export_info#:#Manuell feedback exporteras inte. +assessment#:#no_passed_mark#:#Du måste markera minst ett notsteg som PASSED! Anteckningsschemat har inte sparats! +assessment#:#no_question_selected_for_move#:#Välj minst en fråga att flytta! +assessment#:#no_questions_available#:#Det finns inga frågor tillgängliga! +assessment#:#no_result_type#:#Ingen begränsning +assessment#:#no_selection#:#--- Inget urval --- +assessment#:#no_selection_for_move#:#Ingen fråga om att flytta markerad +assessment#:#no_target_selected_for_move#:#Du måste välja en målposition! +assessment#:#no_user_or_group_selected#:#Välj en målgrupp där sökningen ska utföras (användare och/eller grupper)! +assessment#:#not_all_obligations_answered#:#Du måste svara på alla obligatoriska frågor innan du kan slutföra testet. +assessment#:#not_evaluated_users#:#Not yet rated users +assessment#:#not_yet_accessed#:#Ingen åtkomst ännu +assessment#:#nr_of_correct_answers#:#Antal önskade svar +assessment#:#number_of_answers#:#Antal svar +assessment#:#numeric_gap#:#Numeriskt gap +assessment#:#obligations_summary#:#Översikt över obligatoriska frågor +assessment#:#obligatory#:#Åtagande +assessment#:#option_label#:#Namn på alternativ +assessment#:#option_label_adequate#:#adekvat +assessment#:#option_label_adequate_or_not#:#tillräcklig / inte tillräcklig +assessment#:#option_label_applicable#:#tillämplig +assessment#:#option_label_applicable_or_not#:#tillämplig / inte tillämplig +assessment#:#option_label_custom#:# Användardefinierade beteckningar +assessment#:#option_label_custom_false#:#Beteckning för "FALSE +assessment#:#option_label_custom_true#:#Beteckning för "TRUE +assessment#:#option_label_info#:#De etiketter som konfigureras här används som etiketter för beslutsalternativen. +assessment#:#option_label_minus#:#- +assessment#:#option_label_not_adequate#:#inte adekvat +assessment#:#option_label_not_applicable#:#inte tillämpligt +assessment#:#option_label_plus#:#+ +assessment#:#option_label_plus_minus#:#+ / - +assessment#:#option_label_right#:#right +assessment#:#option_label_right_wrong#:#sann / falsk +assessment#:#option_label_wrong#:#fel +assessment#:#oq_btn_define_pictures#:#Visa +assessment#:#oq_btn_define_terms#:#Visa +assessment#:#oq_btn_nest_pictures#:#Visa +assessment#:#oq_btn_nest_terms#:#Visa +assessment#:#oq_btn_use_order_pictures#:#Använd svar med bilder +assessment#:#oq_btn_use_order_terms#:#Använd svar med villkor +assessment#:#oq_header_ordering_elements#:#Arrangemangselement +assessment#:#or#:#eller +assessment#:#order#:#Sortering +assessment#:#ordering_answer_sequence_info#:#Den svarsordning som anges här används som korrekt lösningsordning. +assessment#:#ordertext#:#Texten ska ordnas +assessment#:#ordertext_info#:#Var vänlig ange texten i den ordning som den ska placeras horisontellt. De enskilda komponenterna separeras med mellanslag. Om du vill ha en annan avgränsning kan du använda avgränsaren %s istället för mellanslag. +assessment#:#out_of_range#:#Utanför intervall +assessment#:#output#:#Utmatning +assessment#:#output_mode#:#Utmatningsläge +assessment#:#parseQuestion#:#Analysera frågan +assessment#:#part_received_a_of_b_points#:#Deltagaren har uppnått %s av %s möjliga poäng. +assessment#:#participants#:#Deltagare +assessment#:#participants_invitation#:#Endast utvalda deltagare +assessment#:#participants_invitation_description#:#Testet kan endast utföras av de användare som har lagts till på fliken "Dashboard". +assessment#:#participants_results_subtab#:#Alla deltagare +assessment#:#pass#:#Passage +assessment#:#pass_finished#:#%s pass +assessment#:#passed_official#:#bekräftad +assessment#:#passed_only#:#Endast godkända tester +assessment#:#passed_short#:#bekräftad +assessment#:#passed_status#:#Bekräftad status +assessment#:#passes_finished#:#%s passerar +assessment#:#percentage#:#Procent +assessment#:#percentile#:#Percentil +assessment#:#picture#:#Image +assessment#:#please_select#:#---- Vänligen välj ---- +assessment#:#point#:#Punkt +assessment#:#points#:#Poäng +assessment#:#points_checked#:#Points (markerad) +assessment#:#points_short#:#Pt. +assessment#:#points_unchecked#:#Points (ej markerad) +assessment#:#points_wrong#:#Felaktiga urval +assessment#:#points_wrong_info#:#Ge poäng för att välja ord som inte finns med i listan över markerade fel. +assessment#:#polygon#:#Polygontåg +assessment#:#polygon_click_next_or_save#:#Klicka på nästa punkt i polygonbanan eller spara regionen. (Det är inte nödvändigt att klicka på startpunkten igen för att stänga polygonbanan!) +assessment#:#polygon_click_next_point#:#Klicka på nästa punkt i polygonbanan. +assessment#:#polygon_click_starting_point#:#Klicka på startpunkten för polygonbanan. +assessment#:#positive_numbers_required#:#Var vänlig ange endast positiva siffror här. +assessment#:#postpone_question#:#Flytta frågan till slutet +assessment#:#postponed#:#återställning +assessment#:#precision#:#Precision +assessment#:#preview#:#Förhandsgranskning +assessment#:#previous_question#:#Tillbaka +assessment#:#previous_question_rows#:#? Frågor %d - %d från %d +assessment#:#qpl_assessment_no_assessment_of_questions#:#Ingen statistisk utvärdering finns tillgänglig för den valda frågan. Frågan har aldrig använts i ett test hittills. +assessment#:#qpl_assessment_total_of_answers#:#Totalt antal svar +assessment#:#qpl_assessment_total_of_right_answers#:#Total procentandel korrekta svar +assessment#:#qpl_cancel_skill_assigns_update#:#Avbryt +assessment#:#qpl_confirm_delete_questions#:#Är du säker på att du vill ta bort följande frågor? +assessment#:#qpl_copy_insert_clipboard#:#De valda frågorna har kopierats till Urklipp +assessment#:#qpl_copy_select_none#:#Välj minst en fråga för att kopiera den till urklipp! +assessment#:#qpl_delete_rbac_error#:#Du har inte tillstånd att ta bort denna fråga! +assessment#:#qpl_delete_select_none#:#Välj minst en fråga för att utföra raderingsprocessen! +assessment#:#qpl_export_excel#:#Microsoft Excel-fil +assessment#:#qpl_export_select_none#:#Välj minst en fråga för exportfunktionen! +assessment#:#qpl_export_xml#:#QTI XML-fil +assessment#:#qpl_form_general_settings#:#Allmänna inställningar +assessment#:#qpl_imagemap_preview_missing#:#ILIAS kunde inte skapa en tillfällig förhandsgranskningsfil med imagemap-regionerna. Istället visas den ursprungliga bilden. Det betyder att verktyget ImageMagick på webbservern inte är korrekt konfigurerat eller att du inte har skrivrättigheter i den te +assessment#:#qpl_import_create_new_qpl#:#Import till en ny frågepool +assessment#:#qpl_import_no_items#:#Fel +assessment#:#qpl_import_non_ilias_files#:#Fel +assessment#:#qpl_import_verify_found_questions#:#ILIAS har hittat följande frågor i importfilen. Välj de frågor som du vill importera. +assessment#:#qpl_lac_desc_brackets#:#bracketing +assessment#:#qpl_lac_desc_compare_answer_exist#:#Jämför om inget svar gavs på en fråga/gap i en fråga +assessment#:#qpl_lac_desc_compare_with_answer_n#:#Jämför resultatet med det n:te svaret på frågan +assessment#:#qpl_lac_desc_compare_with_assignment#:#Jämför resultatet med uppgiften n +assessment#:#qpl_lac_desc_compare_with_exact_sequence#:#Jämför resultatet om endast den angivna sekvensen valdes +assessment#:#qpl_lac_desc_compare_with_number#:#Jämför resultatet med det numeriska värdet n +assessment#:#qpl_lac_desc_compare_with_quest_res#:#Jämför resultatet med det uppnådda resultatet i procent +assessment#:#qpl_lac_desc_compare_with_sequence#:#Jämför resultatet med svarssekvensen ($a,..,z$) +assessment#:#qpl_lac_desc_compare_with_text#:#Jämför resultatet med fritexten TEXT +assessment#:#qpl_lac_desc_logical_and#:#Logiskt och +assessment#:#qpl_lac_desc_logical_or#:#Logisk +assessment#:#qpl_lac_desc_negation#:#Negation +assessment#:#qpl_lac_desc_res_of_answ_m_of_cur_quest#:#Resultat av det m:e svaret på den aktuella frågan +assessment#:#qpl_lac_desc_res_of_cur_quest#:#Resultat av den aktuella frågan +assessment#:#qpl_lac_legend_header_common#:#Logik för uttalanden +assessment#:#qpl_lac_legend_header_quest_specific#:#Fråga specifika uttryck +assessment#:#qpl_lac_legend_label_operators#:#Operatörer +assessment#:#qpl_maxchars_info_numeric_question#:#Om du anger ett värde här skapas fältet för det numeriska svaret med angiven längd, så att det inte är möjligt att ange ett större antal tecken. Observera att decimalavgränsaren också räknas. +assessment#:#qpl_move_insert_clipboard#:#De utvalda frågorna har markerats för flyttning +assessment#:#qpl_move_select_none#:#Välj minst en fråga att flytta! +assessment#:#qpl_numeric_lower_needs_valid_lower_alert#:#Den nedre gränsen måste vara ett giltigt numeriskt värde som är lägre än den övre gränsen. +assessment#:#qpl_numeric_upper_needs_valid_upper_alert#:#Den övre gränsen måste vara ett giltigt numeriskt värde som är större än den nedre gränsen. +assessment#:#qpl_paste_error#:#Minst en fråga kunde inte läggas till i frågepoolen. Möjligt skäl +assessment#:#qpl_paste_no_objects#:#Det finns inga frågor i Urklipp. Vänligen kopiera eller flytta minst en fråga till Urklipp. +assessment#:#qpl_paste_success#:#Frågorna lades till i frågepoolen +assessment#:#qpl_qst_edit_form_taxonomy#:#Taxonomi "%s +assessment#:#qpl_qst_edit_form_taxonomy_section#:# Tilldelning till taxonominoder +assessment#:#qpl_qst_inp_matching_mode#:#Uppdragsläge +assessment#:#qpl_qst_inp_matching_mode_all_on_all#:#En eller flera termer kan tilldelas en eller flera definitioner (n +assessment#:#qpl_qst_inp_matching_mode_one_on_one#:#En term kan tilldelas en definition (1 +assessment#:#qpl_qst_skl_assign_properties_modified#:#Uppdragets egenskaper har sparats. +assessment#:#qpl_qst_skl_assign_synced_to_orig#:#Kompetensuppdragen överfördes till den ursprungliga frågan. +assessment#:#qpl_qst_skl_assigns_updated#:#Kompetensuppdragen har uppdaterats. +assessment#:#qpl_qst_skl_selection_for_question_header#:#Kompetensuppdrag för frågan +assessment#:#qpl_qst_skl_usg_numq_col#:#Antal frågor i hela poolen som behandlar kompetensen +assessment#:#qpl_qst_skl_usg_skill_col#:#Kompetens +assessment#:#qpl_qst_skl_usg_sklpnt_col#:#Summa av alla kompetenspoäng per kompetens +assessment#:#qpl_question_is_in_use#:#Frågan du vill redigera nu finns redan i %s test(s). Om du ändrar den här frågan nu kommer det INTE att påverka frågor som redan ingår i test, eftersom systemet automatiskt skapar en kopia av frågan när den ingår i ett test! +assessment#:#qpl_questions_deleted#:#Frågor borttagna +assessment#:#qpl_reset_preview#:#Återställ förhandsgranskning +assessment#:#qpl_save_skill_assigns_update#:#Spara kompetensuppdrag +assessment#:#qpl_settings_general_form_prop_show_tax_desc#:#Existerande taxonomier kan användas för att filtrera frågorna. +assessment#:#qpl_settings_general_form_property_nav_taxonomy#:#Taxonomi som navigationsträd +assessment#:#qpl_settings_general_form_property_nav_taxonomy_description#:#Om en taxonomi väljs visas den inte som ett filter utan som ett navigationsträd. +assessment#:#qpl_settings_general_form_property_online#:#Online +assessment#:#qpl_settings_general_form_property_online_description#:#En frågepool måste vara online för att kunna användas i tester. +assessment#:#qpl_settings_general_form_property_opt_notax_selected#:#Använd inte taxonomi som navigationsträd +assessment#:#qpl_settings_general_form_property_show_taxonomies#:#Taxonomier +assessment#:#qpl_settings_subtab_general#:#Allmänna inställningar +assessment#:#qpl_settings_subtab_taxonomies#:#Taxonomier +assessment#:#qpl_skill_point_eval_by_quest_result#:#Bestämning av kompetenspoäng via svarsresultat +assessment#:#qpl_skill_point_eval_by_solution_compare#:#Bestämma kompetenspunkter genom att jämföra lösningar +assessment#:#qpl_skill_point_eval_mode_quest_result#:#Respons resultat +assessment#:#qpl_skill_point_eval_mode_solution_compare#:#Jämförelse av lösningar +assessment#:#qpl_skl_sub_tab_quest_assign#:#Fråga Kompetens Uppdrag +assessment#:#qpl_skl_sub_tab_usages#:#Frekvens av användning +assessment#:#qpl_sync_quest_skl_assigns_confirmation#:#Frågan infogades från ett annat tidningsobjekt. Ska den aktuella konfigurationen av kompetensuppdrag överföras till frågans original? +assessment#:#qpl_tab_competences#:#Kompetens +assessment#:#qst_error_text_too_long#:#Ett eller flera av de textelement som markerats som felaktiga är för långa. Den maximala längden för ett textelement som markerats som felaktigt är 150 tecken. +assessment#:#qst_essay_allready_written_words#:#Ord som redan är skrivna +assessment#:#qst_essay_chars_remaining#:#Andra tecken +assessment#:#qst_essay_wordcounter_enabled#:#Räkna ord +assessment#:#qst_essay_wordcounter_enabled_info#:#De inmatade orden räknas. Antalet ord visas för deltagarna under textinmatningsfältet. +assessment#:#qst_essay_written_words#:#Antal inmatade ord +assessment#:#qst_lifecycle#:#Livscykel +assessment#:#qst_lifecycle_draft#:#Draft +assessment#:#qst_lifecycle_filter_all#:#Alla livscykler +assessment#:#qst_lifecycle_final#:#Final +assessment#:#qst_lifecycle_outdated#:#Veraltet +assessment#:#qst_lifecycle_rejected#:#Avvisad +assessment#:#qst_lifecycle_review#:#Revision nödvändig +assessment#:#qst_lifecycle_sharable#:#Distribuerbar +assessment#:#qst_nested_nested_answers_off#:# Utan indragning +assessment#:#qst_nested_nested_answers_on#:#Med indrag +assessment#:#qst_nr_of_tries#:#Antal försök +assessment#:#qst_preview_reset_msg#:#Förhandsgranskningen har återställts. +assessment#:#qst_use_nested_answers#:#Använd indrag i svar +assessment#:#que_contains_unused_var#:#Frågetexten innehåller variabler som inte används i någon formel. +assessment#:#question_browse_area_info#:#Välj ett objekt från vilket du vill importera frågor. +assessment#:#question_cumulated_statistics#:#Statistik över kumulativa frågor +assessment#:#question_id#:#Fråga ID +assessment#:#question_id_short#:#ID +assessment#:#question_instances_title#:#Den här frågan används i följande tester +assessment#:#question_is_part_of_running_test#:#Frågan är en del av ett pågående test och får inte ändras. +assessment#:#question_marking#:#Mark frågor +assessment#:#question_marking_description#:#Deltagarna ges möjlighet att markera frågor för sig själva. Markeringarna visas också i översikten "Bearbetningsstatus", om denna är aktiverad. +assessment#:#question_not_answered#:#Frågan besvarades inte +assessment#:#question_saved_for_upload#:#Frågan sparades automatiskt för att tillåta uppladdning av en fil. Om du avbryter redigeringen av denna fråga nu, observera att du måste ta bort frågan i frågepoolen om du inte vill behålla den. +assessment#:#question_summary#:#Status för bearbetning +assessment#:#question_summary_btn#:#Status för bearbetning +assessment#:#question_title#:#Frågans titel +assessment#:#question_type#:#Typ av fråga +assessment#:#questionpool_not_entered#:#Var vänlig ange ett namn för frågepoolen! +assessment#:#questionpool_not_selected#:#Välkomna att välja en frågepool! +assessment#:#questions_from#:#Frågor från +assessment#:#questions_per_page_view#:#Sidvisning +assessment#:#random_accept_sample#:#Acceptera sammanställning +assessment#:#random_another_sample#:#Ny sammanställning +assessment#:#random_selection#:#Slumpmässigt urval +assessment#:#range#:#Område +assessment#:#range_lower_limit#:#Lägre barriär +assessment#:#range_max#:#Range (maximalt) +assessment#:#range_min#:#Range (Minimum) +assessment#:#range_upper_limit#:#Övre barriär +assessment#:#rated_sign#:#Omens +assessment#:#rated_unit#:#Enhet +assessment#:#rated_value#:#Värde +assessment#:#rating#:#Rating +assessment#:#rating_sign#:#Värdering (tecken) +assessment#:#rating_simple#:#Enkel bedömning +assessment#:#rating_unit#:#Värdering (enhet) +assessment#:#rating_value#:#Värdering (värde) +assessment#:#rectangle#:#Rektangel +assessment#:#rectangle_click_br_corner#:#Klicka på det nedre högra hörnet av önskad region. +assessment#:#rectangle_click_tl_corner#:#Klicka på det övre vänstra hörnet av den önskade regionen. +assessment#:#redirectAfterSave#:#Den maximala tiden för detta test har uppnåtts. Din senaste fråga sparades automatiskt när tidsgränsen uppnåddes. Om några sekunder kommer du att omdirigeras... +assessment#:#redirect_after_finishing_rule#:#Forwarding +assessment#:#redirect_after_finishing_tst#:#Forwarding +assessment#:#redirect_after_finishing_tst_desc#:#Deltagarna omdirigeras automatiskt till en definierad webbplats efter att ha slutfört testet. Detta händer bara om testet har konfigurerats så att deltagarna inte kan se sina testresultat efter att testet har slutförts. Om du anger adressen till en exter +assessment#:#redirect_always#:# alltid till den definierade målsidan +assessment#:#redirect_in_kiosk_mode#:#Nur när granskningsvyn är aktiverad +assessment#:#redirection_url#:#URL målsida +assessment#:#region#:#Region +assessment#:#remove_as_participant#:#Avlägsna som fast deltagare +assessment#:#remove_gap#:#Ta bort gap +assessment#:#remove_question#:#Remove +assessment#:#remove_solution#:#Ta bort hänvisning till innehåll för upprepning +assessment#:#res_contains_undef_res#:#I formeln används resultat som inte finns med i frågetexten. +assessment#:#res_contains_undef_var#:#Formeln använder variabler som inte finns med i frågetexten. +assessment#:#reset_definitions#:#Återställ arrangemang +assessment#:#reset_filter#:#Återställ filter +assessment#:#reset_pictures#:#Återställ positionerna för bilderna +assessment#:#reset_terms#:#Återställ arrangemang +assessment#:#result#:#Resultat +assessment#:#result_co_frac#:#Partiell utländsk fraktur +assessment#:#result_co_frac_info#:#Endast ett helt förkortat bråk (t.ex. 1/3) är ett giltigt resultat +assessment#:#result_dec#:#Decimal +assessment#:#result_dec_info#:#Valida decimaltal är t.ex. 2.3 och 2.3 +assessment#:#result_frac#:#bryt +assessment#:#result_frac_info#:#Ingångarna 1/3 och 2/6 är båda giltiga resultat +assessment#:#result_type_selection#:#Resultat typval +assessment#:#result_unit_info#:#Observera att den enhet som anges här också måste väljas bland de "valbara enheterna". +assessment#:#result_units#:# Valbara enheter +assessment#:#result_units_info#:#För att besvara frågan erbjuds de aktiverade enheterna.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +assessment#:#result_x#:#Resultat %s +assessment#:#results#:#Resultat +assessment#:#results_tab#:#Resultat +assessment#:#review_view#:#Förhandsgranskning +assessment#:#saveOrder#:#Spara sortering +assessment#:#saveOrderAndObligations#:#Sortera och spara obligationer +assessment#:#save_and_next#:#Spara och gå vidare +assessment#:#save_on_navigation#:#Navigera med spara +assessment#:#save_on_navigation_confirmation#:#Dina ändrade svar sparas automatiskt när du navigerar. +assessment#:#save_on_navigation_forced_feedback_hint#:# Innan du får feedback på ditt svar. +assessment#:#save_on_navigation_locked_confirmation#:#Dina ändrade svar sparas automatiskt och registreras när du navigerar. +assessment#:#saved_adjustment#:#Ändring sparad. +assessment#:#score_partsol_enabled#:#Aktivera halvpunktsvärdering +assessment#:#score_partsol_enabled_info#:#Det har visat sig användbart att belöna tre korrekta svar med hälften av det högsta möjliga antalet poäng. För färre än tre korrekta svar ges inga poäng. +assessment#:#scored_pass#:#Värderad körning +assessment#:#scoring#:#Utvärdering +assessment#:#scoringadjust#:#postkorrigering +assessment#:#search_groups#:#efter grupper +assessment#:#search_results#:#Sökresultat +assessment#:#search_roles#:#Efter rullar +assessment#:#search_term#:#Sökord +assessment#:#search_users#:#av användare +assessment#:#select_gap#:#Selektionsgap +assessment#:#select_max_one_item#:#Välj endast ett objekt! +assessment#:#select_one_user#:#Välj minst en användare! +assessment#:#select_target_position_for_move_question#:#Välj en målposition för att flytta frågorna och klicka på en av insättningsknapparna! +assessment#:#select_unit#:#--- Välj enhet --- +assessment#:#selected_category#:#Vald kategori +assessment#:#selection#:#Urval +assessment#:#set_edit_mode#:#Ställa in redigeringsläge +assessment#:#set_filter#:#Ställ in filter +assessment#:#set_manscoring_done#:#Markera som betygsatt +assessment#:#set_manual_feedback#:#Manuell återkoppling +assessment#:#shape#:#form +assessment#:#showSuggestedSolution#:#Konst +assessment#:#show_answer_overview#:#Visa översikt över svar +assessment#:#show_detailed_results#:#Detaljerade testresultat (poängsatt testkörning) +assessment#:#show_examview_html#:#På skärmen +assessment#:#show_examview_pdf#:#PDF nedladdning +assessment#:#show_pass_overview#:#Resultatöversikt (poängsatt provkörning) +assessment#:#show_user_answers#:#Answers (poängsatt testkörning) +assessment#:#showinfo#:#Visa testets egenskaper +assessment#:#showinfo_desc#:#Användare visas alla testegenskaper på fliken "Info", t.ex. ordning, betyg eller resultatutmatning. +assessment#:#shuffle_answers#:#Svar från Shuffle +assessment#:#sign_submission#:#Digital signatur +assessment#:#sign_submission_info#:#Signaturpluginet måste vara installerat och aktiverat för att deltagarna ska uppmanas att signera sin testinlämning. +assessment#:#skip_question#:#Svara inte och fortsätt +assessment#:#solutionText#:#Text +assessment#:#solution_contain_keywords#:#Poäng tilldelas baserat på förekomsten av följande villkor +assessment#:#solution_hint#:#Tilldelat innehåll för repetition +assessment#:#start_tag#:#Starta varumärke +assessment#:#statistical_data#:#Statistiska uppgifter +assessment#:#statistics#:#Statistik +assessment#:#submit_and_check#:#Spara svar och begär feedback +assessment#:#submit_answer#:#Spara och gå vidare +assessment#:#suggest_range#:#Föreslå område +assessment#:#suggestedSolutionType#:#referera till +assessment#:#suggested_solution#:#Innehåll för repetition +assessment#:#suggested_solution_added_successfully#:#Hänvisningen till innehåll för repetition har lagts till med framgång! +assessment#:#tab_nest_answers#:#indentation +assessment#:#term#:#Term +assessment#:#term_image#:#Image +assessment#:#term_text#:#Text +assessment#:#terms#:#Termer +assessment#:#test_confirm_template_reset#:#Är du säker på att du inte vill använda mallen igen? +assessment#:#test_delete_page#:#Ta bort frågan +assessment#:#test_edit_settings#:#Redigera inställningar +assessment#:#test_enable_archiving#:#Aktivera arkivering +assessment#:#test_has_datasets_warning_page_view#:#Testet innehåller redan deltagaruppgifter. Du kan inte redigera frågorna igen förrän du har tagit bort alla deltagarregister. +assessment#:#test_has_datasets_warning_page_view_link#:#Deltagarnas resultat +assessment#:#test_is_offline#:#Du kan inte starta testet! Testet är offline. +assessment#:#test_jump_to#:#Hoppa till frågan +assessment#:#test_move_page#:#Flytta fråga +assessment#:#test_next_question#:#Nästa fråga +assessment#:#test_prev_question#:#Förra frågan +assessment#:#test_question_set_type#:#Val av testfrågor +assessment#:#test_question_set_type_fixed#:#Fixat urval av frågor +assessment#:#test_question_set_type_fixed_info#:#Alla deltagare får samma frågor.
Du kan återanvända befintliga frågor från frågepooler samt skapa nya frågor direkt i testet. Du kan också spara nyskapade frågor för återanvändning i en frågepool. +assessment#:#test_question_set_type_random#:#Slumpmässigt urval av frågor +assessment#:#test_question_set_type_random_info#:#Varje deltagare får svara på olika frågor. Frågorna väljs slumpmässigt från en eller flera frågepooler. +assessment#:#test_results#:#Meddelande av testresultatet +assessment#:#test_scoring#:#Utvärdering av testet +assessment#:#test_template_reset#:#Mallen har tagits bort. +assessment#:#test_using_template#:#Detta test använder mallen %s. Om du inte vill använda en mall och alla inställningar, klicka här +assessment#:#test_using_template_link#:#Använd inte mallen längre +assessment#:#text_correct#:#Korrigera text +assessment#:#text_gap#:#Textgap +assessment#:#text_maximum_chars_allowed#:#Var vänlig ange inte mer än maximalt %s tecken. Inlägg som överskrider gränsen kommer inte att klippas bort, men kan inkluderas i utvärderingen. +assessment#:#text_rating#:#Metod för textjämförelser +assessment#:#text_wrong#:# Felaktig text +assessment#:#textsize#:#Textens storlek +assessment#:#textsize_errortext_info#:#Ange textens storlek som en procentandel av normalstorleken. Om du inte anger något värde kommer normalstorleken (100 procent) att användas. +assessment#:#textsize_info#:#Ange textstorleken för den text som ska arrangeras som en procentandel av normalstorleken. Om du inte anger något värde kommer normalstorleken (100 procent) att användas. +assessment#:#thumb_size#:#Förhandsgranska storlek +assessment#:#thumb_size_info#:#Ange ett värde i pixlar för den maximala förhandsgranskningsstorleken för grafiken. Beroende på bildförhållandet konverteras förhandsgranskningen till den maximala förhandsgranskningsstorleken antingen i höjd eller i bredd. +assessment#:#thumb_size_unit_pixel#:#Pixel +assessment#:#time_format#:#HH MM SS +assessment#:#timing#:#Tidsförlängning +assessment#:#tolerance#:#Tolerans (%) +assessment#:#tolerance_info#:#Toleransen definierar en tillåten procentuell avvikelse från resultatvärdet. Med en tolerans på 0 utvärderas endast det exakta resultatvärdet som korrekt. +assessment#:#too_many_targets_selected_for_move#:#Du måste välja exakt en målposition! +assessment#:#toplist_by_score#:#Placering enligt poäng +assessment#:#toplist_by_time#:#Placering efter bearbetningstid +assessment#:#toplist_col_achieved#:#Datum +assessment#:#toplist_col_hints#:#Noter +assessment#:#toplist_col_participant#:#Deltagare +assessment#:#toplist_col_percentage#:#Procent +assessment#:#toplist_col_rank#:#Plats +assessment#:#toplist_col_score#:#Score +assessment#:#toplist_col_wtime#:#Bearbetningstid +assessment#:#true#:#Sant +assessment#:#tst_access_code_created#:#För att du ska ha permanent tillgång till dina testresultat och kunna återuppta ett avbrutet test har en personlig åtkomstnyckel genererats för dig. Vänligen notera koden nedan för att kunna fortsätta testet senare. +assessment#:#tst_activate_skill_service#:#Kompetens +assessment#:#tst_activate_skill_service_desc#:#Tillåter tilldelning av frågor till kompetenser samt definition av tröskelvärden för uppnåendet av vissa kompetensnivåer. +assessment#:#tst_activation_limited_visibility_info#:#Utanför den angivna tidsperioden visas testtiteln. Testet kan dock inte startas. Ytterligare åtkomst, även till tester som redan pågår, förhindras i slutet av perioden. +assessment#:#tst_activation_online_info#:#Endast när testet är online kan användare delta i testet. +assessment#:#tst_add_quest_cont_edit_mode#:#Redaktör +assessment#:#tst_add_quest_cont_edit_mode_IPE#:#Oformaterad text för frågor och svar och ILIAS sidredigerare för feedback och lösningsanteckningar +assessment#:#tst_add_quest_cont_edit_mode_IPE_info#:#Tillhandahåller inte formatering av text i frågor och svar, men tillåter utformning av feedback och lösningsanteckningar med ILIAS sidredigerare och återanvändning i frågor i ILIAS inlärningsmoduler. +assessment#:#tst_add_quest_cont_edit_mode_RTE#:#Riktig textredigerare (TinyMCE) för redigering av frågor, svar, feedback och lösningsanteckningar. +assessment#:#tst_add_quest_cont_edit_mode_RTE_info#:#Tillåter formaterad text för frågor, svar, feedback och lösningsanteckningar. Feedback och lösningsanteckningar antas dock inte när frågor integreras i ILIAS inlärningsmoduler. +assessment#:#tst_addit_passes_blocked_after_passed_msg#:#Du har klarat testet. Testet kan inte påbörjas igen. +assessment#:#tst_all_test_competences#:#Alla testfärdigheter +assessment#:#tst_all_user_data_deleted#:#Uppgifterna för alla testdeltagare har raderats! +assessment#:#tst_allowed_users#:#Begränsning av antalet samtidiga deltagare +assessment#:#tst_allowed_users_desc#:#ILIAS kontrollerar antalet samtidiga deltagare i testet. Om ytterligare användare försöker starta testet utöver det högsta tillåtna antalet förhindras de från att komma åt det. +assessment#:#tst_allowed_users_max#:#Maximalt antal +assessment#:#tst_allowed_users_time_gap#:#Inaktivitet deltagarnas tid +assessment#:#tst_allowed_users_time_gap_desc#:#Deltagare som inte klickar i testet inom de angivna sekunderna klassificeras som "inaktiva" och tas bort från testet. +assessment#:#tst_already_submitted#:#Testet har redan genomförts och svaren har skickats iväg. +assessment#:#tst_analysis#:#Analys +assessment#:#tst_anonymity#:#Skydd av personuppgifter +assessment#:#tst_anonymity_anonymous_test#:#Testresultat utan namn / Anonymt test +assessment#:#tst_anonymity_no_anonymization#:#Testresultat med namn +assessment#:#tst_answer_aggr_answer_header#:#Svar +assessment#:#tst_answer_aggr_frequency_header#:#Frekvens +assessment#:#tst_answer_details#:#Svar detaljer +assessment#:#tst_answer_fixation_handling#:#Deltagarnas svar +assessment#:#tst_answer_fixation_none#:#Fixa inte svar under testkörningen +assessment#:#tst_answer_fixation_none_desc#:#Så länge en testkörning inte är avslutad kan deltagarna ändra sina svar som de vill. +assessment#:#tst_answer_fixation_on_followup_question#:#Fixa svar när uppföljningsfrågan visas +assessment#:#tst_answer_fixation_on_followup_question_desc#:#Efter att uppföljningsfrågan har visats kan deltagarna inte längre ändra svaret på den föregående frågan. +assessment#:#tst_answer_fixation_on_instant_feedback#:#Ange svar när feedback visas +assessment#:#tst_answer_fixation_on_instant_feedback_desc#:#När återkopplingen till en fråga visas kan deltagarna inte längre ändra sina svar. +assessment#:#tst_answer_fixation_on_instantfb_or_followupqst#:#Befästa svar med visning av feedback eller uppföljningsfrågan +assessment#:#tst_answer_fixation_on_instantfb_or_followupqst_desc#:#Deltagare kan inte ändra svar efter att återkopplingen till frågan eller följdfrågan har visats. +assessment#:#tst_answer_status_answered#:#Besvarad +assessment#:#tst_answer_status_editing#:#(pågående) +assessment#:#tst_answer_status_not_answered#:#Ej besvarad +assessment#:#tst_answered_questions#:#Frågor besvarade +assessment#:#tst_answered_questions_of_total#:#%s från %s +assessment#:#tst_answered_questions_test#:#Frågor som besvaras i detta test +assessment#:#tst_attached_xls_file#:#Testresultaten för denna deltagare finns i den bifogade Excel-filen. +assessment#:#tst_attempt#:#Försök +assessment#:#tst_back_to_pass_details#:#Tillbaka till översikten av körningen +assessment#:#tst_back_to_question_list#:#Tillbaka till frågelistan +assessment#:#tst_back_to_top#:#Tillbaka till toppen +assessment#:#tst_back_to_virtual_pass#:#Tillbaka till frågeöversikten +assessment#:#tst_best_solution_is#:#Den bästa möjliga lösningen är +assessment#:#tst_block_passes_after_passed#:#Förhindra ytterligare testkörningar efter godkänt test +assessment#:#tst_block_passes_after_passed_info#:#När en deltagare har klarat testet kommer deltagaren med detta alternativ inte att tillåtas några ytterligare testkörningar. +assessment#:#tst_browse_for_qpl_questions#:#Lägg till från pool +assessment#:#tst_browse_for_tst_questions#:#Add från annat test +assessment#:#tst_btn_hide_best_solutions#:#Dölja bästa möjliga lösningar +assessment#:#tst_btn_rebuild_random_question_stage#:#Synkronisera frågor från poolerna +assessment#:#tst_btn_reset_pool_sync#:#Redigera/Avbryta synkronisering +assessment#:#tst_btn_show_best_solutions#:#Visa bästa möjliga lösningar +assessment#:#tst_cannot_online_due_to_switched_quest_set_type_setting#:#Testet kunde inte ställas in till online eftersom testläget ändrades. Du måste skapa en ny testlägesrelaterad frågekonfiguration innan du kan ställa in testet online igen. +assessment#:#tst_change_dyn_test_question_selection#:#Ändra urval av frågor +assessment#:#tst_change_points_for_question#:#Poäng för svaret +assessment#:#tst_change_quest_set_type_from_old_to_new_with_conflict#:#Om du ändrar urvalet av testfrågor från %s till %s förloras den aktuella frågetilldelningen. Du måste då tilldela frågor på nytt för den nya konfigurationen eller konfigurera frågepoolen på motsvarande sätt.
Klicka på Bekräfta o +assessment#:#tst_change_workingtime#:#Skapa en tidsförlängning för en deltagare +assessment#:#tst_comp_eval_mode#:#Utvärdering via +assessment#:#tst_comp_points#:#Kompetenspunkter +assessment#:#tst_competence#:#Kompetens +assessment#:#tst_confirm_submit_answers#:#Vänligen bekräfta att du vill slutföra testet och skicka in de angivna svaren. Efter inlämningen finns det inte längre någon möjlighet att ange eller korrigera svar. +assessment#:#tst_conflicting_setting#:#Denna inställning står i konflikt med en annan inställning. +assessment#:#tst_copy#:#Kopiera test +assessment#:#tst_corr_add_as_answer_btn#:#Lägg till som korrekt svar +assessment#:#tst_corr_answ_stat_tbl_header_answer#:#Svar +assessment#:#tst_corr_answ_stat_tbl_header_frequency#:#Frekvens +assessment#:#tst_corrections_answers_tbl#:#Statistik över svar +assessment#:#tst_corrections_answers_tbl_subindex#:#Svarsstatistik för %s +assessment#:#tst_corrections_incompatible_question_set_type#:#En efterkorrigering är endast möjlig om testet använder ett fast frågeurval. +assessment#:#tst_corrections_manscore_reset_warning#:#Det finns %s manuella poäng för frågan "%s (ID +assessment#:#tst_corrections_qst_form#:#Korrigering av punkterna +assessment#:#tst_corrections_qst_remove_confirmation#:#Vill du svara på frågan "%s (ID +assessment#:#tst_corrections_tab_question#:#Fråga +assessment#:#tst_corrections_tab_solution#:#Lösning +assessment#:#tst_corrections_tab_statistics#:#Statistik över svar +assessment#:#tst_count_correct_solutions#:#Endast helt korrekt besvarade frågor ger poäng +assessment#:#tst_count_correct_solutions_desc#:#Fullständiga och korrekta svar ger maximalt antal poäng. I alla andra fall ges 0 poäng. Detta gäller även frågor som ger poäng för partiella svar. +assessment#:#tst_count_partial_solutions#:#Även delvis felaktigt besvarade frågor ger poäng +assessment#:#tst_count_partial_solutions_desc#:#För vissa frågetyper kan du få poäng för korrekta delsvar. Dessa läggs ihop. Detta gäller för frågetyperna Flervalsfrågor, KPrim, Flervalsfrågor i Imagemaps, Markera fel/ord och Uppgiftsfråga. +assessment#:#tst_current_run_no_longer_valid#:#Din nuvarande testsession är inte längre giltig.
Den har förmodligen redan avslutats eller avslutats av en handledare. +assessment#:#tst_default_settings#:#Personliga standardinställningar +assessment#:#tst_defaults_applied#:#De valda standardinställningarna har tillämpats. +assessment#:#tst_defaults_apply_not_possible#:#ILIAS kunde inte tillämpa de valda standardinställningarna på detta test! Detta test kan redan innehålla deltagaruppgifter som hindrar vissa standardinställningar från att tillämpas. +assessment#:#tst_defaults_apply_select_one#:#Välj exakt en standardinställning som ska gälla för detta test! +assessment#:#tst_defaults_available#:#Tillgängliga standardinställningar +assessment#:#tst_defaults_defaults_of_test#:#av inställningarna för detta test som en ny standardinställning med namnet +assessment#:#tst_defaults_enter_name#:#Var god ange ett namn för de nya standardinställningarna! +assessment#:#tst_defaults_not_defined#:#Du har ännu inte definierat några standardinställningar. +assessment#:#tst_delete_dyn_test_results_btn#:#Ta bort testresultat +assessment#:#tst_delete_missing_mark#:#Välj minst en årskurs för att ta bort! +assessment#:#tst_derive_new_pool#:#Skapa ny frågepool +assessment#:#tst_derive_new_pools#:#Skapa nya frågepooler +assessment#:#tst_dont_show_msg_again_in_current_session#:#Visa inte detta meddelande igen i min nuvarande session. +assessment#:#tst_dont_use_previous_answers#:#Dina tidigare svar kommer inte att användas som standardvärden i framtida testkörningar +assessment#:#tst_dyn_keep_answ_freeze#:#Lämna fasta svar +assessment#:#tst_dyn_quest_set_pool_deleted#:#Den för närvarande konfigurerade frågepoolen "%s" har tagits bort. +assessment#:#tst_dyn_quest_set_src_qpl_summary_string_deleted#:#%s (permanent raderad) +assessment#:#tst_dyn_quest_set_src_qpl_summary_string_trashed#:#%s (För närvarande i papperskorgen) [%s frågor]. +assessment#:#tst_dyn_test_msg_currently_finished_completely#:#För närvarande har du framgångsrikt besvarat alla frågor i källfrågepoolen. Så snart nya eller ändrade frågor finns tillgängliga i källfrågepoolen kan du fortsätta testet. +assessment#:#tst_dyn_test_msg_currently_finished_selection#:#I det aktuella frågevalet har du svarat på alla frågor. Ändra frågeval för att fortsätta testet. +assessment#:#tst_dyn_test_msg_pass_deletion_link#:#Ta bort tidigare svar +assessment#:#tst_dyn_test_pass_deletion_button#:#Återställ alla testsvar +assessment#:#tst_dyn_unfreeze_answers#:#Reply svar +assessment#:#tst_dyn_unfreeze_answers_confirmation#:#Det finns frågor som har sina ursprungliga svar nedskrivna, så du kan inte göra några ändringar i svaren. Vill du svara på frågorna igen nu och lösa de fasta svaren? +assessment#:#tst_dynamic_question_set_complete#:#Status för alla tillgängliga frågor +assessment#:#tst_dynamic_question_set_selection#:#Val av testfrågor och urvalsstatistik +assessment#:#tst_dynamic_question_set_source_questionpool_summary_string#:#%s (sökväg +assessment#:#tst_edit_competence_assign#:#Redigera egenskaper för tilldelning +assessment#:#tst_edit_scoring#:#Ändra betyg +assessment#:#tst_ending_time#:#Slut +assessment#:#tst_ending_time_before_starting_time#:#Ange ett datum för slutet av testet som ligger efter startdatumet. +assessment#:#tst_ending_time_desc#:#Tid från vilken deltagare inte längre kan skicka in svar. Viktigt +assessment#:#tst_enter_questionpool#:#Ange namnet på en frågepool där den nya frågan ska lämnas in +assessment#:#tst_eval_question_points#:#Frågeresultat för testkörning %s +assessment#:#tst_eval_results_by_pass#:#Detaljerade testresultat för testkörning %s +assessment#:#tst_eval_results_by_pass_lo#:#Detaljerade testresultat för %s. Test +assessment#:#tst_eval_results_lo#:# Avvikande testresultat +assessment#:#tst_eval_show_answer#:#Visa svar +assessment#:#tst_eval_total_finished#:#Totalt antal genomförda tester (användare som har genomfört det maximala antalet testkörningar). +assessment#:#tst_eval_total_finished_average_time#:#Genomsnittlig behandlingstid för alla tester +assessment#:#tst_eval_total_passed#:#Totalt antal godkända tester +assessment#:#tst_eval_total_passed_average_points#:#Genomsnittlig poäng för de godkända testerna +assessment#:#tst_eval_total_passed_average_time#:#Genomsnittlig behandlingstid för alla godkända tester +assessment#:#tst_eval_total_persons#:#Totalt antal personer som startade testet +assessment#:#tst_exp_sc_short#:#Itemstatistikexport för rena enkelvalstest +assessment#:#tst_exp_sc_short_desc#:#På fliken "Statistik" kan ett exportalternativ "MS Excel" väljas. Det genererade databladet kan utvärderas utanför ILIAS för objektstatistik. Detta alternativ fungerar endast för rena envalstester. +assessment#:#tst_extratime_added#:#Deltagarens behandlingstid har förlängts med %s minuter. +assessment#:#tst_extratime_info#:#Om en testtagares behandlingstid förlängs flera gånger, ange summan av alla hans/hennes förlängningar här. +assessment#:#tst_extratime_notavailable#:#Tidsförlängningar kan endast göras för tester med en körning och en angiven bearbetningstid. +assessment#:#tst_failed#:#Misslyckad +assessment#:#tst_failed_imp_qst_skl_assign#:#Frågornas tilldelning till följande kompetenser kunde inte produceras av importen. De motsvarande kompetenserna kunde inte identifieras i systemet här. +assessment#:#tst_failed_imp_skl_thresholds#:#Importen av tröskelvärden för följande kompetenser hoppades över eftersom den associerade kompetensen i det lokala systemet har en annan lista över färdigheter. +assessment#:#tst_feedback#:#Återgång +assessment#:#tst_feedback_is_given_inline#:#Återkopplingen visas direkt under ditt svar. +assessment#:#tst_feedback_not_available_for_answer#:#Det finns ingen feedback tillgänglig för ditt svar. +assessment#:#tst_filter_lifecycle_enabled#:#Använd filtret "Livscykel" +assessment#:#tst_filter_question_type#:#Typ av fråga +assessment#:#tst_filter_question_type_enabled#:#Frågetyp Använd filter +assessment#:#tst_filter_tax_node#:#Taxonomi nod +assessment#:#tst_filter_taxonomy#:#Taxonomi +assessment#:#tst_final_information#:#Fullständigt test +assessment#:#tst_finish_confirm_button#:#Ja, jag vill avsluta testet +assessment#:#tst_finish_confirm_cancel_button#:#Nej, jag vill gå tillbaka till det senaste svaret +assessment#:#tst_finish_confirmation_question#:#Du är på väg att avsluta testet och nå det maximala antalet tillåtna testkörningar. Efter det kommer du inte längre att kunna komma åt testet igen för att ändra dina svar. Vill du verkligen avsluta testet? +assessment#:#tst_finish_notification#:#Notifiering +assessment#:#tst_finish_notification_advanced#:#Fullständigt testresultat per användare +assessment#:#tst_finish_notification_content#:#Innehåll i meddelandet +assessment#:#tst_finish_notification_desc#:#Ett mail skickas för varje person som genomför ett test. Mailet skickas till den användare som är angiven på fliken "Rättigheter" under "Ägs av". Mailet innehåller följande information +assessment#:#tst_finish_notification_no#:#Ingen anmälan +assessment#:#tst_finish_notification_simple#:#Endast inloggningsnamn och datum för uppsägning +assessment#:#tst_finished#:#Färdig +assessment#:#tst_form_dynamic_question_set_config#:#Kontinuerligt urval av frågor +assessment#:#tst_gap_analysis#:#Analys av luckor +assessment#:#tst_general_properties#:#Inställningar för testet +assessment#:#tst_header_participant#:#Ditt svar +assessment#:#tst_header_solution#:#Bästa möjliga lösning +assessment#:#tst_heading_scoring#:#Rating +assessment#:#tst_hide_pagecontents#:# Dölj sidans innehåll +assessment#:#tst_hide_pagecontents_desc#:#ILIAS-innehåll som placeras före och efter den faktiska frågetexten via knappen "Redigera sida" visas inte i resultatvyerna och utskriften. +assessment#:#tst_hide_side_list#:#Frågelista från +assessment#:#tst_highscore_achieved_ts#:#Datum +assessment#:#tst_highscore_achieved_ts_description#:#En extra kolumn med tiden för testet visas. +assessment#:#tst_highscore_all_tables#:#Egen rankning och leaderboard +assessment#:#tst_highscore_all_tables_description#:#Visar både en tabell med din egen ranking och en tabell med de bästa rankingarna. +assessment#:#tst_highscore_anon#:#Visa inga namn +assessment#:#tst_highscore_anon_description#:#Rankingen för andra deltagare visas utan att deras namn anges. Detta görs automatiskt för anonymiserade tester. +assessment#:#tst_highscore_description#:#På fliken 'Resultat' visas ytterligare en underflik 'Placering'. En tabell som visar de olika personernas resultat i testet visas. Du måste aktivera alternativet "Visa eget testresultat" för att kunna använda denna funktion. +assessment#:#tst_highscore_enabled#:#Placeringar +assessment#:#tst_highscore_hints#:#Tips på lösningar +assessment#:#tst_highscore_hints_description#:#En extra kolumn visas som visar hur många lösningstips som har begärts. +assessment#:#tst_highscore_mode#:#Mode +assessment#:#tst_highscore_own_table#:#Visa egen rankning +assessment#:#tst_highscore_own_table_description#:#Deltagarna kommer att få se en tabell med sin rangordning inom alla placeringar. +assessment#:#tst_highscore_percentage#:#Procent +assessment#:#tst_highscore_percentage_description#:#Ytterligare en kolumn visas med det uppnådda procentuella värdet. +assessment#:#tst_highscore_score#:#Poäng +assessment#:#tst_highscore_score_description#:#Ytterligare en kolumn visas med antalet uppnådda poäng. +assessment#:#tst_highscore_top_num#:#Bästa listlängd +assessment#:#tst_highscore_top_num_description#:#Bestämmer hur många poster som visas i topplistan. +assessment#:#tst_highscore_top_num_unit#:#Placeringar +assessment#:#tst_highscore_top_table#:#Bästalista +assessment#:#tst_highscore_top_table_description#:#Deltagarna kommer att få se en tabell med de bästa placeringarna. +assessment#:#tst_highscore_wtime#:#Bearbetningstid +assessment#:#tst_highscore_wtime_description#:#Ytterligare en kolumn med behandlingstiden visas. +assessment#:#tst_imap_qst_mode#:#Svarsläge +assessment#:#tst_imap_qst_mode_mc#:#Multipla valmöjligheter +assessment#:#tst_imap_qst_mode_sc#:#Enskilt val +assessment#:#tst_import_non_ilias_zip#:#Fel +assessment#:#tst_import_verify_found_questions#:#ILIAS har hittat följande frågor i importfilen. Välj de frågor som du vill importera med detta test. +assessment#:#tst_inp_all_quest_points_equal_per_pool#:#Endast frågepooler med frågor med samma poäng +assessment#:#tst_inp_all_quest_points_equal_per_pool_desc#:#Om aktiverat kommer endast frågepooler vars frågor har samma poäng att erbjudas för urval. Detta test kommer då att ha samma maxpoäng för alla deltagare, vilket gör testresultaten mer jämförbara. Detta förfarande rekommenderas. +assessment#:#tst_inp_dyn_quest_set_quest_ordering_by_date_desc#:#Frågornas ordningsföljd baseras på datumet för den senaste ändringen. +assessment#:#tst_inp_dyn_quest_set_quest_ordering_by_tax_desc#:#Frågornas ordningsföljd baseras på frågornas tilldelning i en taxonomi. +assessment#:#tst_inp_no_available_tax_hint#:#Taxonomier är inte tillgängliga för den valda frågepoolen +assessment#:#tst_inp_quest_amount_cfg_mode#:#Antal frågor +assessment#:#tst_inp_quest_amount_cfg_mode_pool#:#Ställ in antalet frågor per vald frågepool eller taxonominod. +assessment#:#tst_inp_quest_amount_cfg_mode_test#:#Bestäm antalet frågor för hela testet +assessment#:#tst_inp_quest_amount_per_source_pool#:#Antal frågor +assessment#:#tst_inp_quest_amount_per_test#:#Totalt antal frågor i testet +assessment#:#tst_inp_source_pool_filter_tax#:#Taxonomifilter +assessment#:#tst_inp_source_pool_filter_tax_x#:#Använd taxonomi "%s" som filter +assessment#:#tst_inp_source_pool_label#:#Frågepool +assessment#:#tst_inp_source_pool_no_tax_filter#:#Använd inte taxonomi som filter +assessment#:#tst_input_dyn_quest_set_answer_status_filter_enabled#:#Visa filter för svarsstatus +assessment#:#tst_input_dynamic_question_set_ordering_tax#:#Taxonomi för order +assessment#:#tst_input_dynamic_question_set_ordering_tax_description#:#Testfrågorna presenteras enligt deras uppgifter i den valda taxonomin. +assessment#:#tst_input_dynamic_question_set_question_ordering#:#Fråga order +assessment#:#tst_input_dynamic_question_set_question_ordering_by_date#:#Ordna frågor efter datum +assessment#:#tst_input_dynamic_question_set_question_ordering_by_tax#:#Ordne-frågor efter taxonomiska noder +assessment#:#tst_input_dynamic_question_set_source_questionpool#:#Frågepool +assessment#:#tst_input_dynamic_question_set_taxonomie_filter_enabled#:#Visa taxonomifilter +assessment#:#tst_insert_missing_question#:#Välj minst en fråga att lägga till i testet! +assessment#:#tst_insert_questions#:#Är du säker på att du vill lägga till följande frågor i testet? +assessment#:#tst_insert_questions_and_results#:#Detta test har redan gjorts av %s användare. Om du lägger till frågor kommer alla befintliga testresultat för detta test att raderas! Är du säker på att du vill lägga till följande frågor? +assessment#:#tst_instant_feedback#:#Direkt feedback +assessment#:#tst_instant_feedback_answer_generic#:#Feedback på den korrekta lösningen +assessment#:#tst_instant_feedback_answer_generic_desc#:#Om hela svaret är korrekt kommer ILIAS att visa en typ av feedback när knappen "Begär feedback" klickas. Om hela svaret inte är helt korrekt visas en annan återkoppling. Båda versionerna måste lagras på fliken "Feedback" i frågan. +assessment#:#tst_instant_feedback_answer_specific#:#Olika feedback per givet svar +assessment#:#tst_instant_feedback_answer_specific_desc#:#När du klickar på knappen "Begär feedback" visar ILIAS respektive feedback för varje inlämnat svar. Inte alla frågetyper stöder denna typ av feedback. Återkopplingen måste lagras i frågan på fliken "Återkoppling". +assessment#:#tst_instant_feedback_contents#:#Innehållet i återkopplingen +assessment#:#tst_instant_feedback_desc#:#Om frågorna är försedda med feedback är dessa tillgängliga för deltagarna under testet. +assessment#:#tst_instant_feedback_forced#:#Visa alltid feedback när du skickar ett svar +assessment#:#tst_instant_feedback_results#:#Antal uppnådda poäng +assessment#:#tst_instant_feedback_results_desc#:#När deltagarna svarar på en fråga klickar de på knappen "Begär feedback" och ILIAS visar hur många poäng som uppnåddes för det givna svaret. +assessment#:#tst_instant_feedback_solution#:#Visa bästa möjliga lösning +assessment#:#tst_instant_feedback_solution_desc#:#När du klickar på knappen "Begär feedback" kommer ILIAS att visa den bästa möjliga lösningen på frågan. +assessment#:#tst_instant_feedback_trigger#:#Utlösande faktor för återkoppling +assessment#:#tst_instant_feedback_trigger_forced#:#Återkopplingen visas när frågorna besvaras +assessment#:#tst_instant_feedback_trigger_forced_desc#:#Genom att svara på en fråga aktiveras återkopplingen automatiskt. +assessment#:#tst_instant_feedback_trigger_manual#:#Deltagarna kan själva aktivera återkopplingen +assessment#:#tst_instant_feedback_trigger_manual_desc#:#Feedback är tillgänglig för deltagarna, men visas endast när deltagaren aktiverar den. +assessment#:#tst_introduction#:#Inledning +assessment#:#tst_introduction_desc#:#Visar en introduktionstext på fliken "Info" i testet. Texten är tillgänglig redan innan testet startar. +assessment#:#tst_introduction_text#:#introducerande text +assessment#:#tst_invited_nobody#:#Inga användare, grupper eller roller lades till som fasta deltagare +assessment#:#tst_invited_selected_users#:#De utvalda användarna har lagts till som permanenta deltagare +assessment#:#tst_level#:#Kompetensnivå +assessment#:#tst_limit_nr_of_tries#:#Begränsning av antalet testkörningar +assessment#:#tst_link_only_unassigned#:#Du har valt minst en fråga som redan är tilldelad en frågepool. Endast frågor som inte har tilldelats en frågepool kan läggas till i en frågepool. Vänligen gör ett nytt val. +assessment#:#tst_list_answer_details#:#Visa i listan nedan +assessment#:#tst_list_of_answers#:#Lista över svar +assessment#:#tst_list_of_answers_show#:#Relaterade svar +assessment#:#tst_list_of_questions_end#:#Visas före slutet av testet +assessment#:#tst_list_of_questions_start#:#Visas före den första frågan +assessment#:#tst_list_of_questions_with_description#:#Visa beskrivningar av frågor +assessment#:#tst_man_scoring_by_part#:#Rating av deltagare +assessment#:#tst_man_scoring_by_qst#:#Rating efter fråga +assessment#:#tst_man_scoring_only_answered#:#Endast besvarad +assessment#:#tst_manage_competence_assigns#:#Hantera kompetensuppdrag +assessment#:#tst_manscoring_input_max_points_for_question#:#Maximalt antal poäng för frågan +assessment#:#tst_manscoring_input_question_and_user_solution#:#Fråga och deltagarens lösning +assessment#:#tst_manscoring_maxpoints_exceeded_input_alert#:#Det maximala antalet %s-punkter har överskridits! +assessment#:#tst_manscoring_question_section_header#:#Fråga +assessment#:#tst_manscoring_user_notification#:#Skicka meddelande +assessment#:#tst_mark#:#Note +assessment#:#tst_mark_create_new_mark_step#:#Skapa ny anteckningsnivå +assessment#:#tst_mark_mark_reset_to_simple_mark_schema#:#Återställ till enkelt notsystem +assessment#:#tst_mark_minimum_level#:#Minsta procentandel +assessment#:#tst_mark_official_form#:#Officiell beteckning +assessment#:#tst_mark_passed#:#Bekräftad +assessment#:#tst_mark_short_form#:#Kort namn +assessment#:#tst_max_allowed_users_heading#:#Det maximala antalet samtidiga deltagare för detta test har uppnåtts. +assessment#:#tst_max_allowed_users_message#:#Det maximala antalet samtidiga deltagare för detta test har uppnåtts. Försök att starta eller fortsätta testet igen lite senare. Om aktiva deltagare är inaktiva i mer än %s av en sekund kommer du inte att kunna delta i detta test. Tack för din förståelse +assessment#:#tst_max_comp_points#:#Max. Kompetenspoäng +assessment#:#tst_maximum_points#:#Maximal poäng +assessment#:#tst_mc_label_none_above#:#Inget av ovanstående svar +assessment#:#tst_median_mark_panel#:#Not för medianvärdet +assessment#:#tst_msg_cannot_modify_dynamic_question_set_conf_due_to_part#:#Konfiguration för kontinuerligt frågeval kan inte ändras eftersom deltagarnas resultat redan är tillgängliga. +assessment#:#tst_msg_cannot_modify_random_question_set_conf_due_to_part#:#Konfigurationen för slumpmässigt frågeval kan inte ändras eftersom deltagarnas resultat redan är tillgängliga. +assessment#:#tst_msg_dynamic_question_set_config_modified#:#Konfigurationen för kontinuerligt frågeval har ändrats. +assessment#:#tst_msg_rand_quest_set_change_quest_amount_here#:#Du kan ställa in antalet frågor här +assessment#:#tst_msg_rand_quest_set_incomplete_quest_amount_cfg#:#Om du inte anger ett antal frågor kan inte ett test med slumpmässigt frågeval genereras. +assessment#:#tst_msg_rand_quest_set_lost_pools#:#Testets konfiguration för frågelottning har frysts eftersom följande frågepooler som är involverade i konfigurationen inte längre är tillgängliga. De otillgängliga frågepoolerna kan återskapas.
%s +assessment#:#tst_msg_rand_quest_set_lost_pools_link#:#Öppet urval av frågepooler +assessment#:#tst_msg_rand_quest_set_no_pools_available#:#För närvarande kan du inte lägga till nya regler för frågeval eftersom det inte finns några frågepooler tillgängliga. +assessment#:#tst_msg_rand_quest_set_no_src_pool_defs#:#För att aktivera ett test med slumpmässigt frågeval måste minst en frågepool väljas från vilken frågor kan hämtas. +assessment#:#tst_msg_rand_quest_set_not_sync#:#Reglerna för slumpmässig dragning av frågor har återskapats eller ändrats. Frågorna måste kopieras igen från frågepoolerna till testet. Denna process inkluderar även en kontroll för att se om regeluppsättningen för slumpmässig dragning kan uppfyllas. +assessment#:#tst_msg_rand_quest_set_pass_buildable#:#Ett test med slumpmässigt val av frågor är möjligt med den aktuella konfigurationen. +assessment#:#tst_msg_rand_quest_set_pass_not_buildable#:#Meddet aktuella urvalet av frågebanker och antalet frågor kan ett test med slumpmässigt frågeurval inte skapas.
+assessment#:#tst_msg_rand_quest_set_rule_label#:#Regel %s +assessment#:#tst_msg_rand_quest_set_rule_not_satisfied_missing#:#Regel %s kräver %s frågor. Dock är endast %s frågor tillgängliga. +assessment#:#tst_msg_rand_quest_set_rule_not_satisfied_missing_shared#:#Av de angivna frågorna är %s frågor tillgängliga på även följande regler +assessment#:#tst_msg_rand_quest_set_rule_not_satisfied_reserved#:#För regel %s behövs %s frågor och %s frågor tillhandahålls. +assessment#:#tst_msg_rand_quest_set_rule_not_satisfied_reserved_shared#:#Men på grund av överlappningar med följande regler är endast %s frågor garanterat tillgängliga +assessment#:#tst_msg_rand_quest_set_stage_pool_last_sync#:#Tidpunkt för den senaste synkroniseringen av frågorna från de valda frågepoolerna +assessment#:#tst_msg_random_qsc_modified_add_new_rule#:#Konfigurationen för testet med slumpmässigt frågeval har ändrats framgångsrikt. Du kan nu lägga till en ny regel. +assessment#:#tst_msg_random_question_set_config_modified#:#Konfigurationen för testet med slumpmässigt val av frågor ändrades framgångsrikt. +assessment#:#tst_msg_random_question_set_synced#:#Frågorna för den aktuella konfigurationen av testet med slumpmässigt frågeval synkroniserades framgångsrikt. +assessment#:#tst_msg_skl_lvl_thresholds_saved#:#Tröskelvärdena för kompetens har sparats. +assessment#:#tst_msg_skl_qst_assign_points_not_saved#:#Kompetenspoängen har inte sparats. Vänligen kontrollera din post. +assessment#:#tst_msg_skl_qst_assign_points_saved#:#Kompetenspunkterna har sparats. +assessment#:#tst_msg_source_pool_definitions_deleted#:#Frågevalsregeln har tagits bort framgångsrikt. +assessment#:#tst_nav_next_locks_current_answer_confirm#:#När du navigerar till nästa fråga är svaret på den aktuella frågan fast och kan inte ändras igen. +assessment#:#tst_nav_next_locks_current_answer_header#:#Navigera till nästa fråga +assessment#:#tst_nav_next_locks_empty_answer_confirm#:#Du har inte angett något svar. En tom lösning sparas och fixeras som svaret på den aktuella frågan. Svaret kan inte längre ändras. +assessment#:#tst_nav_next_locks_empty_answer_header#:#Navigera utan svar +assessment#:#tst_nav_while_edit_modal_cancel_btn#:#Avbryt +assessment#:#tst_nav_while_edit_modal_header#:#Beslut om svar +assessment#:#tst_nav_while_edit_modal_nosave_btn#:#Spara inte +assessment#:#tst_nav_while_edit_modal_save_btn#:#Spara +assessment#:#tst_nav_while_edit_modal_text#:#Vad ska göras med de svar på denna fråga som du kanske redan har gett? +assessment#:#tst_no_evaluation_data#:#Det finns inga tillgängliga poster ännu. +assessment#:#tst_no_marks_defined#:#Det finns inga noter definierade. Vänligen skapa åtminstone ett enkelt notschema! +assessment#:#tst_no_question_selected_for_moving_to_qpl#:#Välj minst en fråga som du vill överföra till en frågepool! +assessment#:#tst_no_question_selected_for_removal#:#Välj minst en fråga att ta bort! +assessment#:#tst_no_scorable_qst_available#:#Ingen manuellt bedömbar fråga tillgänglig +assessment#:#tst_no_tries#:#Ingen +assessment#:#tst_non_avail_pool_msg_status_lost#:#Den härfrågepoolen är inte längre tillgänglig.
Det går inte längre att synkronisera frågor från den här frågepoolen. Du kan härleda en ny frågepool från de frågor som redan finns i testet. +assessment#:#tst_non_avail_pool_msg_status_trashed#:#Frågepoolen är i papperskorgen.
Om den tas bort permanent från systemet kan testet inte återsynkronisera frågorna från denna pool. +assessment#:#tst_non_avail_pools_table#:#Inte tillgängliga frågepooler +assessment#:#tst_non_available_pool_newly_derived#:#Den nya frågepoolen har framgångsrikt härletts. +assessment#:#tst_nonpool_questions_get_lost_warning#:#Detaktuella testläget innehåller frågor i sin konfiguration som inte är tilldelade någon frågepool. Om du ändrar testläget kommer dessa frågor oåterkalleligen att gå förlorade. +assessment#:#tst_notification_explanation_admin#:#Du får detta mail eftersom du har aktiverat aviseringsfunktionen. +assessment#:#tst_notify_manscoring_done_body_msg_reason#:#Du får detta meddelande eftersom du deltog i detta test. +assessment#:#tst_notify_manscoring_done_body_msg_subject#:#Manuell utvärdering för test "%s" har gjorts +assessment#:#tst_notify_manscoring_done_body_msg_topic#:#den manuella bedömningen för följande test lämnades in +assessment#:#tst_nr_of_passes#:#Antal testkörningar +assessment#:#tst_nr_of_tries#:#Maximalt antal testkörningar +assessment#:#tst_nr_of_tries_desc#:#Maximalt antal testkörningar som en deltagare kan genomföra. +assessment#:#tst_nr_of_tries_of_user#:#Testkörningar som redan har genomförts +assessment#:#tst_num_all_questions#:#Antal av alla frågor +assessment#:#tst_num_correct_answered_questions#:#Rätt besvarad +assessment#:#tst_num_non_answered_questions_notseen#:#Ännu inte visad +assessment#:#tst_num_non_answered_questions_skipped#:#Visad, inte besvarad +assessment#:#tst_num_questions#:#Antal frågor +assessment#:#tst_num_selected_questions#:#Antal utvalda frågor +assessment#:#tst_num_wrong_answered_questions#:#Felaktigt besvarad +assessment#:#tst_objective_oriented_test_pass_without_questions#:#Den påbörjade körningen i testet "%s" innehåller inga frågor. +assessment#:#tst_objective_progress_header#:#Framsteg när det gäller lärandemålet +assessment#:#tst_objectives_progress_header#:#Framsteg när det gäller lärandemålen +assessment#:#tst_old_style_rnd_quest_set_broken#:#Detta slumpmässiga test är i ett irreparabelt tillstånd eftersom anslutna frågepooler har raderats. Av denna anledning kan deltagarna inte längre göra detta test. +assessment#:#tst_optional_questions_confirmation_fixed_test#:#Frågorom inlärningsmål som redan har uppnåtts har besvarats framgångsrikt i tidigare försök.

Du vill nu växla till en fråga som hör till ett inlärningsmål som redan har uppnåtts.
Du kan välja +assessment#:#tst_optional_questions_confirmation_non_fixed_test#:#Frågorom inlärningsmål som redan har uppnåtts är frivilliga.

Du vill nu växla till en fråga som hör till ett inlärningsmål som redan har uppnåtts.
Du kan välja +assessment#:#tst_participant#:#Deltagare +assessment#:#tst_participant_fullname_pattern#:#%2$s, %1$s +assessment#:#tst_participant_status#:#Deltagarnas status +assessment#:#tst_participating_users#:#Deltagande användare +assessment#:#tst_pass_best_pass#:#Rating den bästa körningen av testet +assessment#:#tst_pass_best_pass_desc#:#Körningen med det högsta antalet poäng är poängsatt. +assessment#:#tst_pass_deletion#:#Radera körningar +assessment#:#tst_pass_deletion_allowed#:#Pass som inte används för bedömning kan raderas. +assessment#:#tst_pass_details#:#Detaljerade resultat +assessment#:#tst_pass_details_header_lo_initial#:#Establishment results för inlärningsmålen
%s - %s +assessment#:#tst_pass_details_header_lo_qualifying#:#Kvalificera resultat för inlärningsmålen
%s - %s +assessment#:#tst_pass_details_overview_table_title#:#Detaljerade testresultat för testkörning %s +assessment#:#tst_pass_finished#:#Testkörningen slutfördes +assessment#:#tst_pass_finished_on#:#Testkörning avslutad på +assessment#:#tst_pass_last_pass#:#Utvärdera sista körningen av testet +assessment#:#tst_pass_last_pass_desc#:#Endast den sista körningen av testet poängsätts. +assessment#:#tst_pass_overview_for_participant#:#Testkörningar för deltagare +assessment#:#tst_pass_overview_header_lo_initial_all_objectives#:#Ange testresultat
till inlärningsmålen i kursen %s +assessment#:#tst_pass_overview_header_lo_initial_per_objective#:#Ange testresultat
för inlärningsmål %s i kurs %s +assessment#:#tst_pass_overview_header_lo_qualifying_all_objectives#:#Kvalificera testresultat
till inlärningsmålen i kursen %s +assessment#:#tst_pass_overview_header_lo_qualifying_per_objective#:#Kvalificera testresultat
för lärandemålet %s i kursen %s +assessment#:#tst_pass_scoring#:#Utvärdering för flera körningar +assessment#:#tst_pass_waiting_enabled#:#Tvinga fram väntetid mellan körningarna +assessment#:#tst_pass_waiting_info#:#Med detta alternativ kan nya körningar endast startas när den definierade tidsperioden har förflutit sedan den föregående körningen. +assessment#:#tst_pass_waiting_time#:#Väntetid +assessment#:#tst_passed#:#Bekräftad +assessment#:#tst_passes#:#Test körningar +assessment#:#tst_password#:#Testa lösenord +assessment#:#tst_password_details#:#Om ett testlösenord har definierats måste deltagarna ange det för att starta eller fortsätta testet. Detta gäller även för pågående testkörningar. +assessment#:#tst_password_enter#:#Ange lösenord +assessment#:#tst_password_entered_wrong_password#:#Du kan inte starta testet eftersom du har angett ett felaktigt testlösenord! +assessment#:#tst_password_form#:#Ange lösenord för test +assessment#:#tst_password_introduction#:#Detta test kan endast startas eller fortsättas med ett testlösenord. Ange lösenordet här. +assessment#:#tst_percent_solved#:#Procent löst +assessment#:#tst_player_answer_saved_and_locked#:#Response är sparat och låst. Det innebär att svaret inte längre kan ändras. +assessment#:#tst_please_select_source_pool#:#Vänligen välj en frågepool. +assessment#:#tst_please_select_target_for_pool_derives#:#Vänligen välj en destinationscontainer. +assessment#:#tst_position#:#Fråga %s från %s +assessment#:#tst_position_without_total#:#Fråga %s +assessment#:#tst_postpone#:#Ej besvarade frågor +assessment#:#tst_postpone_off#:#Obesvarade frågor stannar kvar på sin plats +assessment#:#tst_postpone_off_desc#:#Även om deltagarna kastar bort svar eller hoppar över frågor ligger frågorna kvar på sin plats i testet. +assessment#:#tst_postpone_on#:#Obesvarade frågor skjuts till slutet av testet +assessment#:#tst_postpone_on_desc#:#Frågor vars svar deltagarna ignorerar eller hoppar över presenteras igen av ILIAS i slutet av testet. +assessment#:#tst_presentation_properties#:#Utförande +assessment#:#tst_presentation_settings_section#:#Presentation +assessment#:#tst_print#:#Test och bedömning - utskriftsvy +assessment#:#tst_proceed#:#Fortsättning +assessment#:#tst_processing_time#:#Begränsad bearbetningstid +assessment#:#tst_processing_time_desc#:#Använd denna inställning för e-tester/distanstester för att ge deltagarna en fast tidsperiod för att slutföra testet. Tiden löper för varje deltagare från det ögonblick då den första testkörningen startades. "Avbryt test" stoppar inte testets varaktighet +assessment#:#tst_processing_time_duration#:#Bearbetningstid +assessment#:#tst_processing_time_duration_desc#:#Maximal tillgänglig tid för att utföra testet +assessment#:#tst_qbt_filter_question_title#:#Frågans titel +assessment#:#tst_qst_added_to_pool_p#:#Frågorna överfördes framgångsrikt till frågepoolen. +assessment#:#tst_qst_added_to_pool_s#:#Frågan överfördes framgångsrikt till frågepoolen. +assessment#:#tst_qst_order#:#Nej. +assessment#:#tst_qst_skl_cfg_in_pool_hint_dynquestset#:#Frågekompetenstilldelningen för tester i läget "%s" måste alltid göras i den tilldelade frågepoolen. +assessment#:#tst_qst_skl_cfg_in_pool_hint_rndquestset#:#Frågekompetenstilldelningen för tester i läget "%s" måste alltid göras i de tilldelade frågepoolerna. +assessment#:#tst_question#:#Fråga +assessment#:#tst_question_amount#:#Antal frågor +assessment#:#tst_question_answer_status#:#Vilka frågor bör skickas in på nytt? +assessment#:#tst_question_answer_status_all_non_correct#:#Alla utom korrekt besvarade frågor +assessment#:#tst_question_answer_status_non_answered#:#Frågor som ännu inte besvarats +assessment#:#tst_question_answer_status_wrong_answered#:#Endast felaktigt besvarade frågor +assessment#:#tst_question_feedback_back_to_feedback_form#:#Tillbaka till kallelsefrågan +assessment#:#tst_question_feedback_edit_page#:#Redigera innehåll +assessment#:#tst_question_hints_back_to_hint_list#:#Lista över lösningsanteckningar +assessment#:#tst_question_hints_back_to_question#:#Tillbaka till frågan +assessment#:#tst_question_hints_cancel_request#:#Tillbaka till frågan +assessment#:#tst_question_hints_confirm_request#:#Förfrågan om lösning till +assessment#:#tst_question_hints_cut_hints_missing_selection_msg#:#Ingen ledtråd har valts för klippning. +assessment#:#tst_question_hints_cut_hints_single_selection_msg#:#Mer än en ledtråd har valts ut för klippning. +assessment#:#tst_question_hints_delete_hints_confirm_cmd#:#Ta bort anteckning(ar) om lösning +assessment#:#tst_question_hints_delete_hints_confirm_header#:#Vill du verkligen ta bort följande lösningsanteckning(ar)? +assessment#:#tst_question_hints_delete_hints_confirm_item#:#Lösningstips %s +assessment#:#tst_question_hints_delete_hints_missing_selection_msg#:#Inga lösningsanteckningar har valts för borttagning. +assessment#:#tst_question_hints_delete_success_msg#:#Den valda anteckningen har raderats framgångsrikt. +assessment#:#tst_question_hints_form_cmd_save#:#Spara lösningsanteckning +assessment#:#tst_question_hints_form_cmd_save_points#:#Spara poäng +assessment#:#tst_question_hints_form_cmd_save_points_and_edit_page#:# Spara poäng och redigera sidan +assessment#:#tst_question_hints_form_header_create#:#Ny lösning ledtråd för fråga +assessment#:#tst_question_hints_form_header_edit#:#Lösningstips %s för fråga +assessment#:#tst_question_hints_form_invalid_msg#:#Lösningsanteckningen kunde inte sparas. Vänligen kontrollera dina poster. +assessment#:#tst_question_hints_form_label_hint_points#:#Poängavdrag +assessment#:#tst_question_hints_form_label_hint_text#:#Lösningstips +assessment#:#tst_question_hints_form_saved_msg#:#Lösningsanteckningen har sparats framgångsrikt. +assessment#:#tst_question_hints_index_column_label#:#Lösningstips %s +assessment#:#tst_question_hints_item_stored_in_ordering_clipboard#:#Solution Notering %s finns i sorteringsklippbordet. +assessment#:#tst_question_hints_ordering_clipboard_resetted#:#Sorteringsklippbordet har återställts. +assessment#:#tst_question_hints_paste_after_success_msg#:#Lösningsanteckningen %s infogades framgångsrikt efter lösningsanteckningen %s. +assessment#:#tst_question_hints_paste_before_success_msg#:#Lösningsanteckningen %s har infogats före lösningsanteckningen %s. +assessment#:#tst_question_hints_request_confirmation#:#Vill du verkligen begära %s. Vill du verkligen begära %s. lösningsanteckning? %s poäng kommer att dras av för denna lösningstips. +assessment#:#tst_question_hints_request_confirmation_no_deduction#:#Det finns inget poängavdrag för denna referens. +assessment#:#tst_question_hints_requested_hint_count_header#:#Förfrågningar om lösningar +assessment#:#tst_question_hints_save_order_success_msg#:#Ordningen av lösningstipsen har sparats framgångsrikt. +assessment#:#tst_question_hints_tab#:#Tips på lösningar +assessment#:#tst_question_hints_table_column_hint_index#:#Index +assessment#:#tst_question_hints_table_column_hint_order#:#Beställ +assessment#:#tst_question_hints_table_column_hint_points#:#Poängavdrag +assessment#:#tst_question_hints_table_column_hint_text#:#Lösningstips +assessment#:#tst_question_hints_table_header#:#Lösning ger ledtrådar till frågan +assessment#:#tst_question_hints_table_link_delete_hint#:#Ta bort meddelande om lösning +assessment#:#tst_question_hints_table_link_edit_hint#:#Edit solution note +assessment#:#tst_question_hints_table_link_edit_hint_page#:#Redigera sida +assessment#:#tst_question_hints_table_link_edit_hint_points#:#Redigera punkter +assessment#:#tst_question_hints_table_no_items#:#Ingen befintlig lösning noter +assessment#:#tst_question_mark#:#Mark fråga +assessment#:#tst_question_marked#:#Du har markerat frågan +assessment#:#tst_question_marker#:#märkt +assessment#:#tst_question_no#:#Beställ +assessment#:#tst_question_not_from_pool_info#:#Ingen pool +assessment#:#tst_question_not_marked#:#Frågan är inte markerad. +assessment#:#tst_question_offer#:#Vill du använda denna sammanställning eller ska en ny sammanställning genereras? +assessment#:#tst_question_set_type#:#Val av testfrågor +assessment#:#tst_question_set_type_dynamic#:#Återinlämningsläge - alla frågor i en frågepool +assessment#:#tst_question_set_type_dynamic_desc#:#Alla deltagare får svara på alla frågor från en definierad frågepool en efter en. ILIAS skickar tillbaka frågor som har besvarats felaktigt. Frågor från redan pågående tester kan också läggas till eller ändras. +assessment#:#tst_question_set_type_fixed#:#Fixat urval av frågor +assessment#:#tst_question_set_type_fixed_desc#:#Alla deltagare får samma frågor. +assessment#:#tst_question_set_type_random#:#Slumpmässigt urval av frågor +assessment#:#tst_question_set_type_random_desc#:#Varje deltagare får svara på olika frågor. Frågorna väljs slumpmässigt från en eller flera frågepooler. +assessment#:#tst_question_title#:#Frågans titel +assessment#:#tst_question_type#:#Typ av fråga +assessment#:#tst_questions_hints_table_cmd_save_order#:#Spara sekvens +assessment#:#tst_questions_hints_table_multicmd_cut_hint#:#Klipp lösningsanteckning till sorteringsklippbordet +assessment#:#tst_questions_hints_table_multicmd_delete_hint#:#Ta bort anteckning(ar) om lösning +assessment#:#tst_questions_hints_table_multicmd_paste_hint_after#:#Bifoga utklippt lösningsanteckning till den valda +assessment#:#tst_questions_hints_table_multicmd_paste_hint_before#:#Prefixa den valda lösningen med en utklippt not +assessment#:#tst_questions_hints_toolbar_cmd_add_hint#:#Lägg till anmärkning om lösning +assessment#:#tst_questions_hints_toolbar_cmd_reset_ordering_clipboard#:#Återställ urklipp för sortering av lösningsanteckningar +assessment#:#tst_questions_inserted#:#Frågor bifogas! +assessment#:#tst_questions_removed#:#Frågor borttagna! +assessment#:#tst_random_nr_of_questions#:#Hur många frågor? +assessment#:#tst_random_select_questionpool#:#Välj en frågepool från vilken frågorna ska användas. +assessment#:#tst_reached_points#:#Antal uppnådda poäng +assessment#:#tst_reached_points_of_max#:#%s från %s +assessment#:#tst_remove_mark#:#Ta bort markör +assessment#:#tst_remove_question#:#Är du säker på att du vill ta bort följande fråga från ditt test? +assessment#:#tst_remove_questions#:#Är du säker på att du vill ta bort följande frågor från ditt test? +assessment#:#tst_remove_questions_and_results#:#Detta test har redan redigerats av %s användare. Om du tar bort frågor raderas alla befintliga resultat för detta test. Är du säker på att du vill ta bort följande frågor? +assessment#:#tst_report_after_date#:#Efter ett bestämt datum +assessment#:#tst_report_after_first_question#:#Erbjud testresultat omedelbart efter testets start +assessment#:#tst_report_after_passed#:#Visa endast testresultat när testet har godkänts. +assessment#:#tst_report_after_test#:#Offerera testresultat först efter avslutad testkörning +assessment#:#tst_report_never#:#Testresultaten är inte synliga +assessment#:#tst_reporting_date#:#Datum +assessment#:#tst_res_jump_to_participant_btn#:#Springe +assessment#:#tst_res_jump_to_participant_hint_opt#:#-- Hoppa till deltagare-- +assessment#:#tst_res_lo_objectives_header#:#Relevanta lärandemål +assessment#:#tst_res_lo_try_header#:#Försök +assessment#:#tst_res_lo_try_n#:#%s. Försök +assessment#:#tst_res_tab_msg_res_after_date#:#Testresultaten kommer att presenteras för dig här på följande datum +assessment#:#tst_res_tab_msg_res_after_date_no_res#:#Om du utför testet kommer testresultaten att presenteras här på följande datum +assessment#:#tst_res_tab_msg_res_after_finish_test#:#När du har slutfört testet presenteras testresultaten här. +assessment#:#tst_res_tab_msg_res_after_taking_test#:#När du har utfört testet presenteras testresultaten här. +assessment#:#tst_res_tab_msg_res_after_test_passed#:#Om du har klarat testet presenteras testresultaten här. +assessment#:#tst_reset_processing_time#:#Återställ maximal bearbetningstid för varje testkörning +assessment#:#tst_reset_processing_time_desc#:#Den maximala behandlingstiden är tillgänglig för varje testkörning. +assessment#:#tst_result#:#Testresultat +assessment#:#tst_result_pass#:#Resultat av testkörningen +assessment#:#tst_result_user_name#:#Testresultat för %s +assessment#:#tst_result_user_name_pass#:#Resultat av testkörning %s för %s +assessment#:#tst_results#:#Testresultat +assessment#:#tst_results_access_always#:#Instant +assessment#:#tst_results_access_always_desc#:#Ett mellanresultat kan redan visas under en testkörning via fliken "Resultat". Efter avslutad körning visas testresultatet automatiskt. +assessment#:#tst_results_access_date#:#Från definierat datum +assessment#:#tst_results_access_date_desc#:#Resultat visas endast på fliken "Resultat" från det valda datumet. +assessment#:#tst_results_access_enabled#:#Visa ditt eget testresultat +assessment#:#tst_results_access_enabled_desc#:#Deltagarna kan komma åt sina testresultat via fliken "Resultat". +assessment#:#tst_results_access_finished#:#Efter att ha kört testet +assessment#:#tst_results_access_finished_desc#:#När en testkörning har slutförts visas resultaten automatiskt på fliken "Resultat". +assessment#:#tst_results_access_passed#:#Efter godkänt test +assessment#:#tst_results_access_passed_desc#:#Först när testet har klarats kommer resultaten att visas. Deltagare som inte klarar testet kommer inte att få se något resultat. +assessment#:#tst_results_access_setting#:#Tid +assessment#:#tst_results_aggregated#:#Aggregerade testresultat +assessment#:#tst_results_back_introduction#:#Tillbaka till startsidan +assessment#:#tst_results_back_overview#:#Tillbaka till resultatöversikten +assessment#:#tst_results_details_options#:#Andra alternativ +assessment#:#tst_results_gamification#:#Spelifiering +assessment#:#tst_results_grading_opt_show_details#:#Visa detaljerade testresultat +assessment#:#tst_results_grading_opt_show_details_desc#:#Förutom det sammanfattande testresultatet erbjuds en åtgärd för "Detaljerade resultat". Tabellen "Detaljerade testresultat" visar titlarna på frågorna och de poäng som uppnåtts för varje körning. Innehållet i tabellen kan kompletteras ytterligare i avsni +assessment#:#tst_results_grading_opt_show_mark#:#Visa anteckning +assessment#:#tst_results_grading_opt_show_mark_desc#:#Ett meddelande på fliken "Resultat" informerar deltagarna om vilket betyg de har uppnått. +assessment#:#tst_results_grading_opt_show_status#:#"Godkänd" / "Underkänd" display +assessment#:#tst_results_grading_opt_show_status_desc#:#Ett meddelande på fliken "Resultat" informerar deltagarna om de har godkänts eller inte. +assessment#:#tst_results_overview#:#Oversikt över testkörningarna +assessment#:#tst_results_print_best_solution#:#Bästa möjliga lösning +assessment#:#tst_results_print_best_solution_info#:#Dina egna svar jämförs med de bästa möjliga lösningarna. +assessment#:#tst_results_print_best_solution_singlepage#:#Bästa möjliga lösning +assessment#:#tst_results_print_best_solution_singlepage_info#:#Dessutom visas den bästa möjliga lösningen för varje fråga. +assessment#:#tst_results_tax_filters#:#Resultat filter +assessment#:#tst_resume_dyn_test_with_cur_quest_sel#:#Fortsätt testet med aktuellt frågeurval +assessment#:#tst_resume_test#:#Fortsätt testet +assessment#:#tst_revert_changes#:#Reverse redigera +assessment#:#tst_rnd_quest_cfg_tab_general#:#Konfiguration fråga urval +assessment#:#tst_rnd_quest_cfg_tab_pool#:#Utvalda frågepooler +assessment#:#tst_rnd_quest_set_cfg_general_form#:#Konfiguration av det slumpmässiga urvalet av frågor +assessment#:#tst_rnd_quest_set_cfg_pool_form#:#Regler för urval av frågor +assessment#:#tst_rnd_quest_set_tb_add_pool_btn#:#Lägg till regel för val av fråga +assessment#:#tst_save_and_create_new_rule#:#Spara och lägg till ny regel +assessment#:#tst_save_and_proceed#:#Spara och gå vidare +assessment#:#tst_save_comp_points#:#Spara kompetenspoäng +assessment#:#tst_save_manscoring_failed#:#Den manuella bedömningen för testkörning %s kunde inte sparas. +assessment#:#tst_save_thresholds#:#Spara tröskelvärden +assessment#:#tst_saved_manscoring_by_question_successfully#:#Den manuella bedömningen av fråga %s för testkörning %s sparades framgångsrikt. +assessment#:#tst_saved_manscoring_successfully#:#Den manuella bedömningen för testkörning %s av %s sparades framgångsrikt. +assessment#:#tst_score_cut_question#:#Resultatet av en fråga kan aldrig vara mindre än 0 poäng. +assessment#:#tst_score_cut_question_desc#:#Vid tilldelning av minuspoäng för enskilda svarsalternativ kan minuspoäng uppnås genom att svara fel på en fråga. Med detta alternativ sätts de minuspoäng som uppnås per fråga till 0 poäng. +assessment#:#tst_score_cut_test#:#En fråga kan också ha en negativ poäng. +assessment#:#tst_score_cut_test_desc#:#Minuspoäng kan erhållas per fråga. Poängen för alla frågor läggs ihop och endast om denna summa fortfarande är negativ, sätts det totala resultatet av testet till 0 poäng. Helt eller delvis felaktigt besvarade frågor väger därför mycket tungt. +assessment#:#tst_score_cutting#:#Negativa punkter +assessment#:#tst_score_reporting#:#Utgående resultat +assessment#:#tst_score_reporting_date#:#Datum för utmatning av resultat +assessment#:#tst_search_users#:#Sök efter deltagare +assessment#:#tst_select_questionpool#:#Välj en frågepool där du kommer att lagra den skapade frågan! +assessment#:#tst_selected_user_data_deleted#:#Testdata för de valda användarna har raderats framgångsrikt. +assessment#:#tst_sequence#:#Beställ +assessment#:#tst_sequence_fixed#:#Ordningen på frågorna måste följas. +assessment#:#tst_sequence_postpone#:#Frågor kan skjutas upp till slutet av en testkörning. +assessment#:#tst_sequence_properties#:#Utförande +assessment#:#tst_session_settings#:#Utförande +assessment#:#tst_set_offline_due_to_switched_question_set_type_setting#:#Testet har satts offline eftersom inställningen för val av testfrågor har ändrats. Tilldela frågor till testet igen. Du kan sedan sätta testet online igen. +assessment#:#tst_setting_enable_obligations_info#:#Obligatoriska frågor definieras i "Listvyn". Ett test kan endast skickas in efter att alla obligatoriska frågor har besvarats. För detta ändamål bör alternativet "Visa frågelista och bearbetningsstatus" aktiveras.###Modifierad som en del av jämställdhets +assessment#:#tst_setting_enable_obligations_label#:#Obligatoriska frågor +assessment#:#tst_setting_offer_hints_info#:#Deltagare kan begära ledtrådar för att svara på en fråga. För varje ledtråd som ges minskas poängen för det korrekta svaret. +assessment#:#tst_setting_offer_hints_label#:#Tips på lösningar +assessment#:#tst_settings_conflict_message#:#Kombinationer av inställningar har valts som inte är tillåtna. +assessment#:#tst_settings_header_execution#:#Utförande +assessment#:#tst_settings_header_intro#:#Information om hur du kommer igång +assessment#:#tst_settings_header_test_run#:#Utförande +assessment#:#tst_show_answer_sheet#:#Visa översikt över svar +assessment#:#tst_show_cancel#:#Display "Avbrottstest +assessment#:#tst_show_cancel_description#:#Visar en knapp under testet som kan användas för att avbryta testet. Uppmärksamhet +assessment#:#tst_show_comp_results#:#Kompetensresultat +assessment#:#tst_show_pass_details#:#Visa 'Tabell över detaljerade testresultat' för varje godkänt test vid vald tidpunkt###31 03 2023 ny variabel +assessment#:#tst_show_pass_details_desc#:#Sammanfattningen av resultaten kommer att bifogas vid den tidpunkt som anges i inställningen ovan +assessment#:#tst_show_results#:#Testresultat +assessment#:#tst_show_side_list#:#Frågelista till +assessment#:#tst_show_solution_answers_only#:#Skriv ut resultaten (endast svar) +assessment#:#tst_show_solution_answers_only_desc#:#Om "Skriv ut resultat (endast svar)" är markerat, kommer ILIAS-innehåll som du kan placera före och efter den faktiska frågetexten via fliken "Redigera innehåll" i frågorna inte att visas i en utskrift. +assessment#:#tst_show_solution_compare#:#Visa bästa möjliga lösning i 'Tabell med detaljerade testresultat'. +assessment#:#tst_show_solution_compare_desc#:#Deltagarna presenteras med en översikt som en del av 'Tabell med detaljerade testresultat', som jämför deras egna svar och den bästa möjliga lösningen.
Denna översikt visas inte i underfliken "Poängbedömda svar" på fliken "Resultat", även om denna i +assessment#:#tst_show_solution_details#:#Rated svar som en lista +assessment#:#tst_show_solution_details_desc#:#En lista med dina egna svar läggs till i tabellen "Detaljerade testresultat". +assessment#:#tst_show_solution_details_singlepage#:#Relaterade svar på enskilda sidor +assessment#:#tst_show_solution_details_singlepage_desc#:#Deltagarna kan ringa upp varje fråga individuellt och se om deras svar var korrekta och hur många poäng de fick. +assessment#:#tst_show_solution_feedback#:#Tillbaka +assessment#:#tst_show_solution_feedback_desc#:#Om feedback på de givna svaren har deponerats med frågan kommer den att visas. Du måste aktivera alternativet "Betygsatta svar som lista" och/eller "Betygsatta svar på enskilda sidor" för att kunna använda denna funktion. +assessment#:#tst_show_solution_printview#:#Utskrivbar lista med svar +assessment#:#tst_show_solution_printview_desc#:#När du har klickat på "Avsluta testet" visas ytterligare en flik "Utvärderade svar" på fliken "Resultat". Här visas deltagarnas svar på de enskilda testfrågorna. +assessment#:#tst_show_solution_signature#:#Planshållare för signatur +assessment#:#tst_show_solution_signature_desc#:#Om alternativet "Visa detaljerade testresultat" eller "Utskrivbar lista över svar" är aktiverat, infogar ILIAS också ett signaturfält i utskriften. Den person som utförde testet kan signera i detta fält. +assessment#:#tst_show_solution_suggested#:#Innehåll för repetition +assessment#:#tst_show_solution_suggested_desc#:#Om frågorna i testet har tilldelats innehåll för att gå igenom materialet visas detta. Du måste aktivera alternativet "Visa detaljerade testresultat" för att kunna använda denna funktion. Deltagarna kan därmed täppa till eventuella luckor i sina kunskape +assessment#:#tst_show_summary#:#Visa frågelista och redigeringsstatus +assessment#:#tst_show_summary_description#:#Deltagarna kan visa en lista med frågor till vänster om testfrågorna. Med knappen "Bearbetningsstatus" får deltagarna fram en översikt som visar vilka frågor de redan har bearbetat eller markerat. Du kan ytterligare konfigurera beteendet för översikten " +assessment#:#tst_show_toplist#:#Placering +assessment#:#tst_shuffle_questions#:#Mix frågor +assessment#:#tst_shuffle_questions_description#:#Ordningen på frågorna kommer att ändras per deltagare och per testkörning. +assessment#:#tst_signature#:#Signatur +assessment#:#tst_single_answer_details#:#Visa ett enda svar +assessment#:#tst_single_results#:#Resultat på enskilda frågor +assessment#:#tst_skill_triggerings_num_req_answers#:#Nödvändigt antal svar för kompetensundersökningar +assessment#:#tst_skill_triggerings_num_req_answers_desc#:#Kompetens samlas endast in när minst detta antal svar bidrar till beräkningen av kompetensnivån. +assessment#:#tst_skill_triggerings_num_req_answers_not_reached_warn#:#Minst en kompetens som tas upp i testet har inte tilldelats ett tillräckligt antal frågor. För dessa kompetenser registreras inga kompetensposter för deltagarna.
Minsta antal tilldelade frågor +assessment#:#tst_skl_level_thresholds_link#:#Konfigurera tröskelvärden för kompetens +assessment#:#tst_skl_level_thresholds_missing#:#Tröskelvärden har ännu inte definierats för alla relevanta kompetenser! +assessment#:#tst_skl_res_interpretation_hint_msg#:#Tänk på att kompetensresultaten från ett enskilt test endast är villkorligt meningsfulla. Ju mer information som samlas in om de enskilda kompetenserna, desto mer giltigt blir påståendet. Om enskilda kompetenser inte har angetts, har för lite information +assessment#:#tst_skl_sub_tab_thresholds#:#Tröskelvärden för kompetens +assessment#:#tst_sol_comp_expressions#:#Jämförelse av uttryck +assessment#:#tst_solution_compare_cfg#:#Konfiguration för jämförelse av svar +assessment#:#tst_source_question_pool#:#Frågepool +assessment#:#tst_src_quest_pool_def_list_table#:#Regler för slumpmässigt urval av frågor +assessment#:#tst_start_dyn_test_with_cur_quest_sel#:#Starta testet med aktuellt frågeval +assessment#:#tst_start_new_test_pass#:#Starta en ny testkörning +assessment#:#tst_start_test#:#Starta test +assessment#:#tst_started#:#Testet påbörjat +assessment#:#tst_starting_time#:#Start +assessment#:#tst_starting_time_desc#:#Tid från vilken testet kan startas. Från och med nu är det möjligt att klicka på knappen "Starta test" och deltagarna kan svara på frågor. +assessment#:#tst_stat_result_atimeofwork#:#Genomsnittlig bearbetningstid +assessment#:#tst_stat_result_firstvisit#:#Första samtal +assessment#:#tst_stat_result_lastvisit#:#Sista samtal +assessment#:#tst_stat_result_mark_median#:#Note tilldelad medianen +assessment#:#tst_stat_result_median#:#Median av testresultatets poängsatta poäng +assessment#:#tst_stat_result_pworkedthrough#:#Percentage (fullständigt redigerad) +assessment#:#tst_stat_result_qmax#:#Totalt antal frågor +assessment#:#tst_stat_result_qworkedthrough#:#Frågor som redan besvarats +assessment#:#tst_stat_result_rank_median#:#Rank tilldelad medianen +assessment#:#tst_stat_result_rank_participant#:#Rank av deltagaren +assessment#:#tst_stat_result_resultsmarks#:#Testresultat som klass +assessment#:#tst_stat_result_resultspoints#:#Testresultat i punkter +assessment#:#tst_stat_result_timeofwork#:#Bearbetningstid +assessment#:#tst_stat_result_total_participants#:#Totalt antal deltagare +assessment#:#tst_submit_results#:#YES, jag bekräftar härmed att mina svar har skickats +assessment#:#tst_tab_competences#:#Kompetens +assessment#:#tst_tab_results_objective_oriented#:#Testresultat i enlighet med inlärningsmål +assessment#:#tst_tab_results_pass_oriented#:#Testresultat efter tester +assessment#:#tst_tbl_col_answered_questions#:#Frågor besvarade +assessment#:#tst_tbl_col_final_mark#:#Note +assessment#:#tst_tbl_col_finished_passes#:#Avslutade körningar +assessment#:#tst_tbl_col_finished_passes_num_of#:#%s från %s +assessment#:#tst_tbl_col_last_scored_access#:#Sista utvärderade tillgång +assessment#:#tst_tbl_col_pass_finished#:#Run avslutad +assessment#:#tst_tbl_col_passed_status#:#Rating +assessment#:#tst_tbl_col_percent_result#:#Resultat +assessment#:#tst_tbl_col_reached_points#:#Antal uppnådda poäng +assessment#:#tst_tbl_col_scored_pass#:#Värderad körning +assessment#:#tst_tbl_col_started_passes#:#Startade körningar +assessment#:#tst_tbl_invited_users#:#Utvalda deltagare +assessment#:#tst_tbl_participants#:#Deltagare +assessment#:#tst_tbl_results_grades#:#Resultat och betyg +assessment#:#tst_test_contains_obligatory_questions#:#För att kunna genomföra testet måste du besvara alla obligatoriska frågor (*). +assessment#:#tst_test_result#:#Testresultat +assessment#:#tst_text_count_system#:#Bedömningsregel +assessment#:#tst_threshold#:#Tröskelvärde (i %) +assessment#:#tst_time_already_spent#:#Du har startat testet +assessment#:#tst_time_already_spent_left#:#Du är kvar med %s +assessment#:#tst_title_output#:#Display av frågornas rubriker +assessment#:#tst_title_output_full#:#Frågetitlar och uppnåbara punkter +assessment#:#tst_title_output_hide_points#:#Endast titel på fråga +assessment#:#tst_title_output_no_title#:#Varken frågetitel eller uppnåeliga punkter +assessment#:#tst_trigger_result_refreshing#:#Resultatet beräknas på nytt. Detta kan ta en stund. +assessment#:#tst_type#:#Testa typ +assessment#:#tst_unchanged_answer_is_correct#:#Det angivna svaret är korrekt. +assessment#:#tst_unchanged_order_is_correct#:#Det givna arrangemanget är korrekt. +assessment#:#tst_use_previous_answers#:#Använda tidigare lösningar +assessment#:#tst_use_previous_answers_description#:#Visar deltagarna svaren från föregående testkörning. Alternativet måste aktiveras av deltagaren via en kryssruta på fliken "Info" innan testet påbörjas. +assessment#:#tst_use_previous_answers_user#:#Använd mina lösningar från en tidigare testkörning som standardvärden +assessment#:#tst_user_finished_test#:#En deltagare har avslutat testet (%s) +assessment#:#tst_view_competence_assign#:#Visa egenskaper för tilldelning +assessment#:#tst_virtual_pass_header_lo_initial#:#Establishment-resultat för lärandemålet
%s +assessment#:#tst_virtual_pass_header_lo_qualifying#:#Kvalificerande resultat för lärandemålet
%s +assessment#:#tst_wf_info_answer_adopted_from_prev_pass#:#Ditt svar från ett tidigare försök har tagits över. +assessment#:#tst_wf_info_answer_not_adopted#:#Inget svar hämtades från tidigare försök. Därför måste du arbeta med den här frågan, annars kommer ditt resultat för lärandemålet att försämras. +assessment#:#tst_wf_info_optional_question#:#Den här frågan hör till ett inlärningsmål som redan har uppnåtts. +assessment#:#tst_you_have_to_answer_this_question#:#Den här frågan måste besvaras för att testet ska kunna slutföras. +assessment#:#tst_your_answer_was#:#Du har gett följande svar +assessment#:#tst_your_answers#:#Det här är svaren du gav på följande frågor. Kontrollera dina svar och skicka sedan in dem. +assessment#:#un_add_category#:#Lägg till kategori +assessment#:#un_add_unit#:#Lägg till enhet +assessment#:#un_cat_deletion_errors_f#:#Följande kategorier kan inte raderas +assessment#:#un_cat_deletion_errors_f_s#:#Följande kategori kan inte raderas +assessment#:#un_cat_deletion_errors_p#:#Följande kategorier kunde inte raderas +assessment#:#un_cat_deletion_errors_p_s#:#Följande kategori kunde inte tas bort +assessment#:#un_category_not_exist#:#Den begärda kategorin finns inte. +assessment#:#un_deleted_categories#:#De valda kategorierna har raderats framgångsrikt. +assessment#:#un_deleted_categories_s#:#Den valda kategorin har raderats framgångsrikt. +assessment#:#un_deleted_units#:#De valda enheterna har raderats framgångsrikt. +assessment#:#un_deleted_units_s#:#Den valda enheten har raderats framgångsrikt. +assessment#:#un_global_units#:#Globala enheter +assessment#:#un_local_units#:#Lokala enheter +assessment#:#un_save_order#:#Spara sekvens +assessment#:#un_sel_cat_sel_unit#:#Vald kategori +assessment#:#un_sequence#:#Beställ +assessment#:#un_show_units#:#Visa enheter +assessment#:#un_sure_delete_categories#:#Är du säker på att du vill radera de valda kategorierna? +assessment#:#un_sure_delete_categories_s#:#Är du säker på att du vill ta bort den valda kategorin? +assessment#:#un_sure_delete_units#:#Är du säker på att du vill ta bort de valda enheterna? +assessment#:#un_sure_delete_units_s#:#Är du säker på att du vill ta bort den valda enheten? +assessment#:#un_unit_deletion_errors_f#:#Följande enheter kan inte raderas +assessment#:#un_unit_deletion_errors_f_s#:#Följande enhet kan inte raderas +assessment#:#un_unit_deletion_errors_p#:#Följande enheter kunde inte raderas +assessment#:#un_unit_deletion_errors_p_s#:#Följande enhet kunde inte tas bort +assessment#:#un_units_of_category_x#:#Antal enheter i kategorin +assessment#:#unfinished_passes#:#Oavslutad testkörning +assessment#:#unit#:#Enhet +assessment#:#unit_placeholder#:#** Ny enhet ** +assessment#:#units#:#Antal enheter +assessment#:#unlimited#:#obegränsad +assessment#:#unlock#:#Lås upp +assessment#:#uploaded_material#:#Uppladdade material +assessment#:#use_ects_fx#:#Användning av ECTS-betyget "FX +assessment#:#use_previous_solution#:#Använd tidigare lösning +assessment#:#use_previous_solution_advice#:#Lösningen som visas har tidigare lämnats in av dig. Du måste bekräfta antagandet av denna lösning under frågan om du vill anta lösningen utan ändringar. +assessment#:#user_has_finished_a_test#:#En deltagare har avslutat ett test. +assessment#:#user_not_invited#:#Du är inte en deltagare i provet. +assessment#:#user_wrong_clientip#:#Fel klient IP +assessment#:#value_between_x_and_y#:#Värdet måste vara mellan %s och %s +assessment#:#values#:#Värderingar +assessment#:#variable_x#:#Variabel %s +assessment#:#variables#:#Variabler +assessment#:#wait_for_next_pass_hint_msg#:#Förnyelse möjlig från följande tidpunkt +assessment#:#warning_question_not_complete#:#Frågan är ofullständig! +assessment#:#width#:#Bredd +assessment#:#with_solutions_participants#:#Deltagare med svar +assessment#:#without_solutions_participants#:#Deltagare utan svar +assessment#:#worked_through#:#Editerad +assessment#:#working_time#:#Bearbetningstid +assessment#:#you_received_a_of_b_points#:#Du har uppnått %s av %s möjliga poäng. +auth#:#auth_account_code#:#Kod +auth#:#auth_account_code_info#:#För att återaktivera ditt ILIAS-konto kan du använda en ILIAS-inloggningskontokod. +auth#:#auth_account_code_title#:#Registrering kontokod +auth#:#auth_account_code_used#:#Ditt ILIAS-konto har återaktiverats. Logga in igen av säkerhetsskäl. +auth#:#auth_account_migration#:#Nytt ILIAS-konto +auth#:#auth_account_migration_keep#:#Migrera befintligt inloggningskonto +auth#:#auth_account_migration_name#:#Migration +auth#:#auth_account_migration_new#:#Create nytt ILIAS-konto +auth#:#auth_activation_code_success#:#Din åtkomst har aktiverats. Du kan nu logga in. +auth#:#auth_allow_local_info#:#Om den är aktiverad är lokal autentisering mot ILIAS-databasen med inloggningsnamn/lösenord också möjlig för de inloggningskonton vars autentiseringsläge är SAML. +auth#:#auth_auth_settings#:#Inställningar +auth#:#auth_cas_ldap#:#Synkronisering via LDAP-inställningar +auth#:#auth_cas_ldap_info#:#Om aktiverat utförs synkroniseringen av användardata och rolltilldelningar enligt LDAP-inställningarna. +auth#:#auth_err_expired#:#Din session har löpt ut. Logga in igen. +auth#:#auth_err_invalid_user_account#:#Autentiseringen kunde inte utföras på grund av ett internt fel. +auth#:#auth_err_ldap_exception#:#Autenticering kunde inte utföras på grund av ett fel i inloggningsproceduren (LDAP). +auth#:#auth_err_login_attempts_deactivation#:#ILIAS-kontot har avaktiverats på grund av för många felaktiga inloggningsförsök. +auth#:#auth_info_add#:#Välj den här inställningen om du aldrig har registrerat dig för ILIAS tidigare. I så fall kommer ett nytt ILIAS-konto att skapas. +auth#:#auth_info_migrate#:#Om du redan har ett ILIAS-konto anger du inloggningsnamn och lösenord för att överföra dina personuppgifter (e-postmeddelanden, testresultat ...). +auth#:#auth_ldap_server_ds#:#LDAP-server +auth#:#auth_login_editor#:#Design inloggningssida +auth#:#auth_oidc#:#OpenId Connect +auth#:#auth_oidc_failed#:#Login via OpenID Connect misslyckades +auth#:#auth_oidc_login_element_info#:#Logga in på ILIAS via OpenID Connect +auth#:#auth_oidc_mapping_table#:#Mappning av datafält för ILIAS-konton till OpenID Connect-attribut +auth#:#auth_oidc_profile#:#Tilldelning av profiluppgifter +auth#:#auth_oidc_role_info#:#OpenID Anslut attribut +auth#:#auth_oidc_role_mapping_table#:#Association av ILIAS-roller till OpenId Connect-attribut +auth#:#auth_oidc_roles#:#Rolltilldelning +auth#:#auth_oidc_settings#:#Inställningar för server +auth#:#auth_oidc_settings_activation#:#Aktivera OpenID Connect +auth#:#auth_oidc_settings_additional_scopes#:#Ytterligare omfattningar +auth#:#auth_oidc_settings_client_id#:#Klient-ID +auth#:#auth_oidc_settings_custom_session_duration#:#Sessionens varaktighet +auth#:#auth_oidc_settings_custom_session_duration_option#:#Own sessionens varaktighet +auth#:#auth_oidc_settings_custom_session_duration_type#:#Inställningar för sessionens längd +auth#:#auth_oidc_settings_default_role#:#Rolltilldelning +auth#:#auth_oidc_settings_default_role_info#:#Please select a global role för nya ILIAS-användare som ska skapas! +auth#:#auth_oidc_settings_discovery_error#:#URL:en för upptäckten kunde inte hämtas. Fel +auth#:#auth_oidc_settings_discovery_url#:#URL för identifiering av leverantören +auth#:#auth_oidc_settings_img#:#Image +auth#:#auth_oidc_settings_img_file_info#:#Ladda upp en bild som ska visas på inloggningssidan. Bilden länkar automatiskt till OpenId Connects inloggningsskript. +auth#:#auth_oidc_settings_invalid_scopes#:#Följande värden är inte giltiga scopes +auth#:#auth_oidc_settings_le#:#Visa inloggningssida +auth#:#auth_oidc_settings_login_option_default#:#Tvinga inte inloggning +auth#:#auth_oidc_settings_login_option_default_info#:#En inloggning till OpenId Connect Server är inte nödvändig om det redan finns en giltig session. +auth#:#auth_oidc_settings_login_option_enforce#:#Force inloggning +auth#:#auth_oidc_settings_login_option_enforce_info#:#En registrering med OpenId Connect Server är nödvändig i alla fall - även om en giltig session redan finns. +auth#:#auth_oidc_settings_login_options#:#Alternativ för inloggning +auth#:#auth_oidc_settings_logout_scope#:#Beteende vid utloggning +auth#:#auth_oidc_settings_logout_scope_global#:#Global loggning av +auth#:#auth_oidc_settings_logout_scope_global_info#:#Om den är aktiverad avslutas både OpenId Connect-sessionen och ILIAS-sessionen när du loggar ut. +auth#:#auth_oidc_settings_logout_scope_local#:#Logga ut från ILIAS endast +auth#:#auth_oidc_settings_logout_scope_local_info#:#Om den är aktiverad avslutas endast ILIAS-sessionen vid utloggning. +auth#:#auth_oidc_settings_provider#:#URL för leverantör +auth#:#auth_oidc_settings_secret#:#Klientens nyckel +auth#:#auth_oidc_settings_section_user_sync#:#Inställningar för användarsynkronisering +auth#:#auth_oidc_settings_session_duration#:#Varaktighet +auth#:#auth_oidc_settings_title#:#Konfigurera autentisering med OpenID Connect +auth#:#auth_oidc_settings_txt#:#Text +auth#:#auth_oidc_settings_txt_val_info#:#Ange en text som ska visas på inloggningssidan. Texten länkar automatiskt till inloggningsskriptet för OpenID Connect. +auth#:#auth_oidc_settings_user_attr#:#Attributnamn för inloggningskonton +auth#:#auth_oidc_settings_user_sync#:#Automatisk synkronisering +auth#:#auth_oidc_settings_user_sync_info#:#För personer som ännu inte har ett ILIAS-konto men som har autentiserat sig mot Open ID Connect skapas ett nytt ILIAS-konto automatiskt. +auth#:#auth_oidc_settings_validate_scope_custom#:#Ange din egen URL för OpenID Connect Discovery +auth#:#auth_oidc_settings_validate_scope_default#:# +auth#:#auth_oidc_settings_validate_scope_none#:#Kontrollera inte scopes när du sparar +auth#:#auth_oidc_settings_validate_scopes#:#Kontrollera OpenID Connect Scopes när du sparar +auth#:#auth_oidc_update_field_info#:#Automatisk uppdatering +auth#:#auth_oidc_update_role_info#:#Gäller endast vid första inloggning (automatisk synkronisering) +auth#:#auth_oidconnect#:#OpenID Connect +auth#:#auth_page_type_auth#:#Inloggningssida +auth#:#auth_saml#:#SAML +auth#:#auth_saml_add_idp_btn#:#Identitet - lägg till +auth#:#auth_saml_add_idp_md_error#:#Det angivna värdet motsvarade tyvärr inte ett välformulerat XML-dokument. Se till att XML innehåller en giltig identitetsleverantör. +auth#:#auth_saml_add_idp_md_info#:#För in metadata för identitetsleverantören som en XML-formaterad sträng här. +auth#:#auth_saml_add_idp_md_label#:#Identitetsleverantör SAML-metadata +auth#:#auth_saml_configure#:#Konfigurera #SAML-stöd +auth#:#auth_saml_configure_idp#:#Konfigurera #SAML-IDP +auth#:#auth_saml_deleted_idp#:#Identitetsleverantören har tagits bort. +auth#:#auth_saml_enable#:#Aktivera #SAML-stöd +auth#:#auth_saml_err_sqlite_driver#:#SAML-autentisering kräver SQLite-drivrutinerna för PHP. Installera dem och försök igen. +auth#:#auth_saml_idp#:#IDP +auth#:#auth_saml_idp_selection_table_desc#:#Välj den identitetsleverantör som du vill logga in med. +auth#:#auth_saml_idp_selection_table_title#:#Identitetsleverantör +auth#:#auth_saml_idp_settings#:#IDP-inställningar +auth#:#auth_saml_idps#:#SAML IDP Lista +auth#:#auth_saml_idps_info#:#Kontrollera och justera SimpleSAMLphp-konfigurationen i filerna'%s' och'%s' (extern datakatalog) innan du lägger till en identitetsleverantör. Kom framför allt ihåg att konfigurera serversökvägarna för din privata nyckel +auth#:#auth_saml_login_form#:#Visa i registreringsformuläret +auth#:#auth_saml_login_form_info#:#Om den är aktiverad och det finns minst en aktiv IDP visas en knapp på ILIAS-inloggningssidan som initierar en SAML-förfrågan när du klickar på den. +auth#:#auth_saml_migration#:#Migrering av konto +auth#:#auth_saml_migration_info#:#Aktivera den här inställningen för att tillåta nya användare att byta befintliga ILIAS-inloggningskonton till SAML-autentisering. +auth#:#auth_saml_role_select#:#Roll +auth#:#auth_saml_sure_delete_idp#:#Är du säker på att du vill radera den valda identitetsleverantören oåterkalleligt? Standardautentiseringen väljs sedan för de berörda inloggningskontona. +auth#:#auth_saml_sync#:#Synkronisering av användare +auth#:#auth_saml_sync_info#:#Om aktiverat skapas ett ILIAS-konto automatiskt för personer som framgångsrikt har autentiserat sig mot SAML men ännu inte har ett eget ILIAS-konto. Dessutom uppdateras redan befintliga ILIAS-konton när de aktiveras. +auth#:#auth_saml_uid_claim#:#Unikt attribut för identifiering av inloggningskontot +auth#:#auth_saml_uid_claim_info#:#Define here the attribute that ILIAS can use during authentication to determine whether a login account already exists or whether it is an existing login account. +auth#:#auth_saml_unknow_idp#:#Identitetsleverantören finns inte. +auth#:#auth_saml_update_field_info#:#Automatisk uppdatering +auth#:#auth_saml_user_mapping#:#Tilldelning av profiluppgifter +auth#:#auth_saml_username_claim#:#Attribut för visningsnamn/inloggningsnamn +auth#:#auth_saml_username_claim_info#:#Definiera attributet här som ILIAS ska använda för att generera visningsnamnet/inloggningsnamnet. +auth#:#auth_sync#:#Synkronisering av användare +auth#:#auth_sync_cas#:#Automatisk generering av ILIAS-inloggningskonton +auth#:#auth_sync_cas_info#:#Användare som har autentiserat sig mot CAS men inte har ett ILIAS-konto skapas automatiskt. +auth#:#err_auth_ldap_failed#:#Autentiseringen har misslyckats. Kontakta din ILIAS-administratör. +auth#:#err_auth_saml_failed#:#Autentiseringen har misslyckats. Vänligen kontakta din administratör. +auth#:#err_auth_saml_no_ilias_user#:#Autentiseringen har misslyckats. Vänligen kontakta din administratör. +auth#:#login_page_activate#:#Aktivera redigeraren för valda språk +auth#:#login_page_editor_switched#:#Den aktiva sidredigeraren har ändrats +auth#:#login_page_switch_ipe#:#Använd #ILIAS sidredigerare +auth#:#login_page_switch_rte#:#Använd Rich Text Editor +auth#:#lti_consumer_inactive#:#LTI Tool Consumer är avaktiverad +auth#:#saml_tab_head_idp#:#IDP +awrn#:#awareness_now_online#:#Nu online +awrn#:#awareness_settings#:#Inställningar +awrn#:#awrn_caching_period#:#Caching-period +awrn#:#awrn_caching_period_info#:#Denna period inväntas innan antalet användare i toppdisplayen uppdateras och nya online-användare identifieras. +awrn#:#awrn_enable#:#Aktivera displayen "Vem är online?" +awrn#:#awrn_filter#:#Användarfilter +awrn#:#awrn_hide_from_awareness#:#Lista inte upp mig i "Vem är online?"-visningen +awrn#:#awrn_hide_from_awareness_info#:#Indikatorn "Vem är online?" visas högst upp i applikationen och listar valda användare (t.ex. kontakter eller medlemmar i dina kurser). +awrn#:#awrn_inactive#:#Ingen display +awrn#:#awrn_incl_offline#:#Online och offline +awrn#:#awrn_max_inactivity#:#Max. Inaktivitet +awrn#:#awrn_max_inactivity_info#:#Användare som inte har agerat under den angivna tidsperioden listas som "offline". Om inget värde anges gäller sessionens giltighet. +awrn#:#awrn_max_nr_entries#:#Antal max. inmatningar +awrn#:#awrn_max_nr_entries_info#:#Detta är det maximala antalet poster som visas i listan "Vem är online?". Den här inställningen har ingen större inverkan på visningen i det övre fältet. +awrn#:#awrn_minutes#:#min +awrn#:#awrn_online#:#Online +awrn#:#awrn_online_only#:#Endast online +awrn#:#awrn_seconds#:#Sec. +awrn#:#awrn_use_osd#:#Popup online-användare +awrn#:#awrn_use_osd_info#:#Visar en popup när nya användare visas i "Vem är online?"-displayen med online-status. +awrn#:#awrn_user_show#:#Visa min status i "Vem är online? +awrn#:#user_awrn_default#:#Standard +awrn#:#user_awrn_hide#:#Visa inte +awrn#:#user_awrn_show#:#Display +background_tasks#:#abort#:#Avbryt +background_tasks#:#background_tasks#:#Bakgrundsuppgifter +background_tasks#:#background_tasks_running#:#Bakgrundsuppgifter +background_tasks#:#completed#:#Fullbordad +background_tasks#:#proceed_job#:#Fortsättning +background_tasks#:#remove#:#Remove +background_tasks#:#scheduled#:#Planerad +background_tasks#:#task_might_be_failed#:#Den här uppgiften har inte besvarats på ett tag, du kan stoppa den om det behövs. +background_tasks#:#ui_msg_files_violate_maxsize#:#Den totala nedladdningsstorleken överskrider den globala gränsen. Nedladdningen avbryts. +background_tasks#:#ui_msg_no_files_found#:#Inga filer hittades. Nedladdningen har avbrutits. +background_tasks#:#ui_msg_num_files#:#%s fil(er) har hittats, vill du fortsätta? +background_tasks#:#ui_msg_sum_file_sizes#:#Den totala nedladdningsstorleken innan zip-mappen skapas är %s. Vill du fortsätta? +background_tasks#:#waiting#:#Väntar +badge#:#badge_activity_badges#:#Automatiskt tilldelad badge +badge#:#badge_add_template#:#Lägg till mall +badge#:#badge_add_to_backpack#:#Lägg till i ryggsäcken +badge#:#badge_add_to_backpack_multi#:#Försök att lägga till %s i ryggsäcken +badge#:#badge_add_to_profile#:#Lägg till i profil +badge#:#badge_assignment_deletion_confirmation#:#Vill du verkligen återkalla följande badge-tilldelningar för "%s"? +badge#:#badge_award_badge#:#Badge-utmärkelse +badge#:#badge_backpack_connect_failed#:# Mozilla Backpack kunde inte begäras för %s. +badge#:#badge_backpack_email#:#Mozilla Backpack-konto (e-post) +badge#:#badge_backpack_gallery_info#:#Detta är de publicerade märkessamlingarna i din Mozilla-ryggsäck. +badge#:#badge_backpack_list#:#Min ryggsäck +badge#:#badge_backpack_no_groups#:#Mozilla Backpack är tom eller inte offentlig. +badge#:#badge_badge#:#Badge +badge#:#badge_course_lp#:#Badge tilldelas enligt prestation +badge#:#badge_course_lp_invalid#:#Följande objekt använder ett icke-stöttat inlärningsläge +badge#:#badge_criteria#:#Kriterier +badge#:#badge_crs_merit#:#Manuellt tilldelat märke +badge#:#badge_deletion_confirmation#:#Vill du verkligen ta bort följande märken och alla deras respektive uppdrag? +badge#:#badge_edit_with_published#:#%s användare har redan lagt till detta märke i sin ryggsäck. Att ändra badge-attribut leder därför till inkonsekvenser. Kanske skulle ett nytt märke vara mer meningsfullt. +badge#:#badge_image_from_template#:#Använd mall +badge#:#badge_image_from_upload#:#Ladda upp bild +badge#:#badge_image_template_form#:#Bildmall +badge#:#badge_image_templates#:#Mallar för bilder +badge#:#badge_in_profile#:#I profil +badge#:#badge_issued_on#:#Mottagen den +badge#:#badge_lhist_badge_completed#:#Badge $3$ har förvärvats. +badge#:#badge_lhist_badge_completed_in#:#Badge $3$ förvärvades i $1$. +badge#:#badge_manual#:#Manuell tilldelning +badge#:#badge_new_badges#:#Du har fått %1 utmärkelse(r). +badge#:#badge_no_valid_types_for_obj#:#Det finns för närvarande inga aktiva badge-typer. Inga nya badges kan skapas. Vänligen kontakta din administratör. +badge#:#badge_notification_badges#:#Nya märken +badge#:#badge_notification_badges_goto#:#Till märkena +badge#:#badge_notification_body#:#Du har just fått nya märken. +badge#:#badge_notification_osd#:#Du har just fått nya utmärkelser +badge#:#badge_notification_parent_goto#:#Till tidningen +badge#:#badge_notification_reason#:#Du kommer att få detta meddelande för att kunna lägga till de nya märkena i din profil. +badge#:#badge_notification_subject#:#Badge mottagen +badge#:#badge_obi_activate#:#Aktivera Mozillas infrastruktur för öppna utmärkelser +badge#:#badge_obi_activate_info#:#Användarmärken kan exporteras från ILIAS och användas på Internet som bevis på deras kvalifikationer. +badge#:#badge_obi_contact#:#Kontakt e-post +badge#:#badge_obi_contact_info#:#Den här e-postadressen visas inte, men den är inbakad i badgen. +badge#:#badge_obi_organisation#:#Organisation +badge#:#badge_obi_organisation_info#:#Den här informationen visas som utgivare av märket. +badge#:#badge_obi_salt#:#Salt +badge#:#badge_obi_salt_info#:#Ange en kombination av siffror och bokstäver så att tredje part senare kan validera badgens äkthet. Ändra inte inmatningen senare. +badge#:#badge_object_badges#:#Objekt-märken +badge#:#badge_personal_badges#:#Mina utmärkelser +badge#:#badge_profile_less#:#Visa mindre +badge#:#badge_profile_manage#:#Hantering +badge#:#badge_profile_more#:#Visa alla +badge#:#badge_profile_view#:#Display +badge#:#badge_remove_badge#:#Ta bort märke +badge#:#badge_remove_from_profile#:#Ta bort från profil +badge#:#badge_service_activate#:# Aktivera tjänst +badge#:#badge_service_activate_info#:#Aktivera tjänsten för att göra badges tillgängliga +badge#:#badge_settings#:#Badge inställningar +badge#:#badge_subtype_auto#:#automatisk +badge#:#badge_subtype_manual#:#manual +badge#:#badge_template_deletion_confirmation#:#Vill du verkligen ta bort följande bildmallar? +badge#:#badge_template_types#:#Valida typer +badge#:#badge_template_types_all#:#Alla +badge#:#badge_template_types_specific#:#Bestämd +badge#:#badge_types#:#Typer +badge#:#badge_user_profile#:#Profil publicerad###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +badge#:#badge_valid#:#Giltig tills +bgtask#:#bgtask_blocked#:#Running nedladdning +bgtask#:#bgtask_blocked_cancel_new#:#Avbryt ny nedladdning +bgtask#:#bgtask_blocked_cancel_old#:#Avbryt pågående nedladdning +bgtask#:#bgtask_blocked_info#:#En nedladdning genereras redan åt dig. +bgtask#:#bgtask_cron_gc_desc#:#Raderar filer som skapats av bakgrundsprocesser och som inte längre behövs. +bgtask#:#bgtask_cron_gc_title#:#Bakgrundsuppgifter Uppstädning +bgtask#:#bgtask_download_long#:#Det tar lite tid att skapa nedladdningen med %1$s filer (%2$s). +bgtask#:#bgtask_download_too_large#:#Nedladdningen överskrider gränsen för %s. +bgtask#:#bgtask_empty_folder#:#Urvalet innehåller inga objekt som kan laddas ner. +bgtask#:#bgtask_failure#:#Fel +bgtask#:#bgtask_processing#:#Create nedladdning +bgtask#:#bgtask_setting#:#Activate "Ladda ner i bakgrunden +bgtask#:#bgtask_setting_info#:#Skapandet av ZIP-filen sker asynkront och kan avbrytas när som helst. +bgtask#:#bgtask_setting_limit#:#Global gräns +bgtask#:#bgtask_setting_limit_info#:#En nedladdning är endast möjlig om den maximala summan av filstorlekarna inte överstiger värdet. +bgtask#:#bgtask_setting_threshold_count#:#Minsta antal +bgtask#:#bgtask_setting_threshold_count_info#:#Från och med detta värde sker nedladdningen asynkront. +bgtask#:#bgtask_setting_threshold_size#:#Minsta storlek +bgtask#:#bgtask_setting_threshold_size_info#:#Från denna storlek och uppåt är nedladdningen asynkron. +bibl#:#Type#:#Typ +bibl#:#add_filter#:#Lägg till filter +bibl#:#bib_default_abstract#:#Abstrakt +bibl#:#bib_default_address#:#Adress +bibl#:#bib_default_author#:#Författare +bibl#:#bib_default_cite#:#Bib Cite +bibl#:#bib_default_edition#:#Cirkulation +bibl#:#bib_default_howpublished#:#Typ av publicering +bibl#:#bib_default_isbn#:#ISSN/ISBN +bibl#:#bib_default_journal#:#Journal/Magazine +bibl#:#bib_default_keywords#:#nyckelord +bibl#:#bib_default_month#:#Månad +bibl#:#bib_default_note#:#Note +bibl#:#bib_default_number#:#Nummer +bibl#:#bib_default_organization#:#Organisation +bibl#:#bib_default_pages#:#Sidor +bibl#:#bib_default_publisher#:#Förläggare +bibl#:#bib_default_series#:#Serier +bibl#:#bib_default_title#:#Titel +bibl#:#bib_default_type#:#Typ +bibl#:#bib_default_url#:#URL +bibl#:#bib_default_volume#:#Cirkulation +bibl#:#bib_default_year#:#År +bibl#:#bibl_copy#:#Kopiera litteraturlista +bibl#:#bibl_edit#:#Redigera litteraturlistan +bibl#:#bibl_filter#:#Filter +bibl#:#bibl_import#:#Importera litteraturlista +bibl#:#bibl_library_img#:#URL för bild +bibl#:#bibl_library_name#:#Namn +bibl#:#bibl_library_show_in_list#:#Visa länk även i listan +bibl#:#bibl_library_url#:#Bas-URL +bibl#:#bibl_link_online#:#Fråga om inventering +bibl#:#bibl_msg_translations_deleted#:#Översättningar har tagits bort. +bibl#:#bibl_msg_translations_saved#:#Översättningar har sparats +bibl#:#bibl_new#:#Skapa ny bibliografi +bibl#:#bibl_settings_edit#:#Redigera bibliotek +bibl#:#bibl_settings_libraries#:#Bibliotek +bibl#:#bibl_settings_new#:#Lägg till bibliotek +bibl#:#bibl_translation_desc#:#Beskrivning +bibl#:#bibl_translation_lang#:#Språk +bibl#:#bibl_translation_trans#:#Översättning +bibl#:#bibliography_file#:#Litteraturlista fil +bibl#:#bibtex#:#Bibtex +bibl#:#changes_saved#:#Ändringarna har sparats. +bibl#:#custom#:#Användare definierad +bibl#:#detail_view#:#Detaljerad vy +bibl#:#download_original_file#:#Ladda ner originalfilen +bibl#:#field#:#Fält +bibl#:#fields#:#Fält +bibl#:#filter_deleted#:#Filtret har tagits bort. +bibl#:#filter_field_info#:#Välj ett fält för vilket du vill lägga till ett filter. +bibl#:#filter_form_title#:#Lägg till nytt filter +bibl#:#filter_type#:#Filter typ +bibl#:#filter_type_1#:#Textfält +bibl#:#filter_type_2#:#Urval +bibl#:#filter_type_3#:#Multipelt urval +bibl#:#filter_type_info#:#Välj en filtertyp för fältet. +bibl#:#identifier#:#Identifierare +bibl#:#msg_confirm_delete_filter#:#Vill du verkligen ta bort följande filter? +bibl#:#news_title_created#:#Ny litteraturlista tillagd +bibl#:#news_title_updated#:#Litteraturlistan uppdaterad +bibl#:#not_yet_migrated#:#Detta objekt har ännu inte migrerats. Kontakta plattformens administratörer. +bibl#:#obj_bibl_duplicate#:#Duplicera litteraturlistan +bibl#:#order#:#Sortering +bibl#:#override_entries#:#Överskriv poster +bibl#:#ris#:#Ris +bibl#:#ris_default_a2#:#Andra författaren +bibl#:#ris_default_au#:#Författare +bibl#:#ris_default_cy#:#Outlet +bibl#:#ris_default_ep#:#Sista sidan +bibl#:#ris_default_id#:#Reference ID +bibl#:#ris_default_ja#:#Tidskrift i vilken artikeln publicerades +bibl#:#ris_default_kw#:#Nyckelord +bibl#:#ris_default_l3#:#Liknande register +bibl#:#ris_default_m1#:#Nummer +bibl#:#ris_default_m3#:#Misc. 3 +bibl#:#ris_default_n1#:#Noter +bibl#:#ris_default_n2#:#Abstrakt +bibl#:#ris_default_pb#:#Redaktör +bibl#:#ris_default_py#:#Publiceringsår +bibl#:#ris_default_sn#:#ISSN/ISBN/ASIN +bibl#:#ris_default_t1#:#Huvudtitel +bibl#:#ris_default_t2#:#Andra titeln +bibl#:#ris_default_t3#:#Tredje avdelningen +bibl#:#ris_default_ti#:#Boktitel +bibl#:#ris_default_ty#:#Typ +bibl#:#ris_default_u2#:#Användare definierad +bibl#:#ris_default_ur#:#URL +bibl#:#ris_default_vl#:#Volym +bibl#:#ris_default_y1#:#År +bibl#:#standard#:#Standard +bibl#:#translate#:#Översättning +bkm#:#bkm_fold_created#:#Bookmark-mappen har skapats. +blog#:#blog_abstract_image#:#Visa första bilden +blog#:#blog_abstract_image_height#:#Höjd +blog#:#blog_abstract_image_info#:#Den första bilden i inlägget kommer att förminskas till den storlek som anges här. Bilder som är mindre än den angivna storleken kommer inte att visas. +blog#:#blog_abstract_image_pixels#:#Px +blog#:#blog_abstract_image_width#:#Bredd +blog#:#blog_abstract_shorten#:#Visa endast början av inlägget +blog#:#blog_abstract_shorten_characters#:#karaktärer +blog#:#blog_abstract_shorten_length#:#Maximal längd +blog#:#blog_add#:#Skapa blogg +blog#:#blog_add_contributor#:#Lägg till bidragsgivare +blog#:#blog_add_posting#:#Lägg till bidrag +blog#:#blog_admin_inactive_info#:#Bloggfunktionen kan aktiveras i administrationen av "Personliga resurser". +blog#:#blog_admin_toggle_info#:#Bloggfunktionen kan avaktiveras i administrationen för "Personliga resurser". +blog#:#blog_allow_html#:#Tillåt #HTML/Javascript +blog#:#blog_allow_html_info#:#HTML eller Javascript kan användas i blogginlägg. Detta kan leda till säkerhetsproblem.###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +blog#:#blog_approve#:#Lås upp post +blog#:#blog_author#:#Bidrag från +blog#:#blog_authors#:#Contributors###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +blog#:#blog_back_to_blog_owner#:#Redigera blogg +blog#:#blog_banner#:#Banner +blog#:#blog_change_notification_body_approve#:#Följande bidrag måste fortfarande aktiveras +blog#:#blog_change_notification_body_comment#:# följande inlägg har kommenterats +blog#:#blog_change_notification_body_new#:# följande inlägg har nyligen skapats +blog#:#blog_change_notification_body_update#:#Följande inlägg har ändrats +blog#:#blog_change_notification_link#:#Länk till artikeln +blog#:#blog_change_notification_reason#:#Du får detta meddelande eftersom du har aktiverat meddelandefunktionen för ovanstående blogg. +blog#:#blog_change_notification_subject#:#Bloggen "%s" har uppdaterats +blog#:#blog_comments#:#Kommentarer +blog#:#blog_confirm_delete_contributors#:#Vill du verkligen beröva följande personer deras roll?###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +blog#:#blog_contribute_other_roles#:#Förutom bidragsgivare kan personer med %s-rollen också skriva inlägg på den här bloggen. De är inte listade i tabellen eftersom de får motsvarande rättighet genom ett föräldraobjekt.###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för I +blog#:#blog_contributors#:#Deltagare +blog#:#blog_copy#:#Copy blogg +blog#:#blog_download_submission#:#Ladda ner kopia av avgiften +blog#:#blog_draft#:#Draft +blog#:#blog_draft_info#:#Innehållet i detta inlägg är endast synligt för dig som ett utkast. +blog#:#blog_draft_info_contributors#:#Detta inlägg är endast synligt som utkast för bidragsgivare. +blog#:#blog_draft_text#:#Offentliggjort inlägg +blog#:#blog_edit#:#Redigera blogg +blog#:#blog_edit_date#:#Ändra datum +blog#:#blog_edit_date_info#:#Publikationens status är inte beroende av detta datum. +blog#:#blog_edit_keywords#:#Redigera nyckelord +blog#:#blog_edit_posting#:#Redigera inlägg +blog#:#blog_enable_approval#:#Aktivera nya inlägg +blog#:#blog_enable_approval_info#:#Alla bidrag måste aktiveras av en användare med rättigheten "Redigera inställningar" innan de blir synliga för andra användare. +blog#:#blog_enable_keywords#:#nyckelord +blog#:#blog_enable_keywords_info#:#Inlägg kan taggas med nyckelord för att filtrera inlägg i sidblocket.###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +blog#:#blog_enable_nav_authors#:#Filter by contributor###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +blog#:#blog_enable_nav_authors_info#:#Ett sidblock med namnen på alla bidragsgivare visas. Om du klickar på ett namn visas alla bidrag från den personen i huvudkolumnen.###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +blog#:#blog_enable_notes#:#Offentliga kommentarer +blog#:#blog_enable_rss#:#Aktivera #RSS +blog#:#blog_enable_rss_info#:#RSS-flödet är offentligt och oberoende av bloggens delningar eller behörigheter. +blog#:#blog_est_reading_time#:#Uppskattad lästid +blog#:#blog_est_reading_time_info#:#I bloggar i tidningen kan en uppskattad lästid bestämmas och visas. +blog#:#blog_exercise_info#:#Den här bloggen är tilldelad övningsenheten "%s" i övningen "%s". +blog#:#blog_exercise_submitted_info#:#Din senaste inlämning var den %s. Vänligen kontrollera exportfilen +blog#:#blog_finalize_blog#:#Stäng och skicka in blogg +blog#:#blog_finalized#:#Bloggen lämnades in. +blog#:#blog_import#:#Import blogg +blog#:#blog_incl_comments#:#inklusive kommentarer +blog#:#blog_keyword#:# nyckelord +blog#:#blog_keyword_enter#:#Ange ett nyckelord och tryck på Enter. +blog#:#blog_keywords#:#nyckelord +blog#:#blog_keywords_other#:#Övriga nyckelord +blog#:#blog_keywords_other_info#:#Dessa nyckelord har tilldelats andra blogginlägg. +blog#:#blog_latest_posting#:#Nyaste inlägget +blog#:#blog_link#:#Länk +blog#:#blog_list_more#:#Mer +blog#:#blog_list_num_postings#:#Antal poster i den första översikten +blog#:#blog_list_num_postings_info#:#Denna inställning används endast om ingen specifik månad har valts. +blog#:#blog_nav_mode#:#Månadsvis navigering +blog#:#blog_nav_mode_month_list#:#Aktuella månader som en lista +blog#:#blog_nav_mode_month_list_info#:#Sidblocket visar en lista över månader. Antalet månader och inlägg som visas kan ställas in. +blog#:#blog_nav_mode_month_list_num_detail#:#Antal poster (sorterade efter fallande datum) +blog#:#blog_nav_mode_month_list_num_detail_info#:#Äldre poster listas i månadsvyn. +blog#:#blog_nav_mode_month_list_num_month#:#Totalt antal månader som visas +blog#:#blog_nav_mode_month_list_num_month_info#:#Månader visas som standard endast med antalet av deras bidrag. +blog#:#blog_nav_mode_month_list_num_month_with_post#:#Antal månader med länkar till alla inlägg +blog#:#blog_nav_mode_month_list_num_month_with_post_info#:#För detta antal aktuella månader visas länkar till alla inlägg i sidoblocket. +blog#:#blog_nav_mode_month_single#:#Alla månader med rullgardinsmeny +blog#:#blog_nav_mode_month_single_info#:#I sidblocket finns en rullgardinsmeny där alla månader kan väljas. Alla bidrag listas för den valda månaden. +blog#:#blog_nav_sortorder#:#Ordning på sidblocken +blog#:#blog_navigation#:#Bidrag +blog#:#blog_needs_approval#:#Posten är ännu inte aktiverad +blog#:#blog_new#:#Skapa ny blogg +blog#:#blog_new_posting_info#:#Posten har publicerats. Det första textblocket används som ett utdrag i listan över poster. +blog#:#blog_news_posting_authors#:#Deltagare +blog#:#blog_news_posting_published#:#Ett nytt blogginlägg publicerades av %s. +blog#:#blog_news_posting_updated#:#Ett blogginlägg uppdaterades av %s. +blog#:#blog_no_keywords#:#Inga nyckelord har tilldelats ännu. +blog#:#blog_notification_activated#:#Anmälan om ändring aktiverad +blog#:#blog_notification_deactivated#:#Ändringsmeddelande avaktiverat +blog#:#blog_notification_toggle_off#:#Avaktivera meddelande om ändringar +blog#:#blog_notification_toggle_on#:#Aktivera meddelande om ändringar +blog#:#blog_number_users_notes_or_comments#:#Antal användare som har skrivit noteringar eller kommentarer om detta inlägg. +blog#:#blog_page_type_blp#:#blogginlägg +blog#:#blog_permanent_link#:#Permalänk +blog#:#blog_posting#:#Bidrag +blog#:#blog_posting_deleted#:#Inlägget har tagits bort. +blog#:#blog_posting_deletion_confirmation#:#Vill du verkligen ta bort det här inlägget? +blog#:#blog_posting_edit_approval_info#:#Bidraget måste godkännas av en handledare innan det publiceras. +blog#:#blog_posting_not_found#:#Inlägget är inte tillgängligt. +blog#:#blog_postings#:#Bidrag +blog#:#blog_presentation_frame#:#Presentation +blog#:#blog_presentation_overview#:#Presentation av bidragen +blog#:#blog_preview#:#Förhandsgranskning +blog#:#blog_preview_banner#:#Personlig banner +blog#:#blog_preview_banner_height#:#Höjd på bannern +blog#:#blog_preview_banner_info#:#Förvald storlek är 1370x100 pixlar. +blog#:#blog_preview_banner_width#:#Bannerns bredd +blog#:#blog_profile_picture#:#Visa profilbild +blog#:#blog_profile_picture_repository_info#:#Profilbilder visas endast för enskilda inlägg, inte på översiktssidor.###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +blog#:#blog_properties#:#Bloggegenskaper +blog#:#blog_rename_posting#:#Rename post +blog#:#blog_selected_pages#:#Utvalda bidrag +blog#:#blog_settings#:#bloggadministration +blog#:#blog_settings_navigation#:#Navigation +blog#:#blog_show_latest#:#Visa senaste inlägg/utkast +blog#:#blog_show_print_view#:# Skriv ut vy +blog#:#blog_style#:#bloggstil +blog#:#blog_task_publishing_draft_title#:#Publicera utkast "%s" +blog#:#blog_toggle_draft#:#Återkalla publicering +blog#:#blog_toggle_draft_admin#:#Avaktivera bidrag +blog#:#blog_toggle_final#:#Publicera bidrag +blog#:#blog_whole_blog#:#Övergripande blogg +book#:#X_reservations_of#:#%s reservationer från +book#:#book_add#:#Skapa bokningspool +book#:#book_add_object#:#Lägg till objekt +book#:#book_add_schedule#:#Lägg till tidsraster +book#:#book_additional_info_file#:#Tilläggsbeskrivning +book#:#book_all#:#Visa alla +book#:#book_all_pools_need_schedules#:#Ändringarna har inte sparats. Alla tilldelade bokningspooler kräver minst ett schema. +book#:#book_all_users#:#Alla deltagare +book#:#book_assign#:#Assign +book#:#book_assign_object#:#Tilldela bokningsobjekt +book#:#book_assign_participant#:#Tilldela deltagare +book#:#book_back_to_list#:#Tillbaka till listan +book#:#book_bobj#:#Postningsobjekt +book#:#book_book#:#Böcker +book#:#book_booked_in#:#Bokad i +book#:#book_booking_information#:#Information +book#:#book_booking_objects#:#Bokningsobjekt +book#:#book_booking_reminders#:#Väntande reservationer +book#:#book_bookings_per_user#:#Bokningar per användare +book#:#book_cal_entry#:#Bokning från +book#:#book_confirm_booking#:#Gör en bokning +book#:#book_confirm_booking_no_schedule#:#Är du säker på att du vill boka följande objekt? +book#:#book_confirm_booking_schedule_number_of_objects#:#Bekräftelse av bokning +book#:#book_confirm_booking_schedule_number_of_objects_info#:#Välj antal objekt som ska bokas. +book#:#book_confirm_cancel#:#Är du säker på att du vill avboka följande bokning? +book#:#book_confirm_cancel_aggregation#:#Antal avbokningar +book#:#book_confirm_delete#:#Vill du verkligen ta bort följande objekt? +book#:#book_copy#:#Kopiera bokningspool +book#:#book_deadline#:#Tidsspann +book#:#book_deadline_hours#:#Till n timmar före starten av tidsfönstret +book#:#book_deadline_info#:#Minsta tid mellan bokning och bokningsperiod +book#:#book_deadline_options#:#Senaste bokningstid +book#:#book_deadline_slot_end#:#Till slutet av tidsfönstret +book#:#book_deadline_slot_start#:#Till början av tidsfönstret +book#:#book_deassign#:#Utilldela +book#:#book_download_info#:#Ladda ner ytterligare beskrivning +book#:#book_edit#:#Redigera beläggningsplan +book#:#book_edit_object#:#Ändra objekt +book#:#book_edit_schedule#:#Redigera schema +book#:#book_filter_past_reservations#:#Visa utgångna bokningar +book#:#book_fromto#:#Datumintervall +book#:#book_hours#:#Timmar +book#:#book_is_used#:#I användning +book#:#book_limit_objects_available#:#Du kan inte lägga till %s deltagare i "%s" eftersom endast %s poster är tillgängliga. +book#:#book_log#:#Reserveringar +book#:#book_new#:#Skapa ny bokningspool +book#:#book_no_bookings_for_you#:#Inga reservationer har gjorts för dig. +book#:#book_no_objects#:#Ingen tilldelning +book#:#book_no_of_objects#:#Antal objekt +book#:#book_no_preferences_for_you#:#Du har inte sparat några inställningar. +book#:#book_not#:#Not +book#:#book_not_enough_preferences#:#Du har inte valt tillräckligt många preferenser. Inställningarna har inte sparats. +book#:#book_notification#:#Notifieringar om reservationer +book#:#book_notification_cron_not_active#:#Attention +book#:#book_notification_info#:#Skickar en lista över nästa dags bokningar till användare (endast egna) och administratörer (om aktiverat). +book#:#book_nr_of_preferences#:#Nummer +book#:#book_nr_of_preferences_info#:#Antal preferenser som varje deltagare får ange. +book#:#book_nr_preferences#:#Preferenser +book#:#book_object_added#:#Ett bokningsobjekt har lagts till. +book#:#book_object_deleted#:#Bokningsobjektet har tagits bort. +book#:#book_object_updated#:#Bokningsobjektet har ändrats. +book#:#book_objects_available#:#Tillgängliga objekt +book#:#book_open#:#Öppen bokningspool +book#:#book_overall_limit#:#Begränsning +book#:#book_overall_limit_warning#:#Du har nått det maximala antalet bokningar. +book#:#book_participant_already_assigned#:#En eller flera deltagare var redan utsedda. +book#:#book_participant_assigned#:#Deltagaren/deltagarna har tilldelats. +book#:#book_period#:#Varaktighet +book#:#book_pool_added#:#En bokningspool har skapats. +book#:#book_pool_selection#:#Urval bokning pool +book#:#book_post_booking_file#:#Fil +book#:#book_post_booking_information#:#Information efter en bokning +book#:#book_post_booking_text#:#Text +book#:#book_post_booking_text_info#:#Platshållarna kan användas för att lägga till bokningsinformation i infotexten.
Platshållaren [OBJECT] ersätts med respektive bokningsobjekt.
Platshållaren [PERIOD] ersätts med den valda bokningsperioden. +book#:#book_pref_book_cron#:#Boka med preferenser +book#:#book_pref_book_cron_info#:#Automatisk bokning av bokningar med preferenser efter tidsfristen. +book#:#book_pref_deadline#:#Slutdatum +book#:#book_pref_deadline_info#:#Preferenser kan ges upp till denna punkt. +book#:#book_pref_overview#:#Översikt +book#:#book_preference_info#:#Please select %1 preference(s) to %2. Efter deadline kommer tilldelningar att göras automatiskt baserat på alla deltagares preferenser. +book#:#book_preferences#:#Preferenser +book#:#book_preferences_saved#:#Inställningarna har sparats. +book#:#book_public_log#:#Users ser alla bokningar +book#:#book_public_log_info#:#Användare med läsbehörighet kan också se andra användares reservationer på fliken "Reservationer". +book#:#book_rem_intro#:#Detta är en översikt över kommande bokningar. +book#:#book_rem_reason#:#Du får detta mail eftersom du har aktiverat aviseringen av motsvarande bokningsobjekt. +book#:#book_reminder_day#:#Skicka +book#:#book_reminder_day_info#:#En lista över dina egna bokningar skickas automatiskt. Användare med rättigheten "Redigera inställningar" får en total lista över alla pågående bokningar. +book#:#book_reminder_days#:#Dagar före bokning +book#:#book_reminder_setting#:#Påminn deltagarna om reservationen +book#:#book_rerun_assignments#:#Utför uppdrag igen +book#:#book_rerun_confirmation#:#Attention. Tilldelningen enligt preferenser har redan gjorts. I sällsynta fall kan avbrytande av processen leda till inga eller ofullständiga bokningar och göra det nödvändigt att starta om processen. Innan du startar om den automatiska processen måste d +book#:#book_reservation_available#:#%s tillgänglig +book#:#book_reservation_confirmed#:#Bokningen slutfördes framgångsrikt. +book#:#book_reservation_failed#:#Bokningen misslyckades. +book#:#book_reservation_failed_overbooked#:#Bokningen misslyckades eftersom objektet inte längre är tillgängligt. +book#:#book_reservation_filter_period#:#Förvald inställning för filtret "Datumintervall" +book#:#book_reservation_filter_period_info#:#I fliken "Reservationer" är filtret "Datumintervall" förinställt till detta värde från det aktuella datumet. +book#:#book_reservation_fix_info#:#Reservation kan endast göras för bestämda tider. +book#:#book_reservation_overview#:#Reserveringar för alla användare +book#:#book_reservation_status_5#:#Avbruten +book#:#book_reservation_title#:#Bokningsförfrågan för +book#:#book_reservations_list#:#Reserveringar +book#:#book_schedule#:#Tidtabell +book#:#book_schedule_added#:#Ett schema har lagts till. +book#:#book_schedule_days#:#Veckodagar +book#:#book_schedule_days_info#:#Giltiga tider för varje dag (HH +book#:#book_schedule_deleted#:#Schemat har tagits bort. +book#:#book_schedule_slot#:#Tidsperiod +book#:#book_schedule_type#:#Bokningsläge +book#:#book_schedule_type_fixed#:#Bokning av möten +book#:#book_schedule_type_fixed_info#:#Lämplig för bokningar av saker under en viss tidsperiod, t.ex. rum, tjänster eller utrustning. +book#:#book_schedule_type_none#:#Distribuera utan schema +book#:#book_schedule_type_none_direct#:#Bokning utan datum +book#:#book_schedule_type_none_direct_info#:#Deltagare kan boka direkt. Läget är lämpligt för presentationsämnen eller seminarieplatser som tilldelas utan tidsbokning. +book#:#book_schedule_type_none_info#:#Detta bokningssätt är lämpligt för tilldelning av uppsatsämnen, seminarieplatser eller jämförbara erbjudanden. +book#:#book_schedule_type_none_preference#:#Automatiskt distribuera enligt preferenser +book#:#book_schedule_type_none_preference_info#:#Deltagarnas preferenser för förnamn. Bokningar görs sedan automatiskt på ett valt slutdatum. Bokningsläget är lämpligt för presentationsämnen eller seminarieplatser som tilldelas utan datum. +book#:#book_schedule_updated#:#Schemat har ändrats. +book#:#book_schedule_warning_edit#:#Det finns för närvarande inga tillgängliga scheman. För att använda poolen måste ett schema först skapas (eller så måste typen av bokningspool ändras). +book#:#book_schedules#:#Tidtabeller +book#:#book_select_pool#:#Välj pool +book#:#book_set_cancel#:#Avbryt +book#:#book_set_delete#:#Radera +book#:#book_too_many_preferences#:#Du har valt för många inställningar. Inställningarna har inte sparats. +book#:#book_type_warning#:#Det finns för närvarande inga bokningsobjekt tillgängliga. För att kunna använda poolen måste bokningsobjekt först skapas. +book#:#book_your_bookings#:#Dina bokningar +book#:#book_your_preferences#:#Dina preferenser +book#:#book_your_reservations#:#Dina bokningar +book#:#booking_multiple_succesfully#:#Bokningar framgångsrikt genomförda +book#:#booking_nr_of_items#:#Nummer +book#:#obj_book_duplicate#:#Kopiera bokningspool +book#:#participants#:#Deltagare +book#:#reservation_deleted#:#Reservation borttagen +buddysystem#:#buddy_allow_to_contact_me#:#Tillåt kontaktförfrågningar +buddysystem#:#buddy_allow_to_contact_me_info#:#Om aktiverat kan andra användare skicka kontaktförfrågningar till mig. +buddysystem#:#buddy_bs_act_btn_txt_ignored_request_to_linked#:#Bekräfta begäran +buddysystem#:#buddy_bs_act_btn_txt_ignored_request_to_unlinked#:#Begäran om återkallelse +buddysystem#:#buddy_bs_act_btn_txt_linked_to_unlinked#:#Avbryt kontakt +buddysystem#:#buddy_bs_act_btn_txt_requested_to_ignored_request#:#Ignorera kontakt +buddysystem#:#buddy_bs_act_btn_txt_requested_to_linked#:#Bekräfta kontakt +buddysystem#:#buddy_bs_act_btn_txt_requested_to_unlinked#:#Begäran om återkallelse +buddysystem#:#buddy_bs_action_already_ignored#:#Åtgärden är inte möjlig eftersom kontaktförfrågan från användaren '%s' redan har ignorerats. +buddysystem#:#buddy_bs_action_already_linked#:#Åtgärden är inte möjlig eftersom kontaktförfrågan för användaren '%s' redan har bekräftats. +buddysystem#:#buddy_bs_action_already_requested#:#Åtgärden är inte möjlig eftersom användaren '%s' redan har begärts. +buddysystem#:#buddy_bs_action_already_unlinked#:#Åtgärden är inte möjlig. All kontakt med användaren '%s' har redan lösts. +buddysystem#:#buddy_bs_action_not_possible#:#Aktion ej möjlig +buddysystem#:#buddy_bs_btn_txt_ignored_request_a#:#Begärd kontakt +buddysystem#:#buddy_bs_btn_txt_ignored_request_p#:#Förfrågan ignorerad +buddysystem#:#buddy_bs_btn_txt_linked_a#:#Nätverk +buddysystem#:#buddy_bs_btn_txt_linked_p#:#Nätverk +buddysystem#:#buddy_bs_btn_txt_requested_a#:#Begärd kontakt +buddysystem#:#buddy_bs_btn_txt_requested_p#:#Kontaktförfrågan +buddysystem#:#buddy_bs_btn_txt_unlinked_a#:#Förfrågan om kontakt +buddysystem#:#buddy_bs_state_ignored_request_a#:#Frågade +buddysystem#:#buddy_bs_state_ignored_request_p#:#Ignorerad +buddysystem#:#buddy_bs_state_ignoredrequest#:#Ignorerad +buddysystem#:#buddy_bs_state_linked#:#Nätverk +buddysystem#:#buddy_bs_state_linked_a#:#Nätverk +buddysystem#:#buddy_bs_state_linked_p#:#Nätverk +buddysystem#:#buddy_bs_state_requested#:#Frågade +buddysystem#:#buddy_bs_state_requested_a#:#Frågade +buddysystem#:#buddy_bs_state_requested_filter_a#:#Väntar på reaktion +buddysystem#:#buddy_bs_state_requested_filter_p#:#Åtgärd krävs +buddysystem#:#buddy_bs_state_requested_p#:#Frågade +buddysystem#:#buddy_bs_state_unlinked#:#Inte nätverk +buddysystem#:#buddy_bs_state_unlinked_a#:#Inte nätverk +buddysystem#:#buddy_bs_state_unlinked_p#:#Inte nätverk +buddysystem#:#buddy_enable#:#Aktivera "Användarkontakter +buddysystem#:#buddy_enable_info#:#Om den är aktiverad kan användare i systemet kontakta varandra via kontaktförfrågningar. En ytterligare personlig inställning gör det möjligt för varje användare att tillåta eller förhindra kontaktförfrågningar. +buddysystem#:#buddy_handle_contact_request#:#Kontaktförfrågan +buddysystem#:#buddy_noti_cr_profile_not_published#:#Profil ej publicerad +buddysystem#:#buddy_notification_contact_request#:#Kontaktförfrågan +buddysystem#:#buddy_notification_contact_request_ignore#:#Ignorera begäran +buddysystem#:#buddy_notification_contact_request_ignore_osd#:#Ignorera begäran +buddysystem#:#buddy_notification_contact_request_link#:#Bekräfta begäran +buddysystem#:#buddy_notification_contact_request_link_osd#:#Bekräfta begäran +buddysystem#:#buddy_notification_contact_request_long#:#[SALUTATION][BR]"[REQUESTING_USER]" vill gärna komma i kontakt med dig.[BR][BR]Länk till personlig profil +buddysystem#:#buddy_notification_contact_request_short#:#Användaren "[REQUESTING_USER]" vill gärna kontakta dig. +buddysystem#:#buddy_relation_requested#:#En kontaktförfrågan har skickats till användaren. +buddysystem#:#buddy_request_approved#:#Kontakten har framgångsrikt etablerats. +buddysystem#:#buddy_request_ignored#:#Du har ignorerat användaren. +buddysystem#:#buddy_tbl_filter_state#:#Status +buddysystem#:#buddy_tbl_state_actions_col_label#:#Status / Åtgärd +buddysystem#:#buddy_tbl_title_relations#:#Relationer med andra användare +buddysystem#:#buddy_use_osd#:#Popup kontaktförfrågningar +buddysystem#:#buddy_use_osd_info#:#Visar en popup när en användare vill kontakta mig. +buddysystem#:#buddy_view_gallery#:#Galleri +buddysystem#:#buddy_view_table#:#Lista +cat#:#cat_copy#:#Kopieringskategori +cat#:#cat_import#:#Kategori #Import +cat#:#cat_more_translations#:#Andra översättningar +cert#:#cert_currently_no_certs#:#För närvarande har du inga certifikat. +cert#:#cert_description_label#:#Beskrivning +cert#:#cert_download_label#:#Ladda ner +cert#:#cert_error_no_access#:#Du har inte behörighet att komma åt detta certifikat. +cert#:#cert_issued_on_label#:#Utställd på +cert#:#cert_object_label#:#Objekt +cert#:#cert_sortable_by_issue_date_asc#:#Sorterat efter utgivningsdatum - äldst först +cert#:#cert_sortable_by_issue_date_desc#:#Sorterat efter utgivningsdatum - nyaste först +cert#:#cert_sortable_by_title_asc#:#Sorterad efter titel (A?Z) +cert#:#cert_sortable_by_title_desc#:#Sorterad efter titel (Z?A) +cert#:#certificate_achievement#:#%1$s har mottagits. +cert#:#certificate_achievement_sub_obj#:#Certifikat för %1$s +cert#:#certificate_migration_confirm_start#:#Dina certifikat finns alltid kvar i dina händer sedan ILIAS 5.4. Även om kurser, tester eller utbildningsmoduler raderas kan du fortfarande komma åt alla förvärvade certifikat. För att använda denna nya funktion måste du migrera dina gamla certifikat en +cert#:#certificate_migration_confirm_started#:#Migrationen har påbörjats. +cert#:#certificate_migration_go#:#Starta migration +cert#:#certificate_migration_lastrun_failed#:#Migreringen av certifikaten har misslyckats. Kan du försöka igen? +cert#:#certificate_no_object_desc#:#Ingen beskrivning tillgänglig +cert#:#certificate_no_object_title#:#Ingen titel tillgänglig +cert#:#certificate_same_not_saved#:#Ingen ny version av certifikatmallen sparades eftersom motsvarande värden inte ändrades. +cert#:#error_creating_certificate_pdf#:#Certifikatet kunde inte skapas. Låt en administratör kontrollera certifikatservern. +cert#:#user_certificates#:#Certifikat +certificate#:#cert_cron_task_desc#:#Uppgiften för detta jobb är att behandla inskrivna inlärningsframgångar för databehandling för och generering av beständiga certifikat för användare vid lärandeobjekt. +certificate#:#cert_cron_task_title#:#Certifikat +certificate#:#cert_form_sec_add_features#:#Ytterligare funktioner +certificate#:#cert_form_sec_availability#:#Tillgänglighet +certificate#:#cert_form_sec_layout#:#Layout och text +certificate#:#certificate_a4#:#A4 (297 mm x 210 mm) +certificate#:#certificate_a4_landscape#:#A4 Quer (210 mm x 297 mm) +certificate#:#certificate_a5#:#A5 (210 mm x 148 mm) +certificate#:#certificate_a5_landscape#:#A5 Quer (148 mm x 210 mm) +certificate#:#certificate_background_image#:#Bakgrundsbild +certificate#:#certificate_card_thumbnail_image#:#Image för kakelsättning +certificate#:#certificate_change_active_status#:#Den aktiva statusen för certifikatet har ändrats +certificate#:#certificate_confirm_deletion_text#:#Vill du verkligen radera certifikatmallen och alla tillhörande data? +certificate#:#certificate_custom#:#Own format... +certificate#:#certificate_edit#:#Skapa/redigera certifikatmall +certificate#:#certificate_error_import#:#Ett fel uppstod under importen av certifikatet! +certificate#:#certificate_error_upload_bgimage#:#Ett fel uppstod vid uppladdningen av bakgrundsbilden! +certificate#:#certificate_export#:#Export +certificate#:#certificate_failed#:#Misslyckad +certificate#:#certificate_file_basename#:#Certifikat +certificate#:#certificate_learning_progress_must_be_active#:#Endast objekt med aktiv inlärningsprocess kan väljas. Inlärningsförloppet är inte aktivt för följande objekt +certificate#:#certificate_letter#:#US Letter (11 tum x 8,5 tum) +certificate#:#certificate_letter_landscape#:#US Letter Landscape (8,5 tum x 11 tum) +certificate#:#certificate_margin_body#:#Kanter för textområdet +certificate#:#certificate_not_well_formed#:#Certifikatets textfil innehåller inte giltig XHTML. Använd giltig XHTML! +certificate#:#certificate_page_format#:#Sidformat +certificate#:#certificate_page_format_info#:#Välkomna att välja standardformat för nya certifikat. +certificate#:#certificate_pageheight#:#Sidans höjd +certificate#:#certificate_pagewidth#:#Sidans bredd +certificate#:#certificate_passed#:#bekräftad +certificate#:#certificate_ph_birthday#:#Deltagarens födelsedag +certificate#:#certificate_ph_city#:#Staden för deltagarens adress +certificate#:#certificate_ph_country#:#Land där deltagaren har sin adress +certificate#:#certificate_ph_date#:#Aktuellt datum +certificate#:#certificate_ph_date_completed#:#Datum för existens +certificate#:#certificate_ph_datetime#:#Aktuellt datum och tid +certificate#:#certificate_ph_datetime_completed#:#Datum och tid för existens +certificate#:#certificate_ph_department#:#Avdelning för deltagaren eller deltagaren +certificate#:#certificate_ph_exercisetitle#:#Titel på övningen +certificate#:#certificate_ph_firstname#:#Förnamn på deltagaren +certificate#:#certificate_ph_fullname#:#Deltagarens namn (titel, förnamn och efternamn) +certificate#:#certificate_ph_institution#:#Institution av deltagaren +certificate#:#certificate_ph_introduction#:#Följande platshållare kan användas +certificate#:#certificate_ph_lastaccess#:#Datum och tid för deltagarens senaste åtkomst +certificate#:#certificate_ph_lastname#:#Efternamn på deltagaren +certificate#:#certificate_ph_login#:#Login namn +certificate#:#certificate_ph_mark#:#Grad uppnådd +certificate#:#certificate_ph_marklong#:#Grad uppnådd (officiell beteckning) +certificate#:#certificate_ph_markshort#:#Grad uppnådd (kort beteckning) +certificate#:#certificate_ph_matriculation#:#Användarens matrikelnummer +certificate#:#certificate_ph_maxpoints#:#Maximalt uppnåelig poäng +certificate#:#certificate_ph_no_sco#:#När material väljs för att fastställa inlärningsframsteg kan titel och poäng också visas i certifikatet. +certificate#:#certificate_ph_passed#:#"godkänd" eller "underkänd", beroende på testresultatet +certificate#:#certificate_ph_passed_exercise#:#"godkänt" eller "underkänt +certificate#:#certificate_ph_resultpercent#:#Total procentandel som uppnåtts av deltagaren +certificate#:#certificate_ph_resultpoints#:#Poäng som uppnåtts av deltagaren +certificate#:#certificate_ph_salutation#:#Adress +certificate#:#certificate_ph_sco_points_max#:#placeholder
för poäng
maximalt +certificate#:#certificate_ph_sco_points_raw#:#Placeholder
för poäng +certificate#:#certificate_ph_sco_points_scaled#:#placeholder
för poäng
i procent +certificate#:#certificate_ph_sco_title#:#placeholder
för titel +certificate#:#certificate_ph_scormmaxpoints#:#Maximalt uppnåelig poäng i den sista SCO där värdet för score.max sattes (t.ex. lämplig för ett slutprov). +certificate#:#certificate_ph_scormpoints#:#Antal poäng i SCORM-inlärningsmodulen i procent +certificate#:#certificate_ph_scormtitle#:#Titel på SCORM-inlärningsmodulen +certificate#:#certificate_ph_scos#:#Följande material valdes ut för att fastställa inlärningsframstegen och finns tillgängligt för information i certifikatet +certificate#:#certificate_ph_street#:#Adressen till deltagaren eller deltagaren +certificate#:#certificate_ph_testtitle#:#Titel på testet +certificate#:#certificate_ph_title#:#Titel på deltagaren eller deltagaren +certificate#:#certificate_ph_title_sco#:#Titel +certificate#:#certificate_ph_zipcode#:#Postnummer för deltagarens adress +certificate#:#certificate_points_notavailable#:#Detta värde kan inte fastställas +certificate#:#certificate_preview#:#Förhandsgranskning +certificate#:#certificate_settings#:#Inställningar för certifikat +certificate#:#certificate_short_name#:#Kort titel för filnamn +certificate#:#certificate_short_name_description#:#Var god ange en kort titel för filnamnet. Den korta titeln används som en del av certifikatets filnamn +certificate#:#certificate_text#:#Text för certifikatet +certificate#:#certificate_text_info#:#Välkomna att ange certifikatets text här. Om WYSIWYG-redigeraren har inaktiverats i ILIAS-administrationen kan du fortfarande använda giltig XHTML för formatering här. +certificate#:#certificate_unit_description#:#Ange alltid mått i formen VALUE[cm|mm|in|pt|pc|px|em], t.ex. 10mm eller 3in +certificate#:#certificate_usage#:#Observera att användning och skapande av certifikat endast är möjligt om du använder ILIAS Java-server. Java-servern konfigureras på administrationens huvudsida i kategorin Webbtjänster och krävs bland annat för generering av PDF-filer. +certificate#:#certificate_var_max_points#:#46 +certificate#:#certificate_var_result_mark_long#:#Bra +certificate#:#certificate_var_result_mark_short#:#2 +certificate#:#certificate_var_result_passed#:#bekräftad +certificate#:#certificate_var_result_percent#:#83% +certificate#:#certificate_var_result_points#:#38 +certificate#:#certificate_var_user_birthday#:#08.05.1977 +certificate#:#certificate_var_user_city#:#Köln +certificate#:#certificate_var_user_country#:#Tyskland +certificate#:#certificate_var_user_department#:#Användarstöd +certificate#:#certificate_var_user_firstname#:#Erika +certificate#:#certificate_var_user_fullname#:#Erika Mustermann +certificate#:#certificate_var_user_institution#:#ILIAS öppen källkod +certificate#:#certificate_var_user_lastname#:#Mönster man +certificate#:#certificate_var_user_login#:#emustermann +certificate#:#certificate_var_user_matriculation#:#12345 +certificate#:#certificate_var_user_salutation#:#Kvinna +certificate#:#certificate_var_user_street#:#Heidestraße 17 +certificate#:#certificate_var_user_title#:#Dr. +certificate#:#certificate_var_user_zipcode#:#51147 +certificate#:#certificate_visibility#:#Synlighet +certificate#:#certificate_visibility_always#:#Alltid synlig +certificate#:#certificate_visibility_introduction#:#Deltagarna erbjuds certifikatet för nedladdning i testresultatvyn. +certificate#:#certificate_visibility_never#:#Inte synlig +certificate#:#certificate_visibility_passed#:#Visas endast om deltagaren har klarat testet. +certificate#:#certificate_visibility_passed_exercise#:#Visas endast om deltagaren har klarat övningen. +certificate#:#cmix_cert_ph_object_description#:#Beskrivning +certificate#:#cmix_cert_ph_object_title#:#Titel för xAPI/cmi5-objektet +certificate#:#cmix_cert_ph_reached_score#:#Score uppnådd i procent +certificate#:#default_background_info#:#Den bakgrundsbild som anges här används som standardbakgrund för alla certifikat om du inte uttryckligen anger en annan bakgrundsbild i certifikatredigeraren. +certificate#:#download_certificate#:#Ladda ner certifikat +certificate#:#learning_progress_deactivated#:#Inlärningsförloppet för detta objekt är inaktiverat. Inlärningsprocessen måste vara aktiverad för att du ska kunna redigera certifikatmallen och erhålla användarcertifikat. +certificate#:#lti_cert_ph_mastery_score#:#Mastery Resultat i procent +certificate#:#lti_cert_ph_object_description#:#Beskrivning +certificate#:#lti_cert_ph_object_title#:#Titel på LTI-konsumentobjektet +certificate#:#lti_cert_ph_reached_score#:#Score uppnådd i procent +certificate#:#persistent_certificate_mode#:#Skapa användarcertifikat +certificate#:#persistent_certificate_mode_cron#:#Cron-jobb +certificate#:#persistent_certificate_mode_cron_info#:#Detta alternativ rekommenderas för system med hög användarinteraktion +certificate#:#persistent_certificate_mode_instant#:#Direkt +certificate#:#persistent_certificate_mode_instant_info#:#Detta alternativ rekommenderas för system med låg till medelhög användarinteraktion. För system som är utsatta för hög belastning under skapandet av certifikat rekommenderas alternativet "Cron Job". +chatroom#:#allow_anonymous#:#Tillåt anonym inloggning +chatroom#:#allow_custom_usernames#:#Fritt valbara chattnamn +chatroom#:#anonymous_hint#:#Observera att för åtkomst av anonyma användare måste motsvarande behörigheter ställas in på fliken "Behörigheter". +chatroom#:#auto_scroll#:#Automatiskt bläddra till slutet +chatroom#:#autogen_usernames#:#Chat-namn för anonymt deltagande +chatroom#:#autogen_usernames_info#:#Icke-registrerade personer får automatiskt ett chattnamn så att de kan urskiljas. Romb ersätts automatiskt med en siffra. +chatroom#:#ban_question#:#Vill du verkligen utesluta användaren från det aktuella chattrummet? +chatroom#:#ban_table_title#:#Förbjudna användare +chatroom#:#banned#:#Du har blivit avstängd från detta chattrum. +chatroom#:#bans#:#Förbjudna användare +chatroom#:#chat_address#:#Adress +chatroom#:#chat_anonymous_not_allowed#:#För att använda chattrummet, logga in. +chatroom#:#chat_auth_token_info#:#Please define here two unique strings that ILIAS uses for authentication in requests to the chat server. Alternativt kan dessa genereras automatiskt när man klickar på knappen. Chatt-servern kan hantera flera ILIAS-klienter, men varje klient behöver ett +chatroom#:#chat_ban#:#Block +chatroom#:#chat_broadcast_typing#:#Visa skrivande i chatten +chatroom#:#chat_broadcast_typing_info#:#Others present in a chat or chat room visas när du börjar skriva ett meddelande. +chatroom#:#chat_connection_disconnected#:#--- #username# har lämnat chattrummet ---. +chatroom#:#chat_connection_established#:#+++ #användarnamn# har kommit in i chattrummet +++ +chatroom#:#chat_create_private_room_button#:#Skapa #Séparée +chatroom#:#chat_deletion_disabled#:#Funktionshindrad +chatroom#:#chat_deletion_interval#:#Intervall +chatroom#:#chat_deletion_interval_info#:#Om markerat raderas meddelanden i magasinschatten och chatten på skärmen om de är äldre än det tröskelvärde som definieras här. +chatroom#:#chat_deletion_interval_run_at#:#Tid +chatroom#:#chat_deletion_interval_run_at_info#:#Ange tiden här i formatet 'HH +chatroom#:#chat_deletion_interval_unit#:#Enhet +chatroom#:#chat_deletion_interval_value#:#Värde +chatroom#:#chat_deletion_ival_max_val#:#Det maximala värdet för den valda enheten '%s' är +chatroom#:#chat_deletion_section_head#:#Radera gamla meddelanden +chatroom#:#chat_enable_history#:#Framsteg +chatroom#:#chat_enable_history_info#:#Everyone kan läsa och exportera publika chattinlägg från tidigare år under fliken "Historik". Inlägg från séparées är endast tillgängliga för användare som var inbjudna dit. +chatroom#:#chat_error_log_info#:#Ange den absoluta sökvägen till den fil (t.ex. /var/www/ilias/data/chat_errors.log) där chatt-servern loggar fel. Om ingen sökväg anges skapas en loggfil i samma katalog som chatt-servern finns i. +chatroom#:#chat_https_cert_info#:#Ange den absoluta serversökvägen till SSL-certifikatet (t.ex. +chatroom#:#chat_https_dhparam_info#:#Ange här den absoluta serversökvägen till en fil (t.ex. +chatroom#:#chat_https_key_info#:#Ange den absoluta serversökvägen till den privata nyckeln (t.ex. +chatroom#:#chat_invitation#:#"[INVITER_NAME]" bjuder in till chattrummet "[ROOM_NAME]" +chatroom#:#chat_invitation_long#:#[SALUTATION][BR][BR]Du har blivit inbjuden till ett chattrum +chatroom#:#chat_invitation_nc_inv_x#:#Du har %s chattinbjudningar. +chatroom#:#chat_invitation_nc_no_inv#:#De har inga chattrum. +chatroom#:#chat_invitation_short#:#Klicka på länken för att komma till chattrummet. +chatroom#:#chat_invitations#:#chat inbjudningar +chatroom#:#chat_invite#:#Inbjudan +chatroom#:#chat_join#:#Ange +chatroom#:#chat_kick#:#Eject +chatroom#:#chat_log_info#:#Ange den absoluta sökvägen till den fil (t.ex. /var/www/ilias/data/chat.log) där chatt-servern loggar allmänna händelser. Om ingen sökväg anges skapas en loggfil i samma katalog som chatt-servern är placerad i. +chatroom#:#chat_log_level#:#Loggnivå +chatroom#:#chat_mainroom#:#huvudrum +chatroom#:#chat_message#:#Meddelande +chatroom#:#chat_message_display#:#Display +chatroom#:#chat_message_options#:#Alternativ +chatroom#:#chat_message_to_all#:#Till alla +chatroom#:#chat_no_use_typing_broadcast#:#Typning visas inte för andra i chatten +chatroom#:#chat_not_use_osc#:#Använder inte chatt på skärmen +chatroom#:#chat_osc_accept_msg#:#Tillåt chatt +chatroom#:#chat_osc_accept_msg_info#:#När den är aktiverad kan andra användare skicka meddelanden till mig via chatten på skärmen. +chatroom#:#chat_osc_accept_msg_info_slate#:#För att kunna använda privata konversationer måste du aktivera inställningarna "Tillåt chatt". +chatroom#:#chat_osc_accept_msg_info_slate_link_txt#:#Synlighet (i "Profil och privatliv) +chatroom#:#chat_osc_accept_no_conv_info_slate#:#Current det finns inga minimerade konversationer. +chatroom#:#chat_osc_accepts_messages_no#:#Tar inte emot chattmeddelanden +chatroom#:#chat_osc_accepts_messages_yes#:#Tar emot chattmeddelanden +chatroom#:#chat_osc_add_user#:#Lägg till fler användare i chatten +chatroom#:#chat_osc_conversations#:#Chatt +chatroom#:#chat_osc_doesnt_accept_msg#:#Chatting inte möjligt +chatroom#:#chat_osc_dont_accept_msg#:#Du kan för närvarande inte bli inbjuden till en chatt av andra personer. Du kan ändra detta i din %s om det behövs. +chatroom#:#chat_osc_dont_accept_msg_link_txt#:#Personliga inställningar +chatroom#:#chat_osc_emoticons#:#emoticons +chatroom#:#chat_osc_head_grp_x_persons#:#%s användare +chatroom#:#chat_osc_invite_to_conversation#:#Lägg till i chatten +chatroom#:#chat_osc_leave_grp_conv#:#Lämna chatten +chatroom#:#chat_osc_minimize#:#Minimera +chatroom#:#chat_osc_nc_conv_x_p#:#Du har %s minimerade chattar. +chatroom#:#chat_osc_nc_conv_x_s#:#Du har en minimerad chatt. +chatroom#:#chat_osc_nc_no_conv#:#Inga chattar tillgängliga +chatroom#:#chat_osc_nc_prop_time#:#Tid +chatroom#:#chat_osc_no_conv#:#Inga chattar tillgängliga. +chatroom#:#chat_osc_no_sub_directory#:#Relativ väg +chatroom#:#chat_osc_no_sub_directory_info#:#Om chattservern är konfigurerad så att den associerade URL-adressen har en subväg av typen "http(s) +chatroom#:#chat_osc_no_usr_found#:#Ingen användare kunde hittas. +chatroom#:#chat_osc_search_modal_info#:#Sök här efter en person som du vill lägga till i chatten. Om du har öppnat sökdialogen i en gruppchatt kommer personen att läggas till i den. Om du har öppnat sökdialogen från en enskild chatt öppnas ett nytt fönster för gruppchatten efter att du har lag +chatroom#:#chat_osc_self_rej_msgs#:#Du kan för närvarande inte delta i chatten eftersom du för närvarande har undertryckt mottagandet av chattmeddelanden i dina inställningar. +chatroom#:#chat_osc_send#:#Skicka +chatroom#:#chat_osc_start_conversation#:#Starta chatt +chatroom#:#chat_osc_subs_rej_msgs#:#Den kontaktade personen vill inte ta emot meddelanden för tillfället. De kan dock återaktivera mottagandet av chattmeddelanden i sina chattinställningar. +chatroom#:#chat_osc_subs_rej_msgs_p#:#Följande personer vill inte ta emot fler meddelanden för tillfället +chatroom#:#chat_osc_sure_to_leave_grp_conv#:#Är du säker på att du vill lämna gruppchatten? +chatroom#:#chat_osc_user#:#Användare +chatroom#:#chat_osc_user_left_grp_conv#:#Användaren '%s' har lämnat gruppchatten. +chatroom#:#chat_osc_write_a_msg#:#Skriv ett meddelande ... +chatroom#:#chat_select_room#:#Välj chattrum +chatroom#:#chat_settings#:#Chat-inställningar +chatroom#:#chat_settings_functions_header#:#Funktioner för chatten +chatroom#:#chat_show_auto_messages#:#Visa automatiska meddelanden +chatroom#:#chat_to_mainroom#:#Till huvudrummet +chatroom#:#chat_use_osc#:#Använder chatt på skärmen +chatroom#:#chat_use_typing_broadcast#:#Typning visas för andra i chatten +chatroom#:#chat_user_action_invite_osd#:#Starta chatt på skärmen +chatroom#:#chat_user_action_invite_public_room#:#Inbjuda till offentligt chattrum +chatroom#:#chat_user_x_is_typing#:#Användaren %s skriver ... +chatroom#:#chat_users_are_typing#:#Flera användare skriver ... +chatroom#:#chat_whisper#:#Viskning +chatroom#:#chatroom_auth#:#Autentisering +chatroom#:#chatroom_auth_btn_txt#:#Generera nyckel +chatroom#:#chatroom_auth_key#:#Autentiseringsnyckel +chatroom#:#chatroom_auth_secret#:#autentiseringshemlighet +chatroom#:#chatroom_client_name#:#Namn +chatroom#:#chatroom_client_name_info#:#Ange ett globalt unikt namn på klienten för registrering på chatt-servern. Initialt används klient-ID här. Om du ändrar detta värde måste chatt-servern startas om. +chatroom#:#chatroom_enable_osc#:#Aktivera #chatt på skärmen +chatroom#:#chatroom_enable_osc_info#:#Skärmchatten är tillgänglig för alla på plattformen. Varje person kan dock själv bestämma om han eller hon vill bli tilltalad av andra. Chattar kan startas via verktyget "Vem är online?". +chatroom#:#chatroom_log#:#Chatserver Loggfil +chatroom#:#chatroom_smiley_keyword#:# nyckelord +chatroom#:#chatserver_address#:#IP-adress/FQN för chatt-servern +chatroom#:#chatserver_port#:#Port för chatt-servern +chatroom#:#chtr_activation_limited_visibility_info#:#Utanför den angivna perioden visas chattrummets titel men inte innehållet. +chatroom#:#chtr_activation_online_info#:#Endast när chatten är online kan användare se och använda chatten. +chatroom#:#chtr_add#:#Chatroom skapa +chatroom#:#chtr_ban_actor_tbl_head#:#blockerad av +chatroom#:#chtr_ban_ts_tbl_head#:#Tid +chatroom#:#chtr_new#:#Skapa nytt chattrum +chatroom#:#chtr_server_status#:#Status för server +chatroom#:#clear_room_history#:#Radera meddelandehistorik +chatroom#:#clear_room_history_question#:#Vill du verkligen radera alla meddelanden i det aktuella rummet? +chatroom#:#client_chatserver_connection#:#Anslutning klient till server +chatroom#:#client_proxy_info#:#Om servern inte kan nås via den aktuella IP-adressen och porten är det möjligt att definiera en alternativ URL för anslutningen mellan klient och server. +chatroom#:#connection_url_info#:#Ange här en URL via vilken servern kan nås. +chatroom#:#create_private_room_text#:#Namn på Séparées +chatroom#:#custom_username#:#Own chat namn +chatroom#:#delete_private_room#:#Radera #Séparée +chatroom#:#delete_private_room_question#:#Ta bort Separée från listan? +chatroom#:#dhparam#:#Diffie-Hellman-parametrar +chatroom#:#display_past_msgs#:#Chat recension +chatroom#:#display_past_msgs_suffix#:#Bidrag +chatroom#:#duration_from#:#Från +chatroom#:#duration_to#:#Till +chatroom#:#enable_smilies#:#Aktivera smileys +chatroom#:#end_whisper#:#Utgång +chatroom#:#enter#:#Delta i chatten +chatroom#:#error_log#:#Chatserver Fel-Logg-fil +chatroom#:#hint_display_past_msgs#:#Antal tidigare inlägg som visas när du går in i chattrummet. Om du anger "0" inaktiveras visningen. +chatroom#:#hint_enable_smilies#:#Om den är aktiverad ersätts konfigurerade textmoduler med en bild. Konfigurationen kan göras på fliken Smilies. +chatroom#:#history_by_day#:#Daglig kurs +chatroom#:#history_by_session#:#Sessionens historia +chatroom#:#history_byday_title#:#Välj tidsperiod +chatroom#:#history_bysession_title#:#Välj session +chatroom#:#history_cleared#:# Meddelandets historik har tagits bort av moderering.###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +chatroom#:#history_title_general#:#Konversationer i chattrummet "%s" +chatroom#:#history_title_private_room#:#Konversationer i separée "%s" +chatroom#:#ilias_chatserver_connection#:#Anslutning ILIAS till servern +chatroom#:#ilias_proxy_info#:#Om servern inte är tillgänglig via den faktiska IP-adressen och porten är det möjligt att definiera en alternativ URL för anslutningen mellan ILIAS och servern. +chatroom#:#invite_to_private_room#:#Inbjuda till aktuellt rum +chatroom#:#invite_username#:#Login namn +chatroom#:#key#:#Nyckel +chatroom#:#kick_question#:#Vill du verkligen sparka ut användaren från det aktuella chattrummet? +chatroom#:#kicked#:#Moderering har tagit bort dig från chatten.###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +chatroom#:#kicked_from_private_room#:#De kastades ut från #titeln# separée. +chatroom#:#leave_private_room#:#Att lämna separationen +chatroom#:#left_private_room#:#Att lämna separationen +chatroom#:#lost_connection#:# Anslutningen till chattservern avbröts. +chatroom#:#main#:#huvudrum +chatroom#:#no_further_users#:#Inga andra användare närvarande +chatroom#:#no_messages#:#Det finns inga meddelanden tillgängliga för den valda perioden. +chatroom#:#no_username_given#:#Välj ett inloggningsnamn! +chatroom#:#obj_chtr#:#chatroom +chatroom#:#osc_browser_noti_no_permission_error#:#Ta bort ILIAS-domänen från listan över blockerade webbplatser i meddelandeinställningarna i din webbläsare eller ditt operativsystem. Annars kommer ILIAS inte att kunna leverera webbläsarmeddelanden. +chatroom#:#osc_browser_noti_no_support_error#:#Browser notifications stöds inte av din nuvarande webbläsare. Kontrollera att du har åtkomst till ILIAS via HTTPS och att din webbläsare är konfigurerad som <a href="https +chatroom#:#osc_browser_noti_req_permission_error#:#Browser notifications kunde inte aktiveras eftersom du har nekat åtkomst i din webbläsare. Ta bort ILIAS-domänen från listan över blockerade webbplatser i meddelandeinställningarna i din webbläsare eller ditt operativsystem. +chatroom#:#osc_enable_browser_notifications_info#:#Om den är aktiverad får du ett webbläsarmeddelande när nya chattar eller chattmeddelanden anländer om mer än %s minut(er) har gått mellan två chattinlägg. Om ILIAS är i bakgrunden och du arbetar i andra webbläsarflikar, eller om webbläsaren är dold, komm +chatroom#:#osc_enable_browser_notifications_label#:#Meddelanden från webbläsaren +chatroom#:#osc_noti_title#:#Nytt chattmeddelande +chatroom#:#period#:#Tidsperiod +chatroom#:#permissions#:#Rättigheter +chatroom#:#preferred_chatname#:#Wanted name###Ny introducerad variabel i samband med jämställdhetsintegrering för ILIAS 8 +chatroom#:#private_room_closed#:#Rummet #title# har stängts. +chatroom#:#private_room_entered#:#Välkommen till Séparée #title#. +chatroom#:#private_room_entered_user#:#Användaren #username# har gått in i separée #title#. +chatroom#:#private_room_left#:#Användaren #user# har lämnat separée #title#. +chatroom#:#private_rooms_enabled#:#Aktivera #Séparées +chatroom#:#private_rooms_enabled_info#:#Om aktiverat kan användare skapa séparées som endast inbjudna användare har tillgång till. +chatroom#:#public_chat_created#:#Ett nytt offentligt chattrum har skapats i tidningen. +chatroom#:#scope#:#Rum/Séparée +chatroom#:#select_custom_username#:#Visat namn i chatten +chatroom#:#server_further_information#:# Mer information om hur du konfigurerar servern finns i filen readme. +chatroom#:#session#:#Session +chatroom#:#settings_general#:#Allmänt +chatroom#:#settings_title#:#Chat-inställningar +chatroom#:#speak_to#:#Adress ##användare +chatroom#:#unable_to_connect#:#Anslutningen till chattservern kunde inte upprättas. +chatroom#:#unban#:#Lås upp +chatroom#:#user_in_ilias#:#Sök och bjud in användare i ILIAS +chatroom#:#user_in_room#:#Bjud in #Users i det aktuella chattrummet +chatroom#:#user_invited#:#Användaren har blivit inbjuden. +chatroom#:#user_invited_self#:#Du har blivit inbjuden till #room# av #user#. +chatroom#:#user_kicked#:#Användaren #user# har sparkats ut från chattrummet. +chatroom#:#users#:#Användare +chatroom#:#welcome_to_chat#:#Välkommen till chattrummet +chatroom#:#whisper_to#:###användare# viskning +chatroom_adm#:#chat_cannot_connect_to_server#:#ILIAS kan inte upprätta en socket-anslutning till chatt-servern. +chatroom_adm#:#chat_enabled#:#Aktivera chatt +chatroom_adm#:#chat_smilies_dir_not_exists#:#Katalogen #Smilies finns inte. +chatroom_adm#:#chat_smilies_initialized#:#Chat smilies har initierats +chatroom_adm#:#chatroom_add_smiley#:#Lägg till #Smiley +chatroom_adm#:#chatroom_available_smilies#:#Tillgängliga smilies +chatroom_adm#:#chatroom_confirm_delete_smiley#:#Är du säker på att du vill ta bort den markerade smiley? +chatroom_adm#:#chatroom_current_smiley_image#:#Aktuell smiley +chatroom_adm#:#chatroom_current_smiley_image_path#:#Aktuell smiley +chatroom_adm#:#chatroom_delete_selected#:# Ta bort markerade smilies +chatroom_adm#:#chatroom_edit_smiley#:#Redigera smiley +chatroom_adm#:#chatroom_image_path#:#Vägen till Smiley +chatroom_adm#:#chatroom_smiley_image#:#Smiley +chatroom_adm#:#chatroom_smiley_image_only_if_changed#:#Välj endast en ny smiley om den nuvarande smiley ska ersättas med en ny. +chatroom_adm#:#chatroom_smiley_keywords#:#platshållare +chatroom_adm#:#chatroom_smiley_keywords_one_per_line_note#:#En platshållare per rad +chatroom_adm#:#chatroom_upload_smiley#:#Ladda upp #Smiley +chatroom_adm#:#chatserver_settings_title#:#Chat-server +chatroom_adm#:#client_settings#:#Allmänna inställningar +chatroom_adm#:#general_settings_title#:#Generella chattinställningar +chatroom_adm#:#https#:#HTTPS +chatroom_adm#:#osc_adm_browser_noti_info#:#Om den är aktiverad kan användarna bestämma om de vill få en webbläsarnotifiering för nya konversationer och meddelanden. Dessa levereras sedan när a) användaren är aktiv i andra webbläsarflikar eller webbläsaren är dold och ILIAS är i bakgrunden, eller +chatroom_adm#:#osc_adm_browser_noti_label#:#Meddelanden från webbläsaren +chatroom_adm#:#osc_adm_conv_idle_state_threshold_info#:#Definiera här den minsta tid mellan två inkommande chattmeddelanden som måste förflyta för att en webbläsarmeddelande om ett nytt chattmeddelande ska levereras när ILIAS är i förgrunden. +chatroom_adm#:#osc_adm_conv_idle_state_threshold_label#:#Tid mellan meddelanden +chatroom_adm#:#port_info#:#Sällan använda portar blockeras ofta av brandväggar eller proxyservrar. Användare kan inte ansluta till chatt-servern med sin webbläsare om den angivna porten inte är öppen. +chatroom_adm#:#protocol#:#Protokoll +chatroom_adm#:#public_chat_permissions#:#Publikt chattrum +chatroom_adm#:#public_chat_settings#:#Publikt chattrum +chatroom_adm#:#server_settings#:#Inställningar för chatt-server +chatroom_adm#:#settings_has_been_saved#:#Inställningarna har sparats. +chatroom_adm#:#smiley#:#Smilies +classification#:#clsfct_back_to_cat#:#Tillbaka till kategorin +classification#:#clsfct_block_info#:#Ditt urval filtrerar objekten. +classification#:#clsfct_block_title#:#Urval enligt teman +classification#:#clsfct_content_no_match#:#Inga objekt hittades för de valda kriterierna. +classification#:#clsfct_content_title#:#Objekt som matchar ditt urval. +classification#:#clsfct_selected_objects#:#Utvalda objekt +cmix#:#achieved_info#:#Successfully bring about or achieve a desired goal, level or result through effort, skill or courage. +cmix#:#achieved_label#:#Uttalanden med verbet "uppnått +cmix#:#activity_id#:#Aktivitets-ID +cmix#:#activity_id_info#:#Detta ID behövs för att visa data från LRS i ILIAS. Du kommer att få detta ID från den organisation som erbjuder denna resurs.###Modifierad som en del av jämställdhetsintegreringsverksamheten för ILIAS 8 +cmix#:#answered_info#:#Ett svar gavs på en fråga - där objektet i allmänhet är en aktivitet som representerar frågan. Texten till svaret ingår ofta i svaret inom resultatet. +cmix#:#answered_label#:#Statements med verbet "svarade +cmix#:#btn_change_registration#:#Skicka +cmix#:#btn_create_lrs_type#:#Lägg till #LRS-typ +cmix#:#btn_create_registration#:#Skicka +cmix#:#change_registration#:#E-postadress för registrering +cmix#:#cmix_add#:#Skapa xAPI/cmi5-objekt +cmix#:#cmix_add_cmi5_lm#:#cmi5 utbildningsmodul +cmix#:#cmix_add_cmi5_lm_info#:#Detta alternativ ska användas om innehållet är en utbildningsmodul som uppfyller kraven i cmi5. Relaterade funktioner som lämpliga rapporter är tillgängliga utan ytterligare konfiguration. +cmix#:#cmix_add_lrs_type#:#LRS typ +cmix#:#cmix_add_source#:#Källa +cmix#:#cmix_add_source_external_app#:#Resource not started by ILIAS +cmix#:#cmix_add_source_external_app_info#:#Använd detta alternativ för separat lanserade resurser som appar eller simuleringar. Användare måste samtycka till hämtning av data genom att ange den e-postadress de använder. +cmix#:#cmix_add_source_local_dir#:#Lokal katalog +cmix#:#cmix_add_source_local_dir_info#:#Använd detta alternativ för innehållspaket på din lokala enhet. +cmix#:#cmix_add_source_upload_dir#:#Ladda upp katalog +cmix#:#cmix_add_source_upload_dir_info#:#Använd detta alternativ för innehållspaket som redan har laddats upp till ILIAS uppladdningskatalog som även används för SCORM- och HTML-paket. +cmix#:#cmix_add_source_upload_select#:#--- Vänligen välj --- +cmix#:#cmix_add_source_url#:#URL för resursen +cmix#:#cmix_add_source_url_info#:#Använd detta alternativ för en extern resurs. +cmix#:#cmix_add_xapi_standard_object#:#xAPI standardobjekt +cmix#:#cmix_add_xapi_standard_object_info#:#Använd detta alternativ för att få en generisk innehållsmodul som tillhandahåller alla funktioner, t.ex. olika rapporter. Detta alternativ ger största möjliga flexibilitet, men kräver en mer komplex konfiguration. +cmix#:#cmix_adlnetgov_expapi_verbs_answered#:#Besvarad +cmix#:#cmix_adlnetgov_expapi_verbs_asked#:#Frågade +cmix#:#cmix_adlnetgov_expapi_verbs_attempted#:#Försökt +cmix#:#cmix_adlnetgov_expapi_verbs_attended#:#Närvarande +cmix#:#cmix_adlnetgov_expapi_verbs_commented#:#Kommenterad +cmix#:#cmix_adlnetgov_expapi_verbs_completed#:#Fullbordad +cmix#:#cmix_adlnetgov_expapi_verbs_exited#:#Exalterad +cmix#:#cmix_adlnetgov_expapi_verbs_experienced#:#Erfaren +cmix#:#cmix_adlnetgov_expapi_verbs_failed#:#Misslyckad +cmix#:#cmix_adlnetgov_expapi_verbs_imported#:#Importerad +cmix#:#cmix_adlnetgov_expapi_verbs_initialized#:#Initialiserad +cmix#:#cmix_adlnetgov_expapi_verbs_interacted#:#Interagerad +cmix#:#cmix_adlnetgov_expapi_verbs_launched#:#Lanserad +cmix#:#cmix_adlnetgov_expapi_verbs_mastered#:#Mastered +cmix#:#cmix_adlnetgov_expapi_verbs_passed#:#Genomförd +cmix#:#cmix_adlnetgov_expapi_verbs_preferred#:#Preferred +cmix#:#cmix_adlnetgov_expapi_verbs_progressed#:#Framsteg +cmix#:#cmix_adlnetgov_expapi_verbs_registered#:#Registrerad +cmix#:#cmix_adlnetgov_expapi_verbs_responded#:#Svarade +cmix#:#cmix_adlnetgov_expapi_verbs_resumed#:# Återupptagen +cmix#:#cmix_adlnetgov_expapi_verbs_scored#:#Scored +cmix#:#cmix_adlnetgov_expapi_verbs_shared#:#Delad +cmix#:#cmix_adlnetgov_expapi_verbs_suspended#:#Suspenderad +cmix#:#cmix_adlnetgov_expapi_verbs_terminated#:#Terminerad +cmix#:#cmix_adlnetgov_expapi_verbs_voided#:#Voided +cmix#:#cmix_all_verbs#:#Alla verb +cmix#:#cmix_copy#:#Kopiera xAPI/cmi5-objekt +cmix#:#cmix_import#:#Importera xAPI/cmi5-objekt +cmix#:#cmix_indication_to_user#:#Ytterligare anmärkningar om denna LRS +cmix#:#cmix_info_external_lrs_info#:#Denna Learning Record Store (LRS) är en extern LRS. En extern LRS kännetecknas av att operatören av ILIAS-installationen har otillräckligt inflytande på LRS. Detta är t.ex. fallet om det inte finns några rättigheter att radera data. +cmix#:#cmix_info_external_lrs_label#:#Ytterligare information om denna LRS +cmix#:#cmix_info_privacy_section#:#Information om personuppgifter +cmix#:#cmix_info_privacy_section_launch#:#Information om de personuppgifter som överförs vid start +cmix#:#cmix_lrs_type#:#Lärande skivbutik (LRS) +cmix#:#cmix_new#:#Skapa nytt xAPI/cmi5-objekt +cmix#:#completed_info#:#Aktiviteten har avslutats eller slutförts på ett normalt sätt. +cmix#:#completed_label#:#Uttalanden med verbet "avslutad +cmix#:#conf_availability#:#Tillgänglighet +cmix#:#conf_availability_0#:#inte tillgänglig +cmix#:#conf_availability_1#:#för befintliga objekt +cmix#:#conf_availability_2#:#för nya och befintliga objekt +cmix#:#conf_bypass_proxy#:#Erkännande av framsteg i inlärningen +cmix#:#conf_bypass_proxy_disabled#:#xAPI proxy för att hämta data omedelbart. +cmix#:#conf_bypass_proxy_enabled#:#CronJob för att söka i Learning Record Store +cmix#:#conf_bypass_proxy_info#:#I de flesta fall rekommenderas att xAPI-proxyn används. Använd CronJob om det finns resurs- eller serverbegränsningar. +cmix#:#conf_cronjob_neccessary#:#CronJob nödvändigt för lärande framsteg +cmix#:#conf_cronjob_neccessary_info#:#Genom att aktivera detta alternativ kan de xAPI-objekt som använder denna LRS-typ inte använda xAPI-proxyn, som ger omedelbara data för att upptäcka inlärningsförloppet. Använd endast CronJob om det finns resurs- eller serverbegränsningar. +cmix#:#conf_description#:#Beskrivning +cmix#:#conf_external_lrs#:#Extern dyslexi +cmix#:#conf_keep_lp#:#Undvik försämring av inlärningsförmågan +cmix#:#conf_keep_lp_info#:#Statusen "bearbetad" för ILIAS inlärningsframsteg är fryst. +cmix#:#conf_launch_mode#:#Starta läge +cmix#:#conf_launch_mode_browse#:#Endast förhandsgranskning ('browse') utan att spara inlärningsresultat +cmix#:#conf_launch_mode_browse_info#:#Detta alternativ är avsett att tillåta användaren att "titta runt" utan klassificering. +cmix#:#conf_launch_mode_normal#:#Normal +cmix#:#conf_launch_mode_normal_info#:#Data relaterade till inlärningsresultat bör samlas in. +cmix#:#conf_launch_mode_review#:#Review-läge utan att spara inlärningsförloppet +cmix#:#conf_launch_mode_review_info#:#Detta alternativ gör det möjligt för användaren att "återbesöka/granska" material som redan har slutförts. +cmix#:#conf_lrs_endpoint#:#Slutpunkt +cmix#:#conf_lrs_key#:#Nyckel / Inloggning +cmix#:#conf_lrs_secret#:#Secret / Lösenord +cmix#:#conf_mastery_score#:#Mastery Resultat +cmix#:#conf_mastery_score_info#:#Detta värde skickas till inlärningsmodulen cmi5 vid start för att fastställa de poäng som krävs för godkänt. Om ett högre (eller lika) värde erhålls, skall inlärningsmodulen sända statusen "godkänd". +cmix#:#conf_new_window#:#Nytt fönster +cmix#:#conf_new_window_info#:#Innehållet öppnas i ett nytt fönster. När du lämnar innehållet stängs det här fönstret. +cmix#:#conf_own_window#:#Samma fönster +cmix#:#conf_own_window_info#:#Innehållet öppnas i samma fönster och ersätter ILIAS-skärmen. När användaren lämnar innehållet återgår han/hon till ILIAS. +cmix#:#conf_privacy_comment_default#:#Visa till användaren +cmix#:#conf_privacy_ident#:#Identifiering av användare +cmix#:#conf_privacy_ident_il_uuid_ext_account#:#Externt användar-ID kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +cmix#:#conf_privacy_ident_il_uuid_ext_account_info#:#Detta är identiskt med varje samtal, men kan göra det möjligt att dra en direkt slutsats om användaren. +cmix#:#conf_privacy_ident_il_uuid_login#:#ILIAS-inloggning kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +cmix#:#conf_privacy_ident_il_uuid_login_info#:#Sänder inloggningsnamnet. Detta är identiskt med varje anrop, men kan göra det möjligt att dra direkta slutsatser om ILIAS-användaren. +cmix#:#conf_privacy_ident_il_uuid_random#:#Random ID kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +cmix#:#conf_privacy_ident_il_uuid_random_info#:#Ett slumpmässigt ID genereras för varje ILIAS-objekt och ILIAS-användare, som förblir identiskt för varje anrop. Slutsatser om en användare är mycket begränsade, eftersom användarprofiler för flera objekt i praktiken inte kan skapas. +cmix#:#conf_privacy_ident_il_uuid_sha256#:#Hash kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +cmix#:#conf_privacy_ident_il_uuid_sha256_info#:#Detta är identiskt med varje samtal, men tillåter inte direkta slutsatser om ILIAS-användaren. +cmix#:#conf_privacy_ident_il_uuid_sha256url#:#Hash kombinerat med ILIAS-domänen formaterad som en e-postadress +cmix#:#conf_privacy_ident_il_uuid_sha256url_info#:#Detta är identiskt med varje anrop, med högst 80 tecken betydligt kortare än varianten med ILIAS-plattformens ID och tillåter endast mycket begränsade slutsatser om ILIAS-användaren. +cmix#:#conf_privacy_ident_il_uuid_user_id#:#ILIAS användar-ID kombinerat med ett unikt ILIAS plattforms-ID formaterat som en e-postadress. +cmix#:#conf_privacy_ident_il_uuid_user_id_info#:#Sänder det interna numeriska användar-ID:t. Detta är identiskt för varje anrop, men gör det möjligt att dra slutsatser om ILIAS-användaren. +cmix#:#conf_privacy_ident_info#:#Standard är ofta e-postadressen. Det unika ILIAS-plattforms-ID:t är +cmix#:#conf_privacy_ident_real_email#:#E-postadress +cmix#:#conf_privacy_ident_real_email_info#:#Skickar användarens e-postadress som identifiering (Attention +cmix#:#conf_privacy_name#:#Login namn +cmix#:#conf_privacy_name_firstname#:#Förnamn +cmix#:#conf_privacy_name_firstname_info#:#Skickar förnamnet +cmix#:#conf_privacy_name_fullname#:#Fullständigt namn +cmix#:#conf_privacy_name_fullname_info#:#Skickar titel, förnamn och efternamn. +cmix#:#conf_privacy_name_info#:#Att skicka ett inloggningsnamn är vanligtvis inte nödvändigt. +cmix#:#conf_privacy_name_lastname#:#Titel och efternamn +cmix#:#conf_privacy_name_lastname_info#:#Sänder Mr eller Mrs (om inget annat anges) och efternamnet. +cmix#:#conf_privacy_name_none#:#Ingen +cmix#:#conf_privacy_name_none_info#:#Skickar '-' istället för ett namn +cmix#:#conf_privacy_setting_conf#:#Alternativ för konfiguration +cmix#:#conf_privacy_setting_default#:#Förvalda inställningar, kan ändras för objekt +cmix#:#conf_privacy_setting_force#:#Inställningarna kan inte ändras för objekt. +cmix#:#conf_privacy_setting_info#:#Konfigurationsalternativ för sekretessinställningarna +cmix#:#conf_remarks#:#Interna kommentarer +cmix#:#conf_switch_to_review#:#Växla till granskningsläge +cmix#:#conf_switch_to_review_info#:#När cmi5-lärmodulen har bearbetats framgångsrikt (status satisfied) startas lärmodulen i granskningsläge nästa gång den anropas. +cmix#:#conf_title#:#Titel +cmix#:#conf_user_ident#:#Identifiering av användare +cmix#:#conf_user_ident_il_uuid_ext_account#:#Externt användar-ID kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +cmix#:#conf_user_ident_il_uuid_ext_account_info#:#Detta är identiskt med varje samtal, men kan göra det möjligt att dra en direkt slutsats om användaren. +cmix#:#conf_user_ident_il_uuid_login#:#ILIAS-inloggning kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +cmix#:#conf_user_ident_il_uuid_login_info#:#Detta är identiskt för varje samtal, men kan möjliggöra en direkt hänvisning till ILIAS-användaren. +cmix#:#conf_user_ident_il_uuid_random#:#Random ID kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +cmix#:#conf_user_ident_il_uuid_random_info#:#Ett slumpmässigt ID genereras för varje ILIAS-objekt och ILIAS-användare, som förblir identiskt för varje anrop. Slutsatser om en användare är mycket begränsade, eftersom användarprofiler för flera objekt i praktiken inte kan skapas. +cmix#:#conf_user_ident_il_uuid_user_id#:#ILIAS användar-ID kombinerat med ett unikt ILIAS plattforms-ID formaterat som en e-postadress. +cmix#:#conf_user_ident_il_uuid_user_id_info#:#Detta är identiskt med varje samtal, men tillåter inte direkta slutsatser om ILIAS-användaren. +cmix#:#conf_user_ident_info#:#Standard är ofta e-postadressen. Det unika ILIAS-plattforms-ID:t är +cmix#:#conf_user_ident_real_email#:#E-postadress +cmix#:#conf_user_ident_real_email_info#:#Skickar användarens e-postadress som identifiering (Attention +cmix#:#conf_user_name#:#Login namn +cmix#:#conf_user_name_firstname#:#Förnamn +cmix#:#conf_user_name_firstname_info#:#Skickar förnamnet +cmix#:#conf_user_name_fullname#:#Fullständigt namn +cmix#:#conf_user_name_fullname_info#:#Skickar titel, förnamn och efternamn. +cmix#:#conf_user_name_info#:#Att skicka ett inloggningsnamn är vanligtvis inte nödvändigt. +cmix#:#conf_user_name_lastname#:#Titel och efternamn +cmix#:#conf_user_name_lastname_info#:#Sänder Mr eller Mrs (om inget annat anges) och efternamnet. +cmix#:#conf_user_name_none#:#Ingen +cmix#:#conf_user_name_none_info#:#Skickar '-' istället för ett namn +cmix#:#conf_user_registered_mail#:#Registrerad e-postadress +cmix#:#content_privacy_ident#:#Identifiering av användare +cmix#:#content_privacy_name#:#Login namn +cmix#:#create_lrs_type_form#:#Ny typ av dyslexi +cmix#:#create_registration#:#Registrera din e-postadress +cmix#:#cron_xapi_results_evaluation#:#xAPI/cmi5 Få resultat +cmix#:#cron_xapi_results_evaluation_desc#:#Frågar efter alla xAPI-resultat från Learning Record Store för objekt som inte stöder ILIAS xAPI-proxy. +cmix#:#description_info#:#Beskrivningen visas under titeln. +cmix#:#download_certificate#:#Ladda ner certifikat +cmix#:#duration_info#:#Varaktigheten kan registreras t.ex. för att besvara en uppgift. Varaktigheten 'duration' sätts till standardvärdet 0 sekunder (PT00.000S) med detta alternativ. +cmix#:#duration_label#:#Tidens varaktighet 'varaktighet +cmix#:#edit_lrs_type_form#:#LRS typ +cmix#:#failed_info#:#Aktiviteten har inte genomförts med godkänt resultat på en förutbestämd nivå. +cmix#:#failed_label#:#Uttalanden med verbet "misslyckades +cmix#:#fetch_xapi_statements#:#Hämta resultat från Learning Record Store +cmix#:#field_user_ident#:#E-postadress +cmix#:#field_user_ident_info#:# Ange den e-postadress som används i den externa applikationen för att identifiera dig. +cmix#:#form_change_registration#:#Registrering +cmix#:#form_create_registration#:#Registrering +cmix#:#hide_data_info#:#Med detta alternativ, som endast är tillgängligt för ILIAS LRS-proxyn, lagras vissa data i uttalanden med oigenkännliga värden i Learning Record Store. +cmix#:#hide_data_label#:#Blacken data +cmix#:#highscore_achieved_ts#:#Datum +cmix#:#highscore_achieved_ts_description#:#En kolumn med datumet ingår i rankingen. +cmix#:#highscore_all_tables#:#Egen rankning och leaderboard +cmix#:#highscore_all_tables_description#:#Visar både en tabell med din egen ranking och en tabell med de bästa rankingarna. +cmix#:#highscore_description#:#Namnen på andra användare kan visas om höger 'Visa andra användares inlärningserfarenheter' är inställd. +cmix#:#highscore_enabled#:#Placeringar +cmix#:#highscore_mode#:#Mode +cmix#:#highscore_own_table#:#Deltagarens egen rangordning +cmix#:#highscore_own_table_description#:#Deltagarna visas i en tabell med sin rangordning inom alla placeringar. +cmix#:#highscore_percentage#:#Procent +cmix#:#highscore_percentage_description#:#En kolumn med poängen i procent ingår i rankingen. +cmix#:#highscore_score#:#Score +cmix#:#highscore_score_description#:#En kolumn med poängen ingår i rankingen. +cmix#:#highscore_top_num#:#Bästa listlängd +cmix#:#highscore_top_num_description#:#Bestämmer hur många poster som visas i topplistan. +cmix#:#highscore_top_num_unit#:#Placeringar +cmix#:#highscore_top_table#:#Bästalista +cmix#:#highscore_top_table_description#:#Deltagarna kommer att få se en tabell med de bästa placeringarna. +cmix#:#highscore_wtime#:#Varaktighet +cmix#:#highscore_wtime_description#:#En kolumn med varaktigheten ingår i rankningen. +cmix#:#info_availability#:#Därmed kan du styra tillgängligheten för LRS-typen i magasinet. Alla typer kan ställas in på "för befintliga objekt" istället för att raderas. +cmix#:#info_description#:#Den här beskrivningen visas när du väljer typ för nya objekt. +cmix#:#info_external_lrs#:#När det gäller en extern Learning Record Store (LRS) visas en notering för användaren. En extern LRS kännetecknas av otillräckligt inflytande på LRS och av ILIAS-operatören. Detta är fallet när det inte finns några rättigheter att radera. +cmix#:#info_lrs_endpoint#:#URL för slutpunkten utan '/' i slutet av sidan +cmix#:#info_lrs_key#:#Nyckel eller inloggning för åtkomst, t.ex. 12345 +cmix#:#info_lrs_secret#:#Shared Secret / Lösenord +cmix#:#info_privacy_comment_default#:#Ange vid behov ytterligare information om datasäkerhet vid användning av denna LRS. +cmix#:#info_remarks#:#Här kan du registrera dina kommentarer om denna typ av LRS. +cmix#:#info_title#:#Den här titeln visas när du väljer typ för nya objekt. +cmix#:#initialized_info#:#Aktiviteten har startats framgångsrikt. +cmix#:#initialized_label#:#Uttalanden med verbet 'initialiserade +cmix#:#launch_options#:#Alternativ för lanseringen +cmix#:#launch_url#:#URL för resursen +cmix#:#launch_url_info#:#Ange internetadressen här och lägg till http +cmix#:#log_options#:#Alternativ för visning av överförda data +cmix#:#lrs_authentication#:#Autentisering +cmix#:#no_substatements_info#:#Med detta alternativ, som endast är tillgängligt för ILIAS LRS-proxyn, kan lagringen av underordnade påståenden undertryckas. Detta kan till exempel påverka svaren på enskilda frågor i ett test. Innehållet informeras om att uttalandena skulle ha sparats. +cmix#:#no_substatements_label#:#Spara inte underliggande uttalanden +cmix#:#online_info#:#Detta gör objektet synligt och användbart för användarna. +cmix#:#only_moveon_info#:#Detta alternativ är endast tillgängligt för ILIAS LRS proxy! Endast uttalanden med definierade verb lagras i Learning Record Store (WhiteList).
Resursen ges intrycket att alla uttalanden har sparats av LRS. Detta säkerställer vanligtvis möjligheten +cmix#:#only_moveon_label#:#Spara endast data om framgångsrik inlärning +cmix#:#passed_info#:#Aktiviteten har godkänts med en förutbestämd nivå av tillfredsställelse. +cmix#:#passed_label#:#Statements med verbet "passerade +cmix#:#privacy_options#:#Alternativ för dataskydd +cmix#:#progressed_info#:#Identifierar ett värde som anger hur långt en aktivitet har fortskridit eller hur någon har gått igenom en aktivitet.###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +cmix#:#progressed_label#:#Uttalanden med verbet "framsteg +cmix#:#registration_saved_successfully#:#Registrering framgångsrikt sparad +cmix#:#satisfied_info#:#Indikerar att kriterierna för objektet eller aktiviteten har uppfyllts. +cmix#:#satisfied_label#:#Statements med verbet "nöjd +cmix#:#sect_learning_progress_options#:#Alternativ för lärande framsteg +cmix#:#show_debug#:#Visa upp erfarenheter av lärande +cmix#:#show_debug_info#:#Andra användares erfarenheter av lärande kan visas om höger 'Visa andra användares erfarenheter av lärande' är inställd. +cmix#:#tab_export#:#Export +cmix#:#tab_info#:#Info +cmix#:#tab_lrs_types#:#LRS-typer +cmix#:#tab_scoring#:#Placeringar +cmix#:#tab_settings#:#Inställningar +cmix#:#tab_statements#:#lärandeerfarenheter +cmix#:#tbl_action_raw_data#:#Visa rådata +cmix#:#tbl_lrs_type_availability#:#Tillgänglighet +cmix#:#tbl_lrs_type_title#:#Titel +cmix#:#tbl_lrs_type_usages#:#Antal användningar +cmix#:#tbl_lrs_types_header#:#LRS-typer +cmix#:#tbl_statements_actor#:#Användare +cmix#:#tbl_statements_date#:#Datum +cmix#:#tbl_statements_object#:#Objekt +cmix#:#tbl_statements_verb#:#Verb +cmix#:#terminated_info#:#Aktiviteten har slutförts framgångsrikt. +cmix#:#terminated_label#:#Uttalanden med verbet "avslutad +cmix#:#timestamp_info#:#Tidstämpeln identifierar tidpunkten för en åtgärd som identifieras av uttalandet. Tidsstämpeln sätts med detta alternativ till standardvärdet 01.01.1970 (1970-01-01T00). +cmix#:#timestamp_label#:#Timestamp 'timestamp' +cmix#:#title_info#:#Ge objektet en titel. +cmix#:#toplist_top_n_results#:#Bästalista +cmix#:#toplist_your_result#:#Own rank +cmix#:#type_cmi5#:#cmi5 utbildningsmodul +cmix#:#type_generic#:#xAPI standardobjekt +cmix#:#use_fetch#:#Auktorisering genom hämtning av URL +cmix#:#use_fetch_info#:#Så länge resursen stöder det här alternativet bör du använda det här alternativet för att öka datasäkerheten. +cmix#:#xapi_statements_fetched_successfully#:#Resultat från Learning Record Store har hämtats framgångsrikt. +cmix#:#xapi_statements_last_fetch_date#:#Sista hämtning av resultat +cmix#:#xapi_statements_not_fetched_yet#:#Resultaten från Learning Record Store har ännu inte hämtats. +cmps#:#cmps_activate#:#Aktivera +cmps#:#cmps_active#:#Aktiv +cmps#:#cmps_add_new_rank#:#Position i urvalslistan för objekt som ska läggas till +cmps#:#cmps_available#:#Tillgänglig +cmps#:#cmps_available_version#:#Tillgänglig version +cmps#:#cmps_basic_files#:#Basisfiler +cmps#:#cmps_class_file#:# Klassfil +cmps#:#cmps_component#:#Komponent +cmps#:#cmps_configure#:#Konfigurera +cmps#:#cmps_current_db_version#:#Aktuell DB-version +cmps#:#cmps_current_version#:#Aktuell version +cmps#:#cmps_database#:#Databas +cmps#:#cmps_db_update#:#Script för uppdatering av databas +cmps#:#cmps_deactivate#:#Avaktivera +cmps#:#cmps_detailed_information#:#Detaljerad information +cmps#:#cmps_dir#:#Directory +cmps#:#cmps_enable_creation#:#Starta skapandet +cmps#:#cmps_file_version#:#Uppdatera filversion +cmps#:#cmps_group#:#Grupp +cmps#:#cmps_id#:#ID +cmps#:#cmps_ilias_max_version#:#Maximal ILIAS-version +cmps#:#cmps_ilias_min_version#:#Minsta ILIAS-version +cmps#:#cmps_inactive#:#Inaktiv +cmps#:#cmps_install#:#Installera +cmps#:#cmps_is_active#:#Aktiverad +cmps#:#cmps_is_installed#:#Installerad +cmps#:#cmps_lang_files#:#Språkfil +cmps#:#cmps_lang_prefix#:#Prefix språkvariabel +cmps#:#cmps_languages#:#Språk +cmps#:#cmps_main_dir#:#Huvudkatalog +cmps#:#cmps_missing#:#Saknad +cmps#:#cmps_module#:#Modul +cmps#:#cmps_must_installed#:#Komponenten måste vara installerad. +cmps#:#cmps_name#:#Namn +cmps#:#cmps_needs_matching_ilias_version#:#Detta plugin kan inte användas med den aktuella versionen av denna ILIAS-installation. +cmps#:#cmps_needs_newer_ilias_version#:#Detta plugin kan endast användas med en nyare ILIAS-version. Vänligen uppdatera din ILIAS-version. +cmps#:#cmps_needs_newer_plugin_version#:#Den här ILIAS-versionen kräver en nyare plugin-version. Vänligen uppdatera pluginet. +cmps#:#cmps_needs_update#:#Uppdatering nödvändig +cmps#:#cmps_needs_upgrade#:#Den nuvarande installerade plugin-versionen är äldre än den tidigare installerade. Vänligen installera det senaste pluginet. +cmps#:#cmps_no_db_update_file_available#:#Inget skript för uppdatering av databas tillgängligt +cmps#:#cmps_no_language_file_available#:#Ingen språkfil tillgänglig +cmps#:#cmps_plugin#:#Plugin +cmps#:#cmps_plugin_activated#:#Insticksprogrammet har aktiverats. +cmps#:#cmps_plugin_db_prefixes#:#Prefixar databastabell +cmps#:#cmps_plugin_deactivated#:#Insticksprogrammet har avaktiverats. +cmps#:#cmps_plugin_deinstalled#:#Insticksprogrammet har avinstallerats +cmps#:#cmps_plugin_file#:#Plugin-fil +cmps#:#cmps_plugin_lang_prefixes#:#Plugin språk prefix +cmps#:#cmps_plugin_slot#:#Plugin-plats +cmps#:#cmps_plugin_uninstalled#:#Alla språk och databasposter relaterade till pluginet har tagits bort och pluginet har avaktiverats. Du kan nu ta bort katalogen och källkoden för insticksprogrammet från katalogen "Customizing" för att slutligen avinstallera insticksprogrammet. +cmps#:#cmps_plugin_updated#:#Insticksprogrammet har uppdaterats +cmps#:#cmps_plugins#:#Plugins +cmps#:#cmps_refresh#:#Reload språk +cmps#:#cmps_refresh_lng#:#Språk uppdaterat +cmps#:#cmps_rep_object#:#Objekttyp i tidningen +cmps#:#cmps_repository_object_types#:#Objekttyper i tidningen +cmps#:#cmps_responsible#:#Ansvarsfull +cmps#:#cmps_responsible_mail#:#Mail (ansvarig person) +cmps#:#cmps_save_options#:#Spara +cmps#:#cmps_service#:#Tjänst +cmps#:#cmps_show_details#:#Visa detaljer +cmps#:#cmps_slots#:#Slots +cmps#:#cmps_status#:#Status +cmps#:#cmps_supports_cli_setup#:#Stödjer CLI-installation +cmps#:#cmps_supports_export#:#Stödd export +cmps#:#cmps_supports_learning_progress#:#Stödjer framsteg i inlärningen +cmps#:#cmps_uninstall#:#Avinstallera +cmps#:#cmps_uninstall_confirm#:#Vill du verkligen avinstallera insticksprogrammet "%s" och ta bort alla tillhörande databasposter? +cmps#:#cmps_uninstall_inactive_confirm#:#Insticksprogrammet "%1$s" kan för närvarande inte aktiveras ("%2$s"). I denna status kan plugins inte avinstalleras helt. Eftersom endast systemintegrationen tas bort kan data som ägs av plugin finnas kvar. Vill du fortsätta med den partiella avinstallat +cmps#:#cmps_update#:#Uppdatera +cmps#:#cmps_version#:#Version +cmps#:#database_is_uptodate#:#Databasen är uppdaterad. +cmps#:#no_changes#:#Inga förändringar +cmxv#:#cmxv_create#:#Skapa certifikat för xAPI/cmi5-objekt +cmxv#:#cmxv_create_info#:#Välj ett slutfört xAPI/cmi5-objekt för att generera ett certifikat för det. +cntr#:#cntr_add_new_item#:#Lägg till nytt objekt +cntr#:#cntr_adopt_content#:#Ta över innehåll +cntr#:#cntr_container_only_on_their_own#:#Kategorier, kurser, grupper, mappar, inlärningssekvenser och studieprogram kan endast kopieras individuellt. Välj endast ett sådant objekt. +cntr#:#cntr_copy_crs_grp#:#Val av medlemskap +cntr#:#cntr_copy_repo_tree#:#Urval magasin träd +cntr#:#cntr_hide_title_and_icon#:# Visa inte titel och ikon +cntr#:#cntr_manage#:#Hantering +cntr#:#cntr_ordering#:#Sortera +cntr#:#cntr_saved_sorting#:#Sortering sparad +cntr#:#cntr_switch_to_new_editor_cmd#:#Byt till innehållet nedan. Gammalt innehåll kommer att raderas. +cntr#:#cntr_switch_to_new_editor_message#:#Detta är standardredigeraren för sidor. Om du vill använda den måste du lägga till innehållet genom att klicka på platshållarna nedan. Om du klickar på länken nedan kommer innehållet nedan att användas för att visa sidan. +cntr#:#cntr_switched_editor#:#Konverterad till ny representation +cntr#:#cntr_tax_list_info#:#Alla taxonomier som har definierats för detta objekt listas nedan. +cntr#:#cntr_tax_none_available#:#Det finns inga tillgängliga taxonomier. +cntr#:#cntr_taxonomy_definitions#:#Definition av taxonomi +cntr#:#cntr_taxonomy_show_sideblock#:#Visa taxonomi i sidblocket +cntr#:#cntr_taxonomy_sideblock_settings#:#Inställningar för presentation +cntr#:#cntr_text_media_editor#:#Design sida +cntr#:#cntr_view_by_type#:#Grupperade efter typ +cntr#:#cntr_view_info_by_type#:#Alla objekt av en viss typ visas i en separat lista. +cntr#:#cntr_view_info_sessions#:#Sessioner visas i sin egen lista. Objekt som inte är tilldelade sessioner listas nedan. +cntr#:#cntr_view_info_simple#:#Alla objekt visas i en enda lista. +cntr#:#cntr_view_sessions#:#Session vy +cntr#:#cntr_view_simple#:#Enkel lista +cntr#:#cont_custom_icon#:#Adapterad ikon +cntr#:#container_import_zip_file_invalid#:#Den uppladdade filen är inte en giltig ILIAS exportfil. För att ladda upp katalogstrukturer, använd ett filobjekt. +cntr#:#edit_questions#:#Redigera frågor +cntr#:#exc_next_deadline_single#:#Tidsfrist för leverans +cntr#:#msg_no_downloadable_objects#:#Inga nedladdningsbara objekt hittades. +cntr#:#objects_duplicated#:#Objekten har kopierats. +cntr#:#prtf_create_portfolio_from_template#:#Skapa portfölj från mall +cntr#:#sorting_new_items_at_bottom#:#Botten +cntr#:#sorting_new_items_at_top#:#Topp +cntr#:#sorting_new_items_direction#:#Inriktning +cntr#:#sorting_new_items_order#:#Beställ +cntr#:#sorting_new_items_position#:#Insätt nya objekt +cntr#:#tab_back_to_repository#:#Tillbaka till tidningen +common#:#HH#:#SS +common#:#absolute_path#:#Absolut väg +common#:#accept_usr_agreement#:#Accepting the use agreement? +common#:#accept_usr_agreement_btn#:#Agree +common#:#accept_usr_agreement_intro#:#Det finns nya användarvillkor tillgängliga. Du måste acceptera dem innan du kan fortsätta använda ILIAS. Läs följande dokument noggrant och ange om du samtycker eller inte längst ner på sidan. +common#:#access#:#Tillgång +common#:#accessFree#:#Ta bort tidsbegränsningen för åtkomst +common#:#accessRestrict#:#Begränsa åtkomst +common#:#access_expired#:#expired +common#:#access_free_granted#:# Aktivera obegränsad åtkomst för de valda användarna. +common#:#access_from#:#Åtkomst från +common#:#access_public#:#Offentlig +common#:#access_restricted#:#Inaktivera obegränsad åtkomst för de valda användarna. +common#:#access_scope#:#Tillgång +common#:#access_unlimited#:#obegränsad +common#:#access_until#:#Tillfällig tillgång +common#:#access_users#:#Inloggade användare +common#:#accesscount_registered_users#:#Läst av användare (antal) +common#:#accessibility_control_concept#:#Info om tillgänglighet +common#:#account#:#Mitt konto +common#:#account_expires_body#:#Ditt konto %s på ILIAS-installationen %s upphör att gälla den %s. Efter detta datum kommer det inte längre att vara möjligt att komma åt ILIAS med detta konto. För att skydda dina personliga dokument och certifikat, ladda ner dem i tid. +common#:#account_expires_subject#:#Ditt ILIAS-konto är på väg att gå ut! +common#:#action#:#Åtgärder +common#:#action_aborted#:#Aktion avbruten +common#:#actions#:#Åtgärder +common#:#actions_for#:#Aktioner för %s +common#:#activate#:#Aktivera +common#:#activate_assessment_logging#:#Aktivera loggning av test och bedömning +common#:#activate_https#:#Aktivera HTTPS (inloggning) +common#:#activate_tracking#:#Aktivera spårning +common#:#activation#:#Tillgänglighet +common#:#active#:#Aktiv +common#:#add#:#Add +common#:#add_condition#:#Skapa nytt förhandsvillkor +common#:#add_entry#:#Anmäl dig +common#:#add_member#:#Lägg till medlem +common#:#add_member_role#:#Lägg till medlemsroll +common#:#add_new_user_defined_field#:#Skapa nytt anpassat fält +common#:#add_note#:#Lägg till anteckning +common#:#add_parameter#:#Ny parameter +common#:#add_remove_edit_entries_of_main_menu#:#Lägg till, ta bort eller redigera objekt i huvudmenyn +common#:#add_role#:#Lägg till roll +common#:#add_translation#:#Lägg till översättning +common#:#add_user#:#Lägg till lokal användare +common#:#add_user_defined_field#:#Skapa nytt fält +common#:#added_new_condition#:#En ny förutsättning skapades. +common#:#additional_info#:#Ytterligare information +common#:#address#:#Adress +common#:#admin_force_noti#:#Notifiering aktiv +common#:#administrate_users#:#Lokala konton +common#:#administrate_users_headline#:#Lokala ILIAS-konton i denna kategori +common#:#administration#:#Administration +common#:#administrator#:#Administratör +common#:#adopt#:#Takeover +common#:#advanced_editing_allow_html_tags#:#Tillåt den valda HTML-markeringen i textfält +common#:#advanced_editing_assessment_settings#:# Tillåtna HTML-markeringar för test- och utvärderingsverktyget +common#:#advanced_editing_frm_post_settings#:#Inställningar Foruminlägg +common#:#advanced_editing_rep_page_editing#:#Aktivera redigering av sidor i tidningen +common#:#advanced_editing_rep_page_editing_desc#:#Med den här funktionen kan du lägga till text och media till en kategori, mapp och innehållssidor för kurser och grupper. Om funktionen avaktiveras kommer redan befintliga texter/media inte längre att visas. +common#:#advanced_editing_required_tags#:#Följande HTML-markeringar är obligatoriska för detta område +common#:#advanced_editing_survey_settings#:#Tillåten HTML-markering för enkätverktyget +common#:#adve_assessment_settings#:#Inställningar för test och bedömning +common#:#adve_frm_post_settings#:#Inlägg i forumet +common#:#adve_general_settings#:#Allmänna inställningar +common#:#adve_survey_settings#:#Inställningar för undersökningar +common#:#agree_date#:# Överenskommet om +common#:#all#:#Alla +common#:#all_global_roles#:#Globala roller +common#:#all_local_roles#:#Lokala roller (alla) +common#:#all_objects#:#Alla objekt +common#:#all_roles#:#Alla roller +common#:#all_topics#:#Alla ämnen +common#:#all_users#:#Alla användare +common#:#allow_assign_users#:#Tillåt användartilldelning för lokala administratörer +common#:#allow_override_alert#:#Reglerna i .htaccess-filen kan inte utvärderas. +common#:#allow_register#:#Tillgänglig i registreringsformuläret +common#:#allow_user_toggle_noti#:#Medlem kan avaktivera avisering +common#:#already_delivered_files#:#Filer redan inlämnade +common#:#and#:#och +common#:#angry#:#Angry +common#:#anonymous#:#Anonym +common#:#answers#:#Svar +common#:#any_language#:#Alla språk +common#:#apache_auth#:#Logga in via Apache-autentisering +common#:#application_completed#:#Tillträde har begärts. +common#:#application_date#:#Datum för ansökan +common#:#applications#:#Tillämpningar +common#:#apply#:#Takeover +common#:#apply_filter#:#Applicera filter +common#:#appointment#:#Datum +common#:#approve_date#:#Släppt på +common#:#approve_recipient#:#E-postavisering för (inloggnings-ID) +common#:#archive#:#Arkiv +common#:#archive_broken#:#Arkivet verkar vara skadat eller tomt. +common#:#are_you_sure#:#Är du säker? +common#:#ass_log_admin#:#Administration av loggdata +common#:#ass_log_count_datasets#:#Protokollposter +common#:#ass_log_delete_entries#:#Radera loggposter +common#:#ass_log_delete_no_selection#:#Välj minst ett test vars loggposter du vill radera! +common#:#ass_log_deleted#:#Loggposterna för de utvalda testerna har raderats! +common#:#ass_log_output#:#Utmatning av loggdata +common#:#assessment_imap_line_color#:#Imagemap linjefärg +common#:#assessment_log#:#Logga in test- och utvärderingsaktiviteter under en angiven tidsperiod. +common#:#assessment_log_datetime#:#Datum/Tid +common#:#assessment_log_deleted#:#Alla loggade data för testet raderades via administrationsgränssnittet. +common#:#assessment_log_for_test#:#För testet +common#:#assessment_log_log_entries#:#Protokollposter +common#:#assessment_log_logging#:#Protokolluppgifter +common#:#assessment_log_manual_scoring_activate#:#Aktivera manuell bedömning för +common#:#assessment_log_manual_scoring_desc#:#Alla frågor av den valda frågetypen kan poängsättas manuellt. Uppmärksamhet +common#:#assessment_log_question#:#Fråga +common#:#assessment_log_text#:#Protokollinmatning +common#:#assessment_settings_reporting_language#:#Språk för loggning +common#:#assf_allowed_questiontypes#:#Tillgängliga frågetyper +common#:#assf_allowed_questiontypes_desc#:#Alla valda frågetyper kommer att vara tillgängliga för denna ILIAS-installation. Om du vill förhindra skapandet av vissa frågetyper måste du avmarkera dessa frågetyper. +common#:#assf_questiontypes#:#Inställningar för frågor +common#:#assign#:#Assign +common#:#assign_global_role#:#Att tilldelas en global roll +common#:#assign_local_role#:# Tilldela lokal roll +common#:#assigned_members#:#Tilldelade deltagare +common#:#assigned_roles#:#Tilldelade roller +common#:#associated_user#:#Medlem +common#:#astounded#:#Förvånad +common#:#at_least_one_style#:#Minst en stil måste vara aktiverad. +common#:#attachment#:#Tillägg +common#:#attachments#:#Attachments +common#:#attempts#:#Prövningar +common#:#auth_active_roles#:#Tillgängliga globala roller på registreringsformuläret +common#:#auth_allow_local#:#Tillåt lokal autentisering +common#:#auth_cas#:#CAS +common#:#auth_cas_allow_local_desc#:#Tillåter personer med CAS-konton att logga in med sitt lokala ILIAS-inloggningsnamn och lösenord. +common#:#auth_cas_auth#:#Konfigurera CAS-autentisering +common#:#auth_cas_auth_desc#:#CAS kräver PHP 4.3.1 eller senare med stöd för CURL (7.5 eller senare) +common#:#auth_cas_port_desc#:#Till exempel "443" för en CAS-server URI "https +common#:#auth_cas_server_desc#:#Till exempel "auth.yourserver.com" för en CAS-server URI "https +common#:#auth_cas_uri_desc#:#Lokal URI, t.ex. "cas" för en CAS-server URI "https +common#:#auth_configure#:#konfigurera... +common#:#auth_create_users#:#Automatiskt skapa användare som ännu inte har registrerats. +common#:#auth_default#:#Standardinställning +common#:#auth_default_mode_changed_to#:#Standard autentiseringsläge ändrat till +common#:#auth_ecs#:#ECS +common#:#auth_ldap#:#LDAP +common#:#auth_ldap_enable#:#Aktivera LDAP-stöd +common#:#auth_ldap_migration#:#Migrering av konto +common#:#auth_ldap_migration_info#:#Aktivera den här inställningen för att tillåta nya användare att byta befintliga ILIAS-inloggningskonton till LDAP-autentisering. +common#:#auth_local#:#ILIAS Auth +common#:#auth_login_instructions#:#Instruktioner på inloggningsskärmen +common#:#auth_mode#:#Autentiseringsläge +common#:#auth_mode_not_changed#:#(Ingen förändring) +common#:#auth_mode_roles_changed#:#Autentiseringsläge ändrat för den här rollen +common#:#auth_new_account_mail_desc#:#Mail för nya användare. +common#:#auth_per_default#:#standardvärde +common#:#auth_remark_non_local_auth#:#För alla autentiseringsmetoder som inte använder ILIAS-databasen kan inloggningsnamn och lösenord inte längre ändras. +common#:#auth_role_auth_mode#:#Autentiseringsmetod +common#:#auth_saml#:#SAML +common#:#auth_script#:#Användare definierad +common#:#auth_select#:#Välj autentiseringsmetod +common#:#auth_selection#:#Typ av registrering +common#:#auth_settings#:#Inställningar +common#:#auth_shib#:#Shibboleth +common#:#auth_shib_instructions#:#Läs anvisningarna (README) om hur du konfigurerar Shibboleth-stödet för ILIAS. +common#:#auth_shib_not_configured#:#Shibboleth har ännu inte ställts in +common#:#auth_shibboleth#:#Shibboleth +common#:#auth_soap#:#SOAP +common#:#auth_soap_allow_local_desc#:#Tillåter personer med SOAP-konton att autentisera/logga in med sitt lokala ILIAS-inloggningsnamn och lösenord. +common#:#auth_soap_auth#:#Konfigurera SOAP-autentisering +common#:#auth_soap_auth_desc#:#Dessa inställningar påverkar endast den SOAP-baserade användarautentiseringen, men inte ILIAS SOAP-gränssnitt. +common#:#auth_soap_create_users_desc#:#Automatiskt skapar ett ILIAS-konto för personer som har autentiserats mot SOAP men ännu inte har ett ILIAS-konto. +common#:#auth_soap_namespace#:#Namnrymd +common#:#auth_soap_namespace_desc#:#Enligt definition i WSDL. Måste anges om .NET SOAP-stil används. +common#:#auth_soap_port_desc#:#Till exempel "8080" om SOAP-serverns absoluta URI är http +common#:#auth_soap_server_desc#:#Till exempel "auth.yourserver.com" om den absoluta URI:n för SOAP-servern är http +common#:#auth_soap_settings_saved#:#Sparade inställningar för SOAP-autentisering! +common#:#auth_soap_uri_desc#:#Lokal URI, t.ex. "dir/server.php", om den absoluta SOAP-serverns URI är http +common#:#auth_soap_use_dotnet#:#Använd .NET SOAP-stil +common#:#auth_soap_use_https#:#Använd HTTPS +common#:#auth_soap_user_default_role_desc#:#Den här rollen ges till användare som autentiserats mot SOAP. +common#:#auth_user_default_role#:#Standardroll +common#:#authenticate_ilias#:#Logga in direkt via ILIAS-databasen +common#:#authentication_settings#:#Autentisering +common#:#author#:#Författare +common#:#authoring_mode#:#Författarläge +common#:#authors#:#Författare +common#:#autocomplete_more#:#Mer +common#:#available#:#Tillgänglig +common#:#awra#:#Vem är online? +common#:#back#:#Tillbaka +common#:#back_to_course#:#Tillbaka till kursen +common#:#back_to_crs_content#:#Tillbaka till kursinnehållet +common#:#back_to_fold_content#:#Tillbaka till innehållet i mappen +common#:#back_to_grp_content#:#Tillbaka till innehållet i gruppen +common#:#backto_lua#:#Tillbaka till lokala konton +common#:#basedn#:#BaseDN +common#:#basic_settings#:#Grundläggande inställningar +common#:#before#:#före +common#:#behind#:#Efter +common#:#benchmark#:#Benchmark +common#:#benchmarks#:#Benchmarks +common#:#bib_data#:#Bibliografiska uppgifter +common#:#bibl_add#:#Skapa litteraturlista +common#:#birthday#:#Födelsedag +common#:#bkm_import#:#Importera bokmärken +common#:#bkm_import_ok#:#%d bokmärken och %d bokmärkesmappar importerades framgångsrikt. +common#:#bkm_sendmail#:#Skicka som bilaga +common#:#block#:#Blockera +common#:#bm#:#Bokmärke +common#:#bm_add_to_ilias#:#Lägg till ILIAS bokmärken +common#:#bmf#:#Bokmärk mappen +common#:#bold#:#Fet stil +common#:#bookings#:#Beställningar +common#:#bookmark_added#:#Bokmärke har skapats! +common#:#bookmark_folder_new#:#Ny bokmärkesmapp +common#:#bookmark_new#:#Lägg till Bokmärke +common#:#bookmark_target#:#Mål +common#:#bookmarks#:#Bokmärken +common#:#bookmarks_of#:#Bokmärken från +common#:#breadcrumb_navigation#:#Breadcrumb-navigering +common#:#breadcrumbs_aria_label#:#Brödsmulor +common#:#briefcase#:#Bakgrundsprocesser +common#:#btn_add#:#Add +common#:#btn_back#:#Tillbaka +common#:#btn_next#:#Fortsättning +common#:#btn_previous#:#Tillbaka +common#:#btn_remove_system#:#Ta bort från systemet +common#:#btn_undelete#:#Restaurera +common#:#buddy_allow_to_contact_me_no#:#Tar inte emot kontaktförfrågningar +common#:#buddy_allow_to_contact_me_yes#:#Tar emot förfrågningar om kontakt +common#:#building_export_file#:# Skapa exportfil... +common#:#by#:#genomgång +common#:#bytes#:#Bytes +common#:#cal_from#:#Från +common#:#cal_until#:#Till +common#:#calendar#:#Kalender +common#:#cancel#:#Avbryt +common#:#cancel_file_upload#:#Vill du avbryta uppladdningen av de väntande filerna? +common#:#cannot_find_xml#:#Kan inte hitta en XML-fil. +common#:#cannot_uninstall_language_in_use#:#Du kan inte avinstallera ett språk som används för närvarande! +common#:#cannot_uninstall_systemlanguage#:#Du kan inte avinstallera systemspråket. +common#:#cannot_unzip_file#:#Kan inte packa upp den uppladdade filen. +common#:#cant_deactivate_if_users_assigned#:#Du kan inte avaktivera en stil om användare fortfarande är tilldelade den. +common#:#cat#:#Kategori +common#:#cat_add#:#Skapa kategori +common#:#cat_added#:#Kategori skapad +common#:#cat_copy_threads_info#:#Välj vilka material i kategorin som ska kopieras, länkas eller utelämnas från kopieringsprocessen. +common#:#cat_edit#:#Inställningar för kategorier +common#:#cat_new#:#Skapa ny kategori +common#:#cat_wizard_page#:#Kopieringskategori (steg 2/2) +common#:#categories#:#Kategorier +common#:#categories_imported#:#Kategoriimport slutförd. +common#:#catr#:#Kategorilänk +common#:#catr_add#:#Skapa kategorilänk +common#:#catr_edit_info#:#Vänligen välj den kategori för vilken du vill skapa en länk. +common#:#catr_new#:#Skapa ny kategorilänk +common#:#catr_settings#:#Inställningar för kategorilänkar +common#:#certificate#:#Certifikat +common#:#certificate_file_already_exists_error#:#Certifikatfilen finns redan i filsystemet. +common#:#certificate_file_input_output_error#:#Certifikatfilen hittades i filsystemet men kunde inte tas bort på grund av fel. Kontakta din administratör. +common#:#certificate_file_not_found_error#:#Certifikatfilen hittades inte längre i filsystemet. +common#:#certificate_persistent_option#:#Certifikat från läranderesultaten +common#:#certificate_selection#:#Intygens ursprung +common#:#certificate_workspace_option#:#Intyg från personliga resurser +common#:#certificates#:#Certifikat +common#:#change#:#Förändring +common#:#change_assignment#:#Ändra uppdrag +common#:#change_header_title#:#Redigera rubrik för installation +common#:#change_owner#:#Save###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +common#:#change_sort_direction#:#Ändra sorteringsriktning +common#:#changeable#:#Kan ändras av användaren själv i profilen +common#:#changed_to#:#ändrad till +common#:#changing_loginname_not_possible_info#:#Du ändrade senast ditt inloggningsnamn den %s. Nästa ändring kan endast göras på %s. +common#:#chapter#:#Kapitel +common#:#characters#:#karaktärer +common#:#chat_enter_public_room#:#Publik chatt +common#:#chat_enter_public_room_tooltip#:#Gå in i det offentliga chattrummet. +common#:#chat_invite_public_room#:#Publikt chattrum +common#:#chat_invite_public_room_tooltip#:#Inbjuda till det offentliga chattrummet. +common#:#chat_users_active#:#Aktiva användare +common#:#check#:#Test +common#:#check_all#:#Välj alla +common#:#check_langfile#:#Var god kontrollera språkfilen! +common#:#check_languages#:#Kontrollera alla språk +common#:#check_link#:#Kontrollera externa länkar +common#:#check_link_desc#:#Om den är påslagen kontrolleras alla ILIAS inlärningsmoduler för ogiltiga externa länkar. +common#:#check_user_accounts#:#Kontrollera ILIAS-konton +common#:#check_user_accounts_desc#:#Personer vars ILIAS-konton är tidsbegränsade kommer att informeras via e-post två veckor före tidsfristen att deras konto är på väg att löpa ut. Dessutom raderar cronjobbet alla ILIAS-konton för vilka bekräftelselänken i e-postmeddelandet inte klickades +common#:#check_web_resources#:#Kontrollera Webblänkar +common#:#check_web_resources_desc#:#Om den är påslagen kontrolleras alla webblänkar för ogiltiga externa länkar och inaktiveras vid behov. +common#:#checked#:#Vald +common#:#checked_files#:#Omportabla filer +common#:#chg_ilias_and_webfolder_password#:#Ändra lösenord för webbmapp +common#:#chg_ilias_password#:#Ändra #ILIAS lösenord +common#:#chg_password#:#Ändra lösenord +common#:#choose_language#:#Välj ditt språk! +common#:#choose_only_one_language#:#Välj endast ett språk! +common#:#chown_warning#:#Åtgärd! Om du ändrar posten kan den här personen förlora alla åtkomsträttigheter till objektet.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +common#:#chta_edit_permission#:#Ändra inställningar för rättigheter +common#:#chta_read#:#Läsa åtkomst till administration av chattrum +common#:#chta_visible#:#Chatroom administration synlig +common#:#chta_write#:#Redigera chatroom administration +common#:#chtr_copy#:#Kopiera chattrum +common#:#chtr_import#:#Chattrum för import +common#:#city#:#Plats +common#:#cld_abandoned#:#Tyvärr är molnobjektet inte längre tillgängligt i kärnan med ILIAS 8. Kontakta din systemadministratör. Inga data har raderats. +common#:#cleaned_file#:#Filen har rengjorts. +common#:#cleaning_failed#:#Viruset kunde inte tas bort från filen. +common#:#clear#:#Avbryt +common#:#clear_clipboard#:#Klart klippbord +common#:#client#:#Klient +common#:#client_id#:#Klient-ID +common#:#client_ip#:#Klient-IP +common#:#clientlist_available_clients#:#Urval av kunder +common#:#clientlist_clientlist#:#Urval av kunder +common#:#clientlist_installation_name#:#Kunder +common#:#clientlist_login#:#Logga in +common#:#clientlist_login_page#:#Logga in +common#:#clientlist_public_access#:#Offentligt område +common#:#clientlist_start_page#:#Offentligt område +common#:#clipboard#:#Klipptavla +common#:#close#:#Stäng +common#:#cmix#:#Objekt xAPI/cmi5 +common#:#cnt_new#:#(%s Ny) +common#:#collapse#:#Fold i +common#:#collapse_all#:#Vik ihop dem alla +common#:#collapse_content#:#Kollapsa innehåll +common#:#collapsed#:#Stängd +common#:#columns#:#Kolumner +common#:#comma_separated#:# Kommatecken separerade +common#:#comment#:#Kommentar +common#:#comments#:#Kommentarer +common#:#compose#:#Skapa +common#:#concurrent_uploads#:#Antal samtidiga uppladdningar +common#:#concurrent_uploads_info#:#Ställer in antalet filer som laddas upp samtidigt per process. +common#:#cond_ref_handling#:#Inställningar för länkar +common#:#cond_ref_shared#:#Lika förutsättningar för alla länkar +common#:#cond_ref_unique#:#Olika förutsättningar för länkar +common#:#condition#:#Kondition +common#:#condition_accredited_or_passed#:#Ackrediterad eller godkänd +common#:#condition_already_assigned#:#Detta objekt har redan tilldelats. +common#:#condition_circle_created#:#Den här tilldelningen är inte möjlig eftersom objekten skulle vara beroende av varandra +common#:#condition_deleted#:#Förutsättningen har tagits bort. +common#:#condition_finished#:#Färdig +common#:#condition_not_finished#:#Inte färdig +common#:#condition_passed#:#Bekräftad +common#:#condition_select_object#:#Välj det objekt som ska användas för förhandsvillkoret. +common#:#conditions_updated#:#Villkoren har sparats. +common#:#confirm#:#Bekräfta +common#:#confirm_delete_parameter#:#Vill du verkligen ta bort parametern? +common#:#confirmation#:#Bekräfta åtgärd +common#:#conflict_handling#:#Konflikthantering +common#:#cont_iim_content_popups_info#:#Content pop-ups visas när användare klickar på de interaktiva delarna av den underliggande basbilden. På den här sidan definierar du bara popup-fönstren. Deras innehåll redigeras på huvudsidan. +common#:#cont_iim_create_info#:#Ladda upp den underliggande bildfilen för den interaktiva bilden. +common#:#cont_iim_overlay_info#:#En overlay-bild visas när användaren flyttar muspekaren över det definierade området i den underliggande bilden. Du tilldelar respektive overlay-bild till det tillhörande triggerområdet på fliken "Trigger" efter uppladdningen. +common#:#contact#:#Kontakt +common#:#contact_data#:#Kontaktuppgifter +common#:#contact_sysadmin#:#Kontakta teknisk support +common#:#container#:#Container +common#:#container_no_items#:#Inga objekt hittades +common#:#content#:#Innehåll +common#:#content_frame#:#Frame Innehåll +common#:#content_styles#:#Stilar för innehåll +common#:#context#:#Kontext +common#:#continue#:#Fortsättning +common#:#continue_work#:#Fortsättning +common#:#contra#:#Contra +common#:#copy#:#Kopia +common#:#copyChapter#:#Kopia +common#:#copyPage#:#Kopia +common#:#copy_all#:#Kopiera alla +common#:#copy_n_of_suffix#:#- Kopie (%1$s) +common#:#copy_of#:#Kopia från +common#:#copy_of_suffix#:#- Kopia +common#:#copy_selected_items#:#Kopia +common#:#count#:#Nummer +common#:#country#:#Land +common#:#country_free_text#:#Country (fri text) +common#:#country_selection#:#Land (urvalslista) +common#:#course#:#Kurs +common#:#courses#:#Kurser +common#:#create#:#Skapa +common#:#create_date#:#Skapad på +common#:#create_export_file#:#Skapa exportfil +common#:#create_stylesheet#:#Skapa Stil +common#:#created#:#Skapad på +common#:#cron_forum_notification#:#Skicka Forums-aviseringar +common#:#cron_forum_notification_crob_desc#:#Om aktiverat skickar ILIAS dagliga meddelanden till användare som vill bli meddelade om nya och ändrade inlägg i utvalda forum eller forumämnen. Vänligen observera +common#:#cron_forum_notification_desc#:#Om aktiverat skickar ILIAS e-postmeddelanden till de användare som vill bli meddelade om nya inlägg i utvalda forumämnen. +common#:#cron_jobs#:#Cron jobb +common#:#cron_lucene_index#:#Uppdatera Lucene sökindex +common#:#cron_lucene_index_info#:#Om den är påslagen uppdateras sökindexet för Lucene. Konfigurera Lucene-servern i förväg i administrationen under "Sök och hitta " Sök", flik "Lucene". +common#:#cron_mail_notification#:#Skicka e-postaviseringar för nya meddelanden +common#:#cron_mail_notification_cron#:#Regelbundet via cron-jobb +common#:#cron_mail_notification_desc#:#ILIAS skickar e-postmeddelanden om nya e-postmeddelanden på begäran. I motsats till omedelbar vidarebefordran av alla e-postmeddelanden samlar detta cronjob in e-postmeddelanden från en dag och levererar dem som ett paket. Aktivera alternativet '%s' för +common#:#cron_mail_notification_message#:#Mail innehåll som en del av e-postmeddelandet +common#:#cron_mail_notification_message_info#:#E-postmeddelanden innehåller det fullständiga innehållet i de e-postmeddelanden som tas emot i ILIAS. Detta innebär att de kan läsas utan att behöva logga in igen. +common#:#cron_mail_notification_never#:#Nie +common#:#cron_users_without_login_del_create_date_thr#:#Tröskelvärde +common#:#cron_users_without_login_del_create_date_thr_info#:#Alla inloggningskonton som skapats för längre sedan än det tröskelvärde som definieras här kommer att övervägas för radering. +common#:#cron_users_without_login_del_role_whitelist#:#Roller som beaktas +common#:#cron_users_without_login_del_role_whitelist_info#:#Endast användare med en av de valda globala rollerna kommer att raderas. Om en användare har en av de icke-valda rollerna kommer ILIAS-kontot att fortsätta att existera. +common#:#cronjob_last_start#:#Sista start av cron-jobbet +common#:#cronjob_last_start_unknown#:#Kan inte fastställas +common#:#crs#:#Kurs +common#:#crs_activation_start_invalid#:#Start- och slutdatum är inte giltiga. +common#:#crs_add#:#Skapa kurs +common#:#crs_added#:#Kurs skapad +common#:#crs_archives#:#Arkiv +common#:#crs_cancel_waiting_list#:#Är du säker på att du vill avregistrera dig från väntelistan för kursen "%s"? +common#:#crs_copy_threads_info#:#Välj vilka kursmaterial som ska kopieras, länkas eller utelämnas från kopieringsprocessen. +common#:#crs_edit#:#Kursinställningar +common#:#crs_list_reg#:#Registrering +common#:#crs_list_reg_end#:#Filing slut +common#:#crs_list_reg_limit_full#:#Inga lediga platser tillgängliga +common#:#crs_list_reg_limit_places#:#Fria platser +common#:#crs_list_reg_noreg#:#Ingen registrering möjlig +common#:#crs_list_reg_period#:#Ansökningsperiod +common#:#crs_list_reg_start#:#Registrering börjar +common#:#crs_member_not_passed#:#Misslyckad +common#:#crs_member_passed#:#Bekräftad +common#:#crs_members_gallery#:#Medlemmarnas galleri +common#:#crs_new#:#Skapa ny kurs +common#:#crs_removed_from_waiting_list#:#Du har tagits bort från väntelistan för kursen "%s". +common#:#crs_status_blocked#:#[Åtkomst blockerad] +common#:#crs_status_pending#:#[Begäran behandlas] +common#:#crs_subscribers_assigned#:#En ny användare har lagts till. +common#:#crs_title#:#Kursens titel +common#:#crs_unsubscribe#:#Avbryt medlemskap i kursen +common#:#crs_wizard_page#:#Kopiera kurs (steg 2/2) +common#:#crsr#:#Kurslänk +common#:#crsr_add#:#Skapa kurslänk +common#:#crsr_edit_info#:#Välj den kurs som du vill skapa en länk för. +common#:#crsr_new#:#Create ny kurslänk +common#:#crsr_settings#:#Inställningar för kurslänk +common#:#csv_export#:#CSV export +common#:#current_ip#:#Aktuell IP +common#:#current_ip_alert#:#Varning +common#:#current_password#:#Aktuellt lösenord +common#:#current_user_avatar#:#Din profilbild +common#:#currently_used_disk_space#:#Aktuell minnesförbrukning +common#:#cut#:#Cutting out +common#:#cutPage#:#Cutting out +common#:#daily#:#Dagligen +common#:#database#:#Databas +common#:#database_version#:#Din databasversion +common#:#dataset#:#inträde +common#:#date#:#Datum +common#:#dateplaner#:#Kalender +common#:#day#:#Tag +common#:#days#:#dagar +common#:#db_host#:#Databasens värd +common#:#db_name#:#Databasens namn +common#:#db_pass#:#Lösenord för databas +common#:#db_type#:#Typ av databas +common#:#db_user#:#Databasanvändare +common#:#db_version#:#Version av databas +common#:#dd_mm_yyyy#:#DD.MM.ÅÅÅÅ +common#:#deactivate#:#Avaktivera +common#:#decrease_attempts#:#Antal försök - 1 +common#:#def_repository_view#:#Standardvy för magasin +common#:#default#:#Standard +common#:#default_auth_mode#:#Förvald autentiseringsmetod +common#:#default_auth_mode_info#:#Du kan här ange vilken autentiseringsmetod som är förvald på inloggningssidan. +common#:#default_language#:#Standardspråk +common#:#default_perm_settings#:#rättigheter standardvärden +common#:#default_role#:#Standardroll +common#:#default_roles#:#Standardroller +common#:#default_skin#:#Standard användargränssnitt +common#:#default_skin_style#:#Standard hud/stil +common#:#default_style#:#Standard formatmall +common#:#defaults#:#Standardinställningar +common#:#delete#:#Radera +common#:#delete_existing_file#:#Ta bort befintlig fil +common#:#delete_inactivated_user_accounts#:#Ta bort inaktiva ILIAS-konton +common#:#delete_inactivated_user_accounts_desc#:#ILIAS-konton raderas %s dagar efter att de inaktiverats. +common#:#delete_inactivated_user_accounts_include_roles#:#Roller som beaktas +common#:#delete_inactivated_user_accounts_include_roles_desc#:#Endast inaktiva konton med en av de valda globala rollerna kommer att raderas. Om ett konto (även) har tilldelats en av de ovalda rollerna kommer ILIAS-kontot att fortsätta att existera. +common#:#delete_inactivated_user_accounts_period#:#Senaste dagar sedan inaktivering +common#:#delete_inactivated_user_accounts_period_desc#:#ILIAS-kontot raderas om detta antal dagar har förflutit sedan det inaktiverades. +common#:#delete_inactive_user_accounts#:#Radera ILIAS-konton med inloggningar från för länge sedan +common#:#delete_inactive_user_accounts_desc#:#ILIAS-konton raderas beroende på tidpunkten för den senaste inloggningen. +common#:#delete_inactive_user_accounts_include_roles#:#Roller som beaktas +common#:#delete_inactive_user_accounts_include_roles_desc#:#Endast inaktiverade konton med en av de valda globala rollerna kommer att raderas. Om ett konto (även) har tilldelats en av de ovalda rollerna kommer ILIAS-kontot att fortsätta att existera. +common#:#delete_inactive_user_accounts_period#:#Senaste dagar sedan senaste inloggning +common#:#delete_inactive_user_accounts_period_desc#:#ILIAS-kontot kommer att raderas om detta antal dagar har förflutit sedan den senaste inloggningen. +common#:#delete_parameter#:#Radera parameter +common#:#delete_selected_items#:#Radera +common#:#deleted#:#Borttagen +common#:#deleted_user#:#ILIAS-kontot har tagits bort. +common#:#deleted_users#:#ILIAS-kontona har tagits bort. +common#:#deletion_notification#:#"%s" har loggat ut från sessionen "%s". +common#:#deliver#:#Fördela träning +common#:#deny_usr_agreement#:#Avvisa överenskommelse? +common#:#deny_usr_agreement_btn#:#Avvisa +common#:#department#:#Avdelning +common#:#desc#:#Beskrivning +common#:#description#:#Beskrivning +common#:#desired_password#:#Nytt lösenord +common#:#details#:#Detaljer +common#:#didactic_template#:#Didaktisk mall +common#:#disable#:#Stäng av +common#:#disable_check#:#Kontrollera inte +common#:#disable_ext_lang_maint#:#Inaktivera avancerad språkhantering +common#:#disable_hide_user_toggle#:#Medlem kan avaktivera avisering +common#:#disabled#:#Avstängd +common#:#disclose#:#Avslöja +common#:#dislike#:#Dislike +common#:#domain#:#Domän +common#:#down#:#Nedåt +common#:#download#:#Ladda ner +common#:#download_all_returned_files#:#Ladda ner alla avgifter +common#:#download_link#:#Länk för nedladdning +common#:#download_multiple_objects#:#Ladda ner flera objekt +common#:#download_selected_items#:#Ladda ner +common#:#download_with_uploaded_filename#:#Använd namnet på den uppladdade filen +common#:#download_with_uploaded_filename_info#:#Välj detta alternativ endast för bakåtkompatibilitet med ILIAS 3.9 och äldre versioner +common#:#downloading_settings#:#Inställningar +common#:#drafts#:#Designs +common#:#drag_file_here#:#Dra filen till detta område +common#:#drag_files_here#:#Dra filerna till detta område +common#:#drop_files_on_repo_obj_info#:#Dra filerna hit för att ladda upp dem till detta objekt. +common#:#edit#:#Redigera +common#:#edit_assignments#:#Redigera träningsenheter +common#:#edit_cat_settings#:#Avancerade inställningar +common#:#edit_content#:#Redigera innehåll +common#:#edit_grouping#:#Redigera begränsning av medlemskap +common#:#edit_metadata#:#Redigera metadata +common#:#edit_operations#:#Redigera operationer +common#:#edit_page#:#Redigera sida +common#:#edit_page_content#:#Redigera sidans innehåll +common#:#edit_page_meta#:#Redigera metadata för sidan +common#:#edit_properties#:#Egenskaper +common#:#edit_stylesheet#:#Redigera stil +common#:#edited_on#:#Editerad på +common#:#editor#:#Redaktör +common#:#email#:#E-post +common#:#email_not_valid#:#Den e-postadress du angav är inte giltig! +common#:#enable#:#Aktivera +common#:#enable_anonymous_fora#:#Skriver i forum "med en pseudonym +common#:#enable_anonymous_fora_desc#:#Måste aktiveras för att funktionen "skriv med pseudonym" ska vara tillgänglig i forum. +common#:#enable_calendar#:#Aktivera kalender +common#:#enable_comments_export#:#Kommentarer om export +common#:#enable_course_group_notifications#:#Daglig post om nyheter från grupper och kurser +common#:#enable_course_group_notifications_desc#:#När den aktiveras kan deltagarna prenumerera på en nyhetssammanfattning. +common#:#enable_custom_icons#:#Aktivera anpassningsbara symboler +common#:#enable_custom_icons_info#:#Med detta kan du definiera dina egna symboler (ikoner) för enskilda containerobjekt och innehållssidan. Du laddar upp motsvarande bildfiler i objektens egenskaper. +common#:#enable_dnd_upload#:#Aktivera drag-och-släpp-uppladdning +common#:#enable_dnd_upload_info#:#Om den är aktiverad kan filer laddas upp med dra-och-släpp. +common#:#enable_download_folder#:# Aktivera åtgärden "Hämta" för mapp +common#:#enable_download_folder_info#:#Aktiverar alternativet "Ladda ner" i rullgardinsmenyn för åtgärder i mappar. +common#:#enable_export_scorm_desc#:#Visning av personuppgifter i loggdata (SCORM) +common#:#enable_fora_statistics#:#Aktivera forumstatistik +common#:#enable_fora_statistics_desc#:#Endast när detta är aktiverat kan du få tillgång till forumstatistiken. +common#:#enable_hide_user_toggle#:#Medlem får inte avaktivera anmälan +common#:#enable_hist_user_comments#:#Revision comments###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +common#:#enable_hist_user_comments_desc#:#Du kan lägga till revisionskommentarer till sidor. Kommentarerna visas på fliken "Innehåll" och underfliken "Historik" i utbildningsmodulen och stöder gemensam redigering.###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +common#:#enable_multi_download#:#Activate "Ladda ner flera objekt +common#:#enable_multi_download_info#:#Om det är aktiverat kan flera mappar eller filer väljas samtidigt för att ladda ner dem som ett zip-arkiv. +common#:#enable_password_assistance#:#Aktivera stöd för lösenord +common#:#enable_preview#:#Aktivera förhandsgranskning +common#:#enable_preview_info#:#Om aktiverat visas miniatyrbilder med de filer som stöds. +common#:#enable_repository_dnd_upload#:#Tillåt i tidningen +common#:#enable_repository_dnd_upload_info#:#Gör det möjligt att dra filer från datorn direkt till ett tidningsobjekt för uppladdning. +common#:#enable_sahs_protocol_data#:# Aktivera loggdata +common#:#enable_sahs_protocol_data_desc#:#Visning av loggdata (SCORM) +common#:#enable_search_engine#:#Dela offentliga områden med sökmotorer (t.ex. Google).
Observera att Apache-modulen "rewrite" krävs för denna inställning och att .htaccess-konfigurationer måste användas. +common#:#enable_trash#:#Använd papperskorgen +common#:#enable_trash_info#:#Raderade objekt flyttas till papperskorgen och kan återställas senare. Om papperskorgen är avaktiverad tas objekten direkt och oåterkalleligt bort från systemet när de raderas! +common#:#enable_webdav#:#Aktivera åtkomst till WebDAV +common#:#enable_webdav_info#:# Tillåter WebDAV-klienter att komma åt tidningen via en webbmapp. Användare kan öppna webbmappar genom att utföra åtgärden "Öppna som webbmapp" i tidningen eller genom att ange följande adress i en WebDAV-klient +common#:#enabled#:#Kopplad på +common#:#enter_in_mb_desc#:# Ange en storlek i MB. +common#:#enter_new_name#:#Var god ange ett namn +common#:#entered_notification#:#"%s" har gått med i sessionen "%s". +common#:#entry_status#:#Status för inresa +common#:#err_1_param#:#Endast 1 parameter! +common#:#err_2_param#:#Endast 2 parametrar! +common#:#err_auth_apache_failed#:#Autentiseringen har misslyckats. +common#:#err_auth_cas_no_ilias_user#:#Logon misslyckades! CAS-autentiseringen lyckades, men det finns ingen motsvarande ILIAS-användare. Kontakta din systemadministratör. +common#:#err_auth_ldap_no_ilias_user#:#Logon misslyckades! LDAP-autentiseringen lyckades, men det finns ingen motsvarande ILIAS-användare. Kontakta din systemadministratör. +common#:#err_auth_mode_inactive#:#Tyvärr är registrering inte möjlig för tillfället. +common#:#err_auth_soap_no_ilias_user#:#Logon misslyckades! SOAP-autentiseringen lyckades, men det finns ingen motsvarande ILIAS-användare. Kontakta din systemadministratör. +common#:#err_check_input#:#Inställningarna kunde inte sparas. Vänligen kontrollera dina poster. +common#:#err_count_param#:#Anledning +common#:#err_in_line#:#Fel i raden +common#:#err_inactive#:#Detta ILIAS-konto är inte aktivt eller har inte aktiverats ännu. Kontakta teknisk support (se länk nedan) för ytterligare hjälp. +common#:#err_inactive_login_attempts#:#Ditt ILIAS-konto har avaktiverats på grund av felaktiga inloggningsförsök. Klicka på "Kontakta teknisk support" längst ned på denna sida för att informera administratörerna om att återaktivera ditt ILIAS-konto. +common#:#err_invalid_port#:# Ogiltigt portnummer +common#:#err_no_cookies#:#Vänligen aktivera sessionscookies i din webbläsare! +common#:#err_no_langfile_found#:#Inga språkfiler hittades! +common#:#err_no_param#:#Inga parametrar! +common#:#err_over_3_param#:#Fler än 3 parametrar! +common#:#err_role_not_assignable#:#Inga användare kan tilldelas rollen vid denna position. +common#:#err_session_expired#:#Din session har löpt ut! +common#:#err_valid_login_account_creation_disabled#:#Autentiseringen lyckades, men det är inte tillåtet att skapa nya inloggningskonton. Kontakta din systemadministratör. +common#:#err_wrong_header#:#Anledning +common#:#err_wrong_login#:#Inloggningsnamnet eller lösenordet är ogiltigt. +common#:#err_wrong_password#:#Fel lösenord +common#:#error#:#Fel +common#:#error_empty_file_or_folder#:#Filen är antingen 0 byte stor eller så är den en mapp. +common#:#error_extraction_failed#:#Uppackningen av arkivet och dess mappstruktur misslyckades. Du har förmodligen inte rätt att skapa mappar eller kategorier i det här objektet. +common#:#error_parser#:#Fel vid start av parsern. +common#:#error_upload_was_zero_bytes#:#Upload failed because this is either a folder, the file is 0 bytes, the max. upload size is exceeded or the file has been deleted or renamed in the meantime. +common#:#etal_talks#:#Talks +common#:#event_ass_materials_prop#:#Material för sessionen +common#:#event_assign_files#:# Tilldela filer +common#:#exc#:#Träning +common#:#exc_add#:#Skapa träning +common#:#exc_added#:#En ny övning har skapats +common#:#exc_date_not_valid#:#Datumet är inte giltigt +common#:#exc_deassign_members#:#Ta bort medlem(mar) +common#:#exc_download_files#:#Ladda ner filer +common#:#exc_edit#:#En ny övning har skapats +common#:#exc_edit_exercise#:#Redigera övning +common#:#exc_edit_until#:#Förfallodag +common#:#exc_exercise_sent#:#Träning skickas +common#:#exc_files#:#Filer +common#:#exc_files_returned#:#Levererade filer +common#:#exc_instruction#:#Arbetsinstruktion +common#:#exc_last_submission#:#Datum för senaste inlämning +common#:#exc_members_already_assigned#:#De valda användarna är redan medlemmar i denna övningsenhet. +common#:#exc_members_assigned#:#Användarna har tilldelats till övningen +common#:#exc_members_comments_saved#:#Kommentarerna till de utvalda användarnas övningar har sparats. +common#:#exc_new#:#Skapa ny övning +common#:#exc_next_deadline#:#Nästa tidsfrist +common#:#exc_obj#:#Träning +common#:#exc_save_changes#:#Spara förändringar +common#:#exc_schedule#:#Tidsplan +common#:#exc_select_one_file#:#Välj exakt en fil. +common#:#exc_sent#:#Övningen skickades till de utvalda medlemmarna +common#:#exc_sent_at#:#Sänt på
%s +common#:#exc_status#:#Status +common#:#exc_status_saved#:#Ändringarna har sparats +common#:#exc_submission#:#Inlämning +common#:#exc_time_over_short#:#Tiden är ute. +common#:#exc_time_to_send#:#Resterande bearbetningstid +common#:#exc_upload_error#:#Fel vid uppladdning av filen +common#:#excs#:#Övningar +common#:#execute#:#Utför +common#:#exercise_time_over#:#Du har nått slutet av behandlingstiden för denna övning. Du kan inte längre skicka in en lösning! +common#:#exp_html#:#HTML-export +common#:#expand#:#Foldout +common#:#expand_all#:#Expandera alla +common#:#expand_content#:#Expandera innehåll +common#:#expanded#:#Öppnad +common#:#export#:#Export +common#:#export_format#:#Exportformat +common#:#export_html#:#Exportera som HTML-fil +common#:#ext_cat_settings#:#Redigera avancerade inställningar +common#:#ext_link#:#Länk +common#:#extracting#:#Unpack... +common#:#eyeclosed#:#Closed eye - klicka för att dölja innehållet i inmatningsfältet +common#:#eyeopened#:#Open eye - klicka för att se innehållet i inmatningen +common#:#failure_message#:#Felmeddelande +common#:#fax#:#Fax +common#:#feed#:#Webfeed +common#:#feedback#:#Återkoppling +common#:#field_name#:#Fältets namn +common#:#field_type#:#Fält typ +common#:#file#:#Fil +common#:#file_add#:#Ladda upp fil +common#:#file_add_and_metadata#:#Ladda upp fil och redigera metadata +common#:#file_added#:#Filen uppladdad +common#:#file_allowed_suffixes#:#Tillåtna filtyper +common#:#file_confirm_delete_all_versions#:#Du har valt alla filversioner. Därför raderas hela filobjektet. Vill du fortsätta? +common#:#file_confirm_delete_versions#:#Är du säker på att följande filversioner ska tas bort? +common#:#file_created#:#Filen har lagts till. +common#:#file_edit#:#Redigera filinställningar +common#:#file_info#:#Filinformation +common#:#file_is_infected#:#Filen är infekterad av ett virus. +common#:#file_no_valid_file_type#:#Den här filtypen är inte tillåten. +common#:#file_not_found#:#Filen hittades inte +common#:#file_not_found_sec#:#Den här filen hittades inte i ILIAS eller har låsts av säkerhetsskäl. +common#:#file_not_valid#:#Filen är ogiltig! +common#:#file_notice#:#Maximalt tillåten uppladdningsstorlek +common#:#file_objects#:#Fil-objekt +common#:#file_rollback#:#Gör den aktuella versionen +common#:#file_rollback_done#:#Filversion %s är nu den aktuella versionen. +common#:#file_rollback_select_exact_one#:#Endast en filversion kan väljas för att göra den till den aktuella versionen. +common#:#file_some_invalid_file_types_removed#:#Vissa filtyper är inte tillåtna och har tagits bort. +common#:#file_suffix_repl#:#Ersätta filnamnstilläggen för uppladdade filer +common#:#file_suffix_repl_info#:# Ange här, kommaseparerade, alla filtyper med deras filändelse som ska ges filändelsen ".sec" när de laddas upp till webbutrymmet. Detta förhindrar att de körs direkt. Detta sker ändå automatiskt för filer med följande filändelser +common#:#file_system_clean_temp_dir_cron#:#Städa upp i tillfällig katalog +common#:#file_system_clean_temp_dir_cron_info#:#Det här cronjobbet rensar upp i ILIAS temp-katalog och tar bort filer som är äldre än 10 dagar. Detta förhindrar en ansamling av oanvända filer och en motsvarande ökning av lagringsutrymmet som förbrukas av temp-katalogen. +common#:#file_updated#:#Filen har uppdaterats. +common#:#file_upload_pending#:#Uppladdad fil +common#:#file_valid#:#Filen är giltig! +common#:#file_version#:#Tillgänglig version +common#:#file_version_create#:#Initial version +common#:#file_version_new_version#:#Ny version +common#:#file_version_replace#:#Alla versioner ersatta +common#:#file_version_rollback#:#Återgå till version %s av %s +common#:#file_versions_deleted#:#De valda filversionerna raderades framgångsrikt. +common#:#filename#:#Filenamn +common#:#filename_extension_missing#:#Filtillägg saknas +common#:#filename_hidden_backup_file#:#Gömd backup-fil +common#:#filename_hidden_unix_file#:#Dold Unix-fil +common#:#filename_interoperability#:#Interoperabilitet +common#:#filename_special_characters#:#På grund av karaktären / detta objekt är inte synligt i webbmappar +common#:#filename_special_filename#:#Objekt med namnen . och ... är inte synliga i webbmappar +common#:#filename_visibility#:#Synlighet +common#:#filename_windows_empty_extension#:#På grund av tecknet . i slutet av namnet är detta objekt inte synligt i Windows webbmappar. +common#:#filename_windows_special_characters#:#På grund av en av karaktärerna \ / +common#:#filename_windows_webdav_issue#:#På grund av #-tecknet är detta objekt inte synligt i Windows webbmappar. +common#:#files#:#Filer +common#:#filesize#:#Filens storlek +common#:#filetype#:#Filtyp +common#:#fill_out_all_required_fields#:#Välkomna att fylla i alla obligatoriska fält +common#:#filter#:#Filter +common#:#filter_users_with_access#:#Endast användare med åtkomst +common#:#filter_users_with_disk_usage#:#Endast användare som upptar minnesutrymme +common#:#filter_users_without_access#:#Endast användare utan åtkomst +common#:#filter_users_without_disk_usage#:#Endast användare som inte upptar minnesutrymme +common#:#first#:#Till början +common#:#firstname#:#Förnamn +common#:#flatview#:#Trädvy av +common#:#fold#:#Folder +common#:#fold_add#:# Skapa mapp +common#:#fold_added#:#Folder skapad +common#:#fold_copy_threads_info#:#Vänligen välj vilka material som ska kopieras, länkas eller utelämnas under kopieringsprocessen. +common#:#fold_edit#:#Redigera mapp +common#:#fold_new#:# Skapa ny mapp +common#:#fold_wizard_page#:#Kopiera mapp (steg 2/2) +common#:#folder#:#Folder +common#:#folders#:#Folder +common#:#follow_link_to_read_mails#:#För att läsa dessa e-postmeddelanden, klicka på följande länk +common#:#force_accept_usr_agreement#:#Du måste acceptera användaravtalet! +common#:#forgot_password#:#Lösenord glömt? +common#:#forgot_username#:#Har du glömt ditt inloggningsnamn? +common#:#form_input_not_valid#:#Vissa uppgifter är ofullständiga eller ogiltiga. Vänligen korrigera din post. +common#:#forum#:#Forum +common#:#forum_direct_notification#:#Notifiering +common#:#forum_notify_me#:#Jag vill bli meddelad när personer svarar direkt på detta inlägg. Notifiering av alla nya inlägg i detta ämne eller forum kan aktiveras i menyn Åtgärder längst upp till höger. +common#:#forum_post_replied#:#Ditt foruminlägg har besvarats. +common#:#forums#:#Forum +common#:#forums_anonymized#:#Forum anonymiserat +common#:#forums_anonymous#:#Anonym +common#:#forums_articles#:#Bidrag +common#:#forums_disable_forum_notification#:#Stoppmeddelande för hela forumet +common#:#forums_enable_forum_notification#:#Startmeddelande för hela forumet +common#:#forums_forum_notification_enabled#:#Du kommer att meddelas om nya inlägg i detta forum. +common#:#forums_last_post#:#Sista inlägget +common#:#forums_new_articles#:#Nya inlägg +common#:#forums_notification_settings#:#Notifiering om nya och ändrade foruminlägg +common#:#forums_threads#:#Ämnen +common#:#forums_use_alias#:#Du kan ange en pseudonym här som du vill använda för det här inlägget. Om du lämnar fältet tomt kommer ditt inlägg att markeras som skrivet av "%s". +common#:#forums_your_name#:#Ditt namn +common#:#frm#:#Forum +common#:#frm_add#:#Skapa Forum +common#:#frm_added#:#Forum skapat +common#:#frm_edit#:#Edit forum +common#:#frm_import#:#Importforum +common#:#frm_latest_postings#:#Sista bidrag +common#:#frm_new#:#Skapa nytt forum +common#:#frm_statistics_ranking#:#Rankningar +common#:#from#:#Från +common#:#fullname#:#Fullständigt namn +common#:#functions#:#Funktioner +common#:#further_informations#:#Ytterligare information +common#:#gdf_add#:#Lägg till definition +common#:#gdf_new#:#Ny definition +common#:#gender#:#Adress +common#:#gender_f#:#Kvinna +common#:#gender_m#:#Mr +common#:#gender_n#:#Ingen hälsning +common#:#general#:#Allmänt +common#:#general_settings#:#Allmänna inställningar +common#:#generate#:#generera +common#:#ghostscript_not_configured#:#Ghostscript är inte konfigurerat. Vänligen öppna installationen för att konfigurera Ghostscript. +common#:#glo#:#Ordlista +common#:#glo_add#:#Skapa ordlista +common#:#glo_added#:#Glossar skapade +common#:#glo_import#:#Importera ordlista +common#:#glo_mode#:#Mode +common#:#glo_mode_desc#:#En kollektiv ordlista fungerar som en vanlig ordlista. Dessutom innehåller den alla definitioner av termer från alla ordlistor som finns på samma nivå i tidningen (endast denna nivå) eller alla definitioner av termer från ordlistor som också finns på eft +common#:#glo_mode_level#:#Endast aktuell tidskriftsnivå +common#:#glo_mode_normal#:#Normal ordlista +common#:#glo_mode_subtree#:#Nuvarande och underordnade magasinsnivåer +common#:#glo_new#:#Skapa ny ordlista +common#:#global#:#Global +common#:#global_default#:#Standardformatmall (global) +common#:#global_fixed#:#Enhetsformatmall (global) +common#:#global_role_assignment#:#Global rolltilldelning +common#:#global_settings#:#Globala inställningar +common#:#global_user#:#Globala användare +common#:#glossaries#:#Glossarier +common#:#glossary#:#Ordlista +common#:#go#:#Los +common#:#grade#:#Rating +common#:#group#:#Grupp +common#:#group_members#:#Medlemmar +common#:#group_name#:#Gruppens namn +common#:#group_new_registrations#:#Tillämpningar av acceptans +common#:#group_password_registration_msg#:#Om en gruppadministratör har gett dig grupplösenordet kan du gå med i gruppen. +common#:#group_registration#:#Gå med i en grupp +common#:#group_registration_mode#:#Förfarande för anslutning +common#:#group_registration_time#:#Tidsperiod +common#:#group_req_direct#:#Direkt anslutning +common#:#group_req_registration_msg#:#Du måste skicka in en ansökan för att gå med i gruppen. Beskriv varför du vill gå med i gruppen i fältet Meddelande. När din ansökan har godkänts eller avslagits får du ett meddelande. +common#:#group_status#:#Gruppen är +common#:#groupings#:#Begränsning av medlemskap +common#:#groupings_assigned_obj_crs#:# Tilldelade kurser +common#:#groupings_assigned_obj_grp#:#Associerade grupper +common#:#groups#:#Grupper +common#:#grp#:#Grupp +common#:#grp_add#:#Skapa grupp +common#:#grp_added#:#Grupp skapad +common#:#grp_btn_unsubscribe#:#Avsluta gruppmedlemskap +common#:#grp_cancel_waiting_list#:#Är du säker på att du vill avsluta prenumerationen på %s-gruppens väntelista? +common#:#grp_copy_threads_info#:#Vänligen välj vilka material som ska kopieras, länkas eller utelämnas från kopieringsprocessen. +common#:#grp_deleted_export_files#:#Den valda filen har raderats. +common#:#grp_dismiss_member#:#Du vill avregistrera följande medlemmar från gruppen? +common#:#grp_dismiss_myself#:#Är du säker på att du vill avsluta ditt medlemskap i den här gruppen? +common#:#grp_edit#:#Inställningar för gruppen +common#:#grp_err_administrator_required#:#Gruppmedlem har inte tagits bort, minst en administratör per grupp krävs. +common#:#grp_header_edit_members#:#Redigera medlemmar +common#:#grp_list_members#:#Lista deltagare +common#:#grp_list_reg#:#Accession +common#:#grp_list_reg_end#:#Filing slut +common#:#grp_list_reg_limit_full#:#Inga lediga platser tillgängliga +common#:#grp_list_reg_limit_places#:#Fria platser +common#:#grp_list_reg_noreg#:#Ingen registrering möjlig +common#:#grp_list_reg_period#:#Anslutningsperiod +common#:#grp_list_reg_start#:#Registrering börjar +common#:#grp_list_users#:#Lista användare +common#:#grp_mem_change_status#:#Ändra status för medlem +common#:#grp_mem_send_mail#:#Skicka ett mail till en medlem +common#:#grp_members_gallery#:#Medlemmarnas galleri +common#:#grp_msg_applicants_assigned#:#Deltagaren har accepterats i gruppen. +common#:#grp_msg_member_assigned#:#Deltagaren har accepterats i gruppen. +common#:#grp_msg_membership_annulled#:#Membership has been cancelled +common#:#grp_new#:#Skapa ny grupp +common#:#grp_registration#:#Gå med i gruppen +common#:#grp_registration_completed#:#Du har gått med i gruppen +common#:#grp_removed_from_waiting_list#:#Du har tagits bort från väntelistan för gruppen "%s". +common#:#grp_select_one_file#:#Välj en fil. +common#:#grp_wizard_page#:#Kopiera grupp (steg 2/2) +common#:#grpr#:#Grupplänk +common#:#grpr_add#:#Skapa grupplänk +common#:#grpr_edit#:#Redigera grupplänk +common#:#grpr_edit_info#:#Vänligen välj den grupp som du vill skapa en länk för. +common#:#grpr_new#:#Skapa ny grupplänk +common#:#grpr_settings#:#Inställningar för grupplänken +common#:#header_searchable#:#Sökbar +common#:#header_title#:#Installationsrubrik +common#:#header_visible_registration#:#Synlig i registreringsformuläret +common#:#header_zip#:#Ladda upp flera filer som ett ZIP-arkiv +common#:#height#:#Höjd +common#:#help#:#Hjälp +common#:#hide#:#Dölj +common#:#hide_all_details#:#Dölj alla detaljer +common#:#hide_details#:#Dölj detaljer +common#:#hide_filter#:# Dölj filter +common#:#hide_own_online_status#:#Visa inte din egen online-status +common#:#hide_visible_sections#:# Dölj ytterligare information " +common#:#hint#:#Note +common#:#hist_lm_delete_pg#:#Sidan "%1" [%2] har tagits bort. +common#:#hist_lm_delete_st#:#Kapitel "%1" [%2] har tagits bort. +common#:#hist_lm_pg_create#:#Sida skapad. +common#:#hist_lm_pg_update#:#Sidan ändrad. +common#:#hist_lm_st_create#:#Kapitel skapat. +common#:#hist_webr_add#:#Ny webblänk skapad med titel +common#:#hist_webr_delete#:#Webblänk har tagits bort. Titel +common#:#hist_webr_update#:#Webblänken har uppdaterats. Titel +common#:#history#:#Framsteg +common#:#hits_per_page#:#hit/sida +common#:#hobby#:#Intressen/Hobbies +common#:#home#:#Till det offentliga området +common#:#host#:#Host +common#:#hour#:#timme +common#:#hours#:#Timmar +common#:#htlm#:#Lärmodul HTML +common#:#htlm_add#:#Skapa HTML utbildningsmodul +common#:#htlm_new#:#Skapa en ny HTML-lärmodul +common#:#http#:#HTTP +common#:#http_not_possible#:#Den här servern stöder inte HTTP-förfrågningar. +common#:#http_path#:#HTTP sökväg +common#:#https_not_possible#:#Den här servern stöder inte HTTPS-anslutningar. +common#:#i2passwd#:#ILIAS_2-Lösenord +common#:#iass_import#:#Viktigt med individuell bedömning +common#:#iass_new#:#Skapa en ny individuell rating +common#:#icon#:#Symbol +common#:#icon_settings#:#Icon +common#:#id#:#ID +common#:#identifier#:#Identifierare +common#:#if_no_title_then_filename#:#Om du inte anger en titel visas filnamnet istället. +common#:#ignore_on_conflict#:#Ignorera i konflikt +common#:#ignore_required_fields#:#Ignorera obligatoriska användarfält +common#:#ignore_required_fields_info#:#Om aktiverat kommer obligatoriska uppgifter inte längre att kontrolleras när du skickar in det här formuläret (om möjligt). Effekten av detta är att användaren måste slutföra sin profil efter nästa inloggning. +common#:#il_astpl_loc_initial#:#Ingångstest +common#:#il_astpl_loc_initial_desc#:#Establishment mall för inträdesprov för lärande av målorienterade kurser. +common#:#il_astpl_loc_qualified#:#Kvalificerande test +common#:#il_astpl_loc_qualified_desc#:#Setting Template for Qualifying Tests of Learning Goal Oriented Courses +common#:#il_blog_contributor#:#Blog Authorship###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +common#:#il_blog_editor#:#Blog Editorial###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +common#:#il_chat_moderator#:#Chatmoderation###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +common#:#il_crs_admin#:#Kursadministratör +common#:#il_crs_member#:#Kursmedlem +common#:#il_crs_non_member#:#Ingen kursmedlem +common#:#il_crs_tutor#:#Kurshandledare +common#:#il_frm_moderator#:#Forum Moderation###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +common#:#il_grp_admin#:#Gruppadministratör +common#:#il_grp_member#:#Gruppmedlem +common#:#il_grp_status_closed#:#Sluten grupp +common#:#il_grp_status_open#:#Öppen grupp +common#:#il_iass_member#:#Deltagare i en individuell bedömning +common#:#il_lso_admin#:#Administratör för inlärningssekvenser +common#:#il_lso_member#:#Lärande Sekvens Medlem +common#:#il_lti_instructor#:#LTI Instruktör +common#:#il_lti_learner#:#LTI Lärare +common#:#il_orgu_employee#:#Anställda +common#:#il_orgu_superior#:#Supervisor Manager###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +common#:#ilias_version#:#ILIAS version +common#:#image#:#Image +common#:#import#:#Import +common#:#import_cat_localrol#:#Skapa en ny lokal roll för varje ny kategori +common#:#import_cat_table#:#Var god notera att följande tabell endast visas om kryssrutan är aktiverad. +common#:#import_categories#:#Importkategorier +common#:#import_failure_log#:#Import av fellogg +common#:#import_file#:#Importera fil +common#:#import_file_not_valid#:#Importfilen är inte giltig. +common#:#import_finished#:#Antal importerade e-postmeddelanden +common#:#import_lm#:#Import ILIAS utbildningsmodul +common#:#import_qpl#:#Importera frågepool för tester +common#:#import_questions_into_qpl#:#Importera frågor till frågepoolen +common#:#import_sahs#:#Importera SCORM utbildningsmodul +common#:#import_svy#:#Importundersökning +common#:#import_tst#:#Import test +common#:#import_users#:#Importera användare +common#:#import_warning_log#:#Importera varningslogg +common#:#important#:#Viktigt +common#:#imported#:#importerad +common#:#imprint#:#Imprint +common#:#in#:#i +common#:#in_use#:#Användarspråk +common#:#in_use_by#:#I process av +common#:#inactive#:#Inaktiv +common#:#inbox#:#Inkorg +common#:#include_local#:#include lokal +common#:#info#:#Information +common#:#info_access_and_status_info#:#Information om åtkomst och status +common#:#info_access_permissions#:#Tillgångsrättigheter +common#:#info_activate_sure#:#Är du säker på att du vill bekräfta följande användare som aktiva användare? +common#:#info_assign_sure#:# Är du säker på att du vill inkludera följande användare? +common#:#info_assigned#:#tilldelad +common#:#info_available_roles#:#Tillgängliga roller +common#:#info_change_user_view#:#Visa rättigheter för denna användare +common#:#info_deactivate_sure#:#Är du säker på att du vill inaktivera följande användare? +common#:#info_delete_sure#:#Är du säker på att följande objekt ska tas bort? +common#:#info_delete_warning_no_trash#:##Attention +common#:#info_deleted#:#Objekt(en) borttagna +common#:#info_err_user_not_exist#:#Ingen person med detta inloggningsnamn hittades.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +common#:#info_from_role#:#Tilldelad genom roll medlemskap/ägande +common#:#info_is_member#:#User är medlem +common#:#info_is_not_member#:#Användaren är inte medlem +common#:#info_message#:#Informationsmeddelande +common#:#info_not_assigned#:#ej tilldelad +common#:#info_owner_of_object#:#Objekt ägs av###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +common#:#info_permission_origin#:#Absolut position +common#:#info_permission_source#:#effektiv från +common#:#info_remark_interrupted#:#Role avbröts vid denna position. De fastställda rättighetsspecifikationerna vid denna position gäller för denna roll. +common#:#info_remove_sure#:#Är du säker på att följande objekt ska tas bort? +common#:#info_short#:#Info +common#:#info_status_info#:#Vem har vilka rättigheter här? +common#:#info_view_of_user#:#Användare +common#:#inform_user_mail#:#Informera användarna om ändringar via e-post +common#:#inline_file_extensions#:#Filer som kan visas i webbläsaren +common#:#inline_file_extensions_info#:#Filer med dessa tillägg visas direkt i webbläsaren.
Till exempel +common#:#insert#:#Insert +common#:#insert_object_here#:#Insätt objekt här +common#:#inst_id#:#NIC ID +common#:#inst_info#:#Installationsinformation +common#:#inst_name#:#Installationens namn +common#:#install#:#Installera +common#:#install_local#:#Installera med anpassad språkfil +common#:#installation_status#:#Status Installation +common#:#installed#:#Installerad +common#:#installed_local#:#Installerad med anpassad språkfil +common#:#instant_messengers#:#Instant Messenger +common#:#institution#:#Institution +common#:#internal_local_roles_only#:#Lokala roller (endast automatiskt skapade) +common#:#invalid_visible_required_options_selected#:#Alla fält som har alternativet "Obligatorisk information" måste också ha alternativet "Synlig i registreringsformuläret" inställt. +common#:#invisible_block#:#Osynligt block +common#:#invisible_block_mess#:#Du har inte rätt att se detta block. +common#:#ip_address#:#IP-adress +common#:#is_already_your#:#är redan din +common#:#item#:#Term +common#:#itgr_add#:#Skapa objektblock +common#:#itgr_new#:#Skapa nytt objektblock +common#:#java_server#:#Java-server +common#:#java_server_host#:#Host +common#:#java_server_info#:#Denna indexbaserade söktyp söker både i ILIAS-databasen och i filer. Den rekommenderas för större ILIAS-installationer. För att använda Lucene-sökningen i ILIAS måste den JAVA-baserade ilServer installeras och konfigureras (se fliken "Lucene"). +common#:#java_server_port#:#Port +common#:#java_server_readme#:#Till installationshandboken +common#:#join#:#Join +common#:#join_session#:#Logga in +common#:#kb#:#KByte +common#:#keywords#:#nyckelord +common#:#label_search_options#:#Sökningsområde +common#:#lang_dateformat#:#d.m.Y +common#:#lang_path#:#Sökväg till språkfiler +common#:#lang_refresh_confirm#:#Bör alla språk verkligen uppdateras? +common#:#lang_refresh_confirm_info#:#ILIAS har hittat ändrade språkvariabler. När du uppdaterar ett språk laddas alla data från dess standardspråkfil och eventuellt från en anpassad språkfil in i databasen. Dina ändringar skrivs inte över när standardspråksfilen laddas. En anpassad språkfil +common#:#lang_refresh_confirm_selected#:#Vill du verkligen uppdatera de valda språken? +common#:#lang_sep_decimal#:#, +common#:#lang_sep_thousand#:#. +common#:#lang_size_bytes#:#Bytes +common#:#lang_size_gb#:#GB +common#:#lang_size_kb#:#KB +common#:#lang_size_mb#:#MB +common#:#lang_timeformat#:#H +common#:#lang_timeformat_no_sec#:#H +common#:#lang_uninstall_changes#:#Ta bort lokala ändringar +common#:#lang_uninstall_changes_confirm#:#Vill du verkligen radera alla lokala ändringar i de valda språken och återställa dem till standardinställningen i den aktuella ILIAS-versionen? +common#:#lang_uninstall_confirm#:#Vill du verkligen avinstallera de valda språken? Detta innebär också att alla lokala ändringar i respektive språk oåterkalleligen går förlorade om de inte har sparats eller exporterats i förväg. +common#:#langfile_found#:#Språkfilen hittades +common#:#language#:#Språk +common#:#language_not_installed#:#är inte installerat. Vänligen installera språket först. +common#:#languages#:#Språk +common#:#languages_already_installed#:#Valda språk är redan installerade +common#:#languages_already_uninstalled#:#Valda språk är redan avinstallerade +common#:#languages_updated#:#Alla installerade språk har uppdaterats +common#:#last_access#:#Sista åtkomst +common#:#last_change#:#Sista förändringen +common#:#last_edited_on#:#Last edited on +common#:#last_login#:#Sista inloggning +common#:#last_refresh#:#Sista uppdateringen +common#:#last_reminder#:#Sista minnet +common#:#last_update#:#Uppdaterad +common#:#last_visited#:#Sista besöket +common#:#lastname#:#Efternamn +common#:#laugh#:#Laugh +common#:#launch#:#Start +common#:#ldap#:#LDAP +common#:#ldap_basedn#:#LDAP BasDN +common#:#ldap_configure#:#Konfigurera LDAP-autentisering +common#:#ldap_port#:#LDAP Port +common#:#ldap_read#:#Läsa åtkomst till LDAP-inställningar +common#:#ldap_server#:#URL till server +common#:#ldap_tls#:#Använd TLS +common#:#ldap_version#:#Protokollversion +common#:#learning module#:#inlärningsmodul +common#:#learning_progress#:#Framsteg inom lärande +common#:#leave_waiting_list#:#Avregistrera dig från väntelistan +common#:#legend#:#Legend +common#:#level#:#Scen +common#:#like#:#Like +common#:#link#:#Länk +common#:#link_all#:#Länk alla +common#:#link_check#:#Kontrollera externa länkar +common#:#link_check_message_b#:#Notification active
Om detta alternativ är markerat kommer du att meddelas via e-post om ogiltiga externa länkar. Förutsättningen är dock att motsvarande cron-jobb har aktiverats i administrationen. +common#:#link_check_message_disabled#:#Sändningen av e-postmeddelanden är avaktiverad. +common#:#link_check_message_enabled#:#Sändning av e-postmeddelanden är aktiverat. +common#:#link_check_subject#:#[ILIAS] Kontrollera webblänk +common#:#link_checker_refreshed#:#Vyn har uppdaterats. +common#:#link_selected_items#:#Länk +common#:#links_add_param#:#Lägg till parameter +common#:#links_dyn_parameter#:#Dynamiska parametrar +common#:#links_dynamic#:#Dynamiska parametrar +common#:#links_dynamic_info#:#Dynamiska parametrar kan läggas till i webblänken, t.ex. inloggningsnamn eller ID för ILIAS-kontot ###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +common#:#links_existing_params#:#Befintliga parametrar +common#:#links_name#:#Parameternamn +common#:#links_no_name_given#:#Var god ange ett parameternamn. +common#:#links_no_value_given#:#Välj ett parametervärde. +common#:#links_parameter_deleted#:#Parametern har tagits bort. +common#:#links_select_one#:#- Gör ett urval - tack +common#:#links_session_id#:#ILIAS Session ID +common#:#links_user_id#:#ID för ILIAS-kontot +common#:#links_user_name#:#ILIAS inloggningsnamn +common#:#links_value#:#Parametervärde +common#:#list#:#Lista +common#:#list_of_questions#:#Frågelista +common#:#lm#:#inlärningsmodul ILIAS +common#:#lm_add#:#Skapa utbildningsmodul för ILIAS +common#:#lm_added#:#ILIAS utbildningsmodul skapad +common#:#lm_new#:#Skapa en ny ILIAS-inlärningsmodul +common#:#lm_type_scorm#:#SCORM 1.2 +common#:#lm_type_scorm2004#:#SCORM 2004 3:e/4:e upplagan +common#:#lng#:#Språk +common#:#lngf#:#Språk +common#:#lo#:#inlärningsmodul +common#:#loaded_preview_renderers#:#Tillgängliga förhandsgranskare +common#:#local#:#Lokalt +common#:#local_language_file#:#Anpassad språkfil +common#:#local_language_files#:#Anpassade språkfiler +common#:#local_languages_already_installed#:#Väljda anpassade språkfiler är redan installerade +common#:#local_role_assignment#:#Lokal rolltilldelning +common#:#location#:#Egen plats +common#:#locator#:#Position +common#:#log_in#:#Logga in +common#:#log_out#:#Logga ut +common#:#logic_or#:#eller +common#:#login#:#Login namn +common#:#login_as#:#Registrerad som +common#:#login_data#:#Registreringsuppgifter +common#:#login_exists#:#Detta inloggningsnamn är redan upptaget. Vänligen välj ett annat inloggningsnamn. +common#:#login_information#:#Information om inloggning +common#:#login_information_desc#:#Ange inloggningsuppgifter här för respektive språk. +common#:#login_information_settings_saved#:#Inloggningsuppgifterna sparades framgångsrikt +common#:#login_invalid#:#Ditt inloggningsnamn måste vara minst tre tecken långt och får endast innehålla följande tecken +common#:#login_to_ilias#:#Logga in på ILIAS +common#:#login_to_ilias_via_cas#:#Logga in på ILIAS via det centrala autentiseringssystemet +common#:#login_to_ilias_via_saml#:#Logga in på ILIAS via SAML-autentisering +common#:#login_to_ilias_via_shibboleth#:#Logga in på ILIAS via +common#:#loginname_already_exists#:#Detta inloggningsnamn är redan upptaget. Vänligen välj ett annat inloggningsnamn. +common#:#loginname_settings#:#Inställningar Inloggningsnamn +common#:#logout#:#Logga ut +common#:#logout_text#:#Du är nu utloggad. Din session har stängts. +common#:#logs#:#Protokolluppgifter +common#:#love#:#Kärlek +common#:#lres#:#läromedel +common#:#lso_add#:#Skapa en inlärningssekvens +common#:#lso_admin_form_byline#:#Generella inställningar för inlärningssekvenser +common#:#lso_admin_form_title#:#Inställningar +common#:#lso_admin_interval_byline#:#Var x:e sekund efterfrågas inlärningsförloppet för ej helt integrerade objekt. Observera! Ju lägre värde, desto oftare utförs en fråga. Detta kan ha en mycket negativ effekt på systembelastningen; därför bör värdet väljas så högt som möjligt. +common#:#lso_admin_interval_label#:#Query intervall inlärningsförlopp (sekunder) +common#:#lso_copy#:#Kopiera inlärningssekvens +common#:#lso_copy_threads_info#:#Välj vilka material i inlärningssekvensen som ska kopieras, länkas eller utelämnas under kopieringsprocessen. +common#:#lso_edit#:#Redigera inlärningssekvens +common#:#lso_import#:#Import av inlärningssekvens +common#:#lso_new#:#Skapa en ny inlärningssekvens +common#:#lso_wizard_page#:#Kopiera inlärningssekvensen (steg 2/2) +common#:#lti#:#LTI Konsument +common#:#lti_outcome#:#Notifiering om LTI-inlärningsframsteg +common#:#lti_outcome_info#:#Sänder status för inlärningsframsteg för LTI-användare till LTI Tool Consumer / LTI Platform. +common#:#mail#:#E-post +common#:#mail_addressbook#:#Kontakter +common#:#mail_at_the_ilias_installation#:#På ILIAS-installationen %2$s har du fått %1$s nya mail(s) +common#:#mail_attachment#:# e-postbilaga +common#:#mail_b_inbox#:#Inkorg +common#:#mail_c_trash#:#Avfallskorg +common#:#mail_d_drafts#:#Designs +common#:#mail_delete_error#:#Fel vid radering +common#:#mail_e_sent#:#Sänt +common#:#mail_edit_permission#:#Ändra rättighetsinställningarna för e-postadministrationen +common#:#mail_folders#:#E-postmapp +common#:#mail_import_file#:#Exportera fil +common#:#mail_mails_of#:#E-post +common#:#mail_maxsize_attach#:#Maximal storlek på e-postbilagan +common#:#mail_member#:#Mail till medlem +common#:#mail_members#:#Mail till medlemmar +common#:#mail_not_sent#:#Din e-post kunde inte skickas +common#:#mail_search_no#:#Inga matchande resultat hittades +common#:#mail_select_one#:#Du måste välja minst en post +common#:#mail_send_error#:#Fel vid sändning av e-post +common#:#mail_sent#:#Din e-post har skickats +common#:#mail_settings#:#Inställningar för e-post +common#:#mail_to_global_roles_not_allowed#:#%1$s (att skicka till globala roller är inte tillåtet) +common#:#mail_z_local#:#Own folders +common#:#mails#:#Mails +common#:#mails_at_the_ilias_installation#:#På ILIAS-installationen %2$s har du fått %1$s nya mail(s) +common#:#mails_pl#:#Mail(s) +common#:#main_menu#:#Huvudmeny +common#:#mainbar_aria_label#:#Mainbar +common#:#mainbar_more_label#:#Mer +common#:#manage_members#:#Hantera medlemmar +common#:#marked_entries#:# Markerade poster +common#:#matriculation#:#Matrikulering antal +common#:#max_previews_per_object#:#Antal miniatyrer per fil +common#:#max_previews_per_object_info#:#Ställer in antalet miniatyrbilder som genereras per fil. +common#:#mcst#:#Mediacast +common#:#mcst_add#:#Skapa Mediacast +common#:#mcst_new#:#Skapa ny mediacast +common#:#mem_add_to_wl#:#Skriva upp sig på väntelista +common#:#mem_alert_no_places#:#Det finns inga lediga platser tillgängliga. +common#:#mem_cron_min_members#:#Kurs/Grupp +common#:#mem_cron_min_members_info#:#Administratörerna kommer att meddelas om minimiantalet inte uppnås. +common#:#mem_end#:#Filing slut +common#:#mem_free_places#:#Fria platser +common#:#mem_max_users#:#Maximalt antal deltagare +common#:#mem_min_users#:#Minsta antal deltagare +common#:#mem_participants#:#Deltagare +common#:#mem_reg_expired#:#Registreringstiden har löpt ut. +common#:#mem_reg_not_started#:#Registreringen har ännu inte påbörjats. +common#:#mem_reg_period#:#Ansökningsperiod +common#:#mem_reg_type#:#Förfarande för inspelning +common#:#mem_start#:#Registrering börjar +common#:#mem_unlimited#:#Obegränsad +common#:#mem_view_activate#:#Aktivera förhandsgranskning som medlem +common#:#mem_view_close#:#Stäng förhandsgranskning som medlem +common#:#mem_view_long#:#Förhandsgranska som medlem +common#:#mem_waiting_list#:#Personer på väntelistan +common#:#mem_waiting_list_position#:#Din position på väntelistan +common#:#member#:#Medlem +common#:#member_status#:#Status för medlemskap +common#:#members#:#Medlemmar +common#:#membership_leave#:#Logga ut +common#:#mep#:#media pool +common#:#mep_add#:#Skapa en mediapool +common#:#mep_edit#:#Redigera egenskaper för mediapoolen +common#:#mep_new#:#Skapa en ny mediapool +common#:#mep_not_insert_already_exist#:#Följande objekt lades inte till eftersom de redan ingår i mediapoolen. +common#:#message#:#Meddelande +common#:#message_content#:#Innehåll +common#:#message_no_delivered_files#:#Du har ännu inte skickat in någon fil. +common#:#meta_data#:#Metadata +common#:#metabar_aria_label#:#Metallstång +common#:#mgs_objects_linked_to_the_following_folders_p#:#Objekten har kopplats till följande områden. +common#:#mgs_objects_linked_to_the_following_folders_s#:#Objektet har länkats till följande områden. +common#:#migrate#:#Migrera +common#:#minimize#:#Reduce +common#:#minute#:#Minut +common#:#minutes#:#minuter +common#:#missing#:#Inte tillgänglig +common#:#missing_perm#:#Missande godkännande +common#:#missing_precondition#:#Frånvarande förutsättning +common#:#mm_achievements#:#lärande framgångar +common#:#mm_administration#:#Administration +common#:#mm_badges#:#Badges +common#:#mm_calendar#:#Kalender +common#:#mm_certificates#:#Certifikat +common#:#mm_comments#:#Kommentarer +common#:#mm_communication#:#Kommunikation +common#:#mm_contacts#:#Kontakter +common#:#mm_dashboard#:#Dashboard +common#:#mm_enrolments#:#Anmälningar +common#:#mm_favorites#:#Favoriter +common#:#mm_learning_history#:#Framsteg inom lärande +common#:#mm_learning_progress#:#Framsteg inom lärande +common#:#mm_mail#:#E-post +common#:#mm_news#:#Nyheter +common#:#mm_notes#:#Noter +common#:#mm_organisation#:#Organisation +common#:#mm_personal_and_shared_r#:#Personliga och gemensamma resurser +common#:#mm_personal_workspace#:#Personlig arbetsyta +common#:#mm_portfolio#:#Portfölj +common#:#mm_private_chats#:#Privata chattar +common#:#mm_rep_tree_view#:#Trädvy +common#:#mm_repo_tree_view#:#Trädvy +common#:#mm_repo_tree_view_act#:#Trädutsikt på +common#:#mm_repo_tree_view_deact#:#Trädvy av +common#:#mm_repository#:#Magasin +common#:#mm_skills#:#Kompetens +common#:#mm_staff_list#:#Lista över anställda +common#:#mm_tags#:#Etiketter +common#:#mm_task_derived_tasks#:#Att göra +common#:#mme_lost_item_reason#:#Entry erbjuds inte längre. +common#:#mme_lost_item_title#:#Ingen tilldelning +common#:#mob#:#media objekt +common#:#moderators#:#Moderation###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +common#:#module#:#Modul +common#:#modules#:#Moduler +common#:#month#:#Månad +common#:#month_01_long#:#Januari +common#:#month_01_short#:#Jan +common#:#month_02_long#:#Februari +common#:#month_02_short#:#Feb +common#:#month_03_long#:#Mars +common#:#month_03_short#:#Mär +common#:#month_04_long#:#April +common#:#month_04_short#:#Apr +common#:#month_05_long#:#Maj +common#:#month_05_short#:#Maj +common#:#month_06_long#:#Juni +common#:#month_06_short#:#Jun +common#:#month_07_long#:#Juli +common#:#month_07_short#:#Jul +common#:#month_08_long#:#Augusti +common#:#month_08_short#:#Aug +common#:#month_09_long#:#September +common#:#month_09_short#:#Sep +common#:#month_10_long#:#Oktober +common#:#month_10_short#:#Okt +common#:#month_11_long#:#November +common#:#month_11_short#:#Nov +common#:#month_12_long#:#December +common#:#month_12_short#:#Dec +common#:#monthly#:#Månadsvis +common#:#months#:#Månader +common#:#mount_webfolder#:#Öppna som webbmapp +common#:#move#:#Shift +common#:#moveChapter#:#Shift +common#:#movePage#:#Shift +common#:#move_selected_items#:#Shift +common#:#msg_bt_download_started#:#Ett ZIP-arkiv med alla nedladdningsfiler skapas nu i bakgrunden. Du kan se status för dina bakgrundsprocesser längst upp till höger i meddelandecentret. Du kan också ladda ner ZIP-arkivet där. +common#:#msg_cancel#:#Aktion avbruten +common#:#msg_clear_clipboard#:#Klipptavla borttagen +common#:#msg_cloned#:#Objekt som kopierats. +common#:#msg_copy_clipboard#:#Välj nu önskad plats där de markerade objekten ska kopieras. Klicka slutligen på knappen Klistra in. +common#:#msg_copy_clipboard_container#:#Välj nu önskad plats där de kopierade objekten ska klistras in. Klicka slutligen på knappen Nästa. +common#:#msg_copy_clipboard_source#:#Välj nu den kurs eller grupp vars innehåll ska kopieras. Klicka sedan på knappen Nästa. +common#:#msg_cut_clipboard#:#Välj nu önskad plats där de markerade objekten ska infogas. Slutligen klickar du på knappen Infoga. +common#:#msg_cut_copied#:#Objekt som flyttats. +common#:#msg_deleted_export_files#:#Exportfil(er) raderad(e) +common#:#msg_deleted_role#:#Roll borttagen +common#:#msg_deleted_roles_rolts#:#Roller och rollmallar raderade +common#:#msg_failed#:#Aktion misslyckad +common#:#msg_form_save_error#:#Formuläruppgifterna kunde inte sparas. Kontrollera formulärfälten för detaljerade felmeddelanden. +common#:#msg_info_blacklisted#:#Vänligen ursäkta mig! Av säkerhetsskäl är det inte tillåtet att ladda upp filen. +common#:#msg_input_char_limit_max#:#Du måste respektera det maximala antalet tecken. Ditt bidrag är för långt. +common#:#msg_input_char_limit_min#:#Du måste ange det minsta antal tecken som anges. Din post är för kort. +common#:#msg_input_does_not_match_regexp#:#Var god ange ett giltigt värde. +common#:#msg_input_is_required#:#Detta fält måste fyllas i. Vänligen ange något. +common#:#msg_is_last_role#:#Du har berövat följande användare deras sista uppdrag till en global roll +common#:#msg_last_role_for_registration#:#Minst en roll måste vara tillgänglig i registreringsformuläret för nya användare. Denna roll är för närvarande den enda tillgängliga rollen. +common#:#msg_link_clipboard_p#:#Välj nu önskad plats till vilken de valda objekten ska länkas. Klicka slutligen på knappen Infoga. +common#:#msg_link_clipboard_s#:#Välj nu önskad plats till vilken det valda objektet ska länkas. Klicka slutligen på knappen Infoga. +common#:#msg_linked#:#Objekt kopplade till +common#:#msg_may_not_contain#:#Detta objekt får inte innehålla objekt av följande typ +common#:#msg_min_one_role#:#Varje användare måste tilldelas minst en global roll! +common#:#msg_multi_language_selected#:#Det är inte möjligt att välja samma språk för flera översättningar +common#:#msg_no_default_language#:#Ingen standardöversättning definierad! Du måste definiera ett språk som standardöversättning. +common#:#msg_no_delete_yourself#:#Du kan inte radera ditt eget inloggningskonto. +common#:#msg_no_file#:#Du har inte valt en fil eller den valda filen var för stor. +common#:#msg_no_files_selected#:#Inga filer valda +common#:#msg_no_language_selected#:#Angivande av översättningsspråk saknas! Du måste ange ett språk för alla översättningar +common#:#msg_no_perm_assign_role_to_user#:#Du har inte behörighet att ändra rolltilldelningen för användaren. +common#:#msg_no_perm_assign_user_to_role#:#Du har inte behörighet att ändra användartilldelningen +common#:#msg_no_perm_copy#:#Du har inte tillräcklig behörighet att kopiera följande objekt +common#:#msg_no_perm_create_rolt#:#Du har inte tillräcklig behörighet för att skapa nya rollmallar! +common#:#msg_no_perm_cut#:#Du har inte tillräckligt tillstånd för att klippa ut följande objekt +common#:#msg_no_perm_delete#:#Du har inte tillräcklig behörighet för att radera följande objekt +common#:#msg_no_perm_link#:#Du har inte tillräcklig behörighet att skapa en länk för följande objekt +common#:#msg_no_perm_modify_rolt#:#Du har inte tillräcklig behörighet för att ändra rollmallar! +common#:#msg_no_perm_modify_user#:#Du har inte tillräcklig behörighet att ändra användardata! +common#:#msg_no_perm_paste#:#Du har inte tillräckligt tillstånd för att infoga följande objekt +common#:#msg_no_perm_paste_object_in_folder#:#Du har inte tillräcklig behörighet för att infoga objektet %s i mappen %s. +common#:#msg_no_perm_perm#:#Du har inte tillräcklig behörighet för att komma åt rättighetsinställningarna! +common#:#msg_no_perm_read#:#Du har inte tillräcklig behörighet för att komma åt detta objekt. +common#:#msg_no_perm_read_item#:#Du har inte behörighet att komma åt objektet '%s'. +common#:#msg_no_perm_read_lm#:#Du har inte tillräcklig behörighet för att visa denna utbildningsmodul. +common#:#msg_no_perm_write#:#Du har inte skrivtillstånd! +common#:#msg_no_search_result#:#Inga poster hittades +common#:#msg_no_search_string#:#Var god ange en sökterm +common#:#msg_no_title#:#Välkomna att ange en titel +common#:#msg_not_available_for_anon#:#Den sida du har valt är endast tillgänglig för inloggade användare +common#:#msg_not_in_itself#:#Det är inte möjligt att infoga följande objekt i sig själv +common#:#msg_obj_already_deleted#:#Objektet har redan tagits bort. +common#:#msg_obj_created#:#Objekt skapat +common#:#msg_obj_exists#:#Det här objektet finns redan i den här mappen! +common#:#msg_obj_exists_in_folder#:#Objektet %s finns redan i mappen %s. +common#:#msg_obj_may_not_contain_objects_of_type#:#Objektet %s får inte innehålla objekt av följande typ +common#:#msg_obj_modified#:#Ändringar sparade +common#:#msg_obj_no_download#:#kan inte laddas ner. +common#:#msg_obj_no_link#:#Av tekniska skäl är det tyvärr inte möjligt att länka containerobjekt som kategorier, kurser, grupper och mappar. Länka istället de enskilda objekten i behållarna till önskad plats eller använd objekttyperna kategorilänk, kurslänk eller grupplänk. +common#:#msg_obj_perm_download#:#Du har inte tillräcklig behörighet för att ladda ner följande objekt +common#:#msg_paste_object_not_in_itself#:#Det är inte möjligt att infoga objektet "%s" i sig självt. +common#:#msg_perm_adopted_from1#:#Rättsinställningar hämtade från +common#:#msg_perm_adopted_from2#:#(Inställningarna har sparats!) +common#:#msg_perm_adopted_from_itself#:#Det är inte möjligt att ta över rättighetsinställningarna från den aktuella rollen eller rollmallen själv. +common#:#msg_removed#:#Objekt som avlägsnats från systemet +common#:#msg_role_reserved_prefix#:#Prefixet 'il_' är reserverat för automatiskt genererade roller. Vänligen välj ett annat namn! +common#:#msg_roleassignment_changed#:#Rolltilldelning ändrad +common#:#msg_sysrole_not_deletable#:#Systemrollen kan inte tas bort +common#:#msg_sysrole_not_editable#:#Rättighetsinställningarna för systemrollen kan inte ändras. Systemrollen ger de tilldelade användarna obegränsad åtkomst till alla objekt och funktioner. +common#:#msg_to_many_files#:#För många filer valda, tillåtet antal filer +common#:#msg_trash_empty#:#Det finns inga borttagna objekt i den här mappen! +common#:#msg_undeleted#:#Föremål återställda! +common#:#msg_unit_is_required#:#Det är nödvändigt att ange en enhet här. Vänligen ange ett korrekt värde. +common#:#msg_unknown_value#:#Ett okänt värde skickades. +common#:#msg_user_last_role1#:#Följande användare är endast tilldelade denna roll +common#:#msg_user_last_role2#:#Ta bort användarna eller tilldela dem en annan roll. +common#:#msg_userassignment_changed#:#Användartilldelning ändrad +common#:#msg_wrong_filetypes#:#Tillåtna filtillägg +common#:#msg_wrong_format#:#Det värde du angav uppfyller inte det angivna formatet. +common#:#my_bms#:#Mina bokmärken +common#:#my_certificates#:#Mina certifikat +common#:#my_contacts#:#Mina kontakter +common#:#my_courses#:#Mina kurser +common#:#my_courses_groups#:#Mina kurser och grupper +common#:#my_staff#:#Anställda +common#:#name#:#Namn +common#:#nc_contact_requests_headline#:#Kontaktförfrågningar +common#:#nc_contact_requests_number_p#:#Du har %s kontaktförfrågningar. +common#:#nc_contact_requests_number_s#:#Du har en kontaktförfrågan. +common#:#nc_contact_requests_prop_time#:#Tid +common#:#never#:#Nie +common#:#new#:#Ny +common#:#new_language#:#Nytt språk +common#:#new_pass_equals_old_pass#:#Det nya lösenordet är identiskt med det gamla lösenordet. +common#:#newline#:#Linjeavbrott +common#:#news#:#Nyheter +common#:#next#:#vidare +common#:#no#:#Nej +common#:#no_access_item#:#Du har inte tillräcklig behörighet för att komma åt detta objekt. +common#:#no_access_item_public#:#För att kunna använda detta objekt måste du vara inloggad och ha lämpliga åtkomsträttigheter. +common#:#no_accessibility_control_concept_description#:#För närvarande finns ingen information om tillgänglighet i den här installationen. Kontakta kontaktpunkten för tillgänglighet för mer information. +common#:#no_agreement_description#:#Inget användaravtal erbjuds för närvarande i denna installation. Kontakta din systemadministratör för mer information. +common#:#no_checkbox#:#Du har inte gjort något val. +common#:#no_condition_selected#:#Du har inte valt något förhandsvillkor. +common#:#no_date#:#Inget datum +common#:#no_gallery_users_available#:#Det finns för närvarande inga användare i galleriet. +common#:#no_global_role_left#:#Varje användare måste tilldelas minst en global roll. +common#:#no_import_file_found#:#Ingen importfil hittades +common#:#no_items#:#Inga poster +common#:#no_limit#:#Ingen gräns +common#:#no_mkisofs_configured#:#Du måste konfigurera verktyget mkisofs i ILIAS-installationen för att kunna utföra ISO-exporten. +common#:#no_owner#:#Ingen ägare +common#:#no_parent_access#:#Ingen åtkomst till ett överordnat objekt! +common#:#no_permission#:#Du har inte rätt åtkomsträttigheter! +common#:#no_roles_user_can_be_assigned_to#:#Du har inte tillgång till globala roller, därför kan du inte skapa lokala användare. +common#:#no_start_file#:#Ingen startfil +common#:#no_title#:#Ingen titel +common#:#no_users_selected#:#Vänligen välj minst en användare. +common#:#no_xml_file_found_in_zip#:# XML-filen kunde inte hittas i ZIP-filen +common#:#noc#:#Nyhetsrum +common#:#non_internal_local_roles_only#:#Lokala roller (endast självskapade) +common#:#none#:#Ingen +common#:#normal#:#Normal +common#:#not_available#:#Inte tillgänglig +common#:#not_implemented_yet#:#I utveckling +common#:#not_installed#:#Inte installerad +common#:#not_logged_in#:#Du är inte inloggad +common#:#note#:#Note +common#:#notes#:#Noter +common#:#notes_and_comments#:#Noteringar och kommentarer +common#:#notice#:#Note +common#:#notifications#:#Notifieringar +common#:#nr_following_sessions#:#%1d följande session(er).... +common#:#num_of_selected_files#:#%s fil(er) vald(a) +common#:#num_users#:#Antal användare +common#:#obj#:#Objekt +common#:#obj_accs#:#Tillgänglighet +common#:#obj_accs_desc#:#Inställningar för tillgänglighet +common#:#obj_adm#:#Administration +common#:#obj_adm_desc#:#Innehåller alla administrationsverktyg för din ILIAS-installation. +common#:#obj_adn#:#Meddelanden +common#:#obj_adve#:#Redaktör +common#:#obj_adve_desc#:#Administrationsinställningar för ILIAS-editorn och TinyMCE. +common#:#obj_ass#:#Asset +common#:#obj_assf#:#Test och bedömning +common#:#obj_assf_desc#:#Inställningar och administration av testet och bedömningsverktyget +common#:#obj_auth#:#Autentisering / Ny registrering +common#:#obj_auth_desc#:#Konfigurera typen av användarautentisering (lokal, LDAP, CAS, ...) och de nya inloggningarna här. +common#:#obj_awra#:#"Vem är online?" display +common#:#obj_awra_desc#:#"Vem är online?"-Administratörens display +common#:#obj_bdga#:#Badges +common#:#obj_bdga_desc#:#Hantering av typer, bildmallar och aktivitetsmärken +common#:#obj_bgtk#:#Bakgrundsuppgift +common#:#obj_bibl#:#Litteraturlista +common#:#obj_bibs#:#Litteraturlista +common#:#obj_bibs_desc#:#Litteratur Lista Administration +common#:#obj_blog#:#Blogg +common#:#obj_blog_duplicate#:#Copy blogg +common#:#obj_book#:#Bokning av pool +common#:#obj_cadm#:#Användarkontakter +common#:#obj_cadm_desc#:#Administration för användarkontakter +common#:#obj_cals#:#Kalender +common#:#obj_cals_desc#:#Innehåller globala inställningar för kalendern. +common#:#obj_cat#:#Kategori +common#:#obj_cat_duplicate#:#Kopieringskategori +common#:#obj_catr#:#Kategorilänk +common#:#obj_cert#:#Certifikat +common#:#obj_cert_desc#:#Inställningar för certifikat +common#:#obj_chap#:#Kapitel +common#:#obj_chta#:#Chatt +common#:#obj_chtr#:#chatroom +common#:#obj_chtr_duplicate#:#Kopiera chattrum +common#:#obj_cld#:#Cloud Object###29 07 2022 ny variabel +common#:#obj_cmis#:#LRS +common#:#obj_cmis_desc#:#Konfigurera olika typer av Learning Record Stores +common#:#obj_cmix#:#xAPI/cmi5 +common#:#obj_cmps#:#Plugins +common#:#obj_cmps_desc#:#Generella inställningar för plugins +common#:#obj_coms#:#Kommentarer +common#:#obj_coms_desc#:#Administera kommentarfunktionen +common#:#obj_copa#:#Innehållssida +common#:#obj_cpad#:#Innehållssidor +common#:#obj_cpad#_desc#:#Innehållssidor för administration +common#:#obj_cpad_desc#:#Administration av innehållssidorna +common#:#obj_crs#:#Kurs +common#:#obj_crs_duplicate#:#Kopiera kurs +common#:#obj_crsr#:#Kurslänk +common#:#obj_crss#:#Kurs +common#:#obj_crss_desc#:#Generella inställningar för kurser +common#:#obj_crsv#:#Kursintyg +common#:#obj_dbk#:#Digilib bok +common#:#obj_dcl#:#Insamling av data +common#:#obj_dcl_duplicate#:#Kopiering av datainsamling +common#:#obj_dshs#:#Dashboard +common#:#obj_dshs_desc#:#Administrera instrumentpanelen +common#:#obj_ecss#:#ECS +common#:#obj_ecss_desc#:#Innehåller globala inställningar för E-Learning Community Server +common#:#obj_etal#:#Samtal med anställda +common#:#obj_exc#:#Träning +common#:#obj_exc_duplicate#:#Kopieringsövning +common#:#obj_excv#:#Träningscertifikat +common#:#obj_extt#:#Programvara från tredje part +common#:#obj_extt_desc#:#Här kan du konfigurera externa program och tjänster som stöds av ILIAS. +common#:#obj_facs#:#Filer +common#:#obj_facs_desc#:#Inställningar för filer och filhantering. +common#:#obj_file#:#Fil +common#:#obj_file_duplicate#:#Kopiera fil +common#:#obj_file_inline#:#Inline-fil +common#:#obj_fils#:#Filtjänster +common#:#obj_fils_desc#:#Konfigurera inställningarna för filservicen. +common#:#obj_fold#:#Folder +common#:#obj_fold_duplicate#:#Kopiera mapp +common#:#obj_frm#:#Forum +common#:#obj_frm_duplicate#:#Kopia Forum +common#:#obj_frma#:#Forum +common#:#obj_frma_desc#:#Globala inställningar för forumet +common#:#obj_glo#:#Ordlista +common#:#obj_glo_duplicate#:#Kopiera ordlista +common#:#obj_grp#:#Grupp +common#:#obj_grp_duplicate#:#Kopiera grupp +common#:#obj_grpr#:#Grupplänk +common#:#obj_grps#:#Grupp +common#:#obj_grps_desc#:#Generella inställningar för grupper +common#:#obj_hlps#:#Online hjälp +common#:#obj_hlps_desc#:#Inställningar för onlinehjälp +common#:#obj_htlm#:#Lärmodul HTML +common#:#obj_htlm_duplicate#:#Kopiera HTML utbildningsmodul +common#:#obj_iass#:#Individuell bedömning +common#:#obj_iass_duplicate#:#Kopiera individuell utvärdering +common#:#obj_iass_select#:#-- Välj ett individuellt betyg --. +common#:#obj_itgr#:#Objektblock +common#:#obj_ldap_desc#:#Global LDAP-konfiguration +common#:#obj_lhts#:#Framsteg inom lärande +common#:#obj_lhts_desc#:#Administrera lärande +common#:#obj_lm#:#inlärningsmodul ILIAS +common#:#obj_lm_duplicate#:#Kopiera utbildningsmodul +common#:#obj_lng#:#Språk +common#:#obj_lngf#:#Språk +common#:#obj_lngf_desc#:#Systemspråk kan hanteras här. +common#:#obj_logs#:#Protocolling +common#:#obj_logs_desc#:#Innehåller globala inställningar för ILIAS-loggning +common#:#obj_lrss#:#Lärande moduler +common#:#obj_lrss_desc#:#Konfigurera utbildningsmoduler etc. +common#:#obj_lso#:#Lärande sekvens +common#:#obj_lso_duplicate#:#Kopiera inlärningssekvens +common#:#obj_lsos#:#Lärande sekvenser +common#:#obj_lsos_desc#:#Generella inställningar för inlärningssekvenser +common#:#obj_lti#:#LTI konsument +common#:#obj_lti_duplicate#:#Kopiera LTI konsument +common#:#obj_ltis#:#LTI +common#:#obj_ltis_desc#:#Inlärningsverktyg Interoperabilitet +common#:#obj_mail#:#E-post +common#:#obj_mail_desc#:#Globala inställningar för e-post +common#:#obj_mcst#:#Mediacast +common#:#obj_mcst_duplicate#:#Kopiera Mediacast +common#:#obj_mcts#:#Mediacast +common#:#obj_mcts_desc#:#Generella inställningar för mediacast +common#:#obj_mep#:#media pool +common#:#obj_mep_duplicate#:#Kopiera Mediapool +common#:#obj_mme#:#Huvudmeny +common#:#obj_mob#:#media objekt +common#:#obj_mobs#:#Mediaobjekt och pooler +common#:#obj_mobs_desc#:#Inställningar för mediaobjekt och pooler +common#:#obj_not_found#:#Inget objekt hittat +common#:#obj_nota#:#Notifieringar +common#:#obj_nota_desc#:#Administration av meddelanden +common#:#obj_nots#:#Noter +common#:#obj_nots_desc#:#Administrera notfunktion +common#:#obj_nwss#:#Nyheter och webbflöden +common#:#obj_nwss_desc#:#Inställningar för interna nyheter och externa webbflöden +common#:#obj_objf#:#Definitioner av objekt +common#:#obj_objf_desc#:#ILIAS objekttyper och rättigheter. (Endast för experter!) +common#:#obj_orgu#:#Organisatorisk enhet +common#:#obj_orgu_description#:#Skapande och förvaltning av organisationsstrukturen +common#:#obj_page#:#Sida +common#:#obj_pdfg#:#Skapande av PDF +common#:#obj_pdfg_desc#:#Administrativa inställningar för PDF-skapande +common#:#obj_peac#:#Accordion +common#:#obj_peadl#:#Utökad lista +common#:#obj_peadt#:#Utökad tabell +common#:#obj_pecd#:#Kod +common#:#obj_pech#:#Samråd +common#:#obj_pecl#:#Kolumnlayout +common#:#obj_peclp#:#Klipptavla +common#:#obj_pecom#:#Kompetens +common#:#obj_pecrs#:#Kurs +common#:#obj_pecrt#:#Certifikat +common#:#obj_pecs#:#Innehållsmodul +common#:#obj_pedt#:#Datatabell +common#:#obj_pefl#:# Lista över filer +common#:#obj_peim#:#Interaktiv bild +common#:#obj_pelh#:#Framsteg inom lärande +common#:#obj_pemed#:#Image/Audio/Video +common#:#obj_pemp#:#Karta +common#:#obj_pepd#:#Personuppgifter +common#:#obj_pepe#:#Plugin-element +common#:#obj_pepl#:#Lista över sidor +common#:#obj_peplh#:#platshållare +common#:#obj_pequ#:#Fråga +common#:#obj_perl#:#Lista över material +common#:#obj_pesc#:#Blockera +common#:#obj_petmp#:#SidaTemplate +common#:#obj_peusr#:#Användare +common#:#obj_pg#:#Sida +common#:#obj_poll#:#Röstning +common#:#obj_poll_duplicate#:#Kopiera omröstning +common#:#obj_prg#:#Studieprogram +common#:#obj_prg_duplicate#:#Kopiera studieprogram +common#:#obj_prg_select#:#-- Vänligen välj ett studieprogram --. +common#:#obj_prgr#:#Länk till studieprogrammet +common#:#obj_prgrs#:#Länkar till studieprogram +common#:#obj_prgs#:#Studieprogram +common#:#obj_prgs_desc#:#Administration av studieprogram +common#:#obj_prss#:#Personliga resurser +common#:#obj_prss_desc#:#Administrera personliga resurser +common#:#obj_prtf#:#Portfölj +common#:#obj_prtt#:#Mall för portfölj +common#:#obj_prtt_duplicate#:#Mall för portfölj med kopior +common#:#obj_ps#:#Dataskydd och serversäkerhet +common#:#obj_ps_desc#:#Globala inställningar för integritet och säkerhet +common#:#obj_qpl#:#Frågepool för tester +common#:#obj_qpl_duplicate#:#Kopiera frågebanken för tester +common#:#obj_qpl_select#:#-- Vänligen välj en pool av frågor för tester --. +common#:#obj_rcat#:#Kategori ECS +common#:#obj_rcrs#:#Kursen ECS +common#:#obj_recf#:#Återvunna föremål +common#:#obj_recf_desc#:#Innehåller återställda objekt från systemkontroll +common#:#obj_rep#:#Magasin +common#:#obj_reps#:#Magasin +common#:#obj_reps_desc#:#Generella inställningar för tidningen +common#:#obj_rfil#:#ECS-fil +common#:#obj_rglo#:#ECS Ordlista +common#:#obj_rgrp#:#ECS-gruppen +common#:#obj_rlm#:#ECS utbildningsmodul +common#:#obj_role#:#Roll +common#:#obj_rolf#:#Rolls +common#:#obj_rolf_desc#:#Rollhantering +common#:#obj_rolf_local#:#Lokala roller +common#:#obj_rolf_local_desc#:#Innehåller lokala roller för objekt nr. +common#:#obj_rolt#:#rollmall +common#:#obj_root#:#Magazine - Ingångssida +common#:#obj_rtst#:#ECS-test +common#:#obj_rwik#:#ECS Wiki +common#:#obj_sahs#:#Lärande modul SCORM +common#:#obj_sahs_duplicate#:#Kopiera utbildningsmoduler +common#:#obj_sco#:#SCO +common#:#obj_scov#:#SCORM certifikat +common#:#obj_seas#:#Sökning +common#:#obj_seas_desc#:#Konfigurera sökningen här. +common#:#obj_sess#:#Session +common#:#obj_sess_duplicate#:#Kopiera session +common#:#obj_skmg#:#Kompetenshantering +common#:#obj_skmg_desc#:#Hantera kompetenser och kategorier +common#:#obj_spl#:#Frågepool för enkäter +common#:#obj_spl_select#:#-- Vänligen välj en pool av frågor för undersökningar --. +common#:#obj_st#:#Kapitel +common#:#obj_sty#:#Stil för innehåll +common#:#obj_stys#:#Layout +common#:#obj_stys_desc#:#Inställningar för installationens utseende och för stilar för vissa innehållsobjekt +common#:#obj_svy#:#Undersökning +common#:#obj_svy_duplicate#:#Kopiundersökning +common#:#obj_svyf#:#Undersökningar +common#:#obj_svyf_desc#:#Systemövergripande inställningar för undersökningar +common#:#obj_sysc#:#Systemkontroll +common#:#obj_sysc_desc#:#Verktyg för systemkontroll och felsökning +common#:#obj_tags#:#Märkning +common#:#obj_tags_desc#:#Inställningar för taggning +common#:#obj_tala#:#Tala mallar +common#:#obj_tala_desc#:#Tala mallar +common#:#obj_tals#:#Staff Talk Series +common#:#obj_talt#:#Talk mall +common#:#obj_task#:#Att göra +common#:#obj_tax#:#Taxonomi +common#:#obj_taxf#:#Taxonomi mapp +common#:#obj_tool_setting_calendar#:#Kalenderblock +common#:#obj_tool_setting_calendar_active#:#Kalender +common#:#obj_tool_setting_calendar_active_info#:#Kalendern är aktiverad. +common#:#obj_tool_setting_calendar_info#:#Blocket "Kalender" visas på fliken "Innehåll". +common#:#obj_tool_setting_custom_metadata#:#Användardefinierade metadata +common#:#obj_tool_setting_custom_metadata_info#:#Dataposter kan hanteras på fliken "Metadata". Här kan du ange ytterligare information om objektet och beskriva det mer detaljerat. +common#:#obj_tool_setting_news#:#Nyheter +common#:#obj_tool_setting_news_info#:#Blocket "Nyheter" visas på fliken "Innehåll". +common#:#obj_tos#:#Använda avtal +common#:#obj_tos_desc#:#Hantera användaravtal +common#:#obj_trac#:#Statistik om åtkomst och framsteg i lärandet +common#:#obj_trac_desc#:#Statistik och inlärningsframsteg inställningar och översikt +common#:#obj_tst#:#Test +common#:#obj_tst_duplicate#:#Kopiera test +common#:#obj_tstv#:#Testa certifikat +common#:#obj_type#:#Objekttyp +common#:#obj_user#:#Användare +common#:#obj_usr#:#Användare +common#:#obj_usrf#:#ILIAS räkenskaper +common#:#obj_usrf_desc#:#Hantering av ILIAS-konton +common#:#obj_wbdv#:#WebDAV +common#:#obj_wbdv_desc#:#Konfiguration av WebDAV-inställningarna. +common#:#obj_wbrs#:#Webblänk +common#:#obj_wbrs_desc#:#Generella inställningar för webblänkar +common#:#obj_webr#:#Webblänk +common#:#obj_webr_duplicate#:#Kopiera Webblänk insamling +common#:#obj_wfe#:#Arbetsflödesmotor +common#:#obj_wfld#:#Folder +common#:#obj_wiki#:#Wiki +common#:#obj_wiki_duplicate#:#Kopiera Wiki +common#:#obj_wiks#:#Wiki +common#:#obj_wiks_desc#:#Globala wiki-inställningar +common#:#object#:#Objekt +common#:#object_added#:#Objekt tillagt +common#:#object_copy_in_progress#:#Kopieringsprocessen har påbörjats. +common#:#object_duplicated#:#Objekt kopierat +common#:#object_id#:#Objekt-ID +common#:#object_imported#:#Objekt importerat +common#:#objects#:#Objekt +common#:#objf#:#Definitioner av objekt +common#:#objs_bibl#:#Listor över litteratur +common#:#objs_blog#:#Bloggar +common#:#objs_book#:#Bokning av pooler +common#:#objs_cat#:#Kategorier +common#:#objs_catr#:#Kategorilänkar +common#:#objs_chtr#:#chatrooms +common#:#objs_cld#:#Cloud Objects###29 07 2022 ny variabel +common#:#objs_cmix#:#Objekt xAPI/cmi5 +common#:#objs_copa#:#Innehållssidor +common#:#objs_crs#:#Kurser +common#:#objs_crsr#:#Kurslänkar +common#:#objs_dcl#:#Insamling av data +common#:#objs_etal#:#Samtal med anställda +common#:#objs_exc#:#Övningar +common#:#objs_file#:#Filer +common#:#objs_fold#:#Folder +common#:#objs_frm#:#Forum +common#:#objs_glo#:#Glossarier +common#:#objs_grp#:#Grupper +common#:#objs_grpr#:#Grupplänkar +common#:#objs_htlm#:#HTML utbildningsmoduler +common#:#objs_iass#:#Individuella bedömningar +common#:#objs_itgr#:#Objektblock +common#:#objs_lm#:#ILIAS utbildningsmoduler +common#:#objs_lres#:#läromedel +common#:#objs_lso#:#Lärande sekvenser +common#:#objs_lti#:#LTI konsumenter +common#:#objs_mail#:#E-post +common#:#objs_mcst#:#Mediakaster +common#:#objs_mep#:#mediepooler +common#:#objs_orgu#:#Organisatoriska enheter +common#:#objs_poll#:#Omröstningar +common#:#objs_prg#:#Studieprogram +common#:#objs_prgr#:#Länkar till studieprogram +common#:#objs_prtf#:#Portföljer +common#:#objs_prtt#:#Mallar för portföljer +common#:#objs_qpl#:#Frågeställning frågepooler +common#:#objs_qst#:#Frågor och svar +common#:#objs_rcat#:#ECS-kategorier +common#:#objs_rcrs#:#Kursen ECS +common#:#objs_rfil#:#ECS-filer +common#:#objs_rglo#:#ECS ordlistor +common#:#objs_rgrp#:#ECS-grupper +common#:#objs_rlm#:#ECS utbildningsmoduler +common#:#objs_role#:#Rolls +common#:#objs_rtst#:#ECS-tester +common#:#objs_rwik#:#ECS wikis +common#:#objs_sahs#:#SCORM utbildningsmoduler +common#:#objs_sess#:#Sessioner +common#:#objs_spl#:#Pooler med enkätfrågor +common#:#objs_st#:#Kapitel +common#:#objs_svy#:#Undersökningar +common#:#objs_tala#:#Tala mallar +common#:#objs_talt#:#Tala mallar +common#:#objs_tst#:#Test +common#:#objs_webr#:#Webblänkar +common#:#objs_wiki#:#Wikis +common#:#of#:#från +common#:#offline#:#Offline +common#:#offline_mode#:#Offlineläge +common#:#ok#:#OK +common#:#old#:#Alt +common#:#omit#:#Uppdrag +common#:#omit_all#:#Lämna ut dem alla +common#:#on_waiting_list#:#Antecknad på väntelistan +common#:#online#:#Online +common#:#online_time#:#Total tid online (DD +common#:#only_active#:#Endast aktiv +common#:#only_inactive#:#Endast inaktiv +common#:#open#:#Öppen +common#:#operation#:#Operation +common#:#optimize#:#Optimise +common#:#option#:#Alternativ +common#:#optional_filter_hint#:#Välkomna att aktivera ett av de valfria filtren. +common#:#optional_filters#:#Alternativa filter +common#:#options#:#Inställningar +common#:#order_by#:#Sortera efter +common#:#order_by_date#:#Sortera efter datum +common#:#org_op_access_enrolments#:#Visa status för inskrivning +common#:#org_op_manage_members#:#Hantera underordnade medlemmar +common#:#org_op_read_learning_progress#:#Visa inlärningsframstegen för underordnade användare +common#:#org_permission_settings#:#Rättigheter för positioner i organisatoriska enheter +common#:#org_units#:#Organisatoriska enheter +common#:#organization#:#Tillhandahållare +common#:#other#:#Andra +common#:#overview#:#Översikt +common#:#overwrite#:#Överskrivning +common#:#owner#:#Owned by###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +common#:#owner_updated#:#Uppgifterna har uppdaterats. +common#:#page#:#Sida +common#:#page_count#:#Antal sidor +common#:#page_layout#:#Sidans layout +common#:#page_layouts#:#Sidlayouter +common#:#pages#:#Sidor +common#:#pagination_label_x_of_y#:#Sida %1$d av %2$d +common#:#parameter#:#Parametrar +common#:#parse#:#Parsen +common#:#participate#:#Logga in +common#:#passed#:#Bekräftad +common#:#passwd#:# Lösenord +common#:#passwd_generation#:#Generering av lösenord +common#:#passwd_invalid#:#Det nya lösenordet är inte tillåtet! Lösenordet måste innehålla minst sex tecken och får endast innehålla följande tecken +common#:#passwd_not_match#:#Dina uppgifter om det nya lösenordet stämmer inte överens! Ange det nya lösenordet igen. +common#:#passwd_wrong#:#Lösenordet du angav är fel! +common#:#password#:# Lösenord +common#:#password_allow_chars#:#Tillåtna tecken +common#:#password_assistance_info#:#Om lösenordssupport är aktiverat kommer en länk med namnet "Glömt ditt lösenord?" att visas på ILIAS inloggningssida. Användare kan använda denna funktion för att automatiskt få ett nytt lösenord. +common#:#password_change_on_first_login_demand#:#Ditt lösenord måste ändras innan du kan använda ILIAS. +common#:#password_contains_invalid_chars#:#Lösenordet innehåller ogiltiga tecken. +common#:#password_contains_parts_of_login_err#:#Lösenordet du har valt innehåller delar av ditt inloggningsnamn. Vänligen ange ett annat lösenord. +common#:#password_empty#:#Lösenordet får inte vara tomt. +common#:#password_expired#:#Ditt lösenord har gått ut och måste ändras eftersom det senast ändrades för %s dag(ar) sedan. +common#:#password_multiple_errors#:#Flera lösenordskriterier är inte uppfyllda +common#:#password_must_chars_and_numbers#:#Lösenordet måste innehålla bokstäver och siffror. +common#:#password_must_contain_lcase_chars#:#Lösenordet måste innehålla minst %s gemena bokstäver. +common#:#password_must_contain_ucase_chars#:#Lösenordet måste innehålla minst %s stora bokstäver. +common#:#password_must_special_chars#:#Lösenordet måste innehålla specialtecken. +common#:#password_to_long#:#Lösenordet får inte vara längre än %s tecken. +common#:#password_to_short#:#Lösenordet måste vara minst %s tecken långt. +common#:#paste#:#Insert +common#:#pasteChapter#:#Insert +common#:#pastePage#:#Insert +common#:#paste_clipboard_items#:#Insert +common#:#path#:#Stig +common#:#path_not_set#:#Sökväg ej angiven +common#:#path_to_convert#:#CONVERT kommandorad +common#:#path_to_htmldoc#:#HTMLdoc kommandorad +common#:#path_to_java#:#JAVA-kommandoraden +common#:#path_to_unzip#:#UNZIP kommandorad +common#:#path_to_zip#:#ZIP kommandorad +common#:#pathes#:#Vägar +common#:#pd_items_news#:#Inkluderar nyheter om de utvalda objekten +common#:#pdf_export#:#PDF-export +common#:#pdfg_edit_permission#:#Ändra inställningar för rättigheter +common#:#pdfg_read#:#Läs tillgång till PDF-skapande +common#:#pdfg_visible#:#PDF-skapandet är synligt. +common#:#pdfg_write#:#Redigera inställningar för PDF-skapande +common#:#perm_settings#:#Rättigheter +common#:#perma_link#:#Länk till denna sida +common#:#permission#:#Lagstiftning +common#:#permission_denied#:#Ingen åtkomsträtt +common#:#permission_settings#:#Inställningar för rättigheter +common#:#person_title#:#Titel +common#:#personal_data#:#Personuppgifter +common#:#personal_picture#:#Profilbild +common#:#personal_profile#:#Profil- och dataskydd +common#:#personal_resources#:#Personliga resurser +common#:#personal_settings#:#Inställningar +common#:#persons#:#Människor +common#:#pg_add#:#Skapa sida +common#:#pg_new#:#Ny sida +common#:#phone#:#Telefon +common#:#phone_home#:#Telefon Privat +common#:#phone_mobile#:#Telefon Mobil +common#:#phone_office#:#Telefonarbete +common#:#phrase#:#Fras +common#:#please_choose#:#-- Vänligen välj --. +common#:#please_enter_target#:#Var god ange en destination. +common#:#please_enter_title#:#Vänligen ange en titel. +common#:#please_select#:#-- Vänligen välj --. +common#:#please_select_a_delivered_file_to_delete#:#Du måste markera minst en inskickad redigering för att kunna ta bort den! +common#:#please_select_a_delivered_file_to_download#:#Du måste välja minst en inskickad redigering för att kunna ladda ner den! +common#:#please_wait#:#Vänligen vänta... +common#:#port#:#Port +common#:#portfolio#:#Portfölj +common#:#pos_bottom#:#Botten +common#:#pos_left#:#Länkar +common#:#pos_right#:#Höger +common#:#pos_top#:#Topp +common#:#position#:#Position +common#:#position_permission_settings#:#Rättigheter enligt positioner +common#:#precondition#:#Förkunskapskrav +common#:#precondition_not_accessible#:#Detta villkor kan inte visas på grund av avsaknad av tillstånd. +common#:#precondition_required_itemlist#:#Krävd förutsättning +common#:#precondition_toggle#:#Förutsättningar som måste uppfyllas för tillgång +common#:#preconditions#:#Förutsättningar +common#:#preconditions_obligatory_hint#:#Välkomna att uppfylla följande villkor +common#:#preconditions_optional_hint#:#Var vänlig uppfyll minst %s av följande förhandsvillkor +common#:#predefined_template#:#Fördefinierad rollmall +common#:#preferences#:#Användardefinierade inställningar +common#:#presentation_table_more#:#Visa mer +common#:#preview#:#Förhandsgranskning +common#:#preview_caption#:#Förhandsgranskning %sof %s +common#:#preview_create#:#Skapa förhandsvisning +common#:#preview_delete#:#Ta bort förhandsgranskning +common#:#preview_learner_info#:#Om den är aktiverad erbjuds kurs- och gruppadministratörer möjligheten att se kursen eller gruppen ur en fiktiv kurs- eller gruppmedlems perspektiv. +common#:#preview_loading#:#Ladda ner förhandsgranskning... +common#:#preview_none#:#Preview (ännu ej tillgänglig) +common#:#preview_renderers#:# Rendering av förhandsgranskning +common#:#preview_settings#:#Fil förhandsgranskning +common#:#preview_show#:#Förhandsgranskning av display +common#:#preview_status_creating#:#Förhandsgranskningen håller på att skapas. Detta kan ta lite tid... +common#:#preview_status_deleting#:#Förhandsvisningen är borttagen... +common#:#preview_status_failed#:#Förhandsgranskningen kunde inte skapas. +common#:#preview_status_missing#:#Det finns ingen förhandsgranskning tillgänglig för den här filen. +common#:#preview_status_pending#:#Förhandsgranskningen har inte skapats ännu. Vänligen försök igen senare. +common#:#previous#:#Tillbaka +common#:#prg_copy_threads_info#:#Välj vilka delar av studieprogrammet som ska kopieras, länkas eller utelämnas från kopieringsprocessen. +common#:#prg_wizard_page#:#Kopiera studieprogram (steg 2/2) +common#:#prgr_add#:#Skapa länk till studieprogram +common#:#prgr_edit_info#:#Välj det studieprogram som du vill skapa en länk till. +common#:#prgr_new#:#Skapa en ny länk till ett studieprogram +common#:#prgr_settings#:#Inställningar för länken till studieprogrammet +common#:#print#:#Utskrift +common#:#print_view#:# Skriv ut vy +common#:#private_notes#:#Privata anteckningar +common#:#pro#:#Pro +common#:#proceed#:#Fortsättning +common#:#profile#:#Profil +common#:#profile_changed#:#ILIAS eLearning - Dina profiluppgifter har ändrats +common#:#profile_incomplete#:#Din profil är inte komplett. Ange alla obligatoriska uppgifter. +common#:#profile_of#:#Profil från +common#:#properties#:#Egenskaper +common#:#proxy#:#Proxy +common#:#proxy_connectable#:#Anslutning gjord. +common#:#proxy_host#:#Host +common#:#proxy_host_info#:#Ange en värd här. +common#:#proxy_not_connectable#:#ILIAS kan inte upprätta en anslutning till proxyn. +common#:#proxy_port#:#Port +common#:#proxy_port_info#:# Ange en port i intervallet 0 till 65535, t.ex. 8080. +common#:#proxy_port_numeric#:#Porten får endast bestå av numeriska tecken och måste ha ett värde mellan 0 och 65535. +common#:#proxy_socket_error#:#Fel i uttaget +common#:#proxy_status#:#Proxy +common#:#proxy_status_info#:#För att använda en proxy i ILIAS (t.ex. för webbflöden och kontroll av webblänkar), vänligen aktivera denna bock. +common#:#ps_export_scorm#:#Personuppgifter i loggdata +common#:#ps_password_lowercase_chars_num#:#Låga bokstäver +common#:#ps_password_lowercase_chars_num_info#:#Ange antalet gemener som måste ingå i ett användarlösenord. Om värdet 0 anges är det inte obligatoriskt med små bokstäver i lösenordet. +common#:#ps_password_must_not_contain_loginame#:#Förhindra inloggningsnamn i lösenord +common#:#ps_password_must_not_contain_loginame_info#:#ILIAS förhindrar att inloggningsnamnet används som en del av lösenordet. +common#:#ps_password_uppercase_chars_num#:#Stora bokstäver +common#:#ps_password_uppercase_chars_num_info#:#Ange antalet versaler som måste ingå i ett användarlösenord. Om värdet 0 anges är det inte obligatoriskt med stora bokstäver i lösenordet. +common#:#pub_section#:#Anonym tillgång +common#:#pub_section_info#:#Alternativet gör det möjligt att göra delar av systemet allmänt tillgängliga utan autentisering. Behörigheterna för rollen "Anonym" avgör hur resurser är offentligt tillgängliga. +common#:#public#:#offentlig +common#:#public_notes#:#Publika anteckningar +common#:#public_profile#:#Profil +common#:#public_room#:#Publikt chattrum +common#:#purpose#:#Använda +common#:#qpl#:#Frågepool för tester +common#:#qpl_add#:#Skapa en frågepool +common#:#qpl_copy#:#Kopiera frågebanken för tester +common#:#qpl_new#:#Skapa ny frågebank för tester +common#:#query_data#:#Visa data +common#:#question#:#Fråga +common#:#question_message#:#Fråga +common#:#quit#:#Logga ut +common#:#quote#:#Citat +common#:#reached_session_limit#:#Det maximala antalet användare online har uppnåtts. Vänligen försök igen senare. +common#:#read#:#Läsbehörighet +common#:#readcount_anonymous_users#:#Läsa åtkomster av anonyma användare +common#:#readcount_users#:#Läsa åtkomster för registrerade användare +common#:#recipient#:#An +common#:#reference_deleted#:#Mål inte tillgängligt +common#:#reference_of#:#Länk till +common#:#referral_comment#:#Hur känner du till ILIAS? +common#:#refresh#:#Uppdatera +common#:#refresh_languages#:#Uppdatera alla språk +common#:#refuse#:#Avvisa ansökan +common#:#refuse_tos_acceptance#:#Avvisa godkännande av användaravtalet +common#:#reg_account_confirmation_successful#:#ILIAS-kontot har bekräftats och aktiverats. +common#:#reg_goto_parent_membership_info#:#Endast medlemmar kan komma åt målobjektet. +common#:#reg_mail_body_2_confirmation#:#Länken är bara giltig i %s, därefter måste du registrera dig igen. +common#:#reg_mail_body_3_confirmation#:#Om du har fått detta e-postmeddelande oväntat, är det möjligt att någon annan har angett din e-postadress av misstag eller avsiktligt. I detta fall, vänligen ignorera detta mail. +common#:#reg_mail_body_forgot_password_info#:#För att begära ett nytt lösenord för detta användarkonto, använd funktionen "Har du glömt ditt lösenord?" på inloggningssidan. +common#:#reg_mail_body_salutation#:#Hello +common#:#reg_mail_body_text1#:#Välkommen till eLearning-plattformen ILIAS! +common#:#reg_mail_body_text2#:#Dina åtkomstuppgifter +common#:#reg_mail_body_text3#:#Övriga personuppgifter +common#:#reg_mail_subject#:#ILIAS eLearning - Dina åtkomstdata +common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Din bekräftelselänk +common#:#reg_passwd_via_mail#:#Lösenordet kommer att skickas till den e-postadress som anges nedan. +common#:#register#:#Registrera +common#:#register_notification#:#"%s" har begärt att få delta i mötet "%s". +common#:#registered_since#:#Registrerad sedan +common#:#registered_user#:#registrerad användare +common#:#registered_users#:#registrerade användare +common#:#registration#:#Registrera nytt ILIAS-konto +common#:#related_to#:#Relaterar till +common#:#remove#:#Remove +common#:#remove_entries#:#Radera poster +common#:#remove_translation#:#Ta bort översättning +common#:#rename#:#Rename +common#:#rename_file#:# Namnge filen +common#:#renderer_supported_file_types#:#Filtyper som stöds +common#:#renderer_supported_repo_types#:#ILIAS-objekt som stöds +common#:#renderer_type_builtin#:#Inbyggd i +common#:#rep_main_page#:#Inledande sida +common#:#repeat_scan#:#Upprepa virussökning... +common#:#repeat_scan_failed#:# Upprepad sökning misslyckades. +common#:#repeat_scan_succeded#:# Upprepad skanning lyckades. +common#:#replace_file#:#Byt ut filen +common#:#reply#:#Svar +common#:#report_accessibility_issue#:#Rapportera barriär +common#:#report_accessibility_link#:#Messenger-länk +common#:#report_accessibility_link_mailto#:#Meddelad%20länk +common#:#repository#:#Magasin +common#:#repository_admin#:#Tidning och papperskorg +common#:#repository_admin_desc#:#Ställa in rättighetsinställningar för magasinsobjekt, ta bort eller återställa objekt i papperskorgen +common#:#require_email#:#Obligatorisk inmatning av e-post +common#:#require_gender#:#Obligatoriskt införande av hälsning +common#:#require_hobby#:#Obligatorisk input Hobby +common#:#require_matriculation#:#Obligatorisk registrering av matrikelnummer +common#:#require_referral_comment#:#Obligatorisk post info kommentar +common#:#required_field#:#Krävd specifikation +common#:#res_links#:#Länkar i tidningen +common#:#res_links_short#:#Länkar +common#:#reset#:#Återställ +common#:#reset_filter#:#Återställ filter +common#:#resources#:#Resurser +common#:#right#:#Lagstiftning +common#:#rights#:#Rättigheter +common#:#role#:#Roll +common#:#role_add_user#:#Lägg till användare +common#:#role_added#:#Roll skapad +common#:#role_assignment#:#Rolltilldelning +common#:#role_assignment_updated#:#Rolltilldelningen har ändrats. +common#:#role_edit#:#Redigera roll +common#:#role_mailto#:#Mail till alla tilldelade användare +common#:#role_new#:#Skapa ny roll +common#:#role_new_search#:#Ny sökning +common#:#role_no_roles_selected#:#Du har inte valt en roll +common#:#role_protect_permissions#:#Skydda rättigheter +common#:#role_protect_permissions_desc#:#Objekträttigheterna för den här rollen ändras inte längre av systemoperationer. Dessutom kan endast administratörer på högre nivå justera rättigheterna. +common#:#role_select_one_item#:#Välj minst ett objekt. +common#:#role_sure_delete_desk_items#:#Är du säker på att du vill att detta uppdrag ska tas bort? +common#:#role_templates_only#:#Endast mallar för roller +common#:#roles#:#Rolls +common#:#roles_of_import_global#:#Globala roller i importfilen +common#:#roles_of_import_local#:#Lokala roller i importfilen +common#:#rolf#:#Rollinnehavare +common#:#rolf_added#:#Rollmapp skapad +common#:#rolf_create_role#:#Skapa ny roll +common#:#rolf_create_rolt#:#Skapa ny rollmall +common#:#rolf_delete#:#Ta bort roller/rollmallar +common#:#rolf_edit_permission#:#Åtkomst till rättighetsinställningar för roller/rollmallar +common#:#rolf_edit_userassignment#:#Ändra användartilldelning till roller +common#:#rolf_read#:#Läsbehörighet till roller/rollmallar +common#:#rolf_visible#:#Roller/rollmallar är synliga +common#:#rolf_write#:#Redigera rättighetsmallar för roller/rollmallar +common#:#rolt#:#rollmall +common#:#rolt_added#:#Rollmall skapad +common#:#rolt_edit#:#Redigera rollmall +common#:#rolt_new#:#Ny rollmall +common#:#row#:#Linje +common#:#rows#:#linjer +common#:#rpc_pdf_font#:#Fonts +common#:#rpc_pdf_font_info#:#Ytterligare teckensnitt för skapande av PDF-filer. Alla ytterligare angivna teckensnitt måste installeras på serversidan eller göras kända för Java-servern vid start. +common#:#rpc_pdf_generation#:#Skapande av PDF +common#:#sad#:#Sad +common#:#sahs#:#Lärande modul SCORM +common#:#sahs_added#:#SCORM utbildningsmodul skapad +common#:#sahs_export_file#:#SCORM arkivfil exporterad från ILIAS +common#:#sahs_insert_chap_from_clip#:#Insätt kapitel från urklipp +common#:#sahs_insert_page_from_clip#:#Insätt sidor från Urklipp +common#:#sahs_insert_sco_from_clip#:#Insert SCOs från urklipp +common#:#salutation#:#Adress +common#:#salutation_f#:#Kvinna +common#:#salutation_m#:#Mr +common#:#salutation_n#:#Ingen specifikation +common#:#saml_log_in#:#Logga in +common#:#saml_login_form_info_txt#:#För att logga in via SAML, klicka på knappen "Logga in". +common#:#saml_login_form_txt#:#Logga in på ILIAS via SAML +common#:#save#:#Spara +common#:#save_and_back#:#Spara och återvänd +common#:#save_message#:#Spara som utkast +common#:#save_params_for_cron#:#Spara parametrar för cron-jobb +common#:#save_refresh#:#Spara och uppdatera +common#:#save_return#:#Spara och återvänd +common#:#save_settings#:#Spara inställningar +common#:#save_user_related_data#:#Spara användarspecifika åtkomstdata +common#:#saved_successfully#:#Dina ändringar har sparats +common#:#saving#:#Säker... +common#:#scorm_create_export_file_html#:#Skapa HTML exportfil +common#:#scorm_create_export_file_pdf#:#Skapa PDF-exportfil +common#:#scorm_create_export_file_scrom12#:#Skapa exportfil för SCORM 1.2 +common#:#scorm_create_export_file_scrom2004#:#Skapa exportfil för SCORM 2004 +common#:#scorm_create_export_file_scrom2004_4th#:#Skapa exportfil för SCORM 2004-4th_edition +common#:#scorm_login_as_learner_id#:#SCORM 2004 +common#:#scorm_login_as_learner_id_info#:#I stället för ILIAS-användar-ID anges ILIAS-inloggningsnamnet för cmi.learner_id. +common#:#scorm_lp_auto_activate#:#Standardinställningar för inlärningsframsteg +common#:#scorm_lp_auto_activate_info#:#När inlärningsstatus är allmänt aktiverad, för nya SCORM-lärmoduler, bestäms den övergripande statusen för inlärningsstatus av valda SCORM-material (SCO) och alla SCO väljs för bestämning av inlärningsstatus. Anpassningar är fortfarande möjliga för varje +common#:#scorm_new#:#Skapa en ny SCORM-lärmodul +common#:#scorm_without_session#:#Aktivera lagring av SCORM 2004 utan session +common#:#scorm_without_session_info#:#Detta säkerställer lagring av SCORM 2004-inlärningsnivådata även om ILIAS-sessionen har löpt ut. Med SCORM 1.2 är sparande utan session alltid aktiverat. +common#:#search#:#Sökning +common#:#search_active#:#Aktiva användare +common#:#search_at_current_position#:#På den aktuella positionen +common#:#search_engine#:#Läsbara .html-URL:er +common#:#search_for#:#Sökning +common#:#search_globally#:#I hela tidningen +common#:#search_in#:#Sökning i +common#:#search_inactive#:#Inaktiva användare +common#:#search_new#:#Ny sökning +common#:#search_result#:#Sökresultat +common#:#search_results#:#Sökresultat +common#:#search_user#:#Sök användare +common#:#seas_max_hits#:#Maximalt antal träffar +common#:#seas_max_hits_info#:#Ställ in det maximala antalet sökresultat som ska visas efter en sökfråga. Ju lägre antal, desto snabbare laddas sidan. +common#:#seas_settings#:#Sökinställningar +common#:#second#:#Sekund +common#:#second_email#:#Andra e-postmeddelandet +common#:#seconds#:#Sekunder +common#:#sel_country#:#Land +common#:#select#:#Välj +common#:#select_all#:#Välj alla +common#:#select_at_least_one_object#:#Välj minst ett objekt. +common#:#select_file#:#Välj fil +common#:#select_files_from_computer#:#Välj filer +common#:#select_max_one_item#:#Välj endast ett objekt. +common#:#select_object_to_link#:#Välj objektet som ska länkas. +common#:#select_one#:#Vänligen gör ett urval. +common#:#select_question_pool_info#:#Om importfilen innehåller frågor kommer dessa också att importeras till den valda frågepoolen. +common#:#select_questionpool#:#Insätt frågor i +common#:#selected#:#Vald +common#:#selected_files#:#Utvalda filer +common#:#selected_items#:#Utvalda erbjudanden +common#:#selected_items_back#:#Tillbaka till erbjudanden +common#:#selected_languages_updated#:#De valda språken har uppdaterats (om installerat) +common#:#send#:#Skicka +common#:#send_mail#:#Skicka e-post +common#:#sender#:#Sändare +common#:#sent#:#Sänt +common#:#sequence#:#Sekvens +common#:#sequences#:#Sekvenser +common#:#server#:#Server +common#:#server_data#:#Server-info +common#:#server_disabled#:#Chatten är avaktiverad +common#:#server_software#:#Serverprogramvara +common#:#sess#:#Session +common#:#sess_fixed_duration#:#Fixerad sessionslängd +common#:#sess_load_dependent_session_handling#:#Laddningsberoende sessionsinställningar +common#:#sess_mode#:#Sessionsläge +common#:#session_config#:#Inställningar för sessionen +common#:#session_config_maintenance_disabled#:#Ändringar i klienten inte tillåtna +common#:#session_mail_subject_deletion#:#Logga ut användaren "%s" från sessionen "%s". +common#:#session_mail_subject_entered#:#Accession av användaren "%s" till sessionen "%s +common#:#session_mail_subject_registered#:#Registrering av användaren "%s" för sessionen "%s +common#:#session_max_count#:#Maximalt antal aktiva sessioner +common#:#session_max_count_info#:#Definierar det maximala antalet sessioner som kan existera samtidigt. Om detta värde sätts till "0" är funktionen inaktiverad. +common#:#session_max_idle#:#Maximal inaktiv tid för en session (i minuter) +common#:#session_max_idle_after_first_request#:#Minsta inaktiva tid för en session efter den första begäran (i minuter) +common#:#session_max_idle_after_first_request_info#:#Om en användare är inaktiv under denna tidsperiod efter sin första begäran kan hans session raderas om en annan session ska skapas för en annan användare och den maximala sessionsgränsen har uppnåtts. +common#:#session_max_idle_info#:#Om en användare är inaktiv under denna period har sessionen löpt ut. +common#:#session_min_idle#:#Minsta inaktiva tid för en session (i minuter) +common#:#session_min_idle_info#:#Om en användare är inaktiv under minst denna tidsperiod kan hans session raderas om en annan session ska skapas för en annan användare och den maximala sessionsgränsen har uppnåtts. +common#:#session_reminder#:#Session-Påminnelse +common#:#session_reminder_alert#:#Din session kommer att löpa ut i %1$s av %2$s! Klicka på OK för att förlänga sessionen! Om du däremot inte längre vill bli påmind i den aktuella webbläsarsessionen väljer du Avbryt. Berörd installation +common#:#session_reminder_info#:#Om aktiverat kommer du att få en påminnelse innan din session löper ut. +common#:#session_reminder_lead_time#:#Tid för ledning +common#:#session_reminder_lead_time_info#:#Här kan du definiera när ILIAS ska varna dig innan din session löper ut. Du kommer då att få ett meddelande och kan enkelt förlänga sessionen med ett musklick. Ange ett värde i minuter. Rekommenderat är 5 minuter.
Det aktuella värdet för hur länge e +common#:#session_reminder_session_duration#:#(Aktuell sessions varaktighet +common#:#set#:#Set +common#:#setSystemLanguage#:#Ändra systemets språk +common#:#setUserLanguage#:#Ändra användarspråk +common#:#set_offline#:#Ställ in Offline +common#:#set_online#:#Puta online +common#:#set_skin_does_not_exist#:#Valt skin finns inte längre. Ett nytt skin kan aktiveras i de personliga inställningarna eller så kan en administratör kontaktas. Aktuellt val +common#:#set_style_does_not_exist#:#Den valda systemstilen finns inte längre. En ny systemstil kan aktiveras i de personliga inställningarna eller så kan en administratör kontaktas. Aktuellt val +common#:#settings#:#Inställningar +common#:#settings_for_all_members#:#Medlemmar kommer att meddelas automatiskt +common#:#settings_per_users#:#Medlemmar meddelas automatiskt. För varje medlem kan det definieras individuellt om de får avaktivera aviseringen. +common#:#settings_presentation_header#:#Presentation +common#:#settings_saved#:#Inställningarna har sparats. +common#:#shib#:#Shibboleth +common#:#shib_active#:#Aktivera autentisering av shibboleth +common#:#shib_city#:#Attribut för stad +common#:#shib_country#:#Attribut för land +common#:#shib_data_conv#:#Stig till API för datamanipulering +common#:#shib_data_conv_warning#:#Det angivna API:et för datamanipulering kan inte läsas. +common#:#shib_department#:#Attribut för avdelning +common#:#shib_email#:#Attribut för e-postadress +common#:#shib_federation_name#:#Namn på Shibboleth-federationen +common#:#shib_firstname#:#Attribut för förnamn +common#:#shib_gender#:#Attribut för tilltal (måste vara 'n', 'm' eller 'f') +common#:#shib_general_login_instructions#:#För att registrera dig via %s, klicka på registreringsknappen och välj din organisation på följande sida.
Om du har några frågor om detta, vänligen kontakta %s +common#:#shib_general_wayf_login_instructions#:#Om du inte tillhör någon av de listade organisationerna och behöver tillgång till en kurs på denna server, vänligen kontakta %s +common#:#shib_idp_list#:#Please provide a list of identity providers from which the user can choose on the ILIAS login page.
På varje rad måste det finnas en kommaseparerad tupel som består av providerID för enIdP (se Shibboleth-metadata) och namnet +common#:#shib_institution#:#Attribut för institutionen +common#:#shib_invalid_home_organization#:#Välkomna att välja en giltig organisation +common#:#shib_language#:#Attribut för språk +common#:#shib_lastname#:#Attribut för efternamn +common#:#shib_login#:#Unikt Shibboleth-attribut +common#:#shib_login_button#:#Stig till Shibboleths inloggningsknapp +common#:#shib_login_embedded_wayf#:#Design ditt eget registreringsområde +common#:#shib_login_embedded_wayf_description#:#Med den här inställningen kan du ange valfri HTML-kod i textfältet för inloggningsinstruktioner. På så sätt kan du t.ex. använda din egen JavaScript-inbäddade WAYF/Discovery-tjänst eller utforma inloggningsområdet själv. +common#:#shib_login_external_wayf#:#Använd en extern WAYF-tjänst +common#:#shib_login_internal_wayf#:#Användning av ILIAS WAYF-tjänsten +common#:#shib_login_type#:#Val av organisation +common#:#shib_matriculation#:#Attribut för matrikulationsnummer +common#:#shib_member_of#:#Jag är medlem i ... +common#:#shib_phone_home#:#Attribut för privat telefonnummer +common#:#shib_phone_mobile#:#Attribut för mobiltelefonnummer +common#:#shib_phone_office#:#Attribut för telefonnummer till företag +common#:#shib_select_home_organization#:#För att logga in via %s, välj den organisation du tillhör från rullgardinsmenyn +common#:#shib_settings_saved#:#Inställningarna för Shibboleth har sparats +common#:#shib_street#:#Attribut för gata +common#:#shib_title#:#Attribut för titel +common#:#shib_update#:#Uppdatera detta fält varje gång du loggar in +common#:#shib_user_default_role#:#Allmän roll för Shibboleth-användare +common#:#shib_zipcode#:#Attribut för postnummer +common#:#short_inst_name#:#Kort titel +common#:#short_inst_name_info#:#Den här texten visas tillsammans med sidans titel som titel på webbläsarfliken. Om inget skrivs in här visas 'ILIAS'. +common#:#show#:#Display +common#:#show_all_details#:#Visa alla detaljer +common#:#show_content#:#Visa innehåll +common#:#show_details#:#Visa detaljer +common#:#show_filter#:#Visa filter +common#:#show_hidden_sections#:#Visa mer information " +common#:#show_list#:#Visa lista +common#:#show_members#:#Visa medlemmar +common#:#show_more#:#Visa mer +common#:#show_owner#:#Ägare info +common#:#show_users_online#:#Visa aktiva användare +common#:#show_who_is_online#:#Visa vem som är online +common#:#side_frame#:#Frame Trädvy +common#:#signature#:#Signatur +common#:#simultaneous_login_detected#:#Åtkomst till systemet nekas eftersom en användare med dessa autentiseringsuppgifter redan befinner sig i en ILIAS-session. +common#:#size#:#Storlek +common#:#skills#:#Kompetens +common#:#skin_style#:#Standard hud/stil +common#:#smtp#:#SMTP +common#:#soap_connect_timeout#:#Timeout för upprättande av anslutning +common#:#soap_connect_timeout_info#:#Den maximala tiden i sekunder att vänta tills en anslutning till SOAP-webbtjänsten kan upprättas. +common#:#soap_user_administration#:#Administration via SOAP +common#:#soap_user_administration_desc#:#Om den är påslagen kan ILIAS hanteras via SOAP-gränssnittet. +common#:#soap_wsdl_path#:#WSDL-väg +common#:#soap_wsdl_path_info#:#Här kan du ange sökvägen till den WSDL-fil som ska användas av ILIAS för webbtjänsten. Om du lämnar fältet tomt kommer följande sökväg att användas som standard +common#:#sort_ascending#:#Sortera stigande +common#:#sort_ascending_long#:#Ändra sortering till stigande +common#:#sort_by_this_column#:#Sortera efter denna kolumn +common#:#sort_descending#:#Sortera fallande +common#:#sort_descending_long#:#Ändra sorteringsordning till fallande +common#:#sort_inherit_prefix#:#Bestäms av kurs/grupp +common#:#sorting_asc#:#Ascending +common#:#sorting_creation_header#:#Efter skapelsedatum +common#:#sorting_creation_info#:#Innehållna objekt sorteras automatiskt efter deras skapelsedatum. +common#:#sorting_desc#:#Descending +common#:#sorting_direction#:#Sorteringsriktning +common#:#sorting_header#:#Sortering +common#:#sorting_info_inherit#:#Om sorteringen av den överordnade kursen eller gruppen ändras, ändras även denna sortering. +common#:#sorting_info_manual#:#Befintliga objekt kan placeras i önskad ordning. Definiera dessutom var nya objekt ska sättas in och i vilken ordning och orientering de ska arrangeras. +common#:#sorting_info_title#:#Innehållna objekt sorteras automatiskt efter titel. +common#:#sorting_manual_header#:#Handbok +common#:#sorting_save#:#Spara sortering +common#:#sorting_title_header#:#Alfabetiskt efter titel +common#:#spacer#:#Separatorer +common#:#spl#:#Frågepool för enkäter +common#:#spl_add#:#Skapa en frågepool +common#:#spl_import#:#Import frågepool för undersökningar +common#:#spl_new#:#Skapa en ny frågepool för undersökningar +common#:#ssl#:#SSL (HTTPS) +common#:#standard_fields#:#Standardfält +common#:#startpage#:#ILIAS registreringssida +common#:#stat_selected#:#Vald +common#:#statistic#:#Statistik +common#:#statistics#:#Statistik +common#:#status#:#Status +common#:#status_no_permission#:#Ingen åtkomst beviljad. +common#:#step#:#Steg +common#:#street#:#Gata +common#:#structure#:#Översikt +common#:#sty#:#Stylesheet +common#:#sub_request_deleted#:#Din ansökan om antagning har tagits bort +common#:#sub_request_saved#:#Din ansökan om antagning har uppdaterats +common#:#subject#:#Ämne +common#:#submit#:#Skicka +common#:#subobjects#:#Subobjekt +common#:#subscription#:#Prenumeration +common#:#subtabs#:#Subpunkter +common#:#success_message#:#Bekräftelsemeddelande +common#:#summary#:#Sammanfattning +common#:#sure_delete_selected_users#:#Är du säker på att de valda ILIAS-kontona ska raderas? +common#:#survey_defaults#:#Standardinställningar för undersökningar +common#:#survey_unlimited_invitation#:#Obegränsad inbjudan +common#:#svy#:#Undersökning +common#:#svy_add#:#Skapa undersökning +common#:#svy_finished#:#Du har redan deltagit i denna undersökning +common#:#svy_new#:#Skapa ny undersökning +common#:#svy_not_finished#:#Du har påbörjat denna undersökning men ännu inte slutfört den +common#:#svy_not_started#:#Du har ännu inte deltagit i denna undersökning +common#:#svy_run#:#Utför +common#:#svy_warning_survey_not_complete#:#Undersökningen är ofullständig +common#:#switch_language#:#Ändra språk +common#:#system#:#System +common#:#system_check#:#Systemkontroll +common#:#system_information#:#Systeminformation +common#:#system_language#:#Systemets språk +common#:#system_styles#:#Systemets stilar +common#:#systemcheck_cron#:#Systemkontroll via cron-jobb +common#:#systemcheck_cronform#:#Aktivering av systemkontrollen i cron-jobbet +common#:#table_mail_import#:#Importera e-post +common#:#tabs#:#Rider +common#:#tagging_my_tags#:#Mina taggar +common#:#tags#:#Etiketter +common#:#take_over_structure#:#Ta över arkivets mappstruktur +common#:#take_over_structure_info#:#Om aktiverat övertas kataloger i arkivet som kategorier eller mappar. +common#:#tals_etal#:#Talk +common#:#talt_etal#:#Talk +common#:#target#:#Mål +common#:#tax#:#Taxonomi +common#:#tax_add#:#Skapa taxonomi +common#:#tax_new#:#Ny taxonomi +common#:#term#:#Term +common#:#test#:#Test +common#:#tests#:#Test +common#:#textbox#:#Textruta +common#:#thread#:#Topic +common#:#thumbnail#:#Miniatyrbild +common#:#time#:#Tid +common#:#time_limit#:#Tillgång +common#:#time_limit_add_time_limit_for_selected#:#Var god ange en tidsperiod för de valda användarna. +common#:#time_limit_from#:#From (tidsgräns) +common#:#time_limit_message#:#Meddelande (tidsbegränsning) +common#:#time_limit_no_users_selected#:#Du har inte valt några användare. +common#:#time_limit_not_valid#:#De tider du har angett är inte giltiga. +common#:#time_limit_reached#:#Din behörighet är inte aktiv. +common#:#time_limit_unlimited#:#Unlimited (tidsbegränsning) +common#:#time_limit_until#:#To (tidsbegränsning) +common#:#title#:#Titel +common#:#title_required#:#Vänligen ange en titel. +common#:#to#:#Till +common#:#to_client_list#:#Till kundurvalet +common#:#today#:#Idag +common#:#toggleGlobalDefault#:#Byt standardformatmall +common#:#toggleGlobalFixed#:#Byt stilmall för enhet +common#:#toggle_dropdown#:#Toggle rullgardinsmeny +common#:#toggle_off#:#OFF## Översätt inte denna etikett för att undvika visningsproblem med växlingsknappen! +common#:#toggle_on#:#ON## Översätt inte denna etikett för att undvika visningsproblem med växlingsknappen! +common#:#tomorrow#:#I morgon +common#:#toolbar_more_actions#:#Fler åtgärder +common#:#tools#:#Verktyg +common#:#top_of_page#:#Sidan börjar +common#:#total#:#Totalt +common#:#tracking_settings#:#Inställningar +common#:#translation#:#Översättning +common#:#trash#:#Avfallskorg +common#:#tree#:#Träd +common#:#tree_frame#:#Trädvy +common#:#treeview#:#Trädutsikt på +common#:#tst#:#Test +common#:#tst_add#:#Skapa test +common#:#tst_edit_questions#:#Redigera frågor +common#:#tst_new#:#Skapa nytt test +common#:#tst_results#:#Testresultat +common#:#tst_run#:#Utför +common#:#tst_statistical_evaluation#:#Statistik +common#:#tst_statistics#:#Statistik +common#:#tst_user_not_invited#:#Du får inte göra detta onlineprov. +common#:#tst_warning_test_not_complete#:#Testet är inte slutfört! +common#:#tutors#:#Tutorer +common#:#txt_registered#:#Du har framgångsrikt registrerat dig hos ILIAS. Klicka på knappen nedan för att komma till ILIAS. +common#:#txt_registered_passw_gen#:#Du har framgångsrikt registrerat dig hos ILIAS. Du kommer att få ett e-postmeddelande med ditt lösenord inom kort. +common#:#txt_submitted#:#Du har framgångsrikt registrerat dig hos ILIAS. Ditt konto måste fortfarande frigöras av systemadministrationen. Vi ber om ditt tålamod. +common#:#typ#:# Definition av objekttyp +common#:#type#:#Typ +common#:#udf_added_field#:#Ett nytt fält har skapats. +common#:#udf_delete_sure#:#Är du säker på att du vill ta bort detta fält och alla relaterade poster? +common#:#udf_duplicate_entries#:#Värdena måste vara unika. +common#:#udf_field_deleted#:#Fältet har tagits bort. +common#:#udf_name_already_exists#:#Ett fält med detta namn finns redan. Vänligen välj ett annat fältnamn. +common#:#udf_required_requires_visib_reg#:#Inställningen "Obligatorisk specifikation" kräver inställningen "Synlig i registreringsformuläret". +common#:#udf_type_date#:#Datum +common#:#udf_type_datetime#:#Datum och tid +common#:#udf_type_select#:#Urvalslista (enstaka urval) +common#:#udf_type_text#:#Text (fri inmatning) +common#:#udf_type_wysiwyg#:#Textområde (WYSIWYG) +common#:#udf_update_select_field#:#Redigera urvalslista +common#:#udf_update_text_field#:#Redigera textfält +common#:#udf_update_wysiwyg_field#:#Redigera fält för textområde (WYSIWYG) +common#:#uid#:#UID +common#:#ums_create_new_account#:#Create nytt ILIAS-konto +common#:#ums_explanation#:#Ditt externa åtkomst-ID kunde inte tilldelas någon personlig åtkomstdata i ILIAS. Ett ILIAS-konto med din e-postadress upptäcktes dock. Om detta är ditt konto, vänligen logga in med ditt ILIAS-lösenord. +common#:#ums_explanation_2#:#Om inget av dessa ILIAS-konton tillhör dig, klicka på "Skapa nytt ILIAS-konto". +common#:#ums_explanation_3#:#Ditt externa åtkomst-ID kunde inte tilldelas någon personlig åtkomstdata i ILIAS. Din e-postadress används av flera ILIAS-konton. Om ett av dem är ditt konto, logga in med ditt ILIAS-lösenord. +common#:#ums_explanation_4#:#Om detta inte är ditt konto, klicka på "Skapa nytt ILIAS-konto". +common#:#unambiguousness#:#Underskiljande funktion +common#:#uncheck_all#:#Avmarkera +common#:#unchecked#:#Inte vald +common#:#uninstall#:#Avinstallera +common#:#uninstalled#:# oinstallerad. +common#:#unknown#:#UNBEKANNT +common#:#unparticipate#:#Logga ut +common#:#unread#:#Oläst +common#:#unzip#:#Unzipping +common#:#up#:#Hög +common#:#update#:#Takeover +common#:#update_applied#:#Uppdatering av databas framgångsrik +common#:#update_language#:#Uppdatera språk +common#:#update_on_conflict#:#Uppdatera i händelse av konflikt +common#:#update_orgunits#:#Uppdatera användarfältet "Organisatoriska enheter +common#:#update_orgunits_desc#:#Om den är påslagen uppdateras fältet 'Organisational units' för alla användare och eventuella fel korrigeras. +common#:#upload#:#Ladda upp +common#:#upload_error_file_not_found#:#Fel under uppladdning +common#:#upload_files#:#Ladda upp filer +common#:#upload_files_title#:#Ladda upp filer +common#:#upload_pending#:#Utgående +common#:#upload_settings#:#Inställningar för uppladdning +common#:#uploaded_and_checked#:#Filen har laddats upp och kontrollerats, du kan nu importera den. +common#:#uploading#:#Ladda upp... +common#:#uri#:#URI +common#:#url#:#URL +common#:#url_not_found#:#Filen hittades inte +common#:#url_to_latex#:#URL till LaTeX CGI-skriptet +common#:#use_customized_instructions#:#Använd anpassad vägledningstext +common#:#use_default_instructions#:#Använd standardinstruktionstext. +common#:#user#:#Användare +common#:#user_activated#:#Användaren har bekräftats. +common#:#user_added#:#Användare skapad +common#:#user_assignment#:#Användartilldelning +common#:#user_avatar#:#Profilbild +common#:#user_avatar_of#:#Profilbild från +common#:#user_cant_receive_mail#:#%1$s - Användaren har inte behörighet att använda e-postsystemet. +common#:#user_comment#:#Användarkommentar +common#:#user_deactivated#:#De valda användarna har avaktiverats. +common#:#user_defined_fields#:#Användardefinierade fält +common#:#user_defined_list#:#Oversikt över användardefinierade fält +common#:#user_deleted#:#ILIAS-konto raderat +common#:#user_detail#:#Detaljer +common#:#user_ext_account#:#Externt inloggningskonto +common#:#user_ext_account_desc#:#Logonkonto som används för extern autentisering. (CAS-, SOAP- eller LDAP-autentisering) +common#:#user_image#:#Användarbild +common#:#user_import_failed#:#User import misslyckades. +common#:#user_imported#:#User import slutförd. +common#:#user_imported_with_warnings#:#User import slutförd med varningar. +common#:#user_language#:#Användarspråk +common#:#user_never_logged_in#:#Radera ILIAS-konton utan att logga in +common#:#user_never_logged_in_info#:#ILIAS-konton raderas om ingen någonsin har loggat in på ILIAS med dem. +common#:#user_never_logged_in_info_threshold_err_num#:#Tröskelvärdet måste vara ett positivt heltal. +common#:#user_new_account_mail#:#Notifiering om ny registrering +common#:#user_new_account_mail_desc#:#Detta e-postmeddelande skickas efter att ett ILIAS-konto har skapats. Om kontot skapades av den tekniska förvaltningen kommer ILIAS endast att skicka ett e-postmeddelande om alternativet "Informera användare om ändringar via e-post" aktiverades när konto +common#:#user_not_found#:#Användaren hittades inte +common#:#user_not_found_to_delete#:#En användare som ska raderas kunde inte hittas. +common#:#user_not_known#:#Var god ange ett giltigt inloggningsnamn.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +common#:#user_profile_other#:#Ytterligare information +common#:#user_send_new_account_mail#:#Skicka välkomstmail +common#:#user_status#:#Användarstatus +common#:#user_toggle_noti#:#Notifieringar kan inte avaktiveras. +common#:#userdata#:#Användardata +common#:#userfolder_export_csv#:#Kommaseparerade värden (CSV) +common#:#userfolder_export_excel_x86#:#Microsoft Excel +common#:#userfolder_export_file#:#Fil +common#:#userfolder_export_file_size#:#Filens storlek +common#:#userfolder_export_files#:#Filer +common#:#userfolder_export_xml#:#XML +common#:#username#:#Login name###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +common#:#users#:#Användare +common#:#users_not_imported#:#Följande användare existerar inte. Därför kan deras e-postmeddelanden inte importeras +common#:#users_online#:#Aktiva användare +common#:#usr#:#Användare +common#:#usr_account_inactive#:#Inaktiv användare +common#:#usr_active_only#:#Endast aktiva användare +common#:#usr_add#:#Ny användare +common#:#usr_agreement#:#Användningsavtal +common#:#usr_agreement_footer_intro#:#Du har förklarat att du samtycker till detta användaravtal. +common#:#usr_edit#:#Redigera användare +common#:#usr_field_change_components_listening#:#Det finns minst en komponent som är intresserad av de förändringar som gjorts. Vill du slutligen genomföra ändringarna tillsammans med de konsekvenser som beskrivs av komponenterna? +common#:#usr_filter_coursemember#:#Medlem i en kurs +common#:#usr_filter_groupmember#:#Medlem i en grupp +common#:#usr_filter_lastlogin#:#Sista inloggning för en användare +common#:#usr_filter_role#:#Tilldelad roll +common#:#usr_inactive_only#:#Endast icke-aktiva användare +common#:#usr_limited_access_only#:#Endast användare med åtkomstbegränsning +common#:#usr_name_undisclosed#:#Inte släppt +common#:#usr_new#:#Ny användare +common#:#usr_settings_changeable_lua#:#Ändringsbar till "Lokala konton" i kategorier +common#:#usr_settings_explanation_profile#:#Per datafält, åtkomst kan konfigureras i profil, medlemsflikar och lokala konton. +common#:#usr_settings_header_profile#:#Inställningar för inloggningskonton +common#:#usr_settings_saved#:#De globala användarinställningarna har sparats och är nu aktiverade! +common#:#usr_settings_visib_lua#:#Visible i "Lokala konton" i kategorier +common#:#usr_skin_style#:#Hud/Stil +common#:#usr_without_courses#:#User tilldelad utan kurser +common#:#usrf#:#Registreringskonton +common#:#usrf_profile_link#:#Länk till ILIAS-konto +common#:#usrimport_action_ignored#:#Aktion %1$s ignorerad. +common#:#usrimport_action_replaced#:#Aktion %1$s ersatt av %2$s. +common#:#usrimport_cant_delete#:#Kan inte utföra åtgärden "Radera". Inget matchande ILIAS-konto i databasen. +common#:#usrimport_cant_insert#:#Kan inte utföra åtgärden "Infoga". ILIAS-kontot finns redan i databasen. +common#:#usrimport_cant_update#:#Kan inte utföra åtgärden "Uppdatera". Inget lämpligt ILIAS-konto finns tillgängligt i databasen. +common#:#usrimport_conflict_handling_info#:#Om "Ignorera vid konflikt", hoppar ILIAS över alla data som inte kan importeras utan problem. I det här fallet skulle till exempel en "Insert"-åtgärd inte utföras om ett konto med samma inloggningsnamn redan finns i databasen. Du kommer att få en felrapp +common#:#usrimport_form_not_evaluabe#:#Formuläret kunde inte läsas. +common#:#usrimport_global_role_for_action_required#:#För åtgärden "%1$s" måste minst en global roll anges. +common#:#usrimport_ignore_role#:#Ignorera roll +common#:#usrimport_login_is_not_unique#:#Login-namnet är inte unikt ###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +common#:#usrimport_no_insert_ext_account_exists#:#Import inte möjlig. Externt inloggningskonto finns redan. +common#:#usrimport_no_update_ext_account_exists#:#Uppdatering ej möjlig. Externt inloggningskonto finns redan. +common#:#usrimport_with_specified_role_not_permitted#:#Du har inte behörighet att importera användare med den angivna rollen. +common#:#usrimport_wrong_file_count#:#För många filer i importmappen. Vänligen försök igen. +common#:#usrimport_xml_anonymous_or_root_not_allowed#:#Varken systemkontot eller det anonyma kontot kan ändras med importen. +common#:#usrimport_xml_attribute_missing#:#Attributet "%2$s" saknas i elementet "%1$s". +common#:#usrimport_xml_attribute_value_illegal#:#Värdet "%3$s" för attributet "%2$s" i elementet "%1$s" är ogiltigt. +common#:#usrimport_xml_attribute_value_inapplicable#:#Värdet "%3$s" för attributet "%2$s" i elementet "%1$s" är inte tillämpligt för åtgärden "%4$s". +common#:#usrimport_xml_element_content_illegal#:#Innehållet "%2$s" i elementet "%1$s" är ogiltigt. +common#:#usrimport_xml_element_for_action_required#:#Elementet "%1$s" måste anges för åtgärden "%2$s". +common#:#usrimport_xml_element_inapplicable#:#Elementet "%1$s" är inte tillämpligt för åtgärden "%2$s". +common#:#valid#:#Validerad +common#:#validate#:#Validera +common#:#value#:#Värde +common#:#vcard#:#Visitkort +common#:#vcard_download#:#Ladda ner visitkort +common#:#verification_failed#:#Review misslyckad +common#:#verification_failure_log#:#Granska fellogg +common#:#verification_warning_log#:#Review Varningslogg +common#:#version#:#Version +common#:#versions#:#Versioner +common#:#view#:#Show +common#:#view_content#:#Innehåll +common#:#view_learning_progress#:#Visa framsteg i inlärningen +common#:#view_learning_progress_rec#:#Se lärandets framsteg rekursivt +common#:#visible#:#Display +common#:#visible_registration#:#I registreringsformuläret +common#:#visitor#:#Besökare +common#:#visitors#:#Besökare +common#:#visits#:#Besök +common#:#web_resources#:#Webblänkar +common#:#webdav#:#WebDAV +common#:#webdav_add_instructions_btn_label#:#Lägg till WebDAV Instruktion +common#:#webdav_chosen_language_already_used#:#Det finns redan en WebDAV-guide för det valda språket. +common#:#webdav_doc_delete#:#Radera WebDAV Instruktion +common#:#webdav_docs_mount_instructions#:#Fil med WevDAV-instruktion +common#:#webdav_duplicate_detected_title#:#Följande objekt kunde inte visas, eftersom ett objekt med samma titel redan visas. +common#:#webdav_enable_versioning#:#Versionering av filer +common#:#webdav_forbidden_chars_title#:#Följande objekt kunde inte visas eftersom de innehåller förbjudna tecken (\<>/ +common#:#webdav_form_document#:#Handledning för WebDAV +common#:#webdav_form_document_info#:#Ladda upp ett txt- eller html-dokument med instruktioner om hur du ansluter WebDAV till de system du väljer. +common#:#webdav_form_document_title#:#Titel +common#:#webdav_form_document_title_info#:#Den här titeln visas i modellen med WebDAV-instruktionerna +common#:#webdav_form_edit_doc_head#:#Redigera WebDAV-instruktioner +common#:#webdav_form_new_doc_head#:#Lägg till ett nytt dokument +common#:#webdav_general_settings#:#Allmänna inställningar +common#:#webdav_missing_lang#:#Det finns ingen tysk version av WebDAV-instruktionerna. +common#:#webdav_mount_instructions#:#WebDAV instruktioner +common#:#webdav_problem_free_container#:#Inga objekt som orsakar problem hittades i den här mappen. +common#:#webdav_problem_info_duplicate#:#Det finns en fil med samma titel som infofilen. +common#:#webdav_pwd_instruction#:#För att öppna ILIAS-tidningen som en webbmapp utanför den aktuella sessionen rekommenderar vi att du skapar ett lokalt lösenord.
Detta lösenord krävs endast för webbmappsfunktionerna, ILIAS-inloggningen görs fortfarande med ditt vanliga lösenord. +common#:#webdav_pwd_instruction_success#:#Ett nytt lokalt lösenord har skapats. Du kan nu öppna tidningen som en webbmapp. +common#:#webdav_sure_delete_documents_s#:#Ska WebDAV-instruktionen med följande titel verkligen tas bort +common#:#webdav_tbl_docs_head_title#:#Titel +common#:#webdav_tbl_docs_title#:#Lista över uppladdade WebDAV-instruktioner +common#:#webdav_upload_instructions#:#Instruktioner för uppladdning av WebDAV +common#:#webdav_versioning_info#:#Om denna inställning är aktiverad skapas en ny version för redan befintliga filer. I annat fall kommer de att skrivas över. +common#:#webfolder_dir_info#:#Du har hamnat här eftersom din webbläsare inte kan öppna webbmappar. Läs instruktionerna om hur du öppnar den här webbmappen. +common#:#webfolder_index_of#:#Innehåll i %1$s +common#:#webfolder_instructions#:#Instruktion för webbmappar +common#:#webfolder_instructions_info#:#Instruktionerna för webbmappar visas i webbläsare som inte kan öppna webbmappar direkt. Du kan använda HTML-kod.
Platshållare som kan användas +common#:#webfolder_instructions_text#:#[WINDOWS

]Instruktioner för anslutning med Windows

+common#:#webfolder_instructions_titletext#:#Öppna som webbmapp +common#:#webfolder_mount_dir_with#:#Öppna denna sida som en webbmapp med Internet Explorer 6, Konqueror, Nautilus eller annan webbläsare. +common#:#webr#:#Webblänk +common#:#webr_active#:#Aktiv +common#:#webr_add#:#Skapa webblänk +common#:#webr_deleted_items#:#Webblänken (länkarna) har tagits bort. +common#:#webr_edit#:#Redigera webblänk +common#:#webr_sure_delete_items#:#Är du säker på att du vill ta bort följande webblänkar? +common#:#webservices#:#SOAP +common#:#week#:#Vecka +common#:#weekly#:#Veckovis +common#:#weeks#:#Veckor +common#:#welcome#:#Välkommen +common#:#width#:#Bredd +common#:#wiki#:#Wiki +common#:#wiki_add#:#Skapa wiki +common#:#wiki_new#:#Skapa ny wiki +common#:#with#:#med +common#:#withdraw_consent#:#Återkalla samtycke +common#:#withdraw_consent_description#:#Återkalla avtal om samtycke till användning här. +common#:#withdraw_consent_description_external#:#Gå tillbaka till din ursprungliga installation och logga in igen för att slutföra återkallelseprocessen. +common#:#withdraw_consent_description_internal#:#Logga in igen för att slutföra återkallelseprocessen. +common#:#withdraw_consent_header#:#Återkalla samtycke till att använda avtalet +common#:#withdraw_consent_info#:#Tillbakadragande av samtycke till användaravtalen +common#:#withdraw_consent_info_external#:#Var vänlig meddela den ansvariga administratören för ditt behörighetssystem och meddela din avsikt. +common#:#withdraw_consent_info_internal#:#Om du bekräftar här kommer ditt ILIAS-konto att raderas. +common#:#withdraw_usr_agreement#:#Återkalla +common#:#withdrawal_complete#:#Annulleringsprocessen avslutad. +common#:#withdrawal_complete_deleted#:#Revokationsprocessen är slutförd. ILIAS-kontot har tagits bort. +common#:#withdrawal_complete_redirect#:#Annulleringsprocessen är slutförd. För att avsluta ILIAS-kontot, vänligen kontakta din organisation. +common#:#withdrawal_mail_info#:#Följande meddelande kommer att skickas för din räkning när du bekräftar +common#:#withdrawal_mail_subject#:#Återkallande av samtycke till att använda avtal +common#:#withdrawal_mail_text#:#Good day,[BR][BR]Jag återkallar härmed mitt samtycke till användaravtalet för din ILIAS-installation. Vänligen vidta lämpliga åtgärder.[BR][BR]Namn +common#:#withdrawal_sure_account#:#Är du säker på att du vill återkalla ditt samtycke till att använda avtal? +common#:#withdrawal_sure_account_deletion#:#Är du säker på att du vill återkalla ditt samtycke till användaravtalen? Ditt ILIAS-konto kommer oåterkalleligen att raderas som ett resultat. +common#:#withdrawal_sure_account_deletion_no_consent_yet#:#Är du säker på att du inte vill ge ditt samtycke till användaravtalen? Ditt ILIAS-konto kommer att raderas oåterkalleligt som ett resultat. +common#:#withdrawal_sure_account_no_consent_yet#:#Är du säker på att du inte vill ge ditt samtycke till användaravtalen? +common#:#wizard_search_list#:#Din sökning gav följande resultat. Välj ett av dessa. +common#:#wizard_title_info#:#Ange titeln för att söka efter det objekt du vill kopiera. Delar av titeln är också tillräckligt. Klicka på "Sök" för att få träffarna visade. +common#:#write#:#Skrivande +common#:#wrong_ip_detected#:#Åtkomst till systemet nekas på grund av en felaktig klient-IP.
Din aktuella IP-adress +common#:#year#:#År +common#:#yearly#:#årlig +common#:#years#:#År +common#:#yes#:#Ja +common#:#yesterday#:#Igår +common#:#zip#:#PLZ +common#:#zip_structure_error#:#Arkivet innehåller samma filnamn. Uppladdning avbruten +common#:#zip_test_failed#:#ZIP-testet har misslyckats. Vänligen kontakta din ILIAS-administratör. +common#:#zipcode#:#Postnummer +cond#:#cond_under_parent_control#:#Förutsättningarna hanteras av det överordnade objektet. +cont#:#cont_add_global_profile#:#Lägg till global profil +cont#:#cont_add_local_profile#:#Lägg till lokal profil +cont#:#cont_add_skill#:#Lägg till kompetens +cont#:#cont_assign_competence#:#Tilldela kompetens till medlemmar +cont#:#cont_assign_skills#:#Tilldela kompetenser +cont#:#cont_block_limit#:#Begränsa inmatningar per block +cont#:#cont_block_limit_info#:#Om ett block innehåller fler poster visas en åtgärdsknapp "Visa mer". +cont#:#cont_cont_skills#:#Medlemmarnas kompetens +cont#:#cont_deassign_competence#:#Återställa kompetenser +cont#:#cont_filter#:#Filter +cont#:#cont_filter_field#:#Fält +cont#:#cont_filter_fields#:#Filterfält +cont#:#cont_filter_record#:#Dataset +cont#:#cont_found_objects#:#Fundna objekt +cont#:#cont_item_list#:#Lista +cont#:#cont_item_list_info#:#Visa underordnade objekt i en lista. +cont#:#cont_list_presentation#:#Presentationsvy för innehåll +cont#:#cont_mem_skills#:#Kompetens +cont#:#cont_news_edited#:#Editerad +cont#:#cont_news_settings#:#Nyheter +cont#:#cont_news_timeline#:#Tidslinje +cont#:#cont_news_timeline_auto_entries#:#Automatiskt skapade nyheter +cont#:#cont_news_timeline_auto_entries_info#:#Alla automatiskt skapade nyheter visas också, t.ex. foruminlägg, nya filer, etc. +cont#:#cont_news_timeline_info#:#Aktiverar fliken "Tidslinje" för nyheter +cont#:#cont_news_timeline_landing_page#:#Startsida +cont#:#cont_news_timeline_landing_page_info#:#Timeline som startsida +cont#:#cont_news_timeline_tab#:#Tidslinje +cont#:#cont_page_type_cont#:#Magazin-sida (kurs, grupp, kategori, ...) +cont#:#cont_page_type_cstr#:#Startpage lärande målorienterad kurs +cont#:#cont_path#:#Stig +cont#:#cont_publish_assignment#:#Publicera uppdrag +cont#:#cont_published#:#Publicering +cont#:#cont_really_deassign_skills#:#Vill du verkligen återställa alla användarens kompetenstilldelningar? +cont#:#cont_really_remove_skill_from_course#:#Bör kompetenserna verkligen tas bort från listan? +cont#:#cont_select_fields#:#Välj fält +cont#:#cont_show_more#:#Visa mer +cont#:#cont_skill#:#Kompetens +cont#:#cont_skill_assigned_comp#:#Urval av kompetenser +cont#:#cont_skill_assigned_profiles#:#Urval av profil +cont#:#cont_skill_deletion_not_possible#:#Det är inte möjligt att ta bort globala kompetensprofiler. Välj endast lokala kompetensprofiler. +cont#:#cont_skill_do_not_set#:#Ställ inte in +cont#:#cont_skill_members#:#Medlemmar +cont#:#cont_skill_no_profile_selected#:#Vänligen välj en profil. +cont#:#cont_skill_no_skill#:#Inget värde (återställning) +cont#:#cont_skill_no_skills_selected#:#Inga kompetenser har valts ännu. Lägg till minst en kompetens under "Val av kompetens" först. +cont#:#cont_skill_profile#:#Profil +cont#:#cont_skill_profiles#:#Profiler över medlemmarna +cont#:#cont_skill_publish#:#Publicering +cont#:#cont_skill_publish_auto#:#Automatisk +cont#:#cont_skill_publish_auto_info#:#Tilldelning av kompetensnivåer till medlemmar är omedelbart synliga för dem. +cont#:#cont_skill_publish_manual#:#Handbok +cont#:#cont_skill_publish_manual_info#:#Tilldelningar av kompetensnivåer till medlemmar är endast synliga för dem när de publiceras. +cont#:#cont_skill_really_delete_profile_from_list#:#Bör profilen verkligen raderas? +cont#:#cont_skill_really_delete_profiles_from_list#:#Bör profilerna verkligen raderas? +cont#:#cont_skill_really_remove_profile_from_list#:#Bör profilen verkligen tas bort från listan? +cont#:#cont_skill_really_remove_profiles_from_list#:#Bör profilerna verkligen tas bort från listan? +cont#:#cont_skill_removal_not_possible#:#Att ta bort lokala kompetensprofiler är inte möjligt. Vänligen välj endast globala kompetensprofiler. +cont#:#cont_skill_show#:#Display +cont#:#cont_std_filter_title_1#:#Titel +cont#:#cont_std_filter_title_2#:#Beskrivning +cont#:#cont_std_filter_title_3#:#Titel/Beskrivning +cont#:#cont_std_filter_title_4#:# nyckelord +cont#:#cont_std_filter_title_5#:#Författare +cont#:#cont_std_filter_title_6#:#Upphovsrätt +cont#:#cont_std_filter_title_7#:#Stöd för undervisning +cont#:#cont_std_filter_title_8#:#Objekttyp +cont#:#cont_std_filter_title_9#:#Online/Offline +cont#:#cont_std_record_title#:#Standard +cont#:#cont_tile_size#:#Storlek på kakel +cont#:#cont_tile_size_0#:#normal (upp till fyra brickor på en rad) +cont#:#cont_tile_size_1#:#small (upp till sex brickor på en rad) +cont#:#cont_tile_size_2#:#large (upp till tre brickor på en rad) +cont#:#cont_tile_size_3#:#mycket stor (upp till två plattor på en rad) +cont#:#cont_tile_size_4#:# full bredd (en kakelplatta på en rad) +cont#:#cont_tile_view#:#Kakelplattor +cont#:#cont_tile_view_info#:#Visa underordnade objekt som brickor. Bilder för dessa plattor kan laddas upp i inställningarna för varje enskilt objekt. +contact#:#contact_awrn_ap_contacts#:#Bekräftade kontakter +contact#:#contact_awrn_ap_contacts_info#:#Alla bekräftade kontakter för en användare listas. +contact#:#contact_awrn_req_contacts#:#Kontaktförfrågningar +contact#:#contact_awrn_req_contacts_info#:#Alla kontaktförfrågningar är listade. +content#:#Pages#:#Sidor +content#:#add_menu_entry#:#Lägg till menyalternativ >> +content#:#all#:#Alla +content#:#all_pages#:# för hela utbildningsmodulen +content#:#choose_public_mode#:#Tillträdesrätt för icke inloggade användare +content#:#choose_public_pages#:#Välj offentligt tillgängliga sidor +content#:#citate#:#Cite +content#:#citate_from#:#Citing ... +content#:#citate_page#:#Hänvisa till denna sida +content#:#citate_to#:#Citera till ... +content#:#cont_Additional#:#Tillägg +content#:#cont_AdvancedKnowledge#:#Fördjupad kunskap +content#:#cont_Attention#:#Attention +content#:#cont_Background#:#Bakgrund +content#:#cont_Block#:#Blockera +content#:#cont_Book#:#Tryckning av böcker +content#:#cont_Circle#:#Cirkel +content#:#cont_Citation#:#Citat +content#:#cont_Confirmation#:#Bekräftelse +content#:#cont_Example#:#Exempel +content#:#cont_Excursus#:#Excursus +content#:#cont_FileListItem#:#Post i fillista (standard) +content#:#cont_Headline1#:#Rubrik 1 +content#:#cont_Headline2#:#Rubrik 2 +content#:#cont_Headline3#:#Rubrik 3 +content#:#cont_Information#:#Information +content#:#cont_Interaction#:#interaktion +content#:#cont_Link#:#Länk +content#:#cont_List#:#Lista +content#:#cont_Literature#:#Litteratur +content#:#cont_Media#:#Media (Standard) +content#:#cont_Mnemonic#:#Merkset +content#:#cont_Numbers#:#Nummer +content#:#cont_Poly#:#Polygon +content#:#cont_Rect#:#Rektangel +content#:#cont_Remark#:#Note +content#:#cont_Separator#:#Limiter +content#:#cont_Special#:#Särskild +content#:#cont_StandardCenter#:#Standardcentrerad +content#:#cont_StandardTable#:#Standardbord +content#:#cont_TableContent#:#Tabellens innehåll +content#:#cont_Verse#:#Lyrik/Strophe +content#:#cont_WholePicture#:#Fullständig bild +content#:#cont_accented#:#Emphasized +content#:#cont_act_number#:#Numrering av kapitel +content#:#cont_activate_html#:#Aktivera HTML-rendering +content#:#cont_activate_js#:#Aktivera javascript-läge +content#:#cont_activate_media#:# Aktivera media +content#:#cont_activate_page#:# Aktivera sida +content#:#cont_activated#:#Aktiverad +content#:#cont_activation#:#Aktivering +content#:#cont_active#:# Aktivera meny +content#:#cont_active_areas#:#Trigger +content#:#cont_active_from#:#Aktiv från +content#:#cont_active_to#:#Aktiv till +content#:#cont_add_area#:#Lägg till område +content#:#cont_add_cell#:#Lägg till kolumn +content#:#cont_add_change_comment#:#Lägg till revisionskommentar +content#:#cont_add_definition#:#Lägg till definition +content#:#cont_add_elements#:#Klicka på en plussymbol för att lägga till ett nytt element. +content#:#cont_add_file#:#Lägg till fil +content#:#cont_add_images#:#Lägg till bild +content#:#cont_add_popup#:#Lägg till popup-fönster +content#:#cont_add_tab#:#Lägg till fack +content#:#cont_add_url#:#Integrera via URL +content#:#cont_added_cell#:#Kolumn tillagd +content#:#cont_added_comment#:#Kommentaren registrerades under lärmodulens gång (se fliken "Innehåll " Historik"). +content#:#cont_added_tab#:#Subjektet har lagts till. +content#:#cont_added_term#:#Term tillagd +content#:#cont_adjust_size#:#Justera storlek +content#:#cont_advanced_settings#:#Avancerade inställningar +content#:#cont_align#:#Inriktning +content#:#cont_alignment#:#Inriktning +content#:#cont_all_answers_correct#:#Right! +content#:#cont_all_closed#:#Alla stängda +content#:#cont_all_languages#:#Alla språk +content#:#cont_all_pages#:#Alla sidor +content#:#cont_all_topics#:#Alla ämnen +content#:#cont_all_usages#:#Inkludera gamla versioner +content#:#cont_alphabetic#:# Alfabetisk A, B, ... +content#:#cont_alphabetic_s#:# Alfabetisk a, b, ... +content#:#cont_always#:#Alltid +content#:#cont_anchor#:#Ankare +content#:#cont_annex#:#Tillägg +content#:#cont_anonymous_user_missing_perm#:#Användare som inte är inloggade har för närvarande inga rättigheter till denna utbildningsmodul. +content#:#cont_areas_deleted#:#Områden borttagna +content#:#cont_assign_characteristic#:#Format +content#:#cont_assign_full#:#Som fullständig vy +content#:#cont_assign_std#:#Som standard +content#:#cont_assign_to_parent#:#Tilldela till den överordnade noden +content#:#cont_auto_glossaries#:#Automatiskt länkade ordlistor +content#:#cont_auto_last_visited#:#Fortsätt med senast besökta avsnitt +content#:#cont_auto_last_visited_info#:#Användaren visas den senast besökta SCO:n eller tillgången när SCORM-inlärningsmodulen hämtas igen. +content#:#cont_auto_suspend#:#Säkerställa hämtning av befintliga uppgifter om inlärningsstatus +content#:#cont_auto_suspend_info#:#Detta alternativ är för SCORM-lärmoduler som stöder SCORM bristfälligt genom att inte skicka lämpliga värden för cmi.exit. +content#:#cont_auto_time#:#Väntande animation +content#:#cont_autoindent#:#Automatisk indragning +content#:#cont_automatically_set_store_tries#:#Alternativet "$1" aktiverades automatiskt eftersom läget "$2" var aktiverat. +content#:#cont_autostart#:#Autostart +content#:#cont_back#:#Tillbaka +content#:#cont_base_image#:#Utgående bild +content#:#cont_bb_tip#:#Menyn gör det möjligt att snabbt tilldela textetiketter. +content#:#cont_behavior#:#Beteende +content#:#cont_biblio#:#Bibliografiska uppgifter +content#:#cont_biblio_info#:#Tab och funktionen "Bibliografiska data" visas. +content#:#cont_blist#:#Uppräkningslista +content#:#cont_block_format#:#Blockera format +content#:#cont_blocked_users#:#Förbjudna användare +content#:#cont_blocked_users_mail_link#:#Klicka på följande länk för att öppna utbildningsmodulen. +content#:#cont_bottom#:#Botten +content#:#cont_bullet_list#:#Onumrerad lista +content#:#cont_cach_mode#:#Mode +content#:#cont_cach_mode_automatic#:#Automatisk +content#:#cont_cach_mode_automatic_info#:#Alla dina konsultationstider är publicerade. +content#:#cont_cach_mode_manual#:#Handbok +content#:#cont_cach_mode_manual_info#:#Endast de konsultationstillfällen publiceras som ingår i en av följande konsultationsgrupper. +content#:#cont_cant_copy_folders#:#Folder kan inte kopieras till Urklipp +content#:#cont_cant_del_full#:#Delete file for full view not possible. +content#:#cont_cant_del_std#:#Att radera filen för standardvyn är inte möjligt. +content#:#cont_caption#:#Märkning +content#:#cont_caption_style#:#Stil för bildtext +content#:#cont_cc_emp#:#Emphasized +content#:#cont_cc_imp#:#Viktigt +content#:#cont_cc_str#:#Stark +content#:#cont_cc_sub#:#Djupgående +content#:#cont_cc_sup#:#Höjdmarkerad +content#:#cont_center#:#Centrum +content#:#cont_change_notification_salutation#:#Hej %s, +content#:#cont_change_notification_subject_lm#:#Inlärningsmodulen "%1$s" har ändrats +content#:#cont_change_object_reference#:#Ändra objektets referens +content#:#cont_change_type#:#Ändra typ +content#:#cont_chap_and_pages#:#Kapitel och sidor +content#:#cont_chap_select_target_now#:#Nu väljer du den kryssruta bakom vilken kapitlet ska flyttas. +content#:#cont_chapters#:#Kapitel +content#:#cont_chapters_after_pages#:#Notera att inom en nivå listas alla sidor först och först därefter underkapitlen. +content#:#cont_chapters_and_pages#:#Kapitel och sidor +content#:#cont_chapters_only#:#Endast kapitel +content#:#cont_char_format#:#Teckenformat +content#:#cont_char_style_acc#:#Accentuerad +content#:#cont_char_style_code#:#Kod +content#:#cont_char_style_com#:#Kommentar +content#:#cont_char_style_quot#:#Citat +content#:#cont_characteristic#:#Format för stycke +content#:#cont_check_values#:#Kontrollera värden som skickats av SCO +content#:#cont_check_values_info#:#Testverktyget kontrollerar standardkompatibiliteten hos de värden som skickas av SCO.
SCORM-standarden är mycket exakt när det gäller vilka data som ska lagras. Inte alla SCORM-lärmoduler är lika exakta i sin datautmatning som standarden faktiskt kr +content#:#cont_choose_characteristic#:#Välj styckeformat +content#:#cont_choose_characteristic_section#:#Block +content#:#cont_choose_characteristic_text#:#Format för stycken +content#:#cont_choose_file_source#:#Källa +content#:#cont_choose_from_clipboard#:#Från Media Clipboard +content#:#cont_choose_from_pool#:#Från mediapoolen +content#:#cont_choose_glo#:#Vänligen välj en ordlista. +content#:#cont_choose_lm#:#Vänligen välj en utbildningsmodul. +content#:#cont_choose_local#:#Lokal katalog +content#:#cont_choose_media_pool#:#Välj mediepool +content#:#cont_choose_mep#:#Vänligen välj en mediekälla. +content#:#cont_choose_pages_or_chapters_only#:#Vänligen välj antingen sidor eller kapitel. +content#:#cont_choose_upload_dir#:#Ladda upp katalog +content#:#cont_choose_wiki#:#Välj wiki +content#:#cont_citation_selection_not_valid#:#Ditt val är inte giltigt, vänligen kontrollera dina poster. +content#:#cont_click_br_corner#:#Klicka i det nedre högra hörnet av önskat område. +content#:#cont_click_center#:#Klicka i mitten av det önskade området. +content#:#cont_click_circle#:#Klicka på en cirkelpunkt i det önskade området. +content#:#cont_click_edit#:#Klicka på ett sidelement för att redigera det. +content#:#cont_click_multi_select#:#Klicka på sidelement för att markera eller avmarkera dem. +content#:#cont_click_next_or_save#:#Klicka på nästa hörn av polygonen eller spara önskat område. (Du behöver inte längre klicka på polygonens startpunkt!) +content#:#cont_click_next_point#:#Klicka på nästa hörn av polygonen. +content#:#cont_click_starting_point#:#Klicka på polygonens startpunkt. +content#:#cont_click_tl_corner#:#Klicka i det övre vänstra hörnet av det önskade området +content#:#cont_col_ordering#:#Kolumnarrangemang +content#:#cont_colspan#:#Sammansatt kolumn +content#:#cont_commented_by#:#Kommentarer från +content#:#cont_comments#:#Tillåt kommentarer +content#:#cont_comments_info#:#SCORM 2004 inlärningsmoduler tillåter användare att skriva kommentarer i inlärningsmodulen. Detta alternativ aktiverar inmatning och sparande av kommentarer. +content#:#cont_confirm_delete#:#Vill du verkligen ta bort det här innehållet? +content#:#cont_constrain_proportions#:#Underhålla proportioner +content#:#cont_content#:#Innehåll +content#:#cont_content_popup#:#Popup-innehåll +content#:#cont_content_popups#:#Popup-fönster med innehåll +content#:#cont_coords#:#Koordinater +content#:#cont_copy_question_from_pool#:#Kopiera fråga från testfrågepoolen +content#:#cont_copy_question_into_page#:#Kopiera till sida +content#:#cont_copy_to_clipboard#:#Kopiera till urklipp +content#:#cont_correct_after_first#:#1. svaret är korrekt +content#:#cont_correct_answer_also#:#Right är också +content#:#cont_correct_answers_also#:#Right är också +content#:#cont_correct_answers_shown#:#Riktig lösning se ovan. +content#:#cont_could_not_determine_resource_size#:#ILIAS kunde inte automatiskt fastställa dimensionerna. +content#:#cont_could_not_save_duplicate_pc_ids#:#Sorry, sidan kunde inte sparas. (Dubbla PC-ID) +content#:#cont_cp_question_diff_formats_info#:#Observera att vissa formateringar inte stöds i innehållsmoduler. +content#:#cont_create_link#:#Skapa länk +content#:#cont_create_mob#:#Skapa mediaobjekt +content#:#cont_credit_mode#:#Utvärdering###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +content#:#cont_credit_mode_info#:#Lärmodulen informeras via cmi.core.credit om den uppnådda prestationen (pass/fail och poäng) är önskad (credit) eller inte önskad (no-credit) för bedömningen. Det är lärmodulens uppgift att tolka denna instruktion på ett adekvat sätt. +content#:#cont_credit_off#:#Utan betyg +content#:#cont_credit_on#:#Med utvärdering (godkänd | underkänd) +content#:#cont_credits#:#Poäng +content#:#cont_current_chapter#:#Aktuellt kapitel +content#:#cont_current_lang#:#Nuvarande språk +content#:#cont_current_page#:#Aktuell sida +content#:#cont_current_style#:#Stil +content#:#cont_current_term#:#Aktuell termin +content#:#cont_current_usages#:#Aktuell användning +content#:#cont_current_version#:#Aktuell version +content#:#cont_custom#:#Anpassad +content#:#cont_custom_menu_entries#:#Avancerade menyalternativ +content#:#cont_custom_size#:#Fast storlek +content#:#cont_dark#:#Mörk +content#:#cont_data_from_lms#:#adlcp +content#:#cont_de_activate#:#(Av)aktivera +content#:#cont_deactivate_html#:#Inaktivera HTML-rendering +content#:#cont_deactivate_js#:#Aktivera formulärläge +content#:#cont_deactivate_media#:#Avaktivera media +content#:#cont_deactivate_page#:#Inaktivera sida +content#:#cont_deactivated#:#Funktionshindrad +content#:#cont_debug#:#Tillhandahålla testverktyg +content#:#cont_debug_deactivate#:#Ett testverktyg visas. Det tillhandahåller data i presentationsläget för SCORM-lärmodulen, som kan användas för att kontrollera hur lärmodulen interagerar med ILIAS. För att öppna testverktyget måste det vänstra navigeringsträdet visas. +content#:#cont_debug_deactivate12#:#Ett testverktyg visas. Det tillhandahåller data i presentationsläget för SCORM-lärmodulen, som kan användas för att kontrollera hur lärmodulen interagerar med ILIAS. +content#:#cont_debug_deactivated#:#Note +content#:#cont_debugging#:#Felsökning +content#:#cont_decimal#:#Decimal +content#:#cont_def_feedb_activated#:#Standardåterkopplingen är för närvarande aktiverad i inställningarna för utbildningsmodulen. +content#:#cont_def_feedb_deactivated#:#Standardåterkopplingen är för närvarande avaktiverad i inställningarna för lärmodulen. +content#:#cont_def_layout#:#Standard layout +content#:#cont_def_lesson_mode#:#Registrera bearbetningsdata +content#:#cont_def_map_areas#:#Länkade områden (standard) +content#:#cont_def_organization#:#Standard +content#:#cont_default#:#Standard +content#:#cont_definition#:#Definition +content#:#cont_definitions#:#Definitioner +content#:#cont_delete_content#:#Ta bort innehåll +content#:#cont_delete_selected#:#Radera +content#:#cont_delete_style#:#Style Radera +content#:#cont_delete_track_data#:#Radera spårningsdata +content#:#cont_dependencies#:#Beroenden +content#:#cont_dir_created#:#Directory har skapats. +content#:#cont_dir_deleted#:#Katalogen har tagits bort. +content#:#cont_dir_file#:#Directory/Fil +content#:#cont_dir_renamed#:#Katalogen har bytt namn. +content#:#cont_disable_def_feedback#:#Avaktivera standardåterkoppling +content#:#cont_disable_def_feedback_info#:#Standardåterkopplingen för en fråga visas inte efter att du har besvarat en fråga. +content#:#cont_download#:#Ladda ner +content#:#cont_download_no_download#:#Nedladdningsfunktionen är för närvarande avaktiverad. Därför erbjuds inte filen till elever. +content#:#cont_download_no_menu#:#Menyn för utbildningsmodulen är för närvarande inaktiverad. Därför erbjuds inte filen till elever. +content#:#cont_download_title#:#Ladda ner filens titel +content#:#cont_downloads#:#Ladda ner +content#:#cont_downloads_desc#:#Fliken "Ladda ner" visas i presentationsvyn. Skapa en exportfil på fliken "Export" och dela den för allmän åtkomst. Sedan kan användare ladda ner delade exportfiler, till exempel för offline-användning eller import till en annan ILIAS-installation. +content#:#cont_downloads_public_desc#:#Tillåter nedladdning även för icke inloggade användare (allmänt område) +content#:#cont_drag_and_drop_elements#:#Dra ett sidelement till en platshållare med musen för att flytta det. +content#:#cont_drag_element_click_save#:#Flytta elementet till önskad position och klicka sedan på "Spara". +content#:#cont_ed_align_center#:#Rikta in centrum +content#:#cont_ed_align_left#:#Justera länkar +content#:#cont_ed_align_left_float#:#Left out, text around. +content#:#cont_ed_align_right#:#Ajustera höger +content#:#cont_ed_align_right_float#:#Rätt ut, text runt. +content#:#cont_ed_atable#:#Utökad tabell +content#:#cont_ed_cell_left#:#Flytta till vänster +content#:#cont_ed_cell_right#:#Flytta till höger +content#:#cont_ed_class#:#Stil +content#:#cont_ed_click_to_add_pg#:#Klicka här för att lägga till innehåll. +content#:#cont_ed_col_left#:#Flytta kolumnen till vänster +content#:#cont_ed_col_right#:#Flytta kolumnen till höger +content#:#cont_ed_copy#:#Kopia +content#:#cont_ed_copy_clip#:#Kopiera till urklipp +content#:#cont_ed_cut#:#Cutting out +content#:#cont_ed_delete#:#Radera +content#:#cont_ed_delete_cell#:#Ta bort kolumn +content#:#cont_ed_delete_col#:#Ta bort kolumn +content#:#cont_ed_delete_item#:#Ta bort post +content#:#cont_ed_delete_row#:#Radera rad +content#:#cont_ed_dtable#:#Datatabell +content#:#cont_ed_edit#:#Redigera +content#:#cont_ed_edit_data#:#Redigera data +content#:#cont_ed_edit_files#:#Redigera filer +content#:#cont_ed_edit_multiple#:#Redigera styckeordning +content#:#cont_ed_edit_prop#:#Egenskaper +content#:#cont_ed_enable#:#De-/Activate +content#:#cont_ed_flist#:# Lista över filer +content#:#cont_ed_go#:#Ok +content#:#cont_ed_grid_col_width#:#Kolumnbredd +content#:#cont_ed_grid_col_width_info#:#Columns kan uppta flera 1/12-enheter av en rad beroende på skärmstorleken. De nämnda enheterna är exempel. I slutändan är det skärmstorleken som avgör beteendet. 12/12 motsvarar en bredd på 100%. +content#:#cont_ed_grid_col_widths#:#Kolumnbredd +content#:#cont_ed_insert_amdfrm#:#Infoga formulär +content#:#cont_ed_insert_amdpl#:#Inför sidlista +content#:#cont_ed_insert_blog#:#Lägg till blogginlägg +content#:#cont_ed_insert_cach#:#Insätt konsultationstimmar +content#:#cont_ed_insert_dtab#:#Inför datatabell +content#:#cont_ed_insert_flst#:#Inför fillista +content#:#cont_ed_insert_grid#:#Insätt kolumnlayout +content#:#cont_ed_insert_grid_info#:#Inserterar en responsiv kolumnlayout baserad på ett rutnät med 12 enheter per rad. +content#:#cont_ed_insert_iim#:#Insätt interaktiv bild +content#:#cont_ed_insert_incl#:#Insert innehållsmodul +content#:#cont_ed_insert_lhist#:#Insert inlärningshistorik +content#:#cont_ed_insert_list#:#Inför utökad lista +content#:#cont_ed_insert_lpe#:#Insätt element för inloggningssida +content#:#cont_ed_insert_map#:#Infoga karta +content#:#cont_ed_insert_mcrs#:#Insert mina kurser +content#:#cont_ed_insert_media#:#Insert bild/audio/video +content#:#cont_ed_insert_par#:#Inför text +content#:#cont_ed_insert_pcqst#:#Infoga fråga +content#:#cont_ed_insert_plach#:#Insätt platshållare +content#:#cont_ed_insert_prof#:#Inför personuppgifter +content#:#cont_ed_insert_qover#:#Insätt frågeöversikt +content#:#cont_ed_insert_repobj#:#Insätt lista över material +content#:#cont_ed_insert_sec#:#Infoga block +content#:#cont_ed_insert_skills#:#Inför kompetenser +content#:#cont_ed_insert_src#:#Inför programkod +content#:#cont_ed_insert_tab#:#Insätt utökad tabell +content#:#cont_ed_insert_tabs#:#Insert dragspel +content#:#cont_ed_insert_templ#:#Insert innehållsmall +content#:#cont_ed_insert_vrfc#:#Infoga certifikat +content#:#cont_ed_item_down#:#Move entry down +content#:#cont_ed_item_up#:#Flytta inmatningen till toppen +content#:#cont_ed_list#:#Utökad lista +content#:#cont_ed_moveafter#:#Flytta till +content#:#cont_ed_movebefore#:#Skifta före +content#:#cont_ed_new_col_after#:#Ny kolumn höger +content#:#cont_ed_new_col_before#:#Ny kolumn vänster +content#:#cont_ed_new_item_after#:#Ny post nedan +content#:#cont_ed_new_item_before#:#Ny post ovan +content#:#cont_ed_new_row_after#:#Ny rad nedan +content#:#cont_ed_new_row_before#:#Ny rad ovan +content#:#cont_ed_par#:#Text +content#:#cont_ed_paste#:#Insert +content#:#cont_ed_paste_clip#:#Insert från urklipp +content#:#cont_ed_pglprop#:#Egenskaper för sidlayout +content#:#cont_ed_plachmedia#:#platshållare bild/media +content#:#cont_ed_plachprop#:#platshållare egenskaper +content#:#cont_ed_plachquestion#:#platshållare fråga +content#:#cont_ed_plachtext#:#platshållare text +content#:#cont_ed_plachverification#:#platshållarcertifikat +content#:#cont_ed_row_down#:#Flytta ner linjen +content#:#cont_ed_row_up#:#Flytta linjen uppåt +content#:#cont_ed_select_pctext#:#Välj textelement +content#:#cont_ed_split_page#:#Split sida +content#:#cont_ed_split_page_next#:#Flytta till nästa sida +content#:#cont_ed_textitem#:#Testa element +content#:#cont_ed_width#:#Bredd +content#:#cont_edit_base_image#:#Redigera källbild +content#:#cont_edit_comp#:#Edit-läge +content#:#cont_edit_definition#:#Redigera definition +content#:#cont_edit_definitions#:#Redigera definitioner +content#:#cont_edit_file_list_properties#:#Redigera egenskaper för fillistorna +content#:#cont_edit_language_version#:#Redigera version +content#:#cont_edit_lrs_settings#:#Inställningar +content#:#cont_edit_marker_position#:#Redigera markörens punkt +content#:#cont_edit_mob#:#Redigera mediaobjekt +content#:#cont_edit_mob_alias_prop#:#Redigera egenskaper för instansen av mediaobjektet +content#:#cont_edit_mode#:#Edit-läge +content#:#cont_edit_multi#:#Multipelt urval +content#:#cont_edit_overlay_position#:#Ändra positionen för överlagringen +content#:#cont_edit_par#:#Redigera text +content#:#cont_edit_personal_data#:#Redigera personuppgifter +content#:#cont_edit_popup_position#:#Ändra positionen för popup-fönstret +content#:#cont_edit_qover#:#Redigera frågeöversikt +content#:#cont_edit_shape_circle#:#Redigera konturer (cirkel) +content#:#cont_edit_shape_polygon#:#Redigera kontur (polygon) +content#:#cont_edit_shape_rectangle#:#Redigera kontur (rektangel) +content#:#cont_edit_shape_whole_picture#:#Redigera outline (hela bilden) +content#:#cont_edit_src#:#Redigera programkod +content#:#cont_edit_style#:#Redigera stil +content#:#cont_edit_tabs#:#Egenskaper +content#:#cont_edit_term#:#Redigera term +content#:#cont_element_refers_removed_itgr#:#Detta innehållselement hänvisar till ett objektblock som har raderats under tiden. +content#:#cont_empty_question#:#Frågan är ännu inte klar. Vänligen avsluta den eller radera frågan. +content#:#cont_enable_page_history#:#Aktivera sidhistorik +content#:#cont_enable_page_history_info#:#Äldre versioner av sidor sparas och kan återställas. +content#:#cont_enable_time_scheduled_page_activation#:#Tid för aktivering av sidor +content#:#cont_enable_time_scheduled_page_activation_info#:#Med funktionen kan du ställa in aktiveringstider för enskilda sidor i lärmodulen. +content#:#cont_end#:#Slut +content#:#cont_enough_answers_correct#:#Right, men inte den bästa möjliga lösningen! +content#:#cont_enter_a_dir_name#:#Var god ange ett katalognamn. +content#:#cont_enter_a_file#:#Välj en fil. +content#:#cont_error#:#Sorry, ett fel har uppstått! +content#:#cont_exp_id_used_multiple#:#Flera använda export-ID:n +content#:#cont_exp_ids_not_resp_format1#:#Export-ID får endast innehålla följande bokstäver. +content#:#cont_exp_ids_not_resp_format2#:#Vänligen kontrollera och korrigera din post. +content#:#cont_exp_ids_not_resp_format3#:#ID får inte börja med ett nummer. +content#:#cont_export_all#:#Exportera alla +content#:#cont_export_id#:#Export-ID +content#:#cont_file#:#Fil +content#:#cont_file_created#:#Filen skapades. +content#:#cont_file_deleted#:#Filerna har raderats. +content#:#cont_file_from_repository#:#Filma från tidning +content#:#cont_file_from_workspace#:#Fil från personliga resurser +content#:#cont_file_renamed#:#Filen har bytt namn. +content#:#cont_file_unzipped#:#Filen har packats upp. +content#:#cont_files#:#Filer +content#:#cont_finish_editing#:#Avsluta redigering +content#:#cont_first_open#:#Första facket öppet +content#:#cont_first_page#:#Första sidan +content#:#cont_first_row_style#:#Stil för första raden +content#:#cont_fix_tree#:#Reparera struktur +content#:#cont_fix_tree_confirm#:#Kör denna funktion endast om strukturen i lärmodulen är skadad, t.ex. om det finns tomma poster i kapitelstrukturen. +content#:#cont_fn#:#Fotnot +content#:#cont_footer#:#Footer +content#:#cont_footnote#:#Fotnot +content#:#cont_force_all_open#:#Alla är alltid öppna +content#:#cont_format#:#Format +content#:#cont_fourth_edition#:#Senaste versionen "SCORM 2004 4:e upplagan +content#:#cont_fourth_edition_info#:#SCORM 2004 4th edition" erbjuder vissa förbättringar jämfört med "3rd edition". Data kan utbytas över SCO-gränserna. Dessa möjligheter används dock sällan och har en negativ effekt på hastigheten och på data som skall raderas. +content#:#cont_free_pages#:#Gratis sidor +content#:#cont_full_is_in_dir#:#Delete inte möjligt. Filen för full view finns i katalogen. +content#:#cont_fullscreen#:#Fullskärm +content#:#cont_general_properties#:#Allmänna egenskaper +content#:#cont_get_link#:#Välj länk +content#:#cont_glo_assign#:#Assign ordlista +content#:#cont_glo_create#:#Skapa ny ordlista +content#:#cont_glo_detach#:# Avmarkera ordlista +content#:#cont_glo_properties#:#Glossary inställningar +content#:#cont_glossaries#:#Glossarier +content#:#cont_got_lock_release#:#Den här sidan har låsts för din redigering fram till %1. Andra användare kan inte göra några ändringar på sidan under den här tiden. Vänligen släpp sidan igen efter redigering. +content#:#cont_grid_cell#:#Kolumn +content#:#cont_grid_cell_confirm_deletion#:#Bör kolumnerna verkligen raderas? +content#:#cont_grid_nr_cells#:#Antal kolumner +content#:#cont_grid_t_main_side#:#Huvud- och sidoblock +content#:#cont_grid_t_main_side_info#:#Layoutar en bred kolumn till vänster och en smalare kolumn till höger om den. Växlar till en enspaltig layout i mobilvyn (liten). +content#:#cont_grid_t_manual#:#Manuellt skapad sidlayout +content#:#cont_grid_t_manual_info#:#Möjliggör fri utformning av antal och bredd på kolumnerna. +content#:#cont_grid_t_three_column#:#Layout med tre kolumner +content#:#cont_grid_t_three_column_info#:#Visar tre kolumner med samma bredd bredvid varandra. Växlar till en layout med en kolumn i mobilvyn (liten). +content#:#cont_grid_t_two_by_two#:#Två gånger två boxar +content#:#cont_grid_t_two_by_two_info#:#Visar två rader med två kolumner av samma bredd. Växlar till en enkolumnslayout i mobilvyn (liten) och till en fyrkolumnslayout på extra breda skärmar (extra stor). +content#:#cont_grid_t_two_column#:#Layout med två kolumner +content#:#cont_grid_t_two_column_info#:#Visar två kolumner med samma bredd bredvid varandra. Växlar till en layout med en kolumn i mobilvyn (liten). +content#:#cont_grid_width_l#:#Large (Stor) +content#:#cont_grid_width_l_info#:#t.ex. skrivbord +content#:#cont_grid_width_m#:#Medel +content#:#cont_grid_width_m_info#:#T.ex. tablett +content#:#cont_grid_width_s#:#Small (Liten) +content#:#cont_grid_width_s_info#:#t.ex. smartphone +content#:#cont_grid_width_xl#:#Mycket stor (extra stor) +content#:#cont_grid_width_xl_info#:#t.ex. Wide Desktop +content#:#cont_hacc_needs_height#:#Var god ange en höjd för horisontella dragspel. +content#:#cont_hacc_needs_width#:#Var god ange en bredd för horisontella dragspel. +content#:#cont_header#:#Rubrik +content#:#cont_height#:#Höjd i pixlar +content#:#cont_help_no_valid_tooltip_id#:#Det angivna verktygstips-ID:t är inte giltigt. +content#:#cont_hide_adv#:#Dölja djupgående kunskaper +content#:#cont_hide_head_foot_print#:# Dölj sidhuvud och sidfot i utskriften. +content#:#cont_hidenavig#:# Dölj vänster navigationsträd +content#:#cont_hidenavig_info#:#Det vänstra navigeringsträdet för att växla mellan flera avsnitt i lärmodulen kan döljas om SCORM-lärmodulen innehåller sin egen navigering eller om den övre navigeringsmenyn visas. +content#:#cont_highlight_class#:#Highlight klass +content#:#cont_highlight_mode#:#Markerat läge +content#:#cont_hover#:#Hover +content#:#cont_href#:#href +content#:#cont_html_export_ids#:#HTML export ID:n +content#:#cont_html_export_ids_info#:#Gör det möjligt att administrera egna ID:n för ILIAS inlärningsmoduler. Dessa ID:n används för att namnge HTML-sidor som genereras under HTML-export. +content#:#cont_html_table#:#HTML tabell +content#:#cont_id_ref#:#identifieraref +content#:#cont_ie_compatibility#:#Kompatibilitetsläge för Internet Explorer 7 +content#:#cont_ie_compatibility_info#:#Reducerar visningsproblem för äldre SCORM-lärmoduler som har optimerats för Internet Explorer. Om nyare versioner av Internet Explorer har kompatibilitetsläget inaktiverat, kommer denna inställning inte att gälla.
+content#:#cont_ie_force_render#:#Rendera Internet Explorer +content#:#cont_ie_force_render_info#:#Correct display of SCORM learning module content with many frames or iFrames is achieved by re-rendering the content. +content#:#cont_imagemap#:#Image Karta +content#:#cont_import#:#Import +content#:#cont_import_id#:#identifierare +content#:#cont_import_lang#:#Målspråk +content#:#cont_import_tracking#:#Importera loggdata +content#:#cont_import_trans#:#Import översättning +content#:#cont_import_validation_errors#:#Fel uppstod under valideringen av utbildningsmodulen. Displayen kan fortfarande fungera. Det är dock troligt att de felaktiga sidorna inte kan redigeras. +content#:#cont_initial_attached_content#:#Ytterligare innehåll i posten +content#:#cont_insert_amd_page_list#:#Inför sidlista +content#:#cont_insert_as_chapter#:#Inför som kapitel +content#:#cont_insert_as_subchapter#:#Insätt som underkapitel +content#:#cont_insert_blog#:#Lägg till blogginlägg +content#:#cont_insert_chapter#:#Inför kapitel +content#:#cont_insert_chapter_from_clip#:#Klistra in kapitel från klippbordet +content#:#cont_insert_consultation_hours#:#Lägg till konsultationstimmar +content#:#cont_insert_file_item#:#Inför fil +content#:#cont_insert_file_list#:#Inför fillista +content#:#cont_insert_list#:#Inför utökad lista +content#:#cont_insert_login_page#:#Skapa element för inloggningssida +content#:#cont_insert_map#:#Infoga karta +content#:#cont_insert_mob#:#media objekt +content#:#cont_insert_my_courses#:#Insert mina kurser +content#:#cont_insert_page#:#Infoga sida +content#:#cont_insert_page_from_clip#:#Klistra in sida från Urklipp +content#:#cont_insert_pagelayout#:#Insätt sida från mall +content#:#cont_insert_par#:#Inför text +content#:#cont_insert_profile#:#Publicera personuppgifter +content#:#cont_insert_resources#:#Insätt lista över material +content#:#cont_insert_section#:#Infoga block +content#:#cont_insert_skills#:#Infoga kompetens +content#:#cont_insert_src#:#Inför programkod +content#:#cont_insert_subchapter#:#Inför underkapitel +content#:#cont_insert_subchapter_from_clip#:# Klistra in underkapitel från Urklipp +content#:#cont_insert_table#:#Infoga tabell +content#:#cont_insert_verification#:#Lägg till certifikat +content#:#cont_inst_map_areas#:#Länkade områden av instansen +content#:#cont_interactions#:#Spara resultaten av uppgifterna +content#:#cont_interactions_info#:#Data om resultat från uppgifter (interaktioner) skrivs vanligtvis bara av lärmoduler och läses inte in. Om du är säker på att denna lärmodul gör detta, ökar detta alternativ prestandan. +content#:#cont_interactions_info_12#:#Uppgifterna om resultat från uppgifter (interaktioner) kan endast skrivas av SCORM 1.2 inlärningsmoduler och inte längre läsas in. Detta alternativ ökar prestandan. +content#:#cont_internal_link#:#intern länk +content#:#cont_internal_links#:#Interna länkar +content#:#cont_invalid_new_module#:#Modulen är inte kompatibel! Imsmanifest.xml måste vara identisk. +content#:#cont_is_visible#:#ärsynlig +content#:#cont_item#:#inträde +content#:#cont_keyword#:# nyckelord +content#:#cont_language#:#Språk +content#:#cont_languages#:#Språk +content#:#cont_last_try#:#Sista försöket +content#:#cont_last_update#:#Sista sparade +content#:#cont_last_visited_page#:#Sista besökta sidan +content#:#cont_latest_rev#:#Sista förändringen +content#:#cont_layout#:#Layout +content#:#cont_layout_1window#:#En ram +content#:#cont_layout_1window_desc#:#Innehåll i huvudramen. FAQ, ordlista och medielänkar öppnas i nytt fönster. +content#:#cont_layout_2window#:#Två ramar +content#:#cont_layout_2window_desc#:#Innehåll i den vänstra ramen. FAQ, ordlista och medielänkar öppnar innehållet i den högra ramen. +content#:#cont_layout_3window#:#Tre ramar +content#:#cont_layout_3window_desc#:#Innehåll i den vänstra ramen. FAQ- och medielänkar öppnar innehåll i den övre högra ramen, ordlista länkar i den nedre högra. +content#:#cont_layout_fullscreen#:#Fullständig bild +content#:#cont_layout_fullscreen_desc#:#Innehåll i huvudramen. FAQ, ordlista och medielänkar öppnas i ett nytt fönster. Huvudmenyn för ILIAS är avaktiverad. +content#:#cont_layout_per_page#:#Tillåt layout per sida +content#:#cont_layout_per_page_info#:#Gör det möjligt att välja en annan layout per sida. +content#:#cont_layout_presentation#:#Presentation +content#:#cont_layout_presentation_desc#:#Innehåll i huvudramen. FAQ, ordlista och medielänkar öppnas i ett nytt fönster. Huvudmenyn för ILIAS är avaktiverad. +content#:#cont_layout_template#:#Layout-mall +content#:#cont_layout_toc2win#:#Oversikt vänster +content#:#cont_layout_toc2win_desc#:#Oversikt till vänster, innehåll i den högra ramen. FAQ, ordlista och medielänkar öppnas i ett nytt fönster. +content#:#cont_layout_toc2windyn#:#Oversikt vänster, dynamisk ram +content#:#cont_layout_toc2windyn_desc#:#Oversikt till vänster, innehåll i den högra ramen. FAQ, ordlista och medielänkar visar innehåll i en dynamisk ram längst ner till höger. +content#:#cont_left#:#Länkar +content#:#cont_left_float#:#Länkar, text flödar runt +content#:#cont_license#:#Licens +content#:#cont_license_info#:#Fliken och funktionen "Licens" visas. +content#:#cont_light#:#Helvete +content#:#cont_link#:#Länk +content#:#cont_link_area#:#Länkområde +content#:#cont_link_ext#:#Länk (extern) +content#:#cont_link_glo_in_lm#:#Ska alla ordlistans termer nu länkas i inlärningsmodulen? +content#:#cont_link_int#:#Länk (intern) +content#:#cont_link_no#:#Ingen länk +content#:#cont_link_select#:#Intern länk +content#:#cont_link_to_external#:#Länk till en extern webbplats +content#:#cont_link_to_internal#:#Länk inom ILIAS +content#:#cont_link_to_wiki#:#Länk till en wiki-sida (sätt in parenteser) +content#:#cont_link_type#:# typ av länk +content#:#cont_link_user#:#Min profil###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +content#:#cont_linked_mobs#:#Länkade mediaobjekt +content#:#cont_links#:#Länkar +content#:#cont_list_files#:#Fil katalog +content#:#cont_list_indent#:#Indent lista +content#:#cont_list_outdent#:#Flytta ut listan +content#:#cont_list_properties#:#Lista egenskaper +content#:#cont_lists#:#Listor +content#:#cont_lk_chapter#:#Kapitel +content#:#cont_lk_chapter_new#:#Kapitel på ny flik +content#:#cont_lk_file#:#Fil/Dokument +content#:#cont_lk_media_faq#:#Mediaobjekt i FAQ-verktyg +content#:#cont_lk_media_inline#:#Media objekt (inline) +content#:#cont_lk_media_media#:#Medieobjekt i medieverktyg +content#:#cont_lk_media_new#:#Mediaobjekt i ny flik +content#:#cont_lk_page#:#Sida +content#:#cont_lk_page_faq#:#Sida i FAQ-verktyg +content#:#cont_lk_page_new#:#Sida i ny flik +content#:#cont_lk_term#:#Glossarisk term +content#:#cont_lk_term_new#:#Glossary term i ny flik +content#:#cont_lm_comments_desc#:#Tillåter användare att lägga till offentliga kommentarer på alla lärmodulsidor. +content#:#cont_lm_default_layout#:#Standardlayout för utbildningsmodulen +content#:#cont_lm_mail_permanent_link#:#Klicka på följande länk för att komma till utbildningsmodulen +content#:#cont_lm_menu#:#Meny +content#:#cont_lm_properties#:#Inställningar för utbildningsmoduler +content#:#cont_lm_starting_point#:#Startsida för ILIAS utbildningsmoduler +content#:#cont_lm_starting_point_info#:#Sida som öppnas när du klickar på lärmodulens titel. +content#:#cont_localfile#:#Lokal fil +content#:#cont_localization#:#Språk +content#:#cont_localization_info#:#Inställningen krävs för fördefinierade texter i modulen (t.ex. "Framåt" / "Tillbaka"). +content#:#cont_location#:#Position +content#:#cont_lpe_cas_login_form#:#CAS inloggningsmask +content#:#cont_lpe_language_selection#:#Val av språk +content#:#cont_lpe_login_form#:#Logga in mask +content#:#cont_lpe_openid_connect_login#:#OpenId Anslut inloggning +content#:#cont_lpe_openid_login_form#:#OpenID inloggningsmask +content#:#cont_lpe_registration_link#:#Länk till den nya registreringen +content#:#cont_lpe_saml_login#:#SAML-inloggning +content#:#cont_lpe_shib_login_form#:#Shibboleth inloggningsmask +content#:#cont_lpe_user_agreement_link#:#Länk till användaravtalet +content#:#cont_lrs_settings#:#Inställningar +content#:#cont_lvalue#:#Data element +content#:#cont_maintenance#:#Underhåll +content#:#cont_manifest#:#Manifest +content#:#cont_map_file_not_generated#:#Tyvärr kunde bildkartfilen inte genereras. +content#:#cont_marker#:#Markeringspunkt +content#:#cont_master_language_only#:#Basspråk för översättning - Master +content#:#cont_master_language_only_no_media#:#Basspråk för översättning - utan mediaobjekt +content#:#cont_mastery_score#:#adlcp +content#:#cont_mastery_score_12#:#mastery_score skriva över +content#:#cont_mastery_score_12_info#:#Om en SCO inte bestämmer en status självständigt, anses en SCO vara godkänd om den uppnådda poängen har nått minst ett visst värde - mastery_score. Du kan skriva över detta värde här, t.ex. för att sänka kravnivån. Om fältet är tomt gäller specifikatione +content#:#cont_mastery_score_2004#:#scaled_passing_score skriva över +content#:#cont_mastery_score_2004_info#:#Centrala lärandemål i denna lärmodul anses vara godkända om den uppnådda poängen har nått minst ett visst värde - scaled_passing_score. Du kan skriva över detta procentvärde här, t.ex. för att sänka kravnivån. Om fältet är tomt gäller specifikationerna i +content#:#cont_max_time_allowed#:#adlcp +content#:#cont_media#:#Bilder/Audio/Video +content#:#cont_media_placeh#:#Klicka och redigera för att infoga ett mediaobjekt +content#:#cont_media_placehl#:#Image/Media Platshållare +content#:#cont_media_source#:#Mediekälla +content#:#cont_missing_preconditions#:#Du måste uppfylla följande förutsättningar för att få tillgång till kapitel "%s". +content#:#cont_missing_snippet#:#Modul för innehåll som saknas +content#:#cont_mob_def_prop#:#Standardinställningar +content#:#cont_mob_from_media_pool#:#Välja från mediepoolen +content#:#cont_mob_inst_prop#:#Egenskaper för instansen +content#:#cont_mob_usages#:#Använda +content#:#cont_more_character_styles#:#Karaktärsstilar +content#:#cont_more_functions#:#Mer +content#:#cont_moved_srt_files#:#Undertextfilerna har tilldelats mediaobjekten. +content#:#cont_multi_srt_files#:#SRT-filer +content#:#cont_mycourses_sortorder#:#Standard sortering +content#:#cont_mycourses_sortorder_alphabetical#:#Alfabetisk +content#:#cont_mycourses_sortorder_info#:#Detta är standardinställningen. Varje användare kan välja sin egen sorteringsordning, som gäller för alla "Mina kurser"-objekt i alla portföljer. +content#:#cont_mycourses_sortorder_location#:#Efter plats +content#:#cont_name#:#Namn +content#:#cont_never#:#Nie +content#:#cont_new_area#:#Nytt länkområde +content#:#cont_new_chap#:#Nytt kapitel +content#:#cont_new_dir#:#Ny katalog +content#:#cont_new_file#:#Ladda upp ny fil +content#:#cont_new_marker#:#Ny markör +content#:#cont_new_mob#:#Nytt mediaobjekt +content#:#cont_new_module_added#:#Ny modulversion har laddats upp framgångsrikt +content#:#cont_new_page#:#Ny sida +content#:#cont_new_popup#:#Ny pop-up +content#:#cont_new_question#:#Ny fråga +content#:#cont_new_tab#:#Nytt ämne +content#:#cont_new_term#:#Ny mandatperiod +content#:#cont_new_trigger_area#:#Ny utgivningsomgång +content#:#cont_next_rev#:#Efterföljande förändring +content#:#cont_nlist#:#Numrerad lista +content#:#cont_no_access#:#Ingen åtkomst +content#:#cont_no_block#:#Inget block +content#:#cont_no_caption#:#Ingen legend +content#:#cont_no_download_file_available#:#Ingen offentlig nedladdningsfil är för närvarande tillgänglig. +content#:#cont_no_glossary#:#Ingen ordlista +content#:#cont_no_manifest#:#Ingen fil med namnet imsmanifest.xml hittades i rotkatalogen. +content#:#cont_no_page#:#Ingen sida hittades +content#:#cont_no_page_access_unansw_q#:#Du måste svara rätt på alla föregående frågor för att få tillgång till denna sida. +content#:#cont_no_page_in_chapter#:#Tyvärr finns det för närvarande inget aktivt innehåll i detta kapitel. +content#:#cont_no_parameters#:#Inga parametrar +content#:#cont_no_read#:#Ingen läsbehörighet +content#:#cont_no_subdir_in_zip#:#ZIP-kommandot kunde inte utföras eller importfilen är felaktig.
Den innehåller inte undermappen '%s'. +content#:#cont_no_text#:#Ingen text +content#:#cont_nomenu#:# Dölj övre navigeringsmenyn +content#:#cont_nomenu_info#:#Den övre navigeringsmenyn kan döljas om SCORM-lärmodulen har tillräckliga funktioner för pausning, avslutning och navigering. +content#:#cont_none#:#Ingen +content#:#cont_not_saved_edit_lock_expired#:#Tyvärr, dina ändringar kunde inte sparas. Sidan har låsts för redigering av en annan användare under tiden. Du kan stänga dialogen och sedan kopiera innehållet till Urklipp. +content#:#cont_notification_activate_lm#:#Aktivera aviseringar för utbildningsmodulen +content#:#cont_notification_activate_page#:#Aktivera aviseringar för sidan +content#:#cont_notification_activated#:#Notification aktiverad (Hela utbildningsmodulen) +content#:#cont_notification_comment_lm#:# följande sida kommenterades +content#:#cont_notification_comment_subject_lm#:#Det fanns en kommentar på sidan %s +content#:#cont_notification_deactivate_lm#:#Deaktivera aviseringar för utbildningsmodulen +content#:#cont_notification_deactivate_page#:#Inaktivera aviseringar för sidan +content#:#cont_notification_deactivated#:#Notifieringar har inaktiverats. +content#:#cont_notification_update_lm#:# följande utbildningsmodul har ändrats +content#:#cont_notify_on_blocked_users#:#Notifiering om blockerade användare +content#:#cont_notify_on_blocked_users_info#:#Du kommer att meddelas så snart användare blockeras eftersom de har överskridit det maximala antalet svarsförsök. +content#:#cont_nr_col_footer#:#Kolumner för fot +content#:#cont_nr_col_header#:#Kolumner med huvud +content#:#cont_nr_cols#:#Antal kolumner +content#:#cont_nr_items#:#Antal poster +content#:#cont_nr_of_tries_exceeded#:#Du har inga fler försök. +content#:#cont_nr_row_footer#:#Fotbollsspelare +content#:#cont_nr_row_header#:#Rubriker +content#:#cont_nr_rows#:#Antal rader +content#:#cont_number_of_tabs#:#Antal försökspersoner +content#:#cont_number_std#:#Standard +content#:#cont_number_type#:#Nummer typ +content#:#cont_numbered_list#:#Numrerad lista +content#:#cont_obj_removed#:#Objekt borttagna +content#:#cont_objectives#:#Spara resultat till inlärningsmål +content#:#cont_objectives_info#:#Avaktivera endast detta alternativ om du är säker på att den här utbildningsmodulen garanterat kommer att genomföras korrekt. Detta kommer att minska lagringen av personuppgifter och öka prestandan. +content#:#cont_offline_mode_allow#:#Tillåt Offlineläge +content#:#cont_offline_mode_allow_info#:#Tillåter att lärmodulen används utan internetanslutning i SCORM offline-spelaren. För att göra detta laddas lärmodulen ner via ?-menyn och visas med ett tillägg i webbläsaren Firefox. Efter att ha redigerat lärmodulen måste användarna importera sina lärs +content#:#cont_offline_mode_disable_not_allowed_info#:#Eftersom lärmodulen för närvarande används av användare i offline-läge, kan offline-läget inte avaktiveras. +content#:#cont_online#:#Online +content#:#cont_online_help_ids#:#Skärm-ID +content#:#cont_online_info#:#Endast om SCORM-lärmodulen är uppkopplad online kan användare komma åt lärmodulen. Om inte, är SCORM-lärmodulen endast tillgänglig för personer med rätt "Redigera inställningar". +content#:#cont_open#:#Visning av utbildningsmodulen +content#:#cont_open_clipboard#:#Öppna klippbord för media +content#:#cont_open_iframe#:#Öppnas i samma fönster (iFrame) under ILIAS huvudmeny +content#:#cont_open_normal#:#Öppnas i en ny flik eller alternativt i ett nytt fönster utan ILIAS huvudmeny +content#:#cont_open_window#:#Compulsory öppnas i ett nytt fönster utan ILIAS huvudmeny +content#:#cont_operation_not_allowed#:#Den här åtgärden är inte tillåten +content#:#cont_organization#:#Organisation +content#:#cont_organizations#:#Organisationer +content#:#cont_orig_size#:#Ursprunglig storlek +content#:#cont_out_of_focus_message#:#Den här sidan är inte längre en del av innehållet i det aktuella lärandemålet. +content#:#cont_out_of_focus_message_last_page#:#Du är på den sista sidan med innehåll för det aktuella lärandemålet. +content#:#cont_ov_all_correct#:#Du har svarat rätt på alla frågor. +content#:#cont_ov_preview#:#Frågeöversikten fungerar inte i sidredigeringssammanhang. Använd istället förhandsgranskningen på SCO- eller SCORM-nivå. +content#:#cont_ov_some_correct#:#Du har svarat rätt på [x] av [y] frågor. +content#:#cont_ov_wrong_answered#:#Följande frågor har ännu inte besvarats eller har besvarats felaktigt +content#:#cont_overlay_image#:#Bild för överlagring +content#:#cont_overlay_images#:#Overlay bilder +content#:#cont_overlays_have_been_deleted#:#Overlays har tagits bort +content#:#cont_page_activation#:#Aktivering av sida +content#:#cont_page_activation_on#:#Innehållet aktiveras på %s. +content#:#cont_page_compare#:#Jämför utvalda förändringar +content#:#cont_page_created#:#Sida tillagd +content#:#cont_page_currently_deactivated#:#Den här sidan är för närvarande inaktiverad. +content#:#cont_page_deactivated#:#Sidan är inaktiverad +content#:#cont_page_deactivated_elements#:#Sidan innehåller inaktiverade element +content#:#cont_page_header#:#Sidans rubrik +content#:#cont_page_layout#:#Sidans layout +content#:#cont_page_lock_released#:#Redigeringen har slutförts. Sidan har släppts igen. +content#:#cont_page_notification_activated#:#Notifiering aktiverad (En sida) +content#:#cont_page_template#:#Mall +content#:#cont_page_toc#:#Översikt över sidor +content#:#cont_page_translation_does_not_exist#:#Sidan finns ännu inte på detta språk. Den kommer nu att skapas som en kopia av standardspråket. Språk för den nya sidan +content#:#cont_pages#:#Sidor +content#:#cont_pages_and_subchapters#:#Underkapitel och sidor +content#:#cont_par_format#:#Format för stycke +content#:#cont_paragraph_styles#:#Format för stycken +content#:#cont_parameter#:#Parametrar +content#:#cont_parameters#:#Parametrar +content#:#cont_paste_from_clipboard#:#Klistra in från Urklipp +content#:#cont_paste_table#:#Infoga tabell +content#:#cont_pc_amdpl#:#Lista över sidor +content#:#cont_pc_blog#:#Blogg +content#:#cont_pc_carousel#:#karusell +content#:#cont_pc_code#:#Kod +content#:#cont_pc_deleted#:#Borttaget innehåll +content#:#cont_pc_dtab#:#Datatabell +content#:#cont_pc_flist#:# Lista över filer +content#:#cont_pc_grid#:#Kolumnlayout +content#:#cont_pc_hacc#:#Accordion (horisontell) +content#:#cont_pc_iim#:#Interaktiv bild +content#:#cont_pc_incl#:#Innehållsmodul +content#:#cont_pc_list#:#Utökad lista +content#:#cont_pc_map#:#Karta +content#:#cont_pc_media#:#Image/Audio/Video +content#:#cont_pc_mob#:#media objekt +content#:#cont_pc_modified#:#Ändrat innehåll +content#:#cont_pc_new#:#Nytt innehåll +content#:#cont_pc_par#:#Text +content#:#cont_pc_prof#:#Personuppgifter +content#:#cont_pc_qover#:#Frågeformulär +content#:#cont_pc_qst#:#Fråga +content#:#cont_pc_res#:#Resurs +content#:#cont_pc_sec#:#Blockera +content#:#cont_pc_skills#:#Kompetens +content#:#cont_pc_tab#:#Utökad tabell +content#:#cont_pc_vacc#:#Accordion (vertikal) +content#:#cont_pc_vrfc#:#Certifikat +content#:#cont_permission_object#:#Objekt för auktorisation +content#:#cont_permission_object_desc#:#Om ett behörighetsobjekt är valt visas blocket endast för användare med den valda rätten till behörighetsobjektet. +content#:#cont_personal_clipboard#:#Personligt klippbord +content#:#cont_pg_title#:#Sidans titel +content#:#cont_please_enter_a_term#:#Var god ange en term. +content#:#cont_please_select#:#Vänligen välj +content#:#cont_please_try_again#:#Försök igen! +content#:#cont_popups_have_been_deleted#:#Popups har tagits bort +content#:#cont_position#:#Position +content#:#cont_prereq_type#:#adlcp +content#:#cont_prerequisites#:#adlcp +content#:#cont_presentation#:#Presentation +content#:#cont_presentation_view#:#Presentation vy +content#:#cont_preview#:#Förhandsgranskning +content#:#cont_previous_rev#:#Tidigare förändring +content#:#cont_print_no_page_selected#:#Vänligen välj minst en sida. +content#:#cont_print_selection#:#Selektion utskriftsvy +content#:#cont_print_view#:# Skriv ut vy +content#:#cont_print_view_pre_glo#:#Ingen visning av bilagan med ordlista i utskriftsvyn +content#:#cont_profile_mode#:#Mode +content#:#cont_profile_mode_inherit#:#Automatisk +content#:#cont_profile_mode_inherit_info#:#Använder data från din profil +content#:#cont_profile_mode_manual#:#Handbok +content#:#cont_profile_mode_manual_info#:#Använder följande data +content#:#cont_profile_mode_template_inherit_info#:#Använder data från profilen +content#:#cont_progress_icons#:#Ikoner för framsteg +content#:#cont_progress_icons_info#:#I innehållsförteckningen visas förloppsikoner istället för kapitel- och sidikoner. +content#:#cont_prtf_page#:#Portföljsida +content#:#cont_prtt_page#:#Portfolio mall sida +content#:#cont_public_access#:#Allmänhetens tillgång +content#:#cont_purpose#:#Använda +content#:#cont_qover_list_wrong_q#:#Lista över felaktigt besvarade frågor +content#:#cont_qover_list_wrong_q_info#:#En lista över alla frågor som ännu inte har besvarats eller som har besvarats felaktigt visas. +content#:#cont_qover_short_message#:#Frågestatus +content#:#cont_qover_short_message_info#:#Ett meddelande "Du har ännu inte besvarat x av y frågor eller har besvarat dem felaktigt" visas. +content#:#cont_qtries#:#Antal försök för frågor +content#:#cont_qtries_info#:#Förvalt värde "Antal försök" för nyskapade frågor. +content#:#cont_question_placeh#:#Klicka och redigera för att infoga en fråga +content#:#cont_question_placehl#:#Fråga platshållare +content#:#cont_question_stats#:#Statistik +content#:#cont_question_type#:#Typ av fråga +content#:#cont_quit_text_editing#:#Avsluta textredigering +content#:#cont_rand_start#:#Random start page +content#:#cont_really_delete_overlays#:#Vill du verkligen ta bort följande överlägg? +content#:#cont_really_delete_popups#:#Vill du verkligen ta bort följande popup-fönster? +content#:#cont_really_delete_triggers#:#Vill du verkligen ta bort följande triggers? +content#:#cont_ref_helptext#:#(t.ex. http +content#:#cont_ref_images#:#Refererade bilder +content#:#cont_reference#:#Hänvisning +content#:#cont_remove_format#:#Ta bort format +content#:#cont_rename_dir#:#Namn på katalog +content#:#cont_replace_mob_feature#:#Byt ut mediaobjekt i innehållet +content#:#cont_replace_mob_feature_info#:#Aktiverar en funktion för att ersätta mediaobjekt men behålla inställningarna för de redan använda instanserna av objektet. +content#:#cont_repository_item#:#Objekt i tidning +content#:#cont_reset_nr_of_tries#:#Återställ antal svarsförsök. +content#:#cont_resize_img#:#Justera bildstorlek +content#:#cont_resource#:#Resurs +content#:#cont_resource_size#:#Resursens ursprungliga storlek / Ingen storleksspecifikation +content#:#cont_resource_size_info#:#Om storleksspecifikationen utelämnas kan storleken påverkas av innehållsstilen. Utan någon reglering av storleken visas endast bildfiler i sin normala storlek. +content#:#cont_resource_type#:#Typ +content#:#cont_resources#:#Resurser +content#:#cont_resources_of_type#:#Innehåll i typen +content#:#cont_restrict_forw_nav#:#Reglera framåtrullning i inlärningsmodulen +content#:#cont_restrict_forw_nav_info#:#En efterföljande sida kan endast öppnas om alla testfrågor har besvarats korrekt på den aktuella lärmodulssidan. Denna funktion kräver alternativet "Spara svarsförsök" i inställningen "Svarsförsök". +content#:#cont_revision#:#Förändring +content#:#cont_right#:#Höger +content#:#cont_right_float#:#Right, texten flödar runt +content#:#cont_rollback#:#Rollback +content#:#cont_rollback_confirmation#:#Vill du verkligen återställa den här gamla versionen av sidan? +content#:#cont_roman#:#Romerska I, II, ... +content#:#cont_roman_s#:#Romanska i, ii, ... +content#:#cont_rowspan#:#Associationsserier +content#:#cont_rte_settings#:#RTE-inställningar +content#:#cont_rvalue#:#Värde +content#:#cont_save_all_titles#:#Spara titel +content#:#cont_save_positions#:#Spara sekvens +content#:#cont_save_positions_and_classes#:#Spara positioner och stilar +content#:#cont_save_spans#:#Spara cellkluster +content#:#cont_save_types#:#Spara typer +content#:#cont_save_widths#:#Spara bredd +content#:#cont_saved_export_ids#:#HTML export-ID:n lagrade. +content#:#cont_saved_interactive_image#:#Interaktiv bild sparad +content#:#cont_saved_map_area#:#Länkområdet sparat. +content#:#cont_saved_map_data#:#Image Map sparad. +content#:#cont_saving#:#Spara... +content#:#cont_sc_auto_continue#:#Framåt användare +content#:#cont_sc_auto_continue_info#:#Automatiskt dirigeras användare till nästa SCO efter den senaste aktiviteten. Denna funktion stöds inte av alla SCORM 1.2-lärmoduler. +content#:#cont_sc_auto_review_2004#:#Spara data +content#:#cont_sc_auto_review_completed#:#Spara inte från status 'fullständigt bearbetad +content#:#cont_sc_auto_review_completed_and_passed#:#Spara inte från status 'fully processed' och 'passed'. +content#:#cont_sc_auto_review_completed_not_failed_or_passed#:#Spara inte från status 'fully processed' (om inte 'not passed') eller 'passed'. +content#:#cont_sc_auto_review_completed_or_passed#:#Spara inte från status 'fully processed' eller 'passed'. +content#:#cont_sc_auto_review_info_2004#:#När användare har uppnått en valbar status för ett kapitel / SCO i en redigeringssession, är denna status fast. Användare kan inte ändra status i senare redigeringssessioner.
I det sällsynta fallet att lärmodulen använder "Sekvensering och navigeri +content#:#cont_sc_auto_review_no#:#alltid (rekommenderas) +content#:#cont_sc_auto_review_passed#:#Spara inte från status 'godkänd' +content#:#cont_sc_auto_review_passed_or_failed#:#Spara inte från status 'godkänd' eller 'ej godkänd +content#:#cont_sc_id_setting#:#student_id enligt SCORM 1.2 motsvarar +content#:#cont_sc_id_setting_2004#:#learner_id enligt SCORM 2004 motsvarar +content#:#cont_sc_id_setting_info#:#Om ett numeriskt ID för student_id (SCORM 1.2) eller learner_id (SCORM 2004) leder till problem med lärmodulen, använd alternativet "ILIAS login name". Tillägget "Ref-ID" eller "Obj-ID" kan vara användbart för lärmoduler som ansluter till en extern serve +content#:#cont_sc_id_setting_user_id#:#ILIAS-UserId (standard) +content#:#cont_sc_id_setting_user_id_plus_obj_id#:#ILIAS-UserId plus ObjId för inlärningsmodulen +content#:#cont_sc_id_setting_user_id_plus_ref_id#:#ILIAS-UserId plus RefId för inlärningsmodulen +content#:#cont_sc_id_setting_user_login#:#ILIAS inloggningsnamn +content#:#cont_sc_id_setting_user_login_plus_obj_id#:#ILIAS inloggningsnamn plus ObjId för utbildningsmodulen +content#:#cont_sc_id_setting_user_login_plus_ref_id#:#ILIAS inloggningsnamn plus RefId för utbildningsmodulen +content#:#cont_sc_less_mode_browse#:# Endast förhandsvisning ('browse') +content#:#cont_sc_less_mode_normal#:#Normal användning ('normal') +content#:#cont_sc_max_attempt_exceed#:#Det maximala antalet försök för denna modul har uppnåtts. +content#:#cont_sc_name_setting#:#student_name enligt SCORM 1.2 motsvarar +content#:#cont_sc_name_setting_2004#:#learner_name enligt SCORM 2004 motsvarar +content#:#cont_sc_name_setting_first_lastname#:#Förnamn och efternamn +content#:#cont_sc_name_setting_first_name#:#Förnamn +content#:#cont_sc_name_setting_fullname#:#Titel, förnamn och efternamn +content#:#cont_sc_name_setting_info#:#Den studerandes namn kan visas på olika sätt i lärmodulen. Om inlärningsmodulerna finns på en extern server kan det vara bra att inte avslöja namnet. +content#:#cont_sc_name_setting_last_firstname#:#Efternamn, förnamn +content#:#cont_sc_name_setting_no_name#:#Inget namn +content#:#cont_sc_name_setting_salutation_lastname#:#Förnamn och efternamn +content#:#cont_sc_new_version#:#Ladda upp ny version +content#:#cont_sc_preview#:#Förhandsgranskning +content#:#cont_sc_stat_browsed#:#Besökt +content#:#cont_sc_stat_completed#:#Fullbordad +content#:#cont_sc_stat_failed#:#Misslyckad +content#:#cont_sc_stat_incomplete#:#Inte komplett +content#:#cont_sc_stat_not_attempted#:#Inte påbörjad +content#:#cont_sc_stat_passed#:#Bekräftad +content#:#cont_sc_stat_running#:#Aktiv +content#:#cont_sc_store_if_previous_score_was_lower#:#Spara inte om den tidigare poängen var högre eller densamma +content#:#cont_sc_title#:#Titel +content#:#cont_sc_usession#:#Förhindra automatisk utloggning från ILIAS +content#:#cont_sc_usession_info#:#Förfrågningar skickas regelbundet till ILIAS så att användaren förblir inloggad på plattformen. ILIAS skulle annars inte utvärdera redigeringen av SCORM-inlärningsmodulen som en aktivitet och avsluta ILIAS-sessionen. Som ett resultat skulle redigeringsda +content#:#cont_sc_version#:#Version av utbildningsmodulen +content#:#cont_sc_version_info#:#Sekvensnumret läses automatiskt från versionshanteringen av utbildningsmodulen. +content#:#cont_scheduled_activation#:#Tidaktivering +content#:#cont_sco_glossary#:#Ordlista +content#:#cont_score#:#Poäng +content#:#cont_scorm_ed_properties#:#Egenskaper inlärningsmodul +content#:#cont_scorm_options#:#Registrering av bearbetningsdata +content#:#cont_scorm_type#:#adlcp +content#:#cont_screen_ids#:#Skärm-ID +content#:#cont_sec_protected#:#Skyddad +content#:#cont_sec_protected_text#:#Följande block är skyddat och kan inte redigeras. +content#:#cont_second#:#2. svara +content#:#cont_sel_el_use_paste#:#De valda elementen finns nu i Urklipp. Klicka nu på önskad målplatshållare och klicka på "Klistra in". +content#:#cont_select#:#Välj +content#:#cont_select_file#:#Välj fil +content#:#cont_select_from_upload_dir#:#-- Välj från uppladdningskatalogen --. +content#:#cont_select_item#:#Välj minst ett objekt. +content#:#cont_select_max_one_item#:#Välj endast ett objekt. +content#:#cont_select_media_pool#:#Välj mediepool +content#:#cont_select_none#:#Avmarkera +content#:#cont_select_other_qpool#:#Välj en annan frågepool +content#:#cont_select_par_or_section#:#Välj minst ett text- eller blockelement. +content#:#cont_selected_items_have_been_copied#:#De valda elementen har kopierats till Urklipp. Klicka nu på motsvarande platshållare för att klistra in dem i lärmodulen +content#:#cont_selected_items_have_been_cut#:#De valda elementen har flyttats till Urklipp. Klicka nu på motsvarande platshållare för att klistra in dem i lärmodulen. +content#:#cont_selected_pg_chap#:#Valda sidor/kapitel +content#:#cont_selected_terms#:#Utvalda termer +content#:#cont_selected_topic#:#Valda ämnen +content#:#cont_selection#:#Urval +content#:#cont_self_assessment#:#Självtester +content#:#cont_sequencing#:#Sequencing och navigering +content#:#cont_sequencing_info#:#Aktiverar lärmodulens standardinställningar för interaktiv styrning av användarnas navigeringsalternativ inom lärmodulen beroende på händelser eller resultat.
Kontrollera först om din lärmodul innehåller sådana specifikationer för "Sekvensering och +content#:#cont_set_alignment#:#Ställ in inriktning +content#:#cont_set_layout#:#Sätt layout +content#:#cont_set_link#:#Ändra referens +content#:#cont_set_start_file#:#Sätt startfil +content#:#cont_set_styles#:#Bestäm stilar +content#:#cont_set_tab_style_info#:#Aktivera kryssrutorna för att formatera tabellcellerna +content#:#cont_settings#:#Inställningar för utbildningsmoduler +content#:#cont_shape#:#form +content#:#cont_shift_click_to_select#:#Shift + klicka för att markera ett sidelement och växla till markeringsläge. +content#:#cont_short_title#:#Kort titel +content#:#cont_short_title_info#:#Korta titlar används i trädvyn till vänster och för att navigera fram och tillbaka. +content#:#cont_short_titles#:#Kort titel +content#:#cont_show_activation_info#:#Note###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +content#:#cont_show_activation_info_info#:#Fram till startdatumet hoppas sidan inte över, men en indikation på dess temporära aktivering visas.###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +content#:#cont_show_adv#:#Visa fördjupad kunskap +content#:#cont_show_content_after_focus#:#Fortsätt med annat innehåll i utbildningsmodulen +content#:#cont_show_fullscreen#:#Visa hela skärmen +content#:#cont_show_info#:#Visa info +content#:#cont_show_line_numbers#:#Visa radnummer +content#:#cont_show_print_view#:# Skriv ut vy +content#:#cont_size#:#Storlek +content#:#cont_skip_chapter#:#Hoppa över det här kapitlet +content#:#cont_snippet_from_another_installation#:#Innehållsmodulen kommer från en annan ILIAS-installation. +content#:#cont_snippets_used#:#Innehållsmoduler som används +content#:#cont_span#:#Anslut celler +content#:#cont_special_page#:#Särskild sida +content#:#cont_spreadsheet_table#:#Beräkningstabell +content#:#cont_sqst#:#Fråga i undersökning (material) +content#:#cont_src#:#Programmeringsspråk +content#:#cont_src_other#:#Andra +content#:#cont_st_title#:#Kapitlets titel +content#:#cont_standard#:#Standard +content#:#cont_start#:#Start +content#:#cont_start_file_set_to#:#%s har angetts som startfil. +content#:#cont_start_value#:#Startvärde +content#:#cont_start_value_info#:# Ange ett startvärde som ett decimaltal. Standardvärdet är 1. +content#:#cont_startfile#:#Starta fil +content#:#cont_status#:#Status +content#:#cont_std_is_in_dir#:#Delete inte möjligt. Fil för standardvy finns i katalogen. +content#:#cont_std_view#:#Standardvy +content#:#cont_structure#:#Struktur +content#:#cont_style#:#Stil +content#:#cont_subchapters#:#Underkapitel +content#:#cont_submit_answers#:#Utvärdera +content#:#cont_subtitle_file#:#SRT ZIP-fil +content#:#cont_subtitle_files#:#Subtitle Media Objects +content#:#cont_sur_block_format#:#Omgivande block +content#:#cont_switch_to_media_pool#:#Byt till en annan mediepool +content#:#cont_syntax_help#:#Hjälp med syntax +content#:#cont_tab_cont_height#:#Höjd Innehåll +content#:#cont_tab_cont_width#:#Bredd Innehåll +content#:#cont_table#:#Tabell +content#:#cont_table_border#:#Bredd bordskant +content#:#cont_table_border_info#:#Värden måste anges inklusive enhet (t.ex. px). Om inget värde anges hämtas värdena från formatmallen. +content#:#cont_table_cell_properties#:#Egenskaper för tabellceller +content#:#cont_table_cellpadding#:#Internt avstånd mellan tabellceller +content#:#cont_table_cellpadding_info#:#Värden måste anges inklusive enhet (t.ex. px). Om inget värde anges hämtas värdena från formatmallen. +content#:#cont_table_edit_cells#:#Redigera celler +content#:#cont_table_properties#:#Tabellens egenskaper +content#:#cont_table_width#:#Tabellens bredd +content#:#cont_tabs#:#Fans +content#:#cont_tabs_acc_hor#:#Horisontellt dragspel +content#:#cont_tabs_acc_ver#:#Vertikalt dragspel +content#:#cont_tabs_carousel#:#karusell +content#:#cont_tabs_confirm_deletion#:#Är du säker på att dessa ämnen och deras innehåll bör raderas? +content#:#cont_target_missing#:#Målpunkt saknas +content#:#cont_target_within_source#:#Målet får inte ligga inom objektet. +content#:#cont_template#:#Mall +content#:#cont_term#:#Term +content#:#cont_terms#:#Termer +content#:#cont_tex#:#Latex-kod +content#:#cont_text_acc#:#Accent +content#:#cont_text_code#:#Programkod +content#:#cont_text_com#:#Kommentar +content#:#cont_text_editing#:#Redigera text +content#:#cont_text_emp#:#Understruken text +content#:#cont_text_fn#:#Fotnot +content#:#cont_text_iln_link#:#Intern länk +content#:#cont_text_imp#:#Viktigt +content#:#cont_text_keyword#:# nyckelord +content#:#cont_text_placeh#:#Klicka och redigera för att infoga en text +content#:#cont_text_placehl#:#Platshållare för text +content#:#cont_text_quot#:#Citat +content#:#cont_text_str#:#Starkt betonad text +content#:#cont_text_sub#:#Djupgående +content#:#cont_text_sup#:#Höjdmarkerad +content#:#cont_text_tex#:#LaTeX-kod +content#:#cont_text_xln#:#Extern länk +content#:#cont_third_and_more#:#3. eller mer +content#:#cont_time#:#Tid +content#:#cont_time_from_lms#:#ILIAS fastställer handläggningstider +content#:#cont_time_from_lms_info#:#För att förhindra ofta förekommande svårigheter med tidsregistreringen av SCORM-lärmodulen kan tidsregistreringen utföras av ILIAS själv. De strikta specifikationerna i SCORM-standarden följs här. +content#:#cont_time_limit_action#:#adlcp +content#:#cont_to_focus_beginning#:#Tillbaka till innehållet i lärandemålet +content#:#cont_to_focus_return_crs#:#Tillbaka till kursen +content#:#cont_toc#:#Innehåll +content#:#cont_toc_mode#:#Innehållsförteckning +content#:#cont_tool_faq#:#FAQ +content#:#cont_tool_media#:#Media +content#:#cont_top#:#Topp +content#:#cont_topic#:#Topic +content#:#cont_total_time#:#Total tid +content#:#cont_tracking_bysco#:#Efter kapitel +content#:#cont_tracking_byuser#:#Av användare +content#:#cont_tracking_data#:#Protokolluppgifter +content#:#cont_tracking_items#:#Innehåll i protokoll +content#:#cont_tracking_modify#:#Ändra data +content#:#cont_trans_import_info#:#Om du har exporterat denna modul som "XML (basic language for translation - master)" till en annan installation, kan du återimportera de översatta exportfilerna från denna installation här. +content#:#cont_transl_master_language_not_allowed#:#För att kunna importera en översättning måste du aktivera minst ett ytterligare språk under "Inställningar " Flerspråkighet". +content#:#cont_tree_fixed#:#Strukturen för utbildningsmodulen har korrigerats. +content#:#cont_tries#:#Responsförsök +content#:#cont_tries_remaining#:#Återstående försök +content#:#cont_tries_reset_on_visit#:#Reset vid uppringning av sidan +content#:#cont_tries_reset_on_visit_info#:#Varje gång en sida med en inbäddad testfråga öppnas är det maximala antalet svarsförsök möjligt. Testfrågorna kan besvaras igen varje gång. +content#:#cont_tries_store#:#Spara svarsförsök +content#:#cont_tries_store_info#:#Antalet försök till svar registreras och sparas. Korrekt besvarade frågor kan inte längre besvaras. När det maximala antalet försök har uppnåtts är det inte längre möjligt att göra ytterligare ett försök att svara. +content#:#cont_trigger_area#:#Range för utlösare +content#:#cont_type#:#Typ +content#:#cont_type_not_allowed#:#Detta element är inte tillåtet vid denna tidpunkt +content#:#cont_unlock_allow_continue#:#Lås upp / tillåt att fortsätta +content#:#cont_unlocked#:#Upplåst +content#:#cont_update_amd_page_list#:#Redigera sidlista +content#:#cont_update_blog#:#Redigera blogginlägg +content#:#cont_update_consultation_hours#:#Redigera konsultationstimmar +content#:#cont_update_login_page#:#Uppdatera element på inloggningssidan +content#:#cont_update_map#:#Redigera karta +content#:#cont_update_my_courses#:#Redigera mina kurser +content#:#cont_update_profile#:#Redigera publicerade data +content#:#cont_update_resources#:#Uppdatera materiallistan +content#:#cont_update_section#:#Redigera block +content#:#cont_update_skills#:#Redigera kompetens +content#:#cont_update_verification#:#Redigera certifikat +content#:#cont_upload_dir#:#Ladda upp katalog +content#:#cont_upload_dir_info#:#Server-katalog från vilken stora SCORM- och HTML-paket kan kopieras istället för att laddas upp direkt. Endast ILIAS-administratörer kommer att se ett urval av filer från denna katalog. Ange en fullständig serversökväg utan snedstreck i slutet. +content#:#cont_upload_file#:#Ladda upp fil +content#:#cont_upload_multi_srt_howto#:#Tillåter uppladdning av flera undertextfiler (.srt) i en .zip-fil för alla mediaobjekt. .zip-filen / .zip-arkivet får inte innehålla några underkataloger. Alla .srt-filer måste vara på toppnivå för att kunna identifieras. Filnamnen måste avslutas med "_& +content#:#cont_uploaded_file#:# Befintlig fil +content#:#cont_url_info#:#URL för en mediefil eller Youtube-URL. +content#:#cont_usage#:#Använda +content#:#cont_use_same_resource_as_above#:#Använd ovanstående fil +content#:#cont_user#:#Användare +content#:#cont_user_blocked#:#Blockerade användare utan ytterligare svarsförsök i inlärningsmodulen "%s". +content#:#cont_user_blocked2#:#En användare har överskridit det maximala antalet försök att besvara en fråga i utbildningsmodulen. Denna användare kan endast komma åt ytterligare sidor om du låser upp användaren. +content#:#cont_user_blocked3#:#Öppna lärmodulen i redigeringsläge och gå till följande vy +content#:#cont_user_search_did_not_match#:#Ingen användare hittades. +content#:#cont_users_answered#:#Svar från användare +content#:#cont_users_have_mob_in_clip1#:#Detta mediaobjekt finns på klippbordet för +content#:#cont_users_have_mob_in_clip2#:#Användare. +content#:#cont_validate_file#:#Validera fil +content#:#cont_verification_object#:#Certifikat +content#:#cont_verification_placeh#:#Klicka och redigera för att infoga ett certifikat +content#:#cont_verification_placehl#:#Certifikat platshållare +content#:#cont_version#:#Version +content#:#cont_versions#:#Versioner +content#:#cont_whole_glossary#:#Övergripande ordlista +content#:#cont_width#:#Bredd +content#:#cont_width_height_info#:#Storleken på displayen kan specificeras. I praktiken har en bredd på 950 pixlar och en höjd på 650 pixlar visat sig vara användbar. Om ingen specifikation görs bestämmer webbläsaren fönsterstorleken. +content#:#cont_wiki_link_dialog#:#Wiki-sida (dialog) +content#:#cont_wiki_page#:#Wiki-sida +content#:#cont_wiki_page_link#:#Länk till Wiki-sida +content#:#cont_wrong_answers#:#Antal fel +content#:#cont_wrong_answers_single#:#Felval. +content#:#cont_xml_base#:#xml +content#:#cont_zip_file_invalid#:#Filen är inte en giltig importfil.
Den innehåller inte en fil '%s'. +content#:#content_no_edit_lock#:#Sidan redigeras för närvarande av en annan användare. +content#:#content_page_history#:#Framsteg på sidan +content#:#content_plugin_not_activated#:#Insticksprogrammet för sidinnehåll är inte aktiverat för tillfället. +content#:#content_some_export_ids_multiple_times#:#Vissa export-ID:n används mer än en gång. Detta kan leda till att sidor saknas i exporten. +content#:#content_until#:#Redigering låst för andra användare tills +content#:#copied_to_clipboard#:#Objekt som kopierats till urklipp. +content#:#dgl_pagebreak#:#Sidbrytning +content#:#glo_add_new_term#:#Lägg till ny term +content#:#glo_content_settings#:#Innehållets sammansättning +content#:#glo_definition_abbr#:#Def. +content#:#glo_editing_view#:#Redigera vy +content#:#glo_full_definitions#:#Lista +content#:#glo_full_definitions_info#:#Alla termer och definitioner visas fullständigt under varandra. +content#:#glo_hide_taxonomy#:# Dölj taxonomi +content#:#glo_list_usages#:#Använda +content#:#glo_mode_level_info#:#Endast termer från ordlistor som är på samma nivå i tidningen infogas. +content#:#glo_mode_normal_info#:#Gloslistan innehåller alla termer som är aktivt införda. +content#:#glo_mode_subtree_info#:#Termer från ordlistor på underordnade tidskriftsnivåer infogas också. +content#:#glo_online_info#:#Endast när ordlistan är online kan användarna se och använda ordlistan. +content#:#glo_presentation_mode#:#Visa +content#:#glo_presentation_view#:#Presentation vy +content#:#glo_quick_navigation#:#Snabb åtkomst +content#:#glo_show_taxonomy#:#Taxonomi +content#:#glo_show_taxonomy_info#:#Taxonomin erbjuds i presentationsvyn för filtrering av ordlistans termer. Den kan skapas i underfliken "Taxonomi". +content#:#glo_style#:#glossar stil +content#:#glo_table_form#:#Tabell +content#:#glo_table_form_info#:#Termer och förkortade definitioner visas i en översiktstabell. Om du klickar på en term visas den med den fullständiga definitionen. +content#:#glo_term_is_used_n_times#:#Termen används %s gånger. +content#:#glo_term_must_belong_to_glo#:#Åtgärden kan endast utföras för termer som har definierats i denna ordlista. +content#:#glo_term_used_in#:#Följande resurser hänvisar till denna term +content#:#glo_text_snippet_length#:#Förkorta efter +content#:#glo_text_snippet_length_info#:#Antal tecken efter vilka definitioner i översiktstabellen trunkeras. +content#:#glo_usages#:#Glossary används i... +content#:#glo_used_in_scorm#:#Gloslistan används av SCORM-modulen. Om ordlistan raderas kan länkar till ordlistan inte längre lösas. +content#:#help_assign_help_ids#:#Tilldelning av skärm-ID:n till kapitel +content#:#htlm_import#:#Importera HTML-lärmodul +content#:#import_sco_object#:#Import SCO +content#:#info_stop_offline_mode_sure#:#Attention +content#:#lm_activate_rating#:#Tillåt klassificering av sidorna +content#:#lm_editing_view#:#Redigera vy +content#:#lm_import#:#Import ILIAS utbildningsmodul +content#:#lm_menu_edit_entry#:#Redigera menyalternativ +content#:#lm_menu_entry_target#:#Mål +content#:#lm_menu_entry_title#:#Titel +content#:#lm_menu_new_entry#:#Skapa nytt menyalternativ +content#:#lm_menu_select_internal_object#:#Välj internt objekt >> +content#:#lm_menu_select_object_to_add#:#Klicka på det objekt du vill lägga till i menyn +content#:#lm_no_download_files#:#Det finns för närvarande inga nedladdningsfiler tillgängliga. +content#:#lm_only_one_download_per_type#:#Endast en fil per typ (XML och HTML) får offentliggöras. +content#:#lm_rate_page#:#Utvärdera sidan +content#:#lm_rating#:#Utvärdera utbildningsmodulen +content#:#mep_folder_created#:#Folder har skapats. +content#:#mob_upload_dir#:#Ladda upp katalog +content#:#mob_upload_dir_info#:#Server-katalog från vilken flera filer kan läggas till i en mediapool samtidigt. Endast ILIAS-administratörer kan se filerna i den här katalogen. Ange en fullständig sökväg utan efterföljande snedstreck. +content#:#msg_entry_added#:#Menypost sparad +content#:#msg_entry_removed#:#Menypunkt borttagen +content#:#msg_entry_updated#:#Menyposten uppdaterad +content#:#msg_no_page_access#:#Du har inte behörighet att komma åt denna sida. +content#:#msg_page_no_public_access#:#Den här sidan är inte tillgänglig för allmänheten. Logga in på ILIAS först för att få tillgång till denna sida. +content#:#msg_page_not_public#:#Sidan är inte offentlig +content#:#offline_mode_manager#:#Offline-användning +content#:#offline_mode_users#:#Användare i offline-läge +content#:#offline_mode_users_info#:#Användare kan manuellt tas bort från offline-läget och sedan använda lärmodulen online igen. Detta är meningsfullt om till exempel den bärbara datorn med inlärningsmodulerna har stulits. +content#:#page_does_not_exist#:#Den här sidan finns tyvärr inte (längre). +content#:#par#:#Text +content#:#pg#:#Sida +content#:#public_section#:#Offentligt område +content#:#sahs_empty_objectives_are_not_allowed#:#Ange ett inlärningsmål. +content#:#sahs_insert_pg_from_clip#:#Importera sidor från ILIAS utbildningsmodul +content#:#sahs_insert_st_from_clip#:#Importera kapitel från ILIAS utbildningsmodul +content#:#sahs_insert_st_from_clip_inside_chap#:#Importera kapitel från ILIAS lärmodul (inom ett kapitel) +content#:#save_new#:#Spara och nytt stycke +content#:#saved_media_object#:#Mediaobjekt sparat +content#:#scplayer_collapsetree#:#Kollapsande träd +content#:#scplayer_continue#:#Fortsättning +content#:#scplayer_debugger#:#Visa testverktyg +content#:#scplayer_exit#:#Stäng +content#:#scplayer_exitall#:#Avsluta redigering +content#:#scplayer_expandtree#:#Expandera träd +content#:#scplayer_hidetree#:#Göm träd +content#:#scplayer_next#:#Före +content#:#scplayer_phpmysqlcheck#:#Du behöver JSON-stöd för att använda JavaScript RTE. +content#:#scplayer_previous#:#Tillbaka +content#:#scplayer_showtree#:#Display träd +content#:#scplayer_start#:#Start +content#:#scplayer_suspendall#:#Avbryt redigering +content#:#selectFooter#:#Välj som sidfot +content#:#selectHeader#:#Välj som rubrik +content#:#select_a_file#:#Välj en fil. +content#:#selected_pages_only#:#Endast för de sidor som valts nedan +content#:#seq_close#:#Stäng fönstret för SCORM-inlärningsmodulen. +content#:#seq_endsession#:#Den aktuella kurssessionen har avslutats. +content#:#seq_error#:#Ett internt undantagsfel har uppstått i sekvenseraren. +content#:#seq_toc#:#Välj en lektion från översikten till vänster. +content#:#set_public_mode#:#Ställa in åtkomstläge +content#:#st#:#Kapitel +content#:#stop_user_offline_mode#:#Avsluta offline-läge +content#:#stop_user_offline_mode_for_user#:#Avsluta offline-läge för +content#:#text_repr#:#Alternativ text +content#:#text_repr_info#:#Används när grafiken inte kan visas. +copa#:#copa_activation_online_info#:#Endast när innehållssidan är online kan användare komma åt innehållssidan. Om inte, är innehållssidan endast tillgänglig för administratörer. +copa#:#copa_add#:#Skapa innehållssida +copa#:#copa_btn_lp_toggle_state_completed#:#Set till "Ej redigerad +copa#:#copa_btn_lp_toggle_state_not_completed#:#Set till "Redigerad +copa#:#copa_copy#:#Kopiera innehållssida +copa#:#copa_edit#:#Inställningar för innehållssida +copa#:#copa_import#:#Importera innehållssida +copa#:#copa_new#:#Skapa ny innehållssida +copa#:#copa_page_type_copa#:#Innehållssida +copa#:#copa_prop_reading_time#:#Tid för läsning +copa#:#copa_value_reading_time_f_p#:#%s minuter +copa#:#copa_value_reading_time_f_s#:#%s minut +copa#:#obj_copa_duplicate#:#Sidor med duplicerat innehåll +copg#:#copg_allow_html#:#Tillåt HTML/Javascript +copg#:#copg_allow_html_info#:#Användare kan använda HTML eller Javascript i sidinnehåll. Detta kan leda till säkerhetsproblem. Du bör endast aktivera denna funktion för komponenter som används av betrodda användare. Möjligheten att inkludera HTML på detta sätt kan komma att tas bort +copg#:#copg_an_error_occured#:#Tyvärr har ett problem uppstått. +copg#:#copg_confirm_el_deletion#:#Vill du verkligen ta bort de markerade objekten? +copg#:#copg_cron_days#:#Radera poster som är äldre än x +copg#:#copg_cron_days_info#:#Raderar poster från historiken som är äldre än den angivna perioden. +copg#:#copg_cron_keep_entries#:#Minsta antal bidrag +copg#:#copg_cron_keep_entries_info#:#Detta antal poster sparas i historiken, även om de är äldre än den angivna perioden. +copg#:#copg_days#:#dagar +copg#:#copg_details#:#Detaljer +copg#:#copg_entries#:#Inträden +copg#:#copg_error#:#Problem +copg#:#copg_error_occured_modal#:#Tyvärr, ett fel har uppstått. Tryck på "Ladda om sidan" för att återgå till det senast sparade innehållet. +copg#:#copg_est_reading_time#:#Uppskattad lästid +copg#:#copg_history_cleanup_cron#:#Page Editor Historik rensning +copg#:#copg_history_cleanup_cron_info#:# Raderar äldre poster från sidredigerarens historik. +copg#:#copg_page_element_not_found#:# Okänt sidelement. +copg#:#copg_page_type_stys#:#Sidans layout +copg#:#copg_questions_not_supported_here#:#Inga frågor stöds i detta sammanhang. +copg#:#copg_reload_page#:#Reload sida +copg#:#copg_sec_link_info#:#Välj en destination för länkning av blocket. Uppmärksamhet +copg#:#copg_snippet_cannot_be_edited#:#Detta är en fördefinierad innehållsmodul som inte kan redigeras just nu. +copg#:#copg_x_minutes#:#%s minut(er) +cpad#:#cpad_reading_time_status#:#Tid för läsning +cpad#:#cpad_reading_time_status_desc#:#Om den är aktiverad beräknas och visas den uppskattade lästiden för innehållssidor. +cptch#:#cptch_freetype_support_needed#:#För att använda denna funktion behöver du freetype-stödet för PHP. +cptch#:#cptch_wrong_input#:#Felaktig inmatning +cron#:#cro_job_rc_job_auto_deactivation_time_limit#:#Cronjobbet avaktiverades eftersom det var inaktivt i mer än 3 timmar. +cron#:#cro_job_rc_job_manual_reset#:#Cronjobbet har återaktiverats av en administratör +cron#:#cro_job_rc_job_no_result#:#Inget rent resultat överfördes av cron-jobbet +cron#:#cron_action_activate#:#Aktivera +cron#:#cron_action_activate_success#:#Cron-jobbet aktiverat. +cron#:#cron_action_activate_sure#:#Vill du verkligen aktivera cron-jobbet "%s"? +cron#:#cron_action_activate_sure_multi#:#Vill du verkligen aktivera följande cron-jobb? +cron#:#cron_action_deactivate#:#Avaktivera +cron#:#cron_action_deactivate_success#:#Cron-jobbet avaktiverat. +cron#:#cron_action_deactivate_sure#:#Vill du verkligen avaktivera cron-jobbet "%s"? +cron#:#cron_action_deactivate_sure_multi#:#Vill du verkligen inaktivera följande cron-jobb? +cron#:#cron_action_edit#:#Redigera +cron#:#cron_action_edit_success#:#Tidtabellen uppdaterad. +cron#:#cron_action_reset#:#Återställ +cron#:#cron_action_reset_success#:#Återställning av kronjobb. +cron#:#cron_action_reset_sure#:#Vill du verkligen återställa cron-jobbet "%s"? +cron#:#cron_action_reset_sure_multi#:#Vill du verkligen återställa följande cron-jobb? +cron#:#cron_action_run#:#Utför +cron#:#cron_action_run_fail#:#Exekveringen misslyckades. +cron#:#cron_action_run_success#:#Cron-jobbet har utförts framgångsrikt. +cron#:#cron_action_run_sure#:#Vill du verkligen köra cron-jobbet "%s"? +cron#:#cron_changed_by_crontab#:#SYSTEM +cron#:#cron_component#:#Komponent +cron#:#cron_job_id#:#Id +cron#:#cron_last_run#:#Sista körningen +cron#:#cron_no_executable_job_selected#:#Välj minst ett körbart cron-jobb. +cron#:#cron_result#:#Resultat +cron#:#cron_result_info#:#Info om resultat +cron#:#cron_result_status_crashed#:#Avbryt +cron#:#cron_result_status_fail#:#Fel +cron#:#cron_result_status_invalid_configuration#:# Ogiltig konfiguration +cron#:#cron_result_status_no_action#:#Okej, ingen redigering +cron#:#cron_result_status_ok#:#Ok +cron#:#cron_result_status_reset#:#Återställ +cron#:#cron_running_since#:#Running sedan +cron#:#cron_schedule#:#Tidtabell +cron#:#cron_schedule_daily#:#Dagligen +cron#:#cron_schedule_in_days#:#Alla %s dagar +cron#:#cron_schedule_in_hours#:#Alla %s timmar +cron#:#cron_schedule_in_minutes#:#Alla %s minuter +cron#:#cron_schedule_monthly#:#Månadsvis +cron#:#cron_schedule_quarterly#:#Kvartalsvis +cron#:#cron_schedule_type#:#Tidtabell +cron#:#cron_schedule_value#:#Intervall +cron#:#cron_schedule_weekly#:#Veckovis +cron#:#cron_schedule_yearly#:#Årlig +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#:#Tidsperioden för 'Availability' är inte giltig. +crs#:#assigned#:#Tilldelad +crs#:#contact_email_not_valid#:#E-postadressen är inte giltig. +crs#:#crs_accept_subscriber#:#Inspelning i kursen "%s" +crs#:#crs_accept_subscriber_body#:#Du har blivit inkluderad i kursen "%s". +crs#:#crs_access#:#Tillgång +crs#:#crs_activate_notification#:# Aktivera avisering +crs#:#crs_activation#:#Aktivering +crs#:#crs_activation_limited_visibility_info#:#Utanför den angivna perioden visas kurstiteln men inte innehållet. +crs#:#crs_activation_online_info#:#Endast när kursen är online kan användare gå med i kursen och kursmedlemmar komma åt kursen. Om inte, är kursen endast tillgänglig för administratörer och roller med rättigheten "Redigera inställningar". +crs#:#crs_add_archive_html#:#Lägg till HTML-arkiv +crs#:#crs_add_archive_xml#:#Lägg till ML-arkiv +crs#:#crs_add_grouping#:#Ny begränsning av medlemskap +crs#:#crs_add_html_archive#:#Lägg till HTML-arkiv +crs#:#crs_add_objective#:#Lägg till nytt inlärningsmål +crs#:#crs_add_remove_from_desktop#:#Lägg till i favoriter +crs#:#crs_add_remove_from_desktop_info#:#Objekt inom kursen kan läggas till i favoriter. +crs#:#crs_add_starter#:#Lägg till startobjekt +crs#:#crs_add_to_group#:#Lägg till i grupp +crs#:#crs_added#:#En ny kurs har lagts till +crs#:#crs_added_member#:#Inspelning i kursen "%s" +crs#:#crs_added_member_body#:#Du har blivit inkluderad i kursen "%s". +crs#:#crs_added_new_archive#:#Ett nytt arkiv har skapats. +crs#:#crs_added_objective#:#Ett nytt inlärningsmål har lagts till. +crs#:#crs_added_starters#:#De valda objekten har tilldelats. +crs#:#crs_added_to_list#:#Du har lagts till på väntelistan.
Du har plats %s på väntelistan. +crs#:#crs_admin#:#Administratör +crs#:#crs_administrators#:#Administratörer +crs#:#crs_admission_link_failure_availability#:#Ingen sammankoppling möjlig. Kursen är online. +crs#:#crs_admission_link_failure_invalid_code#:#Ingen sammankoppling möjlig. Länken är inte giltig. +crs#:#crs_admission_link_failure_membership_limited#:#Ingen anslutning möjlig. Antalet medlemmar i gruppen är begränsat. +crs#:#crs_admission_link_failure_offline#:#Ingen sammankoppling möjlig. Kursen är offline. +crs#:#crs_admission_link_failure_registration_period#:#Ingen anslutning möjlig. Registrering för kursen är utanför anslutningsperioden. +crs#:#crs_admission_link_success_registration#:#Successfully joined the course "%s". +crs#:#crs_agree#:#Acceptance +crs#:#crs_agreement_header#:#Användningsavtal +crs#:#crs_agreement_required#:#Du kan bara gå med i den här kursen om du godkänner användaravtalet. +crs#:#crs_at_least_one_admin#:#Minst en administratör måste vara tilldelad den här kursen. +crs#:#crs_auto_notification#:#Välkomstmail för nya medlemmar +crs#:#crs_auto_notification_info#:#E-postmeddelanden skickas automatiskt till de medlemmar som har antagits till kursen av en handledare eller administratör. +crs#:#crs_awrn_current_course#:#Aktuell kurs +crs#:#crs_awrn_current_course_info#:#Inom en kurs listas alla medlemmar i kursen. +crs#:#crs_awrn_support_contacts#:#Kurstillsyn +crs#:#crs_awrn_support_contacts_info#:#Användare som övervakar kursen listas. Respektive användare anges på fliken Medlemmar i kursen för kursövervakning. +crs#:#crs_blocked#:#Åtkomst blockerad +crs#:#crs_blocked_member#:#Status i kursen "%s +crs#:#crs_blocked_member_body#:#Ditt medlemskap i kursen "%s" har upphävts. +crs#:#crs_breadcrumb_crs_only#:#Breadcrumb Trail börjar med kurs +crs#:#crs_breadcrumb_full_path#:#Visa hela sökvägen +crs#:#crs_cancel_subscr_request#:#Tillbakadragande av ansökan om antagning +crs#:#crs_cancel_subscription#:#Avsluta från kursen "%s" +crs#:#crs_cancel_subscription_body#:#Deltagaren %s har lämnat kursen "%s". +crs#:#crs_cancel_subscription_body2#:#Det kan finnas deltagare på väntelistan för denna kurs. För att se listan över deltagare, vänligen gå till följande länk +crs#:#crs_cancellation_end#:#Senaste kursutgång +crs#:#crs_cancellation_end_info#:#Medlemmar kan endast avsluta sitt kursmedlemskap självständigt fram till det angivna datumet. +crs#:#crs_cancellation_end_rbac_info#:#Slutdatumet för avbokningen uppnåddes den %s. Det är nu inte längre möjligt att dra sig ur kursen. +crs#:#crs_cannot_find_role#:#Rollen kunde inte hittas. +crs#:#crs_cdf_edit_member#:#Redigera personliga uppgifter för denna kurs +crs#:#crs_cdf_tbl_last_edit#:#Uppdaterad (kursspecifika data) +crs#:#crs_checklist_objective#:#Checklista Inlärningsmål +crs#:#crs_contact#:#Kontakt +crs#:#crs_contact_consultation#:#Samråd +crs#:#crs_contact_email#:#E-post +crs#:#crs_contact_email_info#:#Du kan ange en eller flera (kommaseparerade) e-postadresser. +crs#:#crs_contact_name#:#Namn +crs#:#crs_contact_phone#:#Telefon +crs#:#crs_contact_responsibility#:#Kompetens +crs#:#crs_content#:#Kursinnehåll +crs#:#crs_copy#:#Kopiera kurs +crs#:#crs_course_group_notification_link#:#Länk +crs#:#crs_course_period_not_valid#:#Perioden är inte giltig. +crs#:#crs_course_status_of_users#:#Att klara kursen +crs#:#crs_create_date#:#Datum för skapande +crs#:#crs_custom_user_fields#:#Personuppgifter +crs#:#crs_dates#:#Datum +crs#:#crs_deactivate_notification#:#Avaktivera avisering +crs#:#crs_delete_objectve_sure#:#Är du säker på att de utvalda lärandemålen ska tas bort? +crs#:#crs_details#:#Detaljer om kursen +crs#:#crs_dismiss_member#:#Medlemskap i kursen "%s" avslutat +crs#:#crs_dismiss_member_body#:#Ditt medlemskap i kursen "%s" har avslutats. +crs#:#crs_edit_lo_introduction#:#Redigera introduktion +crs#:#crs_edit_timings#:#Redigera tidtagningar +crs#:#crs_enable_map#:#Aktivera kurskort +crs#:#crs_end#:#Slut +crs#:#crs_export#:#Kursexport +crs#:#crs_file#:#Fil +crs#:#crs_file_download#:#Filer för nedladdning +crs#:#crs_file_name#:#Filenamn +crs#:#crs_file_size_info#:#Filens storlek +crs#:#crs_from#:#Från +crs#:#crs_general_info#:#Allmän information +crs#:#crs_general_informations#:#Allmän information +crs#:#crs_grouping_delete_sure#:#Är du säker på att du vill ta bort följande medlemsbegränsningar? +crs#:#crs_grouping_deleted#:#Grupperingen har tagits bort. +crs#:#crs_grouping_select_one#:#Vänligen välj en medlemsbegränsning. +crs#:#crs_groupings#:#Kursgrupperingar +crs#:#crs_groups_nr#:#Antal grupper +crs#:#crs_grp_added_grouping#:#En ny medlemsbegränsning har skapats. +crs#:#crs_grp_already_assigned#:#Eftersom du redan är medlem i en av kurserna kan du inte gå med i en annan kurs från listan! +crs#:#crs_grp_assign_crs#:#Urvalda objekt för begränsning av medlemskap +crs#:#crs_grp_assignments#:#Tilldela kursdeltagare till grupper +crs#:#crs_grp_enter_title#:#Vänligen ange en titel. +crs#:#crs_grp_info_reg#:#Följande kurser omfattas av en medlemsbegränsning. Du kan bara delta i en av dessa kurser +crs#:#crs_grp_matriculation_required#:#Ett unikt matrikulationsnummer krävs för att inkluderas i denna kursgruppering.
Ange detta i inställningarna för den personliga profilen. +crs#:#crs_grp_no_courses_assigned#:#Ingen +crs#:#crs_grp_table_assigned_courses#:# Tilldelade kurser +crs#:#crs_header_archives#:#Kursarkiv +crs#:#crs_header_delete_members#:#Du vill avregistrera följande medlemmar från kursen? +crs#:#crs_header_edit_members#:#Redigera medlemmar +crs#:#crs_hide_all_obj#:#Dölj alla +crs#:#crs_html#:#HTML +crs#:#crs_import#:#Importkurs +crs#:#crs_important_info#:#Viktig information +crs#:#crs_info_agree#:# Jag godkänner att ovanstående data kan visas av kursadministratörer. +crs#:#crs_info_agreement#:#Om följande uppgifter är tillgängliga i din personliga profil kan de visas av kursadministrationen +crs#:#crs_info_download#:#Filer för nedladdning +crs#:#crs_info_reg#:#Förfarande för inspelning +crs#:#crs_info_reg_confirmation#:#Du måste skicka in en ansökan för att delta i kursen. Beskriv varför du vill gå med i meddelandefältet. När din ansökan har godkänts eller avslagits får du ett meddelande. +crs#:#crs_info_reg_deactivated#:#Ingen inspelning är möjlig för tillfället. +crs#:#crs_info_reg_direct#:#Du kan anmäla dig till kursen direkt. +crs#:#crs_info_reg_password#:#Om du har fått kurslösenordet från en kursadministratör kan du gå med i den här kursen. +crs#:#crs_info_settings#:#Kursinformation +crs#:#crs_info_start#:#Please edit all the materials listed below first.
När du har redigerat alla objekt kommer ytterligare kursinnehåll att låsas upp för dig. +crs#:#crs_intro_course_group_notification_for#:#Detta är en sammanfattning av meddelanden från dina kurser och grupper för vilka automatisk avisering har aktiverats. +crs#:#crs_intro_course_group_notification_index#:#Det finns meddelanden från följande kurser och grupper för perioden från %1$s till %2$s +crs#:#crs_item_presetting_info#:#Välj denna inställning för att rekommendera en redigeringstid för elever. +crs#:#crs_join_request#:#Skicka +crs#:#crs_lhist_objective_completed#:#Passed $3$ in $1$. +crs#:#crs_lim_assigned#:#Är redan medlem i kursen "%s". +crs#:#crs_link_hide_next_sessions#:#Dölj framtida sessioner +crs#:#crs_link_hide_prev_sessions#:#Dölj tidigare sessioner +crs#:#crs_link_show_all_next_sessions#:#Visa alla framtida sessioner +crs#:#crs_link_show_all_prev_sessions#:#Visa alla tidigare sessioner +crs#:#crs_lobj_pm_min_goal#:#Erforderligt värde +crs#:#crs_lobj_pm_score#:#Ditt resultat +crs#:#crs_loc_btn_new_assignment#:#Ny testuppgift +crs#:#crs_loc_confirm_delete_tst#:#Är du säker på att du vill ta bort tilldelningen av testerna till den lärandemålsorienterade kursen? +crs#:#crs_loc_delete_assignment#:#Ta bort uppdrag +crs#:#crs_loc_err_no_active_it#:#Lärandemål tillgängliga utan inträdesprov +crs#:#crs_loc_err_no_active_lo#:#Inget aktivt inlärningsmål +crs#:#crs_loc_err_no_active_mat#:#Lärandemål utan närvarande lärandeinnehåll +crs#:#crs_loc_err_no_active_qst#:#Lärandemål presenteras utan frågor +crs#:#crs_loc_err_no_active_qt#:#Lärandemål utan kvalificerande test tillgängliga +crs#:#crs_loc_err_nr_tries_exceeded#:#Antalet testkörningar per inlärningsmål överstiger antalet möjliga testkörningar av det kvalificerande provet. +crs#:#crs_loc_err_stat_no_it#:#Inget inmatningstest skapat +crs#:#crs_loc_err_stat_no_materials#:#Inget material tillgängligt +crs#:#crs_loc_err_stat_no_qt#:#Inget slutligt test har skapats +crs#:#crs_loc_err_stat_tst_offline#:#Inte alla tester är online +crs#:#crs_loc_form_assign#:#Använd befintligt test +crs#:#crs_loc_form_assign_initial_info#:#Välj ett av de test som redan finns tillgängliga i kursen som ingångstest. +crs#:#crs_loc_form_assign_it#:#Välj test +crs#:#crs_loc_form_assign_qualified_info#:#-- +crs#:#crs_loc_form_available_tsts#:#Tillgängliga tester +crs#:#crs_loc_form_create_objectives#:#Skapa inlärningsmål +crs#:#crs_loc_form_random_limits_it#:#Bestäm frågor för inträdesprovet +crs#:#crs_loc_form_random_limits_qt#:#Bestäm frågor för det kvalificerande testet +crs#:#crs_loc_form_tst_new#:#Skapa nytt test +crs#:#crs_loc_form_tst_new_initial_info#:#Från detta nyskapade test tilldelas frågorna senare till inlärningsmålen. +crs#:#crs_loc_form_tst_new_qualified_info#:#-- +crs#:#crs_loc_itest_info#:#Ingångstest +crs#:#crs_loc_itst_for_objective#:#Ange test "%1$s" +crs#:#crs_loc_learning_objective#:#Lärandemål +crs#:#crs_loc_mem_show_res#:#Visa testresultat +crs#:#crs_loc_num_qst#:#Antal frågor +crs#:#crs_loc_objective_passed_confirmation#:#Du har redan klarat inlärningsmålen. Om du startar testet igen återställs resultaten. Vill du starta testet igen? +crs#:#crs_loc_objectives_passed_confirmation#:#Du har redan klarat alla inlärningsmål. Om du startar testet igen återställs resultaten. Vill du starta testet igen? +crs#:#crs_loc_passes_info#:#Maximalt antal testkörningar +crs#:#crs_loc_passes_left#:#Resterande antal testkörningar +crs#:#crs_loc_passes_reached#:#Inga ytterligare testkörningar möjliga +crs#:#crs_loc_perc#:#Nödvändig procentandel av poäng +crs#:#crs_loc_progress_do_qualifying#:#Vänligen gör det slutliga testet för att slutföra lärandemålet. +crs#:#crs_loc_progress_do_qualifying_again#:#Vänligen redigera lärandemålet igen. +crs#:#crs_loc_progress_no_result_do_initial#:#Ta inträdesprovet +crs#:#crs_loc_progress_no_result_no_initial#:#Arbeta igenom följande material och sedan det slutliga testet. +crs#:#crs_loc_progress_objective_complete#:#Du har uppnått lärandemålet. +crs#:#crs_loc_progress_result_itest#:#Resultat inmatningstest +crs#:#crs_loc_progress_result_qtest#:#Resultat +crs#:#crs_loc_qst_resume_tst_itest#:#Inträdesprov för olika lärandemål får inte påbörjas parallellt. Du har redan påbörjat ett inträdesprov för ett lärandemål. Antingen fortsätter du med det gamla testet eller så startar du ett nytt test. +crs#:#crs_loc_qst_resume_tst_qtest#:#Kvalificeringstest för olika lärandemål får inte startas parallellt. Du har redan påbörjat ett kvalificerande test för ett lärandemål. Antingen fortsätter du med det gamla testet eller så startar du ett nytt. +crs#:#crs_loc_qtest_info#:#Slutligt test +crs#:#crs_loc_qtst_for_objective#:#Kvalificerande test "%1$s" +crs#:#crs_loc_rand_assign_qpl#:#Uppdrag från frågepoolen +crs#:#crs_loc_rand_qpl#:#Tillgängliga frågepooler +crs#:#crs_loc_settings_err_qstart#:#Alternativet "Slutprov som startobjekt" har avaktiverats, eftersom det endast kan användas för kurser utan inträdesprov. +crs#:#crs_loc_settings_it_start_object#:#Ingångstest är startobjekt +crs#:#crs_loc_settings_it_type#:#Ingångstest +crs#:#crs_loc_settings_itest_tbl#:#Inställningar för inmatningstest +crs#:#crs_loc_settings_passed_mode#:#Godkända inlärningsmål +crs#:#crs_loc_settings_passed_mode_hide#:#Testfrågor om godkända inlärningsmål är dolda. +crs#:#crs_loc_settings_passed_mode_mark#:#Testfrågor om godkända inlärningsmål är markerade. +crs#:#crs_loc_settings_qt_all#:#Slutligt test +crs#:#crs_loc_settings_qt_start_object#:#Final test är startobjekt +crs#:#crs_loc_settings_qtest_tbl#:#Inställningar för slutligt test +crs#:#crs_loc_settings_reset#:#Testresultat +crs#:#crs_loc_settings_reset_enable#:#Tillåt återställning av personliga testresultat +crs#:#crs_loc_settings_reset_enable_info#:#Kursdeltagare kan radera sina egna testresultat för att starta kursen igen. Denna inställning bör endast användas i utvecklingsfasen av kursen för att göra det lättare att kontrollera dess framsteg. +crs#:#crs_loc_settings_tbl#:#Inställningar för den målorienterade kursen +crs#:#crs_loc_settings_tbl_it_nq#:#Diagnostiska inträdesprov per lärandemål +crs#:#crs_loc_settings_tbl_it_q#:#Kvalificerande inträdesprov per inlärningsmål +crs#:#crs_loc_settings_tbl_its_nq_all#:#Diagnostiskt inträdesprov för alla lärandemål +crs#:#crs_loc_settings_tbl_its_q_all#:#Kvalificerande inmatningstest för alla inlärningsmål +crs#:#crs_loc_settings_tbl_qt#:#Slutprov per lärandemål +crs#:#crs_loc_settings_tbl_qts_all#:#Slutprov på alla lärandemål +crs#:#crs_loc_settings_type_it_none#:#Inget inträdesprov +crs#:#crs_loc_settings_type_it_none_info#:#Inget inträdesprov +crs#:#crs_loc_settings_type_it_placement_all#:#Diagnostiskt inträdesprov för alla lärandemål +crs#:#crs_loc_settings_type_it_placement_all_info#:#Diagnostiskt inträdesprov för alla lärandemål +crs#:#crs_loc_settings_type_it_placement_sel#:#Diagnostiskt inmatningstest per inlärningsmål +crs#:#crs_loc_settings_type_it_placement_sel_info#:#Diagnostiskt inmatningstest per inlärningsmål +crs#:#crs_loc_settings_type_it_qualifying_all#:#Kvalificerande inmatningstest för alla inlärningsmål +crs#:#crs_loc_settings_type_it_qualifying_all_info#:#Kvalificerande inmatningstest för alla inlärningsmål +crs#:#crs_loc_settings_type_it_qualifying_sel#:#Qualifying entry test per inlärningsmål +crs#:#crs_loc_settings_type_it_qualifying_sel_info#:#Qualifying entry test per inlärningsmål +crs#:#crs_loc_settings_type_q_all#:#Slutprov på alla lärandemål +crs#:#crs_loc_settings_type_q_all_info#:#Slutprov på alla lärandemål +crs#:#crs_loc_settings_type_q_selected#:#Slutprov per lärandemål +crs#:#crs_loc_settings_type_q_selected_info#:#Slutprov per lärandemål +crs#:#crs_loc_subtab_creation#:#Skapa +crs#:#crs_loc_suggested#:#Vänligen arbeta igenom de material som anges för att uppnå lärandemålet. +crs#:#crs_loc_tab_itest#:#Ingångstest +crs#:#crs_loc_tab_itests#:#Ingångstest +crs#:#crs_loc_tab_materials#:#Material +crs#:#crs_loc_tab_objectives#:#Lärandemål +crs#:#crs_loc_tab_qtest#:#Slutligt test +crs#:#crs_loc_tab_qtests#:#Slutliga prov +crs#:#crs_loc_tab_start#:#Starta objekt +crs#:#crs_loc_tbl_tst_qst_qpl#:#Frågor/frågepooler +crs#:#crs_loc_tbl_tst_type#:#Val av testfrågor +crs#:#crs_loc_test_results_of#:#Testresultat från +crs#:#crs_loc_tst_assignment#:#Test uppdrag +crs#:#crs_loc_tst_new_run#:#Starta nytt test +crs#:#crs_loc_tst_num_qst#:#Antal frågor +crs#:#crs_loc_tst_qpls#:#Tillgängliga frågepooler +crs#:#crs_loc_tst_resume#:#Fortsätt gammalt test +crs#:#crs_loc_tst_start#:#Starta test +crs#:#crs_loc_tt_info#:#Du har nått %1$d%%. Testet anses vara godkänt med %2$d%%. +crs#:#crs_loc_type_initial_all_info#:#Baserat på resultaten från det inledande testet rekommenderar ILIAS lärandeinnehåll för de lärandemål som ännu inte har uppnåtts. I slutet, ett kvalificerande test kontrollerar uppnåendet av alla inlärningsmål. +crs#:#crs_loc_type_qualified_info#:#Kursen börjar med ett test som kontrollerar individuellt om kursdeltagarna redan har behärskat inlärningsmålen. Om testet är godkänt behöver varken ytterligare utbildningsinnehåll eller tester bearbetas. ILIAS rekommenderar inlärningsinnehåll för alla in +crs#:#crs_mail_all#:#För alla medlemmar +crs#:#crs_mail_all_info#:#Medlemmar, administratörer och handledare kan använda funktionen "Mail till medlemmar" på fliken "Medlemmar". +crs#:#crs_mail_context_member_info#:#För kontaktuppgifter på informationssidan för en kurs +crs#:#crs_mail_context_member_title#:#Kurs +crs#:#crs_mail_context_tutor_info#:#For the participant e-postmeddelanden om medlemmen och inlärningsframsteg vyer av en kurs. +crs#:#crs_mail_context_tutor_title#:#Kurs +crs#:#crs_mail_permanent_link#:#Välj följande länk för att komma åt kursinnehållet +crs#:#crs_mail_tutors_only#:#Endast för administratörer och handledare +crs#:#crs_mail_tutors_only_info#:#Endast administratörer och handledare kan använda funktionen "Mail till medlemmar" på fliken "Medlemmar". +crs#:#crs_mail_type#:#Mail till medlemmar +crs#:#crs_map_location#:#Place på karta till kurs +crs#:#crs_map_settings#:#Karta +crs#:#crs_materials#:#Material +crs#:#crs_max_and_min_members_invalid#:#Det lägsta antalet måste vara mindre än det högsta antalet. +crs#:#crs_max_and_min_members_needed#:#Ange ett lägsta eller högsta antal - eller båda. +crs#:#crs_max_members_needed#:#Ett maximalt antal medlemmar krävs för väntelistan. +crs#:#crs_max_members_reached#:#Det maximala antalet medlemmar har överskridits +crs#:#crs_mem_contact#:#Stöd för undervisning +crs#:#crs_mem_contacts#:#Stöd för undervisning +crs#:#crs_mem_send_mail#:#Skicka e-post +crs#:#crs_mem_tbl_header#:#Kursdeltagare +crs#:#crs_member#:#Medlem +crs#:#crs_member_administration#:#Deltagarstyrning +crs#:#crs_member_passed_status_changed#:#Uppdatera status +crs#:#crs_members#:#Medlemmar +crs#:#crs_members_deleted#:#De utvalda medlemmarna har avregistrerats från kursen. +crs#:#crs_members_groups#:#Gruppmedlemskap +crs#:#crs_members_map#:#Card kursdeltagare +crs#:#crs_members_print_title#:#Kursdeltagare +crs#:#crs_min_one_admin#:#Minst en administratör måste vara kvar på den här kursen. +crs#:#crs_my_courses_groups_enabled#:#Mina kurser och grupper +crs#:#crs_my_courses_groups_enabled_info#:#Om du aktiverar det här alternativet visas alternativet "Mina kurser och grupper" i tidningen. +crs#:#crs_new_status#:#Din status +crs#:#crs_new_subscription#:#Bli medlem i kursen "%s" +crs#:#crs_new_subscription_body#:#%1$s har gått med i kursen %2$s. +crs#:#crs_new_subscription_request#:#Ansökan om antagning till kursen "%s +crs#:#crs_new_subscription_request_body#:#%1$s har skickat in en ansökan om antagning till kursen "%2$s". +crs#:#crs_new_subscription_request_body2#:#För att godkänna användaren till kursen eller avvisa begäran måste du ringa upp kursens medlemsadministration. För att göra detta, vänligen välj följande länk +crs#:#crs_news#:#Mail till kursen +crs#:#crs_no_archive_selected#:#Du har inte valt ett arkiv +crs#:#crs_no_archives_selected#:#Du har inte valt ett arkiv +crs#:#crs_no_notify#:#Ingen anmälan för anslutningar +crs#:#crs_no_objective_lms_found#:#Den här kursen innehåller inget innehåll som kan kopplas till lärandemålet. +crs#:#crs_no_objective_selected#:#Välj minst ett inlärningsmål. +crs#:#crs_no_objectives_created#:#Inga inlärningsmål har skapats +crs#:#crs_no_subscribers_selected#:#Du har inte valt några användare +crs#:#crs_no_users_added#:#Inga användare har lagts till +crs#:#crs_no_users_selected#:#Du har inte valt någon användare +crs#:#crs_not_available#:#-Inte specificerat- +crs#:#crs_notification#:#Notifieringar +crs#:#crs_notification_activated#:#Notifiering aktiverad +crs#:#crs_notification_deactivated#:#Notifiering avaktiverad +crs#:#crs_notification_explanation_admin#:#Du får det här mailet eftersom aviseringar är aktiverade för dig som kursansvarig. +crs#:#crs_notification_list_title#:#Notifiering +crs#:#crs_notification_salutation#:#Kära kursdeltagare, +crs#:#crs_notify#:#Notifiering av anslutningar +crs#:#crs_nr#:#Nej. +crs#:#crs_number_users_added#:#Följande antal användare har lagts till på kursen +crs#:#crs_obj_final_req_info#:#Ange den procentandel poäng över vilken lärandemålet har uppnåtts. +crs#:#crs_obj_initial_req_info#:#Kursdeltagare som har uppnått denna procentandel poäng kommer inte att rekommenderas kursmaterial för vidare arbete. +crs#:#crs_obj_required_points#:#Score krävs +crs#:#crs_objective_accomplished#:#Gjort +crs#:#crs_objective_action_itest#:#Bestäm frågor för inträdesprovet +crs#:#crs_objective_action_materials#:#Tilldela utbildningsinnehåll +crs#:#crs_objective_action_qtest#:#Bestämma frågor för det slutliga testet +crs#:#crs_objective_action_qtest_sep#:#Dela ut slutprov +crs#:#crs_objective_add_mat#:#Lämna ut material +crs#:#crs_objective_all_points#:#Achievable poäng +crs#:#crs_objective_assigned_materials#:#Tilldelat innehåll för lärande +crs#:#crs_objective_err_limit#:#Ange endast procenttal mellan 1 och 100. +crs#:#crs_objective_final_test#:#Frågor slutprov +crs#:#crs_objective_limit_err#:#Den poäng som krävs får inte överstiga den totala poängen. +crs#:#crs_objective_modified#:#Ändringarna har antagits. +crs#:#crs_objective_not_accomplished#:#Inte uppfyllt +crs#:#crs_objective_overview_objectives#:#Allmän översikt +crs#:#crs_objective_overview_question_assignment#:#Oversiktsfråga uppdrag +crs#:#crs_objective_points#:#Punkt(er) +crs#:#crs_objective_pretest#:#Efter inträdesprov +crs#:#crs_objective_qst_summary#:#Frågeformulär +crs#:#crs_objective_random_warn#:#Ett slumpmässigt arrangemang av frågor är inställt för detta test, därför kan det inte användas för inlärningsmål. +crs#:#crs_objective_result#:#Efter slutprov +crs#:#crs_objective_result_details#:#?? Visa resultat +crs#:#crs_objective_result_summary_initial#:#Ingångstest +crs#:#crs_objective_result_summary_qualifying#:#Slutligt test +crs#:#crs_objective_saved_sorting#:#Beställningen har sparats. +crs#:#crs_objective_self_assessment#:#Frågor inmatningstest +crs#:#crs_objective_status#:#Lärandets målstatus +crs#:#crs_objective_status_configure#:#Kontrollista Kurs +crs#:#crs_objective_status_itest#:#Konfigurera inmatningstest +crs#:#crs_objective_status_materials#:#Lägg till utbildningsinnehåll +crs#:#crs_objective_status_materials_info#:#Kursen har för närvarande inget innehåll. Lägg till innehåll som kan kopplas till lärandemål. +crs#:#crs_objective_status_objective_creation#:#Lägg till inlärningsmål +crs#:#crs_objective_status_objectives#:#Konfigurera inlärningsmål +crs#:#crs_objective_status_qtest#:#Konfigurera slutligt test +crs#:#crs_objective_status_settings#:#Gör kursinställningar +crs#:#crs_objective_tbl_col_final_tsts#:#Slutliga prov +crs#:#crs_objective_wiz_final#:#Bestämma frågor för det slutliga testet +crs#:#crs_objective_wiz_final_info#:#Ställ nu in frågorna för det slutliga testet för att kontrollera att lärandemålet har uppnåtts. +crs#:#crs_objective_wiz_final_limit#:#Sätta gränserna för det slutliga testet +crs#:#crs_objective_wiz_final_limit_info#:#Ange nu det antal poäng som en student behöver för att klara lärandemålet. +crs#:#crs_objective_wiz_materials#:#Tilldela utbildningsinnehåll +crs#:#crs_objective_wiz_materials_info#:#Här bestämmer du vilket innehåll som rekommenderas för att arbeta med lärandemålet. +crs#:#crs_objective_wiz_self#:#Bestäm frågor för inträdesprovet +crs#:#crs_objective_wiz_self_info#:#Nu ställer du in frågorna för inträdesprovet. Inträdesprovet syftar till att kontrollera om och vilka förkunskaper kursdeltagarna har. +crs#:#crs_objective_wiz_self_limit#:#Sätta gränserna för inträdesprovet +crs#:#crs_objective_wiz_self_limit_info#:#Ange det antal poäng över vilket inget ytterligare utbildningsinnehåll rekommenderas för bearbetning. +crs#:#crs_objective_wiz_title#:#Beskriv inlärningsmål +crs#:#crs_objective_wiz_title_info#:#Ange en titel och en kort beskrivning av lärandemålet. +crs#:#crs_objectives#:#Lärandemål +crs#:#crs_objectives_assigned_lm#:#De valda materialen har tilldelats. +crs#:#crs_objectives_deleted#:#Lärandemålen har tagits bort. +crs#:#crs_objectives_edit_question_assignments#:#Redigera frågeställning +crs#:#crs_objectives_reset_sure#:#Är du säker på att du vill återställa alla resultat från den här kursen?
Alla framsteg och testresultat kommer att raderas oåterkalleligt. +crs#:#crs_objectives_reseted#:#Alla resultat har återställts. +crs#:#crs_open#:#Öppen kurs +crs#:#crs_other_resources#:#Annat kursmaterial +crs#:#crs_page_type_lobj#:#Learning Mål Introduktion +crs#:#crs_passed#:#Bekräftad +crs#:#crs_passed_status_manual_by#:#Manuellt genom +crs#:#crs_passed_status_system#:#System +crs#:#crs_password_not_valid#:#Lösenordet är inte korrekt +crs#:#crs_password_required#:#Ett lösenord krävs för denna typ av registrering. +crs#:#crs_pdf#:#PDF +crs#:#crs_period#:#Händelseperiod +crs#:#crs_period_end_mail_placeholder#:#Slut på evenemanget +crs#:#crs_period_info#:#Information om start och slut för det evenemang som kursen är avsedd att stödja. +crs#:#crs_period_start_mail_placeholder#:#Start av evenemanget +crs#:#crs_presentation_type#:#Visa +crs#:#crs_print_list#:#Skapa lista +crs#:#crs_ref_delete_confirmation_info#:#Vill du ta bort följande medlemmar från den här kursen? Om dessa medlemmar också ska tas bort från de länkade kurser som ingår i kursen, aktiverar du motsvarande kryssrutor. +crs#:#crs_ref_member_update#:#Lägg till nya medlemmar +crs#:#crs_ref_member_update_info#:#Alla nya medlemmar i den överordnade kursen registreras automatiskt i den kurs som denna kurslänk hänvisar till. +crs#:#crs_ref_missing_access#:#Alternativet kan inte väljas eftersom du inte har behörigheten "Hantera medlemmar" för båda kurserna. +crs#:#crs_ref_missing_parent_crs#:#Alternativet kan inte väljas eftersom den här kurslänken inte har någon överordnad kurs. +crs#:#crs_reg#:#Self entry av användaren +crs#:#crs_reg_code#:#Anmäl dig via länk +crs#:#crs_reg_code_enabled_info#:#Beroende på det valda anslutningsförfarandet och kursrättigheterna möjliggör detta alternativ direkt anslutning genom att ringa upp en länk. +crs#:#crs_reg_code_link#:#Länk för direkt anslutning +crs#:#crs_reg_max_info#:#När det maximala antalet medlemmar har uppnåtts är det inte längre möjligt att ansluta sig självständigt. +crs#:#crs_reg_no_selfreg#:#Ingen oberoende accession +crs#:#crs_reg_password_info#:#Användare måste ange detta lösenord för att gå med i kursen. +crs#:#crs_reg_subject#:#Meddelande +crs#:#crs_reg_until#:#Tidsperiod för anslutningar +crs#:#crs_reg_user_already_subscribed#:#Du har redan skickat in en ansökan om antagning! Vänligen vänta på bekräftelsen. +crs#:#crs_registration#:#Gå med i kursen +crs#:#crs_registration_confirmation_info#:#Anmäl dig först när du fått bekräftelse från en kursadministratör eller kurslärare. +crs#:#crs_registration_deactivated#:#Endast kursadministratörer och kurshandledare kan lägga till användare i kursen. +crs#:#crs_registration_limited#:#Tillfällig anslutning +crs#:#crs_registration_limited_info#:#Medlemmar kan endast delta i kursen under en viss period. +crs#:#crs_registration_period#:#Tidsperiod +crs#:#crs_registration_type#:#Förfarande för anslutning +crs#:#crs_reject_subscriber#:#Avslag för kursen "%s" +crs#:#crs_reject_subscriber_body#:#Din ansökan om antagning till kursen "%s" har avslagits. +crs#:#crs_reset_results#:#Återställ resultat +crs#:#crs_role_status#:#Roll/Status +crs#:#crs_search_users#:#Sök användare +crs#:#crs_select_archive_language#:#Välj ett språk som arkivet ska skapas på. +crs#:#crs_select_one_archive#:#Välj exakt ett arkiv! +crs#:#crs_select_starter#:#Välj startobjekt +crs#:#crs_selected_users#:#Utvalda deltagare +crs#:#crs_settings#:#Kursinställningar +crs#:#crs_settings_saved#:#Inställningarna har sparats +crs#:#crs_shorten_breadcrumb#:#Navigering med brödsmulor +crs#:#crs_show_all_obj#:#Visa alla +crs#:#crs_show_member_export#:#Lista över deltagare +crs#:#crs_show_member_export_info#:#Medlemmar har möjlighet att skapa en lista över deltagare +crs#:#crs_show_member_export_settings#:#Lista över deltagare +crs#:#crs_show_members#:#Medlemmarnas galleri +crs#:#crs_show_members_info#:#Alla medlemmar kan se medlemsgalleriet på den här fliken. +crs#:#crs_size#:#Filens storlek +crs#:#crs_sort_activation#:#I enlighet med tidsangivelser +crs#:#crs_sort_manual#:#Manuell sortering +crs#:#crs_sort_timing_info#:#De inkluderade objekten sorteras automatiskt efter rekommenderad behandlingstid och tillgänglighet. +crs#:#crs_sort_title#:#Alfabetiskt efter titel +crs#:#crs_start#:#Start +crs#:#crs_start_objects#:#Starta objekt +crs#:#crs_starter_delete_sure#:#Vill du verkligen att följande objekt inte längre ska vara startobjekt? +crs#:#crs_starter_deleted#:#Uppdraget har tagits bort. +crs#:#crs_starters_already_assigned#:#Detta objekt har redan tilldelats. +crs#:#crs_status#:#Status +crs#:#crs_status_changed#:#Status i kursen "%s +crs#:#crs_status_changed_body#:#Din status i kursen "%s" har ändrats. +crs#:#crs_status_determination#:#Bestämning av status "Godkänd" +crs#:#crs_status_determination_lp#:#Dra nytta av framsteg i lärandet +crs#:#crs_status_determination_lp_info#:#Om inlärningsförloppet ändras till "Redigerad", sätts statusen "Godkänd". Handledaren kan manuellt skriva över statusen. +crs#:#crs_status_determination_manual#:#Endast manuellt av handledare +crs#:#crs_status_determination_sync#:#Inlärningsframstegen för denna kurs sätts automatiskt till "Godkänd" så snart någon har slutfört alla aktiviteter som krävs för den. Redan uppnådda framsteg tas med i beräkningen. En manuellt inställd status förblir oförändrad. Vill du sätta statusen "Go +crs#:#crs_structure#:#Kursens struktur +crs#:#crs_subject_course_group_notification#:#Mailsammanfattning för %s +crs#:#crs_subscribe_member#:#Din registrering för kursen "%s +crs#:#crs_subscribe_member_body#:#vi har just antagit dig till kursen %s i enlighet med din ansökan. +crs#:#crs_subscribe_wl#:#Din registrering för kursen "%s +crs#:#crs_subscribe_wl_body#:#Du har placerats på väntelistan för kursen "%s" och har positionen %s på väntelistan. Du kommer att meddelas via e-post så snart din ansökan om tillträde har godkänts eller avslagits. +crs#:#crs_subscriber#:#Ansökan om antagning inlämnad +crs#:#crs_subscribers_deleted#:#Förfrågan har tagits bort +crs#:#crs_subscription#:#Förfarande för anslutning +crs#:#crs_subscription_failed_limit#:#Det maximala antalet deltagare har överskridits. +crs#:#crs_subscription_max_members#:#Maximalt antal +crs#:#crs_subscription_max_members_short#:#Begränsat antal medlemmar +crs#:#crs_subscription_max_members_short_info#:#Ett lägsta eller högsta antal medlemmar kan anges. En väntelista kan upprättas. +crs#:#crs_subscription_min_members#:#Minsta antal +crs#:#crs_subscription_min_members_err#:#Det lägsta antalet får inte vara större än det högsta antalet. +crs#:#crs_subscription_min_members_info#:#Om det erforderliga minimiantalet medlemmar inte uppnås kan kursen inte äga rum. Om minimiantalet medlemmar inte har uppnåtts vid slutet av anslutningsperioden eller det senaste kursuttaget, skickar ILIAS ett e-postmeddelande till de kursadministratörer +crs#:#crs_subscription_options_confirmation#:#Tillträde efter bekräftelse +crs#:#crs_subscription_options_direct#:#Direkt anslutning +crs#:#crs_subscription_options_password#:#Anmäl dig med lösenord för kursen +crs#:#crs_subscription_successful#:#Du har blivit antagen till kursen. +crs#:#crs_sure_delete_selected_archives#:#Är du säker på att du vill radera de valda arkiven? +crs#:#crs_syllabus#:#Kursprogram +crs#:#crs_sys_default#:#Globalt standardvärde +crs#:#crs_table_start_objects#:#Starta objekt +crs#:#crs_target_group#:#Målgrupp +crs#:#crs_tile_and_objective_view_not_supported#:#Simultan aktivering av kakelpresentation och målorienterad vy för lärande stöds inte. +crs#:#crs_tile_and_session_limit_not_supported#:#Samtidig aktivering av kakelpresentation och begränsning av visade sessioner stöds inte. +crs#:#crs_timing_err_start_end#:#Startdatumet måste vara mindre än eller lika med slutdatumet. +crs#:#crs_timings_activate_optional#:#Frivilligt läge för användarens studieplan +crs#:#crs_timings_activate_optional_own#:#Volontärläge för min studieplan +crs#:#crs_timings_availability_enabled#:#Begränsad tid tillgänglig +crs#:#crs_timings_changeable#:#Lärande planering föränderlig +crs#:#crs_timings_changed#:#Lärandeplan ändrad +crs#:#crs_timings_days_after_subsription#:#Dag(ar) efter kursstart +crs#:#crs_timings_disabled#:#Timmar avstängda +crs#:#crs_timings_disabled_info#:# Välj denna inställning för att inaktivera alla tidsinställningar. +crs#:#crs_timings_early_begin#:#Tidig start +crs#:#crs_timings_edit_personal#:#Edit personlig planering av lärande +crs#:#crs_timings_end#:#Sluttid +crs#:#crs_timings_from_until#:#(Från/Till) +crs#:#crs_timings_in_days#:#(i dagar) +crs#:#crs_timings_info_active#:#(Aktiv) +crs#:#crs_timings_not_changed#:#Lärandeplanen har inte ändrats +crs#:#crs_timings_optional_checked#:#Volunteer-läget har aktiverats för den här användaren. +crs#:#crs_timings_optional_off#:#Volontärläget är inte aktivt. +crs#:#crs_timings_optional_on#:#Volontärläget är aktivt. +crs#:#crs_timings_optional_on_and_passed#:#Volontärläget är aktivt och kan inte ändras eftersom användaren har statusen "Godkänd". +crs#:#crs_timings_optional_unchecked#:#Volontärläget har inaktiverats för den här användaren. +crs#:#crs_timings_planed_info#:#Planerad bearbetningstid +crs#:#crs_timings_planed_start#:#Planerad +crs#:#crs_timings_presetting#:#Lärandeplanering påslagen +crs#:#crs_timings_short_active#:#Planering av lärande +crs#:#crs_timings_short_active_tt#:#Möjliggöra planering av lärande +crs#:#crs_timings_short_changeable#:#Ändringsbar +crs#:#crs_timings_short_changeable_tt#:#Lärandeplanen kan ändras av deltagarna +crs#:#crs_timings_short_end#:#Slutdatum +crs#:#crs_timings_short_limit_start_end#:#Senaste slut +crs#:#crs_timings_short_limit_start_end_tt#:#Senaste slut +crs#:#crs_timings_short_limit_start_end_tt_rel#:#Senaste avslut i dagar efter kursstart +crs#:#crs_timings_short_start_end#:#Startdatum +crs#:#crs_timings_short_start_end_rel#:#Rekommenderad start (dagar efter kursstart) +crs#:#crs_timings_short_start_end_tt#:#Rekommenderad start +crs#:#crs_timings_short_start_end_tt_rel#:#Rekommenderad start i dagar efter kursstart +crs#:#crs_timings_start#:#Starttid +crs#:#crs_timings_start_end_info#:#(Start/End) +crs#:#crs_timings_sug_begin#:#Rekommenderad start +crs#:#crs_timings_sug_end#:#Rekommenderat slut +crs#:#crs_timings_suggested_info#:#Rekommenderad behandlingstid +crs#:#crs_timings_time_frame#:#Tidsram +crs#:#crs_timings_time_frame_tt#:#Bearbetningstid i dagar +crs#:#crs_timings_update_error#:#Den rekommenderade inlärningstiden för följande kursmaterial strider mot den angivna senaste möjliga inlärningstiden. +crs#:#crs_timings_visibility#:#Om aktiverat är läromedlet även synligt utanför den schemalagda tillgängligheten. +crs#:#crs_timings_visibility_short#:#Synlighet +crs#:#crs_timings_warning_timing_exists#:#Attention +crs#:#crs_to#:#Till +crs#:#crs_tutor#:#Tutor +crs#:#crs_tutors#:#Tutorer +crs#:#crs_unblocked#:#Aktiverad +crs#:#crs_unblocked_member#:#Status i kursen "%s +crs#:#crs_unblocked_member_body#:#Ditt medlemskap för kursen "%s" har aktiverats. +crs#:#crs_unlimited#:#Obegränsad +crs#:#crs_unsubscribe_member#:#Din avregistrering från kursen "%s" +crs#:#crs_unsubscribe_member_body#:#vi bekräftar din avregistrering från kursen "%s". +crs#:#crs_unsubscribe_member_explanation#:#Du får detta mail eftersom du har avslutat kursmedlemskapet för den ovan nämnda kursen. +crs#:#crs_unsubscribe_sure#:#Är du säker på att du vill avbryta ditt medlemskap i den här kursen? +crs#:#crs_unsubscribed_from_crs#:#Ditt kursmedlemskap har avslutats. +crs#:#crs_update_subscr_request#:#Uppdatera ansökan om antagning +crs#:#crs_user_agreement#:#Personliga profiluppgifter +crs#:#crs_user_agreement_info#:#Data delas med kursadministratörer +crs#:#crs_user_already_assigned#:#Personen är redan deltagare i denna kurs. +crs#:#crs_users_added#:#User(s) har lagts till i kursen +crs#:#crs_users_already_assigned#:#En användare är redan medlem i denna kurs +crs#:#crs_users_removed_from_list#:#De valda användarna har tagits bort från väntelistan. +crs#:#crs_usr_agreement#:#Insikt i personuppgifter +crs#:#crs_view_info_objective#:#Lärandemål visas i en separat lista. Objekt som inte är kopplade till lärandemål listas nedan. +crs#:#crs_view_info_timing#:#Objekten visas enligt ett schema. +crs#:#crs_view_info_timing_absolute#:#Start- och slutdatum är absoluta. +crs#:#crs_view_info_timing_relative#:#Start- och slutdatum anges i förhållande till kursens startdatum med hjälp av tidsangivelser. +crs#:#crs_view_mode#:#Presentation +crs#:#crs_view_objective#:#Lärande Målorienterad syn +crs#:#crs_view_timing#:#Planeringsvy för lärande +crs#:#crs_view_timing_absolute#:#Absolut datum +crs#:#crs_view_timing_relative#:#Relativt datum +crs#:#crs_view_timings#:#Planeringstyp för lärande +crs#:#crs_visibility#:#Synlighet +crs#:#crs_visibility_limitless#:#Unlimited - när den kopplas online +crs#:#crs_visibility_until#:#Tidsbegränsad tillgänglighet +crs#:#crs_visibility_until_info#:#Kursen visas endast för dess medlemmar under en viss tidsperiod. +crs#:#crs_visibility_unvisible#:#Kursen är inte synlig. +crs#:#crs_wait_info#:#Om det maximala antalet medlemmar uppnås kan ytterligare användare placeras på en väntelista. +crs#:#crs_waiting_list#:#Väntelista +crs#:#crs_waiting_list_autofill#:#Med automatisk framflyttning +crs#:#crs_waiting_list_autofill_info#:#Deltagare flyttas automatiskt upp från väntelistan i händelse av avbokningar. Detta bör inte användas i samband med förfarandet "gå med efter bekräftelse" eftersom det kringgår bekräftelsen. +crs#:#crs_waiting_list_no_autofill#:#Utan automatisk framflyttning +crs#:#crs_warn_no_max_set_on_waiting_list#:#Det maximala antalet deltagare har uppnåtts. Du kan dock sätta upp dig på väntelistan för den här kursen och få ett meddelande om du kan flytta upp i kursen. +crs#:#crs_warn_wl_set_on_waiting_list#:#Det finns redan deltagare på väntelistan. Du kan dock lägga till ditt namn på väntelistan för denna kurs. Du kommer att meddelas via e-post så snart din ansökan om tillträde har godkänts eller avslagits. +crs#:#crs_wiz_back#:#Tillbaka +crs#:#crs_wiz_next#:#Spara +crs#:#crs_xml#:#XML +crs#:#edit_timings_list#:#Edit planering av lärande +crs#:#event#:#Session +crs#:#event_add_new_event#:#En ny session har skapats. +crs#:#event_assign_materials_info#:#Här kan du tilldela material till sessionen. Dessa visas sedan direkt under sessionen. +crs#:#event_assign_materials_table#:#Allokering av material +crs#:#event_blank_columns#:#Ytterligare kolumner +crs#:#event_btn_add#:#Skapa session +crs#:#event_btn_add_edit#:#Skapa session och tilldela material +crs#:#event_csv_export#:#CSV export +crs#:#event_date_time#:#Datum och tid +crs#:#event_desc#:#Beskrivning +crs#:#event_details_workflow#:#Detaljer om sessionen +crs#:#event_digit#:#Nummer +crs#:#event_edit_members#:#Deltagare +crs#:#event_etime_smaller_stime#:#Slutdatumet är tidigare än startdatumet. Ange en giltig tidsperiod. +crs#:#event_file#:#Fil +crs#:#event_files#:# Tilldelade filer +crs#:#event_fulltime_info#:#Tillsättning hela dagen +crs#:#event_lecturer#:#Namn +crs#:#event_list_registered_only#:#Endast registrerad +crs#:#event_location#:#Plats +crs#:#event_materials#:#Material för sessionen +crs#:#event_not_participated#:#Inte deltagit +crs#:#event_overview#:#Deltagande i möten +crs#:#event_participated#:#Deltagande +crs#:#event_registered#:#Du har registrerat dig för denna session. +crs#:#event_section_information#:#Information om sessionen +crs#:#event_table_create#:#Ny session +crs#:#event_table_update#:#Redigera session +crs#:#event_tbl_admin#:#Administratör +crs#:#event_tbl_admins#:#Administratörer +crs#:#event_tbl_member#:#Medlem +crs#:#event_tbl_members#:#Medlemmar +crs#:#event_tbl_participated#:#Deltagande +crs#:#event_tbl_registered#:#Reported +crs#:#event_tbl_tutor#:#Tutor +crs#:#event_tbl_tutors#:#Tutorer +crs#:#event_title#:#Titel +crs#:#event_tutor_data#:#Presentation av +crs#:#event_unregister#:#Logga ut +crs#:#event_unregistered#:#Du har blivit avregistrerad. +crs#:#event_updated#:#Ändringarna har sparats +crs#:#event_user_selection#:#Urval av användare +crs#:#event_user_selection_include_filter#:#Inkludera "%1$s +crs#:#event_user_selection_include_requests#:#Inkludera alla användare i listan "Önskemål om inkludering" +crs#:#event_user_selection_include_role#:#Inkludera alla användare med rollen "%1$s +crs#:#event_user_selection_include_waiting_list#:#Inkludera alla användare på "väntelistan +crs#:#events#:#Sessioner +crs#:#export_members#:#Export av deltagardata +crs#:#grouping_change_assignment#:#Ändra uppdrag +crs#:#grp_grp_already_assigned#:#Eftersom du redan är medlem i en av grupperna kan du inte gå med i en annan grupp från listan! +crs#:#mem_cron_min_members_intro#:#Följande kurser och grupper når för närvarande inte upp till minimiantalet medlemmar +crs#:#mem_cron_min_members_reason#:#Om du inte längre vill få aviseringar för dessa kurser och grupper, avaktivera kryssrutan "Avisering" på fliken "Medlemmar" i respektive objekt. +crs#:#mem_cron_min_members_subject#:#Kurs/Grupp +crs#:#mem_cron_min_members_task#:#Informera de som redan har anmält sig i god tid om evenemanget inte blir av. Eller ändra det minsta antalet medlemmar eller anslutningsperioden. För att göra detta, justera inställningarna i avsnittet "Tidsbegränsad anslutning" eller "Begränsat antal med +crs#:#obj_count_members#:#Antal medlemmar +crs#:#sess_attendance_list#:#Lista över deltagare +crs#:#sess_gen_attendance_list#:#Skapa lista +crs#:#sess_join_info#:#Klicka på Register om du vill delta i detta seminarium. +crs#:#sess_limit#:#Begränsning av antalet sessioner som visas +crs#:#sess_limit_info#:#Deltagarna visas inte alla sessioner, utan endast ett definierat antal. +crs#:#sess_num_next#:#Antal efterföljande sessioner (från och med i morgon) +crs#:#sess_num_prev#:#Antal tidigare sessioner (till och med igår) +crs#:#sess_print_attendance_list#:#Skriv ut lista +crs#:#sess_signature#:#Signatur +crs#:#subscription_times_not_valid#:#Tidsperioden för 'Registration' är inte giltig. +crs#:#timing_accept_table#:#Planering av lärande +crs#:#timing_accepted#:#Accepted +crs#:#timing_not_accepted#:#Inte accepterad +crs#:#timing_remark#:#Note +crs#:#timing_tutor_visible#:#Markering är synlig för handledaren +crs#:#timing_user_accept#:#Acceptera rekommenderad utbildningsplan +crs#:#timing_user_accepted#:#Lärandeplan accepterad +crs#:#timings#:#Tidslinjer +crs#:#timings_cron_reminder_exceeded_start#:#Bearbetningsperioden är försenad till +crs#:#timings_cron_reminder_exceeded_subject#:#Du har överskridit bearbetningsperioden +crs#:#timings_cron_reminder_freshly_start#:#Bearbetningsperioden har börjat kl. +crs#:#timings_cron_reminder_started_subject#:#Redigeringsperioden har börjat +crs#:#timings_edit#:#Redigera schemaläggning +crs#:#timings_of#:#Lärandeplanering från +crs#:#timings_reminder_notifications#:#Skicka meddelanden om planering av lärande +crs#:#timings_reminder_notifications_info#:#När den aktiveras informeras kursdeltagarna om överskridet material för utbildningsplanering. +crs#:#timings_timings#:#Planering av lärande +crs#:#timings_timings_off#:#Learning planering ledning off +crs#:#timings_timings_on#:#Learning planering ledning på +crs#:#timings_usr_edit#:#Personlig planering av lärande +crs#:#tutor_email#:#E-post +crs#:#tutor_name#:#Namn +crs#:#tutor_phone#:#Telefon +crs#:#user_fields#:#Personliga profiluppgifter +crsv#:#crsv_create#:#Skapa kursintyg +crsv#:#crsv_create_info#:#Välj en kurs för vilken du behöver ett intyg +dash#:#dash_activation#:#Aktivering +dash#:#dash_added_to_favs#:#Posten har lagts till i personliga favoriter. +dash#:#dash_avail_presentation#:#Tillgängliga presentationer +dash#:#dash_avail_sortation#:#Tillgängliga sorter +dash#:#dash_click_here#:#Klicka här +dash#:#dash_dashboard#:#Dashboard +dash#:#dash_default_presentation#:#Standardiserad presentation +dash#:#dash_default_sortation#:#Standard sortering +dash#:#dash_enable_cal#:#Kalender +dash#:#dash_enable_favourites#:#Favoriter +dash#:#dash_enable_mail#:#E-post +dash#:#dash_enable_memberships#:#Mina kurser och grupper +dash#:#dash_enable_news#:#Nyheter +dash#:#dash_enable_task#:#Att göra +dash#:#dash_favourites#:#Favoriter +dash#:#dash_info_sure_remove_from_favs#:#Vill du verkligen ta bort följande objekt från dina favoriter? +dash#:#dash_item_removed#:#Posten har tagits bort från listan. +dash#:#dash_learningsequences#:#Mina inlärningssekvenser +dash#:#dash_list#:#Lista +dash#:#dash_main_panel#:#Huvudområde +dash#:#dash_make_favourite#:#Lägg till i favoriter +dash#:#dash_member_main_alt#:#En vy över medlemskapen kan också inkluderas direkt i huvudmenyn. +dash#:#dash_memberships#:#Mina kurser och grupper +dash#:#dash_presentation#:#Presentation +dash#:#dash_remove_from_list#:#Ta bort från listan +dash#:#dash_side_panel#:#Sida område +dash#:#dash_sort_by_alphabet#:#Sortera efter alfabet +dash#:#dash_sort_by_location#:#Sortera efter plats +dash#:#dash_sort_by_start_date#:#Sortera efter händelseperiod +dash#:#dash_sort_by_type#:#Sortera efter typ +dash#:#dash_sortation#:#Sortering +dash#:#dash_studyprogramme#:#Mina studieprogram +dash#:#dash_tile#:#Kakelplattor +dash#:#dash_view_courses_groups#:#Blockera 'Mina kurser och grupper +dash#:#dash_view_favourites#:#Blockera 'Favoriter +dash#:#favourites_disabled_info#:#Inställning av favoriter är avaktiverad. Du kan ändra detta i tidningsinställningarna. +dash#:#memberships_disabled_info#:#Inställningen av medlemskap är avaktiverad. Du kan ändra detta i kursinställningarna. +dateplaner#:#Fr_long#:#Fredag +dateplaner#:#Fr_short#:#Fr +dateplaner#:#Mo_long#:#Måndag +dateplaner#:#Mo_short#:#Mo +dateplaner#:#Sa_long#:#Lördag +dateplaner#:#Sa_short#:#Sa +dateplaner#:#Su_long#:#Söndag +dateplaner#:#Su_short#:#Så +dateplaner#:#Text#:#Text +dateplaner#:#Th_long#:#Torsdag +dateplaner#:#Th_short#:#Do +dateplaner#:#Tu_long#:#Tisdag +dateplaner#:#Tu_short#:#Di +dateplaner#:#We_long#:#Vardag +dateplaner#:#We_short#:#Mi +dateplaner#:#add_appointment#:#Lägg till möte +dateplaner#:#app_consultation_hours#:#Hantering av kontorstid +dateplaner#:#app_day#:#Tag +dateplaner#:#app_month#:#Månad +dateplaner#:#app_week#:#Vecka +dateplaner#:#apply#:# ta över +dateplaner#:#back#:#Tillbaka +dateplaner#:#back_to_crs#:#Kursinnehåll +dateplaner#:#back_to_grp#:#Gruppens innehåll +dateplaner#:#back_to_pd#:#Tillbaka +dateplaner#:#btn_ical#:#Prenumerera +dateplaner#:#c_date#:# ersätta utnämning +dateplaner#:#cal_accepted#:#Accepted +dateplaner#:#cal_add_appointment#:#Skapa möte +dateplaner#:#cal_add_calendar#:#Skapa ny kalender +dateplaner#:#cal_add_category#:#Skapa ny kalender +dateplaner#:#cal_add_milestone#:#Lägg till Milstolpe +dateplaner#:#cal_adm_notification_info#:#Välj denna inställning för att aktivera valfri e-postavisering för kurs- och gruppmöten. +dateplaner#:#cal_adm_notification_user_info#:#Välj denna inställning för att kunna skicka ett valfritt e-postmeddelande till enskilda, valbara användare. +dateplaner#:#cal_agenda#:#Agenda +dateplaner#:#cal_all_day#:#FullDay +dateplaner#:#cal_app_info#:#Information om kalenderdatum +dateplaner#:#cal_app_other_materials_num#:#Visa mer material +dateplaner#:#cal_appointments#:#Datum +dateplaner#:#cal_apps#:#Antal datum +dateplaner#:#cal_assigned_appointments#:#Datum för denna kalender +dateplaner#:#cal_back_to_cal#:#Tillbaka till kalendern +dateplaner#:#cal_back_to_list#:#Tillbaka till listan +dateplaner#:#cal_back_to_search#:#Tillbaka till sökningen +dateplaner#:#cal_batch_file_downloads#:#Batchprocess för nedladdning av filer från kalender +dateplaner#:#cal_batch_file_downloads_info#:#Tillåter nedladdning av alla filer till poster i den valda kalendervyn +dateplaner#:#cal_book_free#:#fri +dateplaner#:#cal_booked_out#:#bokad ut +dateplaner#:#cal_booking_cancellation_body#:#Ditt möte med %s är inställt. +dateplaner#:#cal_booking_cancellation_subject#:#Datum då "%s" avbröts +dateplaner#:#cal_booking_cancellation_user#:#Detta är en kopia av mailet till användaren +dateplaner#:#cal_booking_confirmation_body#:#Ditt möte med %s är bokat. +dateplaner#:#cal_booking_confirmation_link#:#Länk till utnämningen +dateplaner#:#cal_booking_confirmation_subject#:#Tillfället "%s" bokades +dateplaner#:#cal_booking_confirmation_user#:#Detta är en kopia av mailet till användaren +dateplaner#:#cal_booking_confirmed#:#Mötet bokades framgångsrikt. +dateplaner#:#cal_booking_failed_info#:#Bokningen kunde inte göras eftersom datumet är fullbokat. +dateplaner#:#cal_cache#:#Kalender cache +dateplaner#:#cal_cache_disabled#:#Avstängd +dateplaner#:#cal_cache_enabled#:#Kopplad på +dateplaner#:#cal_cache_info#:#När den är aktiverad uppdateras kalenderdisplayen endast var x:e minut. +dateplaner#:#cal_cache_settings#:#Cache +dateplaner#:#cal_cal_deleted#:#Kalendrarna har raderats. +dateplaner#:#cal_cal_details#:#Kalenderuppgifter +dateplaner#:#cal_cal_shared_with#:#Användare med vilka kalendern delas +dateplaner#:#cal_cal_sync_success#:#Kalenderdatumen har uppdaterats. +dateplaner#:#cal_cal_synchronize#:#Synkronisera kalender +dateplaner#:#cal_cal_type#:#Typ av kalender +dateplaner#:#cal_calendar_color#:#Färg +dateplaner#:#cal_calendar_download#:#Kalenderfiler +dateplaner#:#cal_calendar_name#:#Kalenderns namn +dateplaner#:#cal_calendar_subscription_modal_title#:#Prenumerera på kalender +dateplaner#:#cal_cancel_booking#:#Avboka bokning +dateplaner#:#cal_cancel_booking_confirmed#:#Bokningen avbokades framgångsrikt. +dateplaner#:#cal_cancel_booking_info#:#Vänligen bekräfta avbokning av bokningen. +dateplaner#:#cal_category_selection#:#Urval av kalender +dateplaner#:#cal_cg_notification#:#Kurs/Grupp Anmälan +dateplaner#:#cal_cg_registration_info#:#När den är aktiverad kan användare registrera sig för kurs- och gruppmöten. +dateplaner#:#cal_cg_registrations#:#Anmälan till kurs/grupp datum +dateplaner#:#cal_ch_add_grp#:#Skapa ny konsultgrupp +dateplaner#:#cal_ch_add_sequence#:#Skapa nya konsultationsserier +dateplaner#:#cal_ch_app_bookings#:#Bokningar +dateplaner#:#cal_ch_app_grp#:#Talande grupper +dateplaner#:#cal_ch_app_list#:#Talking hour möten +dateplaner#:#cal_ch_assign_participants#:#Tilldela deltagare +dateplaner#:#cal_ch_assigned_apps#:#Antal datum +dateplaner#:#cal_ch_book#:#Boka en konsultation +dateplaner#:#cal_ch_booking#:#Bokning av resurser +dateplaner#:#cal_ch_booking_message_tbl#:#Kommentar till ansökan +dateplaner#:#cal_ch_booking_owner#:#Speaking at###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +dateplaner#:#cal_ch_booking_reminder_body#:#Ditt möte med "%s" kommer att äga rum om några dagar. +dateplaner#:#cal_ch_booking_reminder_subject#:#Datum påminnelse "%s" +dateplaner#:#cal_ch_bookings#:#Deltagare +dateplaner#:#cal_ch_bookings_tbl#:#Bokade datum +dateplaner#:#cal_ch_cancel_booking#:#Avboka bokning +dateplaner#:#cal_ch_cancel_booking_info#:#Vid avbokning av tidsbokningar kommer deltagarna att informeras via e-post om avbokningen av tidsbokningarna. Om du inte vill att deltagarna ska informeras bör du välja alternativet Ta bort tidsbokning(ar). +dateplaner#:#cal_ch_cancel_booking_sure#:#Är du säker på att du vill avboka de valda mötesbokningarna? +dateplaner#:#cal_ch_canceled_bookings#:#De valda bokningarna har avbokats. +dateplaner#:#cal_ch_ch#:#Talking hour möten +dateplaner#:#cal_ch_cron_reminder#:#Skicka meddelanden om samråd +dateplaner#:#cal_ch_cron_reminder_days#:#Antal dagar +dateplaner#:#cal_ch_cron_reminder_info#:#Om aktiverat kommer användare som har bokat en konsultationstid att få ett påminnelsemeddelande om kommande möten. Ange hur många dagar i förväg påminnelserna ska skickas. +dateplaner#:#cal_ch_current_bookings#:#Aktuella deltagare +dateplaner#:#cal_ch_deadline#:#Senaste registrering +dateplaner#:#cal_ch_deadline_info#:#Vänligen ange upp till hur många timmar före konsultationstiden som registrering ska vara möjlig. +dateplaner#:#cal_ch_delete_app_booking_info#:#Bokningar finns redan för följande datum. Om du tar bort dessa möten kommer deltagarna inte att informeras om borttagningen. +dateplaner#:#cal_ch_delete_booking#:#Ta bort tidsbokning +dateplaner#:#cal_ch_delete_booking_info#:#Vid avbokning av tidsbokningar kommer deltagarna inte att informeras via e-post om avbokningen av tidsbokningarna. Om du vill att deltagarna ska informeras bör du välja alternativet Avboka tidsbokning(ar). +dateplaner#:#cal_ch_delete_booking_sure#:#Är du säker på att du vill radera de valda tidsbokningarna? +dateplaner#:#cal_ch_deleted_bookings#:#De valda bokningarna har tagits bort. +dateplaner#:#cal_ch_duration#:#Duration av ett möte +dateplaner#:#cal_ch_export_apps#:#Bokade datum +dateplaner#:#cal_ch_field_ch#:#Talking hour möten +dateplaner#:#cal_ch_form#:#Aktivera hantering av konsultationstimmar +dateplaner#:#cal_ch_form_header#:#Hantering av kontorstid +dateplaner#:#cal_ch_form_info#:#Detta alternativ aktiverar hanteringen av kontorstider i kalendern. +dateplaner#:#cal_ch_grp_add_tbl#:#Skapa ny konsultgrupp +dateplaner#:#cal_ch_grp_delete_sure#:#Är du säker på att du vill ta bort följande samrådsgrupper? +dateplaner#:#cal_ch_grp_header#:#Talande grupp +dateplaner#:#cal_ch_grp_multiple#:#Antal bokningar per deltagare +dateplaner#:#cal_ch_grp_multiple_info#:#Du kan ställa in det maximala antalet bokningar per deltagare för denna mötesgrupp här. +dateplaner#:#cal_ch_grp_no_assignment#:#-- Inte tilldelad --. +dateplaner#:#cal_ch_grp_selection#:#Uppdrag till samrådsgrupper +dateplaner#:#cal_ch_grp_update_tbl#:#Redigera samrådsgrupp +dateplaner#:#cal_ch_grps#:#Talande grupper +dateplaner#:#cal_ch_manager#:#Talande timme chef +dateplaner#:#cal_ch_manager_info#:#Om du vill att dina kontorstider ska hanteras av en annan person måste du ange dennes inloggningsnamn här. +dateplaner#:#cal_ch_max_books#:#Antal bokningar per deltagare +dateplaner#:#cal_ch_multi_edit_sequence#:#Redigera möten +dateplaner#:#cal_ch_num_appointments#:#Antal möten per konsultationstimme +dateplaner#:#cal_ch_num_appointments_info#:#Bestäm hur många på varandra följande möten som ska genereras. +dateplaner#:#cal_ch_num_bookings#:#Registreringar per möte +dateplaner#:#cal_ch_personal_book#:#Personliga bokningar +dateplaner#:#cal_ch_personal_ch#:#Personliga konsultationsmöten +dateplaner#:#cal_ch_reject_booking#:#Avboka tidsbokning +dateplaner#:#cal_ch_target_object#:#Objekt i tidningen +dateplaner#:#cal_ch_target_object_info#:#Talartimmar visas i kurser och grupper i ett litet block till höger. För att begränsa detta till vissa kurser eller grupper, ange Ref ID för objektet i fråga. Du hittar detta i URL:en för motsvarande objekt. Ange flera Ref-ID kommaseparerade. Oavsett det +dateplaner#:#cal_ch_unknown_repository_object#:#Den angivna identifieraren för objektet är inte giltig. +dateplaner#:#cal_ch_unknown_user#:#Det angivna inloggningsnamnet existerar inte. +dateplaner#:#cal_ch_user_assignment_failed_info#:#Följande användare kunde inte tilldelas ett möte eftersom det maximala antalet bokningar överskreds. +dateplaner#:#cal_change_calendar_view#:#Ändra kalendervy +dateplaner#:#cal_change_responsible_users#:#Byt ut ansvariga medlemmar +dateplaner#:#cal_changed_events_header#:#Nya och ändrade datum +dateplaner#:#cal_confirm_booking#:#Boka en konsultation +dateplaner#:#cal_confirm_booking_info#:#Vänligen bekräfta bokningen av konsultationen. +dateplaner#:#cal_confirm_reg_info#:#Vänligen bekräfta registreringen för detta möte. +dateplaner#:#cal_confirm_unreg_info#:#Vänligen bekräfta avbokningen av detta möte. +dateplaner#:#cal_consultation_hours_for#:#Samråd +dateplaner#:#cal_consultation_hours_for_user#:#Konsultation %1 +dateplaner#:#cal_contained_in#:#Ingår i +dateplaner#:#cal_create#:#Skapa +dateplaner#:#cal_created_appointment#:#Ett nytt möte har skapats. +dateplaner#:#cal_created_milestone#:#Milstolpen har skapats. +dateplaner#:#cal_created_milestone_resp_q#:#Milstolpen har skapats. Vänligen välj de medlemmar som ska vara ansvariga för milstolpen. +dateplaner#:#cal_cronjob_remote_description#:#Om den är aktiverad synkroniseras möten i kalendertypen "Webbkalender" automatiskt efter det angivna tidsintervallet. +dateplaner#:#cal_cronjob_remote_title#:#Synkronisering av externa kalendrar +dateplaner#:#cal_crs_info#:#Information om kursen +dateplaner#:#cal_crs_new_notification_body#:#Ett nytt möte har skapats i kursen "%s". +dateplaner#:#cal_crs_new_notification_sub#:#Nytt möte i kursen "%s +dateplaner#:#cal_crs_notification_body#:#Det skedde en ändring av datum i kursen "%s". +dateplaner#:#cal_crs_notification_sub#:#Datum för ändring i kursen "%s" +dateplaner#:#cal_crs_timing_end#:#Redigering slut +dateplaner#:#cal_crs_timing_start#:#Start av bearbetning +dateplaner#:#cal_daily#:#Dagligen +dateplaner#:#cal_date_booked#:#bokad +dateplaner#:#cal_date_format_info#:#Välj ett format för att ange ett datum. +dateplaner#:#cal_day_end#:#Slut på dagen +dateplaner#:#cal_day_of_month#:#Månadens dag +dateplaner#:#cal_day_overview#:#Daglig översikt +dateplaner#:#cal_day_s#:#Tagg(ar) +dateplaner#:#cal_day_selection#:#Dagligt urval +dateplaner#:#cal_day_start#:#Start på dagen +dateplaner#:#cal_day_week_view#:#Inställningar Visa dag/vecka +dateplaner#:#cal_deadline#:#Sista datum +dateplaner#:#cal_declined#:#Avvisad +dateplaner#:#cal_def_date_format#:#Förvalt format för inmatning av datum +dateplaner#:#cal_def_date_format_info#:#Välj ett format för att ange ett datum. +dateplaner#:#cal_def_day_end#:#Förvalt slut på dagen +dateplaner#:#cal_def_day_start#:#Förvald start på dagen +dateplaner#:#cal_def_show_weeks#:#Visa veckokolumn +dateplaner#:#cal_def_time_format#:#Förvalt tidsformat +dateplaner#:#cal_def_time_format_info#:#Välj ett format för inmatning och visning av tiden. +dateplaner#:#cal_def_timezone#:#Förvald tidszon +dateplaner#:#cal_def_timezone_info#:#Välj en tidszon för att visa möten. +dateplaner#:#cal_def_view#:#Förvald kalendervy +dateplaner#:#cal_def_week_start#:#Förvald start på veckan +dateplaner#:#cal_default_calendar#:#Personliga möten +dateplaner#:#cal_default_settings#:#standardvärden +dateplaner#:#cal_del_app_sure#:#Är du säker på att du vill ta bort följande möten? +dateplaner#:#cal_del_cal_sure#:#Vill du verkligen radera de valda kalendrarna? +dateplaner#:#cal_delete_app_sure#:#Är du säker på att du vill ta bort följande möten? +dateplaner#:#cal_delete_cal#:#Radera kalender +dateplaner#:#cal_delete_recurrence_rule#:#Ta bort avtalsserier +dateplaner#:#cal_delete_recurrences#:#Ta bort alla upprepningar +dateplaner#:#cal_delete_single#:#Ta bort endast detta möte +dateplaner#:#cal_deleted_app#:#De valda mötena har tagits bort. +dateplaner#:#cal_details#:#Datum detaljer +dateplaner#:#cal_down_no_files#:#Inget att ladda ner, de listade evenemangen innehåller inga filer. +dateplaner#:#cal_download_all_files#:#Ladda ner alla filer +dateplaner#:#cal_download_files#:#Ladda ner filer +dateplaner#:#cal_download_files_started#:#Ett ZIP-arkiv med alla nedladdningsfiler skapas nu i bakgrunden. Du kan se status för dina bakgrundsprocesser längst upp till höger i meddelandecentret. Du kan också ladda ner ZIP-arkivet där. +dateplaner#:#cal_dstart_dend_warn#:#Vänligen kontrollera din post. Början av dagen måste vara före slutet av dagen. +dateplaner#:#cal_duration#:#Varaktighet +dateplaner#:#cal_edit_appointment#:#Redigera utnämning +dateplaner#:#cal_edit_category#:#Redigera kalender +dateplaner#:#cal_edit_milestone#:#Redigera milstolpe +dateplaner#:#cal_edit_recurrences#:#Redigera alla möten +dateplaner#:#cal_edit_single#:#Redigera detta möte +dateplaner#:#cal_enable_group_milestones#:#Aktivera milstolpar +dateplaner#:#cal_enable_group_milestones_desc#:#Detta alternativ aktiverar hanteringen av milstolpar i kalendern (kurser och grupper). +dateplaner#:#cal_err_invalid_notification_rcps#:#Vänligen korrigera din post. Ange endast ILIAS-inloggningsnamn eller giltiga e-postadresser. +dateplaner#:#cal_every#:#Alla +dateplaner#:#cal_exc_deadline#:#Förfallodag +dateplaner#:#cal_exc_info#:#Information om träningspass +dateplaner#:#cal_exc_inst_files#:#Fil +dateplaner#:#cal_exc_open#:#Öppen träningsenhet +dateplaner#:#cal_exc_peer_review_deadline#:#Ge feedback tills +dateplaner#:#cal_export_timezone#:#Tidszon för kalenderexport +dateplaner#:#cal_export_timezone_tz#:#Använd ILIAS tidszon +dateplaner#:#cal_export_timezone_utc#:#Använd UTC-tidszon (kompatibel med MS Outlook) +dateplaner#:#cal_fifth#:#Femte +dateplaner#:#cal_first#:#Första +dateplaner#:#cal_fourth#:#Fjärde +dateplaner#:#cal_fullday#:#Datum/Tid +dateplaner#:#cal_fullday_title#:#Tillsättning hela dagen +dateplaner#:#cal_global_settings#:#Globala inställningar +dateplaner#:#cal_grp_curr_crs#:#Aktuell kurs +dateplaner#:#cal_grp_curr_crs_cons#:#Talande timmar +dateplaner#:#cal_grp_curr_grp#:#Aktuell grupp +dateplaner#:#cal_grp_info#:#Information om gruppen +dateplaner#:#cal_grp_new_notification_body#:#Ett nytt möte har skapats i gruppen "%s". +dateplaner#:#cal_grp_new_notification_sub#:#Nytt möte i gruppen "%s +dateplaner#:#cal_grp_notification_body#:#En ändring av utnämningen gjordes i gruppen "%s". +dateplaner#:#cal_grp_notification_sub#:#Datum för ändring i grupp "%s +dateplaner#:#cal_grp_others#:#Andra +dateplaner#:#cal_grp_personal#:#Personlig +dateplaner#:#cal_ical_infoscreen#:#Prenumerera +dateplaner#:#cal_ical_url#:#iCal URL +dateplaner#:#cal_import_appointments#:#Import utnämningar +dateplaner#:#cal_import_file#:#Importera fil +dateplaner#:#cal_import_file_info#:#Välj den fil som innehåller dina möten. +dateplaner#:#cal_import_tbl#:#Importera kalendertider +dateplaner#:#cal_imported_success#:#Det importerades %1$s nya möten. +dateplaner#:#cal_in#:#im +dateplaner#:#cal_last#:#Sista +dateplaner#:#cal_list#:#Lista +dateplaner#:#cal_mail_notification_body#:#Du har blivit inbjuden till ett möte. +dateplaner#:#cal_mail_notification_subject#:#Datum inbjudan +dateplaner#:#cal_manage#:#Hantera kalender +dateplaner#:#cal_materials#:#Material +dateplaner#:#cal_milestone_settings#:#Milstolpar +dateplaner#:#cal_month_overview#:#Månadsöversikt +dateplaner#:#cal_month_s#:#Månad(er) +dateplaner#:#cal_month_selection#:#Månad urval +dateplaner#:#cal_monthly#:#Månadsvis +dateplaner#:#cal_ms_details#:#Milstolpe detaljer +dateplaner#:#cal_ms_users_responsible#:#Ansvarsfulla medlemmar +dateplaner#:#cal_new_app#:#Ny utnämning +dateplaner#:#cal_new_ms#:#Ny milstolpe +dateplaner#:#cal_no_ending#:#Inget slutdatum +dateplaner#:#cal_no_events_block#:#Det finns inga datum tillgängliga för dig. +dateplaner#:#cal_no_events_info#:#Det finns inga datum tillgängliga för dig under den angivna perioden. +dateplaner#:#cal_no_recurrence#:#Ingen upprepning +dateplaner#:#cal_notification#:#Meddelande via e-post +dateplaner#:#cal_notification_crsgrp#:#Notifiering för kurs-/gruppdeltagare +dateplaner#:#cal_notification_info#:#Om aktiverat kommer alla kurs-/gruppdeltagare att informeras om datumändringen via e-post. +dateplaner#:#cal_notification_users#:#Notifiering för utvalda användare +dateplaner#:#cal_on#:#Am +dateplaner#:#cal_on_the#:#Am +dateplaner#:#cal_open_calendar#:#Öppen kalender +dateplaner#:#cal_origin#:#Ursprung +dateplaner#:#cal_owner#:#Owned by###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +dateplaner#:#cal_period#:#Tidsperiod +dateplaner#:#cal_rec_err_limit#:#Var god ange ett antal datum. +dateplaner#:#cal_recurrence_confirm_deletion#:#Välj om du vill radera enskilda möten eller hela serien av möten. +dateplaner#:#cal_recurrences#:#Upprepar +dateplaner#:#cal_reg_register#:#Logga in +dateplaner#:#cal_reg_registered#:#Du har registrerats för detta möte. +dateplaner#:#cal_reg_registered_users#:#Registrerade användare +dateplaner#:#cal_reg_unregister#:#Logga ut +dateplaner#:#cal_reg_unregistered#:#Du har blivit avregistrerad. +dateplaner#:#cal_registrations#:#Registrering av utnämningar +dateplaner#:#cal_remote_url#:#URL för kalendern +dateplaner#:#cal_repeat_until#:#Upprepa tills +dateplaner#:#cal_repo_obj#:#Magasinobjekt +dateplaner#:#cal_responsible#:#Ansvarsfull +dateplaner#:#cal_save_responsible_users#:#Rädda ansvariga medlemmar +dateplaner#:#cal_search#:#Sökord +dateplaner#:#cal_search_info_share#:#Ange namnet på den person/roll du vill dela denna kalender med. +dateplaner#:#cal_second#:#Sekund +dateplaner#:#cal_server_tz#:#Serverns tidszon +dateplaner#:#cal_sess_info#:#Information om sessionen +dateplaner#:#cal_setting_global_crs_act#:#Kurskalender +dateplaner#:#cal_setting_global_crs_act_info#:#I nyskapade kurser är kalendern aktiverad som standard. +dateplaner#:#cal_setting_global_crs_vis#:#Kalenderplatta +dateplaner#:#cal_setting_global_crs_vis_info#:#Kurskalendern visas som standard som ett block på fliken "Innehåll". +dateplaner#:#cal_setting_global_grp_act#:#Gruppens kalender +dateplaner#:#cal_setting_global_grp_act_info#:#I nybildade grupper är kalendern aktiverad som standard. +dateplaner#:#cal_setting_global_grp_vis#:#Kalenderplatta +dateplaner#:#cal_setting_global_grp_vis_info#:#Gruppkalendern visas som standard som ett block på fliken "Innehåll". +dateplaner#:#cal_setting_global_vis_repos#:#Visa i magasinobjekt +dateplaner#:#cal_share#:#Släpp +dateplaner#:#cal_share_accept#:#Acceptera inbjudan +dateplaner#:#cal_share_cal#:#Dela kalender (läs åtkomst) +dateplaner#:#cal_share_cal_editable#:#Dela kalender (läs- och skrivåtkomst) +dateplaner#:#cal_share_decline#:#Avvisa inbjudan +dateplaner#:#cal_share_search_header#:#Dela kalender +dateplaner#:#cal_share_search_role_header#:#Val av roll +dateplaner#:#cal_share_search_usr_header#:#Användarval +dateplaner#:#cal_shared_access_read_only#:# Endast läsbehörighet +dateplaner#:#cal_shared_access_read_write#:#Läs- och skrivåtkomst +dateplaner#:#cal_shared_access_table_col#:#Tillgång +dateplaner#:#cal_shared_calendars#:#Dela kalender (inbjudningar) +dateplaner#:#cal_shared_header#:#Dela kalender för +dateplaner#:#cal_shared_selected_usr#:#Kalendern har släppts för de valda användarna/rollerna. +dateplaner#:#cal_show_weeks#:#Visa veckokolumn +dateplaner#:#cal_show_weeks_info#:#Visar veckorna i sidblocket "Kalender". +dateplaner#:#cal_start#:#Start +dateplaner#:#cal_subscription#:#Prenumerera +dateplaner#:#cal_subscription_header#:#Kalenderadress +dateplaner#:#cal_subscription_info#:#Använd någon av följande adresser för att komma åt din kalender från andra program. Du kan kopiera och klistra in den här adressen i vilken kalender som helst som stöder iCal-formatet. Google Kalender har inte stöd för iCal-filer som är större än 1 MB. N +dateplaner#:#cal_subscription_url#:#URL för kalender +dateplaner#:#cal_sync_cache#:#Utnämningscache +dateplaner#:#cal_sync_cache_info#:#Om aktiverat uppdateras kalendermöten endast var x:e minut för synkronisering med externa kalendrar. +dateplaner#:#cal_sync_disabled#:#Avstängd +dateplaner#:#cal_sync_enabled#:#Kopplad på +dateplaner#:#cal_table_categories#:#Urval av kalender +dateplaner#:#cal_task_completion#:#Komplettering +dateplaner#:#cal_third#:#Tredjedelar +dateplaner#:#cal_time_format_info#:#Välj ett format för inmatning och visning av tiden. +dateplaner#:#cal_timezone_info#:#Välj närmaste stad i din tidszon för att visa möten i ILIAS. +dateplaner#:#cal_type_crs#:#Kurskalender +dateplaner#:#cal_type_exc#:#Träningskalender +dateplaner#:#cal_type_grp#:#Gruppens kalender +dateplaner#:#cal_type_info#:#Välj kalendertyp. "Offentliga kalendrar" är synliga för alla användare. +dateplaner#:#cal_type_local#:#Lokal kalender +dateplaner#:#cal_type_personal#:#Privat kalender +dateplaner#:#cal_type_remote#:#Webbkalender +dateplaner#:#cal_type_rl#:#Platsen för kalendern +dateplaner#:#cal_type_sess#:#Möteskalender +dateplaner#:#cal_type_system#:#Publik kalender +dateplaner#:#cal_type_tals#:#Talks +dateplaner#:#cal_unshare#:#End release +dateplaner#:#cal_unshare_cal#:#End release +dateplaner#:#cal_unshared_selected_usr#:#Frigivningen för de utvalda användarna/rollerna har avslutats. +dateplaner#:#cal_upcoming_events_header#:#Framtida datum +dateplaner#:#cal_user_date_format#:#Datumformat för indata +dateplaner#:#cal_user_notification#:#Individuell anmälan +dateplaner#:#cal_user_notification_info#:#Ett e-postmeddelande med information om mötet kommer att skickas till de ILIAS-inloggningsnamn eller e-postadresser som anges här. +dateplaner#:#cal_user_settings#:#Inställningar för kalender +dateplaner#:#cal_user_time_format#:#Tidsformat +dateplaner#:#cal_user_timezone#:#ILIAS tidszon +dateplaner#:#cal_usr_info#:#Information om mötet +dateplaner#:#cal_usr_show_weeks#:#Visa veckokolumn +dateplaner#:#cal_usr_show_weeks_info#:#Visar veckorna i sidblocket "Kalender". +dateplaner#:#cal_webcal_sync#:#Synkronisering av externa kalendrar +dateplaner#:#cal_webcal_sync_info#:#Om aktiverat synkroniseras externa kalendrar var x:e timme. +dateplaner#:#cal_week_abbrev#:#KW +dateplaner#:#cal_week_month_view#:#Inställningar för vecka/månad +dateplaner#:#cal_week_overview#:#Veckovis översikt +dateplaner#:#cal_week_s#:#Vecka(r) +dateplaner#:#cal_week_selection#:#Veckovis urval +dateplaner#:#cal_week_start#:#Start på veckan +dateplaner#:#cal_weekday#:#Veckodag +dateplaner#:#cal_weekly#:#Veckovis +dateplaner#:#cal_where#:#Plats +dateplaner#:#cal_year_s#:#År +dateplaner#:#cal_yearly#:#Årlig +dateplaner#:#created#:#skapad på +dateplaner#:#crs_cal_activation_end#:#Kursens slut +dateplaner#:#crs_cal_activation_start#:#Kursstart +dateplaner#:#crs_cal_end#:#Kursen avslutas +dateplaner#:#crs_cal_reg_end#:#Filing slut +dateplaner#:#crs_cal_reg_start#:#Registrering börjar +dateplaner#:#crs_cal_start#:#Kursen startar +dateplaner#:#date#:#Datum +dateplaner#:#date_format#:#T.M.J H +dateplaner#:#end_date#:#Datum slut +dateplaner#:#err_end_before_start#:#Slutdatumet får inte vara före startdatumet. +dateplaner#:#err_missing_title#:#Vänligen ange en titel. +dateplaner#:#execute#:#Utför åtgärder +dateplaner#:#free#:#fri +dateplaner#:#group#:#Grupp +dateplaner#:#grp_cal_end#:#Gruppen avslutar +dateplaner#:#grp_cal_reg_end#:#Slut på registrering +dateplaner#:#grp_cal_reg_start#:#Start av registrering +dateplaner#:#grp_cal_start#:#Gruppen startar +dateplaner#:#hour#:#timme +dateplaner#:#ical_export#:#iCal export +dateplaner#:#inbox#:#Inmatning +dateplaner#:#keep#:#unchanged +dateplaner#:#keyword#:# nyckelord +dateplaner#:#keywords#:#nyckelord +dateplaner#:#last_change#:# sista ändring på +dateplaner#:#month#:#Månad +dateplaner#:#more#:#vidare +dateplaner#:#of#:#från +dateplaner#:#properties#:#Inställningar +dateplaner#:#r_14#:#Var 14:e dag +dateplaner#:#r_4_weeks#:#Var 4:e vecka +dateplaner#:#remote_pass_info#:#Vänligen ange tillträdesuppgifter i webbkalendern om tillträdet är skyddat. +dateplaner#:#to#:#till +dateplaner#:#today#:#Idag +dateplaner#:#week#:#Vecka +dateplaner#:#wk_short#:#KW +dateplaner#:#year#:#År +dcl#:#add_value#:#Lägg till ny post +dcl#:#dcl_activate_notification#:#Notifiering +dcl#:#dcl_activate_view#:#Aktivera mall för enskild vy +dcl#:#dcl_add#:#Skapa datainsamling +dcl#:#dcl_add_new_field#:#Lägg till fält +dcl#:#dcl_add_new_record#:#Lägg till post +dcl#:#dcl_add_new_table#:#Lägg till ny tabell +dcl#:#dcl_add_new_view#:#Lägg till ny vy +dcl#:#dcl_add_perm#:#Lägg till ny post +dcl#:#dcl_add_perm_desc#:#Användare kan skapa poster i den här tabellen. +dcl#:#dcl_additional_info_desc#:#Texten visas direkt ovanför tabellen. +dcl#:#dcl_all_entries#:#Alla poster +dcl#:#dcl_any#:#Alla +dcl#:#dcl_asc#:#Stigande ordning (ASC) +dcl#:#dcl_boolean#:#Kryssruta +dcl#:#dcl_boolean_desc#:#Valfält för "tillämplig"/"ej tillämplig +dcl#:#dcl_cant_delete_last_table#:#Tabellen i sig kan inte raderas eftersom det är den enda tabellen i denna datainsamling. Innehållet och strukturen i tabellen raderades dock framgångsrikt. +dcl#:#dcl_change_notification_dcl_delete_record#:#Följande post har tagits bort +dcl#:#dcl_change_notification_dcl_new_record#:#Följande post har skapats +dcl#:#dcl_change_notification_dcl_update_record#:#Följande post har uppdaterats +dcl#:#dcl_change_notification_link#:#Gå till datainsamling +dcl#:#dcl_change_notification_subject#:#Datainsamlingen "%s" har redigerats. +dcl#:#dcl_change_why_you_receive_this_email#:#Du får detta meddelande eftersom du har aktiverat anmälningsfunktionen för ovanstående datainsamling. +dcl#:#dcl_changed_by#:#Sista ändring av +dcl#:#dcl_checked#:#Vald +dcl#:#dcl_comments#:#Kommentarer +dcl#:#dcl_comments_desc#:#Visar antalet kommentarer per post. +dcl#:#dcl_configuration_complete#:#Konfiguration slutförd +dcl#:#dcl_confirm_delete_detailed_view_text#:#Mallen för enkel vy är oåterkalleligen borttagen. Använda fält och deras poster finns dock kvar. +dcl#:#dcl_confirm_delete_detailed_view_title#:#Delete template for single view really? +dcl#:#dcl_confirm_delete_field#:#Vill du verkligen ta bort det här fältet? +dcl#:#dcl_confirm_delete_fields#:#Vill du verkligen ta bort dessa fält? +dcl#:#dcl_confirm_delete_record#:#Vill du verkligen ta bort den här posten? +dcl#:#dcl_confirm_delete_records#:#Är du säker på att du vill radera följande poster? +dcl#:#dcl_confirm_delete_table#:#Vill du verkligen radera denna tabell inklusive innehåll och struktur? +dcl#:#dcl_confirm_storing_records#:#Kontrollera detaljerna innan du sparar. +dcl#:#dcl_confirm_storing_records_no_permission#:#Du har ingen rätt att redigera inspelningen igen senare. +dcl#:#dcl_copy#:#Kopiering av datainsamling +dcl#:#dcl_create_date#:#Datum för skapande +dcl#:#dcl_create_entry_rules#:#Skapande av ingång +dcl#:#dcl_create_field#:#Lägg till fält +dcl#:#dcl_create_fields#:#Klicka på en tabell på fliken "Tabeller" och skapa nya fält med knappen "Lägg till fält". +dcl#:#dcl_creation_date#:#Datum för skapande +dcl#:#dcl_creation_date_description#:#Det datum då denna post skapades. +dcl#:#dcl_datatype#:#Typ av data +dcl#:#dcl_date_selection#:#Meny för val av datum +dcl#:#dcl_date_selection_desc#:#Ange alternativ för urval (datum) +dcl#:#dcl_datetime#:#Inmatning av datum +dcl#:#dcl_datetime_desc#:#Datuminmatning via valmeny eller kalender +dcl#:#dcl_deactivate_view#:#Inaktivera mall för enskild vy +dcl#:#dcl_default_sort_field#:#Sortering +dcl#:#dcl_default_sort_field_desc#:#Som standard sorteras tabellen efter det valda fältet. +dcl#:#dcl_default_sort_field_order#:#Sorteringsriktning +dcl#:#dcl_delete_fields#:#Radera fält +dcl#:#dcl_delete_fields_no_selection#:#Minst ett fält måste vara markerat för borttagning +dcl#:#dcl_delete_perm#:#Radera poster +dcl#:#dcl_delete_records#:#Radera poster +dcl#:#dcl_delete_tables#:#Radera tabeller +dcl#:#dcl_delete_tables_no_selection#:#Minst en tabell måste väljas för radering +dcl#:#dcl_delete_views#:# Radera vyer +dcl#:#dcl_delete_views_no_selection#:#Minst en vy måste väljas för radering +dcl#:#dcl_deleted_records#:#%s poster har raderats +dcl#:#dcl_desc#:#Descendent ordning (DESC) +dcl#:#dcl_description#:#Beskrivning +dcl#:#dcl_detailed_view#:#Singelutsikt +dcl#:#dcl_display_action_menu#:#Kopia +dcl#:#dcl_display_record_alt#:#Visa denna post +dcl#:#dcl_edit#:#Redigera datainsamling +dcl#:#dcl_edit_entry_rules#:#Bearbetning av ingångar +dcl#:#dcl_edit_field#:#Redigera fält +dcl#:#dcl_edit_perm#:#Redigera poster +dcl#:#dcl_edit_record#:#Redigera post +dcl#:#dcl_edit_table#:#Tabellinställningar +dcl#:#dcl_editable_in_table_gui#:#En post kan endast bedömas via tabellvyn. +dcl#:#dcl_empty_detailed_view#:#Ta bort mall för enkel vy +dcl#:#dcl_empty_detailed_view_success#:#Mallen har tagits bort framgångsrikt. +dcl#:#dcl_err_formula_field_not_found#:#Fält med titeln '%s' existerar inte +dcl#:#dcl_error_parsing_expression#:#Fel vid utvärdering av uttrycket +dcl#:#dcl_export_enabled#:#Export tabell +dcl#:#dcl_export_enabled_desc#:#Alla användare kan exportera data från själva tabellen. För att göra detta måste fälten väljas individuellt som exportbara i översikten "Fält i den valda tabellen". +dcl#:#dcl_export_finished#:#Export slutförd +dcl#:#dcl_export_started#:#Asynkron export påbörjad +dcl#:#dcl_field_datatype#:#Fält Datatyp +dcl#:#dcl_field_description#:#Beskrivning +dcl#:#dcl_field_required#:#Åtagande +dcl#:#dcl_field_title_change_warning#:#Du har ändrat titeln på fältet. Som ett resultat fungerar motsvarande platshållare i mallen för den individuella vyn inte längre. Du måste fortfarande justera den manuellt. +dcl#:#dcl_field_title_unique#:#Det finns redan ett fält med denna titel. Titeln måste vara unik. +dcl#:#dcl_field_visible#:#Visible +dcl#:#dcl_fieldtitle#:#Fältets titel +dcl#:#dcl_file_format_description#:#Importfilen måste vara i Excel-format .xlsx, med de data som ska importeras på första sidan. Den första raden måste innehålla de exakta namnen på fälten (inklusive versaler) och de följande raderna värdena för de postposter som ska importeras. Vi rekomme +dcl#:#dcl_file_not_readable#:#Filen kunde inte läsas. Vänligen använd filformatet .xlsx. +dcl#:#dcl_fileupload#:#Uppladdning av fil +dcl#:#dcl_fileupload_desc#:#Möjlighet att ladda upp filer som kan laddas ner via länk +dcl#:#dcl_filter#:#Tillgänglig i filter +dcl#:#dcl_filter_changeable#:#Filter utbytbart +dcl#:#dcl_formula#:#Formel +dcl#:#dcl_formula_desc#:#I likhet med kalkylblad kan poster länkas eller beräknas med en formel. +dcl#:#dcl_formula_detail_desc#:#Poster i detta fält genereras automatiskt. Du kan inte göra en post här. +dcl#:#dcl_height#:#Höjd +dcl#:#dcl_hello#:#Hello +dcl#:#dcl_id#:#ID +dcl#:#dcl_id_description#:#Det interna ID:t. +dcl#:#dcl_ilias_reference#:#Objekt i tidningen +dcl#:#dcl_ilias_reference_desc#:#Sökfält för att välja och länka ett objekt i ILIAS +dcl#:#dcl_ilias_reference_link#:#Visas som länk i tabellvy +dcl#:#dcl_import#:#Import av datainsamling +dcl#:#dcl_import_enabled#:#Import tabell +dcl#:#dcl_import_enabled_desc#:#Alla användare kan själva importera data till tabellerna så länge de har rätt skrivbehörighet. +dcl#:#dcl_import_records .xls#:#Excel import +dcl#:#dcl_import_terminated#:#Importen är slutförd. Antal importerade poster +dcl#:#dcl_in_export#:#Exportabel +dcl#:#dcl_invalid_regex_config#:#Det reguljära uttryck som konfigurerats för detta fält är ogiltigt. Kontrollera inställningarna för det här fältet för att åtgärda problemet. +dcl#:#dcl_last_edit_by#:#Senast ändrat av +dcl#:#dcl_last_edited_by#:#Senast ändrat av +dcl#:#dcl_last_edited_by_description#:#Den användare som senast ändrade denna post. +dcl#:#dcl_last_update#:#Sista förändringen +dcl#:#dcl_last_update_description#:#Det datum då denna post senast ändrades. +dcl#:#dcl_learning_progress#:#Visa framsteg i inlärningen +dcl#:#dcl_legend_placeholders#:#platshållare +dcl#:#dcl_length#:#Längd +dcl#:#dcl_length_info#:#Antal tecken som användaren kan ange (max 4000). För mer än 200 tecken, aktivera dessutom alternativet "Flerradigt textinmatningsfält". +dcl#:#dcl_limit_end#:#Slut +dcl#:#dcl_limit_start#:#Start +dcl#:#dcl_limited#:#Tidsbegränsad bearbetning +dcl#:#dcl_limited_desc#:#Användare kan bara lägga till, redigera och ta bort poster fram till det valda datumet. +dcl#:#dcl_link_detail_page#:#Länk till enskild vy +dcl#:#dcl_list_fields#:#Fält +dcl#:#dcl_list_visibility_and_filter#:#Översikt +dcl#:#dcl_locked#:#Låst +dcl#:#dcl_locked_tooltip#:#Ett låst fält kan inte längre redigeras av användare. Gäller inte roller med rättigheten "Redigera inställningar". +dcl#:#dcl_manage#:#Hantering +dcl#:#dcl_max_digits#:#Maximalt antal siffror +dcl#:#dcl_max_import#:#Det högsta tillåtna antalet importerade poster har överskridits. +dcl#:#dcl_max_text_length#:#Maximal längd +dcl#:#dcl_mob#:#media objekt +dcl#:#dcl_mob_desc#:#Möjlighet att ladda upp bild-, ljud- eller videofiler som ska presenteras direkt i datainsamlingen. Tillåtna filtyper +dcl#:#dcl_msg_field_modified#:#Fältet har uppdaterats +dcl#:#dcl_msg_fields_deleted#:#Klargjorda fält +dcl#:#dcl_msg_info_alternatives#:#Den önskade enskilda vyn kunde inte visas eftersom det inte finns någon enskild vy för denna tabellvy eller för att du inte har tillräckliga åtkomsträttigheter. Välj en vy som är tillgänglig för dig från listan för att visa posten ändå. +dcl#:#dcl_msg_mc_to_sc_confirmation#:#Om du växlar från flera urval till ett urval kan det leda till dataförlust för befintliga poster. Är du säker på att du vill fortsätta? +dcl#:#dcl_msg_no_perm_edit#:#Ingen tillåtelse att redigera detta inlägg +dcl#:#dcl_msg_no_perm_view#:#Ingen tillåtelse att visa detta inlägg +dcl#:#dcl_msg_table_created#:#Tabell skapad +dcl#:#dcl_msg_table_edited#:#Bordsinställningarna har sparats. +dcl#:#dcl_msg_tables_delete_all#:#Delete inte möjligt +dcl#:#dcl_msg_tables_deleted#:#Tabeller borttagna +dcl#:#dcl_msg_tableview_created#:#Visa tillagd +dcl#:#dcl_msg_tableview_deleted#:#Visa raderade +dcl#:#dcl_msg_tableview_updated#:#Visa uppdaterad +dcl#:#dcl_msg_tableviews_delete_all#:#Delete inte möjligt +dcl#:#dcl_msg_tableviews_deleted#:#Vyer raderade +dcl#:#dcl_msg_tableviews_order_updated#:#Avvikande åsikter uppdaterade +dcl#:#dcl_multiple_selection#:#Multipelt urval +dcl#:#dcl_new#:#Skapa ny datainsamling +dcl#:#dcl_new_field#:#Nytt fält +dcl#:#dcl_new_table#:#Ny tabell +dcl#:#dcl_next_record#:#Nästa post +dcl#:#dcl_no_content_warning#:#Attention, datainsamlingen är redan online, men har inget innehåll ännu! +dcl#:#dcl_no_entry#:#Ingen post +dcl#:#dcl_no_export_content_available#:#Inga data tillgängliga för export. +dcl#:#dcl_no_export_data_available#:#Inga data eller fält tillgängliga för export. +dcl#:#dcl_no_export_fields_available#:#Inga fält aktiverade för export. Markera minst ett fält som "Exportable" i tabellinställningarna. +dcl#:#dcl_no_fields_yet#:#Inga fält har skapats för denna tabell ännu, så inga poster kan infogas ännu. +dcl#:#dcl_no_read_access_on_any_standard_view#:#Du har inte läsbehörighet till någon standardtabellvy. +dcl#:#dcl_no_search_results_found_for#:#Inga moduler hittades med +dcl#:#dcl_no_such_reference#:#Följande värde finns inte i referenstabellen +dcl#:#dcl_no_warnings#:#Importen slutfördes utan problem. +dcl#:#dcl_not_checked#:#Inte vald +dcl#:#dcl_not_supported_in_import#:#Den här fälttypen stöds inte under import. +dcl#:#dcl_notification_activate_dcl#:# Aktivera avisering +dcl#:#dcl_notification_activated#:#Notifiering aktiv +dcl#:#dcl_notification_deactivate_dcl#:#Avaktivera avisering +dcl#:#dcl_notification_deactivated#:#Notifiering inaktiv +dcl#:#dcl_notification_info#:#Aktiverar den individuella meddelandefunktionen för användare. +dcl#:#dcl_notimage_exception#:#Filen måste vara en bild. +dcl#:#dcl_noturl_exception#:#Ange en länk (som börjar med http +dcl#:#dcl_number#:#Integers +dcl#:#dcl_number_desc#:#Inmatningsfält för hela tal (högst 9 siffror). Bråk och decimaltal är inte tillåtna. +dcl#:#dcl_online_info#:#Endast när datainsamlingen är online kan användarna se och använda datainsamlingen. +dcl#:#dcl_order#:#Sortering +dcl#:#dcl_own_entries#:#Endast egna poster +dcl#:#dcl_owner#:#Own entry by ###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +dcl#:#dcl_owner_description#:#Own entries always remain visible.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +dcl#:#dcl_owner_name#:#Possessed by (namn) +dcl#:#dcl_page_type_dclf#:#Detaljerad vy +dcl#:#dcl_permissions_form#:#Tillstånd för denna tabell +dcl#:#dcl_please_select#:#--- Vänligen välj --- +dcl#:#dcl_plugin#:#Plugin +dcl#:#dcl_plugin_desc#:#DataCollection Fälttillägg +dcl#:#dcl_plugin_hooks#:#Tillgängliga tillägg +dcl#:#dcl_plugin_no_hooks_available#:#Inga aktiva plugins för fälttyp hittades +dcl#:#dcl_prev_record#:#Tidigare post +dcl#:#dcl_prop_expression#:#Uttryck +dcl#:#dcl_prop_expression_info#:#Giltiga operatorer +dcl#:#dcl_public_comments#:#Kommentarer +dcl#:#dcl_public_comments_desc#:#Användare kan kommentera poster i denna tabell +dcl#:#dcl_rating#:#Rating +dcl#:#dcl_rating_desc#:#Användare kan betygsätta bidrag med upp till fem stjärnor. +dcl#:#dcl_rbac_roles_without_read_access_on_any_standard_view#:#Följande RBAC-roller har läsåtkomst till datainsamlingen, men inte till någon standardvy av tabellerna +dcl#:#dcl_record#:#inträde +dcl#:#dcl_record_deleted#:#Ingång raderad +dcl#:#dcl_record_from_total#:#%d från %d +dcl#:#dcl_reference#:#Hänvisning +dcl#:#dcl_reference_desc#:#Ange urvalsalternativ som underhålls i ett annat fält i en tabell +dcl#:#dcl_reference_link#:#Visa som en länk till den refererade posten +dcl#:#dcl_reference_link_info#:#Mallen för enkelvisning måste vara aktiv i den refererade tabellen. +dcl#:#dcl_reference_title#:#Hänvisning till tabell och fält +dcl#:#dcl_regex#:#Regelbundet uttryck +dcl#:#dcl_regex_info#:#Inmatning utan separatorsymbol/avgränsare +dcl#:#dcl_required#:#Åtagande +dcl#:#dcl_row_not_found#:# - Detta fält hittades inte i tabellen. +dcl#:#dcl_save#:#Spara +dcl#:#dcl_save_confirmation#:#Spara bekräftelse +dcl#:#dcl_save_confirmation_desc#:#Användaren måste bekräfta inmatningen av nya dataposter +dcl#:#dcl_save_order#:#Sortera Spara +dcl#:#dcl_save_record#:#Spara post +dcl#:#dcl_select#:#Välja tabell +dcl#:#dcl_selection_options#:#Alternativ +dcl#:#dcl_selection_type#:#Typ +dcl#:#dcl_selection_type_combobox#:#Enkelt urval (rullgardinsmeny) +dcl#:#dcl_selection_type_multi#:#Multipelt urval +dcl#:#dcl_selection_type_single#:#Enkelt urval (lista) +dcl#:#dcl_simulate_import#:#Simulera import +dcl#:#dcl_simulate_info#:#Detta skapar inga dataposter, utan ger bara feedback om fel i importfilen. Detta hjälper dig att undvika felaktiga importer. +dcl#:#dcl_skipped_delete_records#:#%s poster raderades inte på grund av rättighetsinställningarna +dcl#:#dcl_status#:#Din status +dcl#:#dcl_std_field_not_importable#:# - Standardfält kan inte importeras. +dcl#:#dcl_std_filter#:#Filter förinställt +dcl#:#dcl_supported_filetypes#:#Tillåtna filtillägg +dcl#:#dcl_supported_filetypes_desc#:#Du kan ange kommaseparerade filnamnstillägg här. Till exempel +dcl#:#dcl_table#:#Tabell +dcl#:#dcl_table_create#:#Skapa tabell +dcl#:#dcl_table_edit#:#Spara +dcl#:#dcl_table_id#:#Tabeller ID +dcl#:#dcl_table_info#:#I det följande definierar du vad användare som har "Enter"-rättigheten för datainsamlingen får göra i den här tabellen. +dcl#:#dcl_table_info_title#:#Info +dcl#:#dcl_table_list_fields#:#Fält i den valda tabellen +dcl#:#dcl_table_list_tables#:#Tillgängliga tabeller +dcl#:#dcl_table_settings_saved#:#Bordsinställningarna har sparats. +dcl#:#dcl_table_title_not_matching#:#Titlarna på Excel-arbetsbladet och tabellen i datainsamlingen stämmer inte överens. Byt namn på kalkylbladet för att utföra en korrekt import. +dcl#:#dcl_table_title_unique#:#Det finns redan en tabell med denna titel. Titeln måste vara unik. +dcl#:#dcl_tables#:#Tabeller +dcl#:#dcl_tables_confirm_delete#:#Är du säker på att följande tabeller ska raderas? +dcl#:#dcl_tableview#:#Visa +dcl#:#dcl_tableview_add#:#Lägg till ny vy +dcl#:#dcl_tableview_confirm_delete#:#Är du säker på att du vill ta bort följande vy? +dcl#:#dcl_tableview_copy#:#Vyn har kopierats framgångsrikt +dcl#:#dcl_tableview_default_value#:#standardvärde +dcl#:#dcl_tableview_default_value_fail#:#Vissa numeriska standardvärden kunde inte kopieras eftersom det fanns tecken i dem. Vänligen försök igen. +dcl#:#dcl_tableview_field_access#:#Access rätt +dcl#:#dcl_tableview_fieldsettings#:#Fältspecifika inställningar +dcl#:#dcl_tableview_fieldtitle#:#Fältets titel +dcl#:#dcl_tableview_locked#:#Låst +dcl#:#dcl_tableview_locked_visible#:#Låst och synligt +dcl#:#dcl_tableview_not_visible#:#Inte synlig +dcl#:#dcl_tableview_required#:#Åtagande +dcl#:#dcl_tableview_required_visible#:#Engagerad och synlig +dcl#:#dcl_tableview_visible#:#Visible +dcl#:#dcl_tableviews#:#Vyer +dcl#:#dcl_tableviews_confirm_delete#:#Är du säker på att du vill ta bort följande visningar? +dcl#:#dcl_tableviews_table#:#Vyer av den valda tabellen +dcl#:#dcl_text#:# Textinmatning +dcl#:#dcl_text_area#:#Inmatningsfält för text med flera linjer +dcl#:#dcl_text_desc#:#Inmatningsfält för text, länkar eller e-postadresser +dcl#:#dcl_text_email_detail_desc#:#Var god ange en giltig e-postadress eller URL. +dcl#:#dcl_text_email_title#:#Titel +dcl#:#dcl_text_email_title_info#:#Titel för URL-adressen eller e-postadressen (valfritt). +dcl#:#dcl_text_selection#:#Välj menytext +dcl#:#dcl_text_selection_desc#:#Ange alternativ för urval (text) +dcl#:#dcl_title_standardview#:#Standardvy +dcl#:#dcl_unique#:#Förhindra samma inmatningar +dcl#:#dcl_unique_desc#:#En identisk post kan endast göras en gång i detta fält. +dcl#:#dcl_unique_exception#:#Det angivna värdet används redan av en annan post. +dcl#:#dcl_unknown_exception#:#Det angivna värdet är inte giltigt. +dcl#:#dcl_update_field#:#Uppdatera fält +dcl#:#dcl_update_record#:#Uppdatera inmatning +dcl#:#dcl_url#:#URL eller e-post +dcl#:#dcl_view_configuration#:#Visa konfiguration +dcl#:#dcl_view_own_records_perm#:#Visa endast egna poster +dcl#:#dcl_view_settings#:#Visa inställningar +dcl#:#dcl_view_viewdefinition#:#Mall för enskild vy +dcl#:#dcl_visible#:#Synlig för alla användare +dcl#:#dcl_visible_desc#:#Users har tillgång till denna tabell. +dcl#:#dcl_width#:#Bredd +dcl#:#dcl_wrong_input_type#:#Den inmatade texten stämmer inte överens med typen av fält (Fel typ). +dcl#:#dcl_wrong_length#:#Den angivna texten är för lång. +dcl#:#dcl_wrong_regex#:#Den inmatade texten stämmer inte överens med specifikationen för detta fält (reguljärt uttryck). +dcl#:#dlc_xls_async_export#:#Asynkron XLSX-export +dcl#:#fieldtitle_allow_chars#:#Inte tillåtna tecken +didactic#:#activate_exclusive_template#:#Grå ut standard +didactic#:#activate_exclusive_template_info#:#Standardmallen är gråmarkerad när denna didaktiska mall är aktiv. +didactic#:#activate_local_didactic_template#:#Validitetsintervall +didactic#:#activate_local_didactic_template_info#:#Användningen av de didaktiska mallarna kommer att begränsas till underavsnitt i tidningen. +didactic#:#didactic_activated_msg#:#De valda didaktiska mallarna har aktiverats. +didactic#:#didactic_adm_tab#:#Didaktiska mallar +didactic#:#didactic_applicable_for#:#Tillämplig på +didactic#:#didactic_auto_generated#:#Automatiskt genererad +didactic#:#didactic_available_templates#:#Tillgängliga didaktiska mallar +didactic#:#didactic_back_to_overview#:#Tillbaka till översikten +didactic#:#didactic_cannot_delete_auto_generated#:#Att radera automatiskt genererade didaktiska mallar är inte tillåtet. +didactic#:#didactic_cannot_delete_auto_generated_confirmation#:#Minst en av de valda didaktiska mallarna är automatiskt genererad och kan därför inte tas bort. +didactic#:#didactic_confirm_apply_new_template#:#Är du säker på att du vill använda den här didaktiska mallen? Alla rättighetsjusteringar kommer att skrivas över och anpassas till den nya didaktiska mallen. +didactic#:#didactic_confirm_delete_msg#:#Är du säker på att följande didaktiska mallar bör tas bort? +didactic#:#didactic_copy_suc_message#:#Den didaktiska mallen kopierades +didactic#:#didactic_deactivated_msg#:#De valda didaktiska mallarna har avaktiverats. +didactic#:#didactic_default_type#:#Standard +didactic#:#didactic_default_type_info#:#Rättsspecifikationerna för respektive roll tillämpas. +didactic#:#didactic_delete_msg#:#De valda didaktiska mallarna har tagits bort. +didactic#:#didactic_do_export#:#Export +didactic#:#didactic_edit_tpl#:#Redigera didaktisk mall +didactic#:#didactic_filter_with_icon#:#med symbol +didactic#:#didactic_filter_without_icon#:#Utan symbol +didactic#:#didactic_global#:#Global +didactic#:#didactic_icon#:#Icon +didactic#:#didactic_icon_error#:#Ikoner kan endast användas för containerobjekt. +didactic#:#didactic_icon_info#:#Ikonen visas för alla objekt som tillämpar dessa mallar. "Anpassade ikoner" för objekten skriver över ikonen för mallen. Ikoner kan endast konfigureras för behållarobjekt (t.ex. kurs och kategorier). +didactic#:#didactic_import_btn#:#Importera didaktisk mall +didactic#:#didactic_import_failed#:#Den didaktiska mallen kunde inte importeras +didactic#:#didactic_import_success#:#Den didaktiska mallen importerades framgångsrikt +didactic#:#didactic_import_table_title#:#Import av en didaktisk mall +didactic#:#didactic_install_info#:#Allmän information +didactic#:#didactic_local#:#Lokalt +didactic#:#didactic_not_changed#:#Den aktiva didaktiska mallen ändrades inte. +didactic#:#didactic_scope#:#Validitetsintervall +didactic#:#didactic_scope_list_header#:#Begränsad till +didactic#:#didactic_selected_tpl_option#:#Tillämpad didaktisk mall +didactic#:#didactic_template_applied#:#Den didaktiska mallen tillämpades. +didactic#:#didactic_template_update_import#:#Uppdatering av didaktiska mallar +didactic#:#didactic_template_update_import_info#:#Alla egenskaper justeras enligt importfilen. Objekt som redan använder inställningarna i denna mall ändras inte. +didactic#:#dtpl_obj_type_info#:#Anger den objekttyp som denna didaktiska mall kan tillämpas på. +didactic#:#effective_form#:#Template effektiv från +didactic#:#grp_closed#:#Sluten grupp +didactic#:#grp_closed_info#:#Gruppen är osynlig för icke-medlemmar. +didactic#:#more_translations#:#Andra översättningar +didactic#:#sess_closed#:#Avslutad session +didactic#:#sess_closed_info#:#Sessionen är osynlig för icke-deltagare. +ecs#:#cert_serial#:#Certifikatets serienummer +ecs#:#ecs_abr#:#Abkortning +ecs#:#ecs_account_duration#:#Förlängning av aktiveringstiden +ecs#:#ecs_account_duration_info#:#Aktiveringstiden för nya ECS-användare är begränsad till sessionens varaktighet. Endast när de antas till en kurs förlängs slutet på aktiveringstiden. +ecs#:#ecs_activate#:#Aktivera +ecs#:#ecs_active#:#Aktivera ECS-funktioner +ecs#:#ecs_active_header#:#Export/Import tillåten +ecs#:#ecs_add_new_ecs#:#Lägg till ny ECS +ecs#:#ecs_apache_pass#:# Lösenord +ecs#:#ecs_apache_user#:#Login name###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +ecs#:#ecs_approval_rcp#:#Notifieringar om kursreleaser +ecs#:#ecs_approval_rcp_info#:#Ange här, kommaseparerat, ett eller flera inloggningsnamn för att bli meddelad via e-post om nya kursversioner.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +ecs#:#ecs_attribute_name#:#Attributets namn +ecs#:#ecs_auth_type#:#Typ av autentisering +ecs#:#ecs_auth_type_apache#:#Login namn/Passord###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +ecs#:#ecs_auth_type_cert#:#Certifikat baserat +ecs#:#ecs_availability#:#Tillgänglighet +ecs#:#ecs_available_ecs#:#Tillgänglig ECS +ecs#:#ecs_back_settings#:#ECS-inställningar +ecs#:#ecs_ca_cert#:#CA Certifikat +ecs#:#ecs_campus_connect_title#:#Uppdrag inom CampusConnect +ecs#:#ecs_cat_export#:#Kategori utgåvor +ecs#:#ecs_cat_export_disabled#:#Inte släppa +ecs#:#ecs_cat_export_enabled#:#Släpp +ecs#:#ecs_cat_export_obj_settings#:#Inställningar för kategoriutgåvor +ecs#:#ecs_cat_mapping_by_type#:#Efter typ +ecs#:#ecs_cat_mapping_by_type_info#:#Välj denna inställning för att tilldela efter objekttyp. +ecs#:#ecs_cat_mapping_duration#:#Tidsram +ecs#:#ecs_cat_mapping_duration_info#:#Välj denna inställning för att tilldela ECS-kurser till specifika kategorier, t.ex. baserat på deras startdatum. +ecs#:#ecs_cat_mapping_fixed#:#Fasta värden +ecs#:#ecs_cat_mapping_fixed_info#:#Välj denna inställning för att tilldela med fasta värden. Flera värden kan anges separerade med kommatecken. +ecs#:#ecs_cat_mapping_type#:#Typ av uppdrag +ecs#:#ecs_cat_mapping_values#:#Attributets värde +ecs#:#ecs_category_mapping#:#Tilldelning till kategorier +ecs#:#ecs_cc_mapping_overview#:#Översikt över uppdrag +ecs#:#ecs_cert_key#:#Certifikat nyckel +ecs#:#ecs_cert_valid_until#:#Certifikatet är giltigt till +ecs#:#ecs_check_import_id#:#Kontrollera inställningen för import-ID. +ecs#:#ecs_client_cert#:#Klientcertifikat +ecs#:#ecs_cmap_add_attribute_btn#:#Lägg till attribut +ecs#:#ecs_cmap_all_in_one#:#Kurser i en kategori +ecs#:#ecs_cmap_all_in_one_cat#:#Kurs kategori +ecs#:#ecs_cmap_all_in_one_info#:#Ange den kategori i vilken alla kurser ska skapas. Kurslänkar kommer att skapas i alla andra kategorier, om tillämpligt. +ecs#:#ecs_cmap_att_courseType#:#Typ av händelse +ecs#:#ecs_cmap_att_degreeProgramme#:#Studiekurs +ecs#:#ecs_cmap_att_lecturer#:#Lärare +ecs#:#ecs_cmap_att_module#:#Modul +ecs#:#ecs_cmap_att_organisation#:#Organisation +ecs#:#ecs_cmap_att_orgunit#:#Organisatorisk enhet +ecs#:#ecs_cmap_att_term#:#Semester +ecs#:#ecs_cmap_att_title#:#Händelsens titel +ecs#:#ecs_cmap_att_venue#:#Plats +ecs#:#ecs_cmap_attributes#:#Attribut +ecs#:#ecs_cmap_atts_table#:#Konfiguration av uppdragets attribut +ecs#:#ecs_cmap_def_cat#:#Standardkategori +ecs#:#ecs_cmap_def_cat_info#:#Ange den kategori i vilken kurser ska skapas som inte kan tilldelas via befintliga regler. +ecs#:#ecs_cmap_delete_attribute_btn#:#Ta bort det sista attributet +ecs#:#ecs_cmap_delete_rule#:#Ta bort uppdrag +ecs#:#ecs_cmap_enable#:#Kursuppgift +ecs#:#ecs_cmap_form_all_values#:#Alla värden +ecs#:#ecs_cmap_form_create_subdirs#:#Skapa underkataloger +ecs#:#ecs_cmap_form_current_dir#:#Aktuell katalog +ecs#:#ecs_cmap_form_dir_relation#:#Hänvisning till katalog +ecs#:#ecs_cmap_form_filter#:#Inställningar för filter +ecs#:#ecs_cmap_form_filter_by_values#:#Filtrera efter attributvärden +ecs#:#ecs_cmap_form_filter_info#:#Manuell(a) värde(n), åtskilda med kommatecken. +ecs#:#ecs_cmap_form_subdir_name#:#Namn på underkatalog +ecs#:#ecs_cmap_form_subdir_type#:# Titel på underkatalog +ecs#:#ecs_cmap_form_subdir_value#:#Värde för underkatalog +ecs#:#ecs_cmap_mapping_form_title#:#Kursuppgift för kategori +ecs#:#ecs_cmap_multiple_atts#:#Allokering enligt attribut +ecs#:#ecs_cmap_overview#:#Översikt över uppdrag +ecs#:#ecs_cms_dir_tree#:#CMS katalogträd +ecs#:#ecs_cms_directory_trees_tbl#:#CMS katalogträd +ecs#:#ecs_cms_id#:#Root ID i Campus Management System +ecs#:#ecs_cms_tree_deleted#:#Uppdragen till campusförvaltningens träd har tagits bort +ecs#:#ecs_cms_tree_synchronize#:#Synkronisera +ecs#:#ecs_cms_tree_synchronized#:#Trädet har synkroniserats. +ecs#:#ecs_communities#:#Deltagare +ecs#:#ecs_confirm_delete_tree#:#Vill du verkligen ta bort alla tilldelningar till detta CMS-träd? +ecs#:#ecs_connection_settings#:#Anslutningsdata +ecs#:#ecs_cron_task_scheduler#:#Utföra ECS-uppgifter +ecs#:#ecs_cron_task_scheduler_info#:#Om aktiverat, utförs ECS-uppgifter regelbundet. Detta är endast möjligt om en ECS-server är aktiverad under "Administration " Utöka ILIAS " ECS". +ecs#:#ecs_crs_alloc#:#Kursuppgifter +ecs#:#ecs_crs_alloc_set#:#Redigera kursuppgifter +ecs#:#ecs_crs_export#:#Kursreleaser +ecs#:#ecs_crs_export_disabled#:#Inte släppa +ecs#:#ecs_crs_export_enabled#:#Släpp +ecs#:#ecs_crs_export_obj_settings#:#Inställningar för kursutgåvor +ecs#:#ecs_deactivate#:#Avaktivera +ecs#:#ecs_delete_setting#:#Är du säker på att du vill ta bort följande ECS? +ecs#:#ecs_deprecated_token#:#Stöd för föråldrade autentiseringstoken +ecs#:#ecs_deprecated_token_info#:#Ger stöd för föråldrade autentiseringstoken (t.ex. för ILIAS-installationer av version 4.x). +ecs#:#ecs_dir_alloc#:#Direkttilldelningar +ecs#:#ecs_dir_alloc_set#:#Redigera mappningar av kataloger +ecs#:#ecs_dns#:#Domännamn +ecs#:#ecs_duration#:#Varaktighet +ecs#:#ecs_econ_rcp#:#Notifieringar om externa kurser +ecs#:#ecs_econ_rcp_info#:#Ange här, kommaseparerat, ett eller flera inloggningsnamn för att bli meddelad via e-post om nya externa kurser.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +ecs#:#ecs_edit_category_mapping#:#Redigera uppdrag +ecs#:#ecs_email#:#E-post +ecs#:#ecs_enable_participant#:#Tillåt import och export av kurser +ecs#:#ecs_err_invalid_by_type#:#Välj en objekttyp att tilldela i efterhand. +ecs#:#ecs_err_invalid_dates#:#Startdatumet måste vara före slutdatumet. Vänligen kontrollera din post. +ecs#:#ecs_err_invalid_type#:#Var god ange ett giltigt ID för kategorins objekt. +ecs#:#ecs_err_missing_value#:#Kontrollera dina poster för attributvärden. +ecs#:#ecs_error_extract_serial#:#Fel vid läsning av certifikatets serienummer. Vänligen kontrollera klientcertifikatet. +ecs#:#ecs_event_appointment#:#Händelsedatum +ecs#:#ecs_export#:#Kursreleaser +ecs#:#ecs_export_created_body_a#:#En ny kurs har släppts +ecs#:#ecs_export_disabled#:#Inte släppa +ecs#:#ecs_export_enabled#:#Släpp +ecs#:#ecs_export_obj_settings#:#Inställningar för kursutgåvor +ecs#:#ecs_export_types#:#Exporterbara objekttyper +ecs#:#ecs_field_begin#:#Startdatum +ecs#:#ecs_field_community#:#Gemenskap +ecs#:#ecs_field_courseID#:#Händelse-ID +ecs#:#ecs_field_courseType#:#Typ av händelse +ecs#:#ecs_field_credits#:#Krediter +ecs#:#ecs_field_cycle#:#Cycle +ecs#:#ecs_field_day#:#Tag +ecs#:#ecs_field_end#:#Sista datum +ecs#:#ecs_field_lecturer#:#Leadership###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +ecs#:#ecs_field_part_id#:#Deltagarens ID +ecs#:#ecs_field_room#:#Rymd +ecs#:#ecs_field_semester_hours#:#Semester timmar per vecka +ecs#:#ecs_field_start#:#Startdatum +ecs#:#ecs_field_study_courses#:#Studier +ecs#:#ecs_field_term#:#Semester +ecs#:#ecs_field_time#:#Tid +ecs#:#ecs_file_export#:#Fil aktier +ecs#:#ecs_file_export_disabled#:#Inte släppa +ecs#:#ecs_file_export_enabled#:#Släpp +ecs#:#ecs_file_export_obj_settings#:#Inställningar för fildelning +ecs#:#ecs_general_info#:#Allmän information +ecs#:#ecs_glo_export#:#Glossary utgåvor +ecs#:#ecs_glo_export_disabled#:#Inte släppa +ecs#:#ecs_glo_export_enabled#:#Släpp +ecs#:#ecs_glo_export_obj_settings#:#Inställningar för publicering av ordlistor +ecs#:#ecs_global_role_info#:#Välj en global roll som nya ECS-användare ska tilldelas. +ecs#:#ecs_grp_export#:#Gruppens aktier +ecs#:#ecs_grp_export_disabled#:#Inte släppa +ecs#:#ecs_grp_export_enabled#:#Släpp +ecs#:#ecs_grp_export_obj_settings#:#Inställningar för gruppaktier +ecs#:#ecs_ignore_field#:#Uppdatera inte detta fält +ecs#:#ecs_import#:#Externa kurser +ecs#:#ecs_import_cms#:#Campusförvaltning +ecs#:#ecs_import_id#:#Import ID +ecs#:#ecs_import_id_info#:#Ange ID för den kategori i vilken nya ECS-objekt ska skapas. +ecs#:#ecs_import_types#:#Objekttyper som inte kan importeras +ecs#:#ecs_imported_content#:#Importerade material +ecs#:#ecs_imported_from#:#Importerad från +ecs#:#ecs_invalid_import_type_cms#:#Du kan bara välja importtypen "Campus Management" för högst en deltagare. +ecs#:#ecs_key_password#:#Nyckelord +ecs#:#ecs_lm_export#:#lanseringar av utbildningsmoduler +ecs#:#ecs_lm_export_disabled#:#Inte släppa +ecs#:#ecs_lm_export_enabled#:#Släpp +ecs#:#ecs_lm_export_obj_settings#:#Inställningar för lanseringar av lärmoduler +ecs#:#ecs_local_information#:#Ytterligare information +ecs#:#ecs_local_settings#:#Lokala inställningar +ecs#:#ecs_mapping_crs#:#Uppgifter för kurser +ecs#:#ecs_mapping_exp_tbl#:#Tilldelning av utökade metadata till ECS-data +ecs#:#ecs_mapping_rcrs#:#Uppgift för ECS-kurser +ecs#:#ecs_mapping_tbl#:#Mappning av ECS-data till utökade metadata +ecs#:#ecs_mappings#:#Tilldelning av ECS-data +ecs#:#ecs_member_auth_type#:#Autentiseringssätt för deltagarna +ecs#:#ecs_meta_data#:#Metadata +ecs#:#ecs_new_approval_subject#:#En ny kurs har släppts +ecs#:#ecs_new_category_mapping#:#Ny regel för tilldelning av importerade ECS-kurser till kategorier +ecs#:#ecs_new_econtent_subject#:#Ny ECS-kurs +ecs#:#ecs_new_user_body#:#En ny ECS-användare har skapats. +ecs#:#ecs_new_user_profile#:#Profiluppgifter +ecs#:#ecs_new_user_subject#:#Nya ECS-användare +ecs#:#ecs_no_adv_md#:#Det finns inga utökade metadata tillgängliga. Därför kan ingen tilldelning göras. +ecs#:#ecs_no_owner#:#Välj under vilken community du vill publicera denna kurs. +ecs#:#ecs_no_value#:#Inte specificerat +ecs#:#ecs_node_mapping_activate#:# Aktivera mappning av kataloger +ecs#:#ecs_node_mapping_create_empty#:#Skapa endast kategorier som innehåller kurser +ecs#:#ecs_node_mapping_create_empty_info#:#Används endast i samband med kursuppgifter (detta aktiveras automatiskt). +ecs#:#ecs_node_mapping_status_1#:#Mappa hela trädet +ecs#:#ecs_node_mapping_status_2#:#Manuell kartläggning +ecs#:#ecs_node_mapping_status_3#:#Oförmärkt +ecs#:#ecs_not_configured#:#Inte konfigurerad +ecs#:#ecs_not_published#:#Inga releaser har valts. +ecs#:#ecs_notifications#:#Notifieringar +ecs#:#ecs_part_settings#:#Inställningar för deltagare +ecs#:#ecs_participants#:#Deltagare +ecs#:#ecs_participants_infos#:#Ytterligare information +ecs#:#ecs_polling#:#Frekvens av förfrågningar +ecs#:#ecs_polling_info#:#Ange en frekvens för förfrågningar till ECS-servern. +ecs#:#ecs_port#:#Port +ecs#:#ecs_position_updates#:#Transfer Position Uppdateringar +ecs#:#ecs_protocol#:#Protokoll +ecs#:#ecs_publish_as#:#Publicera under +ecs#:#ecs_publish_for#:#Släpp för +ecs#:#ecs_published_for#:#Släppt för +ecs#:#ecs_rcrs_created_body_a#:#En ny ECS-kurs skapades +ecs#:#ecs_read_remote_links#:#Uppdatera kursinformation +ecs#:#ecs_refresh_participants#:#Uppdatera ECS deltagare +ecs#:#ecs_released#:#Undantagna kurser +ecs#:#ecs_released_content#:#Delat e-innehåll +ecs#:#ecs_remote_imported#:#Informationen om kursändringar har lästs om. +ecs#:#ecs_remote_user_settings#:#Login-konton som skapats av ECS +ecs#:#ecs_role#:#Rolltilldelning +ecs#:#ecs_role_mapping_value#:#Attributets värde +ecs#:#ecs_role_mappings#:#Rolltilldelning för kurser/grupper +ecs#:#ecs_server_addr#:#Serverns adress +ecs#:#ecs_server_deleted#:#Server borttagen +ecs#:#ecs_server_settings#:#ECS-funktioner +ecs#:#ecs_server_title#:#Namn på ECS-konfigurationen +ecs#:#ecs_server_url#:#URL till server +ecs#:#ecs_setting_deleted#:#ECS har tagits bort. +ecs#:#ecs_settings#:#Inställningar +ecs#:#ecs_status_deleted#:#Borttagen +ecs#:#ecs_status_legend#:#Legend +ecs#:#ecs_status_mapped#:#Mappad +ecs#:#ecs_status_pending_unmapped#:#Outstanding (ej mappad) +ecs#:#ecs_status_pending_unmapped_discon#:#Utgående (ej mappad, separation möjlig) +ecs#:#ecs_status_pending_unmapped_nondiscon#:#Outgoing (ej mappad, separation inte längre möjlig) +ecs#:#ecs_sync_trees#:#Uppdatera CMS katalogträd +ecs#:#ecs_tab_export#:#Export +ecs#:#ecs_tab_import#:#Import +ecs#:#ecs_tbl_active#:#Aktiv +ecs#:#ecs_tbl_active_rules#:#Aktiva regler för tilldelning till kategorier +ecs#:#ecs_tbl_export#:#Export +ecs#:#ecs_tbl_import#:#Import +ecs#:#ecs_tbl_import_type#:#Importera typ +ecs#:#ecs_tbl_settings_for_server#:#ECS-inställningar för %s +ecs#:#ecs_title_updates#:#Transfer Titel Uppdateringar +ecs#:#ecs_token_mechanism#:#Autentiseringstoken +ecs#:#ecs_token_mechanism_info#:#Om aktiverat sker inloggningen för installation av frigjorda objekt via ECS-tokenmekanismen. +ecs#:#ecs_tree_updates#:#Transfer Tree Uppdateringar +ecs#:#ecs_tst_export#:#Testversioner +ecs#:#ecs_tst_export_disabled#:#Inte släppa +ecs#:#ecs_tst_export_enabled#:#Släpp +ecs#:#ecs_tst_export_obj_settings#:#Inställningar för testversioner +ecs#:#ecs_unique_id#:#Deltagarens ID +ecs#:#ecs_user_rcp#:#Notifieringar om ECS-användare +ecs#:#ecs_user_rcp_info#:#Ange här, kommaseparerat, ett eller flera inloggningsnamn som ska meddelas via e-post om nya ECS-konton.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +ecs#:#ecs_wiki_export#:#Wiki aktier +ecs#:#ecs_wiki_export_disabled#:#Inte släppa +ecs#:#ecs_wiki_export_enabled#:#Släpp +ecs#:#ecs_wiki_export_obj_settings#:#Inställningar för wiki-aktier +error#:#error_back_to_repository#:#Tillbaka till tidningen +error#:#error_sry_error#:#Ett fel har tyvärr uppstått. +etal#:#appointments#:#Sessioner +etal#:#cal_type_tals#:#Talks +etal#:#change_date_of_series#:#Anpassa samtalsserier +etal#:#change_date_of_talk#:#Justera datum för konversation +etal#:#date_of_talk#:#Startdatum +etal#:#etal_add#:#Add +etal#:#etal_add_new_item#:#Lägg till ny konversation +etal#:#etal_create_invalid_template_ref#:#Ogiltigt ID för samtalsmall +etal#:#etal_date_appointment_edit#:#Talk datum +etal#:#etal_date_series_edit#:#Talkserie +etal#:#etal_edit#:#Allmänt +etal#:#etal_invalid_user#:#Detta konto existerar inte eller kan inte bjudas in. +etal#:#etal_new#:#Nytt samtal +etal#:#etal_open#:#Öppen konversation +etal#:#etal_status_all#:#Alla +etal#:#etal_status_completed#:#Fullbordad +etal#:#etal_status_pending#:#Utgående +etal#:#etal_unknown_username#:# Okänd användare +etal#:#lock_edititng_for_others#:#Lås redigering för andra +etal#:#meta_adv_records#:#Metadata +etal#:#mm_org_etal#:#Talk +etal#:#mm_talk_template#:#Tala mallar +etal#:#notification_talks_created#:#Du har blivit kallad till en intervju. +etal#:#notification_talks_date_list_header#:#Data +etal#:#notification_talks_removed#:#Följande datum har ställts in. +etal#:#notification_talks_subject#:#Datum inbjudan +etal#:#notification_talks_subject_update#:#Uppdatering av datum +etal#:#notification_talks_updated#:#Följande mötesdatum har justerats. +etal#:#pending_talks_warning#:#Följande utestående intervjutillsättningar kommer att ersättas +etal#:#talk_serial#:#Talk Serial +etal#:#tals_add#:#Lägg till konversationer +etal#:#tals_new#:#Nya samtalsserier +etal#:#talt_activation_online_info#:#Markera mallen som aktiv så att den är tillgänglig för personalen. +etal#:#talt_add#:#Skapa +etal#:#talt_edit#:#Allmänt +etal#:#talt_etal#:#Samtal med anställda +etal#:#talt_new#:#Ny samtalsmall +etal#:#will_update_series_info_lock#:#Blockera redigering av alla samtalsdatum i denna serie +etal#:#will_update_series_info_title#:#Ändringar i titeln gäller för alla samtalsdatum i denna serie. +exc#:#exc_add_assignment#:#Lägg till träningsenhet +exc#:#exc_add_criteria#:#Lägg till kriterium +exc#:#exc_add_criteria_catalogue#:#Lägg till katalog +exc#:#exc_add_feedback_file#:#Deposit som fil +exc#:#exc_add_participant#:#Lägg till deltagare +exc#:#exc_adopt_group_teams#:#Bilda team från grupper +exc#:#exc_adopt_group_teams_added#:#%s användare har lagts till. +exc#:#exc_adopt_group_teams_blocked#:#%s användare var redan närvarande. +exc#:#exc_adopt_group_teams_conflict#:#Användaren "%1$s" är redan vald i gruppen "%2$s". +exc#:#exc_adopt_group_teams_no_members#:#Inga medlemmar +exc#:#exc_after_submission#:#Efter leveransen +exc#:#exc_all_new_files_offered_already#:#Alla nya filer har redan erbjudits för nedladdning. För att ladda ner igen, klicka på motsvarande åtgärdslänkar i listan nedan. +exc#:#exc_ass_submission_zip#:#Skatter +exc#:#exc_ass_team_wiki#:#Team Wiki +exc#:#exc_assignment#:#Träningsenhet +exc#:#exc_assignment_type#:#Typ av leverans +exc#:#exc_assignment_view#:#Varje träningspass +exc#:#exc_assignments#:#Träningsenheter +exc#:#exc_assignments_deleted#:#Träningspassen har tagits bort. +exc#:#exc_blog_created#:#Blog skapades. +exc#:#exc_blog_returned#:#Blogg om träningspass +exc#:#exc_blog_selected#:#Bloggen har länkats. +exc#:#exc_chars_remaining#:# Återstående tecken +exc#:#exc_comment_for_learner_edit#:#Ange som kommentar i textfältet +exc#:#exc_comment_for_learner_info#:#Ett meddelande skickas till deltagaren.

Återkopplingen visas i hans eller hennes personliga träningsenhetsöversikt. +exc#:#exc_compare_selected_submissions#:#Jämför valda lösningsleveranser +exc#:#exc_compare_submissions#:#Jämförelse Lösning Leverans +exc#:#exc_completion_by_submission#:#Automatisk vid leverans +exc#:#exc_completion_by_submission_info#:#Om en deltagare skickar in ett arbetsresultat sätts statusen "Godkänd". Handledaren kan manuellt åsidosätta statusen. Att ändra denna inställning har ingen effekt på befintliga bedömningar. +exc#:#exc_completion_by_tutor#:#Endast manuellt av handledare +exc#:#exc_conf_del_assignments#:#Vill du verkligen ta bort följande träningsenheter? +exc#:#exc_copy#:#Kopieringsövning +exc#:#exc_copy_zip_error#:#Inlämningen kan inte öppnas. Ett fel uppstod när filerna kopierades. +exc#:#exc_create_blog#:#Skapa blogg +exc#:#exc_create_blog_select_info#:#Välj den plats i dina personliga resurser där bloggen ska skapas. +exc#:#exc_create_portfolio#:#Skapa portfölj +exc#:#exc_create_portfolio_no_template#:#Använd inte en mall +exc#:#exc_create_team#:#Skapa Team +exc#:#exc_create_team_times_up_warning#:#Du kan inte längre skapa ett team. Vänligen kontakta din handledare. +exc#:#exc_create_wiki#:#Skapa Wiki +exc#:#exc_crit_cat_protected_assignment#:#Aktiv återkoppling från kollegor +exc#:#exc_crit_cat_protected_assignment_info#:#Kriteriekataloger för övningsenheter med aktiv peer feedback kan inte längre redigeras. +exc#:#exc_criteria_catalogue_create_form#:#Lägg till ny katalog +exc#:#exc_criteria_catalogue_default#:#Ingen katalog +exc#:#exc_criteria_catalogue_deletion_confirmation#:#Vill du verkligen radera följande kriteriekataloger? +exc#:#exc_criteria_catalogue_update_form#:#Redigera katalog +exc#:#exc_criteria_catalogues#:#Kriteriekataloger +exc#:#exc_criteria_create_form#:#Lägg till nytt kriterium +exc#:#exc_criteria_deletion_confirmation#:#Vill du verkligen ta bort följande kriterier? +exc#:#exc_criteria_type_bool#:#Uppfyllt Ja/Nej +exc#:#exc_criteria_type_file#:#Uppladdning av fil +exc#:#exc_criteria_type_rating#:#5 stjärnklassificering +exc#:#exc_criteria_type_text#:#Text +exc#:#exc_criteria_update_form#:#Redigera kriterium +exc#:#exc_criterias#:#Kriterier +exc#:#exc_deadline#:#Förfallodag +exc#:#exc_deadline_ext_mismatch#:#Anståndsperioden måste avslutas efter tidsfristen. +exc#:#exc_deadline_extended#:#Sen deadline +exc#:#exc_deadline_extended_info#:#Under perioden mellan sista inlämningsdag och slutet av anståndsperioden får sena inlämningar göras. +exc#:#exc_delete_team#:#Radera Team +exc#:#exc_deleted_user#:#Borttagen användare +exc#:#exc_denied_has_peer_reviews#:#Anledning +exc#:#exc_denied_has_submissions#:#Anledning +exc#:#exc_denied_has_team_assignments#:#Anledning +exc#:#exc_direct_no_submit#:#Leverera inte +exc#:#exc_direct_submit#:#Leverans +exc#:#exc_direct_submit_blog#:#Vill du skicka in den aktuella versionen av din blogg nu? Det kan du också göra när som helst i bloggredigeraren. +exc#:#exc_direct_submit_portfolio#:#Vill du skicka in den aktuella versionen av din portfölj nu? Du kan också göra det när som helst i portföljredigeraren. +exc#:#exc_down_files_started_bg#:#Ett ZIP-arkiv med alla nedladdningsfiler skapas nu i bakgrunden. Du kan se status för dina bakgrundsprocesser längst upp till höger i meddelandecentret. Du kan också ladda ner ZIP-arkivet där. +exc#:#exc_download_zip_structure#:#Ladda ner ZIP katalogstruktur +exc#:#exc_earliest_start_time#:#Tidigt startdatum +exc#:#exc_edit_assignment#:#Inställningar för träningspass +exc#:#exc_edit_assignments#:#Redigera träningsenheter +exc#:#exc_edit_criterias#:#Redigera kriterier +exc#:#exc_edit_submission#:#Förändring presenterade lösningar +exc#:#exc_ended_on#:#Avslutad på +exc#:#exc_export_excel#:#Export (Excel) +exc#:#exc_fb_files#:#Utvärderingsfiler +exc#:#exc_fb_tutor_info#:#När en utvärderingsfil för en övningsenhet har laddats upp får deltagaren ett meddelande och kan sedan ladda ner och visa den i översikten över övningsenheten. +exc#:#exc_feedback#:#Återkoppling +exc#:#exc_feedback_notification_body#:#Feedback på följande träningspass har aktiverats. +exc#:#exc_feedback_notification_link#:#Länk till övningen +exc#:#exc_feedback_notification_reason#:#Du får detta meddelande eftersom du är en deltagare i övningen ovan. +exc#:#exc_feedback_notification_subject#:#Feedback för träningsenhet för träning "%s" upplåst +exc#:#exc_files_returned_text#:#Levererad text +exc#:#exc_find_zip_error#:#Leveransen kan inte öppnas. Originalfilerna hittades inte. +exc#:#exc_fixed_date#:#Fastställt datum +exc#:#exc_fixed_date_info#:#Alla deltagare får initialt samma fasta inlämningsdatum. +exc#:#exc_fullscreen#:#Fullskärm +exc#:#exc_global_feedback_file#:#Exempel på lösning +exc#:#exc_global_feedback_file_after_date#:#Efter fastställt datum +exc#:#exc_global_feedback_file_cron#:#Notifiering om tillgänglighet +exc#:#exc_global_feedback_file_cron_info#:#Deltagarna kommer att informeras via e-post om provlösningens tillgänglighet. +exc#:#exc_global_feedback_file_date#:#Tillgänglighet +exc#:#exc_global_feedback_file_date_deadline#:#Efter deadline +exc#:#exc_global_feedback_file_date_upload#:#Efter leveransen +exc#:#exc_go_to_exercise#:#Till övningen +exc#:#exc_grades#:#Översikt över noterna +exc#:#exc_grades_overview#:#Översikt över noterna +exc#:#exc_hand_in#:#Sänd in fil +exc#:#exc_import#:#Import av övningar +exc#:#exc_individual_deadline#:#Individuell tidsfrist +exc#:#exc_individual_deadline_action#:#Sätt individuell deadline +exc#:#exc_individual_deadline_before_global#:#Datumet måste ligga efter (den sista) tidsfristen +exc#:#exc_instruction_files#:#Filer för arbetsinstruktioner +exc#:#exc_late_submission#:#Sen leverans +exc#:#exc_late_submission_warning#:#Delegationer efter %s markeras som sena. +exc#:#exc_limit_characters#:#Begränsning av antalet tecken +exc#:#exc_list_submission#:#All Solution Duties +exc#:#exc_list_text_assignment#:#Lista över alla avgifter +exc#:#exc_mail_context_grade_reminder_info#:#Tutorerna påminns om utvärderingen av registreringarna. +exc#:#exc_mail_context_grade_reminder_title#:#Träning +exc#:#exc_mail_context_peer_reminder_info#:#Användarna påminns om att ge feedback till sina kollegor. +exc#:#exc_mail_context_peer_reminder_title#:#Träning +exc#:#exc_mail_context_reminder_assignment_title#:#Titel på övningsenheten +exc#:#exc_mail_context_reminder_exercise_title#:#Träningstitel +exc#:#exc_mail_context_submit_reminder_info#:#Users påminns om att skicka in sina bidrag. +exc#:#exc_mail_context_submit_reminder_title#:#Träning +exc#:#exc_mail_permanent_link#:#Följande länk leder till övningen +exc#:#exc_manage_team#:#Leda Team +exc#:#exc_mandatory#:#Åtagande +exc#:#exc_mandatory_info#:#Obligatoriska övningsmoment måste godkännas för att hela övningen ska godkännas. +exc#:#exc_mandatory_rand_determined#:#Slumpmässigt urval +exc#:#exc_max_char_limit#:#Maximalt antal tecken +exc#:#exc_max_file#:#Maximalt antal filer +exc#:#exc_max_file_info#:#När gränsen har uppnåtts kan deltagarna inte ladda upp fler filer. Även i teamträningspass räknas gränsen per deltagare och inte för hela teamet. +exc#:#exc_max_file_reached#:#Du kan ladda upp högst %s filer. +exc#:#exc_max_file_tgl#:#Begränsa uppladdningar +exc#:#exc_max_team_participants#:#Maximalt antal +exc#:#exc_members_already_assigned_team#:#Den här användaren är redan tilldelad ett team. +exc#:#exc_min_char_limit#:#Minsta antal tecken +exc#:#exc_min_nr#:#Antal träningsenheter +exc#:#exc_min_nr_info#:#Detta värde måste vara minst lika högt som antalet obligatoriska övningsenheter. +exc#:#exc_min_team_participants#:#Minsta antal +exc#:#exc_msg_all_mandatory_ass#:#Du måste klara alla obligatoriska övningsdelar för att klara övningen som helhet. +exc#:#exc_msg_failed_mandatory#:#Du har underkänts i minst ett obligatoriskt övningsmoment. +exc#:#exc_msg_min_number_ass#:#Du måste klara minst %s övningsdelar för att bli godkänd på övningen. +exc#:#exc_msg_missed_minimum_number#:#Du har inte klarat det minsta antalet träningspass. +exc#:#exc_msg_new_feedback_file_uploaded#:#En ny feedbackfil har lagts till i övningen "%s". +exc#:#exc_msg_new_feedback_file_uploaded2#:#En ny feedbackfil har laddats upp för dig. +exc#:#exc_msg_new_feedback_text_uploaded#:#En ny kommentar har lagts till övningen "%s". +exc#:#exc_msg_new_feedback_text_uploaded2#:#En handledare har skrivit en ny kommentar till dig. +exc#:#exc_msg_participants_removed#:#Deltagarna avlägsnades från övningen. +exc#:#exc_msg_public_submission#:#Alla lösningar som lämnas in kommer att publiceras efter tidsfristen. +exc#:#exc_msg_saved_grades#:#Ändringarna har sparats ###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +exc#:#exc_msg_sure_to_deassign_participant#:#Vill du verkligen ta bort följande deltagare från alla övningsenheter i övningen? Alla lösningsförslag från deltagarnas alla övningsenheter kommer att raderas. +exc#:#exc_multi_feedb_info#:#På denna sida kan du ladda upp feedbackfilerna för flera övningsdeltagare samtidigt.

Klicka först på knappen "Ladda ner ZIP-katalogstruktur" nedan och spara ZIP-filen på din dator. I nästa steg öppnar du ZIP-filen för att packa upp katalogstr +exc#:#exc_multi_feedback#:#Feedback till flera deltagare +exc#:#exc_multi_feedback_file#:#Fil med flera återkopplingar +exc#:#exc_multi_feedback_files#:#Filer med flera återkopplingar +exc#:#exc_needs_deadline#:#Detta alternativ kräver en tidsfrist. +exc#:#exc_needs_fixed_deadline#:#Den här funktionen kräver ett fast inlämningsdatum. +exc#:#exc_new_assignment#:#Nytt träningspass +exc#:#exc_no_assignments_available#:#Inga träningsenheter tillgängliga. Välj "Träningsenheter" och "Redigera" för att skapa en träningsenhet. +exc#:#exc_no_deadline_specified#:#Ingen tidsfrist har fastställts. +exc#:#exc_no_feedback_dir_found_in_zip#:#Katalogstrukturen för det uppladdade zip-arkivet kunde inte bearbetas. +exc#:#exc_no_get_target#:#Ingen giltig länkdestination hittades. +exc#:#exc_no_participants#:#Det finns inga deltagare för tillfället. +exc#:#exc_no_portfolio_templates#:#Det finns inga portföljmallar tillgängliga. +exc#:#exc_no_team_yet#:#Inget team utsett +exc#:#exc_no_team_yet_info#:#Du kan skapa ett team själv eller läggas till i ett annat team av dess teammedlemmar. +exc#:#exc_no_team_yet_info_tutor#:#Teamen leds av övningsledarna. +exc#:#exc_no_team_yet_notice#:#Du tillhör inte ett team ännu. +exc#:#exc_note_for_tutor#:#Note för handledare +exc#:#exc_notification#:#Personlig anmälan +exc#:#exc_nr_random_mand#:#Antal obligatoriska träningsenheter +exc#:#exc_num_teams#:#Nummer +exc#:#exc_order_by_deadline#:#Sortera efter deadline +exc#:#exc_overview#:#Översikt +exc#:#exc_participant#:#Deltagare +exc#:#exc_participant_view#:#Varje deltagare +exc#:#exc_participants#:#Deltagare +exc#:#exc_pass_all#:#Endast obligatoriska övningar +exc#:#exc_pass_all_info#:#Deltagarna måste klara alla obligatoriska övningspass för att klara hela övningen. +exc#:#exc_pass_minimum_nr#:#Minsta antal träningspass +exc#:#exc_pass_minimum_nr_info#:#Deltagarna måste klara ett minsta antal övningstillfällen för att klara hela övningen. +exc#:#exc_pass_mode#:#Förfrågan +exc#:#exc_pass_mode_not_changeable_info#:#Detta alternativ kan inte längre ändras. +exc#:#exc_passed_status_determination#:#Rating som "Godkänd +exc#:#exc_passing_exc#:#Passning av övningen +exc#:#exc_peer_deadline_mismatch#:#Eftersom feedback endast kan ges efter deadline för övningsenheten, får deadline för feedback inte vara före inlämningsdatumet. +exc#:#exc_peer_review#:#Feedback från peers +exc#:#exc_peer_review_ass_setting_info#:#Efter att tidsfristen och, i förekommande fall, respittiden har löpt ut kan deltagarna betygsätta varandras arbetsresultat. Exakta inställningar för kamratrespons görs på fliken med samma namn. Fliken visas när detta alternativ har aktiverats och sparats +exc#:#exc_peer_review_chars_invalid#:#Du har ännu inte uppnått den önskade textlängden på %s tecken. +exc#:#exc_peer_review_completion#:#Bestämning av status "Godkänd" +exc#:#exc_peer_review_completion_all#:#All feedback önskas +exc#:#exc_peer_review_completion_all_info#:#Övningsenheten sätts automatiskt till "Godkänd" efter att en lösning har skickats in och det antal feedback som krävs har getts. +exc#:#exc_peer_review_completion_none#:#Peer feedback är frivilligt +exc#:#exc_peer_review_completion_none_info#:#Övningsenheten sätts automatiskt till "Godkänd" efter inlämning, oavsett om feedback har getts eller inte. +exc#:#exc_peer_review_completion_one#:#Minst en återkoppling +exc#:#exc_peer_review_completion_one_info#:#Övningen sätts automatiskt till "Godkänd" efter att en lösning har skickats in och minst en feedback har getts. +exc#:#exc_peer_review_deadline#:#Ge feedback tills +exc#:#exc_peer_review_deadline_info#:#Utvärderingar kan lämnas in fram till detta datum. Efteråt kan den mottagna feedbacken visas. +exc#:#exc_peer_review_deadline_info_button#:#Sista datum +exc#:#exc_peer_review_deadline_reached#:#Tiden för Feedback har gått ut. +exc#:#exc_peer_review_file#:#Uppladdning av fil +exc#:#exc_peer_review_file_info#:#Tillåter peers att ladda upp en fil per granskning +exc#:#exc_peer_review_give#:#Ge feedback +exc#:#exc_peer_review_given#:#Visa given feedback +exc#:#exc_peer_review_giver#:#Feedback givare +exc#:#exc_peer_review_invalid_giver_ids#:#Feedback-donatorer som inte längre deltar i övningen eller inte har någon inlämning +exc#:#exc_peer_review_invalid_peer_ids#:#Feedback-deltagare som inte längre deltar i övningen eller inte har någon inlämning +exc#:#exc_peer_review_min_chars#:#Minsta antal tecken +exc#:#exc_peer_review_min_chars_info#:#Det antal tecken som krävs för en giltig feedback. +exc#:#exc_peer_review_min_chars_tgl#:#Minsta längd +exc#:#exc_peer_review_min_number#:#Nödvändigt antal feedbacks +exc#:#exc_peer_review_min_number_info#:#Antal feedback som en deltagare måste ge till sina kollegor. Om antalet obligatoriska återkopplingar överstiger antalet faktiska inlämningar minskas det obligatoriska antalet automatiskt till antalet faktiska inlämningar. +exc#:#exc_peer_review_missing_info#:#För att se den mottagna feedbacken saknas fortfarande %s egna feedbacks. +exc#:#exc_peer_review_missing_info_deadline#:#För att se den mottagna feedbacken saknas fortfarande %1$s egna feedbacks. Aktiveringen sker den +exc#:#exc_peer_review_missing_users#:#Utnyttjare med en avgift som inte är en del av peer feedback +exc#:#exc_peer_review_no_peers#:#Inga peers kunde hittas. +exc#:#exc_peer_review_no_peers_reviewed_yet#:#Inga recensioner har gjorts ännu. +exc#:#exc_peer_review_not_returned_users#:#Users utan avgift som inte är en del av peer feedback +exc#:#exc_peer_review_overview#:#Visa Peer-grupper +exc#:#exc_peer_review_overview_invalid_users#:#Invalid användare +exc#:#exc_peer_review_personal#:#Personlig feedback från kollegor +exc#:#exc_peer_review_personal_info#:#Peers visas med fullständiga namn +exc#:#exc_peer_review_rating#:#Rating +exc#:#exc_peer_review_recipient#:#Feedback taker +exc#:#exc_peer_review_reset#:#Ta bort och återställa feedback från kollegor +exc#:#exc_peer_review_reset_done#:#All peer feedback-data har raderats för övningssessionen. +exc#:#exc_peer_review_reset_sure#:#Vill du verkligen radera den fullständiga återkopplingen för övningsenheten "%s"? +exc#:#exc_peer_review_show#:#Visa mottagen feedback +exc#:#exc_peer_review_show_missing#:#Du kan inte se den feedback du har fått eftersom du inte har gett tillräckligt med feedback. +exc#:#exc_peer_review_show_received_none#:#Du har inte fått någon feedback. +exc#:#exc_peer_review_simple_unlock#:#Anvisning av mottagna betyg +exc#:#exc_peer_review_simple_unlock_active#:#Efter att ha skickat in ett betyg +exc#:#exc_peer_review_simple_unlock_inactive#:#Efter att alla betyg har lämnats in +exc#:#exc_peer_review_text#:# Textinmatning +exc#:#exc_peer_review_updated#:#Din feedback har sparats. +exc#:#exc_peer_reviews_invalid_warning#:#Invalid peer groups +exc#:#exc_portfolio_created#:#Portfolio skapades. +exc#:#exc_portfolio_returned#:#Portfölj för övningsenheten +exc#:#exc_portfolio_selected#:#Portföljen har tilldelats. +exc#:#exc_portfolio_template#:#Determinera portföljmall +exc#:#exc_portfolio_unlinked_from_assignment#:#Portföljen har tagits bort från övningsenheten. +exc#:#exc_presentation_order#:#Beställ +exc#:#exc_print_pdf#:#Print/PDF +exc#:#exc_public_submission#:#Avgifter för offentliga lösningar +exc#:#exc_publishing#:#Publicering +exc#:#exc_rand_nr_mandatory#:#Antal obligatoriska träningsenheter +exc#:#exc_rand_overall_ass#:#Totalt antal inlösenrätter +exc#:#exc_random#:#Random +exc#:#exc_random_assignment#:#Slumpmässigt urval +exc#:#exc_random_assignment_info#:#När du startar övningen kommer du att tilldelas ett slumpmässigt urval av obligatoriska övningsenheter. +exc#:#exc_random_selection#:#Slumpmässigt urval +exc#:#exc_random_selection_info#:#Ett slumpmässigt urval av obligatoriska träningspass tilldelas varje användare. +exc#:#exc_random_selection_not_changeable_info#:#Detta alternativ kan inte aktiveras. +exc#:#exc_rel_last_submission#:#Sista möjliga tidsfrist +exc#:#exc_rel_last_submission_info#:#Om detta datum är fastställt måste alla avgifter betalas före detta datum. +exc#:#exc_relative_date#:#Relativt datum +exc#:#exc_relative_date_info#:#Inlämningsdatumet är resultatet av den bearbetningsperiod och starttid som deltagaren har valt. +exc#:#exc_rem_time_after_start#:#Bearbetningsperiod efter start +exc#:#exc_reminder_cron_ok#:#Minnen skickades +exc#:#exc_reminder_end#:#Sista minnet +exc#:#exc_reminder_feedback_setting#:#Påminn deltagarna om återkoppling från kollegor +exc#:#exc_reminder_feedback_start#:#Börja före mötet om peer feedback +exc#:#exc_reminder_frequency#:#Frekvens +exc#:#exc_reminder_grade_body#:#Följande övningsgrupp har ännu inte utvärderats +exc#:#exc_reminder_grade_setting#:#Påminnelse om nödvändig bedömning +exc#:#exc_reminder_grade_subject#:#Övningsenhet "%s" utvärderades inte +exc#:#exc_reminder_link#:#URL +exc#:#exc_reminder_mail_no_tpl#:#Använd inte en e-postmall +exc#:#exc_reminder_mail_template#:#Mall för e-post +exc#:#exc_reminder_peer_body#:#Feedback saknas fortfarande för följande träningsenhet +exc#:#exc_reminder_peer_subject#:#Feedback saknas för träningsenhet "%s +exc#:#exc_reminder_salutation#:#Hej %s, +exc#:#exc_reminder_start#:#Starta före deadline +exc#:#exc_reminder_start_info#:#Alla medlemmar i den överordnade gruppen eller kursen kommer att meddelas.
Utan en kurs eller grupp kommer ingen att meddelas. +exc#:#exc_reminder_submit_body#:#Följande övningsuppgifter har ännu inte lämnats in av dig +exc#:#exc_reminder_submit_setting#:#Påminn deltagarna om avgifter +exc#:#exc_reminder_submit_subject#:# Övningsenhet "%s" har ännu inte skickats in +exc#:#exc_reminders_cron#:#Påminnelser för träningspass +exc#:#exc_reminders_cron_info#:#Tre påminnelser skickas vid aktivering +exc#:#exc_save_all#:#Spara allt +exc#:#exc_save_order#:#Spara sekvens +exc#:#exc_save_selected#:#Spara valda poster +exc#:#exc_saved_order#:#Beställning sparad +exc#:#exc_schedule#:#Tidsplan +exc#:#exc_select_ass#:#Välj träningsenhet +exc#:#exc_select_blog#:#Använd befintlig blogg +exc#:#exc_select_blog_change#:#Använd andra bloggar +exc#:#exc_select_blog_info#:#Välj en av dina bloggar att använda i detta övningstillfälle. +exc#:#exc_select_part#:#Välj deltagare +exc#:#exc_select_portfolio#:#Använd befintlig portfölj +exc#:#exc_select_portfolio_change#:#Använd annan portfölj +exc#:#exc_select_portfolio_info#:#Välj en av dina portföljer att använda i detta övningspass. +exc#:#exc_select_portfolio_unlink#:#Ta bort portfölj +exc#:#exc_send_assignment#:#Skicka övningsenhet via e-post +exc#:#exc_settings_feedback#:#Återgång +exc#:#exc_settings_feedback_file#:#Fil +exc#:#exc_settings_feedback_file_info#:#Tutorer laddar upp sin fil. Respektive deltagare får ett meddelande och filen visas i översikten över övningsenheten. +exc#:#exc_settings_feedback_mail#:#per post +exc#:#exc_settings_feedback_mail_info#:#Tutors anger sin feedback på inlämningen i ett e-postformulär. Mailet skickas till motsvarande deltagare. +exc#:#exc_settings_feedback_text#:# Textinmatning +exc#:#exc_settings_feedback_text_info#:#Tutorer anger sin feedback i ett textfält. Respektive deltagare får ett meddelande och texten visas i översikten över övningsenheten. +exc#:#exc_show_peer_review#:#Visa Peer feedback +exc#:#exc_show_submissions#:#Publicera lösningsavgifter +exc#:#exc_show_submissions_info#:#Alla inlämnade lösningar för en övningsenhet kan ses av alla deltagare efter tidsfristen för inlämning. +exc#:#exc_start_assignment#:#Starta träningspass +exc#:#exc_start_exercise#:#Börja träna +exc#:#exc_start_time#:#Starttid +exc#:#exc_starting_on#:#Startar på +exc#:#exc_submission_and_grades_notification_link#:#Länk till övningen (hand-ins och betyg) +exc#:#exc_submission_downloads_notification_link#:#Ladda ner nya avgifter +exc#:#exc_submission_file#:#Leverans av filer +exc#:#exc_submission_no_new_files#:#Inga nya avgifter tillgängliga. +exc#:#exc_submission_notification#:#Notifiering vid leverans +exc#:#exc_submission_notification_body#:#En ny inlämning för övningen "%s" är tillgänglig. +exc#:#exc_submission_notification_info#:#Du kommer att meddelas via e-post så snart nya lösningar har skickats in. Detta är en personlig inställning som bara gäller dig. Andra handledare för övningen påverkas inte av detta. +exc#:#exc_submission_notification_link#:#Länk till övningen +exc#:#exc_submission_notification_subject#:#En ny avgift för övningen "%s" är tillgänglig +exc#:#exc_submission_text#:#Text leverans +exc#:#exc_submissions_and_grades#:#Avgifter och betyg +exc#:#exc_submit_convenience_no_deadline#:#Lämna in efter avslutad övningsenhet. Det finns ingen fast deadline. +exc#:#exc_submitted_files_deleted#:#De valda filerna har raderats. +exc#:#exc_sure_unlink_portfolio#:#Vill du ta bort portföljen från denna övningsenhet? +exc#:#exc_target_not_valid#:#Länkens destination är inte längre giltig. +exc#:#exc_task_grading#:#Utvärdering av inlösenenheten "%1 +exc#:#exc_task_peer_feedback#:#Ge feedback till kollegor i övningsenheten "%1 +exc#:#exc_task_submission#:#Leverans till träningsenhet "%1 +exc#:#exc_tbl_action_download_all_files#:#Ladda ner alla avgifter +exc#:#exc_tbl_action_download_files#:#Ladda ner avgifter +exc#:#exc_tbl_action_download_new_files#:#Ladda ner nya avgifter +exc#:#exc_tbl_action_feedback_file#:#Feedback via fil +exc#:#exc_tbl_action_feedback_mail#:#Feedback via e-post +exc#:#exc_tbl_action_feedback_text#:#Feedback via text +exc#:#exc_tbl_action_open_submission#:#Öppna avgifter +exc#:#exc_tbl_action_peer_review_given#:#Visa given feedback från kollegor +exc#:#exc_tbl_action_peer_review_received#:#Visa mottagen feedback från kollegor +exc#:#exc_tbl_action_team_log#:#Show Team Log +exc#:#exc_tbl_action_text_assignment_show#:#Avgift för visning +exc#:#exc_tbl_calculated_deadline#:#Beräknad tidsfrist +exc#:#exc_tbl_comment#:#Text feedback +exc#:#exc_tbl_feedback_time#:#Retur på +exc#:#exc_tbl_filter_has_no_submission#:#Har ännu inte levererat +exc#:#exc_tbl_filter_has_submission#:#Har gett +exc#:#exc_tbl_filter_submission#:#Levy +exc#:#exc_tbl_individual_deadline#:#Individuell tidsfrist +exc#:#exc_tbl_mark#:#Note +exc#:#exc_tbl_notice#:#Note för handledare +exc#:#exc_tbl_sent_time#:#Träningsenhet skickas vidare +exc#:#exc_tbl_status#:#Rating +exc#:#exc_tbl_status_time#:#Rated på +exc#:#exc_tbl_submission_date#:#Levererad på +exc#:#exc_tbl_team#:#Team +exc#:#exc_team#:#Team +exc#:#exc_team_assignment_adopt#:#Överta team från befintlig övningsenhet +exc#:#exc_team_assignment_adopt_already_assigned#:#redan tilldelad +exc#:#exc_team_assignment_adopt_none#:#Ta inte över team +exc#:#exc_team_assignment_adopt_none_user#:#Skapa ett nytt team +exc#:#exc_team_assignment_adopt_teams#:#Lag +exc#:#exc_team_assignment_adopt_user#:#Ta över team från övningsgrupp +exc#:#exc_team_at_least_one#:#Det måste finnas minst en teammedlem. +exc#:#exc_team_by_assignment#:#Övertagande av träningsenhet +exc#:#exc_team_by_assignment_info#:#Teams är hämtade från en befintlig övningsenhet. +exc#:#exc_team_by_participants#:#Av deltagare +exc#:#exc_team_by_participants_info#:#Deltagarna organiserar själva sina team. +exc#:#exc_team_by_random#:#Automatisk, slumpmässig tilldelning +exc#:#exc_team_by_random_add_info#:#Observera att du först måste tilldela alla deltagare till övningen innan du kan använda detta alternativ på ett meningsfullt sätt. +exc#:#exc_team_by_random_info#:#Deltagarna delas automatiskt och slumpmässigt in i lag. +exc#:#exc_team_by_tutors#:#Genom handledare +exc#:#exc_team_by_tutors_info#:#Tutor organiserar teamen. +exc#:#exc_team_by_tutors_manual#:#Handbok +exc#:#exc_team_by_tutors_manual_info#:#Tutorer tilldelar deltagare manuellt till team. +exc#:#exc_team_creation#:#Skapande +exc#:#exc_team_formation#:#Organisering av teamen +exc#:#exc_team_log#:#Team Log +exc#:#exc_team_log_add_file#:#Filen %s har lagts till. +exc#:#exc_team_log_add_member#:#Member %s tillagd. +exc#:#exc_team_log_create_team#:#Team skapat. +exc#:#exc_team_log_remove_file#:#Filen %s har tagits bort. +exc#:#exc_team_log_remove_member#:#Member %s borttagen. +exc#:#exc_team_management_tutor#:#Teamledning genom handledare +exc#:#exc_team_management_tutor_info#:#Om detta alternativ är aktiverat kan deltagarna inte själva organisera sina lag. +exc#:#exc_team_max_small_than_members#:#Det maximala antalet deltagare kan inte sättas till %s, eftersom vissa lag måste ha %s deltagare. +exc#:#exc_team_member_add#:#Lägg till teammedlem (sök) +exc#:#exc_team_member_container_add#:#Lägg till Teammedlem från kurs/grupp +exc#:#exc_team_member_remove_sure#:#Vill du verkligen ta bort följande medlemmar från ditt team? Observera att de respektive uppladdade filerna också kommer att tas bort från teamet. +exc#:#exc_team_members#:#Teammedlemmar +exc#:#exc_team_min_big_than_max#:#Det maximala antalet deltagare får inte vara lägre än det minimala antalet. +exc#:#exc_team_min_small_than_members#:#Minsta antal deltagare kan inte sättas till %s, eftersom vissa lag måste ha %s deltagare. +exc#:#exc_team_minimal_too_big#:#Det minsta antalet deltagare %s är för stort, vänligen minska värdet. +exc#:#exc_team_multi_create#:#Skapa Team +exc#:#exc_team_multi_dissolve#:#Upplös team(s) +exc#:#exc_team_notification_body_add#:#Du har lagts till i ett träningspass för teamuppladdning. +exc#:#exc_team_notification_body_rmv#:#Du har tagits bort från ett träningspass för teamuppladdning. +exc#:#exc_team_notification_link#:#Länk till övningen +exc#:#exc_team_notification_reason#:#Du får detta meddelande eftersom du är en deltagare i övningen ovan. +exc#:#exc_team_notification_subject_add#:#Lagd som teammedlem till en övningsenhet i övning "%s +exc#:#exc_team_notification_subject_rmv#:#Removerad som teammedlem från en %s övningsenhet +exc#:#exc_teams_assignment_adopted#:#Teamen togs från det befintliga träningspasset. +exc#:#exc_template#:#Mall +exc#:#exc_text_assignment_edit#:#Redigera text +exc#:#exc_text_assignment_show#:#Visa text +exc#:#exc_text_saved#:#Texten har sparats. +exc#:#exc_total_exc#:#Övergripande träning +exc#:#exc_total_members#:#Totalt antal deltagare +exc#:#exc_type_blog#:#Blogg +exc#:#exc_type_portfolio#:#Portfölj +exc#:#exc_type_text#:#Text +exc#:#exc_type_upload#:#Fil +exc#:#exc_type_upload_team#:#Skicka in filen som ett team +exc#:#exc_value_can_not_set#:#Detta värde kan inte ställas in +exc#:#exc_wait_for_files#:#Nedladdningen bör starta automatiskt. Om du har några problem, vänligen klicka här. +exc#:#exc_wiki_container#:#Wiki behållare +exc#:#exc_wiki_container_info#:#Plats där nya wikis för deltagarna skapas. +exc#:#exc_with_template#:#Med portföljmall +exc#:#exc_with_template_info#:#En tom portfölj härleds automatiskt från en specifik portföljmall. +exc#:#exc_with_wiki_template#:#Med mall +exc#:#exc_with_wiki_template_info#:#Nya wikis för deltagare skapas genom att kopiera mallen. +exc#:#exc_without_template#:#Utan portföljmall +exc#:#exc_without_template_info#:#Deltagarna skapar sina portföljer självständigt utan en mall. +exc#:#exc_without_wiki_template#:#Utan mall +exc#:#exc_without_wiki_template_info#:#Deltagarna börjar med en tom wiki. +exc#:#exc_work_instructions#:#Arbetsinstruktion +exc#:#exc_your_text#:#Din text +exc#:#feedback#:#Återkoppling +exc#:#feedback_from#:#Återkoppling från +exc#:#feedback_given#:#Given feedback +exc#:#feedback_received#:#Given feedback +exc#:#filter#:#Filter +exc#:#fiter_no_results#:#Inga avgifter passar de aktuella inställningarna för filtret. +exc#:#grade_evaluate#:#Utvärdering/Gradering +exc#:#not_yet#:#inte ännu +exc#:#submissions_feedback#:#Avdrag och feedback från kollegor +exc#:#submissions_only#:#Endast skatter +exc#:#text_assignment#:#Text Övning Enhet +excv#:#excv_create#:#Skapa träningscertifikat +excv#:#excv_create_info#:#Välj en övning för vilken du behöver ett certifikat +exercise#:#exc_admin_settings#:#Administration av övningar +exercise#:#exc_comment#:#opinion +exercise#:#exc_comment_for_learner#:#Feedback för deltagare +exercise#:#exc_failed#:#Misslyckad +exercise#:#exc_feedback_from_tutor#:#Utvärdering av handledaren +exercise#:#exc_grading#:#Rating +exercise#:#exc_mark#:#Note +exercise#:#exc_notgraded#:#Ej betygsatt +exercise#:#exc_passed#:#Bekräftad +exercise#:#exc_send_mail#:#Sänd som post +exercise#:#exc_start_date_should_be_before_end_date#:#Starttiden bör vara före tidsfristen. +exercise#:#exc_your_submission#:#Din ansökan +exp#:#exp_create_file#:#Skapa exportfil +exp#:#exp_error_disabled#:#Exporten av containerobjekt är avaktiverad. Om du har några frågor, vänligen kontakta den tekniska supporten. +exp#:#exp_error_too_many_objects#:#Exporten överskrider det maximalt tillåtna antalet objekt (%1). Välj ett mindre antal objekt. +exp#:#exp_export_files#:#Exportera filer +exp#:#exp_file_created#:#En exportfil har skapats. +exp#:#exp_html#:#HTML +exp#:#exp_print_pdf#:#Print/PDF +exp#:#exp_print_pdf_info#:#För att skapa en PDF, välj "Spara som PDF" som destination i utskriftsvyn. +exp#:#exp_really_delete#:#Vill du verkligen ta bort dessa exportfiler? +exp#:#exp_scorm#:#SCORM +exp#:#exp_show_print_view#:#Visa utskriftsvy +exp#:#exp_xml#:#XML +exp#:#export_created#:#En ny exportfil har skapats. +export#:#export_create#:#Skapa ny +export#:#export_create_new_file#:#Skapa ny exportfil +export#:#export_existing#:#Återanvändning +export#:#export_export_date#:#Exportdatum +export#:#export_last_export#:#Senaste export +export#:#export_last_export_file#:#Använd den senaste exportfilen +export#:#export_last_file#:#Sista filen +export#:#export_omit#:#Uppdrag +export#:#export_omit_resource#:#Omit objekt +export#:#export_resource#:#Resurs +export#:#export_save_selection#:#Starta export +export#:#export_select_resources#:#Välj objekt +export#:#no_file#:#Ingen fil +file#:#file_copy#:#Kopiera fil +file#:#file_download#:#Ladda ner fil +file#:#file_import#:#Fil import +file#:#file_new_version#:#Skapa ny version +file#:#file_new_version_info#:#Create en ny filversion. Gamla versioner behålls. +file#:#file_upload_info_file_with_critical_extension#:#Minst en fil innehåller en kritisk eller okänd filändelse. Filändelsen ändras till .sec vid varje nedladdning. Kontakta din administratör om det behövs. Filens namn +file#:#file_uploaded_by#:#Version uppladdad av +file#:#general_upload_error_occured#:#Ett oväntat fel uppstod under bearbetningen av filen. +file#:#migrated#:#Status +file#:#msg_unzip_success#:#Arkivet har packats upp med framgång. +file#:#replace_file_info#:#Alla filversioner raderas. +file#:#resource_id#:#Resurser ID +file#:#storage_id#:#ID för lagring +file#:#upload_info#:#Fil +file#:#upload_info_desc#:#Du kan hantera filerna och filversionerna på fliken "Versioner". +file#:#version_uploaded#:#Version uppladdad på +file#:#versionname#:#Titel +fils#:#file_services#:#Filtjänster +fils#:#file_services_description#:#Konfigurera inställningarna för filservicen. +fils#:#file_suffix_custom_expl_negative#:#Förbjudna filtillägg +fils#:#file_suffix_custom_expl_negative_info#:#Filer med dessa tillägg accepteras inte vid uppladdning. +fils#:#file_suffix_custom_negative#:#Filtillägg +fils#:#file_suffix_custom_negative_info#:#Dessa filändelser är borttagna från positivlistan ovan. +fils#:#file_suffix_custom_positive#:#Filtillägg +fils#:#file_suffix_custom_positive_info#:#Dessa filändelser läggs till i den positiva listan ovan. +fils#:#file_suffix_default_positive#:#Filtillägg +fils#:#file_suffix_default_positive_info#:#Förinställd utdatalista för accepterade filtillägg. +fils#:#file_suffix_overall_positive#:#Effektiv positiv lista +fils#:#file_suffix_overall_positive_info#:#Detta är den slutliga listan över godkända filändelser. +fold#:#fold_copy#:#Kopiera mapp +fold#:#fold_import#:#Importera mapp +fold#:#fold_presentation#:#Presentation +fold#:#fold_settings#:#Egenskaper för mappar +form#:#email_not_match#:#Dina uppgifter för e-postadressen matchar inte! Ange e-postadressen igen. +form#:#form_alphabet_all#:#Alla +form#:#form_chars_remaining#:# Återstående tecken +form#:#form_date_aria_desc#:#Följande inmatningsformat krävs +form#:#form_date_duration_end#:#Slut +form#:#form_date_duration_start#:#Start +form#:#form_days#:#dagar +form#:#form_file_input#:#Välj fil +form#:#form_format#:#Format +form#:#form_get_link#:#Välj målobjekt +form#:#form_hier_click_to_add#:#Klicka här för att lägga till nya element. +form#:#form_hierarchy_add_elements#:#För att lägga till nya element, klicka på platshållarna. +form#:#form_hierarchy_drag_drop_help#:#Dra ikonerna på platshållarna med musen för att flytta element. +form#:#form_hours#:#Timmar +form#:#form_image_file_input#:#Välj bildfil +form#:#form_invalid_uri#:# Ogiltigt URI-format. +form#:#form_link_external#:#WWW / Internet +form#:#form_link_internal#:#Insidan av ILIAS +form#:#form_location_radius#:#Surroundings +form#:#form_location_radius_km#:#km +form#:#form_max_value#:#Maximalt värde +form#:#form_min_value#:#Minsta värde +form#:#form_minutes#:#minuter +form#:#form_months#:#Månader +form#:#form_msg_file_cannot_write_to_disk#:#Ingen skrivåtkomst till hårddisken +form#:#form_msg_file_missing_file_ext#:#Den uppladdade filen har inget filnamnstillägg. +form#:#form_msg_file_missing_tmp_dir#:#Ingen tillfällig katalog tillgänglig för uppladdning av filer +form#:#form_msg_file_no_upload#:#Den här inmatningen är obligatorisk. Välj en fil för uppladdning! +form#:#form_msg_file_partially_uploaded#:#Filen kunde inte laddas upp fullständigt. +form#:#form_msg_file_size_exceeds#:#Filen som ska laddas upp överskrider den maximala filstorleken. +form#:#form_msg_file_type_is_not_allowed#:#Den här filtypen är inte tillåten. +form#:#form_msg_file_upload_stopped_ext#:#Uppladdningen avbröts av PHP-tillägg. +form#:#form_msg_file_virus_found#:#Ett virus har hittats i filen som ska laddas upp! +form#:#form_msg_file_wrong_file_type#:#Fel filtyp +form#:#form_msg_formula_is_required#:#Vänligen ange en korrekt formel. +form#:#form_msg_max_upload#:#Maximalt antal filer som kan laddas upp samtidigt +form#:#form_msg_numeric_value_required#:#Var god ange ett numeriskt värde. +form#:#form_msg_value_too_high#:#Värdet är för högt. Ange ett lägre värde. +form#:#form_msg_value_too_low#:#Värdet är för lågt. Ange ett högre värde. +form#:#form_msg_wrong_date#:#Fel datum. Vänligen ange ett giltigt datum. +form#:#form_no_link#:#Ingen länk +form#:#form_open_answer#:#Freitext +form#:#form_password_not_allowed_for_auth#:#Du kan inte ändra lösenordet för den valda autentiseringsmetoden. +form#:#form_password_required_for_auth#:#Ett lösenord krävs för den valda autentiseringsmetoden. +form#:#form_please_select#:#Vänligen välj +form#:#form_retype_email#:#Ange e-post igen +form#:#form_retype_password#:#Ange lösenord igen +form#:#form_seconds#:#Sekunder +form#:#form_take_snapshot#:#Ta en ögonblicksbild +form#:#form_use_camera#:#Använd kamera +forum#:#activate_new_posts#:#Aktivera nya inlägg +forum#:#activate_only_current#:#Lås upp post +forum#:#activate_post#:#Lås upp +forum#:#activate_post_txt#:#Vill du låsa upp det här inlägget? +forum#:#add_new_answer#:#Ny post +forum#:#add_re_to_subject#:#Inläggets titel används för svaret som föregås av "Re +forum#:#adm_autosave_drafts#:#Spara utkast automatiskt +forum#:#adm_autosave_drafts_desc#:#Om aktiverat sparas utkast automatiskt under redigering. +forum#:#adm_autosave_ival#:#Spara intervall +forum#:#adm_save_drafts#:#Spara utkast +forum#:#adm_save_drafts_desc#:#Om den är aktiverad kan inloggade användare spara inlägg i forum som utkast. +forum#:#allow_file_upload_desc#:#Om aktiverat kan filer bifogas till foruminlägg i detta forum. +forum#:#ascending_order#:#Nyaste inlägg nedan +forum#:#autosave_draft_info#:#Denna design sparas automatiskt var %s sekund. +forum#:#autosave_post_draft_info#:#Detta inlägg sparas automatiskt som ett utkast varje %s av en sekund. +forum#:#close_topics#:#Stäng +forum#:#content_censored_post#:#Innehållet i det censurerade inlägget +forum#:#content_deleted_post#:#Innehållet i det raderade inlägget +forum#:#content_deleted_thread#:#Innehållet i det borttagna ämnet +forum#:#content_post_updated#:#Innehållet i den ändrade posten +forum#:#deletePosting#:#Ta bort inlägg +forum#:#deletePostingDraft#:#Ta bort utkast till inlägg +forum#:#delete_draft_successfully#:#Utkastet har raderats framgångsrikt. +forum#:#delete_drafts_successfully#:#Utkasten har raderats framgångsrikt. +forum#:#descending_order#:#Nyaste inlägg ovan +forum#:#edit_thread_draft#:#Redigera utkast till tema +forum#:#empty_subject#:#Användare måste själva ange titlar. +forum#:#empty_thread#:#Tomt tema +forum#:#enable_send_attachments#:#Bifoga filer till forumaviseringar +forum#:#enable_send_attachments_desc#:#Observera att filbilagor måste sparas separat för varje aviserad användare om leveransen också görs som ett internt meddelande. Detta kan orsaka en mycket hög beläggning av hårddiskutrymme på servern. +forum#:#enable_thread_ratings#:#Rate ämnen +forum#:#enable_thread_ratings_info#:#Ämnen i detta forum kan betygsättas av användarna. +forum#:#enter_new_subject#:#Var god ange en ny titel för inlägget +forum#:#error_no_target_selected#:#Vänligen välj ett forum. +forum#:#error_reading_file#:#Ett fel uppstod vid läsning av filen +forum#:#error_same_thread_ids#:#Två olika ämnen måste väljas. +forum#:#file_upload_allowed#:#Fäst filer +forum#:#file_upload_allowed_fora#:#Fäst filer +forum#:#file_upload_allowed_fora_desc#:#Att bifoga filer måste vara aktiverat i varje forum. För nya forum är bifogade filer inaktiverade som standard.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +forum#:#file_upload_option_allow#:#Tillåt bifogade filer i alla forum +forum#:#file_upload_option_allow_info#:#Filer kan bifogas till inlägg i alla forum. +forum#:#file_upload_option_disallow#:#Tillåt bifogade filer i utvalda forum +forum#:#fmr_copy_threads_info#:#Här kan du välja ämnen som ska kopieras. Endast de ursprungliga inläggen kommer att kopieras, inte deras svar. +forum#:#forum_add_quote#:#Cite +forum#:#forums_all_threads_marked_read#:#Alla ämnen har markerats som lästa. +forum#:#forums_attachments#:#Filbilagor +forum#:#forums_attachments_add#:#Fäst fil +forum#:#forums_censor_comment#:#Moderatorns anmärkning###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +forum#:#forums_count_art#:#Antal bidrag +forum#:#forums_created_by#:#Skapad av +forum#:#forums_delete_file#:#Ta bort bifogad fil +forum#:#forums_disable_notification#:#Avsluta anmälan för detta ämne +forum#:#forums_download_attachment#:#Ladda ner fil +forum#:#forums_edit_draft#:#Redigera utkast +forum#:#forums_edit_post#:#Redigera inlägg +forum#:#forums_enable_notification#:#Starta anmälan för detta ämne +forum#:#forums_forum_notification_disabled#:#Du kommer inte längre att meddelas om nya inlägg i detta forum. +forum#:#forums_info_censor2_post#:#Är du säker på att censuren bör hävas för det här inlägget? +forum#:#forums_info_censor_post#:#Giv en anledning till censuren. +forum#:#forums_info_delete_draft#:#Är du säker på att du vill radera detta utkast? +forum#:#forums_info_delete_post#:#Är du säker på att detta inlägg inklusive alla efterföljande inlägg ska raderas? +forum#:#forums_mark_read#:#Sätt alla att läsa +forum#:#forums_new_thread#:#Nytt ämne +forum#:#forums_no_posts_available#:#Detta ämne har inga inlägg ännu. +forum#:#forums_notification_disabled#:#Notifiering inaktiv +forum#:#forums_notification_enabled#:#Notifiering aktiv +forum#:#forums_notification_intro#:#Detta e-postmeddelande skickades automatiskt till dig av ILIAS-installationen %s, %s. +forum#:#forums_notification_show_frm#:#Gå till forumet +forum#:#forums_notification_show_post#:#Gå till inlägget +forum#:#forums_post_activation_mail#:# Följande inlägg skapades i ett forum som modereras av dig. Inlägget förblir osynligt tills du låser upp det.###Modifierat som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +forum#:#forums_post_deleted#:#Posten har tagits bort +forum#:#forums_post_modified#:#Posten har redigerats +forum#:#forums_post_needs_to_be_activated#:# Inlägget har skapats, men måste aktiveras av modereringen. ###Modifierat som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +forum#:#forums_post_new_entry#:#New post has been added.###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +forum#:#forums_post_was_activated#:#Bidraget har släppts.###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +forum#:#forums_posts#:#Alla bidrag +forum#:#forums_posts_not_available#:#Inga bidrag tillgängliga +forum#:#forums_print_thread#:#Ämne för utskrift +forum#:#forums_subject#:#Titel +forum#:#forums_the_post#:#Bidrag +forum#:#forums_thread#:#Topic +forum#:#forums_thread_create_from#:#Skapad av +forum#:#forums_thread_deleted#:#Det valda ämnet inklusive alla relaterade inlägg har tagits bort. +forum#:#forums_thread_drafts_deleted#:#Det valda ämnet, inklusive alla tillhörande inlägg och alla utkast till inlägg, har tagits bort. +forum#:#forums_thread_marked#:#Alla inlägg har markerats som lästa. +forum#:#forums_thread_new_entry#:#Nytt ämne har lagts till +forum#:#forums_threads_deleted#:#De valda ämnena inklusive alla tillhörande inlägg har tagits bort. +forum#:#forums_threads_drafts_deleted#:#De valda ämnena, inklusive alla tillhörande inlägg och alla utkast till inlägg, har tagits bort. +forum#:#forums_your_reply#:#Ditt bidrag +forum#:#frm_action_not_possible_parent_deleted#:#Åtgärden kan inte utföras, referensbidraget har tagits bort. +forum#:#frm_action_not_possible_thr_closed#:#Åtgärden kan inte utföras, ämnet har stängts. +forum#:#frm_action_not_possible_thr_deleted#:#Åtgärden kan inte utföras, ämnet har tagits bort. +forum#:#frm_activation_online_info#:#Endast när forumet är online kan användarna komma åt forumet. Om inte, är forumet endast tillgängligt för administratörer. +forum#:#frm_all_postings_stats#:#Alla +forum#:#frm_all_threads#:#Alla ämnen +forum#:#frm_anonymous_posting#:#Att skriva med en pseudonym +forum#:#frm_anonymous_posting_desc#:#Inlägg kan skrivas under vilket namn som helst. Om alternativet "Markera modereringsinlägg" är aktiverat kan moderatorn inte använda en pseudonym.###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +forum#:#frm_at_least_one_moderator#:#Minst en person måste vara ansvarig för moderering ###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +forum#:#frm_censorship#:#Censurering +forum#:#frm_censorship_applied#:#Inlägget har censurerats framgångsrikt. +forum#:#frm_censorship_revoked#:#Censuren för inlägget har upphävts. +forum#:#frm_copy#:#Kopia #Forum +forum#:#frm_default_view#:#Standardvy +forum#:#frm_edit_title#:#Redigera titel +forum#:#frm_mark_as_read#:#Markera som läst +forum#:#frm_mark_as_unread#:#Markera som oläst +forum#:#frm_max_notification_age#:#Tröskelvärde för anmälningar +forum#:#frm_max_notification_age_info#:#Ange här den maximala åldern för de inlägg som ska beaktas för aviseringar. Det angivna värdet ska vara större än det valda intervallet i schemat. +forum#:#frm_max_notification_age_unit#:#Tagg(ar) +forum#:#frm_merge_src#:#Valda ämnen +forum#:#frm_merge_target#:#Mål +forum#:#frm_moderator_f#:#Moderator +forum#:#frm_moderator_m#:#Moderator +forum#:#frm_moderator_n#:#Moderering +forum#:#frm_moderator_role_added_successfully#:#Personen har nu rätt att moderera sig.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +forum#:#frm_moderators#:#Moderation###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +forum#:#frm_moderators_detached_role_successfully#:#Rätten att vara moderat togs ifrån de utvalda personerna.###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +forum#:#frm_moderators_not_exist_yet#:#Lägg till en person för moderering.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +forum#:#frm_moderators_select_at_least_one#:#Välj minst en person ###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +forum#:#frm_moderators_select_one#:#Välj en användare för moderering ###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +forum#:#frm_move_invalid_file_type#:#Det valda temat "%s" har en filtyp som inte stöds i filbilagan. Ta bort filen eller kontakta administratören för att lägga till filtypen i positivlistan. +forum#:#frm_noti_message#:#Meddelande +forum#:#frm_noti_new_post#:#ett nytt inlägg har skapats i forumet "%1$s". +forum#:#frm_noti_obj_crs#:#Kurs +forum#:#frm_noti_obj_grp#:#Grupp +forum#:#frm_noti_subject_act_post#:#Postat i forumet "%1$s%2$s om ämnet "%3$s" aktiverat +forum#:#frm_noti_subject_answ_post#:#Posted i forumet "%1$s%2$s på ämnet "%3$s" svarade +forum#:#frm_noti_subject_cens_post#:#Post i forum "%1$s%2$s på ämne "%3$s" censurerad +forum#:#frm_noti_subject_del_post#:#Inlägg i forumet "%1$s"%2$s om ämnet "%3$s" borttaget +forum#:#frm_noti_subject_del_thread#:#Topic "%3$s" borttaget i forum "%1$s"%2$s +forum#:#frm_noti_subject_new_post#:#Nytt inlägg i forumet "%1$s"%2$s om ämnet "%3$s". +forum#:#frm_noti_subject_uncens_post#:#Censuren hävd för ett inlägg i forumet "%1$s"%2$s om ämnet "%3$s". +forum#:#frm_noti_subject_upt_post#:#Postat i forumet "%1$s"%2$s om ämnet "%3$s" ändrat +forum#:#frm_notification_activated#:#Notifiering aktiverad +forum#:#frm_notification_deactivated#:#Notifiering avaktiverad +forum#:#frm_post_not_activated_yet#:# Bidraget har ännu inte publicerats. ###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +forum#:#frm_posts#:#Inlägg i forumet +forum#:#frm_pseudonym#:#Pseudonym +forum#:#frm_purifier_not_implemented_for_type_x#:#Det finns ännu ingen cleaner implementerad för %s-typen. +forum#:#frm_rating#:#Rating +forum#:#frm_revoke_censorship#:#Ta bort censur +forum#:#frm_search#:#Sökning +forum#:#frm_selected_merge_src#:#Välja tema för sammanslagningen +forum#:#frm_settings_form_header#:#Forum inställningar +forum#:#frm_settings_mod_functions_header#:#Funktioner för moderering###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +forum#:#frm_settings_privacy_header#:#Skydd av personuppgifter +forum#:#frm_settings_user_functions_header#:#Funktioner för deltagare +forum#:#frm_statistics#:#Statistik +forum#:#frm_statistics_disabled_for_participants#:#Statistiken är inte synlig för vanliga forumanvändare. +forum#:#frm_statistics_enabled#:#Visa statistik +forum#:#frm_statistics_enabled_desc#:#Alla kan se vem som har skrivit hur många inlägg på fliken "Statistik". +forum#:#frm_statistics_ranking#:#Antal offentliga bidrag +forum#:#frm_sticky_threads_latest_at_top#:#Toppämne med senaste inlägget ovan +forum#:#frm_sticky_threads_latest_at_top_info#:#Toppämnen visas alltid överst i listan över ämnen. Toppämnet med det senaste inlägget kommer först. +forum#:#frm_sticky_threads_manual_sorting#:#Sortera toppämnen manuellt +forum#:#frm_sticky_threads_manual_sorting_info#:#Toppämnen visas alltid överst i listan över ämnen. Moderatorn kan sortera de översta ämnena enligt sina önskemål. +forum#:#frm_subject_setting#:#Förvald titel på inlägget +forum#:#frm_sure_delete_threads#:#Är du säker på att du vill ta bort följande ämnen? +forum#:#frm_sure_merge_threads#:#Är du säker på att du vill slå ihop dessa två ämnen till ett? Uppmärksamhet +forum#:#frm_task_publishing_draft_title#:#Publicera utkast "%s" +forum#:#frm_wizard_page#:#Kopiera Forum (Steg 2/2) +forum#:#is_read#:#Läs +forum#:#make_topics_non_sticky#:#"Top Topic" Oklassificerat +forum#:#make_topics_sticky#:#Gör theme till en "toppfråga +forum#:#mark_moderator_posts#:#Markera modereringsbidrag###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +forum#:#mark_moderator_posts_desc#:#Moderationens bidrag är markerade i färg ###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +forum#:#merge#:#Sammanslagning +forum#:#merge_posts_into_thread#:#Mergera inlägg med ett annat ämne +forum#:#merged_threads_successfully#:#De utvalda ämnena sammanfördes framgångsrikt +forum#:#move_chosen_topics#:#Flytta utvalda ämnen +forum#:#move_thread_to_forum#:#Flytta ämnet till ett annat forum +forum#:#new_post#:#Ny post +forum#:#new_thread_with_post#:#Nytt ämne med inlägg +forum#:#no_forum_selected#:#Inget forum valt för flyttåtgärden!###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +forum#:#not_allowed_to_merge_into_another_forum#:#Det är inte möjligt att slå ihop ämnen från olika forum. +forum#:#notification_settings#:#Inställningar för meddelanden +forum#:#notify_censored#:#Censurerade inlägg +forum#:#notify_modified#:#Modifierade bidrag +forum#:#notify_post_deleted#:#Borttagna inlägg +forum#:#notify_thread_deleted#:#Borttagna ämnen +forum#:#notify_uncensored#:#Ocensurerade inlägg +forum#:#number_of_threads#:#Antal ämnen som visas per sida +forum#:#please_choose_target#:#Välj ett tema som mål för sammanslagningen. +forum#:#post_activation_desc#:#Alla bidrag måste aktiveras av moderatorn ###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +forum#:#post_censored_by#:#följande inlägg i forumet "%2$s" censurerades av "%1$s +forum#:#post_censored_comment_by_moderator#:#Inlägget censurerat! Moderatorns anmärkning###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +forum#:#post_deleted_by#:#följande inlägg i forumet "%2$s" raderades av "%1$s +forum#:#post_reply#:#Re +forum#:#post_reply_count#:#Re (%s) +forum#:#post_uncensored_by#:#för följande inlägg har censuren av "%1$s" upphävts +forum#:#post_updated_by#:#följande inlägg i forumet "%2$s" redigerades av "%1$s +forum#:#preset_subject#:#Inläggets titel övertas automatiskt för svaret. +forum#:#publish#:#Publicera +forum#:#reopen_topics#:#Återöppna +forum#:#reply_to_postings#:#Svar +forum#:#reset_limited_view#:#Limited view på denna post och alla poster under den +forum#:#reset_limited_view_button#:#Visa hela tråden +forum#:#reset_limited_view_info#:#Limited view på denna post och alla poster under den +forum#:#restore#:#Restaurera +forum#:#restore_draft_from_autosave#:#Restore utkast +forum#:#save_draft_successfully#:#Designen har sparats framgångsrikt. +forum#:#sel_threads_already_sticky#:#Minst ett av de valda ämnena är redan markerat som ett toppämne +forum#:#sel_threads_already_unsticky#:#Minst ett av de utvalda ämnena är redan inte längre ett toppämne +forum#:#sel_threads_make_sticky#:#De utvalda ämnena markerades som toppämnen +forum#:#sel_threads_make_unsticky#:#De valda ämnena är inte längre markerade som toppämnen +forum#:#select_at_least_one_thread#:#Minst ett ämne måste väljas. +forum#:#select_max_one_thread#:#Välj endast ett ämne! +forum#:#selected_threads_closed#:#De valda ämnena var stängda +forum#:#selected_threads_reopened#:#De utvalda temana har öppnats igen +forum#:#sort_by_date#:#Sortera efter datum +forum#:#sort_by_date_desc#:#Temat presenteras i platt vy. Inläggen visas i den kronologiska ordning som de skapades. +forum#:#sort_by_posts#:#Sortera efter inlägg +forum#:#sort_by_posts_desc#:#Ämnet presenteras i en trädvy. Svar på inlägg visas i den ordning de är relaterade till varandra. +forum#:#sorting#:#Sortering +forum#:#sorting_manual_sticky#:#Sortering av de bästa temana +forum#:#sticky#:#'Top Ämne +forum#:#sticky_threads_sorting#:#Topp Ämne Sortera +forum#:#sure_delete_drafts#:#Är du säker på att du vill radera de markerade utkasten? +forum#:#switch_threads_for_merge#:#Det valda temat är äldre än måltemat. För att skapa en meningsfull sammanslagning byts käll- och målteman ut. +forum#:#target_select#:#Välj inlägg för begränsad visning +forum#:#thread#:#Topic +forum#:#thread_deleted_by#:#Följande ämne i forumet %2$s har tagits bort av %1$s +forum#:#threads_moved_successfully#:#De valda ämnena har framgångsrikt flyttats till ett annat forum. +forum#:#topic_close#:#sluten +forum#:#topics_please_select_one_action#:#Vänligen välj en åtgärd. +forum#:#user_decides_notification#:#Medlemmar måste själva aktivera aviseringar. +glo#:#glo_add_from_other#:#Samla in villkor +glo#:#glo_col_ordering_info#:#Sortera titlarna på de metadatafält som visas som kolumnrubriker i presentationsvyn för ordlistan. +glo#:#glo_collection#:#Kollektiv ordlista +glo#:#glo_collection_info#:#Ordlistan samlar automatiskt in ytterligare termer från andra ordlistor. +glo#:#glo_content_assembly#:#Sammansättning av innehållet +glo#:#glo_copy#:#Kopiera ordlista +glo#:#glo_copy_terms#:#Kopieringsvillkor +glo#:#glo_link_glo_in_glo#:#Ska alla ordlistetermer från målordlistan nu länkas till den befintliga ordlistan? +glo#:#glo_page_type_gdf#:#Definition av termer +glo#:#glo_please_select_other_glo#:#Välj en annan ordlista. +glo#:#glo_reference#:#Länk +glo#:#glo_reference_terms#:#Länkvillkor +glo#:#glo_referenced_term#:#Länkade termer +glo#:#glo_select_source_glo#:#Välkomna att välja källans ordlista. +glo#:#glo_select_terms#:#Välj villkor +glo#:#glo_selected_terms_have_been_copied#:#De valda termerna har kopierats till urklipp. Öppna målordlistan och klicka sedan på "Klistra in". +glo#:#glo_term#:#Glossarisk term +glo#:#glo_term_reference#:#termlink +grp#:#crs_add_grouping#:#Ny begränsning av medlemskap +grp#:#crs_grouping_delete_sure#:#Är du säker på att du vill att denna medlemsrestriktion ska tas bort? +grp#:#crs_grouping_deleted#:#Begränsningen för medlemskap har tagits bort. +grp#:#crs_grouping_select_one#:#Vänligen gör ett urval. +grp#:#crs_grp_added_grouping#:#En ny medlemsbegränsning har skapats. +grp#:#crs_grp_assign_crs#:#Gruppuppgift +grp#:#crs_grp_no_courses_assigned#:#Det finns inga grupper tilldelade. +grp#:#events#:#Sessioner +grp#:#grouping_change_assignment#:#Ändra uppdrag +grp#:#grp_activate_notification#:# Aktivera avisering +grp#:#grp_add_to_group#:#Lägg till i grupp +grp#:#grp_add_user#:#Lägg till användare +grp#:#grp_add_user_to_group#:#Lägg till användare i grupp +grp#:#grp_added_to_list#:#Du har lagts till på väntelistan för gruppen "%s".
Du har placerat %s på väntelistan. +grp#:#grp_admins#:#Administratörer +grp#:#grp_admission_link_failure_invalid_code#:#Ingen sammankoppling möjlig. Länken är inte giltig. +grp#:#grp_admission_link_failure_membership_limited#:#Ingen anslutning möjlig. Antalet medlemmar i gruppen är begränsat. +grp#:#grp_admission_link_failure_registration_period#:#Ingen anslutning möjlig. Registreringen för gruppen ligger utanför accessionsperioden. +grp#:#grp_admission_link_success_registration#:#Successfully joined the group "%s". +grp#:#grp_agree#:#Acceptance +grp#:#grp_agreement_header#:#Användningsavtal +grp#:#grp_agreement_required#:#Du kan endast komma åt gruppinnehållet om du godkänner användaravtalet. +grp#:#grp_already_assigned#:#Du har redan ansökt om att bli medlem i denna grupp. +grp#:#grp_at_least_one_admin#:#Minst en administratör måste vara tilldelad denna grupp. +grp#:#grp_auto_notification#:#Välkomstmail för nya medlemmar +grp#:#grp_auto_notification_info#:#Mailaviseringar skickas automatiskt till de medlemmar som har lagts till i gruppen av en administratör. +grp#:#grp_cancel_subscr_request#:#Tillbakadragande av ansökan om antagning +grp#:#grp_cancellation_end#:#Senaste grupputgång +grp#:#grp_cancellation_end_info#:#Medlemmar kan endast avsluta sitt gruppmedlemskap självständigt fram till det angivna datumet. +grp#:#grp_cancellation_end_rbac_info#:#Avbokningens slutdatum nåddes den %s. Utträde ur gruppen är nu inte längre möjligt. +grp#:#grp_cdf_edit_member#:#Redigera personliga uppgifter för denna grupp +grp#:#grp_cdf_tbl_last_edit#:#Uppdaterad (gruppspecifika uppgifter) +grp#:#grp_change_type#:#Ändra grupptyp +grp#:#grp_contact#:#Stöd +grp#:#grp_copy#:#Kopiera grupp +grp#:#grp_create_and_add_user#:#Skapa och lägg till +grp#:#grp_create_new#:#Skapa ny grupp +grp#:#grp_create_new_grp_in#:#Skapa en ny grupp i '%1'. +grp#:#grp_create_or_use_existing#:#Vill du lägga till användaren i en befintlig grupp eller skapa en ny grupp? +grp#:#grp_created_and_user_been_added#:#Gruppen har skapats och användaren har lagts till. +grp#:#grp_custom_user_fields#:#Personuppgifter +grp#:#grp_deactivate_notification#:#Avaktivera avisering +grp#:#grp_edit_members#:#Deltagarstyrning +grp#:#grp_enable_map#:#Aktivera gruppkort +grp#:#grp_err_registration_limited#:#Ange ett giltigt start- och slutdatum för registreringen. +grp#:#grp_export_members#:#Deltagarexport +grp#:#grp_general_informations#:#Allmän information +grp#:#grp_grp_info_reg#:#Följande grupper omfattas av en medlemsbegränsning. Du kan bara gå med i en av dessa grupper +grp#:#grp_grp_open#:#Öppen grupp +grp#:#grp_header_delete_members#:#Du vill avregistrera följande medlemmar från gruppen? +grp#:#grp_header_waiting_list#:#Väntelista +grp#:#grp_icon_settings#:#Icon +grp#:#grp_import#:#Importgrupp +grp#:#grp_info_agree#:#Jag håller med om att ovanstående data kan visas av gruppadministratörer. +grp#:#grp_info_agreement#:#Följande data kan visas av gruppadministratörer +grp#:#grp_info_new_grp_type#:#Ny grupptyp +grp#:#grp_info_settings#:#Gruppinformation +grp#:#grp_information#:#Viktig information +grp#:#grp_information_info#:#Den information som ges här kommer att visas på infosidan och under gruppregistreringen. +grp#:#grp_join_request#:#Skicka +grp#:#grp_lim_assigned#:#Är redan medlem i gruppen "%s". +grp#:#grp_mail_admission_new_bod#:#Du ingår i gruppen "%s". +grp#:#grp_mail_admission_new_sub#:#Medlemskap i gruppen "%s +grp#:#grp_mail_all#:#För alla medlemmar +grp#:#grp_mail_all_info#:# Medlemmar och administratörer kan använda funktionen "Mail till medlemmar" på fliken Medlemmar. +grp#:#grp_mail_dismiss_bod#:#Ditt medlemskap i gruppen "%s" har avslutats. +grp#:#grp_mail_dismiss_sub#:#Medlemskap i grupp "%s" avslutat +grp#:#grp_mail_notification_reg_bod#:#%s har gått med i gruppen "%s". +grp#:#grp_mail_notification_reg_req_bod#:#%s har skickat in en medlemsansökan för gruppen "%s". +grp#:#grp_mail_notification_reg_req_bod2#:#För att ta upp användaren i gruppen eller avvisa begäran måste du ringa upp medlemsadministrationen. För att göra detta, vänligen välj följande länk +grp#:#grp_mail_notification_reg_req_sub#:#Ansökan om antagning till grupp "%s +grp#:#grp_mail_notification_reg_sub#:#Nytt medlemskap i gruppen "%s +grp#:#grp_mail_notification_unsub_bod#:#Deltagaren "%s" har avslutat sitt medlemskap i gruppen "%s". +grp#:#grp_mail_notification_unsub_bod2#:#Deltagare kan finnas på väntelistan för denna grupp. För att se listan över deltagare, vänligen gå till följande länk +grp#:#grp_mail_notification_unsub_sub#:#Avsluta från gruppen "%s" +grp#:#grp_mail_permanent_link#:#Välj följande länk för att komma åt gruppens innehåll +grp#:#grp_mail_status_bod#:#Din status i gruppen "%s" har ändrats. +grp#:#grp_mail_status_sub#:#Status i grupp "%s +grp#:#grp_mail_sub_acc_bod#:#Du har inkluderats i gruppen "%s". +grp#:#grp_mail_sub_acc_sub#:#Inspelning i grupp "%s +grp#:#grp_mail_sub_dec_bod#:#Din ansökan om inträde i gruppen "%s" har avslagits. +grp#:#grp_mail_sub_dec_sub#:#Avslag på ansökan om antagning till grupp "%s +grp#:#grp_mail_subscribe_member_bod#:#vi har nöjet att informera dig om att din antagning till gruppen "%s" har ägt rum. +grp#:#grp_mail_subscribe_member_sub#:#Din registrering för gruppen "%s +grp#:#grp_mail_tutors_only#:#Endast för administratörer +grp#:#grp_mail_tutors_only_info#:#Endast administratörer kan använda funktionen "Mail till medlemmar" på fliken Medlemmar. +grp#:#grp_mail_type#:#Mail till medlemmar +grp#:#grp_mail_unsubscribe_member_bod#:#vi bekräftar din avregistrering från gruppen "%s". +grp#:#grp_mail_unsubscribe_member_sub#:#Din avregistrering från gruppen "%s" +grp#:#grp_mail_wl_bod#:#Du har placerats på väntelistan för gruppen "%s" och har positionen %s på väntelistan. Du kommer att meddelas via e-post så snart din ansökan om tillträde har godkänts eller avslagits. +grp#:#grp_mail_wl_sub#:#Din registrering för gruppen "%s +grp#:#grp_map_location#:#Lokalisering på gruppkarta +grp#:#grp_map_settings#:#Inställningar map +grp#:#grp_max_and_min_members_invalid#:#Det lägsta antalet måste vara mindre än det högsta antalet. +grp#:#grp_mem_contacts#:#Stöd för undervisning +grp#:#grp_mem_tbl_header#:#Gruppdeltagare +grp#:#grp_member_administration#:#Deltagarstyrning +grp#:#grp_members#:#Medlemmar +grp#:#grp_members_deleted#:#De valda medlemmarna har tagits bort från gruppen. +grp#:#grp_members_map#:#Map Gruppmedlemmar +grp#:#grp_members_print_title#:#Gruppmedlemmar +grp#:#grp_min_one_admin#:#Minst ett konto med rollen "gruppadministration" måste vara tilldelat gruppen. +grp#:#grp_missing_grp_type#:#Vänligen välj typ av grupp. +grp#:#grp_missing_password#:#Var god ange ett grupplösenord. +grp#:#grp_new_status#:#Din nya status +grp#:#grp_next#:#Fortsättning +grp#:#grp_no_perm_to_add_create_first#:#Du måste först skapa en ny grupp. Välj den plats där den nya gruppen ska skapas. +grp#:#grp_notification#:#Notifiering +grp#:#grp_notification_activated#:#Notifiering aktiverad +grp#:#grp_notification_deactivated#:#Notifiering avaktiverad +grp#:#grp_notification_explanation_admin#:#Du får det här mailet eftersom aviseringar är aktiverade för dig som gruppchef. +grp#:#grp_notification_salutation#:#Kära gruppdeltagare, +grp#:#grp_notify_off#:#Notifieringar om nya registreringar avaktiverade +grp#:#grp_notify_on#:#Notifieringar om nya registreringar aktiverade +grp#:#grp_pass_request#:#Join med grupplösenord +grp#:#grp_period#:#Händelseperiod +grp#:#grp_period_info#:#Information om start och slut för det evenemang som ska stödjas med gruppen. +grp#:#grp_presentation_type#:#Visa +grp#:#grp_print_list#:#Skapa lista +grp#:#grp_public#:#Publik grupp +grp#:#grp_public_info#:#Gruppen är också synlig för icke-medlemmar. Särskilda regler gäller dock för att erhålla medlemskap. +grp#:#grp_reg_code#:#Anmäl dig via länk +grp#:#grp_reg_code_enabled_info#:#Beroende på det valda anslutningsförfarandet och grupprättigheterna, möjliggör detta alternativ direkt anslutning genom att ringa upp en länk. +grp#:#grp_reg_code_link#:#Länk för direkt anslutning +grp#:#grp_reg_deac_info_screen#:#Ingen inspelning är möjlig för tillfället. +grp#:#grp_reg_direct#:#Direkt anslutning +grp#:#grp_reg_direct_info_screen#:#Du kan gå med i den här gruppen direkt. +grp#:#grp_reg_disabled#:#För närvarande är det inte möjligt att ansluta sig. +grp#:#grp_reg_disabled_info#:#Endast gruppadministratörer kan lägga till användare i gruppen. +grp#:#grp_reg_limited#:#Tillfällig anslutning +grp#:#grp_reg_max_members_info#:#När det maximala antalet medlemmar har uppnåtts är det inte längre möjligt att ansluta sig självständigt. +grp#:#grp_reg_no_selfreg#:#Ingen oberoende accession +grp#:#grp_reg_passwd_info_screen#:#Om du har fått grupplösenordet från en gruppadministratör kan du gå med i den här gruppen. +grp#:#grp_reg_password_info#:#Användare måste ange detta lösenord för att gå med i gruppen. +grp#:#grp_reg_req_info_screen#:#Du kan ansöka om att bli medlem i denna grupp. Så snart en gruppadministratör har godkänt eller avslagit din ansökan kommer du att meddelas via e-post. +grp#:#grp_reg_request#:#Tillträde efter bekräftelse +grp#:#grp_reg_request_info#:#Bli medlem först när det bekräftats av en gruppadministratör. +grp#:#grp_reg_subject#:#Meddelande +grp#:#grp_registration_unlimited#:#Tidsmässigt obegränsad +grp#:#grp_role_status#:#Roll/Status +grp#:#grp_search_users#:#Sök användare +grp#:#grp_selected_users#:#Utvalda deltagare +grp#:#grp_set_on_waiting_list#:#När du ansöker om inträde kommer du att sättas upp på väntelistan. Du kommer sedan att få besked från gruppledningen om din ansökan har godkänts eller avslagits. +grp#:#grp_setting_header_presentation#:#Presentation +grp#:#grp_setting_header_registration#:#Self entry av användaren +grp#:#grp_settings#:#Gruppens inställningar +grp#:#grp_show_members#:#Medlemmarnas galleri +grp#:#grp_show_members_info#:#Alla medlemmar kan se medlemsgalleriet på fliken "Medlemmar". +grp#:#grp_subscription_min_members_info#:#Om det erforderliga minimiantalet medlemmar inte uppnås, kan gruppen inte äga rum. Om minimiantalet medlemmar inte har uppnåtts vid slutet av anslutningsperioden eller den senaste gruppavslutningen, skickar ILIAS ett e-postmeddelande till de gruppadminis +grp#:#grp_sure_add_user_to_group#:#Vill du verkligen lägga till användaren i gruppen? +grp#:#grp_sure_create_group_add_user#:#Vill du verkligen skapa grupperna och lägga till användaren? +grp#:#grp_typ#:#Typ +grp#:#grp_unsubscribe#:#Avsluta gruppmedlemskap +grp#:#grp_update_subscr_request#:#Uppdatera ansökan om antagning +grp#:#grp_use_existing#:#Använd befintlig grupp +grp#:#grp_user_agreement#:#Personliga profiluppgifter +grp#:#grp_user_agreement_info#:#Om följande information finns tillgänglig i din personliga profil kan den visas av gruppadministrationen. +grp#:#grp_user_already_in_group#:#Den valda användaren är redan medlem i gruppen. +grp#:#grp_user_been_added#:#Användaren har lagts till i gruppen. +grp#:#grp_users_already_assigned#:#En användare är redan medlem i denna grupp. +grp#:#grp_usr_agreement#:#Användaravtal +grp#:#grp_view_info_by_type#:#Alla objekt av en viss typ visas i en separat lista. +grp#:#grp_view_info_simple#:#Alla objekt visas i en enda lista. +grp#:#grp_view_inherit#:#Bestäms av kurs +grp#:#grp_view_inherit_info#:#Om synen på den överordnade kursen ändras, ändras även gruppens syn. +grp#:#grp_waiting_list#:#Väntelista +grp#:#grp_waiting_list_autofill#:#Med automatisk framflyttning +grp#:#grp_waiting_list_autofill_info#:#Deltagare flyttas automatiskt upp från väntelistan i händelse av avbokningar. Detta bör inte användas i samband med förfarandet "gå med efter bekräftelse" eftersom det kringgår bekräftelsen. +grp#:#grp_waiting_list_info#:#Om det maximala antalet medlemmar uppnås kan ytterligare användare placeras på en väntelista. +grp#:#grp_waiting_list_no_autofill#:#Utan automatisk framflyttning +grp#:#grp_warn_grp_type_changed#:#Är du säker på att du vill ändra grupptyp? Rättighetsinställningarna för den här gruppen skrivs över och anpassas till den nya typen av grupp. +grp#:#grp_warn_no_max_set_on_waiting_list#:#Det maximala antalet deltagare har uppnåtts. Du kan dock sätta upp ditt namn på väntelistan för denna grupp och kommer då att meddelas via e-post om du kan flytta upp. +grp#:#grp_warn_wl_set_on_waiting_list#:#Det finns redan användare på väntelistan. Du kan dock sätta upp dig på väntelistan för denna grupp och kommer då att meddelas via e-post om du kan flytta upp. +grp#:#grp_wrong_max_members#:#Ett maximalt antal medlemmar krävs för väntelistan. +grp#:#grp_wrong_min_max_members#:#Ange ett lägsta eller högsta antal - eller båda. +grp#:#grp_wrong_reg_time_limit#:#Kontrollera dina poster för registreringsperioden. +grp#:#reg_grp_max_members#:#Maximalt antal +grp#:#reg_grp_max_members_short#:#Begränsat antal medlemmar +grp#:#reg_grp_min_members#:#Minsta antal +help#:#help_all#:#Alla +help#:#help_component#:#Komponent +help#:#help_filter#:#Filter +help#:#help_help_file#:#Hjälp på nätet +help#:#help_help_only#:#Endast instruktioner för åtgärder +help#:#help_imported_on#:#Importerad på +help#:#help_module_uploaded#:#Hjälppaket uppladdat +help#:#help_modules#:#Hjälp paket +help#:#help_no_content#:#Tyvärr finns ingen hjälp tillgänglig för den aktuella vyn. Du kan använda sökningen för att hitta hjälpinnehåll. +help#:#help_open_online_help#:#Öppen hjälp online +help#:#help_search_label#:#Sökning i Help +help#:#help_select_a_file#:#Välj en fil. +help#:#help_set_mode#:#Ställ in hjälpläge +help#:#help_sure_delete_help_modules#:#Vill du verkligen ta bort dessa paket? +help#:#help_toggle_tooltips#:#Hjälp Verktygstips +help#:#help_toggle_tooltips_info#:#Visa hjälpverktygstips för menyer och flikar. +help#:#help_tooltip_id#:#Tooltip ID +help#:#help_tooltips#:#Hjälp Verktygstips +help#:#help_tooltips_and_help#:#Tooltips och instruktioner för åtgärder +help#:#help_tooltips_only#:#Endast verktygstips +help#:#help_topcis#:#Ämnen +help#:#help_tt_text#:#Text +iass#:#download_assessment_paper#:#Ladda ner tentamensblad +iass#:#general#:#Allmänt +iass#:#grading#:#Rating +iass#:#grading_info#:#Information om utvärdering +iass#:#grading_record#:#Sammanfattning av bedömningen +iass#:#iass_add#:#Skapa individuell utvärdering +iass#:#iass_add_user_failure#:#En eller flera användare kunde inte läggas till. +iass#:#iass_add_user_success#:#User tillagd som deltagare. +iass#:#iass_added#:#Individuell rating tillagd +iass#:#iass_amend_saved#:#Ändrade provdata har sparats. +iass#:#iass_assessment_not_completed#:#Not yet completed +iass#:#iass_cancel#:#Avbryt +iass#:#iass_changed_by#:#Retrospektivt förändrad +iass#:#iass_confirm_finalize#:#Stäng +iass#:#iass_consultation_hours#:#Talande timmar +iass#:#iass_contact#:#Namn +iass#:#iass_contact_info#:#Kontaktuppgifter +iass#:#iass_content#:#Innehåll +iass#:#iass_content_explanation#:#Ange innehållet i provet här. +iass#:#iass_copy#:#Kopiera individuell utvärdering +iass#:#iass_download#:#Ladda ner +iass#:#iass_edit#:#Inställningar +iass#:#iass_edit_info#:#Inställningar Kontakt +iass#:#iass_edit_record#:#Datum för tentamen +iass#:#iass_event_time#:#Tidpunkt för undersökningen +iass#:#iass_event_time_place_required#:#Obligatorisk tid och plats +iass#:#iass_event_time_place_required_info#:#Tid och plats för undersökningen måste anges. +iass#:#iass_file#:#Fil +iass#:#iass_file_dropzone#:#Dra din fil hit +iass#:#iass_file_required#:#Obligatoriskt angivande av examinationsformulär +iass#:#iass_file_required_info#:#Ett provformulär måste laddas upp. +iass#:#iass_file_visible_examinee#:#Filen synlig för deltagarna +iass#:#iass_filter_all#:#Alla +iass#:#iass_filter_failed#:#Endast misslyckad +iass#:#iass_filter_finalized#:#Endast godkänd +iass#:#iass_filter_not_finalized#:#Endast ej avslutad +iass#:#iass_filter_not_started#:#Endast oklassificerad +iass#:#iass_finalize#:#Stäng +iass#:#iass_finalize_info#:#Den individuella bedömningen är slutförd. +iass#:#iass_finalize_user_qst#:#Bör bedömningen av deltagaren verkligen vara klar? Ändringar av bedömningen är inte längre möjliga i efterhand. +iass#:#iass_further_field_headline#:#Detaljerad information +iass#:#iass_graded_by#:#Rated by +iass#:#iass_info_emails_expl#:#Du kan ange flera adresser åtskilda av ett kommatecken. +iass#:#iass_internal_note#:#Interna anteckningar om undersökningen +iass#:#iass_internal_note_info#:#Den här anteckningen är endast synlig för handledare som kan se deltagarnas examinationsdata. Deltagarna själva ser inte tentamensanteckningen. +iass#:#iass_location#:#Plats +iass#:#iass_mails#:#E-post +iass#:#iass_may_not_finalize#:#Exam kan inte betygsättas slutgiltigt ännu. Vänligen ge ett betyg. +iass#:#iass_membership_finalized#:#Utvärderingen slutförd. +iass#:#iass_membership_saved#:#Utvärderingen har sparats men ännu inte slutförts. +iass#:#iass_mess_notification_completed#:#Du har klarat provet "%s". Vänligen notera även följande notering på tentan. +iass#:#iass_mess_notification_failed#:#Du har tyvärr inte klarat provet "%s". Vänligen notera även följande information om provet. +iass#:#iass_no_entries#:#Inga poster hittades +iass#:#iass_notify#:#Göra resultatet tillgängligt för deltagaren +iass#:#iass_notify_explanation#:#Deltagaren kommer att meddelas via e-post när bedömningen är klar och kan se bedömningsanteckningen på Info-sidan. +iass#:#iass_phone#:#Telefon +iass#:#iass_place#:#Plats för undersökningen +iass#:#iass_record#:#Examensanteckning +iass#:#iass_record_info#:#Examinationsanteckningen kan ses av deltagaren efter den slutliga bedömningen. Om meddelandet nedan är aktiverat får deltagaren även examinationsanteckningen via e-post. +iass#:#iass_record_template#:#Template Examination Note +iass#:#iass_record_template_explanation#:#Text som skrivs in här fungerar som en mall för examensanteckningen och används för varje ny deltagare. +iass#:#iass_remove_user_qst#:#Ska deltagaren verkligen tas bort? +iass#:#iass_responsibility#:#Kompetens +iass#:#iass_save_amend#:#Spara ändrade tentamensdata +iass#:#iass_settings_saved#:#Sparade inställningar. +iass#:#iass_sort_changetime_asc#:#Sista ändring ? stigande +iass#:#iass_sort_changetime_desc#:#Sista ändring ? fallande +iass#:#iass_sort_examiner_login_asc#:#Rated from ? ascending###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +iass#:#iass_sort_examiner_login_desc#:#Rated from ? descending###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +iass#:#iass_sort_name_asc#:#Login name ? ascending###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +iass#:#iass_sort_name_desc#:#Login name ? descending###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +iass#:#iass_status_completed#:#Bekräftad +iass#:#iass_status_failed#:#Misslyckad +iass#:#iass_status_pending#:#Not yet rated +iass#:#iass_subj_notification_completed#:#%s +iass#:#iass_subj_notification_failed#:#%s +iass#:#iass_upload_file#:#Examensblad +iass#:#iass_user_removed#:#User har framgångsrikt tagits bort. +iass#:#iass_usr_amend#:#Ändra provdata retrospektivt +iass#:#iass_usr_download_attachment#:#Ladda ner fil +iass#:#iass_usr_edit#:#Rating +iass#:#iass_usr_remove#:#Remove +iass#:#iass_usr_view#:#Datum för tentamen +iass#:#il_iass_member#:#Deltagare +iass#:#il_iass_members#:#Deltagare +iass#:#lp_inactive#:#Titta på +iass#:#save_amend#:#Spara ändrade tentamensdata +impr#:#impr_page_type_impr#:#Imprint +init#:#init_error_authentication_fail#:#Autentisering misslyckades. +init#:#init_error_maintenance#:#Servern är för närvarande inte tillgänglig på grund av underhållsarbete. Vi ber om din förståelse. Vänligen försök igen senare. +init#:#init_error_redirect_click#:#Vänligen klicka för att fortsätta. +init#:#init_error_redirect_info#:#Framåtblickar stöds inte av sammanhanget. +irss#:#max_revision#:#Max. Revision +irss#:#resource_id#:#Resurs-ID +irss#:#stakeholders#:#Intressenter +irss#:#storage_id#:#ID för lagring +irss#:#storage_info#:#Information om lagring +itgr#:#itgr_always_open#:#Alltid öppen +itgr#:#itgr_assign_materials#:#Välj objekt +itgr#:#itgr_assigned_materials#:#Objekt i objektblocket +itgr#:#itgr_assignment#:#Integrerad +itgr#:#itgr_behaviour#:#Beteende +itgr#:#itgr_behaviour_info#:#Systemet kommer ihåg status (öppen/stängd) för varje användare fram till utloggningen. +itgr#:#itgr_desc_info#:#Beskrivningen visas inte när objektblocket visas. +itgr#:#itgr_edit#:#Inställningar för objektblocket +itgr#:#itgr_expandable_closed#:#Fold-out (ursprungligen stängd) +itgr#:#itgr_expandable_open#:#Fold-out (inledningsvis öppen) +itgr#:#itgr_hide_title#:# Dölj titel +itgr#:#itgr_item#:#Objekt som kan inkluderas +itgr#:#itgr_list#:#Lista +itgr#:#itgr_list_default#:#Standard +itgr#:#itgr_list_default_info#:#Tar över inställningarna för den överordnade behållaren. +itgr#:#itgr_list_presentation#:#Presentationsvy för innehåll +itgr#:#itgr_materials#:#Objekt +itgr#:#itgr_show_title#:#Visa titel +itgr#:#itgr_show_title_info#:#Objektblockets titel visas.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +itgr#:#itgr_tile#:#Kakelplattor +itgr#:#itgr_tile_size#:#Storlek på kakel +jscalendar#:#about_calendar#:#Om kalendern +jscalendar#:#about_calendar_long#:#DHTML Date/Time Selector © dynarch.com 2002-2003 För senaste versionen besök +jscalendar#:#about_time#:#Välja tid +jscalendar#:#close#:#Stäng +jscalendar#:#day_first#:#Visa %s först +jscalendar#:#def_date_format#:#%Y-%m-%d +jscalendar#:#drag_to_move#:#Dra för att flytta +jscalendar#:#go_today#:#Idag +jscalendar#:#l_01#:#Januari +jscalendar#:#l_02#:#Februari +jscalendar#:#l_03#:#Mars +jscalendar#:#l_04#:#April +jscalendar#:#l_05#:#Maj +jscalendar#:#l_06#:#Juni +jscalendar#:#l_07#:#Juli +jscalendar#:#l_08#:#Augusti +jscalendar#:#l_09#:#September +jscalendar#:#l_10#:#Oktober +jscalendar#:#l_11#:#November +jscalendar#:#l_12#:#December +jscalendar#:#l_fr#:#Fredag +jscalendar#:#l_mo#:#Måndag +jscalendar#:#l_sa#:#Lördag +jscalendar#:#l_su#:#Söndag +jscalendar#:#l_th#:#Torsdag +jscalendar#:#l_tu#:#Tisdag +jscalendar#:#l_we#:#Vardag +jscalendar#:#next_month#:#Nästa månad (håll ned för snabbval) +jscalendar#:#next_year#:#Nästa år (håll kvar för snabbval) +jscalendar#:#open_calendar#:#Klicka här för att se en kalender för val av datum (JavaScript krävs!) +jscalendar#:#part_today#:# (idag) +jscalendar#:#prev_month#:#Previous months (Håll ned för snabbval) +jscalendar#:#prev_year#:#Previous year (Håll ned för snabbval) +jscalendar#:#s_01#:#Jan +jscalendar#:#s_02#:#Feb +jscalendar#:#s_03#:#Mär +jscalendar#:#s_04#:#Apr +jscalendar#:#s_05#:#Maj +jscalendar#:#s_06#:#Jun +jscalendar#:#s_07#:#Jul +jscalendar#:#s_08#:#Aug +jscalendar#:#s_09#:#Sep +jscalendar#:#s_10#:#Okt +jscalendar#:#s_11#:#Nov +jscalendar#:#s_12#:#Dec +jscalendar#:#s_fr#:#Fr +jscalendar#:#s_mo#:#Mo +jscalendar#:#s_sa#:#Sa +jscalendar#:#s_su#:#Så +jscalendar#:#s_th#:#Do +jscalendar#:#s_tu#:#Di +jscalendar#:#s_we#:#Mi +jscalendar#:#select_date#:#Välj datum +jscalendar#:#time#:#Tid +jscalendar#:#time_part#:#(Toggle) klicka eller håll och dra för att ändra värdet +jscalendar#:#today#:#Idag +jscalendar#:#tt_date_format#:#%a, %b %e +jscalendar#:#wk#:#KW +ldap#:#add_ldap_server#:#Lägg till server +ldap#:#ldap_add_missing#:#Tilldela roller som saknas +ldap#:#ldap_add_remove#:#Lägg till/ta bort roller +ldap#:#ldap_add_role_ass_rule#:#Ny regel för ILIAS rolltilldelning +ldap#:#ldap_as_ds#:#Använd som datakälla +ldap#:#ldap_as_ds_info#:#I kombination med andra autentiseringstyper (t.ex. CAS eller SAML) används LDAP-konfigurationen endast för att synkronisera uppgifterna i ILIAS-kontona. Direkt autentisering via LDAP är inte möjlig. +ldap#:#ldap_assignment_type#:#Typ av uppdrag +ldap#:#ldap_authentication_settings#:#Inställningar för autentisering +ldap#:#ldap_bind_anonymous#:#Ankoppla anonymt +ldap#:#ldap_bind_user#:#Anslut som användare +ldap#:#ldap_btn_add_role_ass#:#Skapa ny regel +ldap#:#ldap_check_role_assignment#:#Rolltilldelning efter senare inloggningar +ldap#:#ldap_choose_role#:#Välj roll +ldap#:#ldap_confirm_del_role_ass#:#Ta bort rolltilldelning +ldap#:#ldap_deleted_role_mapping#:#Uppdraget har tagits bort +ldap#:#ldap_deleted_rule#:#Vald rolltilldelning borttagen +ldap#:#ldap_dn_info#:#Välj den fullständiga DN för LDAP-gruppen här. +ldap#:#ldap_edit_role_ass_rule#:#Redigera regel för rolltilldelning +ldap#:#ldap_edit_role_assignment#:#Redigera uppdrag +ldap#:#ldap_err_missing_plugin_id#:#Var god ange ett giltigt plugin-id. +ldap#:#ldap_escapedn#:#Mask DN +ldap#:#ldap_escapedn_info#:#Om aktiverat maskeras reserverade tecken i "Distinguished Name (DN)" för frågor om gruppmedlemskap. +ldap#:#ldap_filter_info#:#Filter har lagts till i sökfiltret enligt följande +ldap#:#ldap_global_role#:#Global roll +ldap#:#ldap_global_role_assignment#:#Rolltilldelning +ldap#:#ldap_global_role_info#:#Välj en global roll för nya ILIAS-användare som ska skapas. *Rollen krävs när du har valt en synkroniseringstyp. +ldap#:#ldap_group_attribute#:#Attributnamn för gruppen +ldap#:#ldap_group_attribute_info#:# Ange gruppens attributnamn här. +ldap#:#ldap_group_dn#:#Grupper DN +ldap#:#ldap_group_dn_info#:#Sökbas för gruppsökningen. Föregår "BaseDN". T.EX. +ldap#:#ldap_group_dn_short#:#Grupp DN +ldap#:#ldap_group_filter#:#LDAP-filter +ldap#:#ldap_group_filter_info#:#Filter har lagts till i sökfiltret enligt följande +ldap#:#ldap_group_member#:#Attributnamn för gruppmedlemmarna +ldap#:#ldap_group_member_info#:#Ange här attributnamnet som gruppmedlemmarna ska tilldelas. Välj 'Attributvärdet är DN' om medlemsnamnen skapas som DN. +ldap#:#ldap_group_member_optional#:#Optionellt gruppmedlemskap +ldap#:#ldap_group_member_short#:#Attribut +ldap#:#ldap_group_membership#:#Gruppmedlemskap +ldap#:#ldap_group_name#:#Gruppens namn +ldap#:#ldap_group_name_info#:#Namn på gruppen +ldap#:#ldap_group_optional_info#:#Om det är aktiverat krävs inte gruppmedlemskap för att autentiseringen ska lyckas. Ange ett användarfilter för dessa gruppmedlemmar +ldap#:#ldap_group_restrictions#:#Grupprestriktioner +ldap#:#ldap_group_scope#:#Sökningsområde +ldap#:#ldap_group_scope_info#:#Area för gruppsökning. Om du är osäker, välj "Sub". +ldap#:#ldap_group_search_base#:#Sökbas +ldap#:#ldap_group_user_filter#:#Användarfilter +ldap#:#ldap_ilias_role#:#ILIAS rollnamn +ldap#:#ldap_info_text#:#Informationstext +ldap#:#ldap_info_text_info#:#Du kan ange en informationstext här som visas på informationssidan för det objekt som är kopplat till rollen. Eventuellt kan denna text också visas i magasinet och på instrumentpanelen. +ldap#:#ldap_local_role#:#Lokal roll +ldap#:#ldap_mapping_info_type#:#Display i tidningen också. +ldap#:#ldap_mapping_table#:#Tilldelning av datafält för ILIAS-konton till LDAP-attribut +ldap#:#ldap_mapping_template#:#Använd mall för objektklass +ldap#:#ldap_member_info#:#Ange här attributnamnet som gruppmedlemmarna ska tilldelas. Välj 'Attributvärdet är DN' om medlemsnamnen skapas som DN. +ldap#:#ldap_memberisdn#:#Attributets värde är DN +ldap#:#ldap_missing_bind_user#:#Du har valt 'Anslut som användare' som anslutningstyp. +ldap#:#ldap_missing_role_assignment#:#Välj en global roll som nyskapade användare ska tilldelas. +ldap#:#ldap_moment_sync#:#Typ av synkronisering +ldap#:#ldap_new_role_assignment#:#Skapa nytt uppdrag +ldap#:#ldap_plugin#:#Uppgift via plugin +ldap#:#ldap_plugin_id#:#Plugin-Id +ldap#:#ldap_plugin_info#:#Kontrollera rolltilldelningen via plugin. Ange ett giltigt plugin-ID för detta ändamål. +ldap#:#ldap_referrals#:#Framåt +ldap#:#ldap_referrals_info#:#Bestämmer om LDAP-serverns vidarebefordringar ska följas automatiskt eller inte. +ldap#:#ldap_remove_deprecated#:#Ta bort obehöriga roller +ldap#:#ldap_role_active#:#Gruppuppdatering påslagen +ldap#:#ldap_role_assignments#:#Rolltilldelning +ldap#:#ldap_role_at_info#:#Tilldelningen baseras på ett specifikt attribut för LDAP-kontot.###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +ldap#:#ldap_role_at_name#:#Attributets namn +ldap#:#ldap_role_at_value#:#Attributets värde +ldap#:#ldap_role_bind_pass#:# Lösenord +ldap#:#ldap_role_bind_pass_info#:#Lösenord för LDAP-användaren. +ldap#:#ldap_role_bind_user#:#Login namn +ldap#:#ldap_role_bind_user_info#:#Ange ett LDAP-inloggningsnamn. Denna användare måste ha skrivbehörighet till de grupper som ska uppdateras. +ldap#:#ldap_role_by_attribute#:#Användarattribut +ldap#:#ldap_role_by_group#:#Gruppmedlemskap +ldap#:#ldap_role_by_plugin#:#Per plugin +ldap#:#ldap_role_group_assignments#:#Befintliga uppdrag +ldap#:#ldap_role_grp_at#:#Attribut +ldap#:#ldap_role_grp_dn_info#:#Ange gruppens fullständiga "Distinguished Name". +ldap#:#ldap_role_grp_info#:#Medlemmar i en specifik LDAP-grupp tilldelas den angivna ILIAS-rollen. +ldap#:#ldap_role_grp_isdn#:#Attributets värde är DN +ldap#:#ldap_role_info#:#Ange namnet på den ILIAS-roll som ska kontrollera LDAP-gruppmedlemskapet. +ldap#:#ldap_role_mapping#:#Tilldelning av ILIAS-roller ? LDAP-grupper +ldap#:#ldap_role_name_info#:#Välj antingen en global roll eller ange namnet på en lokal roll. +ldap#:#ldap_role_not_exists#:#En ILIAS-roll med följande namn existerar inte +ldap#:#ldap_role_selection#:#Urval av roller +ldap#:#ldap_role_selection_info#:#Ditt val är inte unikt. Vänligen välj en av rollerna nedan. +ldap#:#ldap_role_settings#:#Inställningar för uppdatering av LDAP-grupper +ldap#:#ldap_rule_condition#:#Kondition +ldap#:#ldap_rule_type#:#Typ av uppdrag +ldap#:#ldap_scope_one#:#En +ldap#:#ldap_scope_sub#:#Sub +ldap#:#ldap_search_base_info#:#Sökbas för användarens sökning. Föregår "BaseDN". T.EX. +ldap#:#ldap_search_filter#:#LDAP-filter +ldap#:#ldap_server_bind_dn#:#Användarens DN +ldap#:#ldap_server_bind_pass#:# Lösenord +ldap#:#ldap_server_binding#:#Typ av anslutning +ldap#:#ldap_server_name#:#Namn på LDAP-konfigurationen +ldap#:#ldap_server_name_info#:#Välj ett namn för denna serverkonfiguration! +ldap#:#ldap_server_security_settings#:#Säkerhetsinställningar +ldap#:#ldap_server_short#:#URL till server +ldap#:#ldap_server_url_info#:#Den fullständiga URL-adressen för anslutningen till LDAP-servern. T.ex. "ldap +ldap#:#ldap_server_version_info#:#Protokollversion för LDAP-servern (i de flesta fall "LDAPv3"). +ldap#:#ldap_servers#:#LDAP-server +ldap#:#ldap_settings#:#Inställningar för server +ldap#:#ldap_sync_cron#:#Per Cron Jobb +ldap#:#ldap_sync_login#:#När användaren loggar in +ldap#:#ldap_tbl_role_ass#:#Regler för tilldelning av aktiv roll +ldap#:#ldap_tls_conflict#:#LDAP-TLS kan inte användas i kombination med protokollversion 2. +ldap#:#ldap_update_field_info#:#Automatisk uppdatering +ldap#:#ldap_update_roles#:#Rolltilldelning +ldap#:#ldap_user_attribute#:#Attributnamn för inloggningskonton +ldap#:#ldap_user_dn#:#Sökbas +ldap#:#ldap_user_mapping#:#Tilldelning av profiluppgifter +ldap#:#ldap_user_scope#:#Sökningsområde +ldap#:#ldap_user_scope_info#:#Area för användarens sökning. Om du är osäker, välj "Sub". +ldap#:#ldap_user_sync#:#Inställningar för användarsynkronisering +ldap#:#ldap_user_sync_cron#:#LDAP synkronisering av användare +ldap#:#ldap_user_sync_cron_info#:#Om aktiverat importeras inloggningskonton från LDAP-katalogen och synkroniseras kontinuerligt. +ldap#:#ldap_user_sync_info#:#Bestämmer om användare som ännu inte finns i ILIAS skapas automatiskt vid den första inloggningen eller regelbundet via cron-jobb. +ldap#:#ldap_username_filter#:#Filter för inloggningsnamn +ldap#:#ldap_username_filter_info#:#Använd * som jokertecken. +lhist#:#cont_create_lhist#:#Create element för inlärningshistorik +lhist#:#cont_update_lhist#:#Redigera element för inlärningshistorik +lhist#:#lhist_all#:#Alla +lhist#:#lhist_cont_placeholder_text#:#Detta element visar lärandets framsteg i portföljens presentationsvy. +lhist#:#lhist_enable_learning_history#:#Framsteg inom lärande +lhist#:#lhist_enable_learning_history_info#:#Aktiverar en översikt över alla inlärningsresultat för en användare. +lhist#:#lhist_first_login#:#Första inloggning +lhist#:#lhist_learning_history#:#Framsteg inom lärande +lhist#:#lhist_lhist#:#Framsteg inom lärande +lhist#:#lhist_manual#:#Handbok +lhist#:#lhist_no_entries#:#Fortsätt att sträva efter dina mål! Lär dig något idag för att förlänga din inlärning. +lhist#:#lhist_period#:#Period +lhist#:#lhist_selected#:#Vald +lhist#:#lhist_show_more#:#Visa mer +lhist#:#lhist_type_of_achievement#:#Typ av framgångsrikt lärande +like#:#like#:#Like +like#:#reaction#:#Reaktion +link#:#link_chapters#:#Kapitel +link#:#link_link#:#Länk +link#:#link_mobs#:#Medieobjekt +link#:#link_terms#:#Termer +link#:#link_wpages#:#Wiki-sidor +lm#:#lm_btn_lp_toggle_state_completed#:#Set till "Ej redigerad +lm#:#lm_btn_lp_toggle_state_not_completed#:#Set till "Redigerad +lm#:#lm_copy#:#Kopiera ILIAS utbildningsmodul +lm#:#lm_edit_chapters#:#Redigera kapitel +lm#:#lm_edit_lm_settings#:#Redigera inställningar för lärmodulen +lm#:#lm_est_reading_time#:#Uppskattad lästid +lm#:#lm_est_reading_time_info#:#I lärmoduler kan en uppskattad lästid bestämmas och visas. +lm#:#lm_page_type_lm#:#sida för utbildningsmodul +lm#:#lm_save_titles#:#Titlar har sparats. +lng#:#language_detection#:#Automatisk taligenkänning +lng#:#lng_disable_language_detection#:#Avaktivera automatisk taligenkänning +lng#:#lng_download_deprecated#:#Ladda ner obsoleta poster +lng#:#lng_enable_language_detection#:#Aktivera automatisk taligenkänning +log#:#log_browser#:#Browser Konsol Logg +log#:#log_browser_users#:#Aktiverade användare för webbläsarlogg +log#:#log_cache_#:#Caching +log#:#log_cache_info#:#När ett meddelande når eller överskrider den inställda cachningsnivån loggas alla meddelanden i den aktuella serverbegäran vars nivå minst motsvarar loggningsnivån. +log#:#log_cache_level#:#Caching-nivå +log#:#log_component_btn_reset#:#Återställ inställningar +log#:#log_component_col_component#:#Komponent +log#:#log_component_col_level#:#Loggnivå +log#:#log_component_root_desc#:#Loggnivå för meddelanden som inte är tilldelade en komponent. +log#:#log_components#:#Komponenter +log#:#log_general_settings#:#Inställningar för loggning +log#:#log_level_alert#:#LARM +log#:#log_level_critical#:#KRITISK +log#:#log_level_debug#:#DEBUG +log#:#log_level_emergency#:#NÖDFALL +log#:#log_level_error#:#ERROR +log#:#log_level_info#:#INFO +log#:#log_level_notice#:#NOTER +log#:#log_level_off#:#Funktionshindrad +log#:#log_level_warning#:#VARNING +log#:#log_log_level#:#Loggnivå +log#:#log_memory#:#Log minnesbehov +logging#:#error_settings_saved#:#Inställningar sparade +logging#:#frm_clear_older_then#:#Radera filer som är äldre än +logging#:#frm_clear_older_then_info#:#Ange perioden i dagar. +logging#:#log_error_file_cleanup_info#:# Raderar gamla eller föräldralösa filer i felloggen. +logging#:#log_error_file_cleanup_title#:#Radera gamla eller övergivna felloggfiler +logging#:#log_error_folder#:#Sökväg till fil +logging#:#log_error_mail#:#Skicka protokollet till (e-postadress) +logging#:#log_error_message#:#Sorry, ett fel har inträffat. En loggfil skapades som kan identifieras med felkoden "%s". +logging#:#log_error_message_send_mail#:# Vänligen kontakta <a href="mailto +logging#:#log_error_path_not_configured_or_wrong#:#Sökvägen till felloggarna (error_path) är inte angiven eller inte tillgänglig. +logging#:#log_error_settings#:#Inställningar för fellogg +logging#:#logs_settings#:#Inställningar för loggning +lso#:#abstract#:#Inledning +lso#:#abstract_img#:#Bild för introduktionssidan +lso#:#avail_time_period#:#Tidsperiod +lso#:#completed_steps#:#Passerade steg +lso#:#condition_always#:#Alltid +lso#:#curriculum#:#Innehåll +lso#:#delete_confirmation#:#Vill du verkligen ta bort följande objekt? +lso#:#entries_deleted#:#Poster har raderats framgångsrikt. +lso#:#entries_updated#:#Ingångar sparade +lso#:#extro#:#Sista sidan +lso#:#extro_img#:#Bild för sista sidan +lso#:#failed#:#Misslyckad +lso#:#finished#:#Fullbordad +lso#:#first_access#:#Första åtkomst +lso#:#last_access#:#Sista åtkomst +lso#:#last_visited_step#:#Sista besökta steg +lso#:#learner_view#:#Översikt +lso#:#lso_activation_online_info#:#Endast när inlärningssekvensen är online kan användare gå med och medlemmar komma åt inlärningssekvensen. Om inte, är inlärningssekvensen endast tillgänglig för administratörer och handledare. +lso#:#lso_at_least_one_admin#:#Minst en administratör måste vara utsedd för denna utbildningssekvens. +lso#:#lso_edit_permission#:#Ändra inställningar för rättigheter +lso#:#lso_header_delete_members#:#Vill du avanmäla följande medlemmar från utbildningssekvensen? +lso#:#lso_header_edit_members#:#Redigera medlemmar +lso#:#lso_intropages_deprecationhint#:#Du kan redigera inlednings- och avslutningssidorna under "Innehåll". +lso#:#lso_mail_admission_new_bod#:#Du har accepterats som medlem i inlärningssekvensen "%s". +lso#:#lso_mail_admission_new_sub#:#Medlemskap i inlärningssekvensen "%s" +lso#:#lso_mail_dismiss_bod#:#Ditt medlemskap i inlärningssekvensen "%s" har upphört. +lso#:#lso_mail_dismiss_sub#:#Medlemskap i utbildningssekvensen "%s" avslutat +lso#:#lso_mail_notification_reg_bod#:#%s har skickat in en ansökan om antagning till utbildningssekvensen "%s". +lso#:#lso_mail_notification_reg_req_bod#:#%s har skickat in en ansökan om antagning till utbildningssekvensen "%s". +lso#:#lso_mail_notification_reg_req_bod2#:#För att godkänna användaren till utbildningssekvensen eller avvisa begäran måste du ringa upp medlemsadministrationen. För att göra detta, vänligen välj följande länk +lso#:#lso_mail_notification_reg_req_sub#:#Inspelning av begäran för inlärningssekvensen "%s" +lso#:#lso_mail_notification_reg_sub#:#Nytt medlemskap i inlärningssekvensen "%s" +lso#:#lso_mail_notification_unsub_bod#:#Deltagaren "%s" har slutfört medlemskapet i utbildningssekvensen "%s". +lso#:#lso_mail_notification_unsub_bod2#:#Deltagare kan stå på väntelistan för denna utbildningssekvens. För att se listan över deltagare, vänligen gå till följande länk +lso#:#lso_mail_notification_unsub_sub#:#Avsluta från inlärningssekvensen "%s" +lso#:#lso_mail_permanent_link#:#Välj följande länk för att komma åt innehållet i inlärningssekvensen +lso#:#lso_mail_status_bod#:#Din status i inlärningssekvensen "%s" har ändrats. +lso#:#lso_mail_status_sub#:#Status i inlärningssekvensen "%s +lso#:#lso_mail_sub_acc_bod#:#Du har inkluderats i inlärningssekvensen "%s". +lso#:#lso_mail_sub_acc_sub#:#Inspelning i inlärningssekvensen "%s" +lso#:#lso_mail_sub_dec_bod#:#Din inskrivningsansökan för utbildningssekvensen "%s" har avvisats. +lso#:#lso_mail_sub_dec_sub#:#Avslag på inskrivningsansökan för utbildningssekvensen "%s +lso#:#lso_mail_subscribe_member_bod#:#vi är glada att kunna informera dig om att din inkludering i inlärningssekvensen "%s" har ägt rum. +lso#:#lso_mail_subscribe_member_sub#:#Din registrering för inlärningssekvensen "%s" +lso#:#lso_mail_unsubscribe_member_bod#:#vi bekräftar din avregistrering från inlärningssekvensen "%s". +lso#:#lso_mail_unsubscribe_member_sub#:#Din utloggning från inlärningssekvensen "%s". +lso#:#lso_mail_wl_bod#:#Du har placerats på väntelistan för inlärningssekvensen "%s" och har positionen %s på väntelistan. Du kommer att meddelas via e-post så snart din ansökan om tillträde har godkänts eller avslagits. +lso#:#lso_mail_wl_sub#:#Din registrering för inlärningssekvensen "%s" +lso#:#lso_mainbar_button_label_curriculum#:#Lärande sekvens +lso#:#lso_mainbar_button_label_toc#:#Innehåll +lso#:#lso_mem_tbl_header#:#Deltagare i inlärningssekvens +lso#:#lso_member_administration#:#Deltagarstyrning +lso#:#lso_members_deleted#:#De utvalda medlemmarna har avregistrerats från inlärningssekvensen. +lso#:#lso_members_gallery#:#Medlemmarnas galleri +lso#:#lso_members_print_title#:#inlärningssekvens medlemmar +lso#:#lso_min_one_admin#:#Minst en administratör måste fortsätta att arbeta med denna utbildningssekvens. +lso#:#lso_msg_member_assigned#:#Användaren/användarna inkluderades i inlärningssekvensen +lso#:#lso_multidownload_not_available#:#Hämtning av olika objekt är för närvarande inte tillgängligt för inlärningssekvensobjekt. +lso#:#lso_new_status#:#Din nya status +lso#:#lso_notification#:#Notifiering +lso#:#lso_notification_explanation_admin#:#Du får det här mailet eftersom aviseringar är aktiverade för dig som handledare för en inlärningssekvens. +lso#:#lso_notify_off#:#Notifieringar om nya registreringar avaktiverade +lso#:#lso_notify_on#:#Notifieringar om nya registreringar aktiverade +lso#:#lso_player_abstract#:#Till inledningen +lso#:#lso_player_extro#:#Till den avslutande sidan +lso#:#lso_player_finish#:#Utgång +lso#:#lso_player_next#:#Fortsättning +lso#:#lso_player_previous#:#Tillbaka +lso#:#lso_player_resume#:#Återuppta inlärningssekvensen +lso#:#lso_player_review#:#Se över inlärningssekvensen +lso#:#lso_player_start#:#Starta inlärningssekvensen +lso#:#lso_player_suspend#:#Interrupt +lso#:#lso_player_viewmodelabel#:#Bearbetning av inlärningssekvensen +lso#:#lso_print_list#:#Skapa lista +lso#:#lso_read#:#Läsning tillgång till Learning Sequence +lso#:#lso_search_users#:#Sök användare +lso#:#lso_settings_availability#:#Tillgänglighet +lso#:#lso_settings_extro#:#Redigera sista sidan +lso#:#lso_settings_intro#:#Redigera introduktionssida +lso#:#lso_settings_old_extro#:#Visa gamla avslutande sidan +lso#:#lso_settings_old_intro#:#Visa gamla introduktionssidan +lso#:#lso_show_members_info#:#Medlemmarnas galleri synligt för användare +lso#:#lso_start_item#:#%s öppna +lso#:#lso_users_already_assigned#:#En användare är redan medlem i denna inlärningssekvens +lso#:#mail_lso_roles#:#Alla personer med följande lokala roller###Modifierad som en del av jämställdhetsarbetet för ILIAS 8. Etiketten är nu generaliserad för alla komponenter som stöder "mail till medlemmar". +lso#:#manage#:#Hantering +lso#:#manage_content_maintab#:#Innehåll +lso#:#members_gallery#:#Medlemmarnas galleri +lso#:#no_entries_selected_for_delete#:#Minst en listpost måste väljas. +lso#:#not_finished#:#Ej slutförd +lso#:#participate#:#Logga in +lso#:#show_summary#:#Info +lso#:#table_actions#:#Åtgärder +lso#:#table_may_proceed#:#Användaren kan fortsätta +lso#:#table_online#:#Online +lso#:#table_position#:#Position +lso#:#table_sequence_content#:#Hantering av innehåll +lso#:#table_title#:#Titel +lso#:#unparticipate#:#Avsluta inlärningssekvensen +lti#:#act_lti_for_obj_type#:#Aktivera LTI för dessa objekttyper +lti#:#activity_id#:#Aktivitets-ID +lti#:#activity_id_info#:#Detta aktivitets-ID används av LTI-leverantören eller verktyget för att identifiera uttalanden. +lti#:#auth_lti#:#LTI Auth +lti#:#conf_privacy_ident#:#Identifiering av användare +lti#:#conf_privacy_ident_il_uuid_ext_account#:#Externt användar-ID kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +lti#:#conf_privacy_ident_il_uuid_ext_account_info#:#Detta är identiskt med varje samtal, men kan göra det möjligt att dra direkta slutsatser om användaren. +lti#:#conf_privacy_ident_il_uuid_login#:#ILIAS-inloggning som e-postadress, kombinerat med ett unikt ILIAS-plattforms-ID om så krävs. +lti#:#conf_privacy_ident_il_uuid_login_info#:#Sänder inloggningsnamnet. Detta är identiskt med varje anrop, men kan tillåta direkta slutsatser till ILIAS-användaren. +lti#:#conf_privacy_ident_il_uuid_random#:#Random ID kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +lti#:#conf_privacy_ident_il_uuid_random_info#:#Ett slumpmässigt ID genereras för varje ILIAS-objekt och ILIAS-användare, som förblir identiskt för varje anrop. Slutsatser om en användare är mycket begränsade, eftersom användarprofiler för flera objekt i praktiken inte kan skapas. +lti#:#conf_privacy_ident_il_uuid_sha256#:#Hash kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +lti#:#conf_privacy_ident_il_uuid_sha256_info#:#Detta är identiskt med varje samtal, men tillåter inte direkta slutsatser om ILIAS-användaren. +lti#:#conf_privacy_ident_il_uuid_sha256url#:#Hash kombinerat med ILIAS-domänen formaterad som en e-postadress +lti#:#conf_privacy_ident_il_uuid_sha256url_info#:#Detta är identiskt med varje anrop, med högst 80 tecken betydligt kortare än varianten med ILIAS-plattformens ID och tillåter endast mycket begränsade slutsatser om ILIAS-användaren. +lti#:#conf_privacy_ident_il_uuid_user_id#:#ID för ILIAS-kontot kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +lti#:#conf_privacy_ident_il_uuid_user_id_info#:#Sänder det interna numeriska användar-ID:t. Detta är identiskt för varje anrop, men gör det möjligt att dra slutsatser om ILIAS-användaren. +lti#:#conf_privacy_ident_info#:#Standard är ofta e-postadressen. Det unika ILIAS-plattforms-ID:t är +lti#:#conf_privacy_ident_real_email#:#E-postadress +lti#:#conf_privacy_ident_real_email_info#:#Skickar användarens e-postadress som identifiering (Attention +lti#:#conf_privacy_name#:#Login namn +lti#:#conf_privacy_name_firstname#:#Förnamn +lti#:#conf_privacy_name_firstname_info#:#Skickar förnamnet. +lti#:#conf_privacy_name_fullname#:#Fullständigt namn +lti#:#conf_privacy_name_fullname_info#:#Skickar titel, förnamn och efternamn. +lti#:#conf_privacy_name_info#:#Att skicka ett inloggningsnamn är vanligtvis inte nödvändigt. +lti#:#conf_privacy_name_lastname#:#Titel och efternamn +lti#:#conf_privacy_name_lastname_info#:#Sänder Mr eller Mrs (om inget annat anges) och efternamnet. +lti#:#conf_privacy_name_none#:#Ingen +lti#:#conf_privacy_name_none_info#:#Skickar '-' istället för ett namn +lti#:#conf_user_ident#:#Identifiering av användare +lti#:#conf_user_ident_il_uuid_ext_account#:#Externt användar-ID kombinerat med ett unikt ILIAS-plattforms-ID formaterat som en e-postadress. +lti#:#conf_user_ident_il_uuid_ext_account_info#:#Detta är identiskt med varje samtal, men kan göra det möjligt att dra direkta slutsatser om användaren. +lti#:#conf_user_ident_il_uuid_login#:#ILIAS-inloggning som e-postadress, kombinerat med ett unikt ILIAS-plattforms-ID om så krävs. +lti#:#conf_user_ident_il_uuid_login_info#:#Detta är identiskt för varje samtal, men kan göra det möjligt att dra direkta slutsatser om ILIAS-användaren. +lti#:#conf_user_ident_il_uuid_user_id#:#ILIAS användar-ID kombinerat med ett unikt ILIAS plattforms-ID formaterat som en e-postadress. +lti#:#conf_user_ident_il_uuid_user_id_info#:#Detta är identiskt med varje samtal, men tillåter inte direkta slutsatser om ILIAS-användaren. +lti#:#conf_user_ident_info#:#Standard är ofta e-postadressen. Det unika ILIAS-plattforms-ID:t är +lti#:#conf_user_ident_real_email#:#E-postadress +lti#:#conf_user_ident_real_email_info#:#Skickar användarens e-postadress som identifiering (Attention +lti#:#conf_user_name#:#Login namn +lti#:#conf_user_name_firstname#:#Förnamn +lti#:#conf_user_name_firstname_info#:#Skickar förnamnet. +lti#:#conf_user_name_fullname#:#Fullständigt namn +lti#:#conf_user_name_fullname_info#:#Skickar titel, förnamn och efternamn. +lti#:#conf_user_name_info#:#Att skicka ett inloggningsnamn är vanligtvis inte nödvändigt. +lti#:#conf_user_name_lastname#:#Titel och efternamn +lti#:#conf_user_name_lastname_info#:#Sänder Mr eller Mrs (om inget annat anges) och efternamnet. +lti#:#conf_user_name_none#:#Ingen +lti#:#conf_user_name_none_info#:#Skickar '-' istället för ett namn +lti#:#consumers#:#konsumenter +lti#:#description_info#:#Beskrivningen visas under titeln. +lti#:#field_provider_xml#:#XML-fil +lti#:#field_provider_xml_info#:#XML-filer stöds för Tool Consumer och för Common Cartridge enligt https +lti#:#form_import_provider#:#Importera global leverantör eller globalt verktyg +lti#:#gbl_roles_to_users#:#Global roll tilldelad LTI-användare +lti#:#global_provider_subtab#:#Globala leverantörer eller verktyg för alla användare +lti#:#grade_activityProgress_completed#:#komplett redigerad +lti#:#grade_activityProgress_passed#:#bekräftad +lti#:#grade_all_verbs#:#alla statusar +lti#:#highscore_achieved_ts#:#Datum +lti#:#highscore_achieved_ts_description#:#En kolumn med datumet ingår i rankingen. +lti#:#highscore_all_tables#:#Egen rankning och leaderboard +lti#:#highscore_all_tables_description#:#Visar både en tabell med din egen ranking och en tabell med de bästa rankingarna. +lti#:#highscore_description#:#Namnen på andra användare kan visas om höger 'Visa andra användares inlärningserfarenheter' är inställd. +lti#:#highscore_enabled#:#Placeringar +lti#:#highscore_mode#:#Mode +lti#:#highscore_own_table#:#Deltagarens egen rangordning +lti#:#highscore_own_table_description#:#Deltagarna visas i en tabell med sin rangordning inom alla placeringar. +lti#:#highscore_percentage#:#Procent +lti#:#highscore_percentage_description#:#En kolumn med poängen i procent ingår i rankingen. +lti#:#highscore_score#:#Score +lti#:#highscore_score_description#:#En kolumn med poängen ingår i rankingen. +lti#:#highscore_top_num#:#Bästa listlängd +lti#:#highscore_top_num_description#:#Bestämmer hur många poster som visas i topplistan. +lti#:#highscore_top_num_unit#:#Placeringar +lti#:#highscore_top_table#:#Bästalista +lti#:#highscore_top_table_description#:#Deltagarna kommer att få se en tabell med de bästa placeringarna. +lti#:#highscore_wtime#:#Varaktighet +lti#:#highscore_wtime_description#:#En kolumn med varaktigheten ingår i placeringarna. +lti#:#launch_method#:#Alternativ för lanseringen +lti#:#launch_method_embedded#:#Inbäddat innehåll +lti#:#launch_method_embedded_info#:#Innehållet öppnas i ILIAS-kontext. Det kommer att visas som inbäddat innehåll på fliken Innehåll. +lti#:#launch_method_new_win#:#Nytt fönster +lti#:#launch_method_new_win_info#:#Innehållet öppnas i ett nytt fönster. När du lämnar innehållet stängs det här fönstret. +lti#:#launch_method_own_win#:#Own fönster +lti#:#launch_method_own_win_info#:#Innehållet öppnas i samma fönster och ersätter ILIAS-skärmen. När användaren lämnar innehållet återgår han/hon till ILIAS. +lti#:#launched#:#Resursen har redan startats. +lti#:#learning_progress_options#:#Alternativ för lärande framsteg +lti#:#lm_only_one_download_per_type#:#Endast en fil per typ (XML, HTML, SCORM) kan göras tillgänglig för nedladdning. +lti#:#lti13_hints#:#Om verktyget skapades utan dynamisk registrering måste följande data anges för att verktyget ska kunna köras. +lti#:#lti_13_authentication_url#:#URL för autentiseringsbegäran +lti#:#lti_13_client_id#:#Klient-ID +lti#:#lti_13_deployment_id#:#ID för utplacering +lti#:#lti_13_keyset_url#:#URL för den offentliga nyckeln +lti#:#lti_13_platform_id#:#Platform ID +lti#:#lti_13_step1#:#Steg 1 +lti#:#lti_13_step1_info#:#För den initierande plattformen (konsumenten), ange följande adress för Launch URL, Initiate Login URL, Redirection URI och Registration URL +lti#:#lti_13_step2#:#Steg 2 +lti#:#lti_13_step2_info#:#Du kommer att få information från den initierande plattformen (konsumenten) som du måste ange i följande fält. Efter att ha sparat är LTI 1.3-funktionerna tillgängliga. +lti#:#lti_13_token_url#:#URL för åtkomsttoken +lti#:#lti_action_accept_provider_as_global#:#Tillämpa leverantören eller verktyget globalt för alla användare. +lti#:#lti_action_accept_providers_as_global#:#Ta över leverantören eller verktyget som en global leverantör eller ett globalt verktyg. +lti#:#lti_action_delete_providers#:#Ta bort leverantör eller verktyg +lti#:#lti_action_edit_provider#:#Edit leverantör eller verktyg +lti#:#lti_action_reset_provider_to_user_scope#:#Återställ leverantör eller verktyg enligt användardefinition +lti#:#lti_action_reset_providers_to_user_scope#:#Återställ leverantör eller verktyg som användardefinierad leverantör eller användardefinierat verktyg +lti#:#lti_add_global_provider#:#Lägg till leverantör eller verktyg globalt för alla användare +lti#:#lti_add_own_provider#:#Skapa inställningar för leverantör eller verktyg +lti#:#lti_admin#:#LTI Rolladministratör +lti#:#lti_at_least_one_prov_has_usages#:#Minst en leverantör eller ett verktyg kunde inte tas bort eftersom denna leverantör eller detta verktyg används av LTI-konsumenter (eventuellt i papperskorgen). +lti#:#lti_auth_failed_invalid_key#:#Autentisering inte möjlig. Ingen giltig konsumentnyckel överfördes. +lti#:#lti_con_content_item#:#Stöd för djuplänkning +lti#:#lti_con_content_item_url#:#URL för innehåll +lti#:#lti_con_grade_synchronization#:#Avancerade graderingstjänster +lti#:#lti_con_grade_synchronization_info#:#LTI-verktyget måste erbjuda "Tilldelnings- och bedömningstjänster". +lti#:#lti_con_initiate_login_url#:#Initiera inloggnings-URL +lti#:#lti_con_key_type#:#Typ av den offentliga nyckeln +lti#:#lti_con_key_type_jwk#:#URL (Json Web Token) +lti#:#lti_con_key_type_jwk_url#:#URL +lti#:#lti_con_key_type_rsa#:#RSA-nyckel +lti#:#lti_con_key_type_rsa_public_key#:#Publik nyckel +lti#:#lti_con_key_type_rsa_public_key_info#:#Ange nyckeln som tillhandahålls av verktyget (leverantören) i PEM-format här. +lti#:#lti_con_prov_always_learner#:#LTI-användaren är alltid en elev +lti#:#lti_con_prov_always_learner_info#:#Som regel mappas rollen i ILIAS till en LTI-roll. Kursadministratörer kan ha fler rättigheter i leverantören eller verktyget, t.ex. att manipulera objektet. Aktivera det här alternativet för att undvika rollmappning. +lti#:#lti_con_prov_authentication#:#Autentisering +lti#:#lti_con_prov_availability#:#Tillgänglighet +lti#:#lti_con_prov_availability_create#:#för nya och befintliga objekt +lti#:#lti_con_prov_availability_existing#:#Endast för befintliga objekt +lti#:#lti_con_prov_availability_non#:#inte tillgänglig +lti#:#lti_con_prov_category#:#Kategori +lti#:#lti_con_prov_category_info#:#Kategori för att filtrera poster när ett LTI-konsumentobjekt skapas. +lti#:#lti_con_prov_custom_params#:#Användardefinierade parametrar för denna specifika leverantör +lti#:#lti_con_prov_custom_params_info#:#Var god ange dem i formuläret +lti#:#lti_con_prov_description#:#Beskrivning +lti#:#lti_con_prov_dyn_reg_params#:#Valfria parametrar +lti#:#lti_con_prov_dyn_reg_params_info#:#Här kan till exempel referenser till målobjekt i verktyget anges. +lti#:#lti_con_prov_dyn_reg_url#:#Registreringsadress för verktyget +lti#:#lti_con_prov_dyn_reg_url_info#:#Note +lti#:#lti_con_prov_external_provider#:#Extern leverantör eller externt verktyg +lti#:#lti_con_prov_external_provider_info#:#När du arbetar med en extern leverantör eller ett externt verktyg visas en notering för användarna. Externa leverantörer eller verktyg kännetecknas av att ILIAS-installatörens inflytande på leverantören eller verktyget är otillräckligt. Detta är fallet o +lti#:#lti_con_prov_group_options#:#Alternativ för gruppering och filtrering av leverantörer eller verktyg +lti#:#lti_con_prov_has_outcome_service#:#Leverantör eller verktyg stödjer Outcome Service +lti#:#lti_con_prov_has_outcome_service_info#:#Om LTI Outcome Service stöds kan inlärningsförloppet aktiveras. En leverantör eller ett verktyg returnerar ett värde mellan 0 och 1 för att indikera inlärningsförloppet. +lti#:#lti_con_prov_hints#:#Noter +lti#:#lti_con_prov_icon#:#Icon +lti#:#lti_con_prov_inc_usr_pic#:#Skicka användarbild +lti#:#lti_con_prov_inc_usr_pic_info#:#Länkar till ILIAS användarbilder inkluderas när LTI-konsumenten startas. +lti#:#lti_con_prov_instructor_email#:#E-post från lärare +lti#:#lti_con_prov_instructor_email_info#:#Med avvikelse från de tidigare valda inställningarna kan e-postadressen överföras för lärare. För att göra detta måste de vara kurs- eller gruppadministratörer. +lti#:#lti_con_prov_instructor_name#:#Namn på lärare +lti#:#lti_con_prov_instructor_name_info#:#I avvikelse från de tidigare valda inställningarna kan namnet överföras för lärare. +lti#:#lti_con_prov_key#:#Nyckel +lti#:#lti_con_prov_keywords#:#nyckelord +lti#:#lti_con_prov_keywords_info#:#Nyckelorden måste separeras med semikolon (;). Nyckelorden övertas automatiskt som nyckelord i metadata. +lti#:#lti_con_prov_launch_options#:#Starta alternativ +lti#:#lti_con_prov_learning_progress_options#:#Alternativ för lärande framsteg +lti#:#lti_con_prov_mastery_score_default#:#Default Mastery Score +lti#:#lti_con_prov_mastery_score_default_info#:#När inlärningsprocessen är aktiverad anses objektet vara slutfört när resultatet av LTI Outcome Service är minst lika högt som Mastery Score. +lti#:#lti_con_prov_privacy_setting_conf#:#Alternativ för konfiguration +lti#:#lti_con_prov_privacy_setting_default#:#Förvalda inställningar, kan ändras för objekt +lti#:#lti_con_prov_privacy_setting_force#:#Inställningarna kan inte ändras för objekt. +lti#:#lti_con_prov_privacy_setting_info#:#Konfigurationsalternativ för sekretessinställningarna +lti#:#lti_con_prov_privacy_settings#:#Privatlivsinställningar +lti#:#lti_con_prov_provider_key_global#:#Fördefinierad nyckel och hemlighet +lti#:#lti_con_prov_provider_key_global_info#:#Om den inte är angiven måste användarna lägga till Nyckel och Hemlighet för att använda leverantören. +lti#:#lti_con_prov_remarks#:#Interna anmärkningar +lti#:#lti_con_prov_secret#:#Hemlig +lti#:#lti_con_prov_title#:#Titel +lti#:#lti_con_prov_url#:#URL för leverantören eller verktyget +lti#:#lti_con_prov_use_provider_id#:#Använd leverantörs-ID eller verktygs-ID +lti#:#lti_con_prov_use_provider_id_info#:#Som regel överförs LTI-konsumentens Ref-Id till leverantören eller verktyget. Vissa leverantörer eller verktyg länkar detta Ref-ID till den sända resursen. För att alltid få samma resurs från dessa leverantörer eller verktyg bör detta alternativ aktivera +lti#:#lti_con_prov_use_xapi#:#Tillhandahållare eller verktyg stöder förfrågan av xAPI-uttalanden +lti#:#lti_con_prov_use_xapi_info#:#Tillhandahållare eller verktyg stöder xAPI-uttalanden +lti#:#lti_con_prov_xapi_activity_id#:#Aktivitets-ID +lti#:#lti_con_prov_xapi_activity_id_info#:#Detta ID behövs för att visa data från LRS i ILIAS. Du kommer att få detta ID från den organisation som erbjuder denna resurs.###Modifierad som en del av jämställdhetsintegreringsverksamheten för ILIAS 8 +lti#:#lti_con_prov_xapi_launch_key#:#Nyckel för LRS-slutpunkt +lti#:#lti_con_prov_xapi_launch_key_info#:# +lti#:#lti_con_prov_xapi_launch_secret#:#Secret för LRS slutpunkt +lti#:#lti_con_prov_xapi_launch_secret_info#:# +lti#:#lti_con_prov_xapi_launch_url#:#URL för LRS slutpunkt +lti#:#lti_con_prov_xapi_launch_url_info#:#Lägg till den fullständiga webbadressen med https +lti#:#lti_con_redirection_uris#:#URI:er för omdirigering +lti#:#lti_con_tool_url#:#URL för inloggning +lti#:#lti_con_version#:#LTI version +lti#:#lti_con_version_1.1#:#Version 1.1 +lti#:#lti_con_version_1.3#:#Version 1.3 +lti#:#lti_con_version_1.3_before_id#:#Om dynamisk registrering inte används kommer ytterligare data som ska matas in i verktyget att visas efter att de data som tillhandahålls av verktyget har matats in. +lti#:#lti_confirm_delete_providers#:#Är du säker på att du vill ta bort följande leverantörer eller verktyg? +lti#:#lti_consumer#:#Släppt för +lti#:#lti_consumer_created#:#Konsument tillagd +lti#:#lti_consumer_deleted#:#Konsument raderad +lti#:#lti_consumer_key#:#Konsumentnyckel +lti#:#lti_consumer_secret#:#Konsumentens hemlighet +lti#:#lti_consumer_set_active#:#Konsumentaktiverad +lti#:#lti_consumer_set_inactive#:#Konsument avaktiverad +lti#:#lti_consumer_updated#:#Konsument uppdaterad +lti#:#lti_consuming_tab#:#ILIAS som en LTI-konsument +lti#:#lti_copy#:#Kopiera LTI konsument +lti#:#lti_create_consumer#:#Lägg till konsumenter +lti#:#lti_create_lti_user_role#:#Skapa rekommenderad global roll för LTI-användare +lti#:#lti_cron_title#:#LTI Utfallstjänst +lti#:#lti_cron_title_desc#:#Överför LTI-användarnas inlärningsförlopp till den anropande plattformen. Detta cron-jobb behövs endast i de fall då inlärningsförloppet måste räknas om på grund av ändrade inställningar. +lti#:#lti_custom_new#:#Skapa din egen leverantör eller verktygsinställningar +lti#:#lti_delete_consume_provider#:#Ta bort leverantör eller verktyg +lti#:#lti_delete_consume_providers#:#Ta bort leverantör eller verktyg +lti#:#lti_delete_provider#:#Ta bort leverantör eller verktyg +lti#:#lti_dyn_reg_add_tool#:#Skapa +lti#:#lti_dynamic_registration#:#Skapa egna verktygsinställningar med dynamisk registrering (LTI 1.3) +lti#:#lti_edit_consumer#:#Edit LTI konsument +lti#:#lti_exit#:#Avsluta LTI-session +lti#:#lti_exited#:#LTI-sessionen avslutad +lti#:#lti_exited_info#:#LTI-sessionen slutfördes framgångsrikt. +lti#:#lti_form_provider_create#:#Skapa inställningar för en leverantör eller ett verktyg +lti#:#lti_form_provider_edit#:#Redigera inställningar för leverantören eller verktyget +lti#:#lti_form_section_appearance#:#Alternativ för lanseringen +lti#:#lti_global_settings_form#:#Globala inställningar +lti#:#lti_import_global_provider#:#Importera global leverantör eller globalt verktyg för alla användare med XML-fil +lti#:#lti_info_external_provider_info#:#Den leverantör eller det verktyg som används betraktas som "extern". Här kan personer som ansvarar för denna ILIAS-installation endast ha begränsat inflytande på hanteringen av data - till exempel om det inte finns några rättigheter att radera data.###Mo +lti#:#lti_info_external_provider_label#:#Ytterligare information om denna leverantör eller detta verktyg +lti#:#lti_info_learning_progress_section#:#Information för att fastställa inlärningsframsteg +lti#:#lti_info_privacy_section#:#Information om personuppgifter som överförs till leverantören eller verktyget vid start ###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +lti#:#lti_launch_url#:#URL +lti#:#lti_member#:#LTI Roll Medlem / Lärande +lti#:#lti_navigation#:#Navigation +lti#:#lti_no_provider_selected#:#Ingen leverantör eller verktyg vald +lti#:#lti_not_allowed#:#Åtkomst ej tillåten. Du har blivit omdirigerad till det ursprungliga LTI-området. +lti#:#lti_obj_active#:#LTI Leverantör/verktyg +lti#:#lti_obj_active_info#:#Om det är aktiverat kan detta objekt inkluderas av andra plattformar via LTI-gränssnittet. +lti#:#lti_obj_version#:#LTI version +lti#:#lti_obj_version_11#:#Version 1.1 +lti#:#lti_obj_version_13#:#Version 1.3 +lti#:#lti_object_consumer#:#LTI konsumenter +lti#:#lti_object_release_settings_form#:#Redigera LTI-utgåvor +lti#:#lti_provider#:#LTI-utgåvor +lti#:#lti_provider_not_avail_msg#:#LTI leverantör eller verktyg är inställt på "Ej tillgängligt". +lti#:#lti_provider_not_set_msg#:#LTI-leverantören eller verktyget är ofullständigt konfigurerat. +lti#:#lti_providing_tab#:#ILIAS som LTI-leverantör/verktyg +lti#:#lti_released_objects#:#Utsläpp av objekt +lti#:#lti_select_provider#:#Välj leverantör eller verktyg +lti#:#lti_session#:#LTI-session +lti#:#lti_settings#:#LTI-inställningar +lti#:#lti_settings_form#:#Inställningar för objekt +lti#:#lti_success_accept_as_global#:#Framgångsrikt införd som global leverantör/verktyg för alla användare +lti#:#lti_success_accept_as_global_multi#:#Successfully adopted as global provider/tools for all users +lti#:#lti_success_delete_provider#:#Framgångsrikt raderad +lti#:#lti_success_reset_to_usr_def#:#Framgångsrikt återställd som anpassad leverantör eller verktyg +lti#:#lti_success_reset_to_usr_def_multi#:#Successfully reset as custom providers/tools +lti#:#lti_tutor#:#LTI roll som handledare +lti#:#lti_user_role_created#:#Den rekommenderade globala rollen för LTI-användare har skapats. +lti#:#lti_user_role_info#:#I denna installation har den rekommenderade globala rollen för LTI-användare ännu inte skapats. Denna speciella globala roll innehåller skrivskyddade rättigheter för magasin och kategorier. +lti#:#mastery_score#:#Mastery Resultat +lti#:#mastery_score_info#:#När inlärningsprocessen är aktiverad anses objektet vara slutfört när resultatet av LTI Outcome Service är minst lika högt som Mastery Score. +lti#:#obj_tile_image_info#:#Använd en bild i kvadratiskt format +lti#:#online_info#:#Detta gör objektet synligt och användbart för användarna. +lti#:#prefix#:#Prefix +lti#:#prefix_info#:#Detta prefix placeras framför inloggningsnamnet. Detta säkerställer att inloggningsnamnen är unika. Det underlättar också tilldelningen av användare till LTI-konsumenter / plattformar. +lti#:#provider_info#:#Leverantör eller verktyg +lti#:#settings_subtab#:#Inställningar +lti#:#show_statements#:#Visa upp erfarenheter av lärande +lti#:#show_statements_info#:#Andra användares erfarenheter av lärande kan visas om höger 'Visa andra användares erfarenheter av lärande' är inställd. +lti#:#subtab_certificate#:#Certifikat +lti#:#subtab_object_settings#:#Inställningar för objekt +lti#:#subtab_provider_settings#:#Inställningar för leverantör eller verktyg +lti#:#tab_content#:#Innehåll +lti#:#tab_grade_synchronization#:#Avancerade graderingstjänster +lti#:#tab_info#:#Info +lti#:#tab_scoring#:#Placeringar +lti#:#tab_settings#:#Inställningar +lti#:#tab_statements#:#lärandeerfarenheter +lti#:#tbl_grade_activityProgress#:#Status för urval +lti#:#tbl_grade_activityProgress_select#:#Status +lti#:#tbl_grade_actor#:#Användare +lti#:#tbl_grade_date#:#Datum +lti#:#tbl_grade_object#:#Objekt +lti#:#tbl_grade_period#:#Tidsperiod +lti#:#tbl_grade_score#:#Poäng +lti#:#tbl_lti_prov_all_categories#:#Alla kategorier +lti#:#tbl_lti_prov_availability#:#Tillgänglighet +lti#:#tbl_lti_prov_category#:#Kategori +lti#:#tbl_lti_prov_description#:#Beskrivning +lti#:#tbl_lti_prov_icon#:#Icon +lti#:#tbl_lti_prov_internal#:#Intern leverantör +lti#:#tbl_lti_prov_keyword#:# nyckelord +lti#:#tbl_lti_prov_keywords#:#nyckelord +lti#:#tbl_lti_prov_outcome#:#Outcome Service +lti#:#tbl_lti_prov_own_provider#:#Egen leverantör +lti#:#tbl_lti_prov_provider_creator#:#Created by###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +lti#:#tbl_lti_prov_title#:#Titel på leverantören eller verktyget +lti#:#tbl_lti_prov_usages#:#Använda +lti#:#tbl_lti_prov_usages_trashed#:#I papperskorgen +lti#:#tbl_lti_prov_usages_untrashed#:#Inte i papperskorgen +lti#:#tbl_lti_prov_used_by#:#Objekt (i trädet) som använder denna leverantör +lti#:#tbl_lti_prov_with_key#:#predefinierad +lti#:#tbl_provider_header#:#LTI leverantör/verktyg +lti#:#tbl_provider_usage_header#:#LTI leverantör/verktyg +lti#:#tbl_provider_usage_header_info#:#Innan du tar bort LTI-leverantörer eller verktyg måste dessa objekt också tas bort från papperskorgen. +lti#:#title_info#:#Ge objektet en titel! +lti#:#usage_subtab#:#Använda +lti#:#use_xapi#:#Använd xAPI-stöd +lti#:#use_xapi_info#:#LTI-leverantör eller verktyg stöder förfrågan av xAPI-uttalanden. +lti#:#user_lng#:#Användarspråk +lti#:#user_provider_subtab#:#Leverantörer eller verktyg definieras av användarna +ltiv#:#ltiv_create#:#Skapa certifikat för LTI-konsumentobjekt +ltiv#:#ltiv_create_info#:#Välj ett slutfört LTI-konsumentobjekt för att generera ett certifikat för det. +mail#:#back_to_folder#:#Tillbaka till mappen +mail#:#chat_users_have_been_invited#:#Användarna bjöds in +mail#:#chat_users_without_login#:#Följande användare har inte ett ILIAS-konto och kan inte bjudas in +mail#:#chat_users_without_permission#:#Följande användare har inte tillgång till det valda rummet +mail#:#current_folder#:#Aktuell mapp +mail#:#deleteTemplate#:#Radera +mail#:#first_email_missing_info#:#Val ej möjligt eftersom ingen e-postadress har angetts +mail#:#forward#:#Framåt +mail#:#goto_invitation_chat#:#Öppet chattrum +mail#:#invite_to_chat#:#Bjud in i chatt +mail#:#linebreak#:#Linjeavbrott +mail#:#link_check_affected_links#:#Påverkade länkar +mail#:#link_check_introduction#:#Följande externa länkar är ogiltiga +mail#:#link_check_perma_link#:#Permanent länk +mail#:#link_check_reason#:#Du får detta meddelande eftersom du har aktiverat meddelandet om ogiltiga externa länkar. +mail#:#mail_account_mail#:#Informera om nytt konto +mail#:#mail_add_folder#:#Skapa ny mapp +mail#:#mail_add_recipient#:#Ange vem som ska få mailet. Ange inloggningsnamn för ILIAS eller giltiga e-postadresser.###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +mail#:#mail_add_subfolder#:#Lägg till undermapp +mail#:#mail_add_subject#:#Vänligen ange ett ämne +mail#:#mail_allow_external#:#Externa e-postmeddelanden +mail#:#mail_allow_external_info#:#Om den inte är aktiverad undertrycks sändningen av externa e-postmeddelanden (via SMTP) globalt. +mail#:#mail_assign_entry_to_mailing_list#:#Att tilldela en kontakt till distributionslistan "%s +mail#:#mail_attachment_file_not_exist#:#Minst en av följande bilagor kunde inte hittas +mail#:#mail_attachments#:#Attachments +mail#:#mail_auto_generated_info#:#Detta e-postmeddelande skickades automatiskt till dig av ILIAS-installationen %s, %s. +mail#:#mail_bcc#:#BCC +mail#:#mail_bg_task_desc#:#Ämne +mail#:#mail_bg_task_title#:#Utskick av e-post +mail#:#mail_both_email#:#Båda e-postadresserna +mail#:#mail_cc#:#CC +mail#:#mail_change_to_folder#:#Byt till mapp +mail#:#mail_create_tpl#:#Skapa textmall +mail#:#mail_cronjob_notification_info#:#Här kan du aktivera den regelbundna aviseringen av nya e-postmeddelanden. +mail#:#mail_crs_list_members_not_available#:#Medlemmarna i de markerade kurserna kan inte listas. +mail#:#mail_crs_list_members_not_available_for_at_least_one_crs#:#Medlemmarna i minst en vald kurs kan inte listas. +mail#:#mail_crs_roles#:#Alla personer med följande lokala roller###Modifierad som en del av jämställdhetsarbetet för ILIAS 8. Etiketten är nu generaliserad för alla komponenter som stöder "mail till medlemmar". +mail#:#mail_deleted#:#Mailen har tagits bort +mail#:#mail_deleted_entry#:#Posterna har tagits bort +mail#:#mail_download_zip_no_attachments#:#Inga bilagor hittades. +mail#:#mail_edit_tpl#:#Redigera textmall +mail#:#mail_email_sys_body#:#Detta är ett testmejl för att testa sändningen av ett e-postmeddelande som automatiskt initieras av systemet till externa e-postadresser. +mail#:#mail_email_sys_subject#:#Test e-post "System e-post +mail#:#mail_email_usr_body#:#Detta är ett testmejl för att testa att skicka ett användarinitierat e-postmeddelande till externa e-postadresser. +mail#:#mail_email_usr_subject#:#Test e-post "Användarmail +mail#:#mail_empty_trash#:#Tomma sopor +mail#:#mail_empty_trash_confirmation#:#Är du säker på att alla e-postmeddelanden i papperskorgen ska raderas? +mail#:#mail_enable_crs_admin_notification#:# Meddela kursadministratörer +mail#:#mail_enable_crs_admin_notification_info#:#I nya kurser är inställningen "Notifiering av nya medlemmar" aktiverad som standard på fliken "Medlemmar" för kursadministratörer och handledare. Du kommer att få e-postmeddelanden när en medlem går med, lämnar kursen eller det minsta antalet deltagare f +mail#:#mail_enable_crs_member_notification#:#Meddela medlemmar +mail#:#mail_enable_crs_member_notification_info#:#Medlemmar får automatiskt ett e-postmeddelande när deras medlemskapsstatus ändras. Den här inställningen påverkar alla kurser på plattformen. +mail#:#mail_enable_grp_admin_notification#:#Meddela gruppadministratörer +mail#:#mail_enable_grp_admin_notification_info#:#I nya grupper aktiveras inställningarna för "Meddelanden" som standard på fliken "Medlemmar" för gruppadministratörer. Du får e-postmeddelanden när en medlem går med i gruppen, lämnar gruppen eller när det minsta antalet deltagare för att driva gruppen i +mail#:#mail_enable_grp_member_notification#:#Meddela medlemmar +mail#:#mail_enable_grp_member_notification_info#:#Medlemmar får automatiskt ett e-postmeddelande när deras medlemsstatus ändras. Denna inställning påverkar alla grupper på plattformen. +mail#:#mail_enable_lso_admin_notification#:#Meddela administratörer om inlärningssekvensen +mail#:#mail_enable_lso_admin_notification_info#:#I nya utbildningssekvenser är inställningarna för "Meddelanden" aktiverade som standard på fliken "Medlemmar" för administratörer. Du kommer att få e-postmeddelanden när en medlem går med i eller lämnar sekvensen. +mail#:#mail_enable_lso_member_notification#:#Meddela medlemmar +mail#:#mail_enable_lso_member_notification_info#:#Medlemmar får automatiskt ett e-postmeddelande när deras medlemskapsstatus ändras. Denna inställning påverkar alla utbildningssekvenser på plattformen. +mail#:#mail_entry_of_contacts#:#Ingång från kontakterna +mail#:#mail_error_reading_attachment#:#Inget appendix kunde identifieras. +mail#:#mail_external_send_test_sys#:#Sänd testmeddelande för systemmeddelande +mail#:#mail_external_send_test_usr#:#Sänd testmeddelande för användarmeddelande +mail#:#mail_external_test_sent#:#Ett testmeddelande har skickats till den e-postadress som finns lagrad i din profil. +mail#:#mail_file_name#:#Filenamn +mail#:#mail_file_size#:#Filens storlek +mail#:#mail_files_deleted#:#Filen/filerna har raderats +mail#:#mail_filter#:#Filter +mail#:#mail_filter_attach#:#Attachments +mail#:#mail_filter_body#:#Meddelande +mail#:#mail_filter_field_placeholder#:#Sök efter nyheter ... +mail#:#mail_filter_only_unread#:#Oläst +mail#:#mail_filter_only_user_mails#:#Dölja systemmeddelanden +mail#:#mail_filter_only_with_attachments#:#Attachments +mail#:#mail_filter_period#:#Tidsperiod +mail#:#mail_filter_period_from#:#Från +mail#:#mail_filter_period_until#:#Till +mail#:#mail_filter_recipients#:#An###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +mail#:#mail_filter_sender#:#From##Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +mail#:#mail_filter_subject#:#Ämne +mail#:#mail_filter_txt#:#Sökning i +mail#:#mail_first_email#:#Första e-postadress +mail#:#mail_firstname_last_name_superior#:#Kommaseparerad lista med för- och efternamn på överordnad chef för en person###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +mail#:#mail_folder_created#:#En ny mapp har skapats +mail#:#mail_folder_deleted#:#Mappen har tagits bort +mail#:#mail_folder_exists#:#En mapp med detta namn finns redan +mail#:#mail_folder_name_changed#:#Mappen har bytt namn +mail#:#mail_following_rcp_not_valid#:#Följande information är inte giltig +mail#:#mail_form_placeholders_label#:#Tillgängliga platshållare +mail#:#mail_generic_rcp_error#:#Ett fel uppstod vid validering av fältet "Till" +mail#:#mail_global_reply_to_addr#:#Reply-To +mail#:#mail_global_reply_to_addr_info#:#Ange den önskade "Reply-To"-e-postadressen här. +mail#:#mail_grp_roles#:#Alla personer med följande lokala roller###Modifierad som en del av jämställdhetsarbetet för ILIAS 8. Etiketten är nu generaliserad för alla komponenter som stöder "mail till medlemmar". +mail#:#mail_hint_add_placeholder_x#:#Inför platshållaren '%s' i meddelandets brödtext. +mail#:#mail_incoming#:#MaileInput +mail#:#mail_incoming_both#:#Lokal och vidare till e-post +mail#:#mail_incoming_local#:#Endast lokalt mottagande +mail#:#mail_incoming_mail#:#MaileInput +mail#:#mail_incoming_smtp#:#Vidarebefordra till registrerad e-postadress +mail#:#mail_insert_folder_name#:#Var god ange ett mappnamn +mail#:#mail_insert_query#:#Var god ange en sökterm +mail#:#mail_invite_users_to_chat#:#Invitera användare att chatta +mail#:#mail_is_read#:#Läs +mail#:#mail_is_unread#:#oläst +mail#:#mail_list_members#:#Lista medlemmar +mail#:#mail_mailing_list#:#Distributionslista +mail#:#mail_mailing_lists#:#Fördelningslistor +mail#:#mail_mailing_lists_all_contact_entries_assigned#:#Du har redan tilldelat alla dina kontakter till denna distributionslista. +mail#:#mail_mailing_lists_no_contact_entries#:#Du har inga poster i kontakterna som du kan lägga till i distributionslistan. +mail#:#mail_mark_read#:#Markera som läst +mail#:#mail_mark_unread#:#Markera som oläst +mail#:#mail_max_size_attachments_total#:#Var god ange den tillåtna filstorleken för e-postbilagor här. Denna inställning har ingen inverkan på uppladdningen av filer (här gäller serverns begränsningar, t.ex. upload_max_filesize), utan endast på datamängden för de filer som väljs som bilagor til +mail#:#mail_max_size_attachments_total_error#:#Den maximala tillåtna filstorleken för bilagor är +mail#:#mail_maxsize_attachment_error#:#Den maximala filstorleken är +mail#:#mail_member_notification#:#Anmälan av deltagare +mail#:#mail_members_of_mailing_list#:#Medlemmar i distributionslistan "%s +mail#:#mail_members_search_continue#:#Fortsättning +mail#:#mail_message_send#:#Mailen har skickats +mail#:#mail_move_error#:#Fel vid sändning av e-post +mail#:#mail_move_to#:#Flytta till +mail#:#mail_moved#:#Din(a) post(er) har flyttats +mail#:#mail_moved_to_trash#:#Posten/posterna har flyttats till papperskorgen +mail#:#mail_multiple_role_recipients_found#:#%1$s i fältet "Till" är inte unikt. +mail#:#mail_my_courses#:#Mina kurser +mail#:#mail_my_groups#:#Mina grupper +mail#:#mail_my_mailing_lists#:#Mina distributionslistor +mail#:#mail_nacc_admin_mail#:#E-postadress till administratören +mail#:#mail_nacc_if_timelimit#:#Detta textblock infogas endast om användaren har en begränsad åtkomstperiod. +mail#:#mail_nacc_ilias_url#:#URL för ILIAS-systemet +mail#:#mail_nacc_installation_desc#:#Beskrivning av installationen +mail#:#mail_nacc_installation_name#:#Namn på anläggningen +mail#:#mail_nacc_login#:#Login namn +mail#:#mail_nacc_no_pw_block#:#Detta textblock infogas endast om den nya användaren skapades utan lösenord. +mail#:#mail_nacc_pw_block#:#Detta textblock infogas endast om den nya användaren skapades med ett lösenord. +mail#:#mail_nacc_salutation#:#Välkommen +mail#:#mail_nacc_target#:#URL för målobjektet, t.ex. en kurs som länkas till från en annan ILIAS. +mail#:#mail_nacc_target_block#:#Detta textblock infogas endast om ett målobjekt erbjuds. +mail#:#mail_nacc_target_title#:#Titel för målobjektet, t.ex. kursens titel +mail#:#mail_nacc_target_type#:#Typ för målobjektet, t.ex. "Kurs" för ett kursobjekt. +mail#:#mail_nacc_timelimit#:#Användarens åtkomstperiod +mail#:#mail_nacc_title#:#Titel +mail#:#mail_nacc_use_placeholder#:#Följande platshållare kan användas i fältet 'Innehåll' +mail#:#mail_new_template#:#Ny textmall +mail#:#mail_no_permissions_write_smtp#:#Du har inte behörighet att skicka externa e-postmeddelanden. +mail#:#mail_no_subject#:#Inget ämne tillgängligt +mail#:#mail_no_valid_mailing_list#:#%1$s (inte en giltig distributör) +mail#:#mail_notification_membership_section#:#Memberships +mail#:#mail_notification_subject#:#Nya e-postmeddelanden i inkorgen +mail#:#mail_notify_orphaned#:#Meddelanden via e-post +mail#:#mail_notify_orphaned_info#:#Om du anger ett värde som är större än eller lika med 1 här, kommer ILIAS att skicka ett e-postmeddelande till användaren innan ett internt e-postmeddelande raderas. Se till att extern e-postmottagning är möjlig. +mail#:#mail_options_saved#:#Inställningarna har sparats +mail#:#mail_orphaned_mails#:#Radera gamla eller föräldralösa e-postmeddelanden +mail#:#mail_orphaned_mails_desc#:#Radera gamla eller föräldralösa e-postmeddelanden +mail#:#mail_recipient_not_found#:#%1$s - Vänligen korrigera informationen i fältet "Till".###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +mail#:#mail_rename_folder#:# Namnge mappen +mail#:#mail_roles#:#Alla personer med följande lokala roller +mail#:#mail_s#:#Mails +mail#:#mail_salutation_anonymous#:#Hello +mail#:#mail_salutation_f#:#Kära fru +mail#:#mail_salutation_female#:#Output för platshållare [MAIL_SALUTATION], om hälsning "kvinna"###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +mail#:#mail_salutation_general#:#Utdata för platshållaren [MAIL_SALUTATION], om ingen hälsningsfras är angiven eller önskad. +mail#:#mail_salutation_m#:#Kära Sir +mail#:#mail_salutation_male#:#Output för platshållare [MAIL_SALUTATION], om hälsning "Mr"###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +mail#:#mail_salutation_n#:#Hello +mail#:#mail_saved#:#Din e-post har sparats +mail#:#mail_second_email#:#Den andra e-postadressen +mail#:#mail_sel_label#:#Send mail to###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +mail#:#mail_sel_users#:#Urvalda personer###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +mail#:#mail_select_attachment#:#Välj en bilaga för att ladda ner. +mail#:#mail_select_course#:#Välj minst en kurs. +mail#:#mail_select_group#:#Vänligen välj minst en grupp. +mail#:#mail_select_one_entry#:#Du måste välja minst en post +mail#:#mail_select_one_file#:#Du måste välja minst en fil +mail#:#mail_send_html#:#HTML-ram +mail#:#mail_send_html_info#:#Om den är aktiverad placeras meddelandetexten för externa e-postmeddelanden i en HTML-ram. Detta kan anpassas via en skin-mall under './Customising/global/skin/[SKIN]/Services/Mail/tpl.html_mail_template.html' (som en kopia av './Services/Mail/templates/ +mail#:#mail_serial_letter_placeholders#:#Platshållare för seriebokstav +mail#:#mail_settings_external_frm_head#:#Externa e-postmeddelanden +mail#:#mail_settings_external_tab#:#External +mail#:#mail_settings_general_tab#:#Allmänt +mail#:#mail_settings_incoming_type_see_also#:#Du har ett annat alternativ för att ändra mottagningstyp för användarna här. +mail#:#mail_settings_system_frm_head#:#System e-post +mail#:#mail_settings_user_frm_head#:#E-post från användare +mail#:#mail_smtp_encryption#:#Kryptering +mail#:#mail_smtp_encryption_ssl#:#SSL +mail#:#mail_smtp_encryption_tls#:#TLS +mail#:#mail_smtp_host#:#Host +mail#:#mail_smtp_host_info#:#Ange e-postserverns värdnamn eller IP-adress här. +mail#:#mail_smtp_password#:# Lösenord +mail#:#mail_smtp_password_req#:#Om du anger en användare är lösenordet obligatoriskt. +mail#:#mail_smtp_port#:#Port +mail#:#mail_smtp_port_info#:#Var god ange en numerisk SMTP-port (t.ex. 25). +mail#:#mail_smtp_status#:#Aktivera SMTP-sändning +mail#:#mail_smtp_status_info#:#Om aktiverat delegerar ILIAS sändningen av externa e-postmeddelanden till den e-postserver som konfigurerats här istället för att använda den funktionalitet som tillhandahålls av PHP runtime för sändning (mail()-funktionen, sendmail). +mail#:#mail_smtp_user#:#Användare +mail#:#mail_subject_prefix#:#Ämne för e-post +mail#:#mail_subject_prefix_info#:#Du kan ange en text här som kommer att prefixas till ämnesraden i utgående, automatiskt genererade e-postmeddelanden. Det rekommenderas att ange ett prefix för att göra det lättare för användarna att filtrera meddelandena. +mail#:#mail_subject_too_long#:#Ämnet är för långt. +mail#:#mail_sure_delete#:#Är du säker på att du vill radera de markerade e-postmeddelandena? +mail#:#mail_sure_delete_entry#:#Är du säker på att du vill ta bort de markerade posterna? +mail#:#mail_sure_delete_file#:#Är du säker på att du vill radera de markerade filerna? +mail#:#mail_sure_delete_folder#:#Mappen och dess innehåll är oåterkalleligen raderade! +mail#:#mail_system_sys_env_from_addr#:#Technical Sender Address ("SENDER")###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +mail#:#mail_system_sys_env_from_addr_info#:# Ange den tekniska sändningsadressen ("SENDER"-rubriken) här. Om du lämnar fältet tomt kommer avsändarens e-postadress ("FROM" header) att användas för extern sändning. I annat fall är det serveradministrationens uppgift att konfigurera rubriken.###Modif +mail#:#mail_system_sys_from_addr#:#FROM" adress för automatiskt skickade e-postmeddelanden +mail#:#mail_system_sys_from_addr_info#:#För att säkerställa att de e-postmeddelanden som automatiskt skickas från ILIAS inte avvisas som skräppost, måste en avsändaradress anges här (tekniskt +mail#:#mail_system_sys_from_name#:#"FROM"-Name###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +mail#:#mail_system_sys_reply_to_addr#:#Reply-To +mail#:#mail_system_sys_signature#:#Signatur +mail#:#mail_system_usr_env_from_addr#:#Technical Sender Address ("SENDER")###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +mail#:#mail_system_usr_env_from_addr_info#:# Ange den tekniska sändningsadressen ("SENDER"-rubriken) här. Om du lämnar fältet tomt kommer avsändarens e-postadress ("FROM" header) att användas för extern sändning. I annat fall är det serveradministrationens uppgift att konfigurera rubriken.###Modif +mail#:#mail_system_usr_from_addr#:#FROM" adress för manuellt skickade e-postmeddelanden###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +mail#:#mail_system_usr_from_addr_info#:#För att säkerställa att e-post som skickas manuellt från ILIAS inte avvisas som skräppost, måste en avsändaradress anges här (tekniskt +mail#:#mail_system_usr_from_name#:#FROM" namn och format###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +mail#:#mail_system_usr_from_name_info#:#Detta namn visas vanligtvis i e-postklienten i kolumnen "Från". FULLNAME], [FIRSTNAME] och [LASTNAME] kan användas som platshållare. Dessa ersätts sedan av respektive data för den person som skickade ett manuellt e-postmeddelande.###Modifierad som en del +mail#:#mail_tbl_head_attachments#:#Tillägg +mail#:#mail_template_client#:#Textmall +mail#:#mail_template_client_info#:#Välj mellan en av de tillgängliga textmallarna. Du har möjlighet att använda de platshållare som erbjuds av textmallen. När du väljer en textmall kommer meddelandet och ämnet i detta formulär (om det definieras i mallen) att ersättas. +mail#:#mail_template_context#:#Kontext +mail#:#mail_template_default#:# (standard) +mail#:#mail_template_missing_id#:#Åtgärden kan inte utföras eftersom textmallens ID inte överfördes korrekt. +mail#:#mail_template_no_context_available#:#För närvarande tillhandahålls ingen kontext av någon ILIAS-tjänst eller modul. Det är därför inte möjligt att skapa eller redigera textmallar. +mail#:#mail_template_no_valid_context#:#Det valda sammanhanget är inte giltigt. +mail#:#mail_template_orphaned_context#:#Sammanhanget är förgäves +mail#:#mail_template_set_as_default#:#Sätt som standard +mail#:#mail_template_title#:#Namn på textmallen +mail#:#mail_template_unset_as_default#:#Ta bort som standard +mail#:#mail_templates#:#Tekstmallar +mail#:#mail_threshold#:#Tröskelvärde +mail#:#mail_threshold_info#:#Interna e-postmeddelanden som är äldre än det tröskelvärde som definieras här raderas oåterkalleligt (inklusive eventuella bilagor).
Tänk på att när detta cron-jobb körs för första gången, beroende på tröskelvärdet, raderas ett stort antal meddelande +mail#:#mail_to#:#An +mail#:#mail_tpl_deleted_p#:#Textmallarna har raderats framgångsrikt. +mail#:#mail_tpl_deleted_s#:#Tekstmallen har tagits bort framgångsrikt. +mail#:#mail_tpl_sure_delete_entries#:#Är du säker på att du vill ta bort de markerade textmallarna? +mail#:#mail_tpl_sure_delete_entry#:#Är du säker på att du vill ta bort textmallen? +mail#:#mail_use_global_reply_to_addr#:#Använd global svarsadress +mail#:#mail_use_global_reply_to_addr_info#:#Ange en e-postadress som används som plattformsövergripande svarsadress (tekniskt +mail#:#nc_mail_noti_item_title#:#Inkorg +mail#:#nc_mail_prop_time#:#Tid +mail#:#nc_mail_unread_messages#:#Du har %s i din inkorg. +mail#:#nc_mail_unread_messages_number_p#:#%s olästa e-postmeddelanden +mail#:#nc_mail_unread_messages_number_s#:#ett oläst e-postmeddelande +mail#:#only_inbox_trash#:#Ta endast hänsyn till inkorg/skräpkorg +mail#:#only_inbox_trash_info#:#Om aktiverat raderas endast e-postmeddelanden som finns i inkorgen och papperskorgen för respektive person vid tidpunkten för utförandet av cron-jobbet. I annat fall raderas alla e-postmeddelanden oavsett mapp. +mail#:#orphaned_mail_body#:#Det finns föråldrade eller föräldralösa e-postmeddelanden i följande brevlådor. Observera att dessa e-postmeddelanden kommer att raderas automatiskt inom kort. +mail#:#orphaned_mail_subject#:#Notifiering om föräldralösa e-postmeddelanden +mail#:#placeholders_advise#:#Personliga platshållare ersätts endast för personer i fältet "Till". Personer i "CC"-fältet och "BCC"-fältet kommer att få e-postmeddelandet med icke ersatta platshållare.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +mail#:#search_content#:#Sökresultat +mail#:#search_recipients#:#Search people###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +mail#:#second_email_missing_info#:#Urval ej möjligt, eftersom ingen andra e-postadress har angetts. +mail#:#select_mail_with_subject_x#:#Välj e-post med ämne "%s +mail#:#send_mail_admins#:#Alla administratörer +mail#:#send_mail_members#:#Alla medlemmar +mail#:#send_mail_to#:#Mail till +mail#:#send_mail_tutors#:#Alla handledare +mail#:#show_mail_settings#:#Inställningar för display +mail#:#show_mail_settings_info#:#Aktiverar visning av e-postinställningarna i området 'Inställningar' eller 'E-post'. Användare kan endast ändra e-postinställningarna om konfigurationen av användarprofilen tillåter detta. Om användaren inte har behörighet att ändra e-postinställningarna +mail#:#system_notification_installation_changed_by#:#Ändrad av +mail#:#usrFieldChange_second_mail_visible_in_personal_data#:#You have changed the attribute "%s" in the field "%s".
Detta kommer för alla befintliga och framtida skapade konton att leda till att
ändrar den mottagningstyp som valts för användare och standard för nya inloggningskonton för extern leverans till +maps#:#configure_geolocation#:#För att kunna söka efter adresser måste du slutföra konfigurationen för geolokalisering i administrationsmenyn "Programvara från tredje part". +maps#:#maps_custom_geolocation_server_info#:#URL till den server genom vilken geolokaliseringsdata tillhandahålls via Nominatims tjänst. Posten måste innehålla platshållaren [QUERY] för att ange förfrågningspositionen. Exempel +maps#:#maps_custom_tile_server_info#:#URL för den server som tillhandahåller brickorna. Flera poster måste separeras med mellanslag. Standardinmatningen är "%s". +maps#:#maps_enable_maps#:#Aktivera kort +maps#:#maps_enable_maps_info#:#Kartor kan visas systemövergripande i profiler, kurser och grupper ###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +maps#:#maps_extt_maps#:#Kartor +maps#:#maps_geolocation_server#:#Server för omvänd geolokalisering +maps#:#maps_google_maps#:#Google Maps +maps#:#maps_https_for_reverse_lookup#:#Https för omvänd sökning +maps#:#maps_latitude#:#Latitud +maps#:#maps_longitude#:#längd +maps#:#maps_lookup_address#:#Sökadress +maps#:#maps_map_type#:#Typ +maps#:#maps_open_layers_maps#:#Öppna lager kartor +maps#:#maps_settings#:#Inställningar kartor +maps#:#maps_std_location#:#Förvald position +maps#:#maps_std_location_desc#:#Klicka på kartan för att ange din egen position. +maps#:#maps_tile_server#:#Til server +maps#:#maps_zoom_level#:#Utvidgningsnivå +mathjax#:#mathjax_enable_client#:#Aktivera MathJax i webbläsaren +mathjax#:#mathjax_enable_client_info#:#Aktiverar visning av TeX i webbläsaren genom att inkludera MathJax-skriptet. MathJax 3 stöds, men MathJax 2 rekommenderas. +mathjax#:#mathjax_enable_server#:#Aktivera MathJax i servern +mathjax#:#mathjax_enable_server_info#:#Aktiverar konvertering av TeX till grafik på serversidan. +mathjax#:#mathjax_home_link#:# ? MathJax webbplats +mathjax#:#mathjax_limiter#:#Separator +mathjax#:#mathjax_limiter_info#:#Välj de separatorer som ILIAS ska producera för MathJax-skriptet +mathjax#:#mathjax_mathjax#:#MathJax +mathjax#:#mathjax_polyfill_url#:#Url för en polyfill +mathjax#:#mathjax_polyfill_url_desc_line1#:#Behövs inte för MathJax 2 +mathjax#:#mathjax_polyfill_url_desc_line2#:#För MathJax 3 i äldre webbläsare, t.ex. https +mathjax#:#mathjax_script_url#:#URL för MathJax-skriptet +mathjax#:#mathjax_script_url_desc_line1#:#För MathJax 2 t.ex. https +mathjax#:#mathjax_script_url_desc_line2#:#För MathJax 3 t.ex. https +mathjax#:#mathjax_script_url_desc_line3#:#Använd det säkra läget för att undvika XSS-attacker från MathJax-kod med Javascript. För MathJax 2 kan den läggas till i CDN-url:en som en parameter (se ovan). För MathJax 3 måste du inkludera ett skript som konfigurerar det innan MathJax laddas. Använd +mathjax#:#mathjax_server_address#:#Serverns adress +mathjax#:#mathjax_server_address_info#:#T.ex. http +mathjax#:#mathjax_server_cache_cleared#:# MathJax-cachen har rensats. +mathjax#:#mathjax_server_cache_size#:#Storlek på cacheminne +mathjax#:#mathjax_server_cache_size_info#:#Hårddiskutrymme som används för att lagra grafiken. +mathjax#:#mathjax_server_clear_cache#:# ? Rensa cacheminnet nu +mathjax#:#mathjax_server_for_browser#:#Användning för webbläsaren +mathjax#:#mathjax_server_for_browser_info#:#TeX är integrerat som en SVG-grafik. Detta gör aktiveringen av MathJax i webbläsaren överflödig. +mathjax#:#mathjax_server_for_export#:#Användning för HTML-export +mathjax#:#mathjax_server_for_export_info#:#TeX exporteras som SVG-grafik i HTML-exporter av utbildningsmoduler. +mathjax#:#mathjax_server_for_pdf#:#Användning för PDF-skapande +mathjax#:#mathjax_server_for_pdf_info#:#Servern används för att visa TeX i PDF-dokument. +mathjax#:#mathjax_server_installation#:# ? Installationsguide +mathjax#:#mathjax_server_timeout#:#Tid för svar +mathjax#:#mathjax_server_timeout_info#:#Maximal väntetid för ett svar från MathJax-servern i sekunder +mathjax#:#mathjax_settings#:#MathJax-inställningar +mathjax#:#mathjax_test_expression#:#Test utskrift +mathjax#:#mathjax_test_expression_info_client#:#Detta uttryck visas med skriptet i webbläsaren +mathjax#:#mathjax_test_expression_info_server#:#Detta uttryck omvandlas till en grafik på servern +mcst#:#mcst_add_new_item#:#Lägg till ny Mediacast-post +mcst#:#mcst_audio_files#:#Ljudfiler +mcst#:#mcst_audioportable_settings_info#:# Kommaseparerad lista över filtillägg +mcst#:#mcst_audioportable_settings_title#:#Filnamnstillägg för ljudformatet +mcst#:#mcst_audioportable_title#:#Ytterligare ljudfil för bärbara enheter +mcst#:#mcst_automatic_detection#:#Automatisk +mcst#:#mcst_autoplay#:#Autoplay +mcst#:#mcst_autoplay_active#:#Autoplay (standard 'på') +mcst#:#mcst_autoplay_inactive#:#Autoplay (standard 'av') +mcst#:#mcst_clear_purpose_title#:#Radera +mcst#:#mcst_converted_file#:#Filen har konverterats. +mcst#:#mcst_copy#:#Kopiera Mediacast +mcst#:#mcst_current_value_info#:#Nuvärde av formatet +mcst#:#mcst_default_visibility#:#Standard tillgång +mcst#:#mcst_det_playtime#:#Bestäm körtid +mcst#:#mcst_download_all#:#Ladda ner alla +mcst#:#mcst_download_audioportable#:#Ladda ner ljudfil +mcst#:#mcst_download_cnt#:#Nedladdad +mcst#:#mcst_download_standard#:#Ladda ner +mcst#:#mcst_download_started_bg#:#Nedladdningspaketet håller på att skapas. Kontrollera dina bakgrundsprocesser längst upp till höger i det övre fältet. +mcst#:#mcst_download_videoalternative#:#Ladda ner alternativt format +mcst#:#mcst_download_videoportable#:#Ladda ner videofil +mcst#:#mcst_downloadable#:#Länk för nedladdning +mcst#:#mcst_downloadable_info#:#Användare kan ladda ner bidrag direkt. +mcst#:#mcst_duration#:#runtime +mcst#:#mcst_duration_info#:#Om inget värde anges, bestämmer ILIAS körtiden automatiskt +mcst#:#mcst_edit_item#:#Redigera inlägg från Mediacast +mcst#:#mcst_edit_settings#:#Inställningar +mcst#:#mcst_extract_preview_image#:#Skapa förhandsgranskningsbild +mcst#:#mcst_gallery#:#Kakelplattor +mcst#:#mcst_image_extracted#:#Förhandsgranskningsbild skapades +mcst#:#mcst_img_gallery#:#bildgalleri +mcst#:#mcst_import#:#Importera Mediacast +mcst#:#mcst_incl_files_in_rss#:#Filbilagor +mcst#:#mcst_incl_files_in_rss_info#:#Filerna med Mediacast-bidragen tillhandahålls som en bilaga i webbflödet. +mcst#:#mcst_input_either_file_or_url#:#Ange antingen en fil eller en URL. När du anger en fil, var uppmärksam på den maximala tillåtna uppladdningsstorleken. +mcst#:#mcst_last_submission#:#Sista inlägget +mcst#:#mcst_list#:#Lista +mcst#:#mcst_manage#:#Hantering +mcst#:#mcst_media_cast#:#Mediacast +mcst#:#mcst_media_cast_not_online#:#Mediacast är inte online +mcst#:#mcst_media_cast_not_online_text#:#Mediakasten är inte online eller har avaktiverats +mcst#:#mcst_mimetype#:#MIME-Typ +mcst#:#mcst_mimetype_info#:#Välj en MIME-typ för att definiera rätt plugin.
Notera +mcst#:#mcst_mimetypes#:#MIME-Typer +mcst#:#mcst_mimetypes_info#:#Kommaseparerad lista över MIME-typer +mcst#:#mcst_new_items_det_lp#:# Tilldela nya poster till inlärningsförloppet +mcst#:#mcst_new_items_det_lp_info#:#Nya poster läggs automatiskt till i bedömningen av inlärningsframsteg. +mcst#:#mcst_news_item_visibility_info#:#Publika meddelanden kan läsas från utsidan och utan inloggning. De bör inte innehålla konfidentiell information. +mcst#:#mcst_next_items#:#Visa fler videor +mcst#:#mcst_no_autoplay#:#Ingen autoplay +mcst#:#mcst_no_extraction_possible#:#Tyvärr kunde ingen förhandsgranskningsbild genereras från filen. +mcst#:#mcst_nr_items#:#Antal objekt +mcst#:#mcst_nr_videos#:#Antal videor som visas initialt +mcst#:#mcst_ordering#:#Sortering +mcst#:#mcst_ordering_creation_date_asc#:#Efter skapelsedatum, äldsta inlägget ovan +mcst#:#mcst_ordering_creation_date_desc#:#Efter skapelsedatum, senaste inlägget ovan +mcst#:#mcst_ordering_manual#:#Handbok +mcst#:#mcst_ordering_title#:#Alfabetiskt efter titel +mcst#:#mcst_play#:#Spela +mcst#:#mcst_play_cnt#:#Spelade ut +mcst#:#mcst_play_time#:#runtime +mcst#:#mcst_podcast#:#Podcast +mcst#:#mcst_prev_items#:#Visa tidigare videor +mcst#:#mcst_preview_picture#:#Förhandsgranskning +mcst#:#mcst_preview_picture_info#:#Stöds endast av följande filtyper +mcst#:#mcst_reference_info#:#URL till resursen, t.ex. HTTP-adress. +mcst#:#mcst_save_order#:#Spara sortering +mcst#:#mcst_second#:#Sekund +mcst#:#mcst_set_playtime#:#Körtiden har fastställts. +mcst#:#mcst_settings#:#Inställningar för mediasändningar +mcst#:#mcst_show_description#:# Visa beskrivning +mcst#:#mcst_standard_settings_info#:# Kommaseparerad lista över filtillägg +mcst#:#mcst_standard_settings_title#:#Filtillägg för standardformatet +mcst#:#mcst_standard_title#:#Standard mediafil +mcst#:#mcst_unable_to_determin_playtime#:#Löptiden kunde tyvärr inte fastställas automatiskt. Du kan ställa in körtiden manuellt under "Redigera". +mcst#:#mcst_video_cast#:#Video lista +mcst#:#mcst_video_completion_threshold#:#"Bearbetad" Tröskelvärde +mcst#:#mcst_video_completion_threshold_info#:#Från och med detta steg sparas en video som "visad". Observera att ILIAS inte kontrollerar om hela perioden faktiskt visades eller om användaren hoppade över delar. +mcst#:#mcst_videoalternative_title#:#Alternativt videoformat för användning i webbläsaren +mcst#:#mcst_videoportable_settings_info#:# Kommaseparerad lista över filtillägg +mcst#:#mcst_videoportable_settings_title#:#Filtillägg för videoformatet +mcst#:#mcst_videoportable_title#:#Ytterligare videofil för bärbara enheter +mcst#:#mcst_view_abandoned#:#Den för närvarande valda vyn stöds inte längre. Välj en annan vy i inställningarna. +mcst#:#mcst_viewmode#:#Visa +mcst#:#mcst_visibility_info#:#Publika objekt är tillgängliga via RSS utan någon autentisering. +mcst#:#mcst_visibility_public#:#Registrerade användare +mcst#:#mcst_visibility_users#:#Offentlig +mcst#:#mcst_watched#:#se +mcst#:#mcst_webfeed#:#RSS webbflöde +mem#:#mem_period_without_time#:#utan tidsangivelse +mem#:#mem_print_view_form#:#Standardinställningar för utskriftsvy +mem#:#mem_settings_tab_print_view#:#Inställningar Utskriftsvy +mem#:#mem_settings_tab_settings#:#Allmänna inställningar +mem#:#mmbr_gallery_user_actions#:#Aktioner i medlemsgalleriet +membership#:#mem_error_preconditions#:#Inspelningen kunde inte äga rum eftersom minst en inställning förhindrar detta. +membership#:#mem_force_notification#:#Notifiering via post +membership#:#mem_force_notification_mode_all#:#Aktiverad för alla medlemmar (kan ändras fritt) +membership#:#mem_force_notification_mode_all_sub_blocked#:#Medlemmar kan avaktivera aviseringar +membership#:#mem_force_notification_mode_blocked#:#Medlemmar kommer att meddelas automatiskt +membership#:#mem_force_notification_mode_custom#:#Inställningar för varje medlem +membership#:#mem_force_notification_mode_self#:#Medlemmar måste aktivera aviseringar +mep#:#mep_all#:#Alla +mep#:#mep_all_mobs#:#Alla mediaobjekt +mep#:#mep_bulk_upload#:#Massuppladdning +mep#:#mep_choose_from_folder#:#Välj från mapp +mep#:#mep_choose_from_mep#:#Välj från pool +mep#:#mep_content#:#Medieobjekt +mep#:#mep_content_snippet_in_use#:#Innehållsblocket '%s' används och kan därför inte tas bort. +mep#:#mep_content_snippet_used_in_older_versions#:#Attention +mep#:#mep_copy_to_mep#:#Kopiera till mediapool +mep#:#mep_create_content_snippet#:#Skapa innehållsmodul +mep#:#mep_create_folder#:# Skapa mapp +mep#:#mep_create_from_upload_dir#:#Lägg till mediaobjekt från uppladdningskatalogen +mep#:#mep_create_media_files#:#Skapa mediaobjekt +mep#:#mep_create_mob#:#Skapa mediaobjekt +mep#:#mep_default_height#:#Standardhöjd +mep#:#mep_default_width#:#Standardbredd +mep#:#mep_default_width_height_info#:#Default width och height används som standard för nya mediaobjekt. +mep#:#mep_edit_content_snippet#:#Redigera innehållsmodul +mep#:#mep_edit_folder#:#Redigera mapp +mep#:#mep_file#:#Fil +mep#:#mep_folder#:#Folder +mep#:#mep_format#:#Format +mep#:#mep_import#:#Importera media pool +mep#:#mep_import_lang#:#Målspråk +mep#:#mep_import_trans#:#Import översättning +mep#:#mep_master_language_only#:#Basspråk för översättning - Master +mep#:#mep_master_language_only_no_media#:#Basspråk för översättning - utan mediaobjekt +mep#:#mep_media_files#:#Mediefiler +mep#:#mep_media_subtitles#:#Underrubrik +mep#:#mep_mob#:#media objekt +mep#:#mep_move_select_insert#:#Navigera till målmappen och välj "Klistra in". +mep#:#mep_mpg#:#Innehållsmodul +mep#:#mep_new_content_snippet#:#Ny innehållsmodul +mep#:#mep_new_folder#:#Ny mapp +mep#:#mep_page_properties#:#Egenskaper hos byggstenen +mep#:#mep_page_type_mep#:#Innehållsmodul +mep#:#mep_sel_upload_dir_files#:#Välj filer/kataloger. +mep#:#mep_thumbnail#:#Miniatyrbild +mep#:#mep_title_and_description#:#Titel och beskrivning +mep#:#mep_trans_import_info#:#Om du har exporterat denna modul som "XML (basic language for translation - master)" till en annan installation, kan du återimportera de översatta exportfilerna från denna installation här. +mep#:#mep_unknown#:#Okänd +mep#:#mep_up_dir_copy#:#Kopiera filer från uppladdningskatalogen (tar emot filer i uppladdningskatalogen) +mep#:#mep_up_dir_move#:# Flytta filer från uppladdningskatalogen (snabbare) +mep#:#mep_upload_dir_files#:#Filer från uppladdningskatalogen +mep#:#mobs_activate_pages#:#Använd innehållsmoduler +mep#:#mobs_activate_pages_info#:#Gör det möjligt att skapa sidinnehåll som byggstenar i mediapooler. Dessa innehållsmoduler kan återanvändas i ILIAS inlärningsmoduler, men kan inte redigeras där. +mep#:#mobs_always_show_file_manager#:#Visa alltid filstrukturen +mep#:#mobs_always_show_file_manager_info#:#Om inaktiverat visas inte filstrukturen för enkla datatyper, t.ex. bilder. +mep#:#mobs_black_list_file_types#:#Förbjudna filtyper +mep#:#mobs_black_list_file_types_info#:#Den här listan begränsar antalet tillåtna filtyper. Ange respektive filändelser separerade med kommatecken (t.ex. jpg,gif). Detta är meningsfullt om det föregående alternativet är tomt (alla typer tillåtna). +mep#:#mobs_restrict_file_types#:#Tillåtna filtyper +mep#:#mobs_restrict_file_types_info#:#Ange alla filtyper som får laddas upp i mediaobjekt. För att göra detta anger du respektive filändelser separerade med kommatecken (t.ex. jpg,gif). Om inget anges är alla typer tillåtna. +meta#:#adt_error_max_length#:#Den text du har skrivit är för lång. Vänligen ange en kortare text. +meta#:#md_adn_int_error_no_default#:#Välj ett aktiverat språk som "Standardspråk". +meta#:#md_adv_active#:#Aktiv +meta#:#md_adv_added_new_record#:#En ny post har skapats. +meta#:#md_adv_col_presentation_ordering#:#Position +meta#:#md_adv_confirm_definition#:#Bekräfta de nya inställningarna. +meta#:#md_adv_confirm_definition_select_option#:#Klarerat alternativ +meta#:#md_adv_confirm_definition_select_option_all#:#Behandla alla befintliga poster på samma sätt +meta#:#md_adv_confirm_definition_select_option_all_action#:#Nytt värde +meta#:#md_adv_confirm_definition_select_option_overwrite#:#Överskriv värde +meta#:#md_adv_confirm_definition_select_option_remove#:#Ta bort värde +meta#:#md_adv_confirm_definition_select_option_single#:#Avgör varje befintlig post individuellt +meta#:#md_adv_confirm_definition_select_section#:#Migrering av de borttagna alternativen +meta#:#md_adv_create_field#:#Lägg till nytt fält +meta#:#md_adv_create_record#:#Skapa ny datauppsättning +meta#:#md_adv_delete_fields_sure#:#Är du säker på att du vill ta bort följande fältdefinitioner? +meta#:#md_adv_delete_files_sure#:#Är du säker på att du vill radera följande filer? +meta#:#md_adv_delete_record_sure#:#Är du säker på att du vill radera följande poster? +meta#:#md_adv_deleted_fields#:#Fälten har tagits bort. +meta#:#md_adv_deleted_files#:#Filerna har raderats. +meta#:#md_adv_deleted_records#:#Posten raderades +meta#:#md_adv_desc_show#:# Visa beskrivning +meta#:#md_adv_edit_complex_option#:#Redigera Options egenskaper +meta#:#md_adv_edit_field#:#Redigera fält +meta#:#md_adv_edit_record#:#Redigera post +meta#:#md_adv_field_fields#:#Fält +meta#:#md_adv_field_filter_warning#:#Fälttyperna %s stöds för närvarande inte som tabellfilter. +meta#:#md_adv_field_list#:#Datafält +meta#:#md_adv_field_names#:#Fältnamn +meta#:#md_adv_field_table#:#Redigera fält +meta#:#md_adv_fields_show#:#Visa fältnamn +meta#:#md_adv_file_list#:#Exportera filer +meta#:#md_adv_import_record#:#Importera dataset +meta#:#md_adv_int_current#:#Nuvarande språk +meta#:#md_adv_int_default#:#Standardspråk +meta#:#md_adv_int_translation_info#:#Översättning +meta#:#md_adv_no_fields#:#Inga fält definierade +meta#:#md_adv_number_decimals#:#Decimala enheter +meta#:#md_adv_number_max#:#Maximalt värde +meta#:#md_adv_number_min#:#Minsta värde +meta#:#md_adv_number_suffix#:#Suffix +meta#:#md_adv_presentation#:#Presentation +meta#:#md_adv_record_activate_languages#:# Aktivera språk +meta#:#md_adv_record_list#:#Dataset +meta#:#md_adv_record_lng_table#:#Språkhantering +meta#:#md_adv_record_lng_table_active#:#Aktiv +meta#:#md_adv_record_lng_table_default#:#Default +meta#:#md_adv_record_lng_table_inst#:#Installerad +meta#:#md_adv_record_lng_table_lng#:#Språk +meta#:#md_adv_records#:#Innehållna register +meta#:#md_adv_records_exported#:#En ny exportfil har skapats. +meta#:#md_adv_scope#:#Validitetsintervall +meta#:#md_adv_scope_info#:#Användningen av denna anpassade metadatauppsättning är begränsad till underområden i tidningen. +meta#:#md_adv_scope_list_header#:#Begränsad till +meta#:#md_adv_scope_objects#:#Datauppsättning effektiv från +meta#:#md_adv_searchable#:#Sökbar +meta#:#md_adv_select_one_file#:#Välj en fil. +meta#:#md_adv_show#:#Display +meta#:#md_adv_substitution_table#:#Display i tidningen +meta#:#md_adv_text_max_length#:#Maximal längd +meta#:#md_adv_text_multi#:#Multilinje +meta#:#md_advanced#:#Användardefinierade metadata +meta#:#md_aria_language_selection#:#Val av språk +meta#:#md_copyright#:#Upphovsrätt +meta#:#md_copyright_add#:#Ny standard +meta#:#md_copyright_alt_text#:#Alternativ text +meta#:#md_copyright_alt_text_info#:#Används för 'alt'-attributet för bilden +meta#:#md_copyright_edit#:#Ändra copyright-standard +meta#:#md_copyright_enable_info#:#Aktivera denna inställning för att erbjuda fördefinierade användningslicenser. +meta#:#md_copyright_enabled#:#Aktivera val av upphovsrätt +meta#:#md_copyright_full_name#:#Fullständigt namn +meta#:#md_copyright_image_link#:#URL för bild +meta#:#md_copyright_link#:#URL +meta#:#md_copyright_link_info#:#Länk till licensen +meta#:#md_copyright_preview#:#Copyright (förhandsgranskning) +meta#:#md_copyright_selection#:#Specifikationer för upphovsrätt +meta#:#md_copyright_settings#:#Inställningar för upphovsrätt +meta#:#md_copyright_value#:#Upphovsrätt +meta#:#md_copyrights_deleted#:#De valda standardvärdena har tagits bort. +meta#:#md_days#:#dagar +meta#:#md_delete_cp_sure#:#Vill du verkligen ta bort de valda standardvärdena? +meta#:#md_delimiter#:#Separator +meta#:#md_delimiter_info#:#Separatorn används vid snabb redigering av metadata för att separera flera poster. Standardtecknet är ','.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +meta#:#md_fields#:#Fält +meta#:#md_general_settings#:#Inställningar +meta#:#md_months#:#Månader +meta#:#md_obj_types#:# Tilldelade objekt +meta#:#md_record_export_table#:#Exportera filer +meta#:#md_record_list_table#:#Användardefinierade metadataposter +meta#:#md_separated_by#:#Separerad med %s +meta#:#md_time#:#Tid +meta#:#md_used#:#Användning (antal) +meta#:#meta_accessibility_restrictions#:#Begränsningar av åtkomst +meta#:#meta_active#:#Aktiv +meta#:#meta_add#:#Add +meta#:#meta_advmd_select_options#:#Inträden +meta#:#meta_annotation#:#Note +meta#:#meta_atomic#:#Atomar +meta#:#meta_author#:#Författare +meta#:#meta_browser#:#Webbläsare +meta#:#meta_c_AD#:#Andorra +meta#:#meta_c_AE#:#Förenade Arabemiraten +meta#:#meta_c_AF#:#Afghanistan +meta#:#meta_c_AG#:#Antigua och Barbuda +meta#:#meta_c_AI#:#Anguilla +meta#:#meta_c_AL#:#Albanien +meta#:#meta_c_AM#:#Armenien +meta#:#meta_c_AN#:#Nederländska Antillerna +meta#:#meta_c_AO#:#Angola +meta#:#meta_c_AQ#:#Antarktis +meta#:#meta_c_AR#:#Argentina +meta#:#meta_c_AS#:#Amerikanska Samoa +meta#:#meta_c_AT#:#Österrike +meta#:#meta_c_AU#:#Australien +meta#:#meta_c_AW#:#Aruba +meta#:#meta_c_AX#:#Åland +meta#:#meta_c_AZ#:#Azerbajdzjan +meta#:#meta_c_BA#:#Bosnien-Hercegovina +meta#:#meta_c_BB#:#Barbados +meta#:#meta_c_BD#:#Bangladesh +meta#:#meta_c_BE#:#Belgien +meta#:#meta_c_BF#:#Burkina Faso +meta#:#meta_c_BG#:#Bulgarien +meta#:#meta_c_BH#:#Bahrain +meta#:#meta_c_BI#:#Burundi +meta#:#meta_c_BJ#:#Benin +meta#:#meta_c_BL#:#Saint-Barthélemy +meta#:#meta_c_BM#:#Bermudas +meta#:#meta_c_BN#:#Brunei +meta#:#meta_c_BO#:#Bolivien +meta#:#meta_c_BR#:#Brasilien +meta#:#meta_c_BS#:#Bahamas +meta#:#meta_c_BT#:#Bhutan +meta#:#meta_c_BV#:#Bouvetön +meta#:#meta_c_BW#:#Botswana +meta#:#meta_c_BY#:#Vitryssland +meta#:#meta_c_BZ#:#Belize +meta#:#meta_c_CA#:#Kanada +meta#:#meta_c_CC#:#Kokosöarna (Keelingöarna) +meta#:#meta_c_CF#:#Centralafrikanska republiken +meta#:#meta_c_CG#:#Kongo +meta#:#meta_c_CH#:#Schweiz +meta#:#meta_c_CI#:#Elfenbenskusten +meta#:#meta_c_CK#:#Cooköarna +meta#:#meta_c_CL#:#Chile +meta#:#meta_c_CM#:#Kamerun +meta#:#meta_c_CN#:#Kina +meta#:#meta_c_CO#:#Colombia +meta#:#meta_c_CR#:#Costa Rica +meta#:#meta_c_CU#:#Kuba +meta#:#meta_c_CV#:#Kap Verdeöarna +meta#:#meta_c_CX#:#JulIslands +meta#:#meta_c_CY#:#Cypern +meta#:#meta_c_CZ#:#Tjeckien +meta#:#meta_c_DE#:#Tyskland +meta#:#meta_c_DJ#:#Djibouti +meta#:#meta_c_DK#:#Denmark +meta#:#meta_c_DM#:#Dominica +meta#:#meta_c_DO#:#Dominikanska republiken +meta#:#meta_c_DZ#:#Algeriet +meta#:#meta_c_EC#:#Ecuador +meta#:#meta_c_EE#:#Estland +meta#:#meta_c_EG#:#Egypten +meta#:#meta_c_EH#:#Västliga #Sahara +meta#:#meta_c_ER#:#Eritrea +meta#:#meta_c_ES#:#Spanien +meta#:#meta_c_ET#:#Etiopien +meta#:#meta_c_FI#:#Finland +meta#:#meta_c_FJ#:#Fiji +meta#:#meta_c_FK#:#Falklandsöarna +meta#:#meta_c_FM#:#Mikronesien +meta#:#meta_c_FO#:#Faroer +meta#:#meta_c_FR#:#Frankrike +meta#:#meta_c_FX#:#Frankrike +meta#:#meta_c_GA#:#Gabun +meta#:#meta_c_GB#:#Förenade kungariket +meta#:#meta_c_GD#:#Grenada +meta#:#meta_c_GE#:#Georgia +meta#:#meta_c_GF#:#Franska Guyana +meta#:#meta_c_GG#:#Guernsey (Kanalön) +meta#:#meta_c_GH#:#Ghana +meta#:#meta_c_GI#:#Gibraltar +meta#:#meta_c_GL#:#Grönland +meta#:#meta_c_GM#:#Gambia +meta#:#meta_c_GN#:#Guinea +meta#:#meta_c_GP#:#Guadeloupe +meta#:#meta_c_GQ#:#Ekvatorialguinea +meta#:#meta_c_GR#:#Grekland +meta#:#meta_c_GS#:#Södra #Georgien och Sydsandwichöarna +meta#:#meta_c_GT#:#Guatemala +meta#:#meta_c_GU#:#Guam +meta#:#meta_c_GW#:#Guinea-Bissau +meta#:#meta_c_GY#:#Guyana +meta#:#meta_c_HK#:#Hong Kong +meta#:#meta_c_HM#:#Heard och McDonaldöarna +meta#:#meta_c_HN#:#Honduras +meta#:#meta_c_HR#:#Kroatien +meta#:#meta_c_HT#:#Haiti +meta#:#meta_c_HU#:#Ungern +meta#:#meta_c_ID#:#Indonesien +meta#:#meta_c_IE#:#Irland +meta#:#meta_c_IL#:#Israel +meta#:#meta_c_IM#:#Isle of Man +meta#:#meta_c_IN#:#Indien +meta#:#meta_c_IO#:#Brittiska territorier i Indiska oceanen +meta#:#meta_c_IQ#:#Irak +meta#:#meta_c_IR#:#Iran +meta#:#meta_c_IS#:#Öar +meta#:#meta_c_IT#:#Italien +meta#:#meta_c_JE#:#Jersey (Kanalön) +meta#:#meta_c_JM#:#Jamaica +meta#:#meta_c_JO#:#Jordanien +meta#:#meta_c_JP#:#Japan +meta#:#meta_c_KE#:#Kenya +meta#:#meta_c_KG#:#Kirgizistan +meta#:#meta_c_KH#:#Kambodja +meta#:#meta_c_KI#:#Kiribati +meta#:#meta_c_KM#:#Comoros +meta#:#meta_c_KN#:#Saint Kitts och Nevis +meta#:#meta_c_KP#:#Nordkorea (Folkrepubliken Korea) +meta#:#meta_c_KR#:#Sydkorea (Republiken) +meta#:#meta_c_KW#:#Kuwait +meta#:#meta_c_KY#:#Caimanöarna +meta#:#meta_c_KZ#:#Kazakstan +meta#:#meta_c_LA#:#Laos +meta#:#meta_c_LB#:#Libanon +meta#:#meta_c_LC#:#Saint Lucia +meta#:#meta_c_LI#:#Liechtenstein +meta#:#meta_c_LK#:#Sri Lanka +meta#:#meta_c_LR#:#Liberia +meta#:#meta_c_LS#:#Lesotho +meta#:#meta_c_LT#:#Litauen +meta#:#meta_c_LU#:#Luxemburg +meta#:#meta_c_LV#:#Latvia +meta#:#meta_c_LY#:#Libyen +meta#:#meta_c_MA#:#Marocko +meta#:#meta_c_MC#:#Monaco +meta#:#meta_c_MD#:#Moldova +meta#:#meta_c_ME#:#Montenegro +meta#:#meta_c_MF#:#Saint-Martin (franska delen) +meta#:#meta_c_MG#:#Madagaskar +meta#:#meta_c_MH#:#Marshallöarna +meta#:#meta_c_MK#:#Nordmakedonien +meta#:#meta_c_ML#:#Mali +meta#:#meta_c_MM#:#Myanmar +meta#:#meta_c_MN#:#Mongoliet +meta#:#meta_c_MO#:#Macau +meta#:#meta_c_MP#:#Nordliga Marianerna +meta#:#meta_c_MQ#:#Martinique +meta#:#meta_c_MR#:#Mauritanien +meta#:#meta_c_MS#:#Montserrat +meta#:#meta_c_MT#:#Malta +meta#:#meta_c_MU#:#Mauritius +meta#:#meta_c_MV#:#Maldiverna +meta#:#meta_c_MW#:#Malawi +meta#:#meta_c_MX#:#Mexiko +meta#:#meta_c_MY#:#Malaysia +meta#:#meta_c_MZ#:#Mozambique +meta#:#meta_c_NA#:#Namibia +meta#:#meta_c_NC#:#Nya Kaledonien +meta#:#meta_c_NE#:#Niger +meta#:#meta_c_NF#:#Norfolkön +meta#:#meta_c_NG#:#Nigeria +meta#:#meta_c_NI#:#Nicaragua +meta#:#meta_c_NL#:#Nederländerna +meta#:#meta_c_NO#:#Norge +meta#:#meta_c_NP#:#Nepal +meta#:#meta_c_NR#:#Nauru +meta#:#meta_c_NU#:#Niue +meta#:#meta_c_NZ#:#Nya Zeeland +meta#:#meta_c_OM#:#Oman +meta#:#meta_c_PA#:#Panama +meta#:#meta_c_PE#:#Peru +meta#:#meta_c_PF#:#Franska Polynesien +meta#:#meta_c_PG#:#Papua Nya Guinea +meta#:#meta_c_PH#:#Filippinerna +meta#:#meta_c_PK#:#Pakistan +meta#:#meta_c_PL#:#Polen +meta#:#meta_c_PM#:#St. Pierre och Miquelon +meta#:#meta_c_PN#:#Pitcairn +meta#:#meta_c_PR#:#Puerto Rico +meta#:#meta_c_PS#:#Palestinska autonoma territorier +meta#:#meta_c_PT#:#Portugal +meta#:#meta_c_PW#:#Palau +meta#:#meta_c_PY#:#Paraguay +meta#:#meta_c_QA#:#Qatar +meta#:#meta_c_RE#:#Återförening +meta#:#meta_c_RO#:#Rumänien +meta#:#meta_c_RS#:#Serbien +meta#:#meta_c_RU#:#Ryska federationen +meta#:#meta_c_RW#:#Rwanda +meta#:#meta_c_SA#:#Saudiarabien +meta#:#meta_c_SB#:#Salomonöarna +meta#:#meta_c_SC#:#Seychellerna +meta#:#meta_c_SD#:#Sudan +meta#:#meta_c_SE#:#Sverige +meta#:#meta_c_SG#:#Singapore +meta#:#meta_c_SH#:#St. Helena +meta#:#meta_c_SI#:#Slovenien +meta#:#meta_c_SJ#:#Svalbard och Jan Mayen-öarna +meta#:#meta_c_SK#:#Slovakien +meta#:#meta_c_SL#:#Sierra Leone +meta#:#meta_c_SM#:#San Marino +meta#:#meta_c_SN#:#Senegal +meta#:#meta_c_SO#:#Somalia +meta#:#meta_c_SR#:#Suriname +meta#:#meta_c_ST#:#Sao Tomé och Príncipe +meta#:#meta_c_SV#:#El Salvador +meta#:#meta_c_SY#:#Syrien +meta#:#meta_c_SZ#:#Swaziland +meta#:#meta_c_TC#:#Turks- och Caicosöarna +meta#:#meta_c_TD#:#Chad +meta#:#meta_c_TF#:#Franska södra territorierna +meta#:#meta_c_TG#:#Togo +meta#:#meta_c_TH#:#Thailand +meta#:#meta_c_TJ#:#Tajikistan +meta#:#meta_c_TK#:#Tokelau +meta#:#meta_c_TL#:#Östtimor +meta#:#meta_c_TM#:#Turkmenistan +meta#:#meta_c_TN#:#Tunisia +meta#:#meta_c_TO#:#Tonga +meta#:#meta_c_TR#:#Turkiet +meta#:#meta_c_TT#:#Trinidad och Tobago +meta#:#meta_c_TV#:#Tuvalu +meta#:#meta_c_TW#:#Taiwan +meta#:#meta_c_TZ#:#Tanzania +meta#:#meta_c_UA#:#Ukraina +meta#:#meta_c_UG#:#Uganda +meta#:#meta_c_UM#:#USA:s mindre avlägsna öar +meta#:#meta_c_US#:#Förenta staterna +meta#:#meta_c_UY#:#Uruguay +meta#:#meta_c_UZ#:#Uzbekistan +meta#:#meta_c_VA#:#Vatikanen +meta#:#meta_c_VC#:#Saint Vincent och Grenadinerna +meta#:#meta_c_VE#:#Venezuela +meta#:#meta_c_VG#:#Jungfruöarna (Brittiska) +meta#:#meta_c_VI#:#Virgin Islands (Förenta staterna) +meta#:#meta_c_VN#:#Vietnam +meta#:#meta_c_VU#:#Vanuatu +meta#:#meta_c_WF#:#Wallis och Futuna +meta#:#meta_c_WS#:#Samoa +meta#:#meta_c_XK#:#Kosovo +meta#:#meta_c_YE#:#Yemen +meta#:#meta_c_YT#:#Mayotte +meta#:#meta_c_ZA#:#Sydafrika +meta#:#meta_c_ZM#:#Zambia +meta#:#meta_c_ZW#:#Zimbabwe +meta#:#meta_catalog#:#Katalog +meta#:#meta_classification#:#Klassificering +meta#:#meta_collection#:#Kollektion +meta#:#meta_competency#:#Kompetens +meta#:#meta_contentprovider#:#Content offered by###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +meta#:#meta_context#:#Kontext +meta#:#meta_contribute#:#Bidrag +meta#:#meta_copyright#:#Upphovsrätt +meta#:#meta_copyright_and_other_restrictions#:#Upphovsrätt och andra begränsningar +meta#:#meta_copyright_change_info#:#Var noga med att respektera upphovsrätten när du ändrar licensen för detta objekt. Fortsätt endast om du är behörig att besluta om rättigheterna att använda objektet.###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +meta#:#meta_copyright_change_warning_title#:#Ändra licens###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +meta#:#meta_copyright_in_use#:#Aktuell +meta#:#meta_copyright_outdated#:#Veraltet +meta#:#meta_copyright_show_usages#:#Användning av display +meta#:#meta_copyright_status#:#Status +meta#:#meta_copyright_sub_items#:#Underordnade artiklar +meta#:#meta_copyright_usage#:#Använda +meta#:#meta_cost#:#Kostnader +meta#:#meta_coverage#:#Tillämpningsområde +meta#:#meta_cp_own#:#Egen specifikation +meta#:#meta_creator#:#Skapare +meta#:#meta_current_value#:#Nuvärde +meta#:#meta_date#:#Datum +meta#:#meta_delete#:#Radera +meta#:#meta_description#:#Beskrivning +meta#:#meta_diagramm#:#Diagram +meta#:#meta_difficult#:#Svårt +meta#:#meta_difficulty#:#Svårigheter +meta#:#meta_draft#:#Draft +meta#:#meta_duration#:#Varaktighet +meta#:#meta_easy#:#Ljus +meta#:#meta_editor#:#Redaktör +meta#:#meta_education#:#Utbildning +meta#:#meta_educational#:#Pedagogik +meta#:#meta_educational_level#:#Utbildningsnivå +meta#:#meta_educational_objective#:#Mål för utbildning +meta#:#meta_educationalvalidator#:#Pedagogisk acceptans +meta#:#meta_entity#:#Instans +meta#:#meta_entry#:#inträde +meta#:#meta_exam#:#Prov +meta#:#meta_exercise#:#Träning +meta#:#meta_experiment#:#Experiment +meta#:#meta_expositive#:#Förklarande +meta#:#meta_figure#:#Image +meta#:#meta_final#:#Slutlig version +meta#:#meta_format#:#Format +meta#:#meta_general#:#Allmänt +meta#:#meta_global#:#Global +meta#:#meta_graph#:#Graf +meta#:#meta_graphicaldesigner#:#Grafisk designer +meta#:#meta_has_format#:#...har format... +meta#:#meta_has_part#:#...har en del av... +meta#:#meta_has_version#:#...har version... +meta#:#meta_hierarchical#:#Hierarkisk +meta#:#meta_high#:#Hög +meta#:#meta_higher_education#:#Universitetsutbildning +meta#:#meta_id#:#Id +meta#:#meta_idea#:#Idé +meta#:#meta_identifier#:#Identifiering +meta#:#meta_index#:#Index +meta#:#meta_info_only_repository_objects#:#Endast tidskriftsobjekt visas nedan, inte mediaobjekt eller sidor i lärmoduler. +meta#:#meta_info_tlt_not_valid#:#Det aktuella värdet är inte giltigt och kan därför inte användas i andra områden (t.ex. inlärningsframsteg). Ange en tid i timmar och/eller minuter. +meta#:#meta_initiator#:#Initiator +meta#:#meta_installation_remarks#:#Installationsanvisningar +meta#:#meta_instructionaldesigner#:#utbildningsdesigners +meta#:#meta_intended_end_user_role#:#Avsedd roll för slutanvändaren +meta#:#meta_interactivity_level#:#Fas av interaktivitet +meta#:#meta_interactivity_type#:#Typ av interaktivitet +meta#:#meta_is_based_on#:#Baserat på +meta#:#meta_is_basis_for#:#...är en förutsättning för... +meta#:#meta_is_format_of#:#...är format av... +meta#:#meta_is_part_of#:#...är en del av.... +meta#:#meta_is_referenced_by#:#...hänvisas till av... +meta#:#meta_is_required_by#:#...krävs av... +meta#:#meta_is_version_of#:#...är en version av... +meta#:#meta_keyword#:# nyckelord +meta#:#meta_kind#:#Konst +meta#:#meta_l_aa#:#Afar +meta#:#meta_l_ab#:#Abchaziska +meta#:#meta_l_af#:#Afrikaans +meta#:#meta_l_am#:#Amhariska +meta#:#meta_l_ar#:#Arabiska +meta#:#meta_l_as#:#Assamiska +meta#:#meta_l_ay#:#Aymara +meta#:#meta_l_az#:#Azerbajdzjan +meta#:#meta_l_ba#:#Bashkir +meta#:#meta_l_be#:#Vitryska +meta#:#meta_l_bg#:#Bulgarien +meta#:#meta_l_bh#:#Biharian +meta#:#meta_l_bi#:#Bislamisk +meta#:#meta_l_bn#:#Bengali +meta#:#meta_l_bo#:#Tibetan +meta#:#meta_l_br#:#Breton +meta#:#meta_l_ca#:#Katalonien +meta#:#meta_l_co#:#Corsican +meta#:#meta_l_cs#:#Tjeckien +meta#:#meta_l_cy#:#Walisian +meta#:#meta_l_da#:#danska +meta#:#meta_l_de#:#tyska +meta#:#meta_l_dz#:#Bhutani +meta#:#meta_l_el#:#Grekiska +meta#:#meta_l_en#:#Engelska +meta#:#meta_l_eo#:#Esperanto +meta#:#meta_l_es#:#Spanska +meta#:#meta_l_et#:#Estonian +meta#:#meta_l_eu#:#Baskien +meta#:#meta_l_fa#:#Persiska (Farsi) +meta#:#meta_l_fi#:#Finnish +meta#:#meta_l_fj#:#Fiji +meta#:#meta_l_fo#:#Faroese +meta#:#meta_l_fr#:#Franska +meta#:#meta_l_fy#:#Frisian +meta#:#meta_l_ga#:#Irland +meta#:#meta_l_gd#:#Skotsk gaeliska +meta#:#meta_l_gl#:#Galician +meta#:#meta_l_gn#:#Guarani +meta#:#meta_l_gu#:#Gujarati +meta#:#meta_l_ha#:#Hausa +meta#:#meta_l_he#:#Hebreiska +meta#:#meta_l_hi#:#Hindi +meta#:#meta_l_hr#:#kroatiska +meta#:#meta_l_hu#:#Ungerska +meta#:#meta_l_hy#:#armeniska +meta#:#meta_l_ia#:#Interlingua +meta#:#meta_l_id#:#Indonesien +meta#:#meta_l_ie#:#Interlingue +meta#:#meta_l_ik#:#Inupiak +meta#:#meta_l_is#:#Island +meta#:#meta_l_it#:#Italienska +meta#:#meta_l_iu#:#Inuktitut +meta#:#meta_l_ja#:#Japanska +meta#:#meta_l_jv#:#javanesiska +meta#:#meta_l_ka#:#Georgian +meta#:#meta_l_kk#:#Kazakstan +meta#:#meta_l_kl#:#Greenlandic +meta#:#meta_l_km#:#Cambodjanska +meta#:#meta_l_kn#:#Cannada +meta#:#meta_l_ko#:#Koreanska +meta#:#meta_l_ks#:#Kashmiri +meta#:#meta_l_ku#:#kurdisk +meta#:#meta_l_ky#:#Kirgizistan +meta#:#meta_l_la#:#Latin +meta#:#meta_l_ln#:#Lingual +meta#:#meta_l_lo#:#Laotian +meta#:#meta_l_lt#:#Lithuanian +meta#:#meta_l_lv#:#Latvian +meta#:#meta_l_mg#:#Malagasy +meta#:#meta_l_mi#:#Maori +meta#:#meta_l_mk#:#Makedonien +meta#:#meta_l_ml#:#Malajalam +meta#:#meta_l_mn#:#Mongoliska +meta#:#meta_l_mo#:#Moldaviska +meta#:#meta_l_mr#:#Marathi +meta#:#meta_l_ms#:#Malay +meta#:#meta_l_mt#:#Maltese +meta#:#meta_l_my#:#Burmesiska +meta#:#meta_l_na#:#Nauruan +meta#:#meta_l_ne#:#Nepalesiska +meta#:#meta_l_nl#:# nederländska +meta#:#meta_l_no#:#Norsk +meta#:#meta_l_oc#:#Occitan +meta#:#meta_l_om#:#Oromo +meta#:#meta_l_or#:#Odia +meta#:#meta_l_pa#:#Punjabi +meta#:#meta_l_pl#:#Polsk +meta#:#meta_l_ps#:#Pashto +meta#:#meta_l_pt#:#Portugisiska +meta#:#meta_l_qu#:#Quechua +meta#:#meta_l_rm#:#Rhaeto-Romanska +meta#:#meta_l_rn#:#Kirundi +meta#:#meta_l_ro#:#rumänska +meta#:#meta_l_ru#:#Ryska +meta#:#meta_l_rw#:#Kinyarwanda +meta#:#meta_l_sa#:#Sanskrit +meta#:#meta_l_sd#:#Sindhi +meta#:#meta_l_sg#:#Sango +meta#:#meta_l_sh#:#Serbocroatian +meta#:#meta_l_si#:#Singhalese +meta#:#meta_l_sk#:#Slovakien +meta#:#meta_l_sl#:#Slovenska +meta#:#meta_l_sm#:#Samoan +meta#:#meta_l_sn#:#Shona +meta#:#meta_l_so#:#Somali +meta#:#meta_l_sq#:#Albansk +meta#:#meta_l_sr#:#Serbiska +meta#:#meta_l_ss#:#Siswati +meta#:#meta_l_st#:#Sesothic +meta#:#meta_l_su#:#Sundanesiska +meta#:#meta_l_sv#:#Svensk +meta#:#meta_l_sw#:#Swahili +meta#:#meta_l_ta#:#Tamil +meta#:#meta_l_te#:#Telugu +meta#:#meta_l_tg#:#Tajik +meta#:#meta_l_th#:#Thai +meta#:#meta_l_ti#:#Tigrinja +meta#:#meta_l_tk#:#Turkmen +meta#:#meta_l_tl#:#Tagalog +meta#:#meta_l_tn#:#Sezuan +meta#:#meta_l_to#:#Tongan +meta#:#meta_l_tr#:#Turkiska +meta#:#meta_l_ts#:#Tsongaic +meta#:#meta_l_tt#:#Tatariska +meta#:#meta_l_tw#:#Twi +meta#:#meta_l_ug#:#Uigur +meta#:#meta_l_uk#:#Ukrainska +meta#:#meta_l_ur#:#Urdu +meta#:#meta_l_uz#:#Uzbekistan +meta#:#meta_l_vi#:#Vietnamesiska +meta#:#meta_l_vo#:#Volapük +meta#:#meta_l_wo#:#Wolof +meta#:#meta_l_xh#:#Xhosa +meta#:#meta_l_yi#:#Jiddisch +meta#:#meta_l_yo#:#Yoruba +meta#:#meta_l_za#:#Zhuang +meta#:#meta_l_zh#:#kinesisk +meta#:#meta_l_zu#:#Zulu +meta#:#meta_language#:#Språk +meta#:#meta_learner#:#lärande +meta#:#meta_learning_resource_type#:#Typ av lärverktyg +meta#:#meta_lecture#:#Föreläsning +meta#:#meta_lifecycle#:#Livscykel +meta#:#meta_linear#:#Linjär +meta#:#meta_local#:#Lokalt +meta#:#meta_location#:#Lokalisering +meta#:#meta_low#:#låg +meta#:#meta_manager#:#Chef +meta#:#meta_maximum_version#:#Maximal version +meta#:#meta_medium#:#Medel +meta#:#meta_meta_metadata#:#Meta metadata +meta#:#meta_metadatascheme#:#Schema för metadata +meta#:#meta_minimum_version#:#Minimal version +meta#:#meta_mixed#:#Blandad +meta#:#meta_name#:#Namn +meta#:#meta_narrative_text#:#Narrativ text +meta#:#meta_networked#:#Nätverk +meta#:#meta_new_element#:#Nytt element +meta#:#meta_no#:#Nej +meta#:#meta_no_annotation#:#Inga metadata tillgängliga för området "Anmärkning". +meta#:#meta_no_classification#:#Inga metadata tillgängliga för området 'Klassificering'. +meta#:#meta_no_educational#:#Inga metadata tillgängliga för fältet 'Pedagogik'. +meta#:#meta_no_lifecycle#:#Inga metadata tillgängliga för området "Livscykel". +meta#:#meta_no_meta_metadata#:#Inga metadata tillgängliga för avsnittet "Metametadata". +meta#:#meta_no_relation#:#Inga metadata tillgängliga för avsnittet "Relationer". +meta#:#meta_no_rights#:#Inga metadata tillgängliga för avsnittet "Rättigheter och licenser". +meta#:#meta_no_technical#:#Inga metadata tillgängliga för avsnittet "Tekniska detaljer". +meta#:#meta_obj_type_active#:#Erbjuda dataset +meta#:#meta_obj_type_inactive#:#Tillhandahåll inte dataset +meta#:#meta_obj_type_mandatory#:#Erbjud alltid att fylla i +meta#:#meta_obj_type_optional#:#Data set måste vara aktiverat +meta#:#meta_oer_blocked#:#Det ignoreras av OER-skördaren +meta#:#meta_oer_blocked_info#:# Kommer inte automatiskt att listas som öppen utbildningsresurs (OER) +meta#:#meta_oer_copyright_selection#:#Val av licens +meta#:#meta_oer_copyright_selection_info#:#Endast objekt som publicerats under den/de valda licensen/licenserna kommer att länkas till OER-kategorin. +meta#:#meta_oer_harvester#:#OER Skördare +meta#:#meta_oer_harvester_desc#:#Scannar alla filobjekt i magasinet efter deras licens. OER harvester lägger till alla resurser under valda CC-licenser till den kategori som definierats i inställningarna för cron-jobbet. För att detta cron-jobb ska ge resultat måste val av upphovsrätt v +meta#:#meta_oer_target#:#Kategori för OER-utgåvor +meta#:#meta_operating_system#:#Operativt system +meta#:#meta_or_composite#:#... eller sammansatt ... +meta#:#meta_order#:#Beställ +meta#:#meta_other#:#Andra +meta#:#meta_other_plattform_requirements#:#Övriga plattformskrav +meta#:#meta_pc_dos#:#PC-DOS +meta#:#meta_please_select#:#Vänligen välj +meta#:#meta_pointofcontact#:#Kontakt +meta#:#meta_prerequisite#:#Förkunskapskrav +meta#:#meta_problem_statement#:#Problem +meta#:#meta_publisher#:#Redaktör +meta#:#meta_purpose#:#Syfte +meta#:#meta_questionnaire#:#Frågeformulär +meta#:#meta_quickedit#:#Snabb bearbetning +meta#:#meta_references#:#Referenser +meta#:#meta_relation#:#Relationer +meta#:#meta_requirement#:#Förfrågan +meta#:#meta_requires#:#Nödvändigt +meta#:#meta_resource#:#Resurs +meta#:#meta_revised#:#Reviderad version +meta#:#meta_rights#:#Rättigheter och licenser +meta#:#meta_role#:#Roll +meta#:#meta_save_order#:#Spara sekvens +meta#:#meta_school#:#Skola +meta#:#meta_scriptwriter#:#Copywriter +meta#:#meta_section#:#Område +meta#:#meta_security_level#:#Säkerhetsnivå +meta#:#meta_self_assessment#:#Självtest +meta#:#meta_semantic_density#:#Semantisk täthet +meta#:#meta_simulation#:#Simulering +meta#:#meta_size#:#Storlek +meta#:#meta_skill_level#:#Kompetensnivå +meta#:#meta_slide#:#Slide +meta#:#meta_source#:#Källa +meta#:#meta_status#:#Status +meta#:#meta_structure#:#Struktur +meta#:#meta_subjectmatterexpert#:#Expert för ämnet +meta#:#meta_tab_advmd#:#Användardefinierade metadata +meta#:#meta_tab_advmd_def#:#Hantera metadataposter +meta#:#meta_tab_lom#:#LOM +meta#:#meta_table#:#Tabell +meta#:#meta_taxon#:#Taxon +meta#:#meta_taxon_path#:#Taxon path +meta#:#meta_teacher#:#Lärare +meta#:#meta_technical#:#Tekniska specifikationer +meta#:#meta_technicalimplementer#:#Tekniskt genomförande +meta#:#meta_technicalvalidator#:#Teknisk inspektion +meta#:#meta_terminator#:#Final redaktör +meta#:#meta_title#:#Titel +meta#:#meta_training#:#Utbildning +meta#:#meta_type#:#Typ +meta#:#meta_typical_age_range#:#Typiskt åldersspann +meta#:#meta_typical_learning_time#:#Typisk inlärningstid +meta#:#meta_unavailable#:#Inte tillgänglig +meta#:#meta_unknown#:#Okänd +meta#:#meta_validator#:#Granskning +meta#:#meta_value#:#inträde +meta#:#meta_version#:#Version +meta#:#meta_very_difficult#:#Mycket svårt +meta#:#meta_very_easy#:#Mycket lätt +meta#:#meta_very_high#:#Mycket hög +meta#:#meta_very_low#:#Mycket låg +meta#:#meta_yes#:#Ja +meta#:#sco_propagate#:#Överföring till alla SCO +meta#:#udf_type_address#:#Adress +meta#:#udf_type_externallink#:#Extern länk +meta#:#udf_type_float#:#Flytande punkt nummer +meta#:#udf_type_integer#:#Integer +meta#:#udf_type_internallink#:#Intern länk +meta#:#udf_type_location#:#Lokalisering +meta#:#udf_type_selectmulti#:#Vallista (flera urval) +mmbr#:#info_refuse_sure#:#Är du säker på att du vill avvisa följande användare? +mmbr#:#mmbr_awrn_my_groups_courses#:#Mina kurser och grupper +mmbr#:#mmbr_awrn_my_groups_courses_info#:#Alla medlemmar i grupper och kurser för en användare listas. +mmbr#:#mmbr_btn_mail_selected_users#:#Skicka e-post +mmbr#:#mmbr_info_delete_sure_unsubscribe#:#Vill du verkligen säga upp ditt medlemskap för följande kurser och grupper? +mmbr#:#mmbr_memberships#:#Memberships +mmbr#:#mmbr_selected_users#:#Utvalda deltagare +mmbr#:#mmbr_unsubscribed_from_objs#:#Du har loggats ut från de valda objekten. +mme#:#add_languages#:#Lägg till språk +mme#:#additional_langs#:#Ytterligare språk +mme#:#button_save#:#Spara +mme#:#component_not_active#:#Komponenten är inte aktiverad. +mme#:#confirm_move#:#Vill du göra denna post till en huvudpost? +mme#:#err_uri_not_valid#:#Var god ange en giltig URL. +mme#:#field_external#:#Extern länk +mme#:#field_external_info#:#Länken öppnas i ett nytt fönster. +mme#:#field_ref_id#:#ILIAS Referens-ID +mme#:#field_ref_id_info#:#Referens-ID för det önskade ILIAS-objektet från tidningen. Du kan hitta referens-ID:t i objektets URL (...?ref_id=123) +mme#:#field_url#:#URL +mme#:#field_url_info#:#Länk till önskad webbplats, börjar med http(s) +mme#:#flush#:#Radera förlorade poster +mme#:#item_must_be_always_active#:#Entry måste vara aktivt. +mme#:#main#:#Huvudmeny +mme#:#mm_translation_lang#:#Språk +mme#:#mm_translation_trans#:#Översättning +mme#:#move_to_item#:#Flytta till poster +mme#:#move_to_top_item#:#Flytta till huvudposter +mme#:#msg_languages_added#:#Språk som läggs till +mme#:#msg_moved#:#Entry har flyttats framgångsrikt. +mme#:#msg_not_moved#:#Entry kunde inte flyttas, välj en giltig huvudpost. +mme#:#msg_ref_id_not_callable#:#Detta referens-ID kan inte användas av Main-Menu. Endast destinationer i tidningen stöds. +mme#:#msg_restore_confirm#:#Alla skapade poster och översättningar raderas, standardposterna återställs till sitt ursprungliga tillstånd. Alla justeringar av huvudmenyn går förlorade. +mme#:#msg_restored#:#Återställning av huvudmeny +mme#:#msg_subitem_deleted#:#Inmatning raderad. +mme#:#msg_subitem_flushed#:#Förlorade poster har tagits bort. +mme#:#msg_topitem_deleted#:#Inmatning raderad. +mme#:#msg_translations_deleted#:#Översättningar borttagna. +mme#:#msg_translations_saved#:#Översättningar sparade +mme#:#restore#:#Återställ huvudmeny +mme#:#select_parent#:#Välj relaterad huvudpost +mme#:#sub_actions#:#Åtgärder +mme#:#sub_active#:#Aktiv +mme#:#sub_active_byline#:# Aktivera denna post +mme#:#sub_global_roles#:#Globala roller +mme#:#sub_icon#:#Icon +mme#:#sub_icon_byline#:#Laddade upp en enskild SVG-ikon. +mme#:#sub_parent#:#Huvudingång +mme#:#sub_position#:#Position +mme#:#sub_provider#:#Tillhandahållare +mme#:#sub_role_based_visibility#:#Synlighet för hjul +mme#:#sub_role_based_visibility_byline#:#Välj globala roller som kan se detta objekt. Om den inte är aktiverad visas objektet alltid. +mme#:#sub_status#:#Status +mme#:#sub_title#:#Titel +mme#:#sub_title_default#:#Titel (standardspråk) +mme#:#sub_title_default_byline#:#Ytterligare språk kan läggas till via åtgärdslänken "Översätt". +mme#:#sub_type#:#Typ +mme#:#sub_type_byline#:#Välj typ för posten. Beroende på typ krävs ytterligare information. +mme#:#subitem_add#:#Lägg till post +mme#:#subitem_confirm_delete#:#Vill du verkligen ta bort följande post? +mme#:#subitem_delete#:#Radera +mme#:#subitem_edit#:#Redigera +mme#:#subitem_translate#:#Översättning +mme#:#subtab_subitems#:#Inträden +mme#:#subtab_topitems#:#Huvudposter +mme#:#tab_back#:#Tillbaka +mme#:#table_show_inactive#:#Visa inaktiv +mme#:#topitem_actions#:#Åtgärder +mme#:#topitem_active#:#Aktiv +mme#:#topitem_active_byline#:#Aktivera denna huvudingång +mme#:#topitem_add#:#Lägg till huvudpost +mme#:#topitem_confirm_delete#:#Vill du verkligen ta bort följande post? +mme#:#topitem_css_id#:#CSS ID +mme#:#topitem_delete#:#Radera +mme#:#topitem_edit#:#Redigera +mme#:#topitem_icon#:#Icon +mme#:#topitem_icon_byline#:#Laddade upp en enskild SVG-ikon. +mme#:#topitem_position#:#Position +mme#:#topitem_provider#:#Tillhandahållare +mme#:#topitem_subentries#:#Inträden +mme#:#topitem_title#:#Titel +mme#:#topitem_title_default#:#Titel (standardspråk) +mme#:#topitem_title_default_byline#:#Ytterligare språk kan läggas till via åtgärdslänken "Översätt". +mme#:#topitem_translate#:#Översättning +mme#:#topitem_type#:#Typ +mme#:#topitem_type_byline#:#Huvudposter kan innehålla ytterligare poster eller skapas direkt som en länk till en sida. +mme#:#topitem_type_link#:#Länk +mme#:#topitem_type_parent#:#Huvudingång +mme#:#type_complex#:#Komplex +mme#:#type_link#:#Länk +mme#:#type_link_list#:#Lista över länkar +mme#:#type_lost#:#Förlorad +mme#:#type_repository_link#:#Länk till magasin +mme#:#type_separator#:#Separatorer +mme#:#type_separator_info#:#Separatorns titel visas i ett grått område. Du får en separatorrad om du lämnar titeln tom. +mme#:#type_top_link_item#:#Länk +mme#:#type_top_parent_item#:#Container +mob#:#mob_choose_from_pool#:#Från mediapoolen +mob#:#mob_external_url#:#Extern URL +mob#:#mob_file#:#Fil +mob#:#mob_file_could_not_be_uploaded#:#Filen kunde inte laddas upp. +mob#:#mob_general#:#Allmänt +mob#:#mob_language#:#Språk +mob#:#mob_mime_type_not_allowed#:#Följande mime-typer är inte tillåtna på destinationen. +mob#:#mob_multi_srt_files#:#SRT-filer +mob#:#mob_no_fixed_size_map_editing#:#Var god ange en fast storlek för din bild innan du definierar länkade områden. Områdena kommer inte att justeras om din bild skalas av en innehållsstil eller andra CSS-regler. +mob#:#mob_object#:#Objekt +mob#:#mob_please_select_pool#:#Vänligen välj en mediapool. +mob#:#mob_really_delete_srt#:#Vill du verkligen ta bort följande srt-filer? +mob#:#mob_srt_files_deleted#:#Undertextfiler har tagits bort. +mob#:#mob_srt_not_allowed#:#Filer av typen .srt kan för närvarande inte laddas upp. För att aktivera funktionen måste den konfigureras av en systemadministratör (Administration > File Services). +mob#:#mob_subtitle_file#:#Fil för undertexter +mob#:#mob_subtitle_files#:#Filer för undertexter +mob#:#mob_subtitles#:#Underrubrik +mob#:#mob_type_not_supported#:#Mimetypen stöds inte för närvarande +mob#:#mob_upload_file#:#Ladda upp fil +mob#:#mob_upload_multi_srt#:#Ladda upp som ZIP-fil +mob#:#mob_upload_multi_srt_howto#:#.zip-filen / .zip-arkivet får inte innehålla några underkataloger. Alla .srt-filer måste vara på toppnivå för att kunna identifieras. Filnamnen måste avslutas med "_<SPRACHE>.srt", där SPRACHE är motsvarande språkidentifierare (t.ex. "en", "it" ell +mob#:#mob_url#:#URL +mob#:#mob_url_info#:#Extern URL, t.ex. Youtube eller Vimeo URL. +mob#:#mob_url_info1#:#Extern resurs-URL, tillåtna suffix är +mob#:#mob_url_info_video#:#Du kan också hänvisa till en Youtube- eller Vimeo-URL. +mst#:#mst_cert_issued_on#:#Utställd på +mst#:#mst_courses_of#:#Anmälningar från %s +mst#:#mst_download_certificate#:#Ladda ner certifikat +mst#:#mst_list_certificates#:#Certifikat +mst#:#mst_list_competences#:#Kompetens +mst#:#mst_list_courses#:#Anmälningar +mst#:#mst_list_users#:#Lista över anställda +mst#:#mst_memb_status_registered#:#Reported +mst#:#mst_memb_status_requested#:#Ansökt för +mst#:#mst_memb_status_waitinglist#:#Väntelista +mst#:#mst_my_staff#:#Anställda +mst#:#mst_opt_all#:#Alla +mst#:#mst_please_select_course#:#Vänligen välj en kurs. +mst#:#mst_profile_fulfilled#:#Achieved +mst#:#mst_profile_not_fulfilled#:#Not yet reached +mst#:#mst_select_course#:#Välj kurs +mst#:#mst_show_courses#:#Anmälningar +news#:#lso_news_online_title#:#Nytt inlärningssekvensobjekt är online! +news#:#lso_news_online_txt#:#Ett nytt objekt för din inlärningssekvens har precis lagts online. +news#:#new_test_online#:#Testet har kopplats upp online. +news#:#news_1_file_created#:#En fil har lagts till. +news#:#news_1_file_updated#:#En fil har uppdaterats. +news#:#news_1_postings#:#Ett bidrag har lagts till. +news#:#news_add_news#:#Lägg till bidrag +news#:#news_all_items#:#Nyheter om alla favoriter +news#:#news_allow_longer_periods#:#Tillåt längre perioder +news#:#news_allow_longer_periods_info#:#Användare kan välja längre nyhetsperioder för sina favoriter. +news#:#news_allow_shorter_periods#:#Tillåt kortare perioder +news#:#news_allow_shorter_periods_info#:#Användare kan välja kortare nyhetsperioder för sina favoriter. +news#:#news_attached_to#:#Tilldelad till +news#:#news_block_information#:#I blocket "Nyheter" visas alla nyheter om dina favoriter i kronologisk ordning. +news#:#news_block_news_for_context#:#Nyheter +news#:#news_cache#:#Cache för nyheter (minuter) +news#:#news_cache_info#:#Uppdatera blocket "Nyheter" var x:e minut. 0' betyder när som helst. Värden större än noll ökar prestandan i motsvarande grad. I enskilda fall kan dock länkar hänvisa till objekt som inte längre är tillgängliga. +news#:#news_default_visibility#:#Förvald åtkomst +news#:#news_edit_news_settings#:#Inställningar +news#:#news_enable_internal_news#:#Aktivera interna nyheter +news#:#news_enable_internal_news_info#:#Aktiverar "Nyheter"-block för kategorier, kurser, grupper och andra objekt. Användare kan prenumerera på dessa nyheter och få dem på sin instrumentpanel. +news#:#news_enable_internal_rss#:#Aktivera RSS för interna nyheter +news#:#news_enable_internal_rss_info#:#Tillåt publicering av nyheter via RSS. Dessa inlägg kan nås från utsidan utan autentisering. +news#:#news_enable_private_feed#:#Aktivera privat RSS-flöde +news#:#news_enable_private_feed_info#:#Ger tillgång till privata och publika nyheter via RSS. Autentisering sker med hjälp av ett speciellt feed-lösenord. +news#:#news_feed_url#:#URL för flöde +news#:#news_feed_url_for#:#Feed-URL för '%s' +news#:#news_first_letter_of_word_notification#:#B +news#:#news_get_feed_info#:#Detta är adressen till ditt personliga nyhetsflöde. Detta nyhetsflöde innehåller alla nyheter som har definierats som offentliga av respektive författare. Detta nyhetsflöde är inte skyddat av någon autentiseringsåtgärd. +news#:#news_get_feed_title#:#URL till ditt personliga nyhetsflöde +news#:#news_get_feed_url#:#Hämta URL för nyhetsflöde +news#:#news_get_priv_feed_info#:#Detta är adressen till ditt privata nyhetsflöde. Förutom offentliga nyheter innehåller detta nyhetsflöde även nyheter som har definierats som privata av respektive författare. Detta nyhetsflöde skyddas av ett lösenord, som du kan ställa in under "Inställ +news#:#news_get_priv_feed_title#:#URL till ditt privata nyhetsflöde +news#:#news_hide_news_block#:# Dölj blocket "Nyheter" +news#:#news_hide_news_block_info#:#Dölj blocket i elevvyn. Blocket "Nyheter" kommer endast att vara synligt för användare med skrivbehörighet. +news#:#news_hide_news_date#:#Startdatum +news#:#news_hide_news_per_date#:#Visa nyheter från datum +news#:#news_hide_news_per_date_info#:#Endast nyheter från ett visst datum visas. +news#:#news_inactive_private_feed_info#:#Ditt privata nyhetsflöde är avaktiverat. Ange ett lösenord i inställningarna. +news#:#news_internal_news#:#Nyheter +news#:#news_keep_minimal_x_items#:#Håll kvar äldre poster +news#:#news_keep_minimal_x_items_info#:#Antal poster som också görs tillgängliga i webbflödet efter den systemomfattande RSS-perioden. +news#:#news_loading_news#:#Nyheterna är laddade ... +news#:#news_media#:#Mediefil +news#:#news_new_comments#:#Nya kommentarer +news#:#news_new_reactions#:#Nya reaktioner +news#:#news_news_block#:#News" block +news#:#news_news_item_content#:#Text +news#:#news_news_item_content_long#:#Lång version +news#:#news_news_item_content_long_info#:#Denna text publiceras inte via RSS. +news#:#news_news_item_def_visibility_public_info#:#News är tillgängliga i ett offentligt RSS-webbflöde. De bör inte innehålla konfidentiell information. +news#:#news_news_item_def_visibility_users_info#:#News är endast tillgängligt för autentiserade användare. +news#:#news_news_item_head#:#Bidrag +news#:#news_news_item_title#:#rubrik +news#:#news_news_item_visibility#:#Tillgång +news#:#news_news_item_visibility_info#:#Public news kan läsas från utsidan och utan registrering. De får inte innehålla konfidentiell information. +news#:#news_news_items#:#Nyheter +news#:#news_no_js_click_here#:#Om nyheten inte visas, vänligen klicka här. +news#:#news_no_news_items#:#Det finns inga nyheter för dig. +news#:#news_notifications#:#Notifieringar +news#:#news_notifications_public#:#Öffentliga meddelanden +news#:#news_notifications_public_info#:#Om detta alternativ är valt kan meddelanden även tas emot utanför ILIAS via det personliga nyhetsflödet. Observera att dessa meddelanden kan nås utan autentisering. +news#:#news_nr_of_items#:#Antal maximala nyheter per objekt +news#:#news_nr_of_items_info#:#Antal nyheter som finns i databasen för ett objekt (t.ex. en fil eller en utbildningsmodul). Observera att containerobjekt som kategorier eller kurser kan innehålla fler nyheter, eftersom de också visar nyheterna för sina underobjekt. +news#:#news_pd_period#:#Tidsperiod för nyhetsvisning på instrumentpanelen +news#:#news_pd_period_info#:#Tidsperiod som tas med i beräkningen för nyheter på instrumentpanelen. Vid prestandaproblem bör lägre värden väljas. +news#:#news_period_1_month#:#Förra månaden +news#:#news_period_1_week#:#Förra veckan +news#:#news_period_1_year#:#Förra året +news#:#news_period_x_days#:#Senaste %s dagar +news#:#news_period_x_months#:#Senaste %s månader +news#:#news_period_x_weeks#:#Senaste %s veckor +news#:#news_public_feed#:#Own webfeed +news#:#news_public_feed_info#:#En RSS-ikon med en separat URL för webbflödet visas. +news#:#news_really_delete_news#:#Bör detta inlägg verkligen raderas? +news#:#news_rss#:#RSS +news#:#news_rss_period#:#RSS period +news#:#news_rss_title_format#:#RSS titelformat +news#:#news_rss_title_format_news_obj#:#Meddelandets titel (objektets titel) +news#:#news_rss_title_format_obj_news#:#Objektets titel - Meddelandets titel +news#:#news_settings#:#Inställningar för interna nyheter +news#:#news_sorry_not_accessible_anymore#:#Tyvärr, detta objekt är inte längre i din åtkomst. +news#:#news_time_period#:#Tidsspann +news#:#news_timline_add_entries_info#:#Det finns för närvarande inga nyheter tillgängliga. Klicka på "Lägg till inlägg" för att skapa nyheter. +news#:#news_visibility_public#:#Offentlig +news#:#news_visibility_users#:#Autentiserade användare +news#:#news_x_files_created#:#%s filer har lagts till. +news#:#news_x_files_updated#:#%s-filer har uppdaterats. +news#:#news_x_postings#:#%s bidrag har lagts till. +news#:#passwd_equals_ilpasswd#:#Var god ange ett annat lösenord än ditt ILIAS-lösenord av säkerhetsskäl +news#:#priv_feed_disabled#:#Privat nyhetsflöde har avaktiverats. +news#:#priv_feed_settings#:#Inställningar för privat nyhetsflöde +note#:#note_comment_notification_link#:#Länk +note#:#note_comment_notification_reason#:#Du får detta meddelande eftersom ILIAS administration är inställd på att meddela dig om alla kommentarer. +note#:#note_comment_notification_salutation#:#Hej %s, +note#:#note_comment_notification_subject#:#Ny kommentar i "%s". +note#:#note_comment_notification_subjectc#:#Ändrad kommentar i "%s". +note#:#note_comment_notification_user_has_written#:#%s har skrivit +note#:#note_comments_notification#:#Generellt meddelande om alla kommentarer +note#:#note_comments_notification_info#:#Kommaseparerad lista över ILIAS-konton som får varje kommentar som ett e-postmeddelande. +note#:#note_enable_comments#:# Aktivera kommentarer +note#:#note_enable_comments_del_tutor#:#Alla kommentarer kan raderas av handledare +note#:#note_enable_comments_del_tutor_info#:#Användare med rätt "Redigera inställningar" på ett objekt kan radera alla kommentarer som gjorts i det. +note#:#note_enable_comments_del_user#:#Kommentarer kan raderas av den person som skapade dem ###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +note#:#note_enable_comments_export_info#:#Gör det möjligt att exportera kommentarer i objekt som portföljer, bloggar eller wikis. +note#:#note_enable_notes#:#Aktivera Noter +note#:#note_html_export_include_comments#:#Bör även kommentarerna exporteras? +notes#:#comments_feature_currently_not_activated_for_object#:#Den offentliga kommentarsfunktionen är för närvarande inte aktiverad för detta objekt. +notes#:#note_add_comment#:#Lägg till kommentar +notes#:#note_add_note#:#Lägg till anteckning +notes#:#note_content_removed#:#Innehållet har tagits bort. +notes#:#note_text#:#Text +notes#:#note_update_comment#:#Redigera kommentar +notes#:#note_update_note#:#Redigera anteckning +notes#:#note_without_object#:#Utan objektreferens +notes#:#notes_activate_comments#:#Öppna för offentliga kommentarer +notes#:#notes_add_comment#:#Lägg till kommentar +notes#:#notes_add_edit_comment#:#Lägg till/redigera kommentar +notes#:#notes_all_comments#:#Alla kommentarer +notes#:#notes_comment#:#Kommentar +notes#:#notes_comment_deleted#:#Kommentaren raderades +notes#:#notes_comments#:#Kommentarer +notes#:#notes_comments_deleted#:#Kommentarerna har tagits bort. +notes#:#notes_deactivate_comments#:#Stäng av offentliga kommentarer +notes#:#notes_delete_comment#:#Ska följande kommentar verkligen raderas? +notes#:#notes_delete_note#:#Bör följande meddelande verkligen tas bort? +notes#:#notes_hide_comments#:#Dölja kommentarer +notes#:#notes_html_export#:#HTML-export +notes#:#notes_latest_comment#:#Sista kommentaren +notes#:#notes_my_comments#:#Mina kommentarer +notes#:#notes_no_comments#:#Ingen kommentar har gjorts ännu. +notes#:#notes_no_comments_found#:#Inga kommentarer hittades som matchar sökkriterierna. +notes#:#notes_no_notes#:#Ingen notering har lagts till ännu. +notes#:#notes_no_notes_found#:#Inga anteckningar hittades som matchar sökkriterierna. +notes#:#notes_note_deleted#:#Anteckningen har tagits bort +notes#:#notes_notes_deleted#:#Anteckningarna har tagits bort. +notes#:#notes_origin#:#Ursprung +notes#:#notes_public_comments#:#Offentliga kommentarer +notes#:#notes_show_comments#:#Visa kommentarer +notes#:#notes_sort_asc#:#Sortera stigande +notes#:#notes_sort_desc#:#Sortera fallande +notes#:#notes_text#:#Text +noti#:#noti_activate_notification#:# Aktivera avisering +noti#:#noti_deactivate_notification#:#Avaktivera avisering +noti#:#noti_notification_activated#:#Notifieringar är aktiverade +noti#:#noti_notification_deactivated#:#Notifieringar är inaktiverade +notifications_adm#:#enable_osd#:#Aktivera popup-aviseringar +notifications_adm#:#enable_osd_desc#:#När detta är aktiverat meddelas användarna om nya aviseringar via en popup. +notifications_adm#:#notification_settings#:#Inställningar för meddelanden +notifications_adm#:#osd_delay#:#Visa fördröjning +notifications_adm#:#osd_delay_desc#:#Fördröjning av visningen av aviseringarna i millisekunder +notifications_adm#:#osd_error_presentation_time_too_small#:#Displayens varaktighet måste vara minst 1000 millisekunder. +notifications_adm#:#osd_error_refresh_interval_smaller_than_delay_and_vanish_combined#:#Avfrågningsintervallet måste vara större än summan av visningstiden och fördröjningen. +notifications_adm#:#osd_error_refresh_interval_too_small#:#Pollningsintervallet måste vara minst 3000 millisekunder. +notifications_adm#:#osd_interval#:#Query intervall +notifications_adm#:#osd_interval_desc#:#Intervall för begäran om meddelanden i millisekunder. En lägre tid ger snabbare meddelanden, men ökar belastningen på servern. +notifications_adm#:#osd_play_sound#:#Spela upp ljud +notifications_adm#:#osd_play_sound_desc#:#Spela upp ljud när ett nytt meddelande tas emot. +notifications_adm#:#osd_settings#:#Popup-aviseringar +notifications_adm#:#osd_vanish#:#Visa varaktighet +notifications_adm#:#osd_vanish_desc#:#Duration för visning av aviseringar i millisekunder +obj#:#cont_filter_empty#:#Välkomna att använda filtret för att visa objekt. +obj#:#cont_skll_published#:#Alla kompetensuppdrag har publicerats. +obj#:#cont_skll_published_some_not#:#Alla givna kompetenstilldelningar har publicerats. Inga kompetenser kunde publiceras för vissa användare eftersom inga uppdrag var tillgängliga. +obj#:#edit_questions#:#Redigera frågor +obj#:#obj_activate_content_lang#:#Aktivera flerspråkighet för sidredigeraren +obj#:#obj_activate_multilang#:#Möjliggöra flerspråkighet +obj#:#obj_activation#:#Aktivering +obj#:#obj_activation_list_gui#:#Tillgänglighet +obj#:#obj_add_languages#:#Lägg till språk +obj#:#obj_additional_langs#:#Ytterligare språk +obj#:#obj_cont_transl_deactivated#:#Stödet för flerspråkigt innehåll i sidredigeraren har inaktiverats. +obj#:#obj_copy_progress#:#Kopiering av framsteg +obj#:#obj_deactivate_content_lang#:#Inaktivera flerspråkighet för sidredigeraren. +obj#:#obj_deactivate_content_transl_conf#:#Vill du verkligen inaktivera stödet för flerspråkigt innehåll i sidredigeraren? Endast innehåll på standardspråk kommer att förbli tillgängligt. +obj#:#obj_deactivate_multilang#:#Avaktivera flerspråkighet +obj#:#obj_deactivate_multilang_conf#:#Vill du verkligen inaktivera stödet för flerspråkigt innehåll? Endast innehåll på standardspråk kommer att förbli tillgängligt. +obj#:#obj_fallback_lang#:#Standardspråk +obj#:#obj_features#:#Ytterligare funktioner +obj#:#obj_import_file_error#:#Filen kunde inte importeras. Kontrollera att det är en ILIAS-exportfil (XML-export) av samma objekttyp och att filnamnet är oförändrat. Felmeddelande +obj#:#obj_insert_into_clipboard#:#Klistra in i urklipp +obj#:#obj_inserted_clipboard#:#Objekten klistrades in i klippbordet +obj#:#obj_master_lang#:#Grundläggande språk +obj#:#obj_more_translations#:#Andra översättningar +obj#:#obj_multilang_deactivated#:#Stöd för flerspråkigt innehåll har inaktiverats. +obj#:#obj_multilang_title_descr_only#:#Multilingualism är endast aktiverat för titel och beskrivning. Stöd för innehåll i sidredigeraren ("Designsida") kan aktiveras separat. +obj#:#obj_multilinguality#:#Flerspråkighet +obj#:#obj_orgunit_positions#:#Tillgång till föreskrifter enligt organisatoriska enheter +obj#:#obj_orgunit_positions_info#:#Om aktiverat kan ytterligare tillträdesregler tilldelas via positioner i organisatoriska enheter. +obj#:#obj_permission_settings#:#Inställningar för rättigheter +obj#:#obj_presentation#:#Presentation +obj#:#obj_select_master_lang#:#Välkomna att välja standardspråk. Befintligt innehåll tilldelas detta språk. Standardspråket kan inte ändras i efterhand. +obj#:#obj_select_one_language#:#Välkomna att välja exakt ett språk +obj#:#obj_set_fallback_lang#:#Sätta standardspråk +obj#:#obj_settings_for_all_members#:#Medlemmar kommer att meddelas automatiskt +obj#:#obj_show_header_actions#:#Visa åtgärder +obj#:#obj_show_title_and_icon#:#Visa titel och ikon +obj#:#obj_target_location#:#Destination mapp +obj#:#obj_tile_image#:#Bild av kakel +obj#:#obj_tile_image_info#:#Kakelbilden används för att representera detta objekt när kakelvyn är vald i den överordnade behållaren. För att undvika prestandaproblem bör du endast ladda upp bilder med en upplösning på 72 dpi och en bredd på mindre än 1000 px. +obj#:#obj_tool_booking#:#Resurser +obj#:#obj_tool_booking_info#:#Använd bokningspooler för att boka resurser. +obj#:#obj_tool_ext_mail_subject_prefix#:#Prefix e-postämne +obj#:#obj_tool_ext_mail_subject_prefix_info#:#Angiven text inkluderas i ämnesraden för externa e-postmeddelanden. Detta gör det lättare att identifiera och filtrera e-post från olika grupper och kurser. +obj#:#obj_tool_setting_badges#:#Badges +obj#:#obj_tool_setting_badges_info#:#Badges kan konfigureras om de aktiveras. +obj#:#obj_tool_setting_booking#:#Resurser +obj#:#obj_tool_setting_filter#:#Filter +obj#:#obj_tool_setting_filter_empty#:#Visas när filtret är tomt +obj#:#obj_tool_setting_filter_empty_info#:#Visar alla objekt när filtret är tomt. +obj#:#obj_tool_setting_filter_info#:#Ett filter visas på fliken "Innehåll". +obj#:#obj_tool_setting_info_tab#:#Fliken Information +obj#:#obj_tool_setting_info_tab_info#:#Fliken "Info" visas. +obj#:#obj_tool_setting_skills#:#Kompetens +obj#:#obj_tool_setting_skills_info#:#Funktionen gör det möjligt att välja kompetenser och tilldela kompetensnivåer till medlemmar. +obj#:#obj_tool_setting_tag_cloud#:#Tag Moln +obj#:#obj_tool_setting_tag_cloud_info#:#Ett taggmoln visas i blocket "Urval efter ämne" på fliken "Innehåll". +obj#:#obj_tool_setting_taxonomies#:#Taxonomier +obj#:#obj_tool_setting_use_news#:#Nyheter +obj#:#obj_tool_setting_use_news_info#:#Användning av News-blocket eller Timeline för nyheter. Användare kan aktivera aviseringar för nyheter så snart blocket eller tidslinjen är aktiv. +obj#:#obj_tool_setting_use_news_open_settings#:#Öppna inställningar för block och tidslinje +obj#:#obj_user_decides_notification#:#Medlemmar måste själva aktivera aviseringar +obj#:#obj_user_not_disable_not#:#Medlemmar kan inte avaktivera aviseringen +obj#:#svy_results#:#Resultat +objref#:#objref_custom_title#:#Ange din egen titel +objref#:#objref_edit_ref#:#Länkens mål +objref#:#objref_edit_title#:#Titel +objref#:#objref_failure_target_type#:#Målet för länken måste vara av följande typ +objref#:#objref_reuse_title#:#Ta över titeln på det länkade objektet +objref#:#objref_title_settings#:#Titel på det länkade objektet +orgu#:#Actions#:#Åtgärder +orgu#:#Staff#:#Anställda +orgu#:#add_position#:#Lägg till position +orgu#:#authorities#:#Behaviours +orgu#:#authority#:#Behaviours +orgu#:#backto_staff#:#Tillbaka till människor +orgu#:#change_to_employee#:#Gå över till anställda +orgu#:#change_to_superior#:#Ändra till överordnade +orgu#:#confirm_deletion_and_assign#:#Ta bort och tilldela användare +orgu#:#confirm_deletion_button#:#Radera +orgu#:#deassign_user_successful#:#User har framgångsrikt loggat ut. +orgu#:#edit_translations#:#Titel och beskrivning +orgu#:#employee#:#Anställda +orgu#:#ext_id#:#Externt ID +orgu#:#ext_id_updated#:#Det externa ID:t bearbetades framgångsrikt.n, eftersom uppgifterna lagras anonymt. +orgu#:#form_title_org_default_permissions_update#:#Standardiserade rättigheter +orgu#:#import_failed#:#Importen har misslyckats. Kontrollera att filen är skriven i XML-format och har en giltig struktur. +orgu#:#import_successful#:#Importen slutfördes framgångsrikt. Nyligen skapad +orgu#:#import_terminated_with_errors#:#Importen har upptäckt fel. +orgu#:#import_terminated_with_warnings#:#Importen har genererat varningar +orgu#:#import_xml_file#:#Importera fil +orgu#:#local_other_roles#:#Övriga lokala roller %s +orgu#:#local_staff#:#Stab %s +orgu#:#mm_organisation#:#Organisation +orgu#:#msg_assignment_to_employee_done#:#Tillsättning till befattningen Anställd utförd +orgu#:#msg_confirm_d_ua#:#Vill du tilldela följande användare positionen Personal i deras respektive organisationsenhet? +orgu#:#msg_confirm_deletion#:#Vill du verkligen ta bort följande objekt? +orgu#:#msg_confirm_remove_user#:#Vill du verkligen ta bort följande användare från positionen %s? +orgu#:#msg_deleted#:#Borttagen +orgu#:#msg_position_created#:#Position skapades. +orgu#:#msg_position_udpated#:#Position uppdaterad +orgu#:#msg_position_updated#:#Positionen har uppdaterats. +orgu#:#msg_success_permission_saved#:#Rättigheter har räddats. +orgu#:#no_assignment#:#Var god kontrollera din XML-fil. Ingen användartilldelning kunde hittas. +orgu#:#no_orgunit#:#Var god kontrollera din XML-fil. Ingen organisatorisk enhet kunde hittas. +orgu#:#no_roles#:#Det finns inga andra lokala roller just nu. +orgu#:#not_movable_to_subtree#:#En organisatorisk enhet kan inte delas upp i sina egna underenheter, eftersom detta skulle skapa en loop. +orgu#:#org_op_access_enrolments#:#Visa status för inskrivning +orgu#:#org_op_access_results#:#Tillgång till resultat +orgu#:#org_op_create_employee_talk#:#Skapa konversationer / redigera konversationer som du själv har skapat +orgu#:#org_op_edit_employee_talk#:#Redigera konversationer +orgu#:#org_op_edit_individual_plan#:#Redigera individuell plan +orgu#:#org_op_edit_submissions_grades#:#Redigera inlägg från andra användare +orgu#:#org_op_manage_members#:#Redigera medlemmar +orgu#:#org_op_manage_participants#:#Hantera deltagare +orgu#:#org_op_read_employee_talk#:#Läs tillgång till konversationer +orgu#:#org_op_read_learning_progress#:#Se andra användares framsteg i lärandet +orgu#:#org_op_score_participants#:#Rate deltagare +orgu#:#org_op_view_certificates#:#Visa certifikat från andra användare +orgu#:#org_op_view_competences#:#Visa andra användares kompetenser +orgu#:#org_op_view_individual_plan#:#Visa individuell plan +orgu#:#org_op_view_members#:#Memberships synliga +orgu#:#org_op_write_learning_progress#:#Set learning progress från andra användare +orgu#:#org_unit_not_found#:#Organisationsenheten hittades inte. +orgu#:#orgu_add#:#Lägg till organisatorisk enhet +orgu#:#orgu_adv_settings#:#Avancerade inställningar +orgu#:#orgu_already_deleted#:#Objektet har redan tagits bort. +orgu#:#orgu_enable_my_staff#:# Aktivera huvudmenyalternativet +orgu#:#orgu_enable_my_staff_info#:#En ny huvudpost visas i huvudmenyn. Den kan innehålla posterna Personallista, Inskrivningar, Certifikat, Kompetenser, Konversationer. +orgu#:#orgu_global_set_form#:#Globala inställningar +orgu#:#orgu_global_set_positions#:#Användning av positioner i objekttyper +orgu#:#orgu_global_set_positions_type_active#:#Positioner i +orgu#:#orgu_global_set_type_changeable#:#Beteende hos nya objekt +orgu#:#orgu_global_set_type_changeable_no#:#Positioner kan inte avaktiveras i objektet +orgu#:#orgu_global_set_type_changeable_object#:#Föränderlig inställning i objektet +orgu#:#orgu_global_set_type_default#:#standardvärde +orgu#:#orgu_global_set_type_default_info#:#Positioner aktiveras som standard på fliken "Inställningar" för objektet. +orgu#:#orgu_import#:#Import organisatorisk enhet +orgu#:#orgu_new#:#Ny organisatorisk enhet +orgu#:#orgu_orgu_type#:#Typ av organisatorisk enhet +orgu#:#orgu_settings#:#Organisatoriska enheter Inställningar +orgu#:#orgu_staff#:#Anställda +orgu#:#orgu_staff_deassign#:#verkligen ta bort dessa användare från rollen? +orgu#:#orgu_type#:#Typ av organisatorisk enhet +orgu#:#orgu_type_add#:#Lägg till typ av organisatorisk enhet +orgu#:#orgu_type_assign_amd_sets#:# Tilldela användardefinierade metadata +orgu#:#orgu_type_available_amd_sets#:#Tillgängliga anpassade metadata +orgu#:#orgu_type_custom_icon#:#Användardefinierad ikon för denna typ av organisatorisk enhet +orgu#:#orgu_type_custom_icon_info#:#Alla organisationsenheter med denna typ visas med denna ikon +orgu#:#orgu_type_edit#:#Redigera typ av organisatorisk enhet +orgu#:#orgu_type_msg_assign_amd_prevented#:#Att lägga till utökade metadata förhindras av följande plug-ins +orgu#:#orgu_type_msg_deassign_amd_prevented#:#Removal av utökade metadata förhindras av följande plugins +orgu#:#orgu_type_msg_deleted#:#Typ av organisatorisk enhet har tagits bort +orgu#:#orgu_type_msg_deletion_prevented#:#Deletion förhindras av följande plugins +orgu#:#orgu_type_msg_error_custom_icon#:#Icon kunde inte sparas +orgu#:#orgu_type_msg_missing_title#:#En titel måste anges för standardspråket +orgu#:#orgu_type_msg_missing_title_default_language#:#Standardspråk och rubriken för standardspråket måste fyllas i +orgu#:#orgu_type_msg_setting_default_lang_prevented#:#'%' inte möjligt som standardspråk, förhindras av följande plug-ins +orgu#:#orgu_type_msg_setting_member_prevented#:#Att tilldela '%s' förhindras av följande plugins +orgu#:#orgu_type_msg_unable_delete#:#Typen kan inte raderas eftersom den fortfarande är tilldelad följande organisatoriska enheter +orgu#:#orgu_type_msg_updating_prevented#:#Uppdatera objektet som förhindras av följande plugins +orgu#:#orgu_types#:#Typer +orgu#:#orgunit_position_permissions_not_active_for#:#Overskrivning av åtkomstkontrollen för positionerna får inte göras lokalt för typen +orgu#:#ou_external_id_exists#:#En organisatorisk enhet med det externa ID:t finns redan i ILIAS. +orgu#:#ou_id_not_valid#:#Import-ID:t kunde inte hittas. +orgu#:#ou_more_than_one_match_found#:#Mer än en träff hittades. +orgu#:#ou_parent_id_not_valid#:#Ou_parent_id kunde inte hittas. +orgu#:#over#:#Om +orgu#:#over_-1#:#Alla +orgu#:#placeholder#:#... +orgu#:#positions#:#Positioner +orgu#:#rec_staff#:#Staff %s och därefter +orgu#:#remove_successful#:#Användaren har tagits bort framgångsrikt. +orgu#:#remove_user#:#Remove +orgu#:#scope#:#i +orgu#:#scope_1#:#egen organisatorisk enhet +orgu#:#scope_2#:# egna och underordnade organisatoriska enheter +orgu#:#scope_3#:#alla organisatoriska enheter +orgu#:#show_learning_progress#:#Visa framsteg i inlärningen +orgu#:#simple_import#:#Enkel XML-import +orgu#:#simple_user_import#:#XML användartilldelning +orgu#:#simple_xls#:#Enkel Excel-export +orgu#:#simple_xml#:#Enkel XML-export +orgu#:#superior#:#Tillsynsman +orgu#:#user_assignments#:#Användartilldelning +orgu#:#user_assignments_recursive#:#Underträd för användartilldelning +orgu#:#user_changed_successful#:#Användaren har skrivits om framgångsrikt. +orgu#:#user_import_successful#:#Importen genomfördes framgångsrikt. Nyligen tilldelad +orgu#:#users_successfuly_added#:#Användaren har registrerats framgångsrikt. +orgu#:#view_learning_progress#:#Visa framsteg i inlärningen +orgu#:#view_learning_progress_rec#:#Se lärandets framsteg rekursivt +pd#:#block_show_chatviewer#:#Visa Chatviewer +pd#:#block_show_pdbookm#:#Visa Bokmärken +pd#:#block_show_pdcal#:#Visa kalender +pd#:#block_show_pdfrmpostdraft#:#Visa utkast till bidrag +pd#:#block_show_pdmail#:#Visa Mail +pd#:#block_show_pdnews#:#Visa nyheter +pd#:#block_show_pdnotes#:#Visa anteckningar +pd#:#block_show_pdportf#:#Visa Portföljer +pd#:#block_show_pdtag#:#Visa taggar +pd#:#block_show_pdtasks#:#Visa Att göra +pd#:#block_show_x#:#Visa %s +pd#:#pd_achievements#:#lärande framgångar +pd#:#pd_bookmarks#:#Bokmärken +pd#:#pd_download_last_export_file#:#Ladda ner aktuell exportfil +pd#:#pd_enable_comments#:# Aktivera kommentarer +pd#:#pd_enable_prtf#:#Aktivera portföljer +pd#:#pd_enable_user_publish#:# Möjliggör publicering av innehåll från användare +pd#:#pd_enable_user_publish_info#:#Med detta alternativ kan användare göra sin profil, arbetsyta och portföljer globalt tillgängliga (på internet). +pd#:#pd_ended#:#Färdig +pd#:#pd_export_profile#:#Exportera personuppgifter +pd#:#pd_import_personal_data#:#Importera personuppgifter +pd#:#pd_my_memberships_intro#:#Välkommen till din kurs och gruppmedlemskap +pd#:#pd_my_memberships_intro2#:#Här hittar du alla kurser och grupper som du är medlem i. För närvarande har du inga medlemskap. Det finns två sätt att bli medlem i en kurs eller grupp +pd#:#pd_my_memberships_sort_default#:#Standard sortering +pd#:#pd_not_date#:#Inte daterad +pd#:#pd_ongoing#:#Aktuell +pd#:#pd_personal_items_default_view#:#Standardvy +pd#:#pd_personal_items_default_view_info#:#Välj standardvy för Selected-erbjudanden här. +pd#:#pd_presentation_mode_list#:#Listvy +pd#:#pd_presentation_mode_tile#:#Kakel utsikt +pd#:#pd_private_calendars#:#Privata kalendrar +pd#:#pd_profile_data#:#Profiluppgifter +pd#:#pd_remove_multi_confirm#:#Objekten har tagits bort. +pd#:#pd_remove_multiple#:#Ta bort flera objekt +pd#:#pd_unsubscribe_memberships#:#Avsluta medlemskap +pd#:#pd_unsubscribe_multiple_memberships#:#Avsluta flera medlemskap +pd#:#pd_upcoming#:#Föregående +pd#:#pd_view_select_at_least_one#:#Välj minst en vy, antingen "Utvalda erbjudanden" och/eller "Kurser och grupper". +pdesk#:#bookmark_moved_ok#:#Bookmark har flyttats. +pdesk#:#bookmark_select_target#:#Vänligen välj destination. +pdfgen#:#checkbox_checked_svg#:#Sökväg till den markerade kryssrutan SVG +pdfgen#:#checkbox_svg#:#Stig till kryssrutan SVG +pdfgen#:#cleanup#:#Städning +pdfgen#:#config#:#Konfiguration +pdfgen#:#config_not_saved#:#Räddning misslyckades. +pdfgen#:#config_saved#:#Save framgångsrik. +pdfgen#:#configure#:#Konfigurera rendering +pdfgen#:#enable_forms#:#Aktivera formulär +pdfgen#:#enable_forms_info#:#Konverterar HTML-formulär till PDF-formulär +pdfgen#:#external_links#:#Externa länkar +pdfgen#:#external_links_info#:#Skapar länkar till externa webbplatser +pdfgen#:#footer_height#:#Höjd sidfot +pdfgen#:#footer_html#:#Html +pdfgen#:#footer_line#:#Separationslinje +pdfgen#:#footer_show_pages#:# Visa sidnummer +pdfgen#:#footer_text#:#Text +pdfgen#:#footer_text_center#:#Text mitten +pdfgen#:#footer_text_left#:#Text vänster +pdfgen#:#footer_text_right#:#Text höger +pdfgen#:#footer_type#:#Footer +pdfgen#:#greyscale#:#Gråskala +pdfgen#:#greyscale_info#:#PDF skapas i gråskala +pdfgen#:#head_text#:#Text +pdfgen#:#header_height#:#Höjd rubrik +pdfgen#:#header_line#:#Separationslinje +pdfgen#:#header_show_pages#:# Visa sidnummer +pdfgen#:#header_text_center#:#Text mitten +pdfgen#:#header_text_left#:#Text vänster +pdfgen#:#header_text_right#:#Text höger +pdfgen#:#header_type#:#Rubrik +pdfgen#:#html#:#Html +pdfgen#:#image_scale#:#Skalning av bilder +pdfgen#:#javascript_delay#:#Javascript fördröjning +pdfgen#:#javascript_delay_info#:#Om JavaScript används för att rendera sidinnehåll, säkerställer fördröjningen att detta innehåll också visas i PDF-filen. Standardfördröjningen på 200 ms bör vara tillräcklig i de flesta fall. +pdfgen#:#low_quality#:#Låg kvalitet +pdfgen#:#low_quality_info#:#Skapar PDF-filer med reducerad kvalitet, vilket ger dem en mindre filstorlek. +pdfgen#:#margin#:#kant +pdfgen#:#margin_bottom#:#Marginal nedan +pdfgen#:#margin_info#:#Marginal i mm t.ex. 10mm +pdfgen#:#margin_left#:#Marginal vänster +pdfgen#:#margin_right#:#Marginal höger +pdfgen#:#margin_top#:#Marginal topp +pdfgen#:#none#:#Ingen +pdfgen#:#orientation#:#Orientation +pdfgen#:#output_options#:#Alternativ för utmatning +pdfgen#:#overwrite_font#:#Overskriv teckensnitt +pdfgen#:#overwrite_font_info#:#Använd inmatningar här som +pdfgen#:#page_settings#:#Inställningar för sidan +pdfgen#:#page_size#:#Storlek på sida +pdfgen#:#path#:#Vägen till programmet +pdfgen#:#preferred_renderer#:#Föreslagen rendering +pdfgen#:#print_media_info#:#Medietypen "print" används istället för "screen". +pdfgen#:#print_media_type#:#Använd 'Print Media Type' istället för 'Screen +pdfgen#:#problem_with_purposes#:#Ett problem har upptäckts i konfigurationen. Använd knappen "Rensa upp" för att lösa problemet. +pdfgen#:#radio_button_checked_svg#:#Sökväg till den valda radioknappen SVG +pdfgen#:#radio_button_svg#:#Stig till radioknapp SVG +pdfgen#:#reset_to_default#:#Ladda in standardinställningar +pdfgen#:#selected_renderer#:#Vald renderare +pdfgen#:#spacing#:#Avstånd +pdfgen#:#text#:#Text +pdfgen#:#user_stylesheet#:#Användarens stilmall +pdfgen#:#viewport#:#Vyport +pdfgen#:#viewport_info#:#Vybild i pixlar, t.ex. "1920*1080" +pdfgen#:#webkit#:#wkhtmltopdf +pdfgen#:#wkhtml_config#:#Konfiguration för WKHTML +pdfgen#:#zoom#:#Zoom +poll#:#poll_absolute#:#Aktuella röster +poll#:#poll_activation_online_info#:#Välj denna inställning för att göra röstning tillgänglig för användare. +poll#:#poll_add#:#Skapa omröstning +poll#:#poll_anonymous_warning#:#Ditt namn visas inte i röstningsresultaten. +poll#:#poll_answer#:#Svar +poll#:#poll_answers#:#Möjliga svar +poll#:#poll_barchart#:#Balkdiagram +poll#:#poll_block_message_already_voted#:#Du har redan röstat. +poll#:#poll_block_message_inactive#:#Den här rösten är tillgänglig från %s. +poll#:#poll_block_message_no_answers#:#Denna omröstning är inte slutförd. +poll#:#poll_block_message_offline#:#Den här omröstningen är offline. +poll#:#poll_block_results_available_on#:#Resultaten kommer att publiceras på %s. +poll#:#poll_comments#:#Kommentarer +poll#:#poll_copy#:#Kopiera omröstning +poll#:#poll_delete_votes#:#Radera alla röster +poll#:#poll_delete_votes_sure#:#Är du säker på att du vill radera alla röster? +poll#:#poll_edit#:#Redigera omröstning +poll#:#poll_image#:#Image +poll#:#poll_import#:#Import omröstning +poll#:#poll_max_number_of_answers#:#Maximalt antal svar per deltagare +poll#:#poll_mode#:#Mode +poll#:#poll_mode_anonymous#:#Anonym +poll#:#poll_mode_anonymous_info#:#Avgivna Votes kan inte tilldelas deltagare. +poll#:#poll_mode_personal#:#Personligt anpassad +poll#:#poll_mode_personal_info#:#En lista över deltagare med avgivna röster är tillgänglig med tillräckliga rättigheter. +poll#:#poll_new#:#Skapa ny omröstning +poll#:#poll_non_anonymous_warning#:#Ditt namn och din röst syns i omröstningsresultaten för administratörer. +poll#:#poll_notification_subscribe#:# Aktivera avisering +poll#:#poll_notification_unsubscribe#:#Avaktivera avisering +poll#:#poll_percentage#:#Aktuell andel +poll#:#poll_piechart#:#Pie diagram +poll#:#poll_population#:#%s deltagare +poll#:#poll_question#:#Fråga +poll#:#poll_result#:#Röstningsresultat +poll#:#poll_result_answers#:#Voices +poll#:#poll_result_sorting#:#Sortering +poll#:#poll_result_sorting_answers#:#I den ordning som svaren kommer +poll#:#poll_result_sorting_votes#:#Efter antal röster (fallande) +poll#:#poll_result_users#:#Deltagare +poll#:#poll_show_results_as#:#Visa resultat som +poll#:#poll_sortorder#:#Sortering +poll#:#poll_view_results#:#Visa resultat +poll#:#poll_view_results_after_period#:#Efter omröstningsperiod +poll#:#poll_view_results_after_period_impossible#:#Omröstningsperioden är inte tidsbegränsad. +poll#:#poll_view_results_after_vote#:#Efter omröstning +poll#:#poll_view_results_always#:#Alltid +poll#:#poll_view_results_never#:#Aldrig +poll#:#poll_vote#:#Rösta +poll#:#poll_vote_error_multi#:# Välj högst %s svar. +poll#:#poll_vote_error_single#:#Välj ett svar. +poll#:#poll_vote_notification_body#:#Följande omröstning har fått en röst +poll#:#poll_vote_notification_link#:#Länk till omröstningen +poll#:#poll_vote_notification_reason#:#Du får detta meddelande eftersom du har aktiverat meddelandefunktionen för ovanstående omröstning. +poll#:#poll_vote_notification_subject#:#Röstning "%s" +poll#:#poll_votes_no_edit#:#Denna omröstning innehåller redan röster. Den kan inte redigeras så länge du inte tar bort rösterna. +poll#:#poll_voting_period_and_results#:#Röstningsperiod och resultat +poll#:#poll_voting_period_full_info#:#Röstning från %s till %s +poll#:#poll_voting_period_info#:#Slut på omröstningen +poll#:#poll_voting_period_limited#:#Tidsbegränsad omröstningsperiod +prg#:#access_ctr_by_orgu_position#:#Autorisationer baserade på positioner i organisatoriska enheter +prg#:#active_only#:#Endast aktiv +prg#:#add_automembership_source#:#Lägg till automatik +prg#:#add_category#:#Lägg till kategori +prg#:#assignment_date#:#Datum för tillträde +prg#:#assignments#:#Uppgifter +prg#:#auto_add_success#:#Automatism framgångsrikt tillagd. +prg#:#auto_membership_description#:#Regler verkställs endast om ett kriterium uppfylls efter att regeln har aktiverats. Inga uppdrag tas bort om ett annat aktivt kriterium uppfylls vid den tidpunkten. +prg#:#auto_membership_src_type#:#Typ +prg#:#auto_membership_title#:#Källor för automatisk tilldelning +prg#:#auto_memberships#:#Automatisk tilldelning +prg#:#category#:#Kategori +prg#:#completion_date#:#Datum för stängning +prg#:#confirm_to_remove_selected_assignments#:#Verkligen ta bort användartilldelning(ar)? +prg#:#content_automation#:#Automatisering av innehåll +prg#:#content_automation_title#:# Lägg till/ta bort kurser i dessa kategorier automatiskt +prg#:#could_not_add_users_no_permissons#:#Kunde inte lägga till %d användare på grund av bristande behörighet. +prg#:#crs_affiliation_to_prg#:#Affiliation to study programmes###31 03 2023 ny variabel +prg#:#deadline_information#:#Information om behandlingsperioden +prg#:#deadline_updated#:#Datum för uppdatering +prg#:#edit_participants#:#Redigera uppdrag +prg#:#error_updating_deadline#:#Ett fel uppstod under uppdateringen av 'Deadline'. +prg#:#error_updating_expire_date#:#Ett fel uppstod vid uppdatering av 'Expiration Qualification'. +prg#:#form_msg_file_wrong_file_type#:#Fel filtyp. +prg#:#header_update_current_plan#:#Vill du verkligen återställa de individuella inställningarna för de valda tilldelningarna? +prg#:#inactive_only#:#endast inaktiv +prg#:#info_to_re_assign_mail_body#:#%s %s,

giltigheten för din kvalifikation vid studieprogrammet '%s' kommer snart att löpa ut. Vänligen registrera dig på nytt. +prg#:#info_to_re_assign_mail_subject#:#Påminnelse om att delta igen i studieprogrammet +prg#:#invalidated#:#Validitet +prg#:#label_crs#:#Kursens namn +prg#:#label_grp#:#Gruppens namn +prg#:#label_role#:#Rollens namn +prg#:#last_edited#:#Last redigerad +prg#:#last_edited_by#:#Last redigerad av +prg#:#mail_assignments#:#Mail till tilldelade användare +prg#:#manage_assignments#:#Hantera uppdrag +prg#:#membership_source_id#:#Id +prg#:#membership_source_id_byline_objid#:#Var god använd objektets id +prg#:#membership_source_id_byline_refid#:#Vänligen använd referens-ID +prg#:#membership_source_type#:#Källa +prg#:#modal_automembership_title#:#Lägg till automatik +prg#:#modal_categories_title#:#Kategori som ska övervakas +prg#:#modal_member_auto_select_title#:#Välj källa för automatisk tilldelning +prg#:#msg_change_deadline_date#:#Datum justerat för %s användare. +prg#:#msg_change_deadline_date_failed#:#Datum ej justerat för +prg#:#msg_change_expire_date#:#Förfallodatum justerat för %s användare. +prg#:#msg_change_expire_date_failed#:#Processen inte anpassad för +prg#:#msg_fill_required#:#Vänligen fyll i alla obligatoriska fält. +prg#:#msg_impossible_target_status#:#Invalid status +prg#:#msg_mark_accredited#:#%s användare har ackrediterats. +prg#:#msg_mark_accredited_failed#:#Inte markerad som ackrediterad +prg#:#msg_mark_not_relevant#:#%s Användare markerad som ej relevant. +prg#:#msg_mark_not_relevant_failed#:#Markeras inte som irrelevant +prg#:#msg_mark_relevant#:#%s användare markerade som relevanta. +prg#:#msg_mark_relevant_failed#:#Markeras inte som relevant +prg#:#msg_points_must_be_positive#:#Endast positiva poäng är tillåtna. +prg#:#msg_unmark_accredited#:#%s Användare markerad som ej ackrediterad. +prg#:#msg_unmark_accredited_failed#:#Remove ackreditering lyckades inte på +prg#:#msg_update_from_settings#:#%s Användaren uppdaterad från inställningarna. +prg#:#msg_update_from_settings_failed#:#Uppdateringen lyckades inte +prg#:#msg_update_individual_plan#:#Framgångsrikt uppdaterad (%s) +prg#:#msg_update_individual_plan_failed#:#Fel vid uppdatering +prg#:#no_srctype_or_id#:#Id och Type får inte vara tomma. +prg#:#not_a_valid_cat_id#:#%s motsvarar inte någon kategori. +prg#:#obj_prg_select#:#-- Välj studieprogram --###31 03 2023 ny variabel +prg#:#optgrp_label_restart#:#Återupptagande +prg#:#optgrp_label_validity#:#Avlopp +prg#:#orgu#:#Organisatorisk enhet +prg#:#percentage#:#% +prg#:#prg_access_by_orgu#:#Tillgång till föreskrifter enligt organisatoriska enheter +prg#:#prg_access_by_orgu_byline#:#Om aktiverat kan ytterligare tillträdesregler tilldelas via positioner i organisatoriska enheter. +prg#:#prg_acknowledge_completed_courses#:#Erkänna godkända kurser +prg#:#prg_add#:#Skapa studieprogram +prg#:#prg_added_course_ref_successful#:#Ny kurslänk har lagts till framgångsrikt. +prg#:#prg_added_member#:#Den nya medlemmen har lagts till framgångsrikt. +prg#:#prg_added_members#:#De nya medlemmarna har lagts till framgångsrikt. +prg#:#prg_additional_settings#:#Ytterligare funktioner +prg#:#prg_assessment#:#Utvärdering av studieprogram +prg#:#prg_assign_date#:#Tillägg på +prg#:#prg_assigned_by#:#Tillagd av +prg#:#prg_async_create#:#Lägg till nytt element. +prg#:#prg_async_settings#:#Inställningar +prg#:#prg_auto_member_select_crs#:#Kurser +prg#:#prg_auto_member_select_grp#:#Grupper +prg#:#prg_auto_member_select_role#:#Rolls +prg#:#prg_autoassignment#:#(automatisk) +prg#:#prg_belongs_to#:#Höra till +prg#:#prg_can_not_manage_in_repo#:#Du får inte administrera detta studieprogram eftersom medlemmar redan är tilldelade det. +prg#:#prg_cancel#:#Avbryt +prg#:#prg_cancel_tree_order#:#Bortse från beställningen av trädet. +prg#:#prg_change_deadline#:#Justera brytdatum +prg#:#prg_change_expire_date#:#Anpassa kvalificeringsprocessen +prg#:#prg_changed_by#:#Ändrad av +prg#:#prg_completed_by_subnodes#:#Delprogram +prg#:#prg_completion_by#:#Kompletterad av +prg#:#prg_completion_date#:#Datum för stängning +prg#:#prg_confirm_delete#:#Radera +prg#:#prg_copy_threads_info#:#Bedöm vilka delar av studieprogrammet som ska kopieras, länkas eller utelämnas.###31 03 2023 ny variabel +prg#:#prg_create_new_leaf#:#Lägg till ny kurslänk. +prg#:#prg_create_new_node#:#Lägg till nytt studieprogram +prg#:#prg_cron_job_configuration#:#Automatiska e-postmeddelanden +prg#:#prg_custom_plan#:#Individuell plan +prg#:#prg_dash_label_finish_until#:#Att göras av +prg#:#prg_dash_label_gain#:#Aktuell status +prg#:#prg_dash_label_minimum#:#Minsta mål +prg#:#prg_dash_label_restart_from#:#Ny start från +prg#:#prg_dash_label_status#:#Status +prg#:#prg_dash_label_unreachable#:#- Målet kan inte uppnås +prg#:#prg_dash_label_valid#:#Validitet +prg#:#prg_deadline#:#Datum +prg#:#prg_deadline_date#:#Bearbetningsperioden avslutas på ett fastställt brytdatum +prg#:#prg_deadline_date_desc#:#Programmet måste slutföras inom en viss tidsfrist. +prg#:#prg_deadline_date_label#:#Redigera tills +prg#:#prg_deadline_period#:#Redigeringsperioden avslutas individuellt +prg#:#prg_deadline_period_desc#:#Programmet måste slutföras inom den angivna tidsperioden (i dagar). +prg#:#prg_deadline_period_label#:#Dagar efter tilldelning +prg#:#prg_deadline_settings#:#Redigera period +prg#:#prg_delete_confirmation#:#Vill du verkligen ta bort de markerade posterna? +prg#:#prg_delete_failure#:#Raderingen misslyckades. +prg#:#prg_delete_nothing_selected#:#Inga poster valdes. +prg#:#prg_delete_single_confirmation#:#Vill du verkligen ta bort den markerade posten? +prg#:#prg_delete_single_success#:#Entry har tagits bort framgångsrikt. +prg#:#prg_delete_success#:#Poster har raderats framgångsrikt. +prg#:#prg_deleted_safely#:#Node har tagits bort på ett säkert sätt. +prg#:#prg_description#:#Beskrivning +prg#:#prg_edit#:#Redigera studieprogram +prg#:#prg_expiry_date#:#Kvalificering av förfaranden +prg#:#prg_formatted_period#:#%d dagar +prg#:#prg_invalidate_expired_progresses_desc#:#Sätter 'Validity' till 'Invalid' när utgångsdatum har uppnåtts. +prg#:#prg_invalidate_expired_progresses_title#:#Tidsbegränsad giltighet för studieprogram +prg#:#prg_link#:#Länk +prg#:#prg_mail_context_info#:#For the participant emails on the member and learning progress views of a study programme. +prg#:#prg_mail_context_title#:#Studieprogram +prg#:#prg_mail_permanent_link#:#Välj följande länk för att komma åt innehållet i studieprogrammet +prg#:#prg_manage#:#Hantering +prg#:#prg_manage_members#:#Redigera uppgifter för ett studieprogram +prg#:#prg_manage_members_short#:#Hantera uppdrag +prg#:#prg_manual_status#:#Manuell status +prg#:#prg_mark_accredited#:#ackredit +prg#:#prg_mark_accredited_multi_success#:#Urvalda användare ackrediterade. +prg#:#prg_mark_accredited_success#:#Programmet har ackrediterats framgångsrikt för användaren. +prg#:#prg_mark_not_relevant_multi_success#:#Urvalda användare markerade som ej relevanta. +prg#:#prg_mark_relevant#:#Markera som relevant +prg#:#prg_mark_relevant_multi_success#:#Urvalda användare markerade som relevanta. +prg#:#prg_more_objects_without_read_permission#:#Studieprogrammet innehåller andra element som du inte får visa på grund av bristande rättigheter. +prg#:#prg_multi_change_deadline#:#Justera brytdatum +prg#:#prg_multi_change_expire_date#:#Anpassa kvalificeringsprocessen +prg#:#prg_multi_mail_user#:#Skicka e-post +prg#:#prg_multi_mark_accredited#:#Kredit +prg#:#prg_multi_mark_relevant#:#Markera som relevant +prg#:#prg_multi_remove_user#:#Ta bort användare +prg#:#prg_multi_unmark_accredited#:#Ta bort ackreditering +prg#:#prg_multi_unmark_relevant#:#Markera som irrelevant +prg#:#prg_multi_update_from_current_plan#:#Uppdatera från den aktuella planen +prg#:#prg_new#:#Skapa ett nytt studieprogram +prg#:#prg_no_deadline#:#Ingen behandlingsperiod +prg#:#prg_no_members_not_active#:#Eftersom studieprogrammet inte är aktivt kan inga nya medlemmar läggas till. +prg#:#prg_no_restart#:#Inget automatiskt återinsättande (när kvalifikationen löper ut) +prg#:#prg_no_user_selected#:#Ingen användare har valts. +prg#:#prg_no_validity_qualification#:#Ingen kvalificeringsprocedur +prg#:#prg_not_allowed_node_to_delete#:#Du får inte ta bort detta studieprogram. +prg#:#prg_not_valid#:#ogiltig +prg#:#prg_open_node#:#Byt till studieprogram. +prg#:#prg_orgus#:#Organisatorisk(a) enhet(er) +prg#:#prg_please_select_a_course_for_creating_a_leaf#:#Välj en kurslänk. +prg#:#prg_points#:#Poäng +prg#:#prg_points_byline#:#Användarna får ett visst antal poäng när de framgångsrikt slutför detta program och måste uppnå detta antal poäng i efterföljande program. +prg#:#prg_points_current#:#Aktuella punkter +prg#:#prg_points_reachable#:#Achievable poäng +prg#:#prg_points_required#:#Nödvändiga punkter +prg#:#prg_possible#:#Möjligt +prg#:#prg_prg_type#:#Typ av studieprogram +prg#:#prg_processing_ends_no_success#:#Dagar före slutet av bearbetningsperioden +prg#:#prg_processing_ends_no_success_info#:#Dagar före slutet av bearbetningsperioden +prg#:#prg_profile_not_public#:#Användarens profil är inte offentlig. +prg#:#prg_progress_info#:#Du har %1$d poäng. Du har klarat studieprogrammet med %2$d poäng. +prg#:#prg_progress_status#:# %1$d från %2$d punkter +prg#:#prg_progress_status_with_child_sp#:# %1$d från möjliga %2$d poäng +prg#:#prg_quali_not_valid#:#Qualifikation ogiltig +prg#:#prg_quali_still_valid#:#Kvalificering giltig +prg#:#prg_remove_user#:#Ta bort uppdrag +prg#:#prg_remove_user_success#:#Uppdraget har tagits bort. +prg#:#prg_remove_users_not_possible#:#Utvalda användare kan inte tas bort. +prg#:#prg_remove_users_partial_success#:#Allokeringar (delvis) borttagna. +prg#:#prg_remove_users_partitial_success#:#Urvalda användare har delvis tagits bort. +prg#:#prg_remove_users_success#:#Urvalda användare har tagits bort. +prg#:#prg_restart_assignments_temporal_progress_desc#:#Boka om deltagare på studieprogram när repetitionsperioden börjar. +prg#:#prg_restart_assignments_temporal_progress_title#:#Automatisk återinträde till studieprogram +prg#:#prg_save_tree_order#:#Rädda ordningen på trädet +prg#:#prg_saved_order_successful#:#Trädets order har räddats framgångsrikt. +prg#:#prg_show_individual_plan#:#Visa individuell plan +prg#:#prg_show_programmes#:#Display +prg#:#prg_show_programmes_on_pd_always#:#Studieprogram är alltid synliga på instrumentpanelen. +prg#:#prg_show_programmes_on_pd_only_read#:#Studieprogram är endast synliga på Dashboard när läsbehörighet är tillgänglig. +prg#:#prg_some_users_may_not_be_accredited#:#Urvalda användare har delvis ackrediterats. +prg#:#prg_some_users_may_not_be_marked_not_relevant#:#Progress of selected users var delvis markerad som ej relevant. +prg#:#prg_some_users_may_not_be_marked_relevant#:#Progress av utvalda användare markerades delvis som relevant. +prg#:#prg_some_users_may_not_be_unmarked_accredited#:#Ackrediteringen av utvalda användare har delvis tagits bort. +prg#:#prg_status#:#Status +prg#:#prg_status_1#:#Pågår +prg#:#prg_status_2#:#Fullbordad +prg#:#prg_status_3#:#Ackrediterad +prg#:#prg_status_4#:#Inte relevant +prg#:#prg_status_5#:#Misslyckad +prg#:#prg_status_accredited#:#Ackrediterad +prg#:#prg_status_active#:#Aktiv +prg#:#prg_status_byline#:#Använd status för att kontrollera om detta program är tillgängligt för användare. +prg#:#prg_status_completed#:#Fullbordad +prg#:#prg_status_draft#:#Draft +prg#:#prg_status_failed#:#Misslyckad +prg#:#prg_status_hide_irrelevant#:#Dölj irrelevant +prg#:#prg_status_in_progress#:#Pågår +prg#:#prg_status_not_relevant#:#Inte relevant +prg#:#prg_status_outdated#:#Utgången +prg#:#prg_still_valid#:# giltig +prg#:#prg_subtype_add#:#Lägg till ny typ +prg#:#prg_subtypes#:#Typer +prg#:#prg_title#:#Titel +prg#:#prg_type#:#Typ av studieprogram +prg#:#prg_type_add#:#Lägg till programtyp +prg#:#prg_type_assign_amd_sets#:#Tilldela utökad metadatauppsättning +prg#:#prg_type_available_amd_sets#:#Tillgängliga anpassade metadatauppsättningar +prg#:#prg_type_byline#:#Ställ in en typ för att använda specifika anpassade metadatauppsättningar eller symboler. +prg#:#prg_type_custom_icon#:#Individuell ikon +prg#:#prg_type_custom_icon_info#:#Info för enskild ikon +prg#:#prg_type_edit#:#Redigera typ +prg#:#prg_type_msg_deleted#:#Typ borttagen. +prg#:#prg_type_msg_error_custom_icon#:#Ett fel uppstod när den individuella ikonen sparades. +prg#:#prg_type_msg_missing_title#:#Titeln får inte vara tom. +prg#:#prg_type_msg_missing_title_default_language#:#Ett standardspråk och en titel för standardspråket måste anges. +prg#:#prg_type_msg_unable_delete#:#Kan inte ta bort typ eftersom den används i följande studieprogram +prg#:#prg_unmark_accredited#:#Ta bort ackreditering +prg#:#prg_unmark_accredited_multi_success#:#Urvalda användare markerade som ej ackrediterade +prg#:#prg_unmark_accredited_success#:#Akkrediteringen har framgångsrikt tagits bort. +prg#:#prg_unmark_relevant#:#Markera som irrelevant +prg#:#prg_update_from_current_plan#:#Uppdatera från den aktuella planen +prg#:#prg_update_from_current_plan_not_possible#:#Uppdatering från den nuvarande planen är inte möjlig. +prg#:#prg_update_from_current_plan_partitial_success#:#Uppdatering från nuvarande plan delvis slutförd. +prg#:#prg_update_from_current_plan_success#:#Uppdatering från nuvarande plan är framgångsrik. +prg#:#prg_update_from_plan_successful#:#Uppdateringen från den nuvarande planen lyckades. +prg#:#prg_update_progress_description#:#Sätter status från "pågår" till "misslyckad" när slutet av bearbetningsperioden har nåtts. +prg#:#prg_update_progress_title#:#Tidsbegränsade behandlingsperioder för studieprogram +prg#:#prg_update_successful#:#Ändringar framgångsrikt sparade! +prg#:#prg_user_not_restarted_desc#:#Skickar ett varningsmejl till användare när en kvalifikation på ett studieprogram löper ut och de ännu inte har startat om programmet. +prg#:#prg_user_not_restarted_time_input#:#Dagar före utgång +prg#:#prg_user_not_restarted_time_input_info#:#Dagar före utgången av kvalifikationens giltighetstid +prg#:#prg_user_not_restarted_title#:#Skicka Warningmail om kvalifikation som löper ut +prg#:#prg_user_risky_to_fail_desc#:#Sänder ett varningsmeddelande till användare om de riskerar att misslyckas med ett studieprogram på grund av att behandlingstiden har löpt ut. +prg#:#prg_user_risky_to_fail_title#:#Sänd varningsmeddelande om eventuellt fel +prg#:#prg_validity#:#Kvalificering av validitet +prg#:#prg_validity_of_qualification#:#Giltigheten av en uppnådd kvalifikation +prg#:#prg_validity_of_qualification_limit#:#Giltighetens utgång +prg#:#prg_validity_of_qualification_restart#:#Återupptagande +prg#:#prg_view#:#Display +prg#:#prgr_may_not_create_circular_reference#:#Att länka detta program hit är inte möjligt eftersom det program som det innehåller är skyddat. +prg#:#re_assigned_mail_body#:#%s %s,

Du har blivit omplacerad till studieprogrammet '%s' som deltagare. +prg#:#re_assigned_mail_subject#:#Förnya deltagandet i studieprogrammet +prg#:#restart_information#:#Återupptagande (i dagar) före utgången av kvalifikationen +prg#:#restart_period#:#Automatisk återinsättning innan kvalifikationen löpt ut +prg#:#restart_period_desc#:#Återupptagande (i dagar) före utgången av kvalifikationen +prg#:#restart_period_info#:#Automatiskt återupptagande innan kvalifikationen löper ut i dagar +prg#:#restart_period_label#:#Dagar före kvalifikationens slut +prg#:#risky_to_fail_mail_body#:#%s %s,

tidsfristen för att slutföra studieprogrammet '%s' kommer snart att uppnås. +prg#:#risky_to_fail_mail_subject#:#Påminnelse om att tidsfristen för studieprogrammet snart kommer att löpa ut. +prg#:#rol#:#Roll +prg#:#select_crs#:#Sök efter kurser +prg#:#select_grp#:#Sökning efter grupper +prg#:#select_org#:#Sökning efter organisatorisk enhet +prg#:#select_role#:#Sökning efter roller +prg#:#send_info_to_re_assign_mail#:#E-post före utgången av giltighetstiden +prg#:#send_info_to_re_assign_mail_info#:#Sänd ett e-postmeddelande när nuvarande kvalifikation blir ogiltig +prg#:#send_re_assigned_mail#:#E-post för automat. Återupptagande +prg#:#send_re_assigned_mail_info#:#Skicka ett e-postmeddelande när du omplaceras till studieprogrammet. +prg#:#send_risky_to_fail_mail#:#E-post med risk för icke-kvalificering +prg#:#send_risky_to_fail_mail_info#:#Skicka ett e-postmeddelande om kvalifikationen ännu inte har uppnåtts och bearbetningsperioden avslutas +prg#:#sp_certificate_completion_date#:#Datum för stängning +prg#:#sp_certificate_description#:#Beskrivning av programmet +prg#:#sp_certificate_points#:#Antal intjänade poäng +prg#:#sp_certificate_progress_expires_at#:#Utgångsdatum för kvalifikationen +prg#:#sp_certificate_title#:#Titel på programmet +prg#:#sp_certificate_type#:#Typ av program +prg#:#status_changed#:#Status uppdaterad +prg#:#status_changed_due_to_deadline#:#Status justerades på grund av bearbetningsperioden. +prg#:#status_transition_not_allowed#:#Ny status ej tillämplig +prg#:#status_unchanged#:#Status oförändrad +prg#:#update_deadline#:#Datumet har uppdaterats. +prg#:#update_expire_date#:#Procedure Qualification har uppdaterats framgångsrikt. +prg#:#updated_from_settings#:#Uppdaterad från inställningar +prg#:#usr_active#:#Användare +prg#:#validity_qualification_date#:#Upphörande av kvalifikationen på ett viktigt datum +prg#:#validity_qualification_date_desc#:#Datum då kvalifikationen upphör att gälla +prg#:#validity_qualification_period#:#Process för kvalificering - individuell +prg#:#validity_qualification_period_desc#:#Kvalifikationen är giltig under en period (i dagar) efter framgångsrikt deltagande +prg#:#validity_updated#:#Validering uppdaterad +prg#:#vq_date#:#Utgångsdatum +prg#:#vq_date_info#:#Upphörande av kvalifikationen på ett viktigt datum +prg#:#vq_date_label#:#Utgångsdatum +prg#:#vq_information#:#Giltigheten av en uppnådd kvalifikation +prg#:#vq_period_info#:#Kvalificeringen är endast giltig under ett begränsat antal dagar +prg#:#vq_period_label#:#Dagar efter framgångsrikt deltagande +prg#:#warning#:#Varning! +prg#:#will_not_modify_deadline_on_successful_progress#:#ingen förändring, eftersom redan avslutad eller ackrediterad +prg#:#will_not_modify_irrelevant_progress#:#ingen förändring, eftersom irrelevant +prg#:#will_not_modify_relevant_progress#:#redan relevant +prg#:#will_not_modify_validity_on_non_successful_progress#:#Giltigheten kan endast ändras om den har slutförts eller ackrediterats +prg#:#will_not_set_top_progress_to_irrelevant#:#Superior tilldelning kan inte vara irrelevant. +prtf#:#pdf_export#:#PDF-export +prtf#:#prtf_add_assignment#:#Lägg till uppdrag +prtf#:#prtf_add_blog#:#Lägg till blogg +prtf#:#prtf_add_existing_blog#:#Använd befintlig blogg +prtf#:#prtf_add_new_blog#:#Lägg till ny blogg +prtf#:#prtf_add_new_blog_info#:#Den nya bloggen kommer att läggas till i dina personliga resurser. +prtf#:#prtf_add_page#:#Lägg till sida +prtf#:#prtf_add_portfolio#:#Lägg till portfölj +prtf#:#prtf_all_pages#:#Övergripande portfölj +prtf#:#prtf_allow_html#:#Tillåt HTML/Javascript +prtf#:#prtf_allow_html_info#:#Användare kan använda HTML eller Javascript på dina portfoliosidor. Detta kan leda till säkerhetsproblem. +prtf#:#prtf_allow_my_courses#:#Page element "Mina kurser +prtf#:#prtf_allow_my_courses_info#:#Tillåter att en lista över nuvarande kursmedlemskap inkluderas i en portfolio. +prtf#:#prtf_author#:#Created by###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +prtf#:#prtf_back_to_portfolio_owner#:#Redigera portfölj +prtf#:#prtf_banner#:#Banner +prtf#:#prtf_blog_page_created#:#Blog lades till. +prtf#:#prtf_copy_blog_pg#:#Kopiera bloggsida +prtf#:#prtf_copy_page#:#Kopia Portfoliosida(r) +prtf#:#prtf_copy_pg#:#Kopiera sida +prtf#:#prtf_copy_tab#:#Kopiera fliken +prtf#:#prtf_create_portfolio#:#Lägg till portfölj +prtf#:#prtf_create_template_from_portfolio#:#Portfölj +prtf#:#prtf_create_template_from_portfolio_info#:#Välj en portfölj för att tillämpa dess innehåll och inställningar på mallen. +prtf#:#prtf_creation_mode#:#Ny portfölj +prtf#:#prtf_creation_mode_scratch#:#Skapa utan portföljmall +prtf#:#prtf_creation_mode_template#:#Skapa från en portföljmall +prtf#:#prtf_date_of_print#:#Datum för utskriften +prtf#:#prtf_decl_authorship#:#Självständighetsförklaring +prtf#:#prtf_default_portfolio#:#Min profil +prtf#:#prtf_delete_assignment#:#Radera uppdrag +prtf#:#prtf_delete_assignment_sure#:#Vill du verkligen ta bort följande uppgift(er)? +prtf#:#prtf_download_submission#:#Ladda ner kopia av avgiften +prtf#:#prtf_edit_content#:#Redigera innehåll +prtf#:#prtf_edit_data#:#Fyll i fält +prtf#:#prtf_edit_embedded_blog#:#Redigera Blogg "%s +prtf#:#prtf_edit_portfolio#:#Redigera portfölj +prtf#:#prtf_exercise_info#:#Denna portfölj är tilldelad övningsenheten "%s" i övningen "%s". +prtf#:#prtf_exercise_submitted_info#:#Du skickade in din portfölj den %s. Om du vill kan du spara en kopia för din personliga arkivering. +prtf#:#prtf_existing_portfolio#:#Befintlig portfölj +prtf#:#prtf_finalize_portfolio#:#Färdigställa och lämna in portfölj +prtf#:#prtf_finalized#:#Portföljen lämnades in. +prtf#:#prtf_first_page_title#:#Startar med +prtf#:#prtf_has_been_set_online#:#Portföljen har lagts online. +prtf#:#prtf_link#:#Länk +prtf#:#prtf_manage_portfolios#:#Hantera portföljer +prtf#:#prtf_new_portfolio#:#Ny portfölj +prtf#:#prtf_no_blogs_info#:#Om du skapar en blogg i %s-sektionen kan du också använda den som en del av din portfölj. +prtf#:#prtf_no_offline_share_info#:#Portföljen måste först läggas online innan den kan släppas för vissa användare. +prtf#:#prtf_no_submission#:#Ingen avgift +prtf#:#prtf_page_created#:#Sida har lagts till +prtf#:#prtf_page_element_my_courses_info#:#Det här är en lista över alla kurser som jag är medlem i och som för närvarande är online. +prtf#:#prtf_page_element_my_courses_title#:#Kursmedlemskap +prtf#:#prtf_page_element_teaser_blog_template#:#Inside the portfolio, en blogg från dina personliga resurser visas på denna punkt. +prtf#:#prtf_page_element_teaser_consultation_hours#:#Inuti portföljen visas en kalender över dina kontorstider vid denna tidpunkt. +prtf#:#prtf_page_element_teaser_my_courses#:#I portfolion visas en lista över dina kurser vid denna punkt. +prtf#:#prtf_page_element_teaser_settings#:#Inställningar +prtf#:#prtf_page_element_teaser_skills#:#I portföljen visas din kompetensnivå vid denna punkt. +prtf#:#prtf_page_type_prtf#:#Portföljsida +prtf#:#prtf_page_type_prtt#:#Portfolio mall sida +prtf#:#prtf_pages_copied#:#Sidorna har kopierats. +prtf#:#prtf_pdf#:#Exportera som PDF +prtf#:#prtf_portfolio_created#:#Portfolio har lagts till +prtf#:#prtf_portfolio_created_from_template#:#Detta är en förhandsvisning av din nya portfölj. För att lägga till nya sidor och innehåll, klicka på "Redigera" högst upp i denna vy. +prtf#:#prtf_portfolio_deleted#:#Portföljen raderades +prtf#:#prtf_portfolio_page_deleted#:#Sidan Portfolio eller blogg har tagits bort. +prtf#:#prtf_portfolios#:#Portföljer +prtf#:#prtf_preview_banner#:#Personlig banner +prtf#:#prtf_preview_banner_height#:#Bannerns höjd +prtf#:#prtf_preview_banner_info#:#Förvald storlek är 1370x100 pixlar. +prtf#:#prtf_preview_banner_width#:#Banner bredd +prtf#:#prtf_print_options#:#Välj till PDF +prtf#:#prtf_print_selection#:#Urval +prtf#:#prtf_profile_picture#:#Visa profilbild +prtf#:#prtf_properties#:#Portföljens egenskaper +prtf#:#prtf_public_comments#:#Offentliga kommentarer +prtf#:#prtf_role_assignment#:#Rolltilldelning +prtf#:#prtf_role_title#:#Roll +prtf#:#prtf_save_status_and_titles#:#Spara status och titel +prtf#:#prtf_sec_protected_info#:#Skyddade block kan inte redigeras i portföljen. +prtf#:#prtf_selected_pages#:#Utvalda delar av portföljen +prtf#:#prtf_set_as_default#:#Sätt som min profil +prtf#:#prtf_set_default_publish_confirmation#:#Portföljen måste åtminstone vara tillgänglig för alla registrerade användare. Ska den också vara synlig för hela internet utan registrering? +prtf#:#prtf_set_default_publish_global#:#Dela även för oregistrerade användare +prtf#:#prtf_set_default_publish_registered#:#Dela endast för registrerade användare +prtf#:#prtf_set_offline#:#Ställ in Offline +prtf#:#prtf_set_online#:#Ställ in online +prtf#:#prtf_settings#:#Administration av portföljer +prtf#:#prtf_shared_offline_info#:#En portfölj måste vara online för att vara tillgänglig för delade användare. +prtf#:#prtf_signature#:#Fält för signatur +prtf#:#prtf_signature_date#:#Datum, underskrift +prtf#:#prtf_signature_info#:#PDF-filen innehåller ett fält där användarna kan skriva under. +prtf#:#prtf_style#:#portfolio stil +prtf#:#prtf_submission_on#:#Leverans på $1 +prtf#:#prtf_sure_delete_portfolio_pages#:#Vill du verkligen ta bort följande portfölj eller bloggsida? +prtf#:#prtf_sure_delete_portfolios#:#Vill du verkligen ta bort följande portfölj? +prtf#:#prtf_tab_other_users#:#Portföljer från andra användare +prtf#:#prtf_tab_portfolios#:#Mina portföljer +prtf#:#prtf_template_editor_placeholder_info#:#Den här platshållaren ersätts i portföljen. +prtf#:#prtf_template_import_blog_create#:#Skapa en ny blogg +prtf#:#prtf_template_import_blog_ignore#:#Ta bort bloggsida +prtf#:#prtf_template_import_blog_reuse#:#Använd befintlig blogg +prtf#:#prtf_template_import_new_skills#:#När de aktiveras läggs dessa kompetenser till dina personliga kompetenser. +prtf#:#prtf_template_title#:#Mall för portfölj +prtf#:#prtf_unset_as_default#:#Använd inte som Min profil +prtf#:#prtf_unset_default_share_info#:#Ändringarna har sparats. Vänligen kontrollera de aktuella utgåvorna för portföljen. +prtf#:#prtf_use_page_layout#:#Använd sidlayout +prtf#:#prtt_title_info#:#Observera att denna titel också används för de portföljer som skapas från mallen. +prtt#:#prtt_activation_limited_visibility_info#:#Om portföljmallen är aktiv visas den även utanför åtkomsttiderna. +prtt#:#prtt_activation_online_info#:#Markera denna inställning för att göra portföljmallen tillgänglig för användare. +prtt#:#prtt_add#:#Skapa mall för portfölj +prtt#:#prtt_copy#:#Mall för portfölj med kopior +prtt#:#prtt_edit#:#Redigera portföljmall +prtt#:#prtt_import#:#Import portföljmall +prtt#:#prtt_new#:#Skapa en ny portföljmall +prtt#:#prtt_pfpg#:#Portföljsida +prtt#:#prtt_portfolio_created#:#Portfoliomall har lagts till +prtt#:#prtt_properties#:#Egenskaper för portfoliomall +prtt#:#prtt_select_datasets#:#Välj formulär +prtt#:#prtt_style#:#Stil för mall för portfölj +ps#:#cdf_edited_by_self#:#av användaren +ps#:#crs_ps_cdf_info#:#Lägg till mer information om denna kurs och fyll i följande fält. +ps#:#crs_ps_required_info#:#Ytterligare information krävs för deltagande i denna kurs. +ps#:#grp_ps_cdf_info#:#Var god lägg till ytterligare information för denna grupp och fyll i följande fält +ps#:#grp_ps_required_info#:#Fler information behövs för deltagande i denna grupp. +ps#:#ps_agreement_accepted#:#Användaravtal accepterat +ps#:#ps_auto_https#:#Automatisk HTTPS-detektering +ps#:#ps_auto_https_description#:#Om den är aktiverad försöker ILIAS fastställa HTTPS-statusen för en begäran via headeranalys. +ps#:#ps_auto_https_header_name#:#Huvudets namn +ps#:#ps_auto_https_header_value#:#Header värde +ps#:#ps_btn_add_value#:#Nytt värde +ps#:#ps_cdf_add_field#:#Skapa nytt datafält +ps#:#ps_cdf_added_field#:#Ett nytt datafält har skapats. +ps#:#ps_cdf_data_fields#:#Tillgängliga datafält +ps#:#ps_cdf_delete_sure#:#Är du säker på att du vill ta bort detta datafält? +ps#:#ps_cdf_deleted#:#Datafälten har raderats. +ps#:#ps_cdf_deleted_field#:#Värdet har tagits bort. +ps#:#ps_cdf_edit_field#:#Redigera datafält +ps#:#ps_cdf_name#:#Namn +ps#:#ps_cdf_no_fields#:#Den här kursen innehåller inga datafält +ps#:#ps_cdf_no_name_given#:#Var god ange ett namn. +ps#:#ps_cdf_required#:#Obligatoriskt fält +ps#:#ps_cdf_select_one#:#Vänligen gör ett urval. +ps#:#ps_cdf_type#:#Typ +ps#:#ps_cdf_value#:#Värde +ps#:#ps_cdf_warning_modify#:#Attention +ps#:#ps_crs_user_fields#:#Personliga detaljer om denna kurs +ps#:#ps_error_message_https_header_missing#:#Den automatiska HTTPS-avkänningen kräver ett rubriknamn och ett rubrikvärde. +ps#:#ps_error_message_invalid_login_max_attempts#:#Maximalt antal inloggningsförsök får inte vara mindre än 0. +ps#:#ps_error_message_invalid_password_max_age#:# Högsta lösenordsålder får inte vara lägre än 0. +ps#:#ps_error_message_invalid_password_max_length#:#Maximal lösenordslängd får inte vara mindre än 0. +ps#:#ps_error_message_invalid_password_min_length#:#Minsta lösenordslängd får inte vara mindre än 0. +ps#:#ps_error_message_password_max_less_min#:#Maximal lösenordslängd får inte vara mindre än den minimala lösenordslängden. +ps#:#ps_error_message_password_min1_because_chars#:#Minsta lösenordslängd får inte vara mindre än %s. +ps#:#ps_error_message_password_min2_because_chars_numbers#:#Minsta lösenordslängd får inte vara mindre än %s om lösenordet ska innehålla bokstäver och siffror. +ps#:#ps_error_message_password_min3_because_chars_numbers_sc#:#Minsta lösenordslängd får inte vara mindre än %s om lösenordet ska innehålla bokstäver, siffror och specialtecken. +ps#:#ps_export_admin#:#Administratörer +ps#:#ps_export_confirm#:#Consent för nya medlemmar att se sina personliga profildata när de går med i en kurs. +ps#:#ps_export_confirm_group#:#Samtycke för nya medlemmar som går med i gruppen att tillåta gruppledningen att se deras personliga profildata. +ps#:#ps_export_course#:#Tillåt export av personuppgifter från kurser +ps#:#ps_export_data#:#Personliga profiluppgifter +ps#:#ps_export_excel#:#Starta Excel-export +ps#:#ps_export_files#:#Exportera filer +ps#:#ps_export_groups#:#Tillåt export av personuppgifter från grupper +ps#:#ps_export_member#:#Deltagare +ps#:#ps_export_settings#:#Inställningar för export +ps#:#ps_export_sub#:#Användare som ännu inte aktiverats +ps#:#ps_export_tutor#:#Tutorer +ps#:#ps_export_user_data#:#Användardata +ps#:#ps_export_wait#:#Användare på väntelistan +ps#:#ps_field_type#:#Typ av datafält +ps#:#ps_files_deleted#:#Exportfilerna har raderats. +ps#:#ps_grp_user_fields#:#Personliga uppgifter om denna grupp +ps#:#ps_login_max_attempts#:#Maximalt antal inloggningsförsök +ps#:#ps_login_max_attempts_info#:# Bestämmer det maximala antalet inloggningsförsök som en användare får misslyckas med. Om fler inloggningsförsök misslyckas, sätts användaren till "inaktiv" och måste återaktiveras i "Användarhantering" innan han kan använda plattformen. Om inget värde a +ps#:#ps_not_accepted#:#Not agreed +ps#:#ps_participants_list_courses#:#Tillåt aktivering av deltagarlistor i kursens medlemsgalleri +ps#:#ps_passwd_policy_change_force_user_reset_succ#:#Åtgärden genomfördes framgångsrikt. +ps#:#ps_passwd_policy_changed_force_user_reset#:#Ändringarna har tillämpats framgångsrikt. Du har gjort minst en ändring i lösenordspolicyn. Vill du att lokala inloggningskonton ska behöva ange ett nytt lösenord efter nästa lyckade inloggning? +ps#:#ps_password_change_on_first_login_enabled#:#Ändra lösenord vid första inloggningen +ps#:#ps_password_change_on_first_login_enabled_info#:#Tvingar användare som inte har registrerat sig att ändra sitt lösenord första gången de loggar in i ILIAS. +ps#:#ps_password_chars_and_numbers_enabled#:#Tvinga fram bokstäver och siffror +ps#:#ps_password_chars_and_numbers_enabled_info#:#När detta är aktiverat måste lösenord innehålla bokstäver och siffror. +ps#:#ps_password_max_age#:#Högsta ålder för lösenord +ps#:#ps_password_max_age_info#:#Ställer in maxåldern för lösenord i dagar. Om värdet är 0 upphör inte lösenord att gälla. +ps#:#ps_password_max_length#:#Maximal längd på lösenordet +ps#:#ps_password_max_length_info#:#Ställer in maximal längd för lösenord. Om värdet är 0 kan lösenorden ha valfri längd. +ps#:#ps_password_min_length#:#Minsta längd på lösenordet +ps#:#ps_password_min_length_info#:#Ställer in minsta längd för lösenord. Om värdet sätts till 0 måste lösenorden fortfarande innehålla minst 1 tecken. +ps#:#ps_password_settings#:#Lösenordsinställningar +ps#:#ps_password_special_chars_enabled#:#Tvinga fram specialtecken +ps#:#ps_password_special_chars_enabled_info#:#Om aktiverat måste lösenord innehålla specialtecken. +ps#:#ps_perform_export#:#Starta CSV export +ps#:#ps_prevent_simultaneous_logins#:#Förhindra samtidiga inloggningar +ps#:#ps_prevent_simultaneous_logins_info#:#Om detta är aktiverat förhindras samtidiga inloggningar med samma ILIAS-konto via olika datorer. +ps#:#ps_privacy_protection#:#Privatlivsinställningar +ps#:#ps_profile_export#:#Skydd av personliga profiluppgifter +ps#:#ps_security_protection#:#Säkerhetsinställningar +ps#:#ps_select_one#:#Välj en fil. +ps#:#ps_show_crs_access#:#Anvisning av den senaste åtkomsttiden för kursdeltagare +ps#:#ps_show_grp_access#:#Display av den senaste åtkomsttiden för gruppdeltagare +ps#:#ps_show_lso_access#:#Display av den senaste åtkomsttiden för deltagarna i inlärningssekvensen +ps#:#ps_size#:#Filens storlek +ps#:#ps_type_select#:#Välj lista +ps#:#ps_type_select_long#:#Urvalslista (fasta värden) +ps#:#ps_type_text#:#Textfält +ps#:#ps_type_txt_long#:#Textfält (valfria värden) +ps#:#ps_user_selection#:#Användarval +ps#:#ps_warning_modify#:#Attention +ps#:#rbac_log#:#Rättighetsinställningslogg +ps#:#rbac_log_age#:#Behåll Log-poster +ps#:#rbac_log_age_info#:#Maximal ålder för loggposter i månader +ps#:#rbac_log_info#:#Aktivera loggning av alla ändringar av rättighetsinställningar +ps#:#show_privacy#:#Skydd av personuppgifter +ps#:#show_security#:#Säkerhet +pwassist#:#password_assistance#:#Stöd för lösenord +pwassist#:#pwassist_disabled_no_access#:#Stöd för lösenord är inte aktiverat. Kontakta en systemadministratör för ytterligare support +pwassist#:#pwassist_enter_email#:#Ange din e-postadress här. ILIAS kommer att skicka en lista över alla relaterade inloggningsnamn till denna adress och informera dig om lösenordssupport. Om du inte får något e-postmeddelande, meddela din kursadministratör eller skicka ett e-postmeddelan +pwassist#:#pwassist_enter_username_and_email#:#Ange ett inloggningsnamn och motsvarande e-postadress. ILIAS kommer att skicka instruktioner för att ange ett nytt lösenord till denna adress. Om du inte får något e-postmeddelande, meddela din kursadministratör eller skicka ett e-postmeddelande till %1$ +pwassist#:#pwassist_enter_username_and_new_password#:#Ange inloggningsnamn och tilldela ett nytt lösenord.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +pwassist#:#pwassist_login_not_match#:#Det inloggningsnamn du angav stämmer inte överens med det inloggningsnamn som du begärde lösenordssupport för. Vänligen ange rätt inloggningsnamn.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +pwassist#:#pwassist_mail_body#:#Ange ett nytt lösenord för ditt inloggningskonto %1$s

Detta meddelande genererades automatiskt av ILIAS-installationen +pwassist#:#pwassist_mail_sent#:#ILIAS har skickat ett e-postmeddelande till adressen %1$s, om det finns ett ILIAS-konto med det angivna inloggningsnamnet och e-postadressen. Ytterligare instruktioner finns i detta e-postmeddelande. +pwassist#:#pwassist_mail_sent_generic#:#ILIAS har skickat ett e-postmeddelande till den deponerade adressen. Du hittar ytterligare instruktioner i detta mail. +pwassist#:#pwassist_mail_subject#:#ILIAS lösenord stöd +pwassist#:#pwassist_password_assigned#:#Lösenordet för inloggningsnamnet %1$s sparades framgångsrikt. +pwassist#:#pwassist_session_expired#:#Vänligen fyll i formuläret igen. Tiden för att utföra lösenordssupport har löpt ut. Det kan bero på att du har försökt använda den adress som skickades till dig mer än en gång, eller att det har gått för lång tid sedan adressen skickades till dig. +pwassist#:#pwassist_username_mail_body#:#Detta är de aktiva inloggningsnamn som tilldelats denna e-postadress i ILIAS. +pwassist#:#unassist_disabled_no_access#:#Stöd för inloggningsnamn är inte aktiverat. Kontakta en systemadministratör för ytterligare support +pwsp#:#pwsp_enable_personal_resources#:#Aktivera personliga resurser +pwsp#:#pwsp_enable_wsp_blogs#:#Aktivera bloggar +pwsp#:#pwsp_enable_wsp_files#:# Aktivera filer +pwsp#:#pwsp_enable_wsp_links#:# Aktivera länkar +qpl#:#qpl_page_type_qfbg#:#Allmän feedback +qpl#:#qpl_page_type_qfbs#:#Särskild feedback +qpl#:#qpl_page_type_qht#:#Note +qpl#:#qpl_page_type_qpl#:#Frågesida +rating#:#rat_not_rated_yet#:#Not yet rated +rating#:#rat_nr_ratings#:#%s betyg +rating#:#rat_one_rating#:#En bedömning +rating#:#rating_activate_rating#:# Aktivera betyg +rating#:#rating_activate_rating_info#:#Om aktiverat kan användare betygsätta detta objekt. +rating#:#rating_add_category#:#Lägg till kategori +rating#:#rating_avg_rating#:#Genomsnittlig rating +rating#:#rating_categories#:#Klassificeringskategorier +rating#:#rating_category_add#:#Add +rating#:#rating_category_create#:#Skapa kategori +rating#:#rating_category_created#:#Kategori tillagd. +rating#:#rating_category_delete_sure#:#Vill du verkligen radera följande kategorier? Alla betyg för denna kategori kommer att raderas. +rating#:#rating_category_deleted#:#Kategori borttagen. +rating#:#rating_category_edit#:#Redigera kategori +rating#:#rating_category_update#:#Spara +rating#:#rating_category_updated#:#Kategori sparad. +rating#:#rating_export_category#:#Kategori +rating#:#rating_export_date#:#Datum +rating#:#rating_export_rating#:#Rating +rating#:#rating_new_objects_auto#:#Värdering för nya objekt +rating#:#rating_new_objects_auto_info#:#Betygsfunktionen aktiveras automatiskt i nyskapade filer, lärmoduler och wikis. +rating#:#rating_number_votes#:#%s betyg +rating#:#rating_open_dialog#:#Utveckla klassificeringsskalan +rating#:#rating_overlay_submit#:#Rating +rating#:#rating_personal_rating#:#Ditt betyg +rating#:#rating_rate_x_of_5#:#Rata med % av 5 stjärnor +rating#:#rating_remove#:#Ta bort betyg +rating#:#rating_update_positions#:#Spara sekvens +rating#:#rating_your_rating#:#Ditt betyg +rbac#:#accs_edit_permission#:#Ändra rättighetsinställningar för tillgänglighetsinställningar +rbac#:#accs_read#:#Settings Tillgänglighet i Administration kan läsas +rbac#:#accs_visible#:#Accessibility-inställningar i Administration är synliga +rbac#:#accs_write#:#Settings Tillgänglighet i Administration kan redigeras +rbac#:#activate_wiki_protection#:# Aktivera skrivskydd +rbac#:#active_preconditions#:#Definierade förutsättningar +rbac#:#add_consultation_hours#:#Skapa möten för konsultation +rbac#:#add_consume_provider#:#Lägg till dina egna inställningar för LTI-leverantörer +rbac#:#add_reply#:#Skapa svar +rbac#:#add_thread#:#Skapa ämne +rbac#:#adm_edit_permission#:#Ändra rättighetsinställningar för de allmänna inställningarna för administrationen +rbac#:#adm_read#:#Generella inställningar för administrationen kan läsas +rbac#:#adm_visible#:#Generella inställningar är synliga +rbac#:#adm_write#:#Generella inställningar i Administration kan redigeras +rbac#:#adn_edit_permission#:#Ändra rättighetsinställningar för administration av meddelanden +rbac#:#adn_read#:#Läs tillgång till administration för tillkännagivanden +rbac#:#adn_visible#:#Administrationen för tillkännagivanden är synlig. +rbac#:#adn_write#:#Skapa och hantera tillkännagivanden +rbac#:#adopt_perm_from_template#:#Inställningar för kopieringsrätt +rbac#:#adve_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#adve_read#:#Åtkomst till redigeringsinställningarna +rbac#:#adve_visible#:#Redaktörens inställningar är synliga +rbac#:#adve_write#:#Redigera inställningar för redigeraren +rbac#:#amend_grading#:#Ändra slutgiltigt betyg +rbac#:#assf_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#assf_read#:#Tillgång till testet och administration av bedömningen +rbac#:#assf_visible#:#Test- och utvärderingsadministration är synlig +rbac#:#assf_write#:#Bearbetning av testet och administration av bedömningen +rbac#:#auth_edit_permission#:#Ändra rättighetsinställningar för administrationen +rbac#:#auth_read#:#Läsa åtkomst till administration för autentisering / ny inloggning +rbac#:#auth_visible#:#Administration för autentisering / ny inloggning är synlig +rbac#:#auth_write#:#Redigera inställningar för autentisering / ny inloggning +rbac#:#awra_edit_permission#:#Ändra rättighetsinställningar för hantering av visningen "Vem är online?" +rbac#:#awra_read#:#Läs tillgång till hantering av "Vem är online?"-displayen +rbac#:#awra_visible#:#Hanteringen av "Vem är online?"-displayen är synlig +rbac#:#awra_write#:#Write access till hantering av displayen "Vem är online?" +rbac#:#bdga_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#bdga_read#:#Läs Badgehantering +rbac#:#bdga_visible#:#Badge-hanteringen är synlig +rbac#:#bdga_write#:#Redigera hantering av badges +rbac#:#bibl_copy#:#Kopiera litteraturlista +rbac#:#bibl_delete#:#Radera litteraturlista +rbac#:#bibl_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#bibl_read#:#Läs litteraturlistan +rbac#:#bibl_visible#:#Litteraturlistan är synlig +rbac#:#bibl_write#:#Redigera litteraturlistan +rbac#:#bibs_copy#:#Kopiera litteraturlistor +rbac#:#bibs_delete#:#Ta bort post från biblioteket +rbac#:#bibs_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#bibs_read#:#Läs Litteratur Lista Administration +rbac#:#bibs_visible#:#Litteraturlistans administration är synlig +rbac#:#bibs_write#:#Redigera inställningar och bibliotek +rbac#:#blga_edit_permission#:#Ändra rättighetsinställningar i Administration +rbac#:#blga_read#:#Läs tillgång till bloggadministration +rbac#:#blga_visible#:#Bloggadministration är synlig +rbac#:#blga_write#:#Redigera inställningar i bloggadministrationen +rbac#:#blog_contribute#:#User kan lägga till bidrag +rbac#:#blog_copy#:#Copy blogg +rbac#:#blog_delete#:#Radera blogg +rbac#:#blog_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#blog_read#:#Läs blogg +rbac#:#blog_redact#:#Användaren kan också redigera bidrag från andra bidragsgivare +rbac#:#blog_visible#:#Bloggen är synlig +rbac#:#blog_write#:#Redigera blogg +rbac#:#book_copy#:#Kopiera bokningspool +rbac#:#book_delete#:#Radera eller flytta bokningspool +rbac#:#book_edit_permission#:#Ändra rättighetsinställningar för bokning av pool +rbac#:#book_read#:#Genomföra bokningar i bokningspoolen +rbac#:#book_visible#:#Bokningspoolen är synlig +rbac#:#book_write#:#Skapa bokningsobjekt och redigera inställningar för bokningspoolen +rbac#:#cadm_edit_permission#:#Ändra administrationens rättighetsinställningar för användarkontakter +rbac#:#cadm_read#:#Läs administration för användarkontakter +rbac#:#cadm_visible#:#Administration för användarkontakter är synlig +rbac#:#cadm_write#:#Redigera administration för användarkontakter +rbac#:#cals_add_consultation_hours#:#Användaren kan skapa och redigera konsultationstider i kalendern +rbac#:#cals_edit_event#:#Skapa och hantera offentliga kalendrar och möten i ILIAS +rbac#:#cals_edit_permission#:#Ändra administrationens inställning av rättigheter +rbac#:#cals_read#:#Läsa åtkomst till inställningar för kalenderadministration +rbac#:#cals_visible#:#Kalenderadministration är synlig +rbac#:#cals_write#:#Redigera inställningar för kalenderadministration +rbac#:#cat_administrate_users#:#Hantera lokala inloggningskonton +rbac#:#cat_cat_administrate_users#:#Lokala inloggningskonton kan skapas och hanteras +rbac#:#cat_copy#:#Kopieringskategori +rbac#:#cat_delete#:#Ta bort eller flytta kategori +rbac#:#cat_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#cat_read#:#Sidans innehåll i kategorin kan läsas +rbac#:#cat_read_users#:#Lokala inloggningskonton i denna kategori kan visas +rbac#:#cat_visible#:#Kategorin är synlig +rbac#:#cat_write#:#Redigera inställningar för kategorier och hantera innehåll +rbac#:#catr_copy#:#Kopiera länkar till kategorier +rbac#:#catr_delete#:#Flytta eller ta bort kategorilänkar +rbac#:#catr_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#catr_visible#:#Kategorilänkar är synliga och kan användas +rbac#:#catr_write#:#Redigera inställningar för kategorilänk +rbac#:#cert_edit_permission#:#Ändra rättighetsinställningar i Administration +rbac#:#cert_read#:#Läsbehörighet till certifikatadministrationen +rbac#:#cert_visible#:#Certifikathanteringen är synlig +rbac#:#cert_write#:#Redigera inställningar för certifikathantering +rbac#:#change_existing_object_type_desc#:#Om aktiverat, ändras även rättigheterna för redan existerande objekt av denna typ. I annat fall gäller ändringen av rättigheter endast för objekt som skapas i framtiden. +rbac#:#change_existing_objects#:#Ändra befintliga objekt +rbac#:#change_existing_objects_desc#:#Om den är aktiverad överförs de ändrade rättighetsinställningarna för denna roll också till alla befintliga objekt. För att endast justera rättigheterna för enskilda objekttyper, klicka på respektive kryssruta på höger sida. +rbac#:#change_existing_prefix#:#Redan tillgänglig +rbac#:#change_existing_prefix_single#:# +rbac#:#change_existing_suffix#:#förändring +rbac#:#change_existing_suffix_single#:#Anpassa +rbac#:#change_presentation#:#Ändra presentation +rbac#:#chtr_delete#:#Radera eller flytta Chat +rbac#:#chtr_edit_permission#:#Ändra rättighetsinställningar för chattrum +rbac#:#chtr_moderate#:#Moderat diskussion i chattrum +rbac#:#chtr_read#:#Delta i diskussionen i chattrummet +rbac#:#chtr_visible#:#Chatroom är synligt +rbac#:#chtr_write#:#Redigera inställningar för chattrum och blockera användare +rbac#:#cmis_edit_permissions#:#Ändra inställningar för administrationsrättigheter för xAPI/cmi5 +rbac#:#cmis_read#:#Läs tillgång till administration för xAPI/cmi5 +rbac#:#cmis_visible#:#Administrationen för xAPI/cmi5 är synlig. +rbac#:#cmis_write#:#Ändra inställningar i Administration för xAPI/cmi5 +rbac#:#cmix_copy#:#Användaren kan kopiera xAPI/cmi5-objekt +rbac#:#cmix_delete#:#User kan flytta eller ta bort xAPI/cmi5-objekt +rbac#:#cmix_edit_learning_progress#:#Användaren kan redigera inställningarna för inlärningsframsteg +rbac#:#cmix_edit_permission#:#Användaren kan ändra behörighetsinställningar +rbac#:#cmix_read#:#Användaren kan se xAPI/cmi5-objekt +rbac#:#cmix_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#cmix_read_outcomes#:#Användaren kan se andra användares erfarenheter och ranking +rbac#:#cmix_visible#:#xAPI/cmi5 objektet är synligt +rbac#:#cmix_write#:#Användaren kan redigera inställningarna för xAPI/cmi5-objektet +rbac#:#cmps_edit_permission#:#Ändra inställning till rättigheter +rbac#:#cmps_read#:#Läsa åtkomst till administration för plugins, moduler och tjänster +rbac#:#cmps_visible#:#Administration för plugins, moduler och tjänster är synlig +rbac#:#cmps_write#:#Redigera inställningar för plugins, moduler och tjänster +rbac#:#coms_edit_permissions#:#Ändra inställningar för administrationsrättigheter för kommentarer +rbac#:#coms_read#:#Läs tillgång till administration för kommentarer +rbac#:#coms_visible#:#Administrationen för kommentarer är synlig. +rbac#:#coms_write#:#Ändra inställningar i administrationen för kommentarer +rbac#:#condition_failed#:#Misslyckad +rbac#:#condition_learning_progress#:# Enligt framsteg i inlärningen +rbac#:#contribute#:#Skapa inlägg +rbac#:#copa_copy#:#Kopiera innehållssida +rbac#:#copa_delete#:#Ta bort innehållssida +rbac#:#copa_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#copa_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#copa_read#:#Läs innehållssidan +rbac#:#copa_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#copa_visible#:#Innehållssidan är synlig +rbac#:#copa_write#:#Redigera innehållssida +rbac#:#cpad_edit_permissions#:#Ändra rättighetsinställningar för administrationen av innehållssidor +rbac#:#cpad_read#:#Läsa åtkomst till administration för innehållssidor +rbac#:#cpad_visible#:#Administration för innehållssidor är synlig. +rbac#:#cpad_write#:#Ändra inställningar i Administration för innehållssidor +rbac#:#crs_copy#:#Kopiera kurs +rbac#:#crs_delete#:#Radera eller flytta kurs +rbac#:#crs_edit_event#:#Redigera kalenderbokningar +rbac#:#crs_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#crs_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#crs_grade#:#Rate kursmedlemmar +rbac#:#crs_join#:#Delta i kursen +rbac#:#crs_leave#:#Avbryt medlemskap i kursen +rbac#:#crs_manage_members#:#Hantera medlemmar i en kurs +rbac#:#crs_news_add_news#:#Create news och redigera dina egna nyheter +rbac#:#crs_read#:#Läs kurs +rbac#:#crs_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#crs_visible#:#Kursen är synlig +rbac#:#crs_write#:#Redigera kurs +rbac#:#crsr_copy#:#Kopiera kurslänkar +rbac#:#crsr_delete#:#Flytta eller ta bort kurslänkar +rbac#:#crsr_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#crsr_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#crsr_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#crsr_visible#:#Kurslänkar är synliga och kan användas +rbac#:#crsr_write#:#Redigera inställningar för kurslänk +rbac#:#crss_edit_permission#:#Ändra rättighetsinställningar för kursadministration +rbac#:#crss_read#:#Läs tillgång till kursadministration +rbac#:#crss_visible#:#Kursadministrationen är synlig +rbac#:#crss_write#:#Redigera inställningar i Kursadministration +rbac#:#dcl_add_entry#:#Lägg till post +rbac#:#dcl_copy#:#Kopiering av datainsamling +rbac#:#dcl_delete#:#Ta bort datainsamling +rbac#:#dcl_edit_content#:#Redigera poster +rbac#:#dcl_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#dcl_read#:#Läs datainsamling +rbac#:#dcl_visible#:#Datainsamlingen är synlig +rbac#:#dcl_write#:#Redigera datainsamling +rbac#:#delete_files#:#Radera filer +rbac#:#delete_folders#:#Ta bort mapp +rbac#:#delete_wiki_pages#:#Ta bort sida +rbac#:#dshs_change_presentation#:#Ändra utseendet på instrumentpanelen +rbac#:#dshs_edit_permission#:#Ändra rättighetsinställningar i administrationen av instrumentpanelen +rbac#:#dshs_read#:#Läsa åtkomst till administration av instrumentpanelen +rbac#:#dshs_visible#:#Administrationen av instrumentpanelen är synlig +rbac#:#dshs_write#:#Redigera inställningar för instrumentpanelen +rbac#:#ecss_edit_permission#:#Ändra rättighetsinställningen för ECS-administrationen +rbac#:#ecss_read#:#Läsa åtkomst till inställningar för ECS-administrationen +rbac#:#ecss_visible#:#ECS-administrationen är synlig +rbac#:#ecss_write#:#Redigera inställningar för ECS-administration +rbac#:#edit_event#:#Redigera kalender +rbac#:#edit_in_online_editor#:#Redigera i online-redaktör +rbac#:#edit_learning_progress#:#Redigera inställningar för inlärningsframsteg +rbac#:#edit_members#:#Redigera deltagare +rbac#:#edit_permission#:#Ändra inställningar för rättigheter +rbac#:#edit_roleassignment#:#Redigera rolltilldelning +rbac#:#edit_submissions_grades#:#Redigera avgifter och betyg +rbac#:#edit_userassignment#:#Ändra användartilldelning +rbac#:#edit_wiki_navigation#:#Redigera navigering +rbac#:#exc_copy#:#Kopieringsövning +rbac#:#exc_delete#:#Radera eller flytta övning +rbac#:#exc_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#exc_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#exc_edit_submissions_grades#:#Användaren kan redigera inlämningar och betyg +rbac#:#exc_read#:#Delta i träning +rbac#:#exc_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#exc_visible#:#Träning är synligt +rbac#:#exc_write#:#Redigera träningsinställningar och uppgifter +rbac#:#excs_edit_permission#:#Ändra rättighetsinställningar för träningsadministration +rbac#:#excs_read#:#Läs åtkomst till träningsadministration +rbac#:#excs_visible#:#Övningsadministration är synlig +rbac#:#excs_write#:#Redigera inställningar i Exercise Administration +rbac#:#export_member_data#:#Export av medlemsdata +rbac#:#extt_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#extt_read#:#Läs åtkomst till administration av programvara från tredje part +rbac#:#extt_visible#:#Administration av programvara från tredje part är synlig +rbac#:#extt_write#:#Konfigurera programvara från tredje part +rbac#:#facs_edit_permission#:#Ändra rättighetsinställningen för administrationen +rbac#:#facs_read#:#Läsa åtkomst till administration för filer och mappar +rbac#:#facs_upload_blacklisted_files#:#Ladda upp filer med indexerade tillägg +rbac#:#facs_visible#:#Administration för filer och mappar är synlig +rbac#:#facs_write#:#Redigera inställningar för filer och mappar +rbac#:#feed_copy#:#Kopiera Webfeed +rbac#:#feed_delete#:#Radera Webfeed +rbac#:#feed_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#feed_read#:#Läs innehållet i webbflödet +rbac#:#feed_write#:#Redigera inställningar för webbflöde +rbac#:#file_copy#:#Kopiera fil +rbac#:#file_delete#:#Flytta eller radera fil +rbac#:#file_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#file_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#file_read#:#Ladda ner fil +rbac#:#file_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#file_visible#:#Filen är synlig +rbac#:#file_write#:#Ändra inställningar för filen och ladda upp ny version +rbac#:#files_visible#:#Filer synliga +rbac#:#fils_edit_permissions#:#Ändra rättighetsinställningar för administrationen av filtjänster +rbac#:#fils_read#:#Läsa tillgång till administration för filtjänster +rbac#:#fils_visible#:#Administration av filtjänster är synlig. +rbac#:#fils_write#:#Redigera konfigurationen av filtjänsterna +rbac#:#filter_all_roles#:#Visa alla roller i det aktuella sammanhanget +rbac#:#filter_global_roles#:#Visa endast globala roller +rbac#:#filter_local_roles#:#Visa endast lokala roller i det aktuella sammanhanget +rbac#:#filter_local_roles_object#:#Visa endast lokala roller på denna position +rbac#:#filter_roles_local_policy#:#Visa endast roller med lokal åtkomstreglering vid denna position +rbac#:#fld_create_poll#:#Skapa omröstning +rbac#:#fold_copy#:#Kopiera mapp +rbac#:#fold_delete#:#Radera eller flytta mapp +rbac#:#fold_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#fold_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#fold_read#:#Läsa åtkomst till mappar +rbac#:#fold_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#fold_visible#:#Foldern är synlig +rbac#:#fold_write#:#Redigera mapp +rbac#:#folders_create#:# Skapa mapp +rbac#:#folders_visible#:#Folder synlig +rbac#:#frm_add_reply#:#Användare kan svara på foruminlägg +rbac#:#frm_add_thread#:#Skapa forumämne +rbac#:#frm_copy#:#Kopia Forum +rbac#:#frm_delete#:#Radera eller flytta forum +rbac#:#frm_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#frm_moderate_frm#:#Radera och censurera inlägg i forumet +rbac#:#frm_read#:#Läsa forum och inlägg +rbac#:#frm_visible#:#Forum är synligt +rbac#:#frm_write#:#Redigera foruminställningar och hantera moderering###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +rbac#:#frma_edit_permission#:#Ändra rättighetsinställningar för administration +rbac#:#frma_read#:#Reading access to global settings for forums###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +rbac#:#frma_visible#:#Globala inställningar för forum är synliga###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +rbac#:#frma_write#:#Globala inställningar för forum kan redigeras###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +rbac#:#glo_copy#:#Kopiera ordlista +rbac#:#glo_delete#:#Ta bort eller flytta ordlista +rbac#:#glo_edit_content#:#Användaren kan redigera innehåll +rbac#:#glo_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#glo_read#:#Läs innehåll i ordlista +rbac#:#glo_visible#:#Glossary är synlig +rbac#:#glo_write#:#Redigera ordlistans innehåll och inställningar +rbac#:#grp_copy#:#Kopiera grupp +rbac#:#grp_delete#:#Ta bort eller flytta grupp +rbac#:#grp_edit_event#:#Redigera kalenderbokningar +rbac#:#grp_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#grp_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#grp_grade#:#Rate gruppmedlemmar +rbac#:#grp_join#:#Användare kan gå med i grupp +rbac#:#grp_leave#:#User kan avsluta gruppmedlemskap +rbac#:#grp_manage_members#:#Hantera medlemmar i en grupp +rbac#:#grp_news_add_news#:#Create news och redigera dina egna nyheter +rbac#:#grp_read#:#Läs tillgång till gruppen +rbac#:#grp_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#grp_visible#:#Gruppen är synlig +rbac#:#grp_write#:#Redigera gruppinställningar och innehåll +rbac#:#grpr_copy#:#Kopiera grupplänkar +rbac#:#grpr_delete#:#Flytta eller ta bort grupplänkar +rbac#:#grpr_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#grpr_visible#:#Grupplänkar är synliga och kan användas +rbac#:#grpr_write#:#Redigera inställningar för grupplänk +rbac#:#grps_edit_permission#:#Ändra rättighetsinställningar för gruppadministration +rbac#:#grps_read#:#Läsa åtkomst till gruppadministration +rbac#:#grps_visible#:#Gruppadministration är synlig +rbac#:#grps_write#:#Redigera inställningar i gruppadministration +rbac#:#hlps_edit_permission#:#Ändra rättighetsinställningar för administrationen.av online-hjälpen +rbac#:#hlps_read#:#Läs åtkomst till administrationen av onlinehjälpen +rbac#:#hlps_visible#:#Administrationen av onlinehjälpen är synlig. +rbac#:#hlps_write#:#Redigera inställningar för onlinehjälp och ladda upp ny version +rbac#:#htlm_copy#:#Kopiera HTML utbildningsmodul +rbac#:#htlm_delete#:#Radera HTML utbildningsmodul +rbac#:#htlm_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#htlm_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#htlm_read#:#Läs HTML utbildningsmodul +rbac#:#htlm_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#htlm_visible#:#HTML utbildningsmodul är synlig +rbac#:#htlm_write#:#Edit HTML Utbildningsmodul +rbac#:#iass_amend_grading#:#Ändring Slutförd bedömning av individuell bedömning +rbac#:#iass_copy#:#Kopiera individuell utvärdering +rbac#:#iass_delete#:#Radera individuell rating +rbac#:#iass_edit_learning_progress#:#Edit Learning Progress i individuell bedömning +rbac#:#iass_edit_members#:#Redigera deltagare i en individuell bedömning +rbac#:#iass_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#iass_read#:#Läs tillgång till individuell bedömning +rbac#:#iass_read_learning_progress#:#Visa framsteg i lärandet i den individuella utvärderingen +rbac#:#iass_visible#:#Individuell utvärdering är synlig +rbac#:#iass_write#:#Redigera individuella inställningar för betyg +rbac#:#il_lti_global_role#:#LTI Användare +rbac#:#il_sess_participant#:#Deltagare i sessionen +rbac#:#il_sess_status_closed#:#Sluten session med icke-deltagare +rbac#:#ilias_id#:#ILIAS ID +rbac#:#info_user_view_changed#:#Användarvy ändrad +rbac#:#internal_mail#:#Internt postsystem +rbac#:#invite#:#Inbjudan till undersökning +rbac#:#itgr_copy#:#Kopiera objektblock +rbac#:#itgr_delete#:#Ta bort eller flytta objektblock +rbac#:#itgr_edit_permission#:#Ändra rättighetsinställningarna för objektblocket +rbac#:#itgr_read#:#Läsa åtkomst till objektblock +rbac#:#itgr_visible#:#Objektblocket är synligt +rbac#:#itgr_write#:#Redigera innehåll och inställningar för ett objektblock +rbac#:#leave#:#Avbryt medlemskap +rbac#:#lhts_edit_permissions#:#Ändra inställningar för administrationsrättigheter för inlärningshistorik +rbac#:#lhts_read#:#Läs tillgång till administration för inlärningshistoria +rbac#:#lhts_visible#:#Administration för lärande historia är synlig. +rbac#:#lhts_write#:#Ändra inställningar i Administration för lärhistorik +rbac#:#lm_copy#:#Kopiera ILIAS utbildningsmodul +rbac#:#lm_delete#:#Radera ILIAS utbildningsmodul +rbac#:#lm_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#lm_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#lm_read#:#Läs ILIAS utbildningsmodul +rbac#:#lm_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#lm_visible#:#ILIAS utbildningsmodul är synlig +rbac#:#lm_write#:#Redigera ILIAS utbildningsmodul +rbac#:#lngf_edit_permission#:#Ändra rättighetsinställningarna för administrationen +rbac#:#lngf_read#:#Läsning tillgång till språkhantering +rbac#:#lngf_visible#:#Språkhantering är synlig +rbac#:#lngf_write#:#Språkinställningar kan redigeras och avancerad språkhantering kan användas +rbac#:#logs_edit_permission#:#Ändra inställningen för loggningsrättigheter +rbac#:#logs_read#:#Läsa åtkomst till loggningsinställningar +rbac#:#logs_visible#:#Protokolladministrationen är synlig +rbac#:#logs_write#:#Redigera administrationsinställningar för loggning +rbac#:#lp_other_users#:#Se andra användares framsteg i lärandet +rbac#:#lrss_edit_permission#:#Ändra rättighetsinställningarna för administrationen +rbac#:#lrss_read#:#Läsning tillgång till lärande administration av resurser +rbac#:#lrss_visible#:#Administrationen av lärresurser är synlig +rbac#:#lrss_write#:#Redigera inställningar för lärresurser i Administration +rbac#:#lso_copy#:#Kopiera inlärningssekvens +rbac#:#lso_delete#:#Radera inlärningssekvens +rbac#:#lso_edit_learning_progress#:#Redigera inställningar för inlärningsframsteg +rbac#:#lso_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#lso_lp_other_users#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#lso_manage_members#:#Redigera medlemmar +rbac#:#lso_participate#:#Anmäla sig till utbildningssekvensen +rbac#:#lso_read#:#Läsa tillgång till inlärningssekvensen +rbac#:#lso_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#lso_unparticipate#:#Logga ut från inlärningssekvensen +rbac#:#lso_visible#:#Lärsekvens synlig +rbac#:#lso_write#:#Redigera inlärningssekvens +rbac#:#lsos_edit_permissions#:#Ändra rättighetsinställningar för administrationen för inlärningssekvenser +rbac#:#lsos_read#:#Läs tillgång till administration för inlärningssekvenser +rbac#:#lsos_visible#:#Administrationen för utbildningssekvenser är synlig. +rbac#:#lsos_write#:#Ändra inställningar i Administration för inlärningssekvenser +rbac#:#lti_copy#:#Användare kan kopiera LTI-konsumenter +rbac#:#lti_delete#:#Användaren kan flytta eller ta bort LTI-konsumenten +rbac#:#lti_edit_learning_progress#:#Användaren kan redigera inställningarna för inlärningsframsteg +rbac#:#lti_edit_permission#:#Användaren kan ändra behörighetsinställningar +rbac#:#lti_read#:#Användaren kan se LTI-konsumenter +rbac#:#lti_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#lti_read_outcomes#:#Användaren kan se andra användares erfarenheter och ranking +rbac#:#lti_visible#:#LTI konsumenten är synlig +rbac#:#lti_write#:#Användaren kan redigera inställningarna för LTI-konsumenten +rbac#:#ltis_add_consume_provider#:#Användaren kan lägga till egna leverantörsinställningar för LTI-konsument +rbac#:#ltis_edit_permission#:#Ändra rättighetsinställningar för LTI-administration +rbac#:#ltis_read#:#Läs tillgång till LTI-administration +rbac#:#ltis_release_objects#:#User kan släppa objekt för LTI Konsument +rbac#:#ltis_visible#:#LTI administration är synlig +rbac#:#ltis_write#:#Redigera inställningar i LTI-administrationen +rbac#:#mail_internal_mail#:#Användare får använda det interna e-postsystemet (ILIAS) +rbac#:#mail_mail_to_global_roles#:#User får skicka e-post till globala roller. +rbac#:#mail_read#:#Läs tillgång till postadministration +rbac#:#mail_smtp_mail#:#Användaren kan skicka e-post via SMTP till externa adresser +rbac#:#mail_to_global_roles#:#Globala e-postmeddelanden +rbac#:#mail_visible#:#Mailadministrationen är synlig +rbac#:#mail_write#:#Redigera inställningar i Mail Administration +rbac#:#manage_comp#:#Redigera kompetenser +rbac#:#manage_comp_temp#:#Redigera kompetensmallar +rbac#:#manage_materials#:#Hantera material +rbac#:#manage_profiles#:#Redigera kompetensprofiler +rbac#:#mcst_copy#:#Kopiera Mediacast +rbac#:#mcst_delete#:#Radera eller flytta mediacast +rbac#:#mcst_edit_learning_progress#:#Redigera inställningar för inlärningsframsteg +rbac#:#mcst_edit_permission#:#Ändra inställning till rättigheter +rbac#:#mcst_read#:#Läs Mediacast +rbac#:#mcst_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#mcst_visible#:#Mediacast är synligt +rbac#:#mcst_write#:#Redigera innehåll och inställningar för mediacast +rbac#:#mcts_edit_permission#:#Ändra rättighetsinställning i Mediacast administration +rbac#:#mcts_read#:#Läs tillgång till Mediacast administration +rbac#:#mcts_visible#:#Mediacast-administration är synlig +rbac#:#mcts_write#:#Ändra inställningar i Mediacast administration +rbac#:#mds_edit_permission#:#Ändra rättighetsinställningar i metadataadministration +rbac#:#mds_read#:#Läsa tillgång till administration av metadata +rbac#:#mds_visible#:# Administration av metadata är synlig +rbac#:#mds_write#:#Redigera inställningar i metadataadministrationen +rbac#:#mep_copy#:#Kopiera media pool +rbac#:#mep_delete#:#Radera eller flytta mediepool +rbac#:#mep_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#mep_read#:#Läsbehörighet till innehållet i mediapoolen +rbac#:#mep_visible#:#Mediepoolen är synlig +rbac#:#mep_write#:#Redigera innehåll och inställningar för mediapoolen +rbac#:#mme_edit_permission#:#Ändra rättighetsinställningen för administrationen av huvudmenyn +rbac#:#mme_read#:#Läs tillgång till administration av huvudmenyn +rbac#:#mme_visible#:#Administrationen av huvudmenyn är synlig +rbac#:#mme_write#:#Ändra inställningar för administration av huvudmenyn +rbac#:#mobs_edit_permission#:#Ändra rättighetsinställningar i administrationen för mediaobjekt och pooler +rbac#:#mobs_read#:#Läsa tillgång till administration för mediaobjekt och pooler +rbac#:#mobs_visible#:#Administration för mediaobjekt och pooler är synlig +rbac#:#mobs_write#:#Redigera inställningar för mediaobjekt och pooler +rbac#:#moderate#:#Måttlig +rbac#:#moderate_frm#:#Måttlig +rbac#:#msg_no_roles_of_type#:#Inga rullar närvarande med den valda filterinställningen +rbac#:#news_add_news#:#Skapa nyheter +rbac#:#nots_edit_permissions#:#Ändra administrationens rättighetsinställningar för anteckningar +rbac#:#nots_read#:#Läs tillgång till administration för anteckningar +rbac#:#nots_visible#:#Administrationen för noter är synlig. +rbac#:#nots_write#:#Ändra inställningar i Administration för anteckningar +rbac#:#nwss_edit_permission#:#Ändra rättighetsinställningar i nyhets- och webbflödesadministrationen +rbac#:#nwss_read#:#Läsa tillgång till nyheter och webbflöden administration +rbac#:#nwss_visible#:#Administration av nyheter och webbflöden är synlig +rbac#:#nwss_write#:#Ändra inställningar i administrationen för nyheter och webbflöden +rbac#:#obj_skee#:#Kompetens träd +rbac#:#org_op_access_results#:#Tillgång till resultat från underordnade användare +rbac#:#org_op_edit_submissions_grades#:#Redigera inlägg från andra användare +rbac#:#org_op_manage_participants#:#Hantera underordnade deltagare +rbac#:#org_op_score_participants#:#Utvärdera underordnade deltagare +rbac#:#org_op_view_certificates#:#Visa certifikat för underordnade användare +rbac#:#org_op_view_competences#:#Se kompetenser för underordnade användare +rbac#:#org_op_write_learning_progress#:#Ställa in inlärningsförlopp för underordnade användare +rbac#:#orgu_cat_administrate_users#:#Lokala inloggningskonton kan skapas och hanteras +rbac#:#orgu_copy#:#Kopiera organisatorisk enhet +rbac#:#orgu_delete#:#Ta bort eller flytta organisatorisk enhet +rbac#:#orgu_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#orgu_read#:#Läs åtkomst till organisatorisk enhet +rbac#:#orgu_read_users#:#Lokala inloggningskonton för denna organisatoriska enhet kan visas +rbac#:#orgu_view_learning_progress#:#Visa framsteg i inlärningen +rbac#:#orgu_view_learning_progress_rec#:#Se lärandets framsteg rekursivt +rbac#:#orgu_visible#:#Organisatorisk enhet är synlig. +rbac#:#orgu_write#:#Redigera inställningar för organisationsenheten +rbac#:#otpl_edit_permission#:#Ändra rättighetsinställningar i administrationen av de didaktiska mallarna +rbac#:#otpl_read#:#Läsbehörighet för administration av de didaktiska mallarna +rbac#:#otpl_visible#:#Administrationen av de didaktiska mallarna är synlig +rbac#:#otpl_write#:#Redigera inställningar för didaktiska mallar +rbac#:#perm_class_create#:#Skapa nya objekt +rbac#:#perm_class_create_desc#:#Här anger du vilka objekt som får skapas under detta objekt. +rbac#:#perm_class_object#:#Drift +rbac#:#perm_class_object_desc#:#Detta listar de rättigheter för operationer som är tillgängliga för den aktuella objekttypen. +rbac#:#perm_global_role#:#Global roll +rbac#:#perm_local_role#:#Lokal roll +rbac#:#perm_local_role_desc#:#Den här rollen definieras lokalt för det här objektet och motsvarar redan en lokal tillträdesbestämmelse +rbac#:#perm_protected_global_role#:#Skyddad global roll +rbac#:#perm_protected_local_role#:#Skyddad lokal roll +rbac#:#perm_role_path_info_created#:#skapad i %1$s "%2$s" +rbac#:#perm_role_path_info_inheritance#:#använder lokal åtkomstkontroll från %1$s "%2$s" +rbac#:#perm_use_local_policy#:#Använd lokal åtkomstkontroll +rbac#:#perm_use_local_policy_desc#:#Om lokal åtkomstkontroll är aktiverad kan andra rättighetsspecifikationer definieras här. +rbac#:#poll_copy#:#Kopiera omröstning +rbac#:#poll_delete#:#Radera röst +rbac#:#poll_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#poll_read#:#Läs omröstning +rbac#:#poll_visible#:#Röstning är synlig +rbac#:#poll_write#:#Redigera omröstning +rbac#:#positions_override_operations#:#Överskriv globala inställningar +rbac#:#precondition_not_obligatory_alt#:#Förutsättningen är valfri +rbac#:#precondition_num_obligatory#:#Antal material som krävs +rbac#:#precondition_num_optional_info#:#Ange det minsta antal material som krävs för att uppfylla förutsättningen. +rbac#:#precondition_obligatory#:#Åtagande +rbac#:#precondition_obligatory_alt#:#Förutsättningen måste vara uppfylld +rbac#:#precondition_obligatory_info#:#Obligatoriska villkor måste uppfyllas för att få tillträde. +rbac#:#precondition_obligatory_settings#:#Inställningar för förhandsvillkor +rbac#:#prfa_edit_permission#:#Ändra rättighetsinställningar i portföljadministration +rbac#:#prfa_read#:#Läs åtkomst till portföljadministration +rbac#:#prfa_visible#:#Portföljadministrationen är synlig +rbac#:#prfa_write#:#Redigera inställningar i portföljadministrationen +rbac#:#prg_copy#:#Användaren kan kopiera studieprogrammet +rbac#:#prg_delete#:#Radera studieprogram +rbac#:#prg_edit_permission#:#Redigera inställningar för rättigheter +rbac#:#prg_manage_members#:#Redigera uppgifter för ett studieprogram +rbac#:#prg_read#:#Sidinnehållet i studieprogrammet kan läsas +rbac#:#prg_visible#:#Studieprogrammet är synligt +rbac#:#prg_write#:#User kan redigera inställningar +rbac#:#prgr_copy#:#Kopiera länkar till studieprogram +rbac#:#prgr_delete#:#Flytta eller ta bort länkar till studieprogram +rbac#:#prgr_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#prgr_visible#:#Länkar till studieprogram är synliga och kan användas +rbac#:#prgr_write#:#Ändra inställningar för länkar till studieprogram +rbac#:#prgs_edit_permission#:#Ändra rättighetsinställningar i studieprogramadministrationen +rbac#:#prgs_read#:#Läs tillgång till administration av studieprogram +rbac#:#prgs_visible#:#Studieprogramadministration är synlig +rbac#:#prgs_write#:#Redigera inställningar i Studieprogramadministration +rbac#:#prss_edit_permissions#:#Ändra rättighetsinställningar för administrationen av personliga resurser +rbac#:#prss_read#:#Läs tillgång till administration för personliga resurser +rbac#:#prss_visible#:#Administrationen för personliga resurser är synlig. +rbac#:#prss_write#:#Ändra inställningar i Administration för personliga resurser +rbac#:#prtt_copy#:#Mall för portfölj med kopior +rbac#:#prtt_delete#:#Ta bort eller flytta portföljmall +rbac#:#prtt_edit_permission#:#Ändra rättighetsinställningar för portföljmall +rbac#:#prtt_read#:#Läs portföljmall +rbac#:#prtt_visible#:#Portfoliomallen är synlig +rbac#:#prtt_write#:#Skapa portföljmallar och redigera inställningar för portföljmallar +rbac#:#ps_edit_permission#:#Ändra rättighetsinställningar för sekretess- och säkerhetsinställningar +rbac#:#ps_export_member_data#:#Tillåt export av medlemsdata i grupper och kurser +rbac#:#ps_read#:#Läs åtkomst till sekretess- och säkerhetsinställningar +rbac#:#ps_visible#:#Dataskydd och säkerhetsinställningar är synliga +rbac#:#ps_write#:#Tillåt redigering av sekretess- och säkerhetsinställningar +rbac#:#push_desktop_items#:#rekommendera innehåll +rbac#:#qpl_copy#:#Kopiera frågepoolen +rbac#:#qpl_delete#:#Radera eller flytta frågepool +rbac#:#qpl_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#qpl_read#:#Frågor i poolen kan ses och antas för tester +rbac#:#qpl_visible#:#Frågepoolen är synlig +rbac#:#qpl_write#:#Redigera frågor och inställningar för frågepoolen +rbac#:#rbac_add_new_local_role#:#Skapa ny lokal roll +rbac#:#rbac_add_recommended_content#:#Rekommenderat innehåll +rbac#:#rbac_add_recommended_content_info#:#Tilldelar det aktuella objektet '%1' som rekommenderat innehåll till alla användare av rollen. +rbac#:#rbac_admin_permissions#:#Administrativa rättigheter +rbac#:#rbac_auto_global#:#Automatiskt genererad global roll +rbac#:#rbac_auto_local#:#Automatiskt genererad lokal roll +rbac#:#rbac_auto_rolt#:#Automatiskt genererad rollmall +rbac#:#rbac_back_to_overview#:#Tillbaka till rollöversikten +rbac#:#rbac_cant_import_role_wrong_type#:#Att lägga till en roll från objekt $s till ett objekt $s är inte möjligt. +rbac#:#rbac_change_existing_confirm_tbl#:#Inställningar för att ändra befintliga objekt +rbac#:#rbac_change_existing_objects_desc_new_role#:#Rättsinställningarna från denna roll överförs till ALLA befintliga objekt. +rbac#:#rbac_changes#:#Förändringar +rbac#:#rbac_choose_copy_targets#:#Ange ett sökord för att hitta de roller till vilka rättigheter ska överföras. +rbac#:#rbac_condition_delete_sure#:#Vill du verkligen ta bort följande förutsättningar? +rbac#:#rbac_context_global#:#Global +rbac#:#rbac_copy_behaviour#:#Inställningar för kopiering av rättigheter +rbac#:#rbac_copy_finished#:#Rättigheterna har överförts till de valda rollerna. +rbac#:#rbac_copy_role#:#Kopiera roll +rbac#:#rbac_copy_role_add_perm#:#Lägg till rättigheter +rbac#:#rbac_copy_role_copy#:#Kopieringsrätt +rbac#:#rbac_copy_role_remove_perm#:#Ta bort rättigheter +rbac#:#rbac_create_bibl#:#Skapa litteraturlista +rbac#:#rbac_create_blog#:#Skapa blogg +rbac#:#rbac_create_book#:#Skapa bokningspool +rbac#:#rbac_create_cat#:#Skapa kategorier +rbac#:#rbac_create_catr#:#Skapa kategorilänk +rbac#:#rbac_create_chtr#:#Chatroom skapa +rbac#:#rbac_create_cld#:#Create Cloud Object###29 07 2022 ny variabel +rbac#:#rbac_create_cmix#:#Skapa xAPI/cmi5-objekt +rbac#:#rbac_create_copa#:#Skapa innehållssida +rbac#:#rbac_create_crs#:#Skapa kurs +rbac#:#rbac_create_crsr#:#Skapa kurslänk +rbac#:#rbac_create_dcl#:#Skapa datainsamling +rbac#:#rbac_create_exc#:#Skapa träning +rbac#:#rbac_create_file#:#Ladda upp fil +rbac#:#rbac_create_fold#:# Skapa mapp +rbac#:#rbac_create_frm#:#Skapa Forum +rbac#:#rbac_create_glo#:#Skapa ordlista +rbac#:#rbac_create_grp#:#Skapa grupp +rbac#:#rbac_create_grpr#:#Skapa grupplänk +rbac#:#rbac_create_htlm#:#Skapa HTML utbildningsmodul +rbac#:#rbac_create_iass#:#Skapa individuell utvärdering +rbac#:#rbac_create_itgr#:#Skapa objektblock +rbac#:#rbac_create_lm#:#Skapa utbildningsmodul för ILIAS +rbac#:#rbac_create_lso#:#Skapa en inlärningssekvens +rbac#:#rbac_create_lti#:#Skapa LTI-konsumenter +rbac#:#rbac_create_mcst#:#Skapa Mediacast +rbac#:#rbac_create_mep#:#Skapa en mediapool +rbac#:#rbac_create_orgu#:#Skapa organisatoriska enheter +rbac#:#rbac_create_poll#:#Skapa omröstning +rbac#:#rbac_create_prg#:#Skapa studieprogram +rbac#:#rbac_create_prgr#:#Skapa länk till studieprogram +rbac#:#rbac_create_prtt#:#Skapa mall för portfölj +rbac#:#rbac_create_qpl#:#Skapa frågebank för tester +rbac#:#rbac_create_rcrs#:#Skapa ECS-kurs +rbac#:#rbac_create_role#:#Skapa roll +rbac#:#rbac_create_rolt#:#Skapa rollmall +rbac#:#rbac_create_sahs#:#Skapa utbildningsmodul för SCORM +rbac#:#rbac_create_sess#:#Skapa session +rbac#:#rbac_create_spl#:#Skapa frågepool för undersökningar +rbac#:#rbac_create_svy#:#Skapa undersökning +rbac#:#rbac_create_tst#:#Skapa test +rbac#:#rbac_create_usr#:#Skapa användare +rbac#:#rbac_create_webr#:#Skapa webblänk +rbac#:#rbac_create_wiki#:#Skapa wiki +rbac#:#rbac_delete_local_policies#:#Åsidosätta lokala åtkomstregler +rbac#:#rbac_delete_local_policies_info#:#Välj denna inställning för att ta bort alla befintliga lokala åtkomstbestämmelser (t.ex. i kurser och grupper). Alla rättigheter skrivs om och därefter aktiveras rättighetsskyddet. +rbac#:#rbac_delete_role#:#Ta bort roll +rbac#:#rbac_edit_condition#:#Redigera förhandsvillkor +rbac#:#rbac_form_copy_roles_adjust_button#:#Orättvisa rättigheter +rbac#:#rbac_form_copy_roles_adjust_type#:#Typ av justering av rättigheter +rbac#:#rbac_form_copy_roles_adjust_type_add#:#Lägg till rättigheter +rbac#:#rbac_form_copy_roles_adjust_type_add_info#:# Lägger till MARKERADE rättigheter för den valda globala rollmallen till den lokala rättighetsmallen. +rbac#:#rbac_form_copy_roles_adjust_type_clone#:#Kopieringsrätt +rbac#:#rbac_form_copy_roles_adjust_type_clone_info#:#Alla behörigheter för den valda globala rollmallen skriver över alla lokala behörighetsinställningar. +rbac#:#rbac_form_copy_roles_adjust_type_remove#:#Ta bort rättigheter +rbac#:#rbac_form_copy_roles_adjust_type_remove_info#:#Removerar de MARKERADE rättigheterna för den valda globala rollmallen från de lokala rättighetsmallarna. +rbac#:#rbac_form_copy_roles_ce_add_no#:#Justera INTE befintliga objekt +rbac#:#rbac_form_copy_roles_ce_add_no_info#:#Befintliga lokala rättighetsspecifikationer kompletteras i enlighet med detta, rättigheterna för de befintliga objekten justeras inte. +rbac#:#rbac_form_copy_roles_ce_add_yes#:#Lägg endast till valda rättigheter till befintliga objekt +rbac#:#rbac_form_copy_roles_ce_add_yes_info#:#Befintliga lokala rättighetsinställningar och rättighetsinställningarna för befintliga objekt kompletteras i enlighet med detta. +rbac#:#rbac_form_copy_roles_ce_clone_no#:#Justera INTE befintliga objekt +rbac#:#rbac_form_copy_roles_ce_clone_no_info#:#Befintliga standardvärden för lokala rättigheter skrivs över, de befintliga objekten justeras inte i sina rättigheter. +rbac#:#rbac_form_copy_roles_ce_clone_yes#:#Ändra befintliga objekt +rbac#:#rbac_form_copy_roles_ce_clone_yes_info#:#Överskriv befintliga standardvärden för lokala rättigheter i enlighet med detta och tillämpa IN WHOLE med alla markerade och omarkerade standardvärden som tillämpas på befintliga objekt. +rbac#:#rbac_form_copy_roles_ce_remove_no#:#Justera INTE befintliga objekt +rbac#:#rbac_form_copy_roles_ce_remove_no_info#:# Markerade behörigheter tas bort från befintliga lokala behörigheter, de befintliga objekten justeras inte i sina behörigheter. +rbac#:#rbac_form_copy_roles_ce_remove_yes#:#Reducera befintliga objekt endast med utvalda rättigheter +rbac#:#rbac_form_copy_roles_ce_remove_yes_info#:#Befintliga lokala rättighetsinställningar och rättighetsinställningarna för befintliga objekt reduceras i enlighet med detta. +rbac#:#rbac_global_rolt#:#Global rollmall +rbac#:#rbac_import_role#:#Import roll +rbac#:#rbac_info_only_position_access#:#Du visas bara de medlemmar som du har tillgång till baserat på dina medlemskap i organisatoriska enheter. +rbac#:#rbac_keep_local_policies#:#Behåll lokala tillträdesregler +rbac#:#rbac_keep_local_policies_info#:#Om den aktiveras behålls alla lokala åtkomstregler. Rättigheterna för alla andra objekt justeras och skyddas sedan. +rbac#:#rbac_local_policies#:#Lokala tillträdesbestämmelser +rbac#:#rbac_local_policy#:#Lokal tillträdesreglering +rbac#:#rbac_log#:#Logg +rbac#:#rbac_log_change_owner#:#Ändrat ägande###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +rbac#:#rbac_log_changed_owner#:#Objektet ägs nu###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +rbac#:#rbac_log_copy_object#:#Kopiera objekt +rbac#:#rbac_log_create_object#:#Skapa objekt +rbac#:#rbac_log_edit_permissions#:#Ändra inställningar för rättigheter +rbac#:#rbac_log_edit_template#:#Redigera rollmallar +rbac#:#rbac_log_edit_template_existing#:#Applicera rollmallar på objekt +rbac#:#rbac_log_inheritance_add#:#Avbrutet arv för "%s" +rbac#:#rbac_log_inheritance_rmv#:#Restore Arv för "%s" +rbac#:#rbac_log_link_object#:#Länk objekt +rbac#:#rbac_log_move_object#:#Flytta objekt +rbac#:#rbac_log_operation_add#:#Höger tillagd för "%s +rbac#:#rbac_log_operation_rmv#:#Höger borttagen för "%s +rbac#:#rbac_log_source_object#:#Källa objekt +rbac#:#rbac_msg_user_already_assigned#:#De valda användarna har redan tilldelats den här rollen. +rbac#:#rbac_not_change_existing_objects#:#Justera INTE befintliga objekt +rbac#:#rbac_permissions#:#Rättigheter +rbac#:#rbac_precondition_hide#:# Dölj objekt +rbac#:#rbac_precondition_hide_info#:#Detta objekt visas inte för användare förrän de definierade förutsättningarna är uppfyllda. +rbac#:#rbac_precondition_minimum_optional#:#Minst två förhandsvillkor måste vara frivilliga. +rbac#:#rbac_precondition_mode#:#Mode +rbac#:#rbac_precondition_mode_all#:#Alla förutsättningar +rbac#:#rbac_precondition_mode_all_info#:#Alla definierade förutsättningar måste vara uppfyllda för åtkomst. +rbac#:#rbac_precondition_mode_subset#:#Delmängd av förhandsvillkor +rbac#:#rbac_precondition_mode_subset_info#:#En delmängd av de definierade förhandsvillkoren måste uppfyllas för åtkomst. Vissa förutsättningar kan fortfarande vara obligatoriska. +rbac#:#rbac_precondition_save_obligatory#:#Rädda engagerad +rbac#:#rbac_precondition_source#:#Förkonditionering genom +rbac#:#rbac_precondition_target#:#Villkor för tillgång till +rbac#:#rbac_repository_permissions#:#Rättigheter för tidskrifter +rbac#:#rbac_role_delete_qst#:#Är du säker på att du vill ta bort den här rollen. Alla rättigheter som beviljas av rollen återkallas då oåterkalleligt. +rbac#:#rbac_role_delete_self#:#Uppmärksamhet +rbac#:#rbac_role_exists_alert#:#Det finns redan en roll med samma namn. Vänligen välj ett annat rollnamn. +rbac#:#rbac_role_imported#:#Rollen importerades framgångsrikt. +rbac#:#rbac_role_rights_copy#:#Kopieringsrätt +rbac#:#rbac_role_rights_copy_change_existing#:#Ändra befintliga objekt +rbac#:#rbac_role_rights_copy_empty#:#Ingen +rbac#:#rbac_role_selection#:#Typ av rullning +rbac#:#rbac_role_title#:#Roll titel +rbac#:#rbac_select_copy_targets#:#Vänligen välj de roller till vilka rättigheterna ska överföras. +rbac#:#rbac_ud_global#:#Självskapad global roll +rbac#:#rbac_ud_local#:#Skapa lokal roll själv +rbac#:#rbac_ud_rolt#:#Självskapad rollmall +rbac#:#rbac_unprotected_delete_local_policies_info#:#Om aktiverat skrivs alla lokala åtkomstregler över och rättigheterna i kurser och grupper återinitialiseras. +rbac#:#rbac_unprotected_keep_local_policies_info#:# Välj denna inställning för att behålla alla befintliga lokala åtkomstregler. +rbac#:#rcat_delete#:#Ta bort kategorin ECS +rbac#:#rcat_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#rcat_read#:#Läs tillgång till ECS kategori +rbac#:#rcat_visible#:#ECS-kategorin är synlig +rbac#:#rcat_write#:#Redigera ECS-kategori +rbac#:#rcrs_delete#:#Radera ECS-kurs +rbac#:#rcrs_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#rcrs_read#:#Läs tillgång till ECS-kurs +rbac#:#rcrs_visible#:#ECS-kursen är synlig +rbac#:#rcrs_write#:#Redigera ECS-kurs +rbac#:#read_comp#:#Läsa tillgång till kompetenser och kompetensmallar +rbac#:#read_learning_progress#:#Se andra användares framsteg i lärandet +rbac#:#read_outcomes#:#Visa andra användares erfarenheter av lärande +rbac#:#read_profiles#:#Läsa tillgång till kompetensprofiler +rbac#:#read_results#:#Enkätresultat +rbac#:#read_users#:#Visa lokala inloggningskonton +rbac#:#recf_edit_permission#:#Ändra rättighetsinställningar i hanteringen av återställda objekt +rbac#:#recf_read#:#Läsa åtkomst till återställda objekt +rbac#:#recf_visible#:#Hanteringen av återställda objekt är synlig +rbac#:#recf_write#:#Återställ objekt +rbac#:#redact#:#Redigering +rbac#:#release_objects#:#Frigör objekt +rbac#:#reps_edit_permission#:#Ändra rättighetsinställningar för tidskriftshantering +rbac#:#reps_read#:#Läsning tillgång till tidskriftshantering +rbac#:#reps_visible#:#Magasinhantering är synlig +rbac#:#reps_write#:#Ändra inställningar i tidskriftshanteringen +rbac#:#rfil_delete#:#Ta bort kategorin ECS +rbac#:#rfil_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#rfil_read#:#Läs tillgång till ECS kategori +rbac#:#rfil_visible#:#ECS-kategorin är synlig +rbac#:#rfil_write#:#Redigera ECS-kategori +rbac#:#rglo_delete#:#Radera ECS Ordlista +rbac#:#rglo_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#rglo_read#:#Läsa tillgång till ECS ordlista +rbac#:#rglo_visible#:#ECS ordlista är synlig +rbac#:#rglo_write#:#Redigera ECS Ordlista +rbac#:#rgrp_delete#:#Radera ECS-gruppen +rbac#:#rgrp_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#rgrp_read#:#Läs tillgång till ECS-gruppen +rbac#:#rgrp_visible#:#ECS-gruppen är synlig +rbac#:#rgrp_write#:#Redigera ECS-gruppen +rbac#:#rlm_delete#:#Radera ECS utbildningsmodul +rbac#:#rlm_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#rlm_read#:#Läs tillgång till ECS utbildningsmodul +rbac#:#rlm_visible#:#ECS utbildningsmodul är synlig +rbac#:#rlm_write#:#Redigera ECS utbildningsmodul +rbac#:#role_block_role#:#Lås roll +rbac#:#role_block_role_desc#:#Alla rättigheter för detta objekt och dess underobjekt tas bort. +rbac#:#role_blocked#:# +rbac#:#role_confirm_block_role#:#Spara rollstatus +rbac#:#role_confirm_block_role_header#:#Vill du verkligen ändra status för de valda rollerna? +rbac#:#role_confirm_block_role_info#:#För åtgärden "Lås roll" utförs följande åtgärder +rbac#:#role_confirm_unblock_role_info#:#Lås upp för åtgärden "Lås roll +rbac#:#role_unblocked#:# +rbac#:#root_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#root_read#:#Läsartillgång till ILIAS-systemet +rbac#:#root_visible#:#ILIAS-systemet är synligt +rbac#:#root_write#:#Redigera data för systemnoden +rbac#:#rtst_delete#:#Radera ECS-test +rbac#:#rtst_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#rtst_read#:#Läs tillgång till ECS-testet +rbac#:#rtst_visible#:#ECS-testet är synligt +rbac#:#rtst_write#:#Redigera ECS-test +rbac#:#rwik_delete#:#Radera ECS Wiki +rbac#:#rwik_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#rwik_read#:#Läs åtkomst till ECS Wiki +rbac#:#rwik_visible#:#ECS Wiki är synlig +rbac#:#rwik_write#:#Redigera ECS Wiki +rbac#:#sahs_copy#:#Användare kan kopiera SCORM-inlärningsmodul +rbac#:#sahs_delete#:#Ta bort eller flytta SCORM utbildningsmodul +rbac#:#sahs_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#sahs_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#sahs_read#:#Läs SCORM utbildningsmodul +rbac#:#sahs_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#sahs_visible#:#Utbildningsmodulen SCORM är synlig +rbac#:#sahs_write#:#Redigera innehåll och inställningar för SCORM-lärmodulen +rbac#:#seas_edit_permission#:#Ändra rättighetsinställningarna för sökadministrationen +rbac#:#seas_read#:#Läs tillgång till administration av sökningen +rbac#:#seas_search#:#Tillåt användning av sökningen +rbac#:#seas_visible#:#Administrationen av sökningen är synlig +rbac#:#seas_write#:#Redigera inställningar i administrationen av sökningen +rbac#:#sess_copy#:#Kopiera session +rbac#:#sess_delete#:#Avsluta session +rbac#:#sess_edit_event#:#Redigera kalenderbokningar +rbac#:#sess_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#sess_edit_metadata#:#Redigera metadata +rbac#:#sess_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#sess_manage_materials#:#Hantera materialtilldelningar +rbac#:#sess_manage_members#:#Hantera deltagare i en session +rbac#:#sess_read#:#Läs tillgång till sessioner +rbac#:#sess_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#sess_visible#:#Sessionerna är synliga +rbac#:#sess_write#:#Redigera sessioner +rbac#:#skmg_edit_permission#:#Ändra rättighetsinställningar för administration av kompetenshantering +rbac#:#skmg_read#:#Läsning tillgång till kompetenshantering +rbac#:#skmg_visible#:#Kompetenshantering är synlig +rbac#:#skmg_write#:#Edit kompetenshantering +rbac#:#smtp_mail#:#SMTP e-post +rbac#:#spl_copy#:#Kopiera frågepool för undersökningar +rbac#:#spl_delete#:#Radera eller flytta frågepool +rbac#:#spl_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#spl_read#:#Frågor i poolen kan ses och antas för undersökningen +rbac#:#spl_visible#:#Frågepoolen är synlig +rbac#:#spl_write#:#Redigera frågor och inställningar för frågepoolen +rbac#:#statistics_read#:#Visa statistik +rbac#:#sty_write_content#:#Redigera Innehållsstilar +rbac#:#sty_write_page_layout#:#Redigera sidlayouter +rbac#:#sty_write_system#:#Redigera systemets stilar +rbac#:#stys_edit_permission#:#Ändra rättighetsinställningar i layoutadministration +rbac#:#stys_read#:#Läs tillgång till layoutadministration +rbac#:#stys_sty_write_content#:#Redigera Innehållsstilar +rbac#:#stys_sty_write_custom#:#Redigera Innehållsstilar +rbac#:#stys_sty_write_page_layout#:#Redigera sidlayouter +rbac#:#stys_sty_write_system#:#Redigera systemets stilar +rbac#:#stys_visible#:#Layout administration är synlig +rbac#:#svy_copy#:#Kopiundersökning +rbac#:#svy_delete#:#Radera eller flytta undersökning +rbac#:#svy_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#svy_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#svy_invite#:#Inbjuda andra att delta i en undersökning +rbac#:#svy_read#:#Delta i undersökningen +rbac#:#svy_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#svy_read_results#:#Användaren har tillgång till alla undersökningsresultat +rbac#:#svy_visible#:#Undersökningen är synlig +rbac#:#svy_write#:#Skapa undersökning och redigera inställningar +rbac#:#svyf_edit_permission#:#Ändra rättighetsinställning i enkätadministration +rbac#:#svyf_read#:#Läs tillgång till administration av undersökningar +rbac#:#svyf_visible#:#Survey administration är synlig +rbac#:#svyf_write#:#Redigera inställningar i enkätadministrationen +rbac#:#sysc_edit_permission#:#Ändra rättighetsinställningar för systemkontroll +rbac#:#sysc_read#:#Ändra rättighetsinställningarna för systemkontrollen. +rbac#:#sysc_visible#:#Läsa åtkomst till systemkontrollen +rbac#:#sysc_write#:#Användaren får utföra systemkontroll. +rbac#:#tags_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#tags_read#:#Läs åtkomst till taggningsinställningarna +rbac#:#tags_visible#:#Taggningsinställningar är synliga +rbac#:#tags_write#:#Redigera inställningar för taggning +rbac#:#tala_edit_permission#:#Ändra rättighetsinställningar i samtalsmallens administration +rbac#:#tala_read#:#Läs tillgång till administration av samtalsmallar +rbac#:#tala_visible#:#Konversation mall administration är synlig +rbac#:#tala_write#:#Skapa och redigera samtalsmallar +rbac#:#taxs_edit_permission#:#Ändra rättighetsinställningar för taxonomiadministration +rbac#:#taxs_read#:#Läs åtkomst till taxonomiadministration +rbac#:#taxs_visible#:#Taxonomiadministrationen är synlig +rbac#:#taxs_write#:#Redigera inställningar i taxonomiadministration +rbac#:#tos_edit_permission#:#Ändra rättighetsinställningar för administration av användaravtal +rbac#:#tos_read#:#Läs tillgång till användning avtal förvaltning +rbac#:#tos_visible#:#Hanteringen av användningsavtal är synlig +rbac#:#tos_write#:#Redigera inställningar i Hantering av användaravtal +rbac#:#trac_delete#:#Radera spårningsdata +rbac#:#trac_edit_permission#:#Ändra rättighetsinställningar i åtkomststatistik och hantering av inlärningsframsteg +rbac#:#trac_lp_other_users#:#Se andra användares framsteg i lärandet +rbac#:#trac_read#:#Läs åtkomst till statistik och hantering av inlärningsframsteg +rbac#:#trac_visible#:#Statistik över åtkomst och hantering av inlärningsframsteg är synlig +rbac#:#trac_write#:#Ändra inställningar för åtkomststatistik och hantering av inlärningsresultat +rbac#:#tst_copy#:#Kopiera test +rbac#:#tst_delete#:#Radera eller flytta test +rbac#:#tst_edit_learning_progress#:#Användaren kan redigera inställningar för inlärningsframsteg +rbac#:#tst_edit_permission#:#Redigera inställningar för rättigheter +rbac#:#tst_read#:#Ta ett test +rbac#:#tst_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg +rbac#:#tst_tst_results#:#Tillgång till testresultat +rbac#:#tst_tst_statistics#:#Tillgång till teststatistik +rbac#:#tst_visible#:#Testet är synligt +rbac#:#tst_write#:#Montera test och redigera inställningar +rbac#:#upload_blacklisted_files#:#Bypass svart lista +rbac#:#usrf_delete#:#Ta bort inloggningskonton +rbac#:#usrf_edit_permission#:#Ändra rättighetsinställningar för hantering av inloggningskonton +rbac#:#usrf_edit_roleassignment#:#Ändra rolltilldelning för inloggningskonton +rbac#:#usrf_push_desktop_items#:#Tillåt ILIAS-objekt att skickas till andra användare som rekommenderat innehåll. +rbac#:#usrf_read#:#Läs åtkomst till hantering av inloggningskonton +rbac#:#usrf_read_users#:#Läsa åtkomst till inloggningskonton för lokala administratörer +rbac#:#usrf_visible#:#Registreringskontohanteringen är synlig +rbac#:#usrf_write#:#Redigera inställningar i Hantering av inloggningskonton +rbac#:#wbdv_edit_permissions#:#Ändra inställningar för administrationsrättigheter för WebDAV +rbac#:#wbdv_read#:#Läs tillgång till administration för WebDAV +rbac#:#wbdv_visible#:#Administrationen för WebDAV är synlig. +rbac#:#wbdv_write#:#Ändra inställningar i Administration för WebDAV +rbac#:#wbrs_edit_permission#:#Ändra rättighetsinställningar för hantering av webblänkar +rbac#:#wbrs_read#:#Läs tillgång till hantering av webblänkar +rbac#:#wbrs_visible#:#Webblänkhantering är synlig +rbac#:#wbrs_write#:#Redigera inställningar i webblänkhantering +rbac#:#webr_copy#:#Kopiera Webblänk insamling +rbac#:#webr_delete#:#Radera Webblänksamling +rbac#:#webr_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#webr_read#:#Ring upp webblänkar +rbac#:#webr_visible#:#Webblänkar är synliga +rbac#:#webr_write#:#Redigera inställningar för webblänk +rbac#:#wfe_edit_permission#:#Ändra rättighetsinställningen för Workflow Engine-administrationen +rbac#:#wfe_read#:#Läsa åtkomst till administration av Workflow Engine +rbac#:#wfe_visible#:#Administrationen av Workflow Engine är synlig +rbac#:#wfe_write#:#Redigera inställningar för Workflow Engine-administrationen +rbac#:#wiki_activate_wiki_protection#:#Aktivera skrivskydd för enskilda wiki-sidor +rbac#:#wiki_copy#:#Kopiera Wiki +rbac#:#wiki_delete#:#Ta bort eller flytta wiki +rbac#:#wiki_delete_wiki_pages#:#Ta bort wiki-sidor +rbac#:#wiki_edit_content#:#Skapa och redigera Wiki-sidor +rbac#:#wiki_edit_page_meta#:#Redigera wiki-sidans metadata +rbac#:#wiki_edit_permission#:#Ändra inställningar för rättigheter +rbac#:#wiki_edit_wiki_navigation#:#Redigera Wiki-navigering +rbac#:#wiki_html_export#:#HTML-export +rbac#:#wiki_read#:#Läs wiki-innehåll +rbac#:#wiki_statistics_read#:#Visa statistik +rbac#:#wiki_visible#:#Wiki är synlig +rbac#:#wiki_wiki_html_export#:#Exportera wiki till HTML +rbac#:#wiki_write#:#Redigera wiki-inställningar +rbac#:#wiks_edit_permission#:#Ändra rättighetsinställningar för wiki-administrationen +rbac#:#wiks_read#:#Läsbehörighet till wiki-administration +rbac#:#wiks_visible#:#Wiki-administrationen är synlig +rbac#:#wiks_write#:#Redigera inställningar i wikiadministrationen +rbac#:#write#:#Redigera inställningar +rcat#:#rcat_call#:#Samtal ECS kategori +rcrs#:#rcrs_call#:#Ring ECS-kurs +registration#:#reg_access_limitation_limited_time#:#Access från registreringsdatum för +registration#:#reg_access_limitation_limited_until#:#Tillgången är begränsad fram till +registration#:#reg_access_limitation_missing_mode#:#Vänligen välj typ av åtkomstperiod för alla roller. +registration#:#reg_access_limitation_mode#:#Typ av tidsbegränsning för åtkomst +registration#:#reg_access_limitation_mode_absolute#:#Temporärt tillträde med fastställt slutdatum +registration#:#reg_access_limitation_mode_absolute_target#:#Giltig tills +registration#:#reg_access_limitation_mode_relative#:#Begränsad åtkomstperiod från registreringsdatum +registration#:#reg_access_limitation_mode_relative_target#:#Giltig för +registration#:#reg_access_limitation_mode_unlimited#:#Utan tidsbegränsning för åtkomst +registration#:#reg_access_limitation_none#:#obegränsad tillgång +registration#:#reg_access_limitation_out_of_date#:#För en eller flera roller har tidsfristen för tillträde redan löpt ut! +registration#:#reg_access_limitations#:#Term of access +registration#:#reg_add_assignment#:#Nytt uppdrag +registration#:#reg_added_assignment#:#Ett nytt uppdrag skapades. +registration#:#reg_allow_codes#:#Tillåt Koder +registration#:#reg_allow_codes_info#:#Användare kan dessutom registrera sig med koder. +registration#:#reg_allowed_domains#:#Tillåtna domäner för e-postadresser +registration#:#reg_allowed_domains_info#:#Använd * som jokertecken och ; som separator. Till exempel "*@ilias.de". Registreringskoder upphäver denna kontroll. +registration#:#reg_approve#:#Ny registrering med verifiering +registration#:#reg_approve_info#:#Alla nyregistrerade användare måste aktiveras av en administratör. +registration#:#reg_approve_needs_recipient#:#För registreringstypen "Registrering med verifiering" ska minst en användare definieras som kommer att meddelas om nya registreringar. +registration#:#reg_available_roles#:#Tillgängliga roller +registration#:#reg_confirmation_hash_life_time#:#Giltighetstid +registration#:#reg_confirmation_hash_life_time_expired#:#Bekräftelselänken är inte längre giltig. Vänligen registrera dig igen! +registration#:#reg_confirmation_hash_life_time_info#:#Ange giltighetstiden för bekräftelselänken (i sekunder). Rekommenderat värde är 1800 sekunder. +registration#:#reg_confirmation_hash_not_found#:#Den här bekräftelselänken matchar inte något ILIAS-konto. +registration#:#reg_confirmation_hash_not_passed#:#Bekräftelselänken är inte fullständig. +registration#:#reg_confirmation_link_successful#:#Du har framgångsrikt registrerat dig hos ILIAS. Nu måste du fortfarande aktivera ditt ILIAS-konto. Du har just fått ett e-postmeddelande med en bekräftelselänk. Vänligen klicka på bekräftelselänken inom de närmaste minuterna för att aktivera ditt ILIAS-k +registration#:#reg_default#:#Standard +registration#:#reg_deleted_assignment#:#Uppdragen har tagits bort. +registration#:#reg_direct#:#Direkt registrering +registration#:#reg_direct_info#:#Om den är påslagen aktiveras alla nyregistrerade användare automatiskt. +registration#:#reg_disabled#:#Ingen registrering möjlig +registration#:#reg_domain#:#domän (t.ex. "@din_domän.de") +registration#:#reg_email#:#Automatisk rolltilldelning +registration#:#reg_email_domains#:#Följande domäner för e-postadresser är giltiga +registration#:#reg_email_domains_code#:#När du använder en kod är alla e-postadresser möjliga. +registration#:#reg_email_role_assignment#:#Rolltilldelning via e-postadress +registration#:#reg_fixed#:#Val från fördefinierad lista +registration#:#reg_info_pwd#:#Om den är påslagen tilldelas och skickas ett automatiskt genererat lösenord till nyinloggade användare. +registration#:#reg_mail_body_activation#:#För att aktivera ditt konto, vänligen klicka på följande länk +registration#:#reg_mail_body_approve#:#Du har redan registrerat dig på eLearning-plattformen och fått ett e-postmeddelande med dina åtkomstuppgifter. Nu har din åtkomst aktiverats av din administratör. Om du har några frågor eller problem, vänligen kontakta honom / henne via e-post. +registration#:#reg_mail_body_confirmation#:#För att aktivera ILIAS-kontot måste du aktivera det i +registration#:#reg_mail_body_profile#:#Profiluppgifter +registration#:#reg_mail_body_profile_changed#:#Dina profildata har ändrats. +registration#:#reg_mail_body_pwd_generation#:#Din åtkomst måste dock fortfarande aktiveras av administratören. När detta har gjorts kommer du att få ett bekräftelsemeddelande. +registration#:#reg_mail_body_reason#:#Du får detta mail eftersom aviseringen av nya inloggningskonton är aktiverad för dig i administrationen. +registration#:#reg_mail_body_timelimit#:#Din tillgång är begränsad i tid +registration#:#reg_mail_new_user#:#Ny användarinloggning +registration#:#reg_mail_new_user_body#:#En ny användare har loggat in. +registration#:#reg_mail_new_user_confirmation#:#Förfrågan om att verifiera ansökan +registration#:#reg_missing_domain#:#Vänligen fyll i alla nödvändiga fält. +registration#:#reg_missing_role#:#Vänligen fyll i alla nödvändiga fält. +registration#:#reg_notification#:#Notifieringar +registration#:#reg_notification_info#:#Ange här ett eller flera inloggningsnamn (åtskilda av kommatecken) som ska meddelas via e-post när en ny inloggning tas emot.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +registration#:#reg_role_access_limitations#:#Sätt åtkomstperioder för roller +registration#:#reg_role_assignment#:#Rolltilldelning +registration#:#reg_role_info#:#Rolls +registration#:#reg_select_one#:#Vänligen gör ett urval. +registration#:#reg_selectable_roles#:#Valbara roller +registration#:#reg_settings_header#:#Inställningar +registration#:#reg_type#:#Typ av registrering +registration#:#reg_type_confirmation#:#Registrera med e-postbekräftelse +registration#:#reg_type_confirmation_info#:#Med denna registreringsmetod får den nya användaren först en bekräftelselänk via e-post. Om detta bekräftas aktiveras ILIAS-kontot automatiskt. +registration#:#reg_unknown_recipients#:#Följande användare är inte giltiga +registration#:#registration_code#:#Kod +registration#:#registration_code_not_valid#:#Den angivna registreringskoden är ogiltig eller har redan använts. +registration#:#registration_code_optional_info#:#Om du har en ILIAS-registreringskod kan du ange den här. +registration#:#registration_code_required_info#:#En ILIAS-registreringskod krävs för framgångsrik registrering. +registration#:#registration_code_role_info#:#Vid användning av en registreringskod kan detta val skrivas över. +registration#:#registration_codes_access_limitation_all#:#Alla +registration#:#registration_codes_add#:#Skapa koder +registration#:#registration_codes_edit_header#:#Skapa nya koder +registration#:#registration_codes_export#:#Exportkoder +registration#:#registration_codes_no_assigned_role#:#Ingen fördefinierad tilldelad roll +registration#:#registration_codes_number#:#Antal koder +registration#:#registration_codes_override_global_info#:#Dessa inställningar kan åsidosättas av registreringskoder. +registration#:#registration_codes_override_info#:#Den här inställningen har prioritet över alla andra motsvarande registerinställningar. +registration#:#registration_codes_roles#:#Global roll +registration#:#registration_codes_roles_limitation_none#:#Ingen fördefinierad åtkomstperiod +registration#:#registration_codes_roles_local#:#Lokal(a) roll(er) +registration#:#registration_codes_roles_title#:#Roll för nya ILIAS-konton +registration#:#registration_codes_type#:#Kod typ +registration#:#registration_codes_type_ext#:#Förnyelse av tillfälliga inloggningskonton +registration#:#registration_codes_type_ext_info#:#Koden kan användas för att förnya tillfälliga inloggningskonton. +registration#:#registration_codes_type_reg#:#Registreringskod +registration#:#registration_codes_type_reg_info#:#Koden kan användas för att registrera nya inloggningskonton. +registration#:#registration_disabled_no_access#:#Självregistrering är inte aktiverat. Kontakta en systemadministratör för ytterligare hjälp +registration#:#registration_export_codes_no_data#:#Inga koder valdes för export. +registration#:#registration_generated#:#Skapad på +registration#:#registration_generated_all#:#Alla datum +registration#:#registration_no_valid_role#:#För närvarande finns ingen roll definierad för registreringar. Vänligen kontakta systemadministratören. +registration#:#registration_reg_type_codes#:#Registrera med koder +registration#:#registration_reg_type_codes_info#:#Med denna registreringsmetod behöver den nya användaren en giltig kod. +registration#:#registration_roles_all#:#Alla roller +registration#:#registration_settings#:#ILIAS-Auth / Självregistrering +registration#:#registration_tab_codes#:#Registreringskoder +registration#:#registration_tab_settings#:#Inställningar +registration#:#registration_used#:#Konsumeras på +registration#:#registration_user_new_account_mail#:#Redigera meddelande om ny registrering +rep#:#btn_undelete_new_location#:#Restore (ny plats) +rep#:#btn_undelete_origin_location#:#Restore (ursprunglig plats) +rep#:#rep_activation_access#:#Tillgång +rep#:#rep_activation_access_ref_info#:#Denna inställning påverkar endast den aktuella referensen och ingen annan referens. +rep#:#rep_activation_availability#:#Tillgänglighet +rep#:#rep_activation_limited_end#:#Slut +rep#:#rep_activation_limited_start#:#Start +rep#:#rep_activation_limited_visibility#:#Alltid synlig +rep#:#rep_activation_online#:#Online +rep#:#rep_activation_online_object_info#:#Den här inställningen påverkar alla referenser i magasinet. +rep#:#rep_add_new_def_grp_assessment#:#Bedömning +rep#:#rep_add_new_def_grp_communication#:#Kommunikation +rep#:#rep_add_new_def_grp_content#:#Innehåll +rep#:#rep_add_new_def_grp_feedback#:#Återkoppling och utvärdering +rep#:#rep_add_new_def_grp_organisation#:#Organisation +rep#:#rep_add_new_def_grp_templates#:#Mallar +rep#:#rep_add_to_favourites#:#Lägg till i favoriter +rep#:#rep_added_rec_content#:#Rekommenderat innehåll har lagts till. +rep#:#rep_added_to_favourites#:#Objektet har lagts till bland favoriterna. +rep#:#rep_allowed_types#:#Tillåtna typer +rep#:#rep_breadcr_crs#:#Breadcrumb-navigering börjar med kurs +rep#:#rep_breadcr_crs_config#:#Konfiguration +rep#:#rep_breadcr_crs_overwrite#:#Breadcrumb-displayen kan konfigureras i kursen. +rep#:#rep_breadcr_crs_overwrite_not#:#Breadcrumb-displayen kan inte konfigureras i kursen. +rep#:#rep_configure#:#Konfigurera +rep#:#rep_crs_default_shortened#:#Standardinställning +rep#:#rep_custom_icons#:#Anpassade ikoner +rep#:#rep_default#:#standardvärde +rep#:#rep_dependencies#:#Beroenden +rep#:#rep_dependency#:#Beroende +rep#:#rep_dependent_object#:#Beroende objekt +rep#:#rep_export_limit_number#:#Antal objekt +rep#:#rep_export_limitation#:#Exportgräns för container +rep#:#rep_export_limitation_disabled#:#Container export avaktiverad +rep#:#rep_export_limitation_info#:#Begränsar antalet exporterade underobjekt vid export av behållare (kategorier, kurser, ...) i magasinet. +rep#:#rep_export_limitation_limited#:#Begränsning +rep#:#rep_failure_trashed_trash#:#Du har valt objekt som inte längre kan återställas till sin ursprungliga plats eftersom det överordnade objektet har raderats. För dessa objekt kan du endast använda alternativet "Återställ (ny plats)". +rep#:#rep_fav_intro1#:#Du har för närvarande inte valt några favoriter. För att göra detta måste du vidta två åtgärder +rep#:#rep_fav_intro2#:#Klicka på "%s" och välj ett lärandeobjekt från det tillgängliga utbudet, t.ex. en lärmodul eller ett forum. +rep#:#rep_fav_intro3#:#Om du har hittat något som intresserar dig kan du enkelt lägga till det i dina favoriter. Välj alternativet"Lägg till i favoriter" i menyn Åtgärder för det önskade objektet. +rep#:#rep_favourites#:#Favoriter +rep#:#rep_favourites_info#:#Användare kan markera enskilda tidningsartiklar som favoriter. Favoritlistor kan aktiveras i instrumentpanelen och huvudmenyns konfiguration. +rep#:#rep_intro#:#Välkommen till tidningen! +rep#:#rep_intro1#:#I det här avsnittet kan du skapa och tillgängliggöra utbildnings- och arbetsmaterial. Allt innehåll är organiserat i kategorier. Dessa kategorier kan till exempel återspegla organisationen på din institution (t.ex. avdelningar eller klasser). Kategorier +rep#:#rep_intro2#:#Du kan bygga en första struktur med tre steg +rep#:#rep_intro3#:#Klicka på knappen %s bredvid urvalslistan i det övre högra hörnet för att skapa en första kategori. +rep#:#rep_intro4#:#I följande meny anger du en titel och en beskrivningstext för kategorin och klickar slutligen på %s. +rep#:#rep_intro5#:#Om du klickar på titeln kommer du till din första kategori. +rep#:#rep_intro6#:#Efter detta första steg kan du nu skapa ytterligare kategorier eller lägga till dina första läromedel i denna kategori. +rep#:#rep_mo_mem_dash#:#Du är för närvarande inte medlem i en kurs eller grupp. +rep#:#rep_multiple_reference_deletion_instruction#:#Välj ut de som också bör raderas +rep#:#rep_multiple_reference_deletion_intro#:#Det finns ytterligare referenser för detta objekt. +rep#:#rep_new_item_group_add#:#Lägg till gruppering +rep#:#rep_new_item_group_add_separator#:#Lägg till kolumnavgränsare +rep#:#rep_new_item_group_delete_sure#:#Vill du verkligen ta bort följande grupperingar? +rep#:#rep_new_item_group_edit#:#Redovisa gruppering +rep#:#rep_new_item_group_nr_subitems#:#Antal tilldelade objekt +rep#:#rep_new_item_group_other#:#Mer +rep#:#rep_new_item_group_separator#:#Kolumnavgränsare +rep#:#rep_new_item_group_unassigned#:#Inte tilldelad +rep#:#rep_new_item_group_unassigned_subitems#:#Antal ej tilldelade objekt +rep#:#rep_new_item_groups#:#Grupperingar +rep#:#rep_new_item_menu#:#"Lägg till nytt objekt" meny +rep#:#rep_no_last_visited_mess#:#Du har ännu inte kallat på några objekt i magasinet. +rep#:#rep_no_permission_to_delete#:#Ingen rätt att radera +rep#:#rep_object_lists#:#Objektlistor +rep#:#rep_object_references_cannot_be_read#:#Ingen rätt till %s ytterligare referenser. +rep#:#rep_object_to_delete#:#Att radera +rep#:#rep_rec_content_removed#:#Rekommenderat innehåll har tagits bort. +rep#:#rep_recommended_content#:#Rekommenderat innehåll +rep#:#rep_remove_from_favourites#:#Ta bort från favoriter +rep#:#rep_remove_rec_content#:#Bör följande rekommendationer verkligen tas bort? Motsvarande innehåll kommer att finnas kvar. +rep#:#rep_removed_from_favourites#:#Objektet har tagits bort från favoriterna. +rep#:#rep_target_location#:#Destination +rep#:#rep_target_location_info#:#Vänligen välj den destination där de utvalda objekten ska återställas. +rep#:#rep_time_period#:#Tidsperiod +rep#:#rep_trash_deleted_by_unknown#:#Okänd +rep#:#rep_trash_table_col_deleted_by#:#Borttagen av +rep#:#rep_trash_table_col_deleted_on#:#Borttagen på +rep#:#rep_trash_table_col_num_subs#:#Antal underobjekt +rep#:#rep_trash_table_title#:# Borttagna objekt nedan +rep#:#rep_tree_limit#:#Begränsning av antalet poster i trädet +rep#:#rep_tree_limit_info#:#Visar endast ett begränsat antal element i trädet för att öka prestandan. +rep#:#rep_tree_limit_number#:#Maximalt antal +rep#:#rep_tree_limit_number_info#:#Maximalt antal underordnade element som initialt visas för en nod. Om det finns fler underordnade element visas ett inmatningsfält för sökning där de underordnade elementen kan filtreras efter titel. +rep#:#rep_visibility_until#:#Tidsbegränsad tillgänglighet +rfil#:#rfil_call#:#Ring ECS-fil +rfil#:#rfil_version_tstamp#:#Datum för uppladdning +rglo#:#rglo_call#:#Hämta ECS ordlista +rgrp#:#rgrp_call#:#Ring ECS-gruppen +rlm#:#rlm_call#:#Ring upp ECS utbildningsmodul +rtst#:#rtst_call#:#Ring ECS-test +rwik#:#rwik_call#:#Samtal ECS Wiki +sahs#:#cont_insert_after_chap#:#Insätt element efter ett kapitel. +sahs#:#cont_insert_into_chap#:#Insert elements inom ett kapitel. +sahs#:#sahs_activate_expert_mode#:#Aktivera expertläget Sequencing +sahs#:#sahs_activate_expert_mode_info#:#I det här läget kan du direkt redigera sekvensinformationen för SCORM-paketet. Uppmärksamhet +sahs#:#sahs_add#:#Skapa utbildningsmodul för SCORM +sahs#:#sahs_authoring_mode#:#Författarläge +sahs#:#sahs_authoring_mode_info#:#SCORM ZIP-filen måste ha skapats med ILIAS SCORM Editor och exporterats som SCORM 1.2/2004-paket. +sahs#:#sahs_chapter#:#Kapitel +sahs#:#sahs_choose_page_template#:#Välj sidmall +sahs#:#sahs_choose_pages_chap_scos_ass_only#:#Välj endast antingen sidor, SCOs, tillgångar eller kapitel. +sahs#:#sahs_choose_special_page#:#Välj specialsida +sahs#:#sahs_copy#:#Kopiera SCORM utbildningsmodul +sahs#:#sahs_desc_objectives#:#Beskrivning/Mål +sahs#:#sahs_glo_info#:#Observera att interna länkar i ordlistor inte stöds. +sahs#:#sahs_hide_objectives_page#:# Dölj sidan för beskrivning/lärandemål +sahs#:#sahs_hide_objectives_page_info#:#Om den är aktiverad visas inte SCO-beskrivningen och inlärningsmålen i presentationsvyn. +sahs#:#sahs_import_sequencing#:#Importera information om sekvensering +sahs#:#sahs_import_sequencing_info#:#Sekvenseringsinformationen för SCORM-paketet importeras (expertsekvenseringsläge). +sahs#:#sahs_insert_ass#:#Insert tillgång +sahs#:#sahs_insert_ass_from_clip#:#Pasta in tillgångar från Urklipp +sahs#:#sahs_insert_ass_from_clip_inside_chap#:#Klistra in tillgångar från Urklipp (inom ett kapitel) +sahs#:#sahs_insert_ass_inside_chap#:#Insert asset (inom ett kapitel) +sahs#:#sahs_insert_chapter#:#Inför kapitel +sahs#:#sahs_insert_page#:#Infoga sida +sahs#:#sahs_insert_pagelayout#:#Inför sidmall +sahs#:#sahs_insert_sco#:#Infoga SCO +sahs#:#sahs_insert_sco_from_clip_inside_chap#:#Infoga SCOs från urklipp (inom ett kapitel) +sahs#:#sahs_insert_sco_inside_chap#:#Infoga SCO (inom ett kapitel) +sahs#:#sahs_insert_special_page#:#Inför särskild sida +sahs#:#sahs_learning_objectives#:#Lärandemål +sahs#:#sahs_list_info#:#Använd en föregående * för onumrerade eller en # för numrerade listor +sahs#:#sahs_mail_context_lp#:#Lärande modul SCORM +sahs#:#sahs_mail_context_lp_info#:#För deltagarnas e-postmeddelanden på inlärningsförloppsvyerna för en SCORM-modul +sahs#:#sahs_new_asset#:#Ny tillgång +sahs#:#sahs_new_chapter#:#Nytt kapitel +sahs#:#sahs_new_page#:#Ny sida +sahs#:#sahs_new_sco#:#Ny SCO +sahs#:#sahs_oa_no_scos#:#Kapitlet innehåller ännu inga SCO. +sahs#:#sahs_objectives#:#Lärandemål +sahs#:#sahs_objectives_alignment#:# Tilldelning av lärandemål +sahs#:#sahs_organization#:#Organisation +sahs#:#sahs_page#:#Sida +sahs#:#sahs_questions#:#Frågor och svar +sahs#:#sahs_sco_objective#:#SCOs och deras lärandemål +sahs#:#sahs_sequencing#:#Sequencing +sahs#:#sahs_std_sequencing#:#Standard sekvensering +sahs#:#sahs_std_sequencing_info#:#Använd ILIAS standardsekvenseringsbeteende (rekommenderas). +sahs#:#sahs_unit#:#SCO +sahs#:#scorm_create_export_file_html_one#:#Skapa exportfil (HTML, en sida, granskningsläge) +sc13#:#sc13_page_type_sahs#:#SCORM Redaktörens sida +scormdebug#:#API-call#:#API-anrop +scormdebug#:#Commit#:#Spara data +scormdebug#:#GetDiagnostic#:#Serves lärplattform för att hämta ytterligare information. +scormdebug#:#GetErrorString#:#Hämta beskrivning för aktuell felstatus +scormdebug#:#GetLastError#:#Hämta felkod för aktuell felstatus +scormdebug#:#GetValue#:#Återkalla data +scormdebug#:#Initialize#:#Initialisera (starta) kommunikation med SCORM API +scormdebug#:#SCO-name#:#SCO namn +scormdebug#:#SCO-title#:#SCO-titel +scormdebug#:#SetValue#:#Skicka data +scormdebug#:#Terminate#:#Spara data och avsluta kommunikationen med SCORM API +scormdebug#:#adl.nav.request#:#Navigeringsanrop som ska utföras efter Terminate() +scormdebug#:#adl.nav.request_valid.choice#:#Ger feedback till SCO om ett specifikt navigeringsanrop kommer att vara möjligt +scormdebug#:#adl.nav.request_valid.continue#:#Ger feedback till SCO om ytterligare navigering kommer att vara möjlig +scormdebug#:#adl.nav.request_valid.previous#:#Ger feedback till SCO om bakåtnavigering kommer att vara möjlig +scormdebug#:#all_API-calls_shown#:#Alla anrop till SCORM API visas för närvarande. +scormdebug#:#cmi._version#:#visar versionen av datamodellen +scormdebug#:#cmi.comments_from_learner._children#:#Lista över de delar av datamodellen som stöds här +scormdebug#:#cmi.comments_from_learner._count#:# aktuellt antal kommentarer som gjorts av eleven +scormdebug#:#cmi.comments_from_learner.n.comment#:#Text för kommentaren +scormdebug#:#cmi.comments_from_learner.n.location#:#Position inom SCO som kommentaren avser +scormdebug#:#cmi.comments_from_learner.n.timestamp#:#Tidpunkt då kommentaren skapades eller senast ändrades +scormdebug#:#cmi.comments_from_lms._children#:#Lista över de delar av datamodellen som stöds här +scormdebug#:#cmi.comments_from_lms._count#:#aktuellt antal kommentarer från LMS +scormdebug#:#cmi.comments_from_lms.n.comment#:#Kommentar från LMS länkad till SCO +scormdebug#:#cmi.comments_from_lms.n.location#:#Position inom SCO som kommentaren avser +scormdebug#:#cmi.comments_from_lms.n.timestamp#:#Tidpunkt då kommentaren skapades eller senast ändrades +scormdebug#:#cmi.completion_status#:#Anger om och i vilken utsträckning SCO har bearbetats. +scormdebug#:#cmi.completion_threshold#:#bestämmer den nivå på vilken ett SCO anses vara slutfört. +scormdebug#:#cmi.credit#:#bestämmer om inlärningsframsteg ska registreras.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +scormdebug#:#cmi.entry#:#sänds om SCO redan har behandlats ###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +scormdebug#:#cmi.exit#:#överförde varför och hur SCO lämnades.###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +scormdebug#:#cmi.interactions._children#:#Lista över de delar av datamodellen som stöds här +scormdebug#:#cmi.interactions._count#:#aktuellt antal interaktioner som lagras av LMS +scormdebug#:#cmi.interactions.n.correct_responses._count#:# aktuellt antal korrekta svar som lagrats av LMS för denna interaktion +scormdebug#:#cmi.interactions.n.correct_responses.n.pattern#:#Ett korrekt svar för denna interaktion +scormdebug#:#cmi.interactions.n.description#:#Beskrivning av interaktionen +scormdebug#:#cmi.interactions.n.id#:#unikt ID för interaktionen +scormdebug#:#cmi.interactions.n.latency#:#förlorad tid mellan tillhandahållandet av interaktionen och svaret###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +scormdebug#:#cmi.interactions.n.learner_response#:#Svar på denna interaktion###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +scormdebug#:#cmi.interactions.n.objectives._count#:# aktuellt antal inlärningsmål som lagrats av LMS för denna interaktion +scormdebug#:#cmi.interactions.n.objectives.n.id#:#ID för lärandemålet som är kopplat till denna interaktion +scormdebug#:#cmi.interactions.n.result#:#Bedöm om svaret är korrekt###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +scormdebug#:#cmi.interactions.n.timestamp#:#Tidpunkt då interaktionen gjordes tillgänglig för bearbetning +scormdebug#:#cmi.interactions.n.type#:#Typ av interaktion +scormdebug#:#cmi.interactions.n.weighting#:#Viktning av denna interaktion i förhållande till andra interaktioner +scormdebug#:#cmi.launch_data#:#Uppgifter som tillhandahålls SCO vid start +scormdebug#:#cmi.learner_id#:#ID för eleven som lagras i LMS###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +scormdebug#:#cmi.learner_name#:#Namn så som det lagras i LMS +scormdebug#:#cmi.learner_preference._children#:#Lista över de delar av datamodellen som stöds här +scormdebug#:#cmi.learner_preference.audio_captioning#:#ställer in om kompletterande ljudtext ska visas +scormdebug#:#cmi.learner_preference.audio_level#:# ställer in eller hämtar den volym som ska sparas +scormdebug#:#cmi.learner_preference.delivery_speed#:#Ställer in eller hämtar hastigheten för innehållspresentationen som ska kommas ihåg. +scormdebug#:#cmi.learner_preference.language#:# anger eller hämtar det språk som skall kommas ihåg +scormdebug#:#cmi.location#:#personens nuvarande befattning inom SCO###Modifierad som en del av jämställdhetsintegreringsåtgärderna för ILIAS 8 +scormdebug#:#cmi.max_time_allowed#:#visar den maximalt tillåtna inlärningstiden för SCO###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +scormdebug#:#cmi.mode#:#indikerar vilket läge SCO är i +scormdebug#:#cmi.objectives._children#:#Lista över de delar av datamodellen som stöds här +scormdebug#:#cmi.objectives._count#:# aktuellt antal inlärningsmål som lagras av LMS för SCO +scormdebug#:#cmi.objectives.n.completion_status#:#Indikerar i vilken utsträckning lärandemålet har uppnåtts. +scormdebug#:#cmi.objectives.n.description#:#Beskrivning av lärandemålet +scormdebug#:#cmi.objectives.n.id#:#ID för lärandemålet +scormdebug#:#cmi.objectives.n.progress_measure#:#Indikerar graden av uppfyllelse av ett lärandemål. +scormdebug#:#cmi.objectives.n.score._children#:#Lista över de delar av datamodellen som stöds här +scormdebug#:#cmi.objectives.n.score.max#:#Maximalt antal poäng som ska uppnås för lärandemålet +scormdebug#:#cmi.objectives.n.score.min#:#Minsta antal poäng som ska uppnås för lärandemålet +scormdebug#:#cmi.objectives.n.score.raw#:#Score uppnådd för lärandemålet i intervallet mellan score.min och score.max +scormdebug#:#cmi.objectives.n.score.scaled#:#bestämmer vilken relativ andel av poängintervallet som uppnåddes för detta lärandemål +scormdebug#:#cmi.objectives.n.success_status#:#indikerar med vilken framgång lärandemålet uppnåddes +scormdebug#:#cmi.progress_measure#:#Indikerar graden av fullständighet i bearbetningen av en SCO +scormdebug#:#cmi.scaled_passing_score#:#bestämmer från vilken relativ andel av punktintervallet en SCO bearbetades framgångsrikt +scormdebug#:#cmi.score._children#:#Lista över de delar av datamodellen som stöds här +scormdebug#:#cmi.score.max#:#Högsta poäng som kan uppnås i SCO +scormdebug#:#cmi.score.min#:#minsta poäng som ska uppnås i SCO +scormdebug#:#cmi.score.raw#:#Score uppnådd i intervallet mellan score.min och score.max +scormdebug#:#cmi.score.scaled#:#bestämmer vilken relativ andel av poängintervallet som uppnåddes i en SCO +scormdebug#:#cmi.session_time#:#Tid som eleven tillbringat i en SCO under denna session. +scormdebug#:#cmi.success_status#:#indikerar med vilken framgång SCO behandlades +scormdebug#:#cmi.suspend_data#:#Minnesutrymme för datalagring mellan inlärningstillfällen +scormdebug#:#cmi.time_limit_action#:#Anger hur SCO ska bete sig när den maximalt tillåtna inlärningstiden har uppnåtts. +scormdebug#:#cmi.total_time#:#Summan av alla ackumulerade sessionstider för SCO i det aktuella inlärningsförsöket +scormdebug#:#comment#:#Kommentar +scormdebug#:#completion_status_by_progress_measure#:#Eftersom det finns ett värde för cmi.completion_threshold, bestäms värdet för cmi.completion_status av LMS! Detta görs genom att jämföra värdet för cmi.completion_threshold med värdet för cmi.progress_measure. Värdet för cmi.completion_status är för närv +scormdebug#:#debugwindow_action#:#Åtgärder +scormdebug#:#debugwindow_cancel#:#abort +scormdebug#:#debugwindow_comment#:#Kommentar +scormdebug#:#debugwindow_comment_enter#:#Ange din kommentar +scormdebug#:#debugwindow_console#:#Konsol +scormdebug#:#debugwindow_date#:#Datum +scormdebug#:#debugwindow_delete#:#Radera +scormdebug#:#debugwindow_delete_logfile#:#Ta bort loggfilen +scormdebug#:#debugwindow_download#:#Ladda ner +scormdebug#:#debugwindow_filename#:#Filenamn +scormdebug#:#debugwindow_logs#:#Logga filer +scormdebug#:#debugwindow_open#:#Öppen +scormdebug#:#debugwindow_start_recording#:#Starta inspelning +scormdebug#:#debugwindow_stop_recording#:#Stoppa inspelningen +scormdebug#:#debugwindow_submission_failed#:#Räddning misslyckades +scormdebug#:#debugwindow_submit#:#sänd av +scormdebug#:#description_for#:#Förklaring till +scormdebug#:#error#:#Fel +scormdebug#:#error0#:# inget fel +scormdebug#:#error101#:#Generellt undantagsfel +scormdebug#:#error102#:#Generellt initialiseringsfel +scormdebug#:#error103#:# redan initialiserad +scormdebug#:#error104#:#Innehållsinstans avslutad +scormdebug#:#error111#:#Allmänt fel vid uppsägning +scormdebug#:#error112#:#Stopp före initialisering +scormdebug#:#error113#:#Terminering efter uppsägning +scormdebug#:#error122#:#Query data före initialisering +scormdebug#:#error123#:#Query data efter uppsägning +scormdebug#:#error132#:#Spara data före initialisering +scormdebug#:#error133#:#Spara data efter slutförandet +scormdebug#:#error142#:#Spara data före initialisering +scormdebug#:#error143#:#Spara data efter slutförandet +scormdebug#:#error201#:#Generellt fel i argumentet +scormdebug#:#error301#:#Generellt fel vid hämtning av data +scormdebug#:#error351#:#Generellt fel vid sändning av data +scormdebug#:#error391#:#Generellt fel vid lagring av data +scormdebug#:#error401#:#Odefinierat element i datamodellen +scormdebug#:#error402#:#Elementet är inte implementerat i datamodellen +scormdebug#:#error403#:#Värdet av elementet i datamodellen inte initialiserat +scormdebug#:#error404#:#Element i datamodellen får endast läsas +scormdebug#:#error405#:#Element i datamodellen får endast skrivas +scormdebug#:#error406#:#Datatyp för elementet i datamodellen är olämplig +scormdebug#:#error407#:#Värdet för elementet i datamodellen ligger inte inom det tillåtna intervallet +scormdebug#:#error408#:#Relation av datamodellen är inte skapad +scormdebug#:#generated#:#skapad +scormdebug#:#hide#:#dölja +scormdebug#:#i_fuchsia#:#rosa +scormdebug#:#i_gray#:#grå +scormdebug#:#i_green#:#grön +scormdebug#:#i_orange#:#orange +scormdebug#:#i_red#:#röd +scormdebug#:#id_learning_module#:#Id för inlärningsmodulen +scormdebug#:#log_for#:#Protokoll för utbildningsmodulen +scormdebug#:#milliseconds#:#Millisekunder +scormdebug#:#missing_API-calls#:#Följande API-anrop saknas +scormdebug#:#no_missing_API-calls#:#Saknade API-anrop upptäcktes inte. +scormdebug#:#nr_session#:#Sessionens nummer +scormdebug#:#only_important_API-Calls_shown#:#För närvarande visas endast viktiga anrop till SCORM API. +scormdebug#:#return_value#:#Återgång +scormdebug#:#scormdebug_disable_cache#:#SCORM 2004 Inaktivera webbläsarens cache +scormdebug#:#scormdebug_disable_cache_info#:#Detta förhindrar lagring av SCORM 2004 Javascript-filer i webbläsarens cache. Använd denna funktion i god tid före ett versionsbyte! +scormdebug#:#scormdebug_global_activate#:#Aktivera testverktyget SCORM +scormdebug#:#scormdebug_global_activate_info#:#Funktionen gör det möjligt att testa SCORM-inlärningsmoduler. Dessutom måste testverktyget aktiveras för varje önskad SCORM-modul. Om testverktyget avaktiveras vid denna tidpunkt avaktiveras testverktyget för alla inlärningsmoduler. +scormdebug#:#sent_values_not_checked#:#Vald egenskap +scormdebug#:#show_all_API-calls#:#Visa alla API-anrop! +scormdebug#:#show_only_important_API-calls#:#Visa endast viktiga API-anrop! +scormdebug#:#started#:#startade +scormdebug#:#strange_API-Call#:#specifikt API-anrop +scormdebug#:#strange_error#:#konstigt misstag +scormdebug#:#success_status_by_score_scaled#:#Eftersom det finns ett värde för cmi.scaled_passing_score bestäms värdet för cmi.success_status av LMS! Detta görs genom att jämföra värdet för cmi.scaled_passing_score med värdet för cmi.score.scaled. Värdet för cmi.success_status är för närvarande +scormdebug#:#summary_csv#:#Sammanfattning som CSV-fil för import t.ex. till Excel skapades +scormdebug#:#summary_download#:#Du kan ladda ner filen via "Loggar" nästa gång du startar verktyget. +scormdebug#:#summary_for_SCO_with_test#:#Sammanfattning för SCO med test +scormdebug#:#summary_for_SCO_without_test#:#Sammanfattning för en SCO utan test +scormdebug#:#undefined_color#:#icke definierad färg +scormdebug#:#unknown#:#okänd +scormtrac#:#Attempts#:#Prövningar +scormtrac#:#LearningModuleId#:#ID för utbildningsmodulen +scormtrac#:#LearningModuleTitle#:#Titel på utbildningsmodulen +scormtrac#:#LearningModuleVersion#:#Version av utbildningsmodulen +scormtrac#:#Percentage#:#Procent av slutförda SCO +scormtrac#:#Status#:#Total status +scormtrac#:#audio_captioning#:#lärarens_preferens.audio_captioning +scormtrac#:#audio_level#:#lärarens_preferens.ljudnivå +scormtrac#:#c_entry#:#inträde +scormtrac#:#c_exit#:#exit +scormtrac#:#c_language#:#lärare_preferens.språk +scormtrac#:#c_location#:#plats +scormtrac#:#c_max#:#score.max +scormtrac#:#c_min#:#score.min +scormtrac#:#c_mode#:#läge +scormtrac#:#c_raw#:#score.raw +scormtrac#:#c_timestamp#:#Sista åtkomst +scormtrac#:#c_type#:# typ +scormtrac#:#completedSCOs#:#Antal genomförda SCO +scormtrac#:#completion_status#:#komplettering_status +scormtrac#:#completion_threshold#:#tröskel för färdigställande +scormtrac#:#counter#:#Counter +scormtrac#:#counter_all#:#Alla användare +scormtrac#:#counter_correct#:#Uppgift besvarad korrekt (antal deltagare) +scormtrac#:#counter_correct_percent#:#Procentandel korrekta svar +scormtrac#:#counter_i_correct#:#Felaktigt besvarade uppgifter +scormtrac#:#counter_i_correct_percent#:#Procentandel korrekt besvarade uppgifter +scormtrac#:#counter_i_incorrect#:#Felaktigt besvarade uppgifter +scormtrac#:#counter_i_incorrect_percent#:#Procentandel felaktigt besvarade uppgifter +scormtrac#:#counter_i_other#:#Varken korrekt eller felaktigt besvarade uppgifter +scormtrac#:#counter_i_other_percent#:#Procentandel av uppgifterna som besvarats varken korrekt eller felaktigt +scormtrac#:#counter_incorrect#:#Uppgiften besvarades felaktigt (antal deltagare) +scormtrac#:#counter_incorrect_percent#:#Procentandel felaktiga svar +scormtrac#:#counter_other#:#Varken rätt eller fel svarsalternativ +scormtrac#:#counter_other_percent#:#Procentandel av varken korrekta eller felaktiga svar +scormtrac#:#cp_node_id#:#Id för kapitlet +scormtrac#:#credit#:#kredit +scormtrac#:#delivery_speed#:#elevernas_preferens.leveranshastighet +scormtrac#:#existingSCOs#:#Antal befintliga SCO +scormtrac#:#exportobjglobaltosystem#:#Rapport om status för bearbetning över kapitelgränserna +scormtrac#:#exportselectedcore#:#Rapport om kapitel (SCO) +scormtrac#:#exportselectedinteractions#:#Rapportera om kapitlets uppgifter (interaktioner) +scormtrac#:#exportselectedobjectives#:#Kapitel Inlärningsmål Rapport +scormtrac#:#exportselectedraw#:#Rådata +scormtrac#:#exportselectedsuccess#:#Grundläggande rapport om utbildningsmodulen som helhet +scormtrac#:#id#:#Id +scormtrac#:#identifierref#:#SCO-identifierare +scormtrac#:#interaction_description#:#Beskrivning av uppgiften +scormtrac#:#interaction_id#:#Id för uppgiften +scormtrac#:#interaction_value#:#Resultat av uppgiften %s +scormtrac#:#latency#:# latens +scormtrac#:#latency_seconds#:# latens +scormtrac#:#launch_data#:#lansering_data +scormtrac#:#learner_response#:#lärarens_respons +scormtrac#:#lesson_status#:#lektion_status +scormtrac#:#lm_id#:#Id för inlärningsmodulen +scormtrac#:#lm_title#:#Titel på utbildningsmodulen +scormtrac#:#lvalue#:#Nyckel +scormtrac#:#measure#:#Status +scormtrac#:#ostatus#:#Status för lärandemålet +scormtrac#:#passedSCOs#:#Antal framgångsrikt behandlade SCO +scormtrac#:#progress_measure#:# framstegsmätning +scormtrac#:#report#:#Rapport +scormtrac#:#result#:#resultat +scormtrac#:#roundedTotal_timeSeconds#:#Total tid i sekunder (avrundat) +scormtrac#:#rvalue#:#Värde +scormtrac#:#satisfied#:#Status +scormtrac#:#scaled#:#score.skalad +scormtrac#:#scaled_passing_score#:#skalad_passering_score +scormtrac#:#sco_id#:#Id för kapitlet +scormtrac#:#sco_marked_for_learning_progress#:#relevant för utbildningsnivån +scormtrac#:#sco_title#:#Kapitlets titel +scormtrac#:#scope#:#Tillämpningsområde +scormtrac#:#session_time#:#session_tid +scormtrac#:#session_time_seconds#:#session_tid +scormtrac#:#startedSCOs#:#Antal startade SCO:s +scormtrac#:#student_response#:#student_response +scormtrac#:#success_status#:#framgång_status +scormtrac#:#suspend_data#:#suspend_data +scormtrac#:#total_time#:#total_tid +scormtrac#:#total_time_seconds#:#total_tid +scormtrac#:#tracinteractionitem#:#Sammanfattande rapport om kapitlets uppgifter +scormtrac#:#tracinteractionuser#:#Deltagarrelaterad rapport om kapitlet med utvärdering av kapitlets uppgifter +scormtrac#:#tracinteractionuseranswers#:#Kapiteluppgifter per deltagare (endast resultat) +scormtrac#:#user_id#:#ID för ILIAS-kontot +scormtrac#:#weighting#:#viktning +scov#:#crsv_create#:#Skapa SCORM-certifikat +scov#:#crsv_create_info#:#Välj en slutförd utbildningsmodul för att skapa ett certifikat för den. +scov#:#scov_create#:#Skapa SCORM-certifikat +scov#:#scov_create_info#:#Välj en SCORM-modul för vilken du behöver ett certifikat +search#:#add_members_header#:#Lägg till användare +search#:#adv_md_search_title#:#Sökning i utökade metadata +search#:#append_results#:#Lägg till resultat +search#:#btn_search#:#Sökning +search#:#last_search_result#:#Sista sökresultatet +search#:#lucene_activate_field#:#Aktivera sökning +search#:#lucene_advanced_settings#:#Avancerad sökning +search#:#lucene_advanced_settings_table#:#Inställningar för avancerad sökning +search#:#lucene_all_occurrences#:#... %s ytterligare förekomst(er) +search#:#lucene_and#:#UND +search#:#lucene_cpu#:#Antal trådar +search#:#lucene_create_ini#:# Skapa konfigurationsfil +search#:#lucene_default_operator#:#Länk sökord +search#:#lucene_default_operator_info#:#Ange standardbeteendet för länkning av söktermer. +search#:#lucene_download_ini#:#Ladda ner konfigurationsfilen +search#:#lucene_err_ampersand#:#Förfrågningar med specialtecknet && måste ha följande form +search#:#lucene_err_and_or_not#:#Förfrågningar med AND/OR/NOT måste ha följande form +search#:#lucene_err_asterisk#:#Jokertecknet (*) måste föregås av minst en bokstav eller siffra. +search#:#lucene_err_caret#:#Circumflextecknet (^) måste föregås av ett alfanumeriskt tecken och följas av siffror. +search#:#lucene_err_colon#:#Fältdeklarationer ( +search#:#lucene_err_exclamation_mark#:#Förfrågningar med specialtecknet ! måste ha följande form +search#:#lucene_err_parenthesis_empty#:#Brackets får inte vara tomma. +search#:#lucene_err_parenthesis_not_closed#:#Brackets måste stängas. +search#:#lucene_err_plus_minus#:# (+) och (-) måste följas av minst en bokstav eller siffra. +search#:#lucene_err_question_mark#:#Frågetecknet (?) måste föregås av minst en bokstav eller siffra. +search#:#lucene_err_quotes#:#Vänligen stäng alla kommatecken ("). +search#:#lucene_err_quotes_not_empty#:#Kvottecken får inte vara tomma. +search#:#lucene_general_settings#:#Allmänna inställningar +search#:#lucene_host#:#Host +search#:#lucene_host_info#:#Please enter the computer name or IP address of the computer on which the Java server is to run. +search#:#lucene_index_path#:#Katalog för indexfiler +search#:#lucene_index_path_info#:#Ange en katalog där filerna för Lucene-sökindex ska lagras. +search#:#lucene_last_index_time#:#Skapande av sista index +search#:#lucene_last_index_time_info#:#Ändra endast denna inställning om du har importerat säkerhetskopian av en Lucene-indexfil. +search#:#lucene_level#:#Loggnivå +search#:#lucene_log#:#Sökväg till loggfilen +search#:#lucene_log_info#:#Ange här den absoluta sökvägen till en fil där loggmeddelanden skrivs. Om filen ännu inte finns kommer den att skapas automatiskt. +search#:#lucene_max_fs#:#Maximal filstorlek (i MB) +search#:#lucene_max_fs_info#:#Definierar gränsen för filstorlek upp till vilken filer indexeras. Innehållet i större filer inkluderas inte i indexet. +search#:#lucene_max_sub#:#Antal underobjekt +search#:#lucene_max_sub_info#:#Please enter the maximum number of sub-objects (e.g. forum topics for forums or glossary terms for glossaries) to be displayed. +search#:#lucene_more_hits_link#:#%s fler träffar... +search#:#lucene_num_frag_info#:#Ange det maximala antalet textavsnitt som ska visas för att markera sökträffarna. +search#:#lucene_num_fragments#:#Antal textavsnitt +search#:#lucene_offline_filter#:#Online-status +search#:#lucene_or#:#ODER +search#:#lucene_port#:#Port +search#:#lucene_prefix_wildcard#:#Placeholder i början av ordet +search#:#lucene_prefix_wildcard_info#:#Tillåter användning av platshållare även i början av en sökterm +search#:#lucene_relevance#:#Relevans av sökresultaten +search#:#lucene_relevance_short#:#Relevans +search#:#lucene_settings_tab#:#Lucene +search#:#lucene_settings_title#:#Inställningar för Lucene-sökning +search#:#lucene_show_relevance#:#Visa relevans +search#:#lucene_show_relevance_info#:#Sökresultaten sorteras efter deras relevans. Relevansen för respektive sökresultat visas som ytterligare information för alla träffar. +search#:#lucene_show_sub_relevance#:#Visa relevans för underobjekt +search#:#lucene_size_frag_info#:#Bestäm den maximala längden på de textavsnitt som visas för att markera sökträffarna. Ange antalet tecken inklusive mellanslag. +search#:#lucene_size_fragments#:#Längd på textavsnitten +search#:#lucene_tbl_create_ini#:#Skapa konfigurationsfil för Java-server +search#:#search_add_members_from_container_crs#:#Lägg till användare från aktuell kurs +search#:#search_add_members_from_container_grp#:#Lägg till användare från aktuell grupp +search#:#search_adv_md#:#Användardefinierade metadata +search#:#search_advanced#:#Avancerad sökning +search#:#search_all_words#:#Alla termer (AND) +search#:#search_any#:#-- Alla -- +search#:#search_any_word#:#En av termerna (OR) +search#:#search_area#:#Sökningsområde +search#:#search_area_info#:#Välj ett område inom vilket sökningen ska starta. +search#:#search_auto_complete_length#:#Antal poster i listan för automatisk komplettering +search#:#search_cdate_filter#:#Sök efter skapelsedatum +search#:#search_cdate_filter_info#:#Objektens skapelsedatum kan beaktas vid sökningen. +search#:#search_choose_object_type#:#Välj minst en objekttyp. +search#:#search_content#:#Innehåll på sidan +search#:#search_created_after#:#Föremål som skapats efter... +search#:#search_created_before#:#Objekt som skapats före... +search#:#search_created_on#:#Objects skapade den... +search#:#search_crs_title#:#Kursens namn +search#:#search_details_info#:#Detaljsökning i de objekttyper som valts ut nedan +search#:#search_direct#:#Direkt sökning +search#:#search_err_user_not_exist#:#Ingen motsvarande användare kunde hittas. +search#:#search_fast_info#:#Sök efter titlar, beskrivningar och nyckelord +search#:#search_field#:#Inmatningsfält för sökning +search#:#search_field_perform#:#Skicka sökord +search#:#search_filter_by_type#:#Typfilter +search#:#search_filter_cd#:#Filtrera efter skapelsedatum +search#:#search_for_crs_members#:#Sök efter kurser +search#:#search_for_grp_members#:#Sökning efter grupper +search#:#search_for_orgu_members#:#Sökning efter organisatorisk enhet +search#:#search_for_role_members#:#Sökning efter roller +search#:#search_for_users#:#Sökning efter användare +search#:#search_grp_title#:#Gruppens namn +search#:#search_hide_adv_search#:# Dölj avancerad sökning +search#:#search_item_filter_form#:#Sök efter typ +search#:#search_item_filter_form_info#:#Sökningen är begränsad till de valda objekttyperna. +search#:#search_like_info#:#Gör det möjligt att söka i ILIAS-databasen utan ytterligare programvara. Innehållet i filer (t.ex. PDF-filer eller HTML-inlärningsmoduler) registreras inte och visas därför inte som ett sökresultat. +search#:#search_limit_reached#:#Din sökning gav fler än %s träffar. Du kan begränsa sökningen ytterligare för att få mer detaljerade träffar. +search#:#search_lom#:#LOM metadata +search#:#search_lucene#:#Lucene söker +search#:#search_mime_excel#:#Excel-filer +search#:#search_mime_filter_form#:#Filter för filtyp +search#:#search_mime_filter_form_info#:# Begränsar sökningen till de valda filtyperna. +search#:#search_mime_image#:#Bilder +search#:#search_mime_pdf#:#PDF-filer +search#:#search_mime_powerpoint#:#Powerpoint-filer +search#:#search_mime_word#:#Ordfiler +search#:#search_minimum_info#:#Sökorden måste vara minst %s tecken långa. +search#:#search_minimum_three#:#Sökorden måste vara minst 3 tecken långa. +search#:#search_newer_than#:#Objekt som skapats före... +search#:#search_no_connection_lucene#:#Ingen anslutning kan upprättas till Lucene-servern. +search#:#search_no_match#:#Din sökning gav inga resultat. +search#:#search_no_match_hint#:#Inga träffar hittades för din sökfråga för %s.
Förslag +search#:#search_no_selection#:#Du har inte gjort något val. +search#:#search_off#:#Off +search#:#search_option_offline#:#Offline +search#:#search_option_online#:#Online +search#:#search_results#:#Sökresultat +search#:#search_role_title#:#Rollens namn +search#:#search_select_search_area#:#Ändra sökintervall +search#:#search_show_inactive_user#:#Visa inaktiva användare +search#:#search_show_inactive_user_info#:#Användarsökningen visar även användare vars konto inte är aktivt. +search#:#search_show_limited_user#:#Visa tidsbegränsade användare +search#:#search_show_limited_user_info#:#Användarsökningen visar även användare med tidsbegränsad åtkomst som antingen ännu inte har åtkomst till ILIAS eller inte längre har åtkomst. +search#:#search_term_combination#:#Kombination +search#:#search_title_description#:#Titel / Beskrivning +search#:#search_tst_svy#:#Tester/undersökningar +search#:#search_type#:#Typ av sökning +search#:#search_user#:#Användare +search#:#search_user_extended#:#Avancerad användarsökning +search#:#search_user_search_form#:#Global sökning av användare +search#:#search_user_search_info_form#:#Login-konton kan hittas i den globala sökningen. Om Lucene-fulltextsökningen är aktiverad ingår även profildata i indexet. +search#:#search_users#:#Sök användare +search#:#select_orgu#:#Välj organisatoriska enheter +search#:#until#:#till +sess#:#il_sess_participant#:#Deltagare i sessionen +sess#:#il_sess_status_open#:#Öppen session +sess#:#mail_sess_roles#:#Alla personer med följande lokala roller###Modifierad som en del av jämställdhetsarbetet för ILIAS 8. Etiketten är nu generaliserad för alla komponenter som stöder "mail till medlemmar". +sess#:#notification#:#Notifiering +sess#:#objs_crs_role#:#Kursroller +sess#:#objs_grp_role#:#Grupproller +sess#:#send_mail_participants#:#Alla deltagare i sessionen +sess#:#sess_accept_request#:#Tillåt för session +sess#:#sess_assign#:#Assign +sess#:#sess_bt_refuse#:#Avbryt deltagande +sess#:#sess_change_type#:#Ändra sessionstyp +sess#:#sess_contact#:#Kontakt +sess#:#sess_copy#:#Kopiera session +sess#:#sess_filter_all_types#:#Alla objekttyper +sess#:#sess_filter_not_assigned#:#Inte tilldelad +sess#:#sess_import#:#Importera session +sess#:#sess_info_new_sess_type#:#Ny sessionstyp +sess#:#sess_is_assigned#:#Tilldelad +sess#:#sess_list_reg_limit_places#:#Fria platser +sess#:#sess_lp_preset#:#Möjliggöra framsteg i lärandet +sess#:#sess_lp_preset_info#:#Aktivera inlärningsförloppet för alla sessionsmöten som ska skapas. +sess#:#sess_mail_admins_only#:#Endast för administratörer +sess#:#sess_mail_admins_only_info#:#Endast administratörer kan använda funktionen "Mail till deltagare" på fliken Deltagare. +sess#:#sess_mail_all#:#För alla deltagare +sess#:#sess_mail_all_info#:#Alla deltagare kan använda funktionen "Mail till deltagare" på fliken Deltagare. +sess#:#sess_mail_context_participant_info#:#For the participant e-postmeddelanden om medlemmen och inlärningsframstegsvyer för en session. +sess#:#sess_mail_context_participant_title#:#Session +sess#:#sess_mail_permanent_link#:#Välj följande länk för att komma åt innehållet i sessionen +sess#:#sess_mail_permanent_link_participants#:#Välj följande länk för att komma åt innehållet i sessionen +sess#:#sess_mail_sub_acc_bod#:#Du har godkänts för att delta i mötet datum "%s". +sess#:#sess_mail_sub_acc_sub#:#Deltagande i sessionen "%s" +sess#:#sess_mail_sub_dec_bod#:#Din begäran om att delta i mötet "%s" har avvisats. +sess#:#sess_mail_sub_dec_sub#:#Nekar att delta i sessionen "%s" +sess#:#sess_mail_type#:#Mail till deltagare +sess#:#sess_material_assigned#:#Tilldelad +sess#:#sess_material_not_assigned#:#Inte tilldelad +sess#:#sess_max_members_needed#:#Ett maximalt antal medlemmar krävs för väntelistan. +sess#:#sess_mem_contacts#:#Stöd för undervisning +sess#:#sess_mem_tbl_header#:#Deltagare i sessionen +sess#:#sess_member_administration#:#Deltagarstyrning +sess#:#sess_members#:#Deltagare +sess#:#sess_members_gallery#:#Deltagarantalet +sess#:#sess_members_print_title#:#Deltagare i sessionen +sess#:#sess_msg_applicants_assigned#:#Användaren har registrerats för sessionen. +sess#:#sess_msg_applicants_removed#:#Ansökan avslås och tas bort från listan. +sess#:#sess_new_registrations#:#Tillämpningar för deltagande +sess#:#sess_notification_option#:#Alternativ +sess#:#sess_notification_option_inherit#:#Ärva från överordnat objekt +sess#:#sess_notification_option_inherit_info#:#Använd inställningarna för det överordnade objektet (t.ex. kurs- eller gruppinställningar) för medlemmar i den här sessionen. +sess#:#sess_notification_option_manual#:#Manuellt inställd +sess#:#sess_notification_option_manual_info#:#Mottagare av aviseringar måste anges manuellt på fliken "Hantera sessionsdeltagare". +sess#:#sess_open#:#Öppen session +sess#:#sess_part_filter_participated#:#Endast deltagare +sess#:#sess_part_filter_registered#:#Endast registrerad +sess#:#sess_part_table_excused#:#Avbruten +sess#:#sess_participation_refused_info#:#Din närvaro vid detta möte har ställts in. +sess#:#sess_print_list#:#Skapa lista +sess#:#sess_reg_added_to_wl#:#Du har lagts till på väntelistan. +sess#:#sess_reg_cannot_participate#:#Avbryt deltagande +sess#:#sess_reg_cannot_participate_info#:#Users har möjlighet att avbryta sitt deltagande på "Info page". +sess#:#sess_reg_direct#:#Direkt registrering +sess#:#sess_reg_direct_info#:#Användare måste klicka på "Logga in" om de vill delta i denna session. +sess#:#sess_reg_disabled#:#Utan registrering +sess#:#sess_reg_disabled_info#:#Möjligheter att registrera användare till sessionen erbjuds inte. +sess#:#sess_reg_max_members#:#Maximalt antal +sess#:#sess_reg_max_members_info#:#När det maximala antalet deltagare har uppnåtts är det inte längre möjligt att registrera sig. +sess#:#sess_reg_max_members_short#:#Begränsat antal deltagare +sess#:#sess_reg_max_users_exceeded#:#Registrering är inte möjlig eftersom det maximala antalet deltagare för detta datum har överskridits. +sess#:#sess_reg_max_users_exceeded_wl#:#Det maximala antalet deltagare för detta sessionsdatum har överskridits. Du kan dock skriva upp dig på väntelistan. +sess#:#sess_reg_request#:#Ansök om deltagande +sess#:#sess_reg_request_info#:#Deltagande i mötet kräver godkännande av en administratör. +sess#:#sess_reg_tutor#:#Ingen registrering möjlig +sess#:#sess_reg_tutor_info#:#Login av användare är inaktiv. Endast administratörer kan registrera användare. +sess#:#sess_reg_type#:#Ansökningsförfarande +sess#:#sess_reg_waiting_list#:#Väntelista +sess#:#sess_reg_waiting_list_autofill#:#Med automatisk framflyttning +sess#:#sess_reg_waiting_list_autofill_info#:#Deltagare flyttas automatiskt upp från väntelistan i händelse av avbokningar. Detta bör inte användas i samband med registreringsprocessen "Begär deltagande" eftersom det kringgår bekräftelsen. +sess#:#sess_reg_waiting_list_no_autofill#:#Utan automatisk framflyttning +sess#:#sess_reg_waiting_list_no_autofill_info#:#Om det maximala antalet deltagare uppnås kan ytterligare användare placeras på en väntelista. +sess#:#sess_reg_waiting_list_none#:#Ingen +sess#:#sess_registered_confirm#:#Du har registrerats för mötesdatumet. Din ansökan måste dock fortfarande bekräftas av en administratör. Du kommer att meddelas så snart detta har gjorts. +sess#:#sess_registration_notification#:#Notifiering +sess#:#sess_registration_notification_info#:# Visar en kolumn på fliken "Hantera sessionsdeltagare" för att välja användare som ska meddelas om nya eller avgående deltagare. +sess#:#sess_section_reg#:#Logga in med användare +sess#:#sess_setting_header_presentation#:#Presentation +sess#:#sess_show_members#:#Deltagarantalet +sess#:#sess_show_participants_info#:#Alla deltagare kan se deltagargalleriet på fliken "Deltagare". +sess#:#sess_title#:#Sessionens titel +sess#:#sess_users_added#:#Användare har registrerats för sessionen. +sess#:#sess_users_already_assigned#:#Användarna är redan registrerade för sessionen. +sess#:#sess_users_removed_from_list#:#De valda användarna har tagits bort från väntelistan. +sess#:#sess_warn_sess_type_changed#:#Är du säker på att du vill ändra sessionstyp? Rättighetsinställningarna för den här sessionen kommer att skrivas över och anpassas till den nya sessionstypen. +shib#:#shib_activate_new#:#Nya inloggningskonton med aktivering +shib#:#shib_activate_new_info#:#Om aktiverat skapas nya ILIAS-konton som är inaktiva och måste aktiveras av administrationen. +shib#:#shib_add_missing#:#Tilldela roller som saknas +shib#:#shib_add_remove#:#Lägg till/ta bort roller +shib#:#shib_assignment_type#:#Typ av uppdrag +shib#:#shib_attr_info#:#Tilldelningen baseras på ett specifikt attribut i Shibboleth-kontot ###Modifierad som en del av jämställdhetsintegreringsaktiviteterna för ILIAS 8 +shib#:#shib_attribute#:#Användarattribut +shib#:#shib_attribute_name#:#Attributets namn +shib#:#shib_attribute_value#:#Attributets värde +shib#:#shib_check_role_assignment#:#Uppdatera rolltilldelningar vid varje inloggning +shib#:#shib_choose_role#:#Ta på dig en roll +shib#:#shib_confirm_del_role_ass#:#Är du säker på att du vill ta bort följande uppgifter? +shib#:#shib_deleted_rule#:#Tilldelningsreglerna har tagits bort. +shib#:#shib_global_role#:#Global roll +shib#:#shib_ilias_role#:#ILIAS rollnamn +shib#:#shib_local_role#:#Lokal roll +shib#:#shib_missing_attr_name#:#Var god ange namnet på attributet. +shib#:#shib_missing_attr_value#:#Var god ange värdet på attributet. +shib#:#shib_missing_plugin_id#:#Var god ange ett unikt plugin-id. +shib#:#shib_missing_role#:#Vänligen välj en ILIAS-roll. +shib#:#shib_new_rule#:#Skapa ny regel +shib#:#shib_plugin#:#Uppdrag genom plugin +shib#:#shib_plugin_id#:#Plugin-Id +shib#:#shib_plugin_info#:#Om tilldelningen inte kan göras med en enkel kontroll (attributnamn/värde), kan du alternativt reglera tilldelningen via en plug-in. +shib#:#shib_remove_deprecated#:#Ta bort obehöriga roller +shib#:#shib_role_ass_table#:#Ny regel för ILIAS rolltilldelning +shib#:#shib_role_assignment#:#Rolltilldelning +shib#:#shib_role_by_attribute#:#Användarattribut +shib#:#shib_role_by_plugin#:#Genom plugin +shib#:#shib_role_name#:#ILIAS rollnamn +shib#:#shib_role_name_info#:#Välj antingen en global roll eller ange namnet på en lokal roll. +shib#:#shib_role_selection#:#Val av roll +shib#:#shib_rule_condition#:#Kondition +shib#:#shib_rule_type#:#Typ av uppdrag +shib#:#shib_rules_tables#:#Regler för tilldelning av aktiv roll +shib#:#shib_settings#:#Shibboleth-inställningar +shib#:#shib_update_role_ass_table#:#Redigera regel för rolltilldelning +shib#:#shib_update_roles#:#Rolltilldelning +skll#:#skll_competence_achievements#:#Nya kompetensbedömningar och utvärderingar +skll#:#skll_intro_skill_notification_for#:#Följande är en översikt över dina senaste kompetensförändringar +skll#:#skll_lhist_skill_achieved#:#Status $4$ av $3$ tilldelades i $1$. +skll#:#skll_lhist_skill_profile_fulfilled#:#Kompetensprofil $3$ har uppfyllts. +skll#:#skll_lhist_skill_self_eval#:#Status $4$ av $3$ är självtilldelad. +skll#:#skll_lhist_skill_self_eval_in#:#Status $4$ av $3$ var självtilldelad i $1$. +skll#:#skll_new_skill_achievements#:#Du har uppnått följande kompetensnivåer under perioden %1$s till %2$s +skll#:#skll_skill_notification#:#Anmälan Kompetens Utvärdering +skll#:#skll_skill_notification_desc#:#Användare meddelas om ändrade kompetensnivåer. +skmg#:#scat#:#Kategori +skmg#:#skll#:#Kompetens +skmg#:#skmg_360_survey#:#360° undersökning +skmg#:#skmg_add_assignment#:#Tilldela roller/medlemmar +skmg#:#skmg_add_level#:#Lägg till uttryck +skmg#:#skmg_add_local_profile#:#Lägg till lokal profil +skmg#:#skmg_add_profile#:#Lägg till profil +skmg#:#skmg_add_resource#:# Tilldela tidskriftsobjekt +skmg#:#skmg_add_skill#:#Lägg till kompetens +skmg#:#skmg_add_skill_tree#:#Lägg till kompetensträd +skmg#:#skmg_add_user_to_profile#:#Sök efter användare eller roller +skmg#:#skmg_all#:#Alla +skmg#:#skmg_allow_local_profiles#:#Tillåt skapande av lokala profiler +skmg#:#skmg_allow_local_profiles_info#:#Användare med rätt "Redigera inställningar" i kurser och grupper kan skapa lokala kompetensprofiler med hjälp av globalt definierade kompetenser. +skmg#:#skmg_ass_materials_from_workspace#:#Nu kan du tilldela innehåll från dina personliga resurser (t.ex. filer) till kompetenser. Om du nu vill lägga till innehåll i dina personliga resurser, vänligen klicka på följande länk. +skmg#:#skmg_assign_level#:#Tilldela uttryck +skmg#:#skmg_assign_materials#:#Tilldela personliga resurser +skmg#:#skmg_assign_user#:#Tilldela användare +skmg#:#skmg_assigned_objects#:# Tilldelade objekt +skmg#:#skmg_assigned_profiles#:#Tilldelade kompetensprofiler +skmg#:#skmg_assigned_skill_levels#:# Tilldelade kompetensmål +skmg#:#skmg_assigned_users#:# Tilldelade roller och användare +skmg#:#skmg_cannot_delete_nodes_in_use#:#Vissa objekt kan inte raderas eftersom de fortfarande används. +skmg#:#skmg_cert_skill_level_title#:#Title Kompetensnivå +skmg#:#skmg_cert_skill_title#:#Titel Kompetens +skmg#:#skmg_cert_skill_trigger_title#:#Titel Trigger +skmg#:#skmg_confirm_level_resources_removal#:#Vill du verkligen ta bort följande tidningsartiklar från profilen? +skmg#:#skmg_confirm_remove_level_ass#:#Vill du verkligen ta bort följande kompetensnivåer från profilen? +skmg#:#skmg_confirm_user_removal#:#Vill du verkligen ta bort följande användare från profilen? +skmg#:#skmg_cont_profiles_info#:#I denna vy kan du välja kompetensprofiler med kompetensposter som är relaterade till det för närvarande öppnade objektet (kurs/grupp). För att komma till den globala vyn med alla kompetensprofiler som tilldelats dig och alla kompetensposter, klicka på lä +skmg#:#skmg_context_global#:#Global +skmg#:#skmg_context_local#:#Lokalt +skmg#:#skmg_count_references#:#Antal refererade kompetenser +skmg#:#skmg_create_sctp#:#Skapa mall för kategori +skmg#:#skmg_create_skill_category#:#Skapa kategori +skmg#:#skmg_create_skill_template#:#Skapa mall +skmg#:#skmg_create_skill_template_category#:#Skapa mall för kategori +skmg#:#skmg_create_skill_template_reference#:#Infoga mall +skmg#:#skmg_create_skll#:#Skapa kompetens +skmg#:#skmg_custom_image_alt#:#Användardefinierad bild för kompetensprofil +skmg#:#skmg_delete_profiles#:#Vill du verkligen radera följande profiler? +skmg#:#skmg_description_info#:#Beskrivningen är hämtad från mallen. +skmg#:#skmg_edit_level#:#Redigera uttryck +skmg#:#skmg_edit_profile#:#Redigera profil +skmg#:#skmg_edit_scat#:#Ändra kategori +skmg#:#skmg_edit_sctp#:#Redigera mallkategori +skmg#:#skmg_edit_skll#:#Redigera inställningar för kompetens +skmg#:#skmg_edit_sktr#:#Redigera mallreferens +skmg#:#skmg_enable_skmg#:#Möjliggöra kompetenshantering +skmg#:#skmg_eval_type_1#:#Utländsk opinion +skmg#:#skmg_eval_type_2#:#Mätning +skmg#:#skmg_eval_type_3#:#självutvärdering +skmg#:#skmg_eval_type_latest_1#:#Sista externa utvärderingen +skmg#:#skmg_eval_type_latest_2#:#Sista mätningen +skmg#:#skmg_eval_type_latest_3#:#Senaste självutvärdering +skmg#:#skmg_execute_self_evaluation#:#Start +skmg#:#skmg_form_presentation#:#Presentation +skmg#:#skmg_from_lower_to_higher_levels#:#Vänligen ge lägre kompetensnivåer även lägre ordningsnummer. Per rad bör kompetensen öka nedåt. +skmg#:#skmg_hide_profile_self_eval#:#Visa kompetensmål enligt självutvärdering +skmg#:#skmg_hide_profile_self_eval_info#:#För enskilda kompetenser visas kompetensmålet först efter att användaren har gjort en självutvärdering. +skmg#:#skmg_import_skills#:#Import +skmg#:#skmg_input_file#:#Importera fil +skmg#:#skmg_insert_basic_skill_from_clip#:#Klipp in kompetenser från Urklipp. +skmg#:#skmg_insert_please_choose_one_type_only#:#Välj endast en objekttyp. +skmg#:#skmg_insert_skill_category_from_clip#:#Klistra in kategorier från urklipp. +skmg#:#skmg_insert_skill_template_from_clip#:#Klistra in mall från urklipp +skmg#:#skmg_insert_skill_template_reference_from_clip#:#Klipp in mallreferens från urklipp +skmg#:#skmg_insert_template_category_from_clip#:#Klistra in mallkategori från urklipp +skmg#:#skmg_items#:#Inträden +skmg#:#skmg_level#:#Uttryck +skmg#:#skmg_list_skills#:#Lista kompetenser +skmg#:#skmg_local_assignment_profiles#:#Tillåt lokal tilldelning av globala profiler +skmg#:#skmg_lp_triggers_level#:#Sätts av status 'Redigerad' +skmg#:#skmg_materials#:#Personliga resurser +skmg#:#skmg_materials_resources#:#Innehåll för lärande +skmg#:#skmg_new_level#:#Nytt uttryck +skmg#:#skmg_new_sktr#:#Ny mallreferens +skmg#:#skmg_next_step#:#Nästa steg +skmg#:#skmg_no_nodes_selectable#:#Inga kompetenser kan väljas för närvarande. +skmg#:#skmg_no_skill_entries#:#Du har ännu inga poster för denna kompetens. +skmg#:#skmg_no_skills#:#Ingen kompetens +skmg#:#skmg_no_skills_selected_info#:#Du har ännu inte valt eller förvärvat några kompetenser. Klicka på knappen "Lägg till kompetens" för att välja en kompetens. Du kan lägga till så många kompetenser som du vill. Om du förvärvar kompetenser genom att redigera lärandeinnehåll kommer de auto +skmg#:#skmg_no_trigger#:#Ingen utlösare +skmg#:#skmg_nr#:#Nej +skmg#:#skmg_number#:#Nummer +skmg#:#skmg_open_all_assigned_profiles#:#Öppna alla tilldelade kompetensprofiler +skmg#:#skmg_order#:#Beställ +skmg#:#skmg_order_nr#:#Nummer +skmg#:#skmg_order_nr_info#:#placerar kompetensen i listan över kompetenser. +skmg#:#skmg_please_select_self_skill#:#Ny självutvärdering +skmg#:#skmg_please_select_your_skill_levels#:#Välj dina färdigheter! +skmg#:#skmg_previous_step#:#Föregående steg +skmg#:#skmg_profile#:#Profil +skmg#:#skmg_really_delete_levels#:#Bör följande kompetensnivåer verkligen tas bort? +skmg#:#skmg_really_remove_skills#:#Vill du verkligen ta bort följande behörigheter? +skmg#:#skmg_recommended_learning_material_crs#:#Lärandeinnehåll i kursen för att uppnå målet +skmg#:#skmg_recommended_learning_material_global#:#Lärandeinnehåll för att uppnå målet +skmg#:#skmg_recommended_learning_material_grp#:#Lärandeinnehåll i gruppen för att uppnå målet +skmg#:#skmg_recommended_learning_material_info#:#Välj exakt ett av följande läranderesultat. Arbeta med det för att uppnå kompetensmålet. +skmg#:#skmg_refresh_view#:#Uppdatera vy +skmg#:#skmg_remove_levels#:#Ta bort egenskaper +skmg#:#skmg_remove_skill#:#Ta bort kompetens +skmg#:#skmg_remove_skills#:#Ta bort kompetens +skmg#:#skmg_remove_trigger#:#Ta bort utlösaren +skmg#:#skmg_resources#:#Magasinobjekt +skmg#:#skmg_save_order#:#Spara sekvens +skmg#:#skmg_save_self_evaluation#:#Fullständig självutvärdering +skmg#:#skmg_save_settings#:#Spara inställningar +skmg#:#skmg_sctp#:#Mall för kategori +skmg#:#skmg_select_skill#:#Klicka på en kompetens för att lägga till den till dina personliga kompetenser. +skmg#:#skmg_select_skill_level_assign#:#Vänligen välj en kompetens. +skmg#:#skmg_select_trigger#:#Välj utlösare +skmg#:#skmg_selectable#:#Väljbar +skmg#:#skmg_selectable_info#:#Tillåter användare att lägga till kompetensen som en personlig kompetens. +skmg#:#skmg_selected_items_have_been_copied#:#De markerade objekten har kopierats. +skmg#:#skmg_selected_items_have_been_cut#:#De valda objekten klipptes ut. +skmg#:#skmg_selected_skills#:#Utvalda kompetenser +skmg#:#skmg_self_evaluation#:#självutvärdering +skmg#:#skmg_self_evaluation_byline#:#Självutvärderingen beaktas inte i uppnåendet av ditt kompetensmål. Den är avsedd för orienteringsändamål. +skmg#:#skmg_self_evaluations#:#självutvärderingar +skmg#:#skmg_settings#:#Kompetenshantering Inställningar +skmg#:#skmg_show_all#:#Visa alla +skmg#:#skmg_show_latest_entries#:#Visa de senaste inmatningarna +skmg#:#skmg_skill#:#Kompetens +skmg#:#skmg_skill_in_use#:#Den här kompetensen används av användare eller innehåll. Därför är inte alla åtgärder tillgängliga. Kom ihåg att alla ändringar påverkar befintliga användningar. +skmg#:#skmg_skill_level#:#Kompetensnivå +skmg#:#skmg_skill_level_trigger#:#Trigger +skmg#:#skmg_skill_levels#:#Kompetensnivåer +skmg#:#skmg_skill_management_deactivated#:#Competency management är för närvarande avaktiverat. +skmg#:#skmg_skill_needs_impr_no_res#:#Du behöver förbättra denna kompetens. Tyvärr finns det för närvarande inget lämpligt utbildningsinnehåll som matchar ditt kompetensmål. +skmg#:#skmg_skill_needs_impr_res#:#Du behöver förbättra denna kompetens. Följande utbildningsinnehåll motsvarar ditt kompetensmål. +skmg#:#skmg_skill_needs_self_eval#:#Gör en självutvärdering först så att ditt kompetensmål visas. +skmg#:#skmg_skill_needs_self_eval_box#:#Observera att för minst en kompetens i denna profil har ingen självutvärdering genomförts ännu. Du kommer att få se kompetensmålet för de berörda kompetenserna så snart en självutvärdering har genomförts. +skmg#:#skmg_skill_no_needs_impr#:#Kompetensmålet uppfyllt! +skmg#:#skmg_skill_no_needs_impr_info#:#Du har uppfyllt målet för denna kompetens. +skmg#:#skmg_skill_overview#:#Översikt +skmg#:#skmg_skill_profile_records#:#Kompetens anmälningar +skmg#:#skmg_skill_profiles#:#Kompetensprofiler +skmg#:#skmg_skill_template#:#Mall +skmg#:#skmg_skill_templates#:#Mallar +skmg#:#skmg_skill_tree#:#Kompetens träd +skmg#:#skmg_skill_trees#:#Kompetens träd +skmg#:#skmg_skills#:#Kompetens +skmg#:#skmg_sktr#:#Mall för referens +skmg#:#skmg_status#:#Status +skmg#:#skmg_status_draft#:#In förberedelse (Offline) +skmg#:#skmg_status_draft_info#:#Entry visas inte för användare. +skmg#:#skmg_status_outdated#:#Veraltet +skmg#:#skmg_status_outdated_info#:#Posten kan inte längre väljas av användaren som en ny personlig kompetens. Om kompetensen redan valts tidigare kvarstår detta val. +skmg#:#skmg_status_publish#:#Publicerad +skmg#:#skmg_status_publish_info#:#Kompetensen kan användas av användare om alla överordnade poster också är frisläppta. +skmg#:#skmg_suggested#:#Visa som innehåll för lärande +skmg#:#skmg_suggested_resources#:#Allokerade tidskriftsföremål +skmg#:#skmg_sure_delete_self_evaluation#:#Vill du verkligen ta bort följande självutvärderingar? +skmg#:#skmg_target_level#:#Kompetensmål +skmg#:#skmg_target_levels#:#Kompetensmål +skmg#:#skmg_trigger#:#Trigger +skmg#:#skmg_type#:#Typ +skmg#:#skmg_type_of_formation#:#Typ av undersökning +skmg#:#skmg_update_order#:#Spara sekvens +skmg#:#skmg_usage#:#Använda +skmg#:#skmg_usage_obj_objects#:#Objekt(en) +skmg#:#skmg_usage_obj_profiles#:#Profil(er) +skmg#:#skmg_usage_obj_users#:#Användare +skmg#:#skmg_usage_type_info_gen#:#Allmän användning i tidningsobjekt +skmg#:#skmg_usage_type_info_mat#:#Användare har tilldelats personliga resurser +skmg#:#skmg_usage_type_info_pers#:#Väljs av användare som en personlig kompetens +skmg#:#skmg_usage_type_info_prof#:#Användning i kompetensprofiler +skmg#:#skmg_usage_type_info_res#:#Uppdrag till magasinobjekt +skmg#:#skmg_usage_type_info_user#:#Uppdrag till användare +skmg#:#skmg_your_self_evaluation#:#Din självutvärdering +style#:#Style#:#Stil +style#:#adapt_icon#:#Anpassning av ikonerna +style#:#adapt_icon_description#:#Justera ikonens färg eller ikon. +style#:#adapt_icons#:#Justering av ikonernas färger +style#:#adapt_icons_description#:#Alla svg-ikoner som finns i mappen Bilder listas här. Om en färg ändras syns detta omedelbart i alla ikoner som listas här. +style#:#adapt_less#:#Anpassning av Less-filen +style#:#adapt_less_description#:#Detta är representationen av alla mindre variabler från den aktuella huden. Variabelnamn och beskrivningar läses direkt från filerna och är därför endast tillgängliga på originalspråket. Den valda stilen kompileras om helt när variablerna uppdateras/åter +style#:#add_substyle#:#Ny Sub Style +style#:#add_system_style#:#Ny systemstil +style#:#assignment#:#Allokering +style#:#blue_color#:#Blauton +style#:#blue_colors#:#Blå färger +style#:#blue_colors_description#:#Beskrivning av Blauton +style#:#can_not_read_less_file#:#Less-filen kan inte läsas. Väg +style#:#cant_deactivate_default_style#:#Standard Styles kan inte avaktiveras. +style#:#cant_delete_activated_style#:#Aktiva stilar kan inte tas bort. +style#:#cant_delete_if_users_assigned#:#Styles kan inte raderas så länge som användare har tilldelats dem. +style#:#cant_delete_style_with_substyles#:#Styles med sub-styles kan inte raderas. +style#:#change_icon#:#Ändra ikon +style#:#color#:#Färg +style#:#color_changed_from#:#Färg ändrad från +style#:#color_changed_to#:#till +style#:#color_reset#:#Färgerna på ikonerna har återställts. Viktigt +style#:#color_update#:#Färgerna på ikonerna har uppdaterats. Viktigt +style#:#default_style_set_to#:#Standardstilen har ändrats till +style#:#dir_copied_from#:#Mappen kopierades från +style#:#dir_deleted#:#Följande mapp har tagits bort +style#:#dir_preserved_linked#:#Bevarade länkar +style#:#directory_created#:#Folder skapad +style#:#documentation#:#Dokumentation +style#:#edit_by_color#:#Redigera efter färg +style#:#edit_by_icon#:#Redigera med ikon +style#:#enable_system_styles_management_no_write_perm#:#System styles management" är aktiverat. ILIAS har dock ingen skrivåtkomst till katalogen customising/global/skin. Därför kan inga nya stilar skapas/redigeras. +style#:#entries_reloaded#:#Alla poster har uppdaterats +style#:#file_deleted#:#Följande fil har tagits bort +style#:#font_dir#:#Font mapp +style#:#font_dir_description#:#Mapp för att spara teckensnitt från det relevanta skinnet. Denna mapp kan delas med andra stilar och understilar. +style#:#from_skin#:#från huden +style#:#green_color#:#GrönTon +style#:#green_colors#:#Gröna färger +style#:#green_colors_description#:#Grön Tonbeskrivning +style#:#grey_color#:#Grå ton +style#:#grey_colors#:#Grå färger +style#:#grey_colors_description#:#Grå ton Beskrivning +style#:#icons#:#Ikoner +style#:#icons_gallery#:#Icon Gallery +style#:#image_dir#:#Icon folder +style#:#image_dir_description#:#Mapp för att spara bilder (främst ikoner) av skinnet i fråga. Denna mapp kan delas med andra stilar och understilar. +style#:#in_main_less_file#:#importeras inte i filen System Styles Main Less +style#:#invalid_less_path#:#Den angivna sökvägen till lessc är ogiltig eller kan inte läsas och exekveras av webbservern. Lessc-filen under den angivna sökvägen (eller den länkade filen om sökvägen hänvisar till en symbolisk länk) måste kunna läsas och exekveras av webbservern. +style#:#ks_documentation_of_style#:#Dokumentärer om "Kitchen Sink" efter stil +style#:#ks_documentation_of_substyle#:#"Kitchen Sink"-dokumentation efter understil +style#:#less#:#Less +style#:#less_can_not_be_modified#:#Less kan inte ändras. +style#:#less_compile_failed#:#Less-filen kunde inte kompileras. Lessc måste vara installerat och sökvägen i ILIAS setup måste vara korrekt angiven. +style#:#less_file_reset#:#De mindre variablerna har återställts. Viktigt +style#:#less_file_updated#:#De mindre variablerna har uppdaterats. Viktigt +style#:#less_less_installation_detected#:#Läs installationen hittades +style#:#less_variable_empty#:#Inget värde angavs för denna variabel. Värdet från variables.less har nu laddats in. Kontrollera detta fält innan du komplicerar. +style#:#less_variables_empty_might_have_changed#:#Less variabler utan värde inkluderades i formuläret. Orsaken kan vara att filen variables.less har ändrats sedan formuläret laddades. De tomma variablerna ersattes med värdena från filen variables.less och markerades. Kontrollera dessa värden innan du ko +style#:#less_variables_file_not_included#:#Den mindre variabla filen +style#:#manage_system_styles#:#Hantera systemets stilar +style#:#msg_sub_style_created#:#Understilen har skapats. +style#:#msg_sys_style_created#:#Den nya systemstilsfilen har skapats framgångsrikt. +style#:#msg_sys_style_update#:#Systemstilar har uppdaterats. +style#:#no_less_path_set#:#Less-katalogen är inte angiven. +style#:#no_style_selected#:#Ingen understil har valts. +style#:#of_parent#:#från förälder +style#:#open_documentation#:#Öppen dokumentation +style#:#parent#:#Parent stil +style#:#personal#:#Personlig +style#:#personal_style_set_to#:#Den personliga stilen ändrades till +style#:#preview#:#Förhandsgranskning +style#:#provided_less_path#:#Specificerad lessc path +style#:#red_color#:#ton +style#:#red_colors#:#Röda färger +style#:#red_colors_description#:#Beskrivning av Rotton +style#:#refresh_entries#:#Uppdatera poster +style#:#remove_assignment#:#Ta bort uppdrag +style#:#reset_icons#:#Återställ färger +style#:#reset_variables#:#Återställ variabler +style#:#scope#:#Validitetsintervall +style#:#select_icon#:#Selektiv ikon +style#:#settings_of_style#:#Hantera Styles +style#:#settings_of_substyle#:#Hantera understil +style#:#skin#:#Hud +style#:#skin_deleted#:#Följande hud har tagits bort +style#:#skin_id#:#Hud-ID +style#:#skin_id_description#:#Skins är behållare för stilar och understilar. Skin-ID:t anger namnet på mappen som innehåller all information om stilar och understilar. Skin-ID:t får endast bestå av bokstäver, siffror och bindestreck. +style#:#skin_id_exists#:#Det finns redan en skin med detta ID. +style#:#skin_name#:#Titel på hud +style#:#skin_name_description#:#Skin-titeln kan användas som en beskrivning för applikationsområdet. Den listas i alla gränssnittselement där ett skin kan väljas. +style#:#skin_version#:#Hudversion +style#:#skin_version_description#:#Hudversionen används för att cachelagra stilarna igen efter ändringar. Den uppdateras automatiskt. +style#:#sound_dir#:#Audio-mapp +style#:#sound_dir_description#:#Mapp för att spara toner från den relevanta huden. Denna mapp kan delas med andra stilar och understilar. +style#:#sty_acopy#:#Kopia +style#:#sty_add_assignment#:#Lägg till uppdrag +style#:#sty_add_characteristic#:#Lägg till ny stil +style#:#sty_add_color#:#Lägg till färg +style#:#sty_add_content_style#:#Lägg till Content-stil +style#:#sty_add_image#:#Lägg till bild +style#:#sty_add_media_query#:#Lägg till Media Query +style#:#sty_add_media_query_info#:#Till exempel "only screen and (max-width +style#:#sty_add_pgl#:#Lägg till sidlayout +style#:#sty_add_template#:#Lägg till mall +style#:#sty_added_characteristic#:#Ny stil tillagd. +style#:#sty_all#:#Alla +style#:#sty_all_styles_obligatory#:#Alla valda stilklasser måste alltid finnas och kan inte tas bort. +style#:#sty_assign_categories#:#Tilldela kategorier +style#:#sty_background#:#Bakgrund +style#:#sty_background_attachment#:#Beteende Bakgrund +style#:#sty_background_color#:#Bakgrundsfärg +style#:#sty_background_image#:#Bakgrundsbild +style#:#sty_background_position#:#Bakgrundsposition +style#:#sty_background_repeat#:#Upprepa effekt +style#:#sty_base_color#:#Basisk färg +style#:#sty_based_on#:#Baserat på +style#:#sty_bg_img_info#:#För att inkludera bilder i urvalet måste de först laddas upp i avsnittet "Bilder" i stilen. +style#:#sty_border#:#Ram +style#:#sty_border_color#:#Frame färg +style#:#sty_border_style#:#Typ av ram +style#:#sty_border_width#:#Ramens tjocklek +style#:#sty_bottom#:#Botten +style#:#sty_ca_cntr_class#:#Carousel - Behållare +style#:#sty_ca_icntr_class#:#Carousel - Elementbehållare +style#:#sty_ca_icont_class#:#Carousel - Innehållselement +style#:#sty_ca_ihead_class#:#Carousel - Rubrikelement +style#:#sty_caption#:#Legend +style#:#sty_caption_class#:#Legend +style#:#sty_carousel_templates#:#karusellmallar +style#:#sty_cat_assignments#:#Uppgifter Stil Kategori +style#:#sty_characteristic_already_exists#:#En klass för en stil med detta namn finns redan i denna formatmall. +style#:#sty_class#:#Stil klass +style#:#sty_class_name#:# Klassens namn +style#:#sty_clear#:#Avsluta textflöde +style#:#sty_col_foot_class#:#Fot (kolumner) +style#:#sty_col_head_class#:#Huvud (kolumner) +style#:#sty_color#:#Färg +style#:#sty_color_already_exists#:#En färg med detta namn finns redan i denna formatmall. +style#:#sty_color_code#:#Färgkod +style#:#sty_color_flavors#:#Färganvisningar +style#:#sty_color_info#:#Fördefinierade färgscheman underlättar återanvändning av färger för olika tillämpningar. Hänvisa till en fördefinierad färg genom att använda dess namn föregånget av "!" för alla färggraderingar. För att använda en gradering, ange värdet för graderingen +style#:#sty_color_name#:#Färgens namn +style#:#sty_colors#:#Färger +style#:#sty_commands#:#Åtgärder +style#:#sty_confirm_char_deletion#:#Är du säker på att du vill ta bort följande stilklasser? +style#:#sty_confirm_color_deletion#:#Bekräfta borttagandet av färgen +style#:#sty_confirm_del_ind_styles#:#Bekräfta borttagningen av den lokala utbildningsmodulens formatmallar +style#:#sty_confirm_del_ind_styles_desc#:#Alla utbildningsmoduler med lokala formatmallar har tilldelats stilen '%s'. De lokala inlärningsmodulernas stilmallar raderas därför också. Vill du fortsätta? +style#:#sty_confirm_template_deletion#:#Bekräfta strykningen av mallen +style#:#sty_copied_please_select_target#:#Stilklasserna har kopierats. Växla till önskad målstil och välj "Klistra in stilklasser". +style#:#sty_copy_other_stylesheet#:#Kopiera formatmall från lokal källa +style#:#sty_copy_other_system_style#:#Kopiera systemets stil +style#:#sty_copy_to#:#till +style#:#sty_create_ind_style#:#Create lokal formatmall +style#:#sty_create_new_class#:#Skapa ny klass +style#:#sty_create_new_stylesheet#:#Skapa ny formatmall +style#:#sty_create_new_system_style#:#Skapa ny systemstil +style#:#sty_create_new_system_sub_style#:#Skapa ny understil +style#:#sty_create_pgl#:#Skapa sidlayout +style#:#sty_cursor#:#Musens pekare +style#:#sty_custom#:#Fler CSS-regler +style#:#sty_custom_par#:#Ytterligare parametrar +style#:#sty_custom_par_info#:#Definiera ytterligare parametrar i formatet "Parameter +style#:#sty_default#:#Standard +style#:#sty_default_style#:#Standard formatmall +style#:#sty_del_template#:#Ta bort mallar och klasser +style#:#sty_del_template_keep_classes#:#Ta bort och hämta stilmallsklass +style#:#sty_delete_other_selected#:#Fortsättning +style#:#sty_disable_auto_margins#:#Suppress automatic spacing +style#:#sty_disable_auto_margins_info#:#Undertrycker den automatiska inställningen av vänster och höger avstånd till 0 pixlar när mediaobjekt är vänster- eller högerjusterade. +style#:#sty_edit_template#:#Redigera mall +style#:#sty_even_col_class#:#Inkluderar kolumner +style#:#sty_even_row_class#:#Inklusive linjer +style#:#sty_example#:#Exempel +style#:#sty_flist_char#:# Lista över filer +style#:#sty_float#:#Flöde +style#:#sty_font_family#:#Font +style#:#sty_font_size#:#Fontstorlek +style#:#sty_font_style#:#Skrivstil +style#:#sty_font_variant#:#Font variant +style#:#sty_font_weight#:#Font vikt +style#:#sty_from#:#Från +style#:#sty_generate_template#:#Skapa mall +style#:#sty_glo_char#:#Ordlista +style#:#sty_ha_cntr_class#:#Hor. Dragspel behållare +style#:#sty_ha_icntr_class#:#Hor. Dragspel element behållare +style#:#sty_ha_icont_class#:#Hor. Dragspel element innehåll +style#:#sty_ha_ihcap_class#:#Hor. Ackord element rubrik +style#:#sty_ha_ihead_class#:#Hor. Ackord element rubrik +style#:#sty_ha_iheada_class#:#Hor. Dragspel element huvud (aktiv) +style#:#sty_haccordion_templates#:#Hor. Mallar för ackordelement +style#:#sty_height#:#Höjd +style#:#sty_hide#:#Dölj +style#:#sty_horizontal#:#Horisontell +style#:#sty_if_style_class_already_exists#:#Hur går man vidare om stilklassen redan finns? +style#:#sty_image_file#:#Image-fil +style#:#sty_images#:#Bilder +style#:#sty_import_page_layout#:#Importera sidlayout +style#:#sty_import_stylesheet#:#Importera formatmall +style#:#sty_import_system_style#:#Stil för importsystem +style#:#sty_individual_styles#:#Lokala formatmallar +style#:#sty_keep_existing#:#Behåll befintlig klass +style#:#sty_left#:#Länkar +style#:#sty_left_right_padding#:#Inre avstånd vänster/höger +style#:#sty_letter_spacing#:#Teckenavstånd +style#:#sty_lightness_border#:#Brightness ram +style#:#sty_lightness_cell1_bg#:#Brightness Cell 1 Bakgrund +style#:#sty_lightness_cell1_text#:# ljusstyrka cell 1 text +style#:#sty_lightness_cell2_bg#:#Brightness Cell 2 Bakgrund +style#:#sty_lightness_cell2_text#:# ljusstyrka cell 2 text +style#:#sty_lightness_header_bg#:#Brightness Rubrik Bakgrund +style#:#sty_lightness_header_text#:#Brightness Rubrik Text +style#:#sty_line_height#:#Linjens höjd +style#:#sty_link_char#:#Länk +style#:#sty_list_char#:#Lista +style#:#sty_make_global_default#:#Standardstil +style#:#sty_make_global_fixed#:#Tvingad stil för alla objekt +style#:#sty_margin#:#Yttre fälg +style#:#sty_margin_and_padding#:#Yttermarginal och inneravstånd +style#:#sty_media_char#:#Media +style#:#sty_media_queries#:#Medieförfrågningar +style#:#sty_media_query_info#:#För varje mediafråga infogas ett separat CSS-avsnitt efter standardavsnittet (utan mediafråga). +style#:#sty_min_height#:#Minsta höjd +style#:#sty_move_lm_styles#:#Ändra formatmallarna för utbildningsmodulerna +style#:#sty_move_style#:#Ändra formatmall +style#:#sty_move_user_styles#:#Ändra stilmall för användarna +style#:#sty_msg_characteristic_must_only_include#:#Titeln på stilen måste börja med en bokstav och får inte innehålla några mellanslag utan endast följande tecken +style#:#sty_msg_color_must_only_include#:#Färgnamnet får endast innehålla följande bokstäver/tecken +style#:#sty_msg_input_must_be_numeric#:#Numerisk inmatning krävs. +style#:#sty_name#:#Namn +style#:#sty_nr_learning_modules#:#Antal utbildningsmoduler +style#:#sty_odd_col_class#:#Even kolumner +style#:#sty_odd_row_class#:#Odd linjer +style#:#sty_opacity#:#Täckning av makt +style#:#sty_opt_saved#:#Inställningar sparade +style#:#sty_order#:#Beställ +style#:#sty_outdated#:#Veraltet +style#:#sty_overflow#:#Överflöde +style#:#sty_overwrite#:#Överskrivning +style#:#sty_overwrite_existing_class#:#Överskriv befintlig klass +style#:#sty_padding#:#Internt avstånd +style#:#sty_page_char#:#Sida +style#:#sty_parameters#:#Parametrar +style#:#sty_paste_characteristics#:#Inför stilklasser +style#:#sty_paste_chars#:#Infoga klasser +style#:#sty_paste_style_classes#:#Inför stilklasser +style#:#sty_position#:#Position +style#:#sty_positioning#:#Positionering +style#:#sty_preview#:#Förhandsgranskning +style#:#sty_query#:#Query +style#:#sty_question_char#:#Frågor och svar +style#:#sty_remove_global_default_state#:#Upphäv status som global standard +style#:#sty_remove_global_fixed_state#:#Fixa inte standarden +style#:#sty_remove_outdated#:#Ta bort statusen "Föråldrad" +style#:#sty_resize#:#Justera bildstorlek +style#:#sty_resize_image#:#Justera bildstorlek +style#:#sty_right#:#Höger +style#:#sty_row_foot_class#:#Fot (linjer) +style#:#sty_row_head_class#:#Huvud (rader) +style#:#sty_rte_char#:#SCORM RTE +style#:#sty_save_active_styles#:#Spara aktiva formatmallar +style#:#sty_save_hide_order_status#:#Spara seriens ordning och status +style#:#sty_save_hide_status#:#Status Spara +style#:#sty_save_order#:#Spara sekvens +style#:#sty_save_order_status#:#Spara sekvens +style#:#sty_sco_char#:#SCOs och lärandemål +style#:#sty_scope#:#Tillämpningsområde +style#:#sty_section_char#:#Blockera +style#:#sty_set_outdated#:# Markera som "föråldrad +style#:#sty_set_scope#:#Sätt omfattning +style#:#sty_some_styles_obligatory_delete_rest#:#Följande stilklasser måste alltid finnas och kan inte tas bort. Vill du fortsätta och ta bort de återstående stilklasserna? +style#:#sty_source#:#Källa +style#:#sty_special#:#Särskild +style#:#sty_style_chars#:#Stil klass +style#:#sty_style_class#:#Klasser för stil +style#:#sty_style_classes_copied#:#Style-klasser kopierades. +style#:#sty_substyle#:#Stil för ett delområde +style#:#sty_substyle_of#:#Sub-Style från +style#:#sty_substyles#:#Stil för ett delområde +style#:#sty_sure_del_mqueries#:#Vill du verkligen ta bort den här mediafrågan och de tillhörande CSS-reglerna? +style#:#sty_switch#:#Förändring +style#:#sty_table_char#:#Tabell +style#:#sty_table_class#:#Tabell stil klass +style#:#sty_table_template_bw_zebra#:#Grå zebraövergång +style#:#sty_table_template_colored_zebra#:#Färgade zebraränder +style#:#sty_table_template_no_zebra#:#Inga övergångsställen +style#:#sty_table_templates#:#Tabellmallar +style#:#sty_tabs_char#:#Accordions och fans +style#:#sty_tag_hover#:# +style#:#sty_tag_normal#:#Normal +style#:#sty_template_layout#:#Layout för mallar +style#:#sty_template_name#:#Namn +style#:#sty_templates#:#Mallar +style#:#sty_text#:#Text +style#:#sty_text_align#:#Horisontell justering +style#:#sty_text_block_char#:#Text (block) +style#:#sty_text_decoration#:#Text dekoration +style#:#sty_text_indent#:#Indragning av text +style#:#sty_text_inline_char#:#Text (tecken) +style#:#sty_text_transform#:#Texttransformation +style#:#sty_titles#:#Titel +style#:#sty_to#:#Efter +style#:#sty_top#:#Topp +style#:#sty_top_bottom_padding#:#Internt avstånd topp/botten +style#:#sty_transform#:#Konvertera +style#:#sty_transform_origin#:#Konvertera original +style#:#sty_type#:#Typ +style#:#sty_type_ca_cntr#:#Carousel - Behållare +style#:#sty_type_ca_icntr#:#Carousel - Elementbehållare +style#:#sty_type_ca_icont#:#Carousel - Innehållselement +style#:#sty_type_ca_ihead#:#Carousel - Rubrikelement +style#:#sty_type_code_block#:#Kod (Block) +style#:#sty_type_code_inline#:#Kod (Inline) +style#:#sty_type_flist#:# Lista över filer +style#:#sty_type_flist_a#:#Länk fil lista post +style#:#sty_type_flist_cont#:#Fil lista container +style#:#sty_type_flist_head#:#Fil list rubrik +style#:#sty_type_flist_li#:#Post i fillista +style#:#sty_type_glo_ovclink#:#Glossary Stäng länk +style#:#sty_type_glo_overlay#:#Glossar popup +style#:#sty_type_glo_ovtitle#:#Term/Title (popup-fönster) +style#:#sty_type_glo_ovuglink#:#termlink +style#:#sty_type_glo_ovuglistlink#:#Länk i termlista +style#:#sty_type_ha_cntr#:#Hor. Dragspel behållare +style#:#sty_type_ha_icntr#:#Hor. Dragspel element behållare +style#:#sty_type_ha_icont#:#Hor. Dragspel element innehåll +style#:#sty_type_ha_ihcap#:#Hor. Ackord element rubrik +style#:#sty_type_ha_ihead#:#Hor. Ackord element rubrik +style#:#sty_type_ha_iheada#:#Hor. Dragspel element huvud (aktiv) +style#:#sty_type_heading1#:#Rubrik 1 +style#:#sty_type_heading2#:#Rubrik 2 +style#:#sty_type_heading3#:#Rubrik 3 +style#:#sty_type_iim#:#Popup för innehåll i interaktiv bild +style#:#sty_type_link#:#Länk +style#:#sty_type_list_item#:#Listpost +style#:#sty_type_list_o#:#Numrerad lista +style#:#sty_type_list_u#:#Bulletlista +style#:#sty_type_marker#:#Markeringspunkt Interaktiv bild +style#:#sty_type_media_caption#:#Märkning +style#:#sty_type_media_cont#:#media behållare +style#:#sty_type_page_bnav#:#Navigation nedan +style#:#sty_type_page_cont#:#Pagecontainer +style#:#sty_type_page_fn#:#Fotnot +style#:#sty_type_page_frame#:#Sida ram +style#:#sty_type_page_lnav#:#Navigation vänster +style#:#sty_type_page_lnavimage#:#Bildnavigering vänster +style#:#sty_type_page_lnavlink#:#Länk Navigering vänster +style#:#sty_type_page_rnav#:#Navigation höger +style#:#sty_type_page_rnavimage#:#Bildnavigering till höger +style#:#sty_type_page_rnavlink#:#Länk navigering höger +style#:#sty_type_page_title#:#Sidans titel +style#:#sty_type_page_tnav#:#Navigation topp +style#:#sty_type_qanswer#:#Svar +style#:#sty_type_qetcorr#:#Korrigerad feltext +style#:#sty_type_qetitem#:#Fel textelement +style#:#sty_type_qfeedr#:#Feedback, höger +style#:#sty_type_qfeedw#:#Feedback, fel +style#:#sty_type_qimg#:#Fråga bild +style#:#sty_type_qimgd#:#Länk för bildinformation +style#:#sty_type_qinput#:# Textinmatning +style#:#sty_type_qlinput#:#Lång textinmatning +style#:#sty_type_qordli#:#Ange punktlista +style#:#sty_type_qordul#:#Uppräkningslista +style#:#sty_type_qover#:#Frågeformulär +style#:#sty_type_qsubmit#:#Knapp för omkoppling +style#:#sty_type_qtitle#:#Frågans titel +style#:#sty_type_question#:#Fråga +style#:#sty_type_rte_drag#:#Flytta bar +style#:#sty_type_rte_menu#:#RTE meny +style#:#sty_type_rte_mlink#:#RTE menylänk +style#:#sty_type_rte_node#:#RTE trädnod +style#:#sty_type_rte_status#:#RTE-status +style#:#sty_type_rte_tclink#:#Kontrollera länkträdet +style#:#sty_type_rte_texp#:#Icon träd +style#:#sty_type_rte_tli#:#Ingång i trädvy +style#:#sty_type_rte_tlink#:#RTE länk till trädnod +style#:#sty_type_rte_tree#:#RTE trädval +style#:#sty_type_rte_tul#:#Trädvy +style#:#sty_type_sco_desc#:#SCO beskrivning +style#:#sty_type_sco_fmess#:#SCORM Slutligt meddelande +style#:#sty_type_sco_keyw#:#SCO nyckelord +style#:#sty_type_sco_obj#:#SCO Lärandemål +style#:#sty_type_sco_title#:#SCO-titel +style#:#sty_type_section#:#Blockera +style#:#sty_type_sub#:#Djupgående +style#:#sty_type_sup#:#Höjdmarkerad +style#:#sty_type_table#:#Tabell +style#:#sty_type_table_cell#:#Tabellcell +style#:#sty_type_text_block#:#Text (block) +style#:#sty_type_text_inline#:#karaktärer +style#:#sty_type_va_cntr#:#Vert. Dragspelsbehållare +style#:#sty_type_va_icntr#:#Vert. Dragspel element behållare +style#:#sty_type_va_icont#:#Vert. Dragspel element innehåll +style#:#sty_type_va_ihcap#:#Vert. Dragspel element rubrik +style#:#sty_type_va_ihead#:#Vert. Dragspel element huvud +style#:#sty_type_va_iheada#:#Vert. Dragspel element huvud (aktiv) +style#:#sty_va_cntr_class#:#Vert. Dragspelsbehållare +style#:#sty_va_icntr_class#:#Vert. Dragspel element behållare +style#:#sty_va_icont_class#:#Vert. Dragspel element innehåll +style#:#sty_va_ihcap_class#:#Vert. Dragspel element rubrik +style#:#sty_va_ihead_class#:#Vert. Dragspel element huvud +style#:#sty_va_iheada_class#:#Vert. Dragspel element huvud (aktiv) +style#:#sty_vaccordion_templates#:#Vert. Dragspelsmallar +style#:#sty_vertical#:#Vertikal +style#:#sty_vertical_align#:#Vertikal inriktning +style#:#sty_white_space#:#Leerzeile +style#:#sty_width#:#Bredd +style#:#sty_width_height#:#Bredd x Höjd +style#:#sty_word_spacing#:#Avstånd mellan ord +style#:#style#:#Stil +style#:#style_assignments_deleted#:#Styletilldelningar för följande understil har tagits bort +style#:#style_copied#:#Style har kopierats framgångsrikt. +style#:#style_current_style#:#Tidsstil +style#:#style_delete_style#:#Radera Stil +style#:#style_deleted#:#Borttagen stil +style#:#style_edit_style#:#Redigera stil +style#:#style_id#:#Stil-ID +style#:#style_id_description#:#Stil-ID:t används för stilspecifika css- och less-filer under skin-mappen. Stil-ID:t får endast bestå av bokstäver, siffror och bindestreck. +style#:#style_imported#:#Style har framgångsrikt importerats till +style#:#style_name#:#Style titel +style#:#style_name_description#:#Stiltiteln kan användas som en beskrivning för applikationsområdet. Den listas i alla gränssnittselement där en skin kan väljas. +style#:#style_not_deleted#:#Stilen kunde inte raderas av följande skäl +style#:#style_page_layout_module_learning_module#:#ILIAS utbildningsmodul +style#:#style_page_layout_module_portfolio#:#Portfölj +style#:#style_page_layout_module_scorm#:#SCORM +style#:#style_support_reuse#:#Återanvändning +style#:#style_support_reuse_info#:#Underobjekt till denna container kan också använda innehållsstilen. +style#:#styles_not_deleted#:#Stilarna kunde inte tas bort av följande skäl +style#:#sub_style#:#Sub-Stil +style#:#sub_style_id#:#Sub Stil ID +style#:#sub_style_id_description#:#Understilens ID används för relevanta css- och less-filer. Dessa finns inuti den relevanta skin-mappen. Understilens ID får endast bestå av bokstäver, siffror och bindestreck. +style#:#sub_style_name#:#Sub Stilnamn +style#:#sub_style_name_description#:#Understilsnamnet kan användas som en beskrivning för applikationsområdet. Det listas i alla gränssnittselement som tillåter val av hud. +style#:#sub_style_parent_style_description#:#Sub-styles är tilldelade exakt en överordnad stil. De visas endast för användare som också har tillgång till den överordnade stilen. Den överordnade stilen för en understil kan bara tilldelas en gång under skapandet av understilen. +style#:#system_style_activation#:#Systemstil aktiverad +style#:#system_style_activation_description#:#Denna systemstil kan användas i ILIAS +style#:#system_style_default_description#:#Om den är aktiverad ställs denna stil in som systemets standardstil. Systemets standardstil används om användaren ännu inte har tilldelat en egen stil eller om användaren inte är inloggad. +style#:#system_style_personal_description#:#Om den är aktiverad ställs denna stil in som en personlig stil. Detta är en bra hjälp om du vill följa aktuella ändringar av huden. +style#:#update_colors#:#Uppdatera färger +style#:#update_icon#:#Uppdatera ikon +style#:#update_variables#:#Uppdatera variabler +style#:#usages#:#Användningsområden +style#:#used_colors#:#Använda färger +style#:#zip_export_failed#:#ZIP-exporten misslyckades med följande felmeddelande +survey#:#SurveyMatrixQuestion#:#Matrix fråga +survey#:#SurveyMetricQuestion#:#Metrisk fråga +survey#:#SurveyMultipleChoiceQuestion#:#Flervalsfråga +survey#:#SurveySingleChoiceQuestion#:#Fråga med ett enda val +survey#:#SurveyTextQuestion#:#Ange fri text +survey#:#add_heading#:#Lägg till bildtext +survey#:#add_material#:#Lägg till material +survey#:#add_phrase#:# Lägg till fras +survey#:#adm_no_special_users#:#Det finns inga speciella användare definierade som kan genomföra undersökningar flera gånger. +survey#:#already_completed_survey#:#Du har redan slutfört undersökningen! En undersökning kan inte genomföras en andra gång. +survey#:#anonymization#:#Anonymisering +survey#:#anonymize_anonymous_introduction#:#För att ge dig tillgång till denna undersökning måste du använda en 5-siffrig åtkomstnyckel som du kommer att få från den person som ansvarar för denna undersökning.
Ange denna åtkomstnyckel i textfältet ovan. +survey#:#answer#:#Svar +survey#:#apply#:#Takeover +survey#:#arithmetic_mean#:#Aritmetiskt medelvärde +survey#:#back#:#Tillbaka +survey#:#before#:#före +survey#:#browse_for_questions#:#Lägg till från pool +survey#:#cancel_survey#:#Undersökning om avbrott +survey#:#cannot_manage_phrases#:#Du har inte skrivbehörighet för att kunna redigera fraserna! +survey#:#cannot_participate_survey#:#Du har inte behörighet att delta i undersökningen! +survey#:#cannot_read_survey#:#Du har inte tillräcklig behörighet för att komma åt undersökningsdata! +survey#:#cannot_send_emails#:#Du har inte tillräckliga rättigheter för att skicka e-post. +survey#:#cannot_switch_to_online_no_questions#:#Statusen kan inte ändras till "online (aktiverad)" eftersom inga frågor har lagts till i enkäten ännu! +survey#:#cant_send_email_smtp_disabled#:#Att skicka externa e-postmeddelanden är för närvarande globalt avaktiverat. +survey#:#categories#:#Svar +survey#:#category#:#Svar +survey#:#category_nr_selected#:#Antal valmöjligheter +survey#:#chart#:#Diagram +survey#:#codes#:#Nyckel för åtkomst +survey#:#codes_created#:#Åtkomstnyckel genererad +survey#:#codes_deleted#:#Åtkomstnyckel borttagen +survey#:#combobox#:#Kombinationsfält +survey#:#concatenation#:#Länk +survey#:#confirm_delete_all_user_data#:#Är du säker på att du vill radera alla uppgifter om deltagarna i undersökningen? +survey#:#confirm_delete_single_user_data#:#Är du säker på att du vill ta bort dessa deltagare? Detta kommer att radera alla undersökningsdata för de valda användarna. +survey#:#confirm_remove_heading#:#Är du säker på att du vill ta bort rubriken? +survey#:#confirm_sync_questions#:#Frågan du ändrade skapades som en kopia av ett original när du infogade den i undersökningen. Vill du nu tillämpa dina ändringar på den ursprungliga frågan? +survey#:#conjunction_and#:#Om varje villkor är uppfyllt +survey#:#conjunction_and_title#:#Uppfyller något av följande villkor +survey#:#conjunction_or#:#när ett villkor är uppfyllt +survey#:#conjunction_or_title#:#Uppfyller ett av följande villkor +survey#:#constraint_add#:#Lägg till förgreningsregel +survey#:#constraint_fulfilled#:#Visa sida +survey#:#constraints#:#Branchningsregel +survey#:#constraints_first_question_description#:#Den första posten kan inte ha en förgreningsregel eftersom det inte finns några tidigare poster. +survey#:#constraints_introduction#:#Förgreningsregler kan läggas till för en enskild fråga såväl som för ett frågeblock med flera frågor. Beroende på det valda svaret i en tidigare fråga, presenteras en mycket specifik fråga härnäst. Förgreningsregler gör det möjligt för undersökningen att +survey#:#constraints_list_of_entities#:#Möjliga hängare för förgreningsregler +survey#:#constraints_no_nonessay_available#:#Det finns inga föregående frågor som kan användas för att skapa förgreningsregler. Följande typer stöds +survey#:#constraints_no_questions_or_questionblocks_selected#:#Välj minst en fråga eller ett frågeblock! +survey#:#contains#:#Inkluderar +survey#:#continue#:#Fortsätt >> +survey#:#create_date#:#Skapad på +survey#:#create_new#:#Skapa ny +survey#:#dc_agree#:#överenskommet +survey#:#dc_always#:#alltid +survey#:#dc_definitelyfalse#:# otvetydigt fel +survey#:#dc_definitelytrue#:#otvetydigt sant +survey#:#dc_desired#:# önskad +survey#:#dc_disagree#:#inte håller med +survey#:#dc_fair#:#lämplig +survey#:#dc_false#:#fel +survey#:#dc_good#:#bra +survey#:#dc_manytimes#:#frekvent +survey#:#dc_morenegative#:#mer negativ +survey#:#dc_morepositive#:#mycket positiv +survey#:#dc_mostcertainly#:#absolut säker +survey#:#dc_mostcertainlynot#:#absolut osäker +survey#:#dc_must#:#måste +survey#:#dc_mustnot#:#får inte +survey#:#dc_neutral#:#neutral +survey#:#dc_never#:#aldrig +survey#:#dc_no#:#Nej +survey#:#dc_notacceptable#:#oacceptabelt +survey#:#dc_poor#:#fattig +survey#:#dc_rarely#:#sällan +survey#:#dc_should#:#bör +survey#:#dc_shouldnot#:#bör inte +survey#:#dc_sometimes#:#ibland +survey#:#dc_stronglyagree#:#absolut håller med +survey#:#dc_stronglydesired#:#absolut önskvärt +survey#:#dc_stronglydisagree#:#absolut håller inte med +survey#:#dc_stronglyundesired#:#absolut inte önskad +survey#:#dc_true#:#sant +survey#:#dc_undecided#:#obeslutad +survey#:#dc_undesired#:#oönskad +survey#:#dc_varying#:#different +survey#:#dc_verygood#:#mycket bra +survey#:#dc_yes#:#Ja +survey#:#default_codes_mail_message#:#Din åtkomstnyckel för undersökningen är [kod]. Du kan komma åt undersökningen när som helst på URL [url]. +survey#:#default_codes_mail_subject#:#Din åtkomstnyckel för undersökningen %s +survey#:#define_questionblock#:#Definiera frågeblock +survey#:#delete_saved_message#:#Radera meddelandetext +survey#:#description_maxchars#:#Om du inte anger något är det maximala antalet tecken som kan anges obegränsat. +survey#:#display_all_available#:#Visa alla tillgängliga +survey#:#dont_use_questionpool#:#Lägg inte till frågor i en frågepool och gör dem tillgängliga endast för denna undersökning +survey#:#dp_standard_attitude_agree5#:#Standardinställning (instämmer helt - instämmer - är osäker - är oenig - instämmer inte alls) +survey#:#dp_standard_attitude_agree_disagree#:#Standardinställning (instämmer-instämmer inte) +survey#:#dp_standard_attitude_agree_undecided_disagree#:#Standardinställning (håller med-håller inte med-håller inte med) +survey#:#dp_standard_attitude_desired5#:#Standardinställning (absolut önskvärd-önskvärd-neutral-ovänlig-absolut oönskad) +survey#:#dp_standard_attitude_desired_neutral_undesired#:#Standardinställning (önskvärd-neutral-icke önskvärd) +survey#:#dp_standard_attitude_desired_undesired#:#Standardattityd (önskad-icke önskad) +survey#:#dp_standard_attitude_good5#:#Standardinställning (mycket bra-god-adekvat-icke acceptabel) +survey#:#dp_standard_attitude_good_fair_notacceptable#:#Standardattityd (bra-lämplig-acceptabel) +survey#:#dp_standard_attitude_good_notacceptable#:#Standardattityd (bra - oacceptabelt) +survey#:#dp_standard_attitude_must5#:#Standardinställning (måste-ska-ska-ska-ska inte-måste) +survey#:#dp_standard_attitude_shold_shouldnot#:#Standardinställning (bör-ska inte) +survey#:#dp_standard_attitude_should_undecided_shouldnot#:#Standardinställning (bör-övertygad-bör inte) +survey#:#dp_standard_behaviour_certainly5#:#Standardbeteende (absolut säker-mer positiv-osäker-mer negativ-absolut osäker) +survey#:#dp_standard_behaviour_yes_no#:#Standardbeteende (ja-nej) +survey#:#dp_standard_behaviour_yes_undecided_no#:#Standardbeteende (ja-osäker-nej) +survey#:#dp_standard_beliefs_always5#:#Standard-imaginations (alltid-ofta-differently-sällan-aldrig) +survey#:#dp_standard_beliefs_always_never#:#Standardidéer (alltid-aldrig) +survey#:#dp_standard_beliefs_always_sometimes_never#:#Standardidéer (alltid - ibland - aldrig) +survey#:#dp_standard_beliefs_true5#:#StandardConceptions (otvetydigt sant-sant-osäkert-falskt-otvetydigt falskt) +survey#:#dp_standard_beliefs_true_false#:#Standardidéer (sant-falskt) +survey#:#dp_standard_beliefs_true_undecided_false#:#StandardConceptions (sant-osäkert-falskt) +survey#:#dp_standard_numbers#:#Standardtal +survey#:#duplicate#:#Kopia +survey#:#edit_heading#:#Redigera rubrik +survey#:#edit_phrase#:#Redigera fras +survey#:#end_date#:#Slutdatum +survey#:#end_date_reached#:#Du kan inte längre starta undersökningen. Det sista tillåtna datumet har överskridits! +survey#:#enter_anonymous_id#:#Nyckel för åtkomst +survey#:#enter_phrase_title#:#Var god ange en titel för frasen +survey#:#enter_valid_number_of_codes#:#Var god ange ett giltigt nummer för att generera åtkomstnycklar! +survey#:#err_external_rcp_no_email#:#Importdata måste innehålla minst en "email"-kolumn, dvs. en rad med rubriken "email" och ytterligare rader med respektive e-postadresser. +survey#:#err_external_rcp_no_email_column#:#Importdata måste innehålla minst en "email"-kolumn, dvs. en rad med rubriken "email" och ytterligare rader med respektive e-postadresser. +survey#:#err_maxvaluegeminvalue#:#Det maximala antalet svar måste vara större än eller lika med det minimala antalet svar och högst lika med det maximala antalet svar. +survey#:#err_minvalueganswers#:#Det minsta antalet svar får inte vara större än det maximala antalet svar. +survey#:#err_no_exact_answers#:#Välj exakt %s svar(en). +survey#:#err_no_max_answers#:#Välj högst %s svar. +survey#:#err_no_min_answers#:#Välj minst %s svar. +survey#:#err_no_pool_name#:#Var god ange namnet på en frågepool. +survey#:#error_retrieving_anonymous_survey#:#Systemet kunde inte hitta dina undersökningsdata under åtkomstnyckeln %s. Vänligen kontrollera åtkomstnyckeln! +survey#:#error_save_code#:#Värden sparades inte korrekt. E-postadressen '%s' är inte giltig.... Förnamn +survey#:#evaluation#:#Statistik +survey#:#evaluation_access#:#Deltagarnas tillgång till resultaten +survey#:#evaluation_access_all#:#Alla registrerade ILIAS-användare kan få tillgång till resultaten +survey#:#evaluation_access_info#:#Du har tillgång till utvärderingen av undersökningen +survey#:#evaluation_access_off#:#Deltagarna har inte tillgång till resultaten +survey#:#evaluation_access_participants#:#Alla deltagare i undersökningen har tillgång till resultaten +survey#:#existing_constraints#:#Existerande förgreningsregler +survey#:#exp_type_csv#:#Kommaseparerade värden (CSV) +survey#:#exp_type_excel#:#Microsoft Excel +survey#:#export_all_survey_codes#:#Exportera alla åtkomstnycklar +survey#:#export_label_only#:#Endast exportmärkning +survey#:#export_title_label#:#Exportera titel och etikett +survey#:#export_title_only#:#Exportera endast titel +survey#:#external_recipients_imported#:#Data har importerats. +survey#:#externalmails#:#Importera fil +survey#:#externalmails_info#:#Importfilen måste vara en CSV-fil. Kolumnerna måste separeras med semikolon. Den första raden måste innehålla kolumnrubrikerna. Filen måste innehålla minst en kolumn med kolumnrubriken "email". Detta gör det möjligt för personer utan ILIAS-konto att få å +survey#:#externaltext#:#Importera text +survey#:#externaltext_info#:#Den importerade texten måste delas in i rader och kolumner. Kolumnerna måste separeras med semikolon. Den första raden innehåller kolumnrubrikerna. Texten måste innehålla minst en post för respektive e-postadress. Detta gör det möjligt för personer utan +survey#:#filter#:#Filter +survey#:#filter_all_question_types#:#Alla typer av frågor +survey#:#filter_all_questionpools#:#Alla frågepooler +survey#:#finished_mail_subject#:#Undersökningen "%s" har avslutats +survey#:#freetext_answers#:#Freitext svar +survey#:#geometric_mean#:#Geometriskt medelvärde +survey#:#given_answers#:#Inlämnade svar +survey#:#glossary_term#:#Glossarisk term +survey#:#harmonic_mean#:#Harmoniska medel +survey#:#heading#:#Rubrik +survey#:#horizontal#:#horisontell +survey#:#import_error_closing_file#:#Fel vid stängning av importfilen! +survey#:#import_error_opening_file#:#Fel vid öppning av importfilen! +survey#:#import_from_file#:#Importera information om personer via fil +survey#:#import_from_text#:#Importera information om personer via text +survey#:#import_no_file_selected#:#Ingen fil vald! +survey#:#import_question#:#Importfrågor +survey#:#import_wrong_file_type#:#Fel filtyp! +survey#:#insert_after#:#Insätt bakom +survey#:#insert_before#:#Infoga före +survey#:#insert_missing_question#:#Välj minst en fråga att lägga till i undersökningen! +survey#:#insert_missing_questionblock#:#Välj minst ett frågeblock att lägga till i undersökningen! +survey#:#insert_saved_message#:#Inför meddelandetext +survey#:#internal_link#:#Intern referens +survey#:#introduction#:#Inledning +survey#:#invited_users#:#Utvalda användare +survey#:#label#:#Label +survey#:#label_info#:#Alternativ beteckning för vidare bearbetning (t.ex. i SPSS) av frågedata +survey#:#language_changed#:#Språk ändrat +survey#:#last_update#:#Uppdaterad +survey#:#layout#:#Layout +survey#:#legend#:#Legend +survey#:#lower_limit#:#Lägre barriär +survey#:#mail_import_example2#:#ralfkoenig@domain.tld;Ralf;König +survey#:#mail_import_example3#:#ugoldschmidt@domain.tld;Ute;Goldschmidt +survey#:#mail_sent_short#:#Sänt +survey#:#mail_survey_codes#:#Skicka åtkomstnycklar och meddelanden +survey#:#mailaddresses#:#Skicka till +survey#:#mailaddresses_info#:# Ange kommaseparerade inloggningsnamn. +survey#:#mailnotification#:#Ett e-postmeddelande per genomförd undersökning +survey#:#mailparticipantdata#:#Ytterligare uppgifter om deltagarna +survey#:#mailparticipantdata_info#:#Lägg till introduktionstext som ska anges i e-postmeddelandet före en deltagares resultatdata. +survey#:#mailparticipantdata_placeholder#:# Dessa platshållare ersätts av motsvarande information om inställningen "Sekretess" nedan är inställd på "Med namn". +survey#:#maintenance#:#Deltagare +survey#:#manage_phrases#:#Mina fraser +survey#:#material#:#Material +survey#:#material_added_empty#:#Objektet innehåller inte lämpligt material. +survey#:#material_added_successfully#:#Du har framgångsrikt publicerat en referens till material! +survey#:#materials#:#Material +survey#:#materials_deleted#:#Materialet har tagits bort från frågan. +survey#:#matrix_appearance#:#Presentation +survey#:#matrix_bipolar_adjectives#:#Pol och antipol +survey#:#matrix_bipolar_adjectives_description#:#Du kan använda ett värdepar med en pol och en motsatt pol för att beskriva kolumnskalan mer exakt +survey#:#matrix_column_separators#:#Kolumnavgränsare +survey#:#matrix_column_separators_description#:#Markera kryssrutan om du vill visa separatorer (smala linjer) mellan kolumnerna i matrisfrågeutmatningen +survey#:#matrix_column_settings#:#Kolumnens egenskaper +survey#:#matrix_columns#:#Matrisens kolumner +survey#:#matrix_left_pole#:#Vänsterpol +survey#:#matrix_neutral_answer#:#Text för en neutral kolumn ("Ej definierad", "Jag vet inte", "Ingen specifikation" etc.) +survey#:#matrix_neutral_column_separator#:#Separator för den neutrala kolonnen +survey#:#matrix_neutral_column_separator_description#:#Markera kryssrutan om du vill visa en separator (bred linje) mellan den neutrala kolumnen och resten av kolumnerna i matrisfrågeutmatningen +survey#:#matrix_question_checkbox_not_checked#:#Välj minst en kryssruta i varje rad! +survey#:#matrix_question_radio_button_not_checked#:#Välj en alternativknapp på varje rad! +survey#:#matrix_right_pole#:#Högerpol +survey#:#matrix_row_separators#:#Linjeseparator +survey#:#matrix_row_separators_description#:#Markera kryssrutan om du vill visa separatorer (smala linjer) mellan raderna i matrisfrågeutmatningen +survey#:#matrix_rows#:#Matrislinjer +survey#:#matrix_standard_answers#:#Kolumntext +survey#:#matrix_subtype_mr#:#Kryssrutor (flera urval) +survey#:#matrix_subtype_sr#:#Radiobuttons (enstaka val) +survey#:#maxchars#:#Maximalt antal tillåtna tecken +survey#:#maximum#:#Maximalt värde +survey#:#median#:#Median +survey#:#median_between#:#mellan +survey#:#menuback#:#Tillbaka +survey#:#menubacktosurvey#:#Tillbaka till undersökningen +survey#:#message_content_info#:#Ange här den text som åtkomstnycklarna ska skickas med. Använd platshållarna [code] för åtkomstnyckeln, [url] för länken till denna undersökning och platshållarna [%s] som du använde i importdata. Platshållarna kommer att ersättas automatiskt. +survey#:#metric_question_floating_point#:#Det angivna värdet är ett flyttal. Flytande tal är inte tillåtna för den här frågetypen! +survey#:#metric_question_not_a_value#:#Det angivna värdet är inte ett numeriskt värde! +survey#:#metric_question_out_of_bounds#:#Det värde du angav är inte mellan minimivärdet och maximivärdet! +survey#:#metric_subtype_description_interval#:#En egenskap kallas intervallskalad om den endast uppfyller de definierande egenskaperna för en kvantitativ egenskap. I synnerhet måste avstånden (skillnaderna) vara meningsfullt tolkningsbara. Termen tjänar endast till att skilja den från egenskaper vars +survey#:#metric_subtype_description_ratioabsolute#:#En kvantitativ egenskap kallas absolut skalad om endast en meningsfull skala kan användas för att mäta den. Detta motsvarar det faktum att endast en meningsfull enhet kan beaktas för egenskapen, t.ex. antalet barn i en familj. Egenskaper vars uttryck mät +survey#:#metric_subtype_description_rationonabsolute#:#En kvantitativ egenskap kallas proportionellt skalad om skalorna som används för mätning har en gemensam naturlig nollpunkt. Förhållanden (kvotdelar) av karakteristiska värden för en kvotskalad egenskap kan tilldelas en meningsfull innebörd. Den naturlig +survey#:#minimum#:#Minsta värde +survey#:#mode#:#Frekvent urval +survey#:#mode_nr_of_selections#:#Antal valmöjligheter +survey#:#mode_text#:#Frekvent urval (text) +survey#:#msg_deleted_export_files#:#Exportfil(er) raderad(e) +survey#:#msg_duplicate_scale#:#Ange unika skalvärden. +survey#:#msg_enter_value_for_valid_constraint#:#Var god ange ett värde för att skapa en giltig grenregel. +survey#:#msg_input_only_positive_numbers#:#Ange siffror större än 0 som skalvärden. +survey#:#msg_max_nr_answers#:#Välj högst %s svar. +survey#:#msg_message_deleted#:#Meddelandet text borttagen +survey#:#msg_message_inserted#:#Meddelandet text infogad +survey#:#msg_min_max_exact_answers#:#Välj exakt %s svar(en). +survey#:#msg_min_max_nr_answers#:#Välj minst %s och högst %s svar. +survey#:#msg_min_nr_answers#:#Välj minst %s svar. +survey#:#msg_no_message_deleted#:#Välj en sparad meddelandetext som ska raderas. +survey#:#msg_no_message_inserted#:#Välj en meddelandetext att infoga. +survey#:#new_survey_codes#:#nya åtkomstnycklar för undersökningen +survey#:#no_phrase_selected#:#Du har inte valt någon fras. +survey#:#no_question_selected_for_copy_to_pool#:#Välj minst en fråga som inte är tilldelad en frågepool. +survey#:#no_question_selected_for_move#:#Välj minst en fråga att flytta! +survey#:#no_question_selected_for_removal#:#Välj minst en fråga och/eller ett frågeblock att ta bort! +survey#:#no_questions_available#:#Det finns inga frågor tillgängliga! +survey#:#no_target_selected_for_move#:#Du måste välja en målposition! +survey#:#no_user_invited#:#Alla inbjudna användare saknar nödvändiga rättigheter för att genomföra undersökningen. Ingen har blivit inbjuden. +survey#:#non_ratio#:#Intervall skala +survey#:#not_sent_only#:#Personer som ännu inte har fått ett e-postmeddelande +survey#:#not_used#:#används inte ännu +survey#:#nr_max_answers#:#Maximum +survey#:#nr_min_answers#:#Minimum +survey#:#obligatory#:#Åtagande +survey#:#off#:#Off +survey#:#offline#:#offline (ej aktiverad) +survey#:#on#:#An +survey#:#or#:#eller +survey#:#orientation#:#Inriktning +survey#:#other_answer#:#Annat svar +survey#:#other_answer_label#:#Label för ytterligare svar (valfritt) +survey#:#outro#:#Avslutande anmärkning +survey#:#percentage_of_selections#:#Andel av totalt antal valda svarsalternativ i procent +survey#:#phrase_added#:#Fras tillagd +survey#:#phrase_new#:#Skapa ny fras +survey#:#phrase_saved#:#Frasen har sparats framgångsrikt +survey#:#please_enter_mail_code#:#Använd platshållaren för åtkomstnyckeln [kod]. +survey#:#please_enter_mail_url#:#Använd platshållaren för URL:en [url]. +survey#:#please_select#:#-- Vänligen välj -- +survey#:#preview#:#Förhandsgranskning +survey#:#qpl_confirm_delete_phrases#:#Är du säker på att du vill ta bort följande fraser? +survey#:#qpl_confirm_delete_questions#:#Är du säker på att du vill ta bort följande frågor? +survey#:#qpl_copy_select_none#:#Välj minst en fråga som du vill kopiera! +survey#:#qpl_define_questionblock_select_missing#:#Välj minst två frågor för att definiera ett frågeblock! +survey#:#qpl_delete_phrase_select_none#:#Välj minst en fras som du vill ta bort! +survey#:#qpl_delete_select_none#:#Välj minst en fråga för att utföra raderingsprocessen! +survey#:#qpl_export_select_none#:#Välj minst en fråga som du vill exportera! +survey#:#qpl_phrases_deleted#:#Fraser raderade. +survey#:#qpl_questions_deleted#:#Frågor borttagna. +survey#:#qpl_savephrase_empty#:#Vänligen ge en titel för frasen! +survey#:#qpl_savephrase_exists#:#Titeln på frasen finns redan! Vänligen ange en annan titel. +survey#:#qpl_unfold_select_none#:#Välj minst ett frågeblock att lösa! +survey#:#question_changed_in_survey_only#:#Frågan ändrades endast i undersökningen +survey#:#question_mr_no_other_answer#:#Var god ange en text för det fria svaret +survey#:#question_mr_no_other_answer_checked#:#Du måste markera kryssrutan när du anger en svarstext +survey#:#question_mr_not_checked#:#Välj minst ett av de svar som erbjuds! +survey#:#question_not_checked#:#Du måste välja ett av de svar som erbjuds! +survey#:#question_obligatory#:#Denna fråga är obligatorisk! +survey#:#question_sr_no_other_answer_checked#:#Du måste välja radioknappen när du anger en svarstext +survey#:#question_type#:#Typ av fråga +survey#:#questionblock#:#Frågeställning block +survey#:#questionblock_inserted#:#Frågeblock infört +survey#:#questionblocks#:#Frågeblock +survey#:#questionblocks_inserted#:#Frågeblock infogade +survey#:#questions#:#Frågor och svar +survey#:#questions_inserted#:#Frågor tillagda +survey#:#questions_removed#:#Frågor och/eller frågeblock borttagna! +survey#:#questiontype#:#Typ av fråga +survey#:#ratio_absolute#:#Absolut skalad +survey#:#ratio_non_absolute#:#Kvot skalad +survey#:#recipients#:#Skicka till +survey#:#remove_question#:#Remove +survey#:#remove_questions#:#Är du säker på att du vill ta bort följande frågor och/eller frågeblock från undersökningen? +survey#:#reset_filter#:#Återställ filter +survey#:#results#:#Resultat +survey#:#resume_survey#:#Fortsätt undersökningen +survey#:#row_text#:#Linje +survey#:#save_obligatory_state#:#Spara "Obligatorisk" status och sortering +survey#:#save_phrase#:#Spara som fras +survey#:#save_phrase_introduction#:#Om du vill spara svaren nedan som en standardfras för dig själv, ange en annan titel för frasen. Du kan komma åt denna fras när som helst när du lägger till fraser till en ordinär fråga. +survey#:#save_reuse_message#:#Spara meddelandeinnehåll för vidare användning +survey#:#save_reuse_title#:#Titel på meddelandets innehåll +survey#:#saved_messages#:#Tillgängliga meddelandetexter +survey#:#scale#:#Skala +survey#:#search_for#:#Sökning efter +survey#:#search_groups#:#Grupper +survey#:#search_roles#:#Fundna roller +survey#:#search_term#:#Sökord(er) +survey#:#search_users#:#Sök användare +survey#:#select_option#:#--- Vänligen välj ett svar ---. +survey#:#select_prior_question#:#Välj en tidigare fråga +survey#:#select_questionpool#:#Var vänlig ange en frågepool som du tilldelar den nyskapade frågan till +survey#:#select_questionpool_short#:#Frågepool för enkäter +survey#:#select_relation#:#Välj relation +survey#:#select_target_position_for_move_question#:#Välj en målposition för att flytta frågor och tryck sedan på en av de två klistra in-knapparna! +survey#:#select_value#:#Sätt värde +survey#:#selection#:#Urval +survey#:#send_to_all#:#Alla personer för vilka åtkomstnycklar har genererats +survey#:#send_to_answered#:#Alla personer som redan har slutfört undersökningen +survey#:#send_to_unanswered#:#Personer som ännu inte har slutfört undersökningen +survey#:#show_questiontext#:#Visa frågetexten +survey#:#show_questiontext_description#:#Om denna kryssruta är aktiverad visas frågetexten för varje fråga inom frågeblocket (standard). Om denna kryssruta inte är aktiverad visas inte frågetexterna och endast svaren erbjuds. Detta kan vara användbart om du erbjuder flera frågor med identiska f +survey#:#skipped#:#hoppade över +survey#:#spl_copy_insert_clipboard#:#De valda frågorna har kopierats till Urklipp. +survey#:#spl_copy_select_none#:#Välj minst en fråga att kopiera. +survey#:#spl_move_insert_clipboard#:#De utvalda frågorna har markerats för flyttning. +survey#:#spl_move_same_pool#:#Du kan inte flytta frågor inom samma frågepool. +survey#:#spl_move_select_none#:#Välj minst en fråga att flytta. +survey#:#spl_online_property#:#Online +survey#:#spl_online_property_description#:#Om frågepoolen inte är online kan den inte användas i undersökningar. +survey#:#spl_paste_no_objects#:#Det finns inga frågor på klippbordet. Använd kopierings- eller flyttknapparna för detta. +survey#:#spl_paste_success#:#Frågor infogade +survey#:#spl_save_obligatory_state#:#Spara status "Obligatorisk" +survey#:#start_date#:#Startdatum +survey#:#start_date_not_reached#:#Du kan bara starta undersökningen när startdatumet har uppnåtts! +survey#:#start_survey#:#Starta undersökning +survey#:#sub_tab_dashboard#:#Dashboard +survey#:#subtype#:#Subtyp +survey#:#survey_360_add_external_rater#:#Lägg till extern feedbackgivare +survey#:#survey_360_add_self_appraisee#:#Lägg till dig själv som mottagare av feedback. +survey#:#survey_360_appraisee#:#Feedback taker +survey#:#survey_360_appraisee_close_action#:#Stäng enkäten för feedbackgivare +survey#:#survey_360_appraisee_close_action_info#:#Detta ger dig tillgång till statistiken. +survey#:#survey_360_appraisee_close_action_info_skill#:#Detta ger dig tillgång till statistiken och uppdaterar dina kompetensnivåer. +survey#:#survey_360_appraisee_close_action_status#:#Poll avslutad på %s. +survey#:#survey_360_appraisee_close_action_success#:#Du har stängt din 360°-undersökning för feedbackgivare. +survey#:#survey_360_appraisee_close_action_success_admin#:#360° feedback-undersökningarna har avslutats. +survey#:#survey_360_appraisee_close_table#:#Stängt på +survey#:#survey_360_appraisee_info#:#Information om feedbackmottagare +survey#:#survey_360_appraisee_is_closed#:#Feedbackmottagaren har avslutat sin undersökning. +survey#:#survey_360_appraisees#:#Feedback taker +survey#:#survey_360_edit_raters#:#Hantera feedbackgivare +survey#:#survey_360_list_title#:#360°-Modus +survey#:#survey_360_mode#:#360° återkoppling +survey#:#survey_360_mode_info#:#Flera personer utvärderar varandra, feedback om en feedbackmottagare utvärderas aggregerat vid en tidpunkt. +survey#:#survey_360_no_appraisees#:#Du kan inte ge feedback för tillfället. +survey#:#survey_360_no_closed_appraisees#:#Inga omröstningar har avslutats ännu. +survey#:#survey_360_rate_other_appraisees#:#Ge feedback +survey#:#survey_360_rater_finished#:#Undersökningen slutförd +survey#:#survey_360_rater_mail_sent#:#Mail skickat +survey#:#survey_360_rater_message_content_anonymous#:#Content (anonym) +survey#:#survey_360_rater_message_content_anonymous_default#:#Din åtkomstnyckel är [kod]. Du kan starta undersökningen i din webbläsare med följande URL +survey#:#survey_360_rater_message_content_registered#:#Content (Registrerade användare) +survey#:#survey_360_rater_message_content_registered_default#:#Du kan starta undersökningen i din webbläsare med följande URL +survey#:#survey_360_rater_subject_default#:#Du blev inbjuden att delta i en 360°-undersökning som feedbackgivare. +survey#:#survey_360_raters#:#Feedback givare +survey#:#survey_360_raters_finished#:#Fullständig återkoppling +survey#:#survey_360_raters_status_info#:#Undersökningen slutförd +survey#:#survey_360_remove_appraisees#:#Ta bort Feedback-takers +survey#:#survey_360_results#:#Feedbackmottagare kan se svaren +survey#:#survey_360_results_all#:#All feedback +survey#:#survey_360_results_all_info#:#Alla som tar emot feedback i 360°-undersökningen kan se all feedback från alla som ger feedback om sig själva och om alla andra som tar emot feedback. +survey#:#survey_360_results_none#:#Ingen åtkomst +survey#:#survey_360_results_none_info#:#Feedbackmottagare kan inte se de svar som feedbackgivare har valt. +survey#:#survey_360_results_own#:#Endast egna feedbackgivare +survey#:#survey_360_results_own_info#:#Feedback-tagare kan bara se de svar som feedback-givare personligen har valt åt dem. +survey#:#survey_360_select_appraisee#:#Välj +survey#:#survey_360_self_appraisee#:#Öppen feedback +survey#:#survey_360_self_appraisee_info#:#I fliken "Info" visas en länk för alla. Via denna länk kan personer registrera sig som feedbackmottagare för denna undersökning. +survey#:#survey_360_self_evaluation#:#självutvärdering +survey#:#survey_360_self_evaluation_info#:#Feedback-tagare kan göra en självutvärdering baserat på frågorna. +survey#:#survey_360_self_raters#:#Välj givare för återkoppling +survey#:#survey_360_self_raters_info#:#Feedback-mottagarna väljer själva vilka personer som ska ge dem feedback. De bjuder också in dessa personer själva. +survey#:#survey_360_sure_appraisee_close#:#Vill du verkligen stänga enkäten för alla feedbackgivare? +survey#:#survey_360_sure_appraisee_close_admin#:#Vill du verkligen stänga enkäten för följande feedbackmottagare? +survey#:#survey_360_sure_delete_appraises#:#Vill du verkligen ta bort följande feedbackmottagare? +survey#:#survey_360_sure_delete_raters#:#Vill du verkligen ta bort följande feedbackgivare för %s? +survey#:#survey_access_codes#:#Autentisering med åtkomstnycklar +survey#:#survey_access_codes_info#:#Användare får tillgång till undersökningen genom att ange en åtkomstnyckel på fliken "Info". Dessa åtkomstnycklar genereras i underfliken med samma namn i fliken "Deltagare". +survey#:#survey_activate_skill_service#:#Aktivera kompetenstjänst +survey#:#survey_activate_skill_service_info#:#Ytterligare en flik "Kompetenser" visas. Här tilldelas först kompetenser till frågorna, sedan sätts tröskelvärden för att uppnå vissa kompetensnivåer. +survey#:#survey_add_new_question#:#Skapa fråga +survey#:#survey_assign_competence#:#Tilldela kompetens +survey#:#survey_at_beginning#:#Till början +survey#:#survey_auto_block_title#:#Sidans rubrik +survey#:#survey_available_question_pools#:#Tillgängliga pooler +survey#:#survey_behind_page#:#Bakom +survey#:#survey_block_hidden#:#inte synlig +survey#:#survey_block_visible#:#synlig +survey#:#survey_calc_skills#:#Bestämma kompetensnivåer +survey#:#survey_calculate_sum_score#:#Beräkna skala poäng summa +survey#:#survey_calculate_sum_score_info#:#Beräknar summan av alla skalpoäng för envals-, flervals- och matrisfrågor per deltagare. Uppmärksamhet +survey#:#survey_cancel_preview#:#Avbryt förhandsgranskning +survey#:#survey_cannot_preview_survey#:#Preview inte tillgänglig +survey#:#survey_clipboard_notice#:#Det finns frågor i Urklipp. Välj en destination eller rensa urklipp. +survey#:#survey_code#:#Nyckel för åtkomst +survey#:#survey_code_delete_sure#:#Vill du verkligen ta bort följande oanvända åtkomstnycklar? +survey#:#survey_code_url#:#URL för direkt åtkomst +survey#:#survey_code_url_name#:#URL (Använd höger musknapp för att kopiera URL:en) +survey#:#survey_code_used#:#Tillträdesnyckeln har varit ... +survey#:#survey_codes_lang#:#Förvalt användarspråk i URL +survey#:#survey_codes_no_anonymization#:#Du måste skapa en anonymiserad undersökning med åtkomstnycklar för att kunna generera åtkomstnycklar! +survey#:#survey_competences#:#Kompetens +survey#:#survey_confirm_template_reset#:#Är du säker på att du inte vill använda mallen igen? +survey#:#survey_constraint_deleted#:#Regeln har tagits bort. +survey#:#survey_copy_questions_to_pool#:#Lägg till frågepoolen +survey#:#survey_copy_select_questionpool#:#Frågepool där frågorna ska lämnas in +survey#:#survey_copy_to_questionpool_success#:#Frågorna har kopierats framgångsrikt till frågepoolen. +survey#:#survey_delete_heading#:#Ta bort bildtext +survey#:#survey_delete_page#:#Ta bort sida +survey#:#survey_dnd_clear_clipboard#:#Klart klippbord +survey#:#survey_dnd_move_next#:#Flytta till nästa sida +survey#:#survey_dnd_move_previous#:#Flytta till föregående sida +survey#:#survey_dnd_paste#:#Insert +survey#:#survey_dnd_split_page#:#Dela sidan +survey#:#survey_edit_heading#:#Redigera rubrik +survey#:#survey_edit_settings#:#Redigera inställningar +survey#:#survey_error_insert_incomplete_question#:#Du försökte lägga till en ofullständig fråga i undersökningen. Frågan lades inte till. +survey#:#survey_execution_exit#:#Tillbaka till tidningen +survey#:#survey_execution_exit_360#:#Tillbaka +survey#:#survey_execution_sure_finish#:#Vill du verkligen avsluta undersökningen? Du kommer inte att kunna korrigera dina svar i efterhand. +survey#:#survey_existing_pool#:#Använda befintlig frågepool +survey#:#survey_finish#:#Avsluta undersökningen >> +survey#:#survey_finished#:#Undersökningen är avslutad. Tack för ditt deltagande! +survey#:#survey_has_datasets_warning#:#Undersökningen innehåller redan deltagarregister. Du kan inte redigera frågorna igen förrän du har tagit bort alla deltagarregister. +survey#:#survey_has_datasets_warning_page_view#:#Undersökningen innehåller redan deltagarregister. Du kan inte redigera frågorna igen förrän du har tagit bort alla deltagarregister. +survey#:#survey_has_datasets_warning_page_view_link#:#Redigera deltagarnas uppgifter +survey#:#survey_introduction_info#:#Den här texten visas permanent på fliken "Info". +survey#:#survey_is_offline#:#Du kan inte starta undersökningen! Undersökningen är offline (inte aktiverad). +survey#:#survey_jump_to#:#Hoppa till sidan +survey#:#survey_move_page#:#Flytta sida +survey#:#survey_new_pool#:#Skapa ny frågepool +survey#:#survey_next#:#Fortsätt >> +survey#:#survey_next_question#:#Nästa sida +survey#:#survey_no_pool#:#Använd inte en frågepool +survey#:#survey_not_available#:#n.a. +survey#:#survey_notification_finished_introduction#:#En deltagare har slutfört undersökningen. +survey#:#survey_notification_finished_reason#:#Du får detta meddelande eftersom du har aktiverat aviseringsfunktionen för ovanstående undersökning. +survey#:#survey_notification_target_group#:#Målgrupp +survey#:#survey_notification_target_group_invited#:#Deltagare som har fått enkäten skickad till sin Personal Desk och som ännu inte har fyllt i enkäten. +survey#:#survey_notification_target_group_invited_info#:#Aktuellt antal +survey#:#survey_notification_target_group_parent_course#:#Alla deltagare i föräldrakursen/gruppen som ännu inte har besvarat enkäten +survey#:#survey_notification_target_group_parent_course_inactive#:#Ingen kurs/grupp på högre nivå - ingen påminnelse möjlig! +survey#:#survey_notification_tutor_body#:#Följande enkät har fyllts i av alla deltagare +survey#:#survey_notification_tutor_link#:#Länk till undersökningen +survey#:#survey_notification_tutor_recipients#:#Sänd e-post till (inloggningsnamn) +survey#:#survey_notification_tutor_recipients_invalid#:#Ange inloggningsnamn för en person med skrivbehörighet ###Modifierad som en del av jämställdhetsintegreringen för ILIAS 8 +survey#:#survey_notification_tutor_salutation#:#Hej %s, +survey#:#survey_notification_tutor_setting#:#Ett e-postmeddelande efter att alla deltagare har avslutat +survey#:#survey_notification_tutor_subject#:#Alla deltagare har slutfört undersökningen "%s +survey#:#survey_order#:#Sortering +survey#:#survey_page_moved#:#Sidan har flyttats. +survey#:#survey_per_page_view#:#Sidvisning +survey#:#survey_pool_selection#:#Val av pool +survey#:#survey_prev_question#:#Tidigare sida +survey#:#survey_previous#:#<< Tillbaka +survey#:#survey_question_editor#:#Listvy +survey#:#survey_question_editor_settings_template#:#Listvy (på fliken "Frågor") +survey#:#survey_question_obligatory#:#(Denna fråga är en obligatorisk fråga. Den måste besvaras!) +survey#:#survey_question_pool#:#Frågepool +survey#:#survey_question_pool_title#:#Pool titel +survey#:#survey_question_pool_usage#:#Använd frågepool +survey#:#survey_question_pool_usage_active#:#Frågor kan valfritt skapas i en frågepool +survey#:#survey_question_pool_usage_active_info#:#När du skapar en fråga måste du bestämma om en frågepool ska användas. +survey#:#survey_question_pool_usage_inactive#:#Frågor skapas direkt i enkäten. +survey#:#survey_question_pool_usage_inactive_info#:#Frågan skapas först endast för denna undersökning och kan senare läggas till manuellt i en frågepool. +survey#:#survey_question_text_hidden#:#Text inte synlig +survey#:#survey_question_text_visible#:#Text synlig +survey#:#survey_question_title#:#Frågans titel +survey#:#survey_questions#:#Frågor och svar +survey#:#survey_questions_to_clipboard_copy#:#Questions har kopierats till urklipp. Välj en destination eller rensa urklipp. +survey#:#survey_questions_to_clipboard_cut#:#Questions har kopierats till urklipp. Välj en destination eller rensa urklipp. +survey#:#survey_reached_level#:#Uppnått uttryck +survey#:#survey_reminder_body#:#Följande enkät har ännu inte besvarats av dig +survey#:#survey_reminder_cron#:#Påminn användarna om att delta +survey#:#survey_reminder_cron_info#:#När detta är aktiverat påminns användarna om att delta i undersökningar. +survey#:#survey_reminder_end#:#Slut +survey#:#survey_reminder_frequency#:#Frekvens av hågkomst +survey#:#survey_reminder_frequency_days#:#dagar +survey#:#survey_reminder_link#:#URL +survey#:#survey_reminder_salutation#:#Hej %s, +survey#:#survey_reminder_setting#:#Påminn användarna om att delta +survey#:#survey_reminder_start#:#Begin +survey#:#survey_reminder_subject#:#Poll "%s" har ännu inte redigerats +survey#:#survey_remove_competence#:#Ta bort kompetens +survey#:#survey_results_anonymization#:#Skydd av personuppgifter +survey#:#survey_results_anonymized#:#Utan namn / Anonym undersökning +survey#:#survey_results_anonymized_info#:#I fliken "Resultat" ersätts deltagarnas namn med koder. Användare med tillgång till denna flik kan inte tilldela svaren till ett namn, utan endast till en användare "iTXaF" (exempel). +survey#:#survey_results_finished#:#Undersökningen avslutad +survey#:#survey_results_not_started#:#Undersökningen har inte startat +survey#:#survey_results_personalized#:#Med namn +survey#:#survey_results_personalized_info#:#På fliken "Resultat" listas deltagarna med namn och deras svar visas. Alla användare med full åtkomst till denna flik kan se vem som gav vilka svar. Användare med begränsad åtkomst till fliken kan också tilldela enskilda svar till deltagare om antalet de +survey#:#survey_results_started#:#Undersökning påbörjad +survey#:#survey_results_tutor_body#:#I bilagan hittar du resultaten av följande undersökning +survey#:#survey_results_tutor_subject#:#Resultat av undersökningen "%s +survey#:#survey_show_blocktitle#:#Display block titel +survey#:#survey_show_blocktitle_description#:#Om denna kryssruta är aktiverad visas blockets titel i enkäten. +survey#:#survey_skill#:#Kompetens +survey#:#survey_skill_assign#:#Fråga Kompetens Uppdrag +survey#:#survey_skill_level#:#Kompetensnivå +survey#:#survey_skill_max_scale_points#:#Max. Skalpunkter +survey#:#survey_skill_nr_q#:#Antal frågor +survey#:#survey_skill_thresholds#:#Kompetensgräns +survey#:#survey_start#:#<< Till hemsidan +survey#:#survey_sum_of_means#:#Summan av aritmen. Med hjälp av frågan +survey#:#survey_sure_delete_constraint#:#Vill du verkligen ta bort förgreningsregeln "%1$s" för frågan "%2$s"? +survey#:#survey_sure_delete_questions#:#Vill du verkligen ta bort följande frågor eller rubriker? +survey#:#survey_sync_insufficient_permissions#:#Inga tillräckliga villkor. +survey#:#survey_sync_question_copies#:#Synkronisera kopior av frågor +survey#:#survey_sync_question_copies_info#:#Alla utvalda frågor uppdateras om poolfrågan. +survey#:#survey_sync_success#:#De utvalda frågorna har uppdaterats. +survey#:#survey_template_reset#:#Mallen har tagits bort. +survey#:#survey_up_to_x_points#:#Upp till x poäng +survey#:#survey_use_start_button#:#Du kan endast starta en undersökning via knappen "Starta undersökning"! +survey#:#survey_using_template#:#Den här undersökningen använder %s-mallen. Om du inte vill använda en mall och alla inställningar, klicka här +survey#:#survey_using_template_link#:#Använd inte mallen längre +survey#:#svy_activation_limited_visibility_info#:#Utanför den angivna perioden visas endast undersökningens titel, frågorna är inte tillgängliga. +survey#:#svy_activation_online_info#:#Endast när undersökningen är online kan användarna delta i undersökningen. +survey#:#svy_add_internal_user#:#Lägg till användare +survey#:#svy_add_internal_user_info#:#Feedback givers behöver ett ILIAS-konto för denna installation. +survey#:#svy_add_rater#:#Lägg till feedbackgivare +survey#:#svy_all_raters#:#Alla som ger feedback +survey#:#svy_all_survey_competences#:#Alla undersökningskunskaper +survey#:#svy_all_user_data_deleted#:#Undersökningsposterna har tagits bort. +survey#:#svy_analysis#:#Analys +survey#:#svy_anonymous_participants#:#Lista över deltagare +survey#:#svy_anonymous_participants_info#:#Om aktiverat kan en lista över deltagare genereras för anonyma undersökningar. +survey#:#svy_anonymous_participants_min#:#Minsta antal deltagare +survey#:#svy_anonymous_participants_min_info#:#Listan visas endast från detta antal deltagare. +survey#:#svy_anonymous_participants_svy#:#Lista över deltagare +survey#:#svy_anonymous_participants_svy_info#:#Om aktiverad, en lista över deltagare är tillgänglig efter slutdatumet. +survey#:#svy_answer_too_long#:#Ditt svar är för långt (%s tecken). Vänligen förkorta ditt svar. +survey#:#svy_app_see_rater_info#:#Feedbacknehemde kan på resultatsidorna se vilka feedbackgivare som har gett svaren, inkl. namn och e-post, om dessa angavs när feedbackgivarna skapades. +survey#:#svy_appraisses_cannot_be_raters#:#Användare kan inte ange sig själva som feedbackgivare. Använd istället alternativet "Självutvärdering" i undersökningsinställningarna. +survey#:#svy_back#:#Tillbaka +survey#:#svy_chart_download#:#Ladda ner grafik +survey#:#svy_check_evaluation_access_introduction#:#Då denna utvärdering endast är tillgänglig för deltagare i undersökningen, måste du ange din undersökningsåtkomstnyckel för att öppna utvärderingen. +survey#:#svy_check_evaluation_authentication_needed#:#Autentisering krävs +survey#:#svy_check_evaluation_wrong_key#:#Du har angett en felaktig åtkomstnyckel för undersökningen eller har inte deltagit i undersökningen. Du nekades därför åtkomst till utvärderingen. +survey#:#svy_compress_view#:#Komprimerad vy +survey#:#svy_compress_view_info#:#Alla envalsfrågor i ett frågeblock med samma svarsskalning visas i en matris. +survey#:#svy_copy#:#Kopiundersökning +survey#:#svy_create_question#:#Skapa fråga +survey#:#svy_delete_all_user_data#:#Radera alla poster +survey#:#svy_dont_send#:#Sänd inget meddelande +survey#:#svy_eval_captions#:#Nyckeltal +survey#:#svy_eval_captions_abs#:#Nummer +survey#:#svy_eval_captions_abs_perc#:#Nummer och procent +survey#:#svy_eval_captions_perc#:#Procent +survey#:#svy_eval_competences#:#Kompetensresultat +survey#:#svy_eval_cumulated#:#Översikt +survey#:#svy_eval_detail#:#Detaljerade resultat +survey#:#svy_eval_skipped_value#:#Resultat +survey#:#svy_eval_skipped_value_custom#:#Använd justerat värde +survey#:#svy_eval_skipped_value_custom_info#:#Ge ett (eller tomt) värde för uteblivna svar +survey#:#svy_eval_skipped_value_custom_value#:#Värde +survey#:#svy_eval_skipped_value_lng#:#Ta över värde från språkfil +survey#:#svy_eval_skipped_value_lng_info#:#Nuvärde +survey#:#svy_eval_user#:#Per deltagare +survey#:#svy_eval_view#:#Display +survey#:#svy_eval_view_charts#:#Grafisk +survey#:#svy_eval_view_tables#:#Tabell +survey#:#svy_eval_view_tables_charts#:#Bord och grafik +survey#:#svy_evaluation_access_all_info#:#Alla registrerade användare som har tillgång till undersökningen kan också se dess resultat. +survey#:#svy_evaluation_access_off_info#:#Endast användare som kan redigera undersökningen (höger 'Redigera inställningar') har tillgång till resultaten av undersökningen. +survey#:#svy_evaluation_access_participants_info#:#Alla användare som har deltagit i undersökningen kan se sina resultat efter att de har slutfört undersökningen. +survey#:#svy_export_files#:#Exportera filer +survey#:#svy_export_format#:#Exportera undersökningar som +survey#:#svy_export_pdf#:#Exportera PDF +survey#:#svy_ext_rater_firstname#:#Förstanamn på en extern leverantör av feedback +survey#:#svy_ext_rater_lastname#:#Efternamn på en extern leverantör av feedback +survey#:#svy_external_rater#:#Lägg till extern feedbackgivare +survey#:#svy_external_rater_info#:#Externa feedbackgivare har inget inloggningskonto på plattformen. +survey#:#svy_fraction_of_selections#:#Andel av totalt antal valda svarsalternativ +survey#:#svy_gap_analysis#:#Analys av luckor +survey#:#svy_general_properties#:#Allmänna inställningar +survey#:#svy_import_codes#:#Importera nyckel +survey#:#svy_import_codes_info#:#Den här importen kräver en "%s"-exportfil. +survey#:#svy_ind_feedb_info#:#Feedbackmottagare får flera individuella utvärderingar av feedbackgivare. +survey#:#svy_ind_feedb_mode#:#Utländsk utvärdering +survey#:#svy_mail_confirmation_subject#:#Survey "%s" - Din bekräftelse på deltagande +survey#:#svy_mail_context_rater_invitation_info#:#Bjud in feedback-donatorer att delta i en undersökning. +survey#:#svy_mail_context_rater_invitation_survey_title#:#Titel på undersökning +survey#:#svy_mail_context_rater_invitation_title#:#Undersökning +survey#:#svy_mail_context_reminder_info#:#Påminner användare att delta i en undersökning +survey#:#svy_mail_context_reminder_survey_title#:#Titel på undersökning +survey#:#svy_mail_context_reminder_title#:#Undersökning +survey#:#svy_mail_own_results#:#Skicka dina egna svar via e-post +survey#:#svy_mail_own_results_body#:#Du har deltagit i följande undersökning +survey#:#svy_mail_own_results_subject#:#Survey "%s" - Dina svar +survey#:#svy_mail_send_confirmation#:#Skicka bekräftelse på deltagande +survey#:#svy_matrix_layout_percentages_sum_invalid#:#Kolumninställningarna summerar inte till 100%. +survey#:#svy_max_sum_score#:#Maximal skala punkt summa +survey#:#svy_neutral_answer#:#Text för ett neutralt svar ("Ej definierat", "Jag vet inte", "Ingen indikation" etc.). +survey#:#svy_notification_tutor_results#:#Ett e-postmeddelande med undersökningsresultaten +survey#:#svy_notification_tutor_results_alert#:#Denna funktion kräver ett slutdatum. +survey#:#svy_notification_tutor_results_info#:#Efter slutdatumet kommer ett e-postmeddelande att skickas med de detaljerade undersökningsresultaten. +survey#:#svy_only_max_one_external_rater#:#Välj endast en extern leverantör av feedback. +survey#:#svy_page_add_question#:#Lägg till nya %s +survey#:#svy_page_error#:#Ett fel uppstod när du besvarade en fråga. Du hittar felmeddelandet med den berörda frågan! +survey#:#svy_page_errors#:#Fel uppstod när flera frågor besvarades. Du hittar felmeddelandena med de berörda frågorna! +survey#:#svy_participant#:#Deltagare +survey#:#svy_participation#:#Deltagande +survey#:#svy_please_select_unused_codes#:#Välj minst en oanvänd åtkomstnyckel. +survey#:#svy_print_hide_labels#:#Dölj Etiketter +survey#:#svy_print_show_labels#:#Visa Märkningar +survey#:#svy_privacy_info#:#Personuppgifter +survey#:#svy_rater#:#Feedback givare +survey#:#svy_rater_see_app_info#:#feedbackgivare, namnen på de som tar emot feedback visas så att de kan svara på frågorna i förhållande till den som tar emot feedback. +survey#:#svy_reminder_mail_template#:#Mall för e-post +survey#:#svy_reminder_mail_template_none#:#Använd inte en mall +survey#:#svy_result_mail_notification_info#:#När en person har besvarat enkäten skickas resultatet via e-post. +survey#:#svy_results#:#Resultat +survey#:#svy_results_mail_confirm#:#Deltagaren kan skicka bekräftelse på deltagande till sig själv +survey#:#svy_results_mail_confirm_info#:#Deltagarna kan få en bekräftelse på deltagande skickad till dem via e-post efter att ha slutfört undersökningen. +survey#:#svy_results_mail_own#:#Skicka dina egna svar +survey#:#svy_results_mail_own_info#:#Dina egna svar kommer att bifogas bekräftelsen på deltagande. +survey#:#svy_results_view_own#:#Deltagarna kan se sina egna svar +survey#:#svy_results_view_own_info#:#Deltagarna kan se en översikt över sina egna svar efter att de har slutfört undersökningen. De kan inte längre ändra svaren. +survey#:#svy_save_and_continue#:#Spara och fortsätt +survey#:#svy_save_sync#:#Spara och uppdatera kopior +survey#:#svy_search_user#:#Sök användare +survey#:#svy_search_user_info#:#Sök efter användare eller roller och välj deltagare. +survey#:#svy_search_users#:#Sök användare +survey#:#svy_select_rater#:#Välj givare av feedback +survey#:#svy_selected_user_data_deleted#:#Undersökningsregistren för de utvalda deltagarna raderades framgångsrikt +survey#:#svy_self_ev_access_results_all#:#Tillgång till alla deltagares självutvärderingar +survey#:#svy_self_ev_access_results_none#:#Ingen tillgång till resultat +survey#:#svy_self_ev_access_results_own#:#Tillgång till självutvärderingar +survey#:#svy_self_ev_info#:#People utvärderar sig själv och bedömer sig själv. +survey#:#svy_self_ev_mode#:#Självutvärdering +survey#:#svy_settings_section_access#:#Ledning av enkätundersökningar +survey#:#svy_settings_section_before_start#:#Information innan undersökningen påbörjas +survey#:#svy_settings_section_finishing#:#Avsluta undersökningen +survey#:#svy_settings_section_question_behaviour#:#Ledning av enkätundersökningar +survey#:#svy_settings_section_reminders#:#Minnen +survey#:#svy_settings_template#:#Mall +survey#:#svy_show_questiontitles#:#Display av frågornas rubriker +survey#:#svy_skl_comp_assignm_not_supported#:#Tilldelning av kompetenser är inte möjlig för denna frågetyp. +survey#:#svy_sum_score#:#Skala poäng totalt +survey#:#svy_type_of_rater#:#Konst feedback givare +survey#:#svy_view_own_results#:#Visa dina egna svar +survey#:#svy_wrong_or_expired_code#:#Tyvärr, den åtkomstnyckel du angav är inte giltig eller har gått ut. Vänligen försök igen. +survey#:#text_maximum_chars_allowed#:#Var god ange inte mer än maximalt %s tecken. Alla tecken utöver detta raderas automatiskt. +survey#:#text_question_not_filled_out#:#Du måste fylla i alla svarsfält! +survey#:#unfold#:#Lösa block av frågor +survey#:#upper_limit#:#Övre barriär +survey#:#upper_limit_must_be_greater#:#Den övre barriären måste vara större än den nedre barriären! +survey#:#use_anonymous_id#:#Visa åtkomstnyckel +survey#:#use_anonymous_id_desc#:#Visar åtkomstnyckeln istället för inloggningsnamnet för anonymiserade undersökningar. Om alternativet inte är valt visas strängen "Okänd" istället. +survey#:#use_browser_print_function#:#Använd utskriftsfunktionen i din webbläsare +survey#:#use_min_answers#:#Svar antal +survey#:#use_min_answers_option#:#Bestäm antalet svar som ska väljas ut +survey#:#use_other_answer#:#Freitext +survey#:#used#:#använd +survey#:#users_answered#:#Besvarad +survey#:#users_invited#:#%s användare har bjudits in +survey#:#users_skipped#:#Skippad +survey#:#values#:#Värderingar +survey#:#vertical#:#vertikal +survey#:#warning_question_not_complete#:#Frågan är ofullständig! +survey#:#workingtime#:#Bearbetningstid +survey#:#wrong_survey_code_used#:#Ingen åtkomst till undersökningen. Din åtkomstnyckel är ogiltig eller har redan använts. +svy#:#survey_360_appraisees_remind_info#:#Om självutvärdering är aktiverat kommer feedbackmottagare som ännu inte har slutfört undersökningen att få ett påminnelsemeddelande. +svy#:#survey_360_raters_remind_info#:#Feedback-donatorer som ännu inte har slutfört undersökningen kommer att få ett påminnelsemeddelande. +svy#:#svy_all_pages#:#Alla sidor +svy#:#svy_all_participants#:#Alla deltagare +svy#:#svy_all_questions#:#Alla frågor +svy#:#svy_codes#:#Nyckel för åtkomst +svy#:#svy_current_page#:#Aktuell sida +svy#:#svy_finish_survey#:#Redigera undersökning "%1 +svy#:#svy_invite_participants#:#Bjud in deltagare +svy#:#svy_link_to_svy#:#Länk till undersökningen +svy#:#svy_part_overview#:#Översikt +svy#:#svy_print_selection#:#Selektion utskriftsvy +svy#:#svy_remove_all_participants#:#Radera alla deltagardata +svy#:#svy_remove_participants#:#Ta bort deltagare +svy#:#svy_selected_participants#:#Utvalda deltagare +svy#:#svy_selected_questions#:#Utvalda frågor +svy#:#svy_selection#:#Urval +svy#:#svy_status#:#Status +svy#:#svy_status_finished#:#Färdig +svy#:#svy_status_in_progress#:#Pågår +svy#:#svy_status_invited#:#Inbjuden +svy#:#svy_user_added_appraisee#:#Förfrågan '%1 +svy#:#svy_user_added_appraisee_close_mail#:#Undersökningen har avslutats för dina feedbackgivare. +svy#:#svy_user_added_appraisee_mail#:#Du har lagts till i undersökningen som en feedbackmottagare. +svy#:#svy_user_added_rater#:#Förfrågan '%1 +svy#:#svy_user_added_rater_mail#:#Du har lagts till som en feedbackgivare. +svy#:#svy_user_added_rater_reminder_mail#:#Bedöm fortfarande följande feedbackmottagare +svy#:#svy_user_not_found#:#Ingen motsvarande användare hittades. +svy#:#svy_users_invited#:#Användarna har bjudits in. +sysc#:#sysc_action_list_tree#:#Skapa en dump av trädstrukturen +sysc#:#sysc_action_repair#:#Repair +sysc#:#sysc_action_show_tree#:#Visa trädstruktur +sysc#:#sysc_action_validate#:#Granskning +sysc#:#sysc_administrate_deleted#:#Hantera raderade objekt +sysc#:#sysc_btn_tree_missing#:#Starta återhämtning +sysc#:#sysc_btn_tree_structure#:#Regenerera trädstruktur +sysc#:#sysc_completed_num#:#Avslutade uppgifter +sysc#:#sysc_cron_empty_trash#:#Ta bort papperskorgen +sysc#:#sysc_cron_empty_trash_desc#:#Om aktiverat tas objekt i papperskorgen automatiskt bort från systemet baserat på vissa kriterier (ålder, objekttyp, antal). +sysc#:#sysc_failed_num#:#Ouppfyllda uppgifter +sysc#:#sysc_groups#:#Grupper för systemkontroll +sysc#:#sysc_grp_tree#:#Magasin träd +sysc#:#sysc_grp_tree_desc#:#Analyserar och reparerar dataintegriteten i tidskriftens träd +sysc#:#sysc_message_success#:#Inga fel upptäcktes. +sysc#:#sysc_message_tree_missing_confirm#:#Vill du återställa de saknade posterna i trädstrukturen? +sysc#:#sysc_message_tree_structure_confirm#:#Var säker på att du vill reparera trädstrukturen. Vi rekommenderar starkt att du skapar en säkerhetskopia av ILIAS-databasen innan du reparerar den. +sysc#:#sysc_overview#:#Översikt +sysc#:#sysc_status_completed#:#Uppfyllt +sysc#:#sysc_status_failed#:#Missad +sysc#:#sysc_status_na#:#Ännu ej utförd +sysc#:#sysc_status_running#:#Vill bli utförd +sysc#:#sysc_tab_trash#:#Borttagna objekt +sysc#:#sysc_task_overview#:#Arbetsuppgifter +sysc#:#sysc_task_structure#:#Trädstruktur +sysc#:#sysc_task_structure_desc#:#Analyserar och korrigerar strukturen i tidningsträdet +sysc#:#sysc_task_tree_dump#:#Lista träd +sysc#:#sysc_task_tree_dump_desc#:#Analyserar trädstrukturen och listar alla trädnoder tillsammans med analysdata. +sysc#:#sysc_task_tree_duplicates#:#Dubbla poster i trädstrukturen +sysc#:#sysc_task_tree_duplicates_desc#:#Söker i systemet efter dubbla poster i tidskriftsträdet. +sysc#:#sysc_task_tree_missing#:#Saknade poster i trädstrukturen +sysc#:#sysc_task_tree_missing_desc#:#Söker i systemet efter saknade poster i trädstrukturen +sysc#:#sysc_task_tree_missing_reference#:#Saknade referenser +sysc#:#sysc_task_tree_missing_reference_desc#:#Finnar och reparerar saknade objektreferenser för poster i tidningsträdet. +sysc#:#sysc_task_tree_missing_tree#:#Saknade poster i tidskriftsträdet +sysc#:#sysc_task_tree_missing_tree_desc#:#Söker och reparerar saknade poster för refererade objekt i tidningsträdet. +sysc#:#sysc_trash_action#:#Åtgärder +sysc#:#sysc_trash_limit_age#:#Åldersgräns +sysc#:#sysc_trash_limit_num#:#Nummer gräns +sysc#:#sysc_trash_limit_type#:#Typ av gränsvärde +sysc#:#sysc_trash_remove#:#Ta bort raderade objekt +sysc#:#sysc_trash_remove_info#:#Ta bort objekt i papperskorgen från systemet +sysc#:#sysc_trash_restore#:#Återställ raderade objekt +sysc#:#sysc_trash_restore_info#:#Återställ alla objekt i papperskorgen och flytta dem till räddningsmappen. +sysc#:#sysc_tree_duplicate_failures#:#Duplicerade poster hittades i trädstrukturen. Antal dubbletter av poster +sysc#:#sysc_tree_list_failures#:#En dump av magasinträdet skapades. Antal fel som hittades +sysc#:#sysc_tree_missing_failures#:#Det saknas poster i trädstrukturen. Antal saknade poster +sysc#:#sysc_tree_structure_failures#:#Antal fel i trädstrukturen (föräldrarelation) +tagging#:#no_tag_text_1#:#Du har för närvarande inte använt några taggar. För att göra detta måste du vidta två åtgärder +tagging#:#no_tag_text_2#:#Klicka på "%s" och välj ett lärandeobjekt från det tillgängliga utbudet, t.ex. en lärmodul eller ett forum. +tagging#:#no_tag_text_3#:#Öppna sedan objektets åtgärdsmeny och välj"Ange taggar". +tagging#:#tag_remove_tags_of_obj_without_access#:#Ta bort tagg +tagging#:#tag_some_obj_tagged_without_access#:#Du har inte längre tillgång till några av de taggade objekten. Bör taggen för dessa objekt tas bort? +tagging#:#tag_tags_deleted#:#Tag togs bort för objekt utan åtkomst. +tagging#:#tagging_all_users#:#Alla användare +tagging#:#tagging_edit_settings#:#Inställningar +tagging#:#tagging_enable_all_users#:#Visa taggar för alla användare +tagging#:#tagging_enable_all_users_info#:# Lägger till ett "Alla användare"-område på infosidan som visar taggarna för alla besökare till en resurs. +tagging#:#tagging_enable_tagging#:#Aktivera taggning +tagging#:#tagging_forbidden_tags#:#Förbjudna taggar +tagging#:#tagging_no_obj_for_tag#:#Det finns inget innehåll taggat med '%s'. +tagging#:#tagging_other_users#:#Tags från andra användare +tagging#:#tagging_resources_for_tag#:#Innehåll taggat med %s +tagging#:#tagging_search_users#:#Sök användare +tagging#:#tagging_set_tag#:#Ange taggar +tagging#:#tagging_settings#:#Inställningar +tagging#:#tagging_tag#:#Tag +tagging#:#tagging_tag_info#:#För att tagga innehåll, öppna objektets informationssida och ange taggarna där. +tagging#:#tagging_tags#:#Etiketter +tagging#:#tagging_users_using_tag#:#Användare som använder taggar +task#:#task_deadline#:#Slut +task#:#task_derived_tasks#:#Att göra +task#:#task_details#:#Detaljer +task#:#task_no_task_items#:#Det finns inget att göra för dig. +task#:#task_no_tasks#:#Du har för närvarande inga öppna att göra-uppgifter. +task#:#task_start#:#Begin +task#:#task_task#:#Uppgift +task#:#task_tasks_with_deadline#:#Med slutdatum +task#:#task_tasks_without_deadline#:#Utan slutdatum +tax#:#obj_taxn#:#Nod +tax#:#tax_add_taxonomy#:#Lägg till taxonomi +tax#:#tax_added#:#Taxonomin har skapats. +tax#:#tax_admin_settings_repository#:# Taxonomier för tidskrifter +tax#:#tax_alphabetical#:#Alfabetisk +tax#:#tax_assigned_items#:# Tilldelade poster +tax#:#tax_confirm_deletion#:#Vill du verkligen radera hela taxonomin med alla relationer? +tax#:#tax_create_node#:#Skapa nod +tax#:#tax_item_sorting#:#Support sortering av de tilldelade posterna +tax#:#tax_manual#:#Handbok +tax#:#tax_max_one_tax#:#Du kan bara använda en taxonomi här. +tax#:#tax_new_tax_node#:#Ny nod +tax#:#tax_node#:#Nod +tax#:#tax_node_sorting#:#Sortering av noderna +tax#:#tax_nodes#:#Nod +tax#:#tax_order#:#Beställ +tax#:#tax_order_nr#:# Beställningsnummer +tax#:#tax_please_select_target#:#Vänligen välj en destination! +tax#:#tax_target_within_nodes#:#Målet får inte vara en undernod till det valda elementet. +tax#:#tax_tax_assignment#:#Taxonomiuppdrag +tax#:#tax_tax_deleted#:#Taxonomin har tagits bort. +tax#:#tax_tax_settings#:#Taxonomiska inställningar +tax#:#tax_taxonomy#:#Taxonomi +tbl#:#tbl_export_csv#:#.CSV-export +tbl#:#tbl_export_excel#:#Excel export +tbl#:#tbl_template_create#:#Spara aktuell vy +tbl#:#tbl_template_created#:#Den aktuella vyn har sparats. +tbl#:#tbl_template_delete#:#Ta bort sparad vy +tbl#:#tbl_template_deleted#:#Den sparade vyn har tagits bort. +tbl#:#tbl_templates#:#Visa +tos#:#deleteDocument#:#Radera +tos#:#detachCriterionAssignment#:#Radera +tos#:#tos_acceptance_history#:#Historia om samtycke +tos#:#tos_account_reg_not_possible#:#Självregistrering är för närvarande inte möjlig eftersom inget användaravtal erbjuds i denna installation. Kontakta din systemadministratör för mer information. +tos#:#tos_add_document_btn_label#:#Lägg till dokument +tos#:#tos_agreement#:#Använda avtal +tos#:#tos_agreement_document#:#Dokument +tos#:#tos_agreement_document_missing#:#Inte tillgänglig +tos#:#tos_agreement_documents_tab_label#:#Använda avtal +tos#:#tos_agreement_exists#:#Nuvarande +tos#:#tos_agreement_missing#:#Inte tillgänglig +tos#:#tos_crit_type_usr_country#:#Userland +tos#:#tos_crit_type_usr_country_info#:#Dokumentet måste accepteras om detta land valdes vid den första inloggningen. En senare ändring av användarspråket leder inte automatiskt till att ett nytt dokument måste skickas in. +tos#:#tos_crit_type_usr_global_role#:#Global roll +tos#:#tos_crit_type_usr_global_role_info#:#Dokumentet måste accepteras om en användare anges i denna roll vid den första inloggningen. En senare ändring av rollen leder inte automatiskt till att ett nytt dokument måste skickas in. +tos#:#tos_crit_type_usr_language#:#Användarspråk +tos#:#tos_crit_type_usr_language_info#:#Dokumentet måste accepteras om detta språk valdes vid den första inloggningen. En senare ändring av användarspråket leder inte automatiskt till att ett nytt dokument måste skickas in. +tos#:#tos_criterion_assignment_must_be_unique_insert#:#Du kan inte tilldela mallkriteriet med motsvarande konfiguration. En identisk tilldelning finns redan. +tos#:#tos_criterion_assignment_must_be_unique_update#:#Du kan inte ändra konfigurationen av mallkriteriet efter önskemål. En identisk tilldelning finns redan. +tos#:#tos_deleted_documents_p#:#De valda dokumenten har raderats. +tos#:#tos_deleted_documents_s#:#Dokumentet har tagits bort. +tos#:#tos_disabled_no_docs_left#:#Användaravtalen har inaktiverats eftersom alla dokument har raderats. Skapa minst ett dokument innan du återaktiverar användaravtalen. +tos#:#tos_doc_crit_attached#:#Mallkriteriet har tilldelats. +tos#:#tos_doc_crit_changed#:#Mallkriteriet har uppdaterats. +tos#:#tos_doc_crit_detached#:#Mallkriteriet har tagits bort. +tos#:#tos_doc_delete#:#Radera dokument +tos#:#tos_doc_detach_crit_confirm_title#:#Ta bort kriteriet för mall +tos#:#tos_doc_sure_detach_crit#:#Är du säker på att mallkriteriet ska tas bort? +tos#:#tos_document#:#Dokument +tos#:#tos_form_attach_criterion_head#:#Lägg till mallkriterium +tos#:#tos_form_criterion#:#Kriterium för mall +tos#:#tos_form_document#:#Dokument +tos#:#tos_form_document_content_changed#:#Innehållet i den uppladdade filen har rensats av ILIAS. Kontrollera resultatet och ladda upp en ny fil om du är osäker. +tos#:#tos_form_document_info#:#Välj en lämplig fil från ditt lokala filsystem. Du kan ladda upp en enkel textfil eller en HTML-fil. Endast delar av HTML-språket stöds. Observera att HTML-filer rensas under uppladdningen och att endast innehållet i body-elementet övertas. +tos#:#tos_form_document_new#:#Ändra innehåll +tos#:#tos_form_document_new_info#:#Här kan du välja en ny fil från ditt lokala filsystem för att ändra dokumentet. Du kan ladda upp en enkel textfil eller en HTML-fil. Hela HTML-språket stöds inte. Observera att HTML-filer rensas under uppladdningen och att endast innehållet i body-elemen +tos#:#tos_form_document_title#:#Titel +tos#:#tos_form_document_title_info#:# Ange en titel för dokumentet här. +tos#:#tos_form_edit_criterion_head#:#Redigera kriterium för mall +tos#:#tos_form_edit_doc_head#:#Redigera dokument +tos#:#tos_form_new_doc_head#:#Skapa dokument +tos#:#tos_last_modified#:#Sista förändringen +tos#:#tos_last_reset_date#:#Användaravtalen återställdes senast den %s. Återställ endast användaravtalen om de har ändrats under tiden och samtycke till detta ändrade avtal önskas. +tos#:#tos_never_reset#:#Användaravtalen har ännu inte återställts. Återställ endast användaravtalen om de har ändrats under tiden och samtycke till detta ändrade avtal önskas. +tos#:#tos_no_documents_exist#:#Det finns för närvarande inga tillgängliga dokument om användningsavtal. +tos#:#tos_no_documents_exist_cant_save#:#Det finns för närvarande inga tillgängliga användaravtal. Vänligen skapa minst ett dokument för att aktivera tjänsten. +tos#:#tos_period#:#Tidsperiod +tos#:#tos_period_from#:#Från +tos#:#tos_period_until#:#Till +tos#:#tos_reevaluate_on_login#:#Kontrollera nytt användaravtal vid inloggning +tos#:#tos_reevaluate_on_login_desc#:#Om aktiverat, efter lyckad inloggning via webbgränssnittet, kontrolleras det om ett dokument som redan har accepterats inte längre är giltigt eftersom användarens mallkriterier har ändrats. Om så är fallet och ILIAS kan hitta ett nytt dokument, måste anv +tos#:#tos_reset_successful#:#Användaravtalen har återställts framgångsrikt. +tos#:#tos_reset_tos_for_all_users#:#Återställ användningsavtal +tos#:#tos_saved_sorting#:#Sorteringen har sparats. +tos#:#tos_status_desc#:#Användare ombeds att underteckna användaravtalet innan de kan använda ILIAS. +tos#:#tos_status_enable#:#Aktivera användningsavtal +tos#:#tos_sure_delete_documents_p#:#Är du säker på att du vill radera de valda dokumenten? +tos#:#tos_sure_delete_documents_s#:#Är du säker på att du vill ta bort det markerade dokumentet? +tos#:#tos_sure_reset_tos#:#Är du säker på att användaravtalen för alla användare i systemet ska återställas? Detta gäller även de inloggningskonton som används för SOAP-webbtjänsterna, till exempel. +tos#:#tos_tbl_docs_action_add_criterion#:#Lägg till mallkriterium +tos#:#tos_tbl_docs_cell_not_criterion#:#Inget mallkriterium tilldelat +tos#:#tos_tbl_docs_head_created#:#Datum för skapande +tos#:#tos_tbl_docs_head_criteria#:#Kriterier för mall +tos#:#tos_tbl_docs_head_last_change#:#Sista förändringen +tos#:#tos_tbl_docs_head_sorting#:#Sortering +tos#:#tos_tbl_docs_head_title#:#Titel +tos#:#tos_tbl_docs_title#:#Dokument +tos#:#tos_tbl_hist_cell_not_criterion#:#Inget mallkriterium tilldelat +tos#:#tos_tbl_hist_head_acceptance_date#:#Datum +tos#:#tos_tbl_hist_head_criteria#:#Kriterier för mall +tos#:#tos_tbl_hist_head_document#:#Dokument +tos#:#tos_tbl_hist_head_firstname#:#Förnamn +tos#:#tos_tbl_hist_head_lastname#:#Efternamn +tos#:#tos_tbl_hist_head_login#:#Login namn +tos#:#tos_tos_settings#:#Inställningar +tos#:#tos_withdrawal_usr_deletion#:#Radering av ILIAS-kontot efter återkallelse +tos#:#tos_withdrawal_usr_deletion_info#:#Om samtycke till användaravtalet återkallas raderas ILIAS-kontot automatiskt. +trac#:#cmix_lp_mode_deactivated#:#Learning progress är avaktiverad +trac#:#cmix_lp_mode_deactivated_info#:#Inlärningsstatus visas inte och har inget inflytande på objekt på högre nivå. +trac#:#cmix_lp_mode_when_completed#:#Completed när "completed". +trac#:#cmix_lp_mode_when_completed_info#:#ILIAS-status "completed" anges om verbet i det sista relevanta xAPI-uttalandet är "completed". +trac#:#cmix_lp_mode_when_passed#:#Fullbordad när "godkänd". +trac#:#cmix_lp_mode_when_passed_info#:#ILIAS-statusen "completed" sätts om verbet i det sista relevanta xAPI-uttalandet är "passed" eller "satisfied". +trac#:#cmix_lp_mode_when_passed_or_completed#:#Fullbordad när "fullbordad" eller "godkänd +trac#:#cmix_lp_mode_when_passed_or_completed_info#:#ILIAS-statusen "completed" sätts om verbet i det sista relevanta xAPI-uttalandet är "completed" eller "passed" eller "satisfied". +trac#:#cmix_lp_mode_with_failed#:#Beakta även statusen "misslyckad" +trac#:#cmix_lp_mode_with_failed_info#:#Status kan sättas till "failed" istället för "in progress". +trac#:#create_date_max#:#Senaste registrering +trac#:#create_date_min#:#Tidig registrering +trac#:#info_valid_request#:#Om två förfrågningar från en användare sker inom detta tidsintervall, utvärderas motsvarande tidsintervall som "aktivt". +trac#:#last_login#:#Sista inloggning +trac#:#meta_typical_learning_time#:#Typisk inlärningstid +trac#:#obj_types#:#Objekttyper +trac#:#read_count_avg#:#Genomsnittliga sidvisningar +trac#:#registration_filter#:#Datum för registrering +trac#:#search_area_info#:#Vänligen välj ett objekt. +trac#:#search_terms#:#Sökord(er) +trac#:#select_one#:#Vänligen välj ett objekt. +trac#:#session_statistics#:#Statistik över sessionen +trac#:#trac_aggregation#:#Aggregering +trac#:#trac_all#:#Alla +trac#:#trac_anonymized#:#Anonymisering av uppgifterna +trac#:#trac_anonymized_info#:#Om aktiverat, inga personuppgifter kommer att skickas ut +trac#:#trac_anonymized_info_short#:#(Anonymiserad) +trac#:#trac_assigned#:#Vald +trac#:#trac_average#:#Genomsnitt +trac#:#trac_begin_at#:#Startdatum +trac#:#trac_closed_expire#:#Timeout +trac#:#trac_closed_idle#:#Tid för väntan +trac#:#trac_closed_idle_first#:#Idle-tid (1:a begäran) +trac#:#trac_closed_login#:#Anonym till inloggning +trac#:#trac_closed_manual#:#Logga ut +trac#:#trac_closed_misc#:#Annat +trac#:#trac_collection_assign#:#Välj för bestämning av inlärningsframsteg +trac#:#trac_collection_deassign#:#Avmarkera +trac#:#trac_collection_manual_learner_changed_ts#:#Hängde på +trac#:#trac_collection_manual_learner_info#:#Inlärningsförloppet för detta objekt anges manuellt. +trac#:#trac_collection_manual_learner_lm_info#:#Aktivera alla kapitel som du har slutfört. +trac#:#trac_collection_tlt_learner_info#:#Inlärningsförloppet för detta objekt baseras på den typiska inlärningstiden. +trac#:#trac_collection_tlt_learner_subitem#:#Du har hittills tillhandahållit %s av de %s som krävs (%s%%). +trac#:#trac_comment#:#Kommentar +trac#:#trac_completed#:#Editerad +trac#:#trac_cron_info#:#Aktivera cron-jobbet "Objektstatistik" för att samla in data för denna utvärdering. +trac#:#trac_crs_objects#:#Användare +trac#:#trac_current#:#Aktuell +trac#:#trac_current_system_load#:#Aktuell belastning på systemet +trac#:#trac_data_deleted#:#Data har raderats. +trac#:#trac_defaults#:#Redigerad status +trac#:#trac_defaults_inactive#:#Inaktiv +trac#:#trac_defaults_info#:#Ställer in läget för att bestämma bearbetningsstatus för objekttyper som stöds. Används av märken och certifikat. +trac#:#trac_delete_data#:#Radera data +trac#:#trac_determines_learning_progress#:#Fastställer framsteg i inlärningen +trac#:#trac_edit_collection#:#Välj nu de material som kommer att användas för att fastställa inlärningsframsteg. +trac#:#trac_end_at#:#Slutdatum +trac#:#trac_failed#:#Misslyckad +trac#:#trac_figure#:#Nyckeltal +trac#:#trac_filter_area#:#Område +trac#:#trac_filter_has_status#:# Visa även objekt med status 'Ännu ej påbörjad +trac#:#trac_filter_hidden#:#Färgad ut +trac#:#trac_first_access#:#Första åtkomst +trac#:#trac_first_and_last_access#:#Första och sista tillgång +trac#:#trac_frm_contribution_num_postings#:#Erforderligt antal bidrag +trac#:#trac_group_materials#:#Create grouping med valfritt material +trac#:#trac_group_materials_save#:#Spara antal obligatoriska material +trac#:#trac_grouped_material_obligatory_err#:#Antalet obligatoriska material måste vara större än 0 och mindre än antalet material som tilldelats denna gruppering. +trac#:#trac_hide#:#Dölj +trac#:#trac_hide_selected#:#Dölj markerat innehåll +trac#:#trac_in_progress#:#Pågår +trac#:#trac_info_edited#:#Om du tror att du har arbetat igenom allt innehåll kan du ändra statusen för din inlärningsprocess här. +trac#:#trac_last_access#:#Sista åtkomst +trac#:#trac_last_aggregation#:#Stånd +trac#:#trac_last_maxed_out_sessions#:#Sista fulla last +trac#:#trac_learning_progress#:#Framsteg inom lärande +trac#:#trac_learning_progress_of#:#Lärande framsteg från %s +trac#:#trac_learning_progress_settings_info#:# Aktivera avancerade data +trac#:#trac_lhist_obj_completed#:#$1$ slutfördes. +trac#:#trac_lhist_obj_completed_in#:#$1$ slutfördes på $2$. +trac#:#trac_log_info#:#Sista aggregering +trac#:#trac_log_info_link#:#Uppdatera +trac#:#trac_long_system_load#:#Långsiktig historia +trac#:#trac_lp_determination#:#Fastställande av framsteg i inlärningen +trac#:#trac_lp_determination_info_crs#:#Urval av de material på grundval av vilka den övergripande statusen bestäms. +trac#:#trac_lp_determination_info_crs_tutor#:#Välj de objekt som ska bidra till fastställandet av inlärningsförloppet. +trac#:#trac_lp_determination_info_mob#:#Välj de medieobjekt på grundval av vilka den övergripande statusen för Mediacast bestäms. +trac#:#trac_lp_determination_info_sco#:#Välj den SCOx som används för att fastställa SCORM-modulens övergripande status. +trac#:#trac_lp_determination_tutor#:#Välja objekt som bestämmer inlärningsförloppet +trac#:#trac_lp_filter#:#Filter +trac#:#trac_lp_learner_access#:#Visa dina egna framsteg i lärandet +trac#:#trac_lp_learner_access_info#:#När den är aktiverad kan användarna se sina egna inlärningsresultat. +trac#:#trac_lp_list_gui#:#Dashboard, Magasin, Sök +trac#:#trac_lp_list_gui_info#:#Om den är aktiverad visas status för inlärningsförloppet i objektlistor. +trac#:#trac_lp_settings_info_parent_container#:#Lärandeutveckling av överordnade objekt +trac#:#trac_lp_settings_info_parent_legend#:#Objektets status för inlärningsframsteg påverkas av "%s". +trac#:#trac_manual_display#:#Visa i lärandets framsteg +trac#:#trac_manual_is_displayed#:#Fastställer framsteg i inlärningen +trac#:#trac_manual_no_display#:#Visa inte i inlärningsprocessen +trac#:#trac_mark#:#Note +trac#:#trac_matrix#:#Matrisvy +trac#:#trac_maxed_out_counter#:#Avvisade användare +trac#:#trac_maxed_out_time#:#Full kapacitet [min] +trac#:#trac_measure#:#Nyckeltal +trac#:#trac_members_short#:#Del. +trac#:#trac_min_passed#:#Minsta antal befintliga material +trac#:#trac_mode#:#Läge för framsteg i inlärningen +trac#:#trac_mode_cmix_compl_or_passed_with_failed#:#'Processed' om 'completed' eller 'passed' eller 'satisfied' skickades; 'failed' sätter ILIAS inlärningsförlopp till 'failed'. +trac#:#trac_mode_cmix_compl_or_passed_with_failed_info#:# +trac#:#trac_mode_cmix_compl_with_failed#:#'Processed' om 'completed' skickades; 'failed' sätter ILIAS-inlärningsförloppet till 'failed'. +trac#:#trac_mode_cmix_compl_with_failed_info#:# +trac#:#trac_mode_cmix_completed#:#'Processed' om 'completed' skickades; 'failed' sätter ILIAS inlärningsförlopp till 'in progress'. +trac#:#trac_mode_cmix_completed_info#:# +trac#:#trac_mode_cmix_completed_or_passed#:#'Processed' om 'completed' eller 'passed' eller 'satisfied' har skickats; 'failed' sätter ILIAS inlärningsförlopp till 'in progress'. +trac#:#trac_mode_cmix_completed_or_passed_info#:# +trac#:#trac_mode_cmix_passed#:#'Processed' om 'passed' eller 'satisfied' skickades; 'failed' sätter ILIAS inlärningsförlopp till 'in progress'. +trac#:#trac_mode_cmix_passed_info#:# +trac#:#trac_mode_cmix_passed_with_failed#:#'Processed' om 'passed' eller 'satisfied' skickades; 'failed' sätter ILIAS inlärningsförlopp till 'failed'. +trac#:#trac_mode_cmix_passed_with_failed_info#:# +trac#:#trac_mode_collection#:#Status bestäms på grundval av ett urval av objekt +trac#:#trac_mode_collection_info#:#Status för objektets inlärningsförlopp bestäms automatiskt av status för de valda objekten.
Efter att ha sparat denna inställning kan önskade objekt väljas på denna sida. +trac#:#trac_mode_collection_manual#:#User bestämmer själv status för inlärningsframstegen i respektive kapitel. +trac#:#trac_mode_collection_manual_info#:#Användarna bestämmer själva när de har slutfört ett kapitel i inlärningsmodulen. Så snart de har avslutat arbetet med ett kapitel sätter de status för detta kapitel till "Worked on" på fliken "Info".
Efter att ha sparat dessa inställningar kan kapit +trac#:#trac_mode_collection_mobs#:#Urval av mediaobjekt +trac#:#trac_mode_collection_mobs_info#:#Framsteget i inlärningen bestäms automatiskt utifrån antalet visade mediaobjekt. +trac#:#trac_mode_collection_tlt#:#Minsta utbildningstid per kapitel +trac#:#trac_mode_collection_tlt_info#:#Statusen för en användare sätts automatiskt efter den tid som användaren arbetar med ett kapitel. Statusen för ett kapitel till "Redigerat" tilldelas när den "Typiska inlärningstiden" för alla kapitel som är relevanta för inlärningsframstegen överskrids. +trac#:#trac_mode_content_visited#:#Besök +trac#:#trac_mode_content_visited_info#:#Inlärningsnivån bestäms av hur innehållet förmedlas. +trac#:#trac_mode_contribution_to_discussion#:#Bidrag till diskussionen +trac#:#trac_mode_contribution_to_discussion_info#:#Inlärningsframstegen bestäms av antalet skrivna inlägg. +trac#:#trac_mode_course_reference#:#Tagen från kursen +trac#:#trac_mode_course_reference_info#:#The learning progress mode är automatiskt hämtat från den kurs som denna kurslänk hänvisar till. +trac#:#trac_mode_deactivated#:#Learning progress är avaktiverad +trac#:#trac_mode_deactivated_info_new#:#Status för inlärningsframsteg visas inte och påverkar inte några objekt på högre nivå. +trac#:#trac_mode_event#:#Tutorer registrerar deltagande +trac#:#trac_mode_event_info#:#Tutorer kontrollerar vilka deltagare som har deltagit i sessionen och registrerar närvaron manuellt på fliken "Hantera sessionsdeltagare". +trac#:#trac_mode_exercise_returned#:#Tutor beslutar om status +trac#:#trac_mode_exercise_returned_info#:#Tutors avgör på grundval av inlämningarna om deltagarna har löst övningen. Handledarna sätter manuellt statusen till "Bearbetad" eller "Misslyckad". +trac#:#trac_mode_individual_assessment#:#Individuell bedömning av handledare/utbildare +trac#:#trac_mode_individual_assessment_info#:#Deltagaren måste slutligen bedömas så att inlärningsframstegen fastställs för honom/henne. +trac#:#trac_mode_lti_outcome#:#Mastery Score måste uppnås +trac#:#trac_mode_lti_outcome_info#:#Lärandet anses vara slutfört när LTI Outcome Service-poängen är minst lika hög som Mastery-poängen. +trac#:#trac_mode_manual#:#User bestämmer status för inlärningsförloppet för hela objektet. +trac#:#trac_mode_manual_by_tutor#:#Tutor beslutar om status för inlärningsförloppet +trac#:#trac_mode_manual_by_tutor_info#:#Tutors avgör om deltagarna har bearbetat objektet framgångsrikt. Handledarna sätter manuellt statusen till "Fungerade" eller "Misslyckades". +trac#:#trac_mode_manual_info#:#Användarna bestämmer själva när de har arbetat igenom objektet. Så snart bearbetningen är klar sätter de statusen i fliken "Info" till "Bearbetad". +trac#:#trac_mode_objectives#:#Lärandemål +trac#:#trac_mode_objectives_info#:#Lärandets framsteg bestäms automatiskt utifrån antalet lärandemål som uppfyllts. +trac#:#trac_mode_plugin#:#Plugin +trac#:#trac_mode_questions#:#Besvarade alla frågor korrekt +trac#:#trac_mode_questions_info#:#Användare som har svarat rätt på alla frågor får automatiskt statusen "Redigerad". Använd endast detta alternativ om det faktiskt finns frågor i utbildningsmodulen. +trac#:#trac_mode_scorm#:#Status bestäms av ett urval av SCORM-kapitel (per SCO) +trac#:#trac_mode_scorm_info#:#Status för inlärningsförloppet för hela inlärningsmodulen bestäms automatiskt av status för de valda kapitlen (SCOs).
När du har sparat denna inställning kan du välja önskat SCO på denna sida. +trac#:#trac_mode_scorm_package#:#Status bestäms av SCORM-paketet (hela inlärningsmodulen) +trac#:#trac_mode_scorm_package_info#:#Statusen för en användare sätts automatiskt till "Worked" när hela inlärningsmodulen har arbetats igenom. Alla SCO:er som ingår i paketet beaktas i inlärningsförloppet. +trac#:#trac_mode_study_programme#:#Studieprogram avslutat +trac#:#trac_mode_survey_finished#:#Undersökningen avslutad +trac#:#trac_mode_survey_finished_info#:#Undersökningen måste avslutas. +trac#:#trac_mode_test_finished#:#Användaren måste avsluta testet +trac#:#trac_mode_test_finished_info#:#Statusen för en användare sätts automatiskt till "Redigerad" efter att användaren har klickat på "Avsluta test". Det spelar ingen roll om användaren har klarat testet eller inte. +trac#:#trac_mode_test_passed#:#Användare måste klara testet +trac#:#trac_mode_test_passed_info#:#En användares status sätts automatiskt till "Redigerad" efter att användaren har klarat testet. På fliken "Inställningar" kan tröskelvärden för godkänt test ställas in i avsnittet "Bedömningsschema". +trac#:#trac_mode_tlt#:#Minsta utbildningstid för hela utbildningsmodulen +trac#:#trac_mode_tlt_info#:#Statusen för en användare sätts automatiskt efter den tid som användaren tillbringar i inlärningsmodulen. Statusen "Redigerad" tilldelas så snart den "Typiska inlärningstiden" överskrids.
Den "typiska inlärningstiden" för inlärningsmodulen definier +trac#:#trac_mode_visited_pages#:#Sidor som besökts +trac#:#trac_mode_visited_pages_info#:#Användare som har besökt alla sidor i utbildningsmodulen får automatiskt statusen "Redigerad". +trac#:#trac_mode_visits#:#Status bestäms av antalet samtal +trac#:#trac_mode_visits_info#:#Statusen för en användare sätts automatiskt till "Redigerad" om denna användare har hämtat utbildningsmodulen oftare än det minsta antal anrop som krävs. Användarna visas hur många gånger de har öppnat modulen och hur många procent av gångerna de har upp +trac#:#trac_name_of_installation#:#Namn på anläggningen +trac#:#trac_no_attempted#:#Ännu inte redigerad +trac#:#trac_not_accessed#:#Not yet accessed +trac#:#trac_not_assigned#:#Inte vald +trac#:#trac_not_attempted#:#Not yet started +trac#:#trac_not_completed#:#Inte redigerad +trac#:#trac_not_participated#:#Inte deltagit +trac#:#trac_not_registered#:#Inte inloggad +trac#:#trac_object_link#:#Länk till objektet +trac#:#trac_object_name#:#Namn på objektet +trac#:#trac_object_owner#:#Ägare av objektet +trac#:#trac_object_stat_access#:#Använd intensitet +trac#:#trac_object_stat_admin#:#Datahantering +trac#:#trac_object_stat_daily#:#Daglig kurs +trac#:#trac_object_stat_lp#:#Lärande statistik kurs +trac#:#trac_object_stat_lp_max#:#Max. +trac#:#trac_object_stat_lp_min#:#Min. +trac#:#trac_object_stat_types#:#Antal objekt +trac#:#trac_object_statistics#:#Statistik över objekt +trac#:#trac_object_statistics_info#:#Om aktiverat samlas data in för åtkomststatistik. +trac#:#trac_objects#:#Användare +trac#:#trac_others#:#Annat +trac#:#trac_participants#:#Deltagare i utställningen +trac#:#trac_participated#:#Deltagande +trac#:#trac_paths#:#Vägar +trac#:#trac_percentage#:#Procent +trac#:#trac_periodic_system_load#:#Periodisk representation av last +trac#:#trac_progress#:#Personliga framsteg i lärandet +trac#:#trac_read_count#:#Tillgångar +trac#:#trac_read_count_spent_seconds#:#Handläggningstid / åtkomst +trac#:#trac_reference#:#Referenser +trac#:#trac_reference_ids_column#:#Reference Ids +trac#:#trac_refresh#:#Uppdatera vy +trac#:#trac_registered#:#Reported +trac#:#trac_release_materials#:#Ungrupp med valfritt material +trac#:#trac_report_date#:#Datum för rapporten +trac#:#trac_report_owner#:#Rapport skapad av###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +trac#:#trac_required_visits#:#Antal besök som krävs +trac#:#trac_sahs_relevant_items#:#SCOs +trac#:#trac_scale#:#Skala +trac#:#trac_select_area#:#Ändra område +trac#:#trac_session_active_avg#:#Antal aktiva sessioner (genomsnitt) +trac#:#trac_session_active_max#:#Antal aktiva sessioner (maximalt) +trac#:#trac_session_active_min#:#Antal aktiva sessioner (minimum) +trac#:#trac_session_statistics_mode_day#:#Tag +trac#:#trac_session_statistics_mode_last_day#:#Senaste 24 timmarna +trac#:#trac_session_statistics_mode_last_month#:#Senaste 30 dagarna +trac#:#trac_session_statistics_mode_last_week#:#Senaste 7 dagarna +trac#:#trac_session_statistics_mode_month#:#Månad +trac#:#trac_session_statistics_mode_today#:#Idag +trac#:#trac_session_statistics_mode_week#:#Vecka +trac#:#trac_session_statistics_mode_year#:#År +trac#:#trac_session_statistics_no_data#:#Det finns inga tillgängliga data för denna statistik. +trac#:#trac_sessions_closed#:#Ledigheter +trac#:#trac_sessions_opened#:#Accessions +trac#:#trac_settings#:#Inställningar +trac#:#trac_settings_saved#:#Inställningarna har sparats. +trac#:#trac_short_system_load#:#Kortsiktig historia +trac#:#trac_show_graph#:#Visa som diagramvy +trac#:#trac_show_repository_views#:#Visa antal åtkomster +trac#:#trac_show_repository_views_info#:#Om den är påslagen visas antalet åtkomster på infosidan. +trac#:#trac_spent_seconds#:#Tid +trac#:#trac_spent_time#:#Total bearbetningstid +trac#:#trac_status#:#Status +trac#:#trac_status_changed#:#Sista statusförändring +trac#:#trac_subitems#:#Visa underobjekt +trac#:#trac_sum#:#Summa +trac#:#trac_summary#:#Sammanfattning +trac#:#trac_sure_delete_data#:#Vill du verkligen radera data för de följande månaderna? Detta kommer att ta bort följande statistik för den perioden +trac#:#trac_sync_obj_stats#:#Uppdatera data +trac#:#trac_sync_obj_stats_success#:#Uppgifterna har uppdaterats. +trac#:#trac_sync_session_stats#:#Aggregerade data +trac#:#trac_sync_session_stats_success#:#Data har aggregerats framgångsrikt. +trac#:#trac_time_passed#:#Bearbetningstiden överskriden +trac#:#trac_title#:#Titel +trac#:#trac_title_description#:#Titel / Beskrivning +trac#:#trac_total_online#:#Total tid online +trac#:#trac_trash#:#varav i papperskorgen +trac#:#trac_update_edit_user#:#Ändringarna har antagits +trac#:#trac_updated_status#:#Status har uppdaterats. +trac#:#trac_user_data#:#Användardata +trac#:#trac_valid_request#:#Maximal tid mellan förfrågningar +trac#:#trac_view_crs#:#Till kursöversikten +trac#:#trac_view_list#:#Till översikten +trac#:#trac_view_mode#:# Visningsläge +trac#:#trac_view_mode_all#:#Alla objekt +trac#:#trac_view_mode_collection#:#Endast objekt som bestämmer den övergripande statusen +trac#:#trac_visits#:#Minsta antal visningar +trac#:#trac_visits_info#:#Ett samtal räknas som ett nytt samtal först efter %s sekunder. +trac#:#user_total#:#Antal användare +trac#:#view_mode#:# Visningsläge +tstv#:#tstv_create#:#Skapa testcertifikat +tstv#:#tstv_create_info#:#Välj ett test för vilket du behöver ett intyg. +ui#:#datetime_required#:# Tid/Datum som krävs +ui#:#duration_default_label_end#:#Slut +ui#:#duration_default_label_start#:#Begin +ui#:#duration_end_must_not_be_earlier_than_start#:#Starten måste vara före slutet. +ui#:#ui_chars_max#:#Maximum +ui#:#ui_chars_min#:#Minimum +ui#:#ui_chars_remaining#:#Resterande bokstäver +ui#:#ui_error_in_group#:#Det har uppstått ett fel i det här området. +ui#:#ui_error_switchable_group_required#:#Vänligen gör ett urval. +ui#:#ui_file_input_general_error#:#Ett fel har uppstått. Du kan kontrollera JavaScript-konsolen i din webbläsare för att se om det finns mer information om detta fel och/eller informera administrationen av din ILIAS-installation om händelsen. +ui#:#ui_file_input_invalid_amount#:#Du får inte ladda upp så många filer på en gång! Ta bort några filer för att fortsätta. +ui#:#ui_file_input_invalid_mime#:#Filer av typen '%s' är inte tillåtna. +ui#:#ui_file_input_invalid_size#:#Filen överskrider den maximala filstorleken på %s. +ui#:#ui_invalid_url#:#Formatet på URL:en är inte korrekt. +ui#:#ui_link_label#:#Label +ui#:#ui_link_url#:#URL +ui#:#ui_numeric_only#:#Var god ange ett heltal. +ui#:#ui_tag_required#:#Var vänlig ange minst en dag. +ui#:#ui_transcription#:#Transkript +user#:#all_roles_has_starting_point#:#Alla roller med definierad startsida +user#:#back_to_starting_points_list#:#Tillbaka till startsidorna +user#:#clipboard_add_btn#:#Lägg till i Urklipp +user#:#clipboard_add_from_btn#:#Add från urklipp +user#:#clipboard_empty_btn#:#Klart klippbord +user#:#clipboard_remove_btn#:#Ta bort från Urklipp +user#:#clipboard_table_title#:#Clipboard (inloggningskonton) +user#:#clipboard_user_added#:#De valda användarna har lagts till i Urklipp. +user#:#confirm_delete_starting_point#:#Är du säker på att du vill ta bort den här regeln? +user#:#confirm_logout_for_email_change#:#Du har ändrat din e-postadress. För att slutföra denna ändring är det nödvändigt att ange ditt lösenord. Du kommer därför att loggas ut och sedan ha 5 minuter på dig att logga in igen för att slutföra ändringarna. Alla andra ändringar sparas innan du log +user#:#create_starting_point#:#Skapa regel +user#:#criteria#:#Kriterium +user#:#del_mail_body#:#Hello %1$s, %2$s Du har inte loggat in på %3$s på länge. Därför förväntas ditt ILIAS-konto raderas den %4$s. Om du vill behålla ditt ILIAS-konto måste du logga in igen före det ovannämnda datumet. +user#:#del_mail_subject#:#Ditt ILIAS-konto kommer snart att raderas +user#:#delete_inactive_user_accounts_frequency#:#Intervall +user#:#delete_inactive_user_accounts_frequency_desc#:#Intervall som används för att testa radering och för att skicka e-post. +user#:#editing_this_role#:#Redigera regel +user#:#email_could_not_be_changed#:#Din e-postadress kunde inte ändras. +user#:#enable_local_user_administration#:#Lokala konton +user#:#enable_local_user_administration_info#:#I kategorier och organisatoriska enheter visas en flik "Lokala konton". Där kan lokala ILIAS-konton skapas, importeras och hanteras. Detta gör det också möjligt för personer utan tillgång till administrationen att skapa nya ILIAS-konton. +user#:#feedhash#:#Nyhetsflöde hash +user#:#has_role#:#Roll +user#:#inform_user_mail_info#:#Ett meddelande kommer att skickas till den e-postadress som angetts ovan. Dess innehåll kan definieras i administrationen +user#:#interests#:#Intressen +user#:#interests_general#:#Allmänna intressen +user#:#interests_help_looking#:#Hjälp med sökningar +user#:#interests_help_offered#:#Erbjud hjälp +user#:#msg_spoint_not_modified#:#Hemsidan har inte ändrats. +user#:#no_deactivate_yourself#:#Du kan inte avaktivera ditt eget användarkonto. +user#:#obj_ref_id_not_exist#:#Det angivna referens-ID:t existerar inte. +user#:#restrict_user_access#:#Begränsad åtkomst till inloggningskonton +user#:#restrict_user_access_info#:#Aktivera endast detta alternativ om du vill begränsa åtkomsten till inloggningskonton. Om alternativet är aktiverat behöver användare rättigheten "Läsbehörighet till inloggningskonton" för att komma åt lokala inloggningskonton i kategorier och de globala +user#:#roles_without_starting_point#:#Roller utan definierad startsida +user#:#save_order#:#Spara sekvens +user#:#send_mail_reminder_window_too_small#:#Intervallen är för lång för att garantera att ett e-postmeddelande skickas innan kontot raderas. +user#:#send_mail_to_inactive_users#:#Meddelanden via e-post +user#:#send_mail_to_inactive_users_desc#:#Innan ILIAS-konton raderas skickar ILIAS ett e-postmeddelande till de berörda personerna. Genom att logga in på ILIAS igen skjuts raderingen upp under den inställda tidsperioden. Se till att extern e-postmottagning är möjlig. Vid aktivering av cron-jobbe +user#:#send_mail_to_inactive_users_must_be_smaller_than#:#Detta värde måste vara mindre än värdet "Dagar sedan senaste inloggning". +user#:#send_mail_to_inactive_users_numbers_only#:#Ange endast heltal, positiva värden. Din post har avrundats. +user#:#send_mail_to_inactive_users_suffix#:#dagar till radering. +user#:#show_own_online_status#:#Visa din egen online-status +user#:#starting_page#:#Startsida +user#:#starting_point#:#Startsida +user#:#starting_point_settings#:#Inställningar Hemsida +user#:#starting_points#:#Starta sidor +user#:#tos_accepted_content#:#Accepterad text +user#:#tos_not_accepted_yet#:#Ännu ej accepterad +user#:#user_access_limited#:#Tillfälligt +user#:#user_access_unlimited#:#Obegränsad +user#:#user_account_code#:#Kod +user#:#user_account_code_generated#:#Skapad på +user#:#user_account_code_generated_all#:#Alla datum +user#:#user_account_code_not_valid#:#Den angivna koden är ogiltig eller har redan använts. +user#:#user_account_code_setting#:# Möjliggör återaktivering av ILIAS-konton via koder +user#:#user_account_code_setting_info#:#Enskilda personer kan återaktivera sitt utgångna ILIAS-konto med hjälp av en registreringskod. Motsvarande koder för förnyelse av tillfälliga ILIAS-konton finns i "Administration " Autentisering / Ny registrering " ILIAS-Auth/Self-Registration +user#:#user_account_code_used#:#Konsumeras på +user#:#user_account_code_valid_until#:#Giltig tills +user#:#user_account_code_valid_until_dynamic#:#Antal dagar +user#:#user_account_code_valid_until_static#:#Slutdatum +user#:#user_account_code_valid_until_unlimited#:#Obegränsad +user#:#user_account_codes_add#:#Skapa koder +user#:#user_account_codes_edit_header#:#Skapa nya koder +user#:#user_account_codes_export#:#Exportkoder +user#:#user_account_codes_number#:#Antal koder +user#:#user_account_deleted_confirmation#:#Ditt ILIAS-konto har tagits bort. Ett e-postmeddelande med ytterligare information har skickats till dig. +user#:#user_activate_public_profile#:#Aktivering +user#:#user_activate_public_profile_info#:#För- och efternamn är alltid synliga när profilen är aktiverad. +user#:#user_activation#:#Aktivering +user#:#user_adm_enable_alpha_nav#:#Alphabetical navigation för tabellen "ILIAS accounts +user#:#user_all#:#Alla +user#:#user_allow_delete_own_account#:#Användaren kan radera sitt eget ILIAS-konto +user#:#user_any#:#Alla +user#:#user_awrn_all_users#:#Alla användare +user#:#user_awrn_all_users_info#:#Alla användare av plattformen är listade. Uppmärksamhet +user#:#user_check_profile_data#:#Kontrollera profilens data +user#:#user_chooses_starting_page#:#User sätter startsida +user#:#user_delete_own_account#:#Radera ILIAS-konto +user#:#user_delete_own_account_aborted#:#Raderingsprocessen avbröts. Kontot är oförändrat. +user#:#user_delete_own_account_email_body#:#Ditt ILIAS-konto "%s" på %s raderades på %s. +user#:#user_delete_own_account_email_subject#:#ILIAS-konto raderat +user#:#user_delete_own_account_final_confirmation#:#Bekräfta en sista gång att ditt ILIAS-konto oåterkalleligen ska tas bort från systemet. +user#:#user_delete_own_account_info#:#Här kan du radera ditt nuvarande ILIAS-konto. Tänk på att denna process inte kan ångras! +user#:#user_delete_own_account_logout_button#:#Fortsätt med autentisering +user#:#user_delete_own_account_logout_confirmation#:#Your ILIAS account has been marked for deletion, please authenticate to continue the process. +user#:#user_delete_own_account_notification_email#:#Meddelanden via e-post +user#:#user_field#:#Fält +user#:#user_global_role#:#Global roll +user#:#user_last_login_before#:#Sista inloggning före +user#:#user_limited_access#:#Tillfälligt +user#:#user_local_role#:#Lokal roll +user#:#user_lv_do_not_store#:#Spara inga poster +user#:#user_lv_keep_entries#:#Spara poster +user#:#user_lv_keep_only_for_session#:#Radera poster efter sessionen +user#:#user_make_profile_public#:#Publicering +user#:#user_member_of_course_group#:#Medlem i kurs/grupp +user#:#user_no_courses#:#Ingen kurs tilldelad +user#:#user_no_groups#:#Ingen grupp tilldelad +user#:#user_order#:#Beställ +user#:#user_ownership#:#Magasinobjekt +user#:#user_please_select_course_group#:#Vänligen välj en grupp eller kurs. +user#:#user_portfolios#:#Portföljer +user#:#user_portfolios_desc#:#Användare kan skapa portföljer och använda dem som profiler. +user#:#user_privacy_checklist#:#Checklista för dataskydd +user#:#user_profile_data#:#Profiluppgifter +user#:#user_profile_data_checked#:#Profiluppgifter kontrollerade +user#:#user_profile_info#:#Infotext Profile Publication###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +user#:#user_profile_info_std#:#Infotext###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +user#:#user_profile_info_text_info#:#Denna text visas ovanför formuläret för inmatning av personuppgifter. +user#:#user_profile_portfolio#:#Om du vill använda en portfölj som din profil, ange attributet "Min profil" i portföljområdet. +user#:#user_profile_portfolio_selected#:#Du använder för närvarande en portfölj som din profil. Aktivering sker där via fliken "Frigör". +user#:#user_profile_preview#:#Förhandsgranskning av profilen +user#:#user_profile_prompt_text_info#:#Den här texten ersätter informationstexten ovan om du använder profilpublikationens prompt.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +user#:#user_prompt_incomplete#:#Nie +user#:#user_prompt_incomplete_info#:#Användaren ombeds aldrig att publicera sin profil. +user#:#user_prompt_once_after_login#:#Efter en viss tid efter den första inloggningen +user#:#user_prompt_once_after_login_info#:#Efter denna tid kommer användaren att uppmanas att publicera sin profil om den inte redan har publicerats. +user#:#user_prompt_repeat#:#Upprepas efter x dagar +user#:#user_prompt_repeat_info#:#Users uppmanas upprepade gånger att publicera sin profil om den inte redan är publicerad. +user#:#user_prompting_recurrence#:#Frekvens +user#:#user_prompting_settings#:#Prompt profil publicering +user#:#user_public_profile_info#:#Välj vilken data som ska visas i din profil och vilka användare som kan se den. +user#:#user_publish_options#:#Publicera profil +user#:#user_role_starting_point#:#User - Hemsida +user#:#user_save_continue#:#Spara och gå vidare +user#:#user_save_ordering_and_titles#:#Spara order och titel +user#:#user_select_course_group#:#Välj kurs/grupp +user#:#user_set_publishing_options#:#Konfigurera publikation +user#:#user_set_visibilty_options#:#Konfigurera synlighet +user#:#user_store_last_visited#:#Sista besöket +user#:#user_visibility_settings#:#Synlighet +user#:#user_visible_in_profile#:#Visible i personuppgifterna +user#:#usr_id#:#Internt system-ID +user#:#usr_letter_avatars#:#Bokstäver avatarer +user#:#usr_letter_avatars_info#:#Om det inte finns någon offentlig profilbild visar ILIAS initialerna i för- och efternamnet eller inloggningsnamnet som avatar. +user#:#usr_public_profile_disabled#:#Profil avaktiverad +user#:#usr_public_profile_disabled_info#:#Dina uppgifter är endast synliga för systemadministratörer. +user#:#usr_public_profile_global#:#WWW / Synlig för alla användare av internet +user#:#usr_public_profile_logged_in#:#Synlig för inloggade användare +usr#:#user_action#:#Användaråtgärd +usr#:#user_actions#:#Användaråtgärder +usr#:#user_actions_activation_info#:#Åtgärderna erbjuds endast om motsvarande tjänster är aktiverade och de nödvändiga förutsättningarna (t.ex. tillstånd) är givna för användarna. +validation#:#no_array#:#Value är inte ett fält +validation#:#not_a_null#:#Värde av typen '%s' är inte en nolla. +validation#:#not_a_string#:#Värde av typen '%s' är inte en sträng. +validation#:#not_an_array#:#'%s' är inte en array. +validation#:#not_an_array_of#:#Elementen i matrisen misslyckas med villkoren +validation#:#not_an_int#:#Värde av typen '%s' är inte ett heltal. +validation#:#not_generic#:#Det är inte fallet att %s +validation#:#not_greater_than#:#'%s' är inte större än '%s'. +validation#:#not_greater_than_or_equal#:#Värdet är inte större än eller lika med '%s'. +validation#:#not_less_than#:#'%s' är inte mindre än '%s'. +validation#:#not_less_than_or_equal#:#Värdet är inte mindre än eller lika med '%s'. +validation#:#not_max_length#:#Den angivna texten har en längd på mer än '%s'. +validation#:#not_min_length#:#Din inmatning har en längd på %d och är därför under minimilängden på %d. +validation#:#not_numeric#:#'%s' är inte numeriskt. +validation#:#not_numeric_empty_string#:#Din inmatning är inte numerisk. +violation#:#not_a_string#:#Värdet är inte en sträng +webr#:#invalid_links_tbl#:#Ogiltiga länkar +webr#:#webr_active#:#Aktiv +webr#:#webr_container_info#:#Eftersom denna webblänksamling bör innehålla mer än en webblänk, bör du tilldela en titel och eventuellt en beskrivningstext för visningen i tidningen. +webr#:#webr_copy#:#Kopiera Webblänk +webr#:#webr_deactivate#:#Avaktivera Webblänk +webr#:#webr_edit_links#:#Redigera Webblänkar +webr#:#webr_edit_list#:#Redigera Webblänk samling +webr#:#webr_edit_settings#:#Redigera inställningar +webr#:#webr_import#:#Import webblänk +webr#:#webr_inactive_success#:#Webblänken har avaktiverats. +webr#:#webr_link_added#:#En ny webblänk har skapats. +webr#:#webr_link_target#:#Mål +webr#:#webr_link_title#:#titel på webblänken / titel på webblänkens samling +webr#:#webr_link_type_list#:#Samling av webblänkar +webr#:#webr_link_type_single#:#Enstaka webblänk +webr#:#webr_list_added#:#En ny webblänksamling har skapats. +webr#:#webr_list_desc#:#Beskrivning av samlingen av webblänkar +webr#:#webr_list_set#:#Webblänken har omvandlats till en webblänksamling. +webr#:#webr_list_title#:#Titel på samlingen av webblänkar +webr#:#webr_new_link#:#Skapa ny webblänk +webr#:#webr_new_list#:#Skapa ny webblänksamling +webr#:#webr_new_list_info#:#Please enter a title and optional a description for the presentation of this web link collection in the magazine. +webr#:#webr_set_to_list#:#Konvertera till insamling av webblänkar +webr#:#webr_sort_manual#:#Manuell sortering +webr#:#webr_sort_title#:#Alfabetiskt efter titel +webr#:#webr_sorting#:#Sortering av webblänkar +wfe#:#context_by_id#:#Kontext efter ID +wfe#:#context_by_mask#:#Maskerat sammanhang +wfe#:#context_id#:#Kontext-ID +wfe#:#context_type#:#Typ av kontext +wfe#:#dashboard#:#Dashboard +wfe#:#definition_deleted#:#Definition av arbetsflöde borttagen. +wfe#:#definitions#:#Definitioner av processer +wfe#:#delete_definition#:#Radera definition +wfe#:#input_static_variables_desc#:#Processen behöver följande information för sina starter +wfe#:#input_variables_desc#:#Processen kräver följande information för att starta +wfe#:#input_variables_required#:#Input krävs +wfe#:#instances#:#Litigants +wfe#:#obj_wfe_desc#:#Automatisering av processer +wfe#:#process_definition_file#:#Fil för processdefinition +wfe#:#process_definition_file_info#:#BPMN2 modeller +wfe#:#process_started#:#Processen har startat +wfe#:#start_event_form_header#:#Relevanta händelser för starten av arbetsflödena +wfe#:#start_listening#:#Aktivera Listener +wfe#:#start_process#:#Starta processen +wfe#:#static_input_form_header#:#Inputdata för alla instanser av arbetsflödet +wfe#:#stop_listening#:#Inaktivera Listener +wfe#:#subject_by_id#:#Subjekt efter ID +wfe#:#subject_by_mask#:#Maskerat ämne +wfe#:#subject_id#:#Ämnes-ID +wfe#:#subject_type#:#Typ av ämne +wfe#:#upload_parse_success#:#Process definition uppladdad, analyserad och arkiverad. +wfe#:#upload_process#:#Definition av uppladdningsprocessen +wfe#:#wfe_request_missing_process_id#:#Inget process-ID överfördes för den valda åtgärden. +wfe#:#wfe_started_listening#:#Processen har blivit armerad. +wfe#:#wfe_stopped_listening#:#Processen avbröts, händelsen beaktas inte. +wfe#:#wfe_sure_to_delete_process_def#:#Är du säker på att du vill ta bort definitionen? +wfld#:#wfld_add#:# Skapa mapp +wfld#:#wfld_alphabetically_asc#:#Alfabetisk, asc. +wfld#:#wfld_alphabetically_desc#:#Alfabetisk, abst. +wfld#:#wfld_creation_asc#:#Creation datum, asst. +wfld#:#wfld_creation_desc#:#Datum för skapande, abst. +wfld#:#wfld_derive#:#Som överordnad mapp +wfld#:#wfld_edit#:#Redigera mapp +wfld#:#wfld_new#:# Skapa ny mapp +wfld#:#wfld_sortation#:#Sortering +wiki#:#wiki_activate_extended_rating#:# Aktivera betygskategorier +wiki#:#wiki_activate_new_page_rating#:#Aktivera betyg för nya sidor +wiki#:#wiki_activate_page_rating#:#Tillåt betyg +wiki#:#wiki_activate_rating#:#Tillåt klassificering av sidorna +wiki#:#wiki_add_link#:#Lägg till länk +wiki#:#wiki_add_template#:#Använd som mall för innehåll +wiki#:#wiki_advmd_block_title#:# Användardefinierade metadata för sidan +wiki#:#wiki_all_pages#:#Alla sidor +wiki#:#wiki_block_page#:#Skrivskydd för sida +wiki#:#wiki_change_notification_body_new#:#Följande wiki-sida har nyligen skapats +wiki#:#wiki_change_notification_link#:#URL +wiki#:#wiki_change_notification_page_body_comment#:#Följande wiki-sida kommenterades +wiki#:#wiki_change_notification_page_body_delete#:# följande wiki-sida har tagits bort +wiki#:#wiki_change_notification_page_body_update#:#Följande wiki-sida har redigerats +wiki#:#wiki_change_notification_page_link#:#URL +wiki#:#wiki_change_notification_salutation#:#Hej %s, +wiki#:#wiki_change_notification_subject#:#Wiki "%1$s" har redigerats +wiki#:#wiki_changed_by#:#Ändrad från +wiki#:#wiki_commented_by#:#From##Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +wiki#:#wiki_contributor#:#Deltagare +wiki#:#wiki_contributors#:#Deltagare +wiki#:#wiki_copy#:#Kopiera Wiki +wiki#:#wiki_create_page#:#Skapa sida +wiki#:#wiki_created_by#:#Skapad av +wiki#:#wiki_deactivate_page_rating#:#Inte tillåta betyg +wiki#:#wiki_delete_page#:#Ta bort sida +wiki#:#wiki_download_submission#:#Ladda ner inlämningsfilen +wiki#:#wiki_empty_page#:#Blank sida +wiki#:#wiki_empty_page_template#:#Skapa en ny sida utan mall (tom sida) +wiki#:#wiki_exc_template#:#Wiki-mall +wiki#:#wiki_exc_wiki_created#:#Wiki skapades +wiki#:#wiki_exercise_info#:#Den här wikin är tilldelad övningsenheten "%s" i övningen "%s". +wiki#:#wiki_exercise_submitted_info#:#Din senaste inlämning var den %s. Kontrollera inlämningsfilen. +wiki#:#wiki_failed#:#Misslyckad +wiki#:#wiki_feedback_from_tutor#:#Feedback från lärare +wiki#:#wiki_finalize_wiki#:#Stäng och lämna in wiki +wiki#:#wiki_finalized#:#Wikin har lämnats in. +wiki#:#wiki_functions#:#Wiki-funktioner +wiki#:#wiki_general_settings#:#Allmänna inställningar +wiki#:#wiki_grading#:#Rating +wiki#:#wiki_html_export#:#HTML-export +wiki#:#wiki_imp_page_added#:#Sidan har lagts till. +wiki#:#wiki_import#:#Import wiki +wiki#:#wiki_incl_comments#:#inklusive kommentarer +wiki#:#wiki_indentation#:#Inledning +wiki#:#wiki_introduction#:#Inledning +wiki#:#wiki_last_changed#:#Sista förändringen +wiki#:#wiki_last_changed_by#:#Sista ändring från +wiki#:#wiki_last_edited#:#Senast ändrad +wiki#:#wiki_last_visited_page#:#Sista besökta sidan +wiki#:#wiki_link_md_values#:#Automatisk länkning +wiki#:#wiki_link_md_values_info#:#Automatiskt länkar egenskapsvärden i sidblocket till wiki-sidor med samma namn (om sådana finns). +wiki#:#wiki_link_text#:#Länktext +wiki#:#wiki_mark#:#Note +wiki#:#wiki_navigation#:#Wiki-navigering +wiki#:#wiki_navigation_info#:#Här kan du lägga till och ta bort befintliga wiki-sidor från navigeringsblocket. +wiki#:#wiki_new_page#:#Ny sida +wiki#:#wiki_new_page_name#:#Ny sidtitel +wiki#:#wiki_new_pages#:#Nya sidor +wiki#:#wiki_news_page_changed#:#Wikisidan har ändrats. +wiki#:#wiki_news_page_created#:#Wikisidan har skapats. +wiki#:#wiki_no_page_found#:#Inga sidor hittades för söktermen '$1'. +wiki#:#wiki_no_search_term#:#Ingen sökterm angavs. Alla wiki-sidor listas nedan. +wiki#:#wiki_no_start_page#:#Wikin har ingen giltig startsida +wiki#:#wiki_notgraded#:#Ej betygsatt +wiki#:#wiki_notification_activate_page#:#Aktivera avisering för wiki-sida +wiki#:#wiki_notification_activate_wiki#:#Aktivera avisering för wiki +wiki#:#wiki_notification_activated#:#Notifiering aktiv (hela wikin) +wiki#:#wiki_notification_comment#:# följande sida kommenterades +wiki#:#wiki_notification_comment_subject#:#Det fanns en kommentar på sidan "%s +wiki#:#wiki_notification_deactivate_page#:#Inaktivera avisering för wiki-sida +wiki#:#wiki_notification_deactivate_wiki#:#Inaktivera avisering för wiki +wiki#:#wiki_notification_deactivated#:#Notifieringar avaktiverade +wiki#:#wiki_number_users_notes_or_comments#:#Antal användare som har skrivit noteringar eller kommentarer på denna sida. +wiki#:#wiki_ordering#:#Beställ +wiki#:#wiki_ordering_and_indent_saved#:#Order och indrag sparades. +wiki#:#wiki_orphaned_pages#:#Förgätna sidor +wiki#:#wiki_other_pages_linking#:#Andra sidor som länkar till denna sida +wiki#:#wiki_page#:#Sida +wiki#:#wiki_page_actions#:#Aktioner till sidan +wiki#:#wiki_page_already_exists#:#Det finns redan en sida med detta namn. +wiki#:#wiki_page_blocked#:#Skrivskydd är aktiverat. Endast användare med rättigheten "Redigera inställningar" har skrivbehörighet. +wiki#:#wiki_page_changes#:#Ändrade sidor +wiki#:#wiki_page_deleted#:#Wiki-sidan har tagits bort. +wiki#:#wiki_page_deletion_confirmation#:#Vill du verkligen ta bort den här wiki-sidan? +wiki#:#wiki_page_exists#:#Befintlig sida +wiki#:#wiki_page_hits#:#Sidvisningar +wiki#:#wiki_page_list_form_info#:#Lägger till en lista över wiki-sidor som är associerade med efterföljande metadata. Endast sökbara metadatafält från wiki-metadataposterna erbjuds. +wiki#:#wiki_page_list_mode#:#Typ av lista +wiki#:#wiki_page_list_mode_ordered#:#Numrerad +wiki#:#wiki_page_list_mode_unordered#:#Inte numrerad +wiki#:#wiki_page_lists#:#Listor över sidor +wiki#:#wiki_page_not_exist_select_templ#:#Denna sida finns inte ännu. Vänligen välj en mall för den nya sidan. +wiki#:#wiki_page_notification_activated#:#Notifiering aktiv (en sida) +wiki#:#wiki_page_status_blocked#:#Sidan är skrivskyddad. +wiki#:#wiki_page_template#:#Mall för innehåll +wiki#:#wiki_page_templates#:#Mallar för innehåll +wiki#:#wiki_page_title_too_long#:#Sidan kunde inte skapas eftersom titeln är för lång. Vänligen välj en kortare sidtitel. +wiki#:#wiki_page_toc#:#Aktivera sidöversikt +wiki#:#wiki_page_toc_info#:#Om minst två rubriker används på sidan visas en lista över alla rubriker högst upp på sidan. +wiki#:#wiki_page_type_wpg#:#Wiki-sida +wiki#:#wiki_page_unblocked#:#Skrivskyddet har tagits bort. +wiki#:#wiki_pages#:#Sidor +wiki#:#wiki_pages_found#:#Följande sidor hittades som matchar söktermen '$1'. +wiki#:#wiki_passed#:#Bekräftad +wiki#:#wiki_pg_list_no_search_fields#:#Det finns inga sökbara metadatafält i wikins metadataposter. +wiki#:#wiki_please_enter_search_term#:#Var god ange en sökterm. +wiki#:#wiki_popular_pages#:#Populära sidor +wiki#:#wiki_print_view#:# Skriv ut vy +wiki#:#wiki_public_comments#:#Kommentarer +wiki#:#wiki_purpose#:#Syfte +wiki#:#wiki_quick_navigation#:#Wiki snabbnavigering +wiki#:#wiki_rate_overall#:#Betygsättning Wiki +wiki#:#wiki_rate_page#:#Rate wiki-sida +wiki#:#wiki_recent_changes#:#Sista förändringar +wiki#:#wiki_remove_template_status#:#Används inte längre som innehållsmall +wiki#:#wiki_removed_imp_pages#:#Sidorna har tagits bort från listan. +wiki#:#wiki_rename#:#Rename +wiki#:#wiki_rename_page#:#Namn på sidan +wiki#:#wiki_save_ordering_and_indent#:#Spara ordning och indrag +wiki#:#wiki_search#:#Sökning +wiki#:#wiki_search_results#:#Sökresultat +wiki#:#wiki_sec_protect_info#:#Skyddade block kan endast redigeras av användare med behörigheten "Redigera inställningar". +wiki#:#wiki_select_one_item#:#Vänligen välj ett objekt. +wiki#:#wiki_selected_pages#:#Utvalda sidor +wiki#:#wiki_set_as_start_page#:#Sätt som startsida +wiki#:#wiki_settings#:#Wiki-inställningar +wiki#:#wiki_short_title_already_in_use#:#Den här titeln används redan av en wiki. Vänligen välj en annan titel. +wiki#:#wiki_show_pdf_export#:#PDF-export +wiki#:#wiki_show_print_view#:# Skriv ut vy +wiki#:#wiki_start_page#:#Startsida +wiki#:#wiki_start_page_info#:#Om det ännu inte finns en wiki-sida med denna titel, skapas en ny, tom sida. +wiki#:#wiki_stat_chars#:#Antal tecken +wiki#:#wiki_stat_chars_avg#:#Genomsnittligt antal tecken per sida +wiki#:#wiki_stat_deleted_pages#:#Antal raderade sidor +wiki#:#wiki_stat_edit_pages#:#Antal sidor som ändrats +wiki#:#wiki_stat_edit_pages_avg#:#Genomsnittligt antal ändrade sidor per användare +wiki#:#wiki_stat_external_links#:#Antal externa länkar +wiki#:#wiki_stat_external_links_avg#:#Genomsnittligt antal externa länkar per sida +wiki#:#wiki_stat_figure#:#Nyckeltal +wiki#:#wiki_stat_footnotes#:#Antal fotnoter +wiki#:#wiki_stat_footnotes_avg#:#Genomsnittligt antal fotnoter per sida +wiki#:#wiki_stat_internal_links#:#Antal interna länkar +wiki#:#wiki_stat_internal_links_avg#:#Genomsnittligt antal interna länkar per sida +wiki#:#wiki_stat_new_pages#:#Antal nya sidor +wiki#:#wiki_stat_new_pages_avg#:#Genomsnittligt antal nya sidor per användare +wiki#:#wiki_stat_num_pages#:#Antal sidor +wiki#:#wiki_stat_num_rating#:#Antal betyg +wiki#:#wiki_stat_num_rating_avg#:#Genomsnittligt antal betyg per sida +wiki#:#wiki_stat_page_changes#:#Antal ändringar +wiki#:#wiki_stat_page_changes_avg#:#Genomsnittligt antal ändringar per användare +wiki#:#wiki_stat_page_characters#:#Antal tecken +wiki#:#wiki_stat_page_external_links#:#Antal externa länkar +wiki#:#wiki_stat_page_footnotes#:#Antal fotnoter +wiki#:#wiki_stat_page_internal_links#:#Antal interna länkar +wiki#:#wiki_stat_page_ratings#:#Antal betyg +wiki#:#wiki_stat_page_read#:#Antal läsaccesser +wiki#:#wiki_stat_page_user_edit#:#Antal användare som har ändrat sidan +wiki#:#wiki_stat_page_words#:#Antal ord +wiki#:#wiki_stat_rating_avg#:#Genomsnittlig rating +wiki#:#wiki_stat_read_pages#:#Antal läsaccesser +wiki#:#wiki_stat_scope#:#Tidsperiod +wiki#:#wiki_stat_user_edit_pages#:#Antal användare som har bytt sida +wiki#:#wiki_stat_user_edit_pages_avg#:#Genomsnittligt antal användare som har bytt sida +wiki#:#wiki_stat_words#:#Antal ord +wiki#:#wiki_stat_words_avg#:#Genomsnittligt antal ord per sida +wiki#:#wiki_style#:#Stil +wiki#:#wiki_sure_remove_imp_pages#:#Vill du verkligen ta bort följande sidor från listan över viktiga sidor? +wiki#:#wiki_target_page#:#Målsida +wiki#:#wiki_team_members#:#Teammedlemmar +wiki#:#wiki_templ_add_to_page#:#Tillgänglig för befintlig sida +wiki#:#wiki_templ_new_pages#:#Tillgänglig för ny sida +wiki#:#wiki_template_added#:#Innehållsmall tillagd +wiki#:#wiki_template_status_removed#:#Använd som innehållsmall annullerad. +wiki#:#wiki_type_wiki_team#:#Team Wiki +wiki#:#wiki_unblock_page#:#Oskydda skrivande +wiki#:#wiki_unhide_meta_adv_records#:#Visa användardefinierade metadata +wiki#:#wiki_what_links_here#:#Vad länkar här? +wiki#:#wiki_what_links_to_page#:#Vilka länkar till sidan "%s"? +wiki#:#wiki_whole_wiki#:#Övergripande Wiki +wiki#:#wiki_wiki_page#:#Wiki-sida +wiki#:#wiki_wiki_search#:#Sök i wikin +wiki#:#wiki_wpg#:#Wiki-sida +wsp#:#element_already_shared#:#Resursen har redan släppts för denna person.###Modifierad som en del av jämställdhetsintegreringsaktiviteter för ILIAS 8 +wsp#:#element_shared#:#Resursen har frigjorts. +wsp#:#error_creating_certificate_pdf#:#Certifikatet kunde inte skapas. Låt en administratör kontrollera certifikatservern. +wsp#:#search_no_match#:#Din sökning gav inga resultat. +wsp#:#share#:#Släpp +wsp#:#share_content#:#Release resurs +wsp#:#share_with#:#Login name###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +wsp#:#wsp_copy_to_repository#:#Kopiera till tidning +wsp#:#wsp_invalid_password#:#Lösenordet är ogiltigt. +wsp#:#wsp_list_cmxv#:#Certifikat för xAPI/cmi5-objektet +wsp#:#wsp_list_crsv#:#Kursintyg +wsp#:#wsp_list_excv#:#Träningscertifikat +wsp#:#wsp_list_ltiv#:#Certifikat för LTI-konsumentobjektet +wsp#:#wsp_list_scov#:#SCORM certifikat +wsp#:#wsp_list_tstv#:#Testa certifikat +wsp#:#wsp_move_to_repository#:#Flytta till tidningen +wsp#:#wsp_password_for#:#Lösenord för +wsp#:#wsp_password_protected_resource#:#Lösenordsskyddad resurs +wsp#:#wsp_password_protected_resource_info#:#Du behöver ett lösenord för att komma åt denna resurs. +wsp#:#wsp_permission_all_info#:#Detta objekt är synligt för alla användare på Internet. +wsp#:#wsp_permission_all_pw_info#:#När du har angett lösenordet är detta objekt synligt för alla användare på Internet. +wsp#:#wsp_permission_registered_info#:#Detta objekt är tillgängligt för alla registrerade användare. +wsp#:#wsp_permission_removed#:#Posten har tagits bort. +wsp#:#wsp_permissions#:#Släpp +wsp#:#wsp_personal_resources_description#:#Här kan du hantera personliga filer, bloggar och bevis. +wsp#:#wsp_set_permission_all#:#Internet/WWW +wsp#:#wsp_set_permission_all_password#:#Internet/WWW med lösenord +wsp#:#wsp_set_permission_course#:#Kursdeltagare +wsp#:#wsp_set_permission_group#:#Gruppmedlemmar +wsp#:#wsp_set_permission_registered#:#Alla registrerade användare +wsp#:#wsp_set_permission_single_user#:#Utvalda användare +wsp#:#wsp_share_search_users#:#Sök användare +wsp#:#wsp_share_success#:#En ny post har lagts till. +wsp#:#wsp_share_with_members#:#Dela med medlemmar +wsp#:#wsp_share_with_users#:#Dela med användare +wsp#:#wsp_shared_date#:#Släppdatum +wsp#:#wsp_shared_date_filter#:#Frigivning från +wsp#:#wsp_shared_filter_button#:#Sökning +wsp#:#wsp_shared_filter_reset_button#:#Återställ sökning +wsp#:#wsp_shared_mandatory_filter_info#:#Ange minst ett filterattribut. Textfilter måste vara minst 4 bokstäver långa. +wsp#:#wsp_shared_member_filter#:#Kurs-/Gruppmedlemmar +wsp#:#wsp_shared_object_type#:#Typ av resurs +wsp#:#wsp_shared_resources#:#Delade resurser +wsp#:#wsp_shared_table_title#:#Utgivningar +wsp#:#wsp_shared_title#:#Titel på resursen +wsp#:#wsp_shared_type#:#Släppt för +wsp#:#wsp_shared_user_filter#:#name/login name###Modifierad som en del av arbetet med att integrera ett jämställdhetsperspektiv i ILIAS 8 +wsp#:#wsp_shared_with#:#Släppt för +wsp#:#wsp_status_shared#:#Släppt +wsp#:#wsp_switch_to_repo_tree#:#Byt till magasin +wsp#:#wsp_switch_to_wsp_tree#:#Byt till personliga resurser +wsp#:#wsp_tab_ownership#:#Mina tidningsobjekt +wsp#:#wsp_tab_personal#:#Mina resurser +wsp#:#wsp_tab_shared#:#Resurser från andra +wsp#:#wsp_type_blog#:#Blogg +wsp#:#wsp_type_cmxv#:#Certifikat xAPI/cmi5 +wsp#:#wsp_type_crsv#:#Certifikat Kurs +wsp#:#wsp_type_excv#:#Certifikat Übung +wsp#:#wsp_type_file#:#Fil +wsp#:#wsp_type_ltiv#:#Certifikat LTI-Konsument +wsp#:#wsp_type_scov#:#Certifikat SCORM +wsp#:#wsp_type_tstv#:#Certifikat Test +wsp#:#wsp_type_webr#:#Webblänk +wsp#:#wsp_type_wfld#:#Folder From 26e09300410173d90bda3859e59d5d4f7a06f4f9 Mon Sep 17 00:00:00 2001 From: tbongers-cat Date: Thu, 16 Nov 2023 15:57:12 +0100 Subject: [PATCH 169/497] Component: Add hasActivatedPlugin() to ilComponentRepository --- .../class.ilArtifactComponentRepository.php | 6 +++ .../classes/class.ilComponentRepository.php | 8 ++- .../class.ilComponentRepositoryWrite.php | 3 +- .../ilArtifactComponentRepositoryTest.php | 54 ++++++++++++++++++- 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/Services/Component/classes/class.ilArtifactComponentRepository.php b/Services/Component/classes/class.ilArtifactComponentRepository.php index 64825a1dc9b9..a06ad8552ac5 100644 --- a/Services/Component/classes/class.ilArtifactComponentRepository.php +++ b/Services/Component/classes/class.ilArtifactComponentRepository.php @@ -1,4 +1,5 @@ plugin_state_db->remove($plugin_id); $this->buildDatabase(); } + + public function hasActivatedPlugin(string $id): bool + { + return ($this->hasPluginId($id) && $this->getPluginById($id)->isActivated()); + } } diff --git a/Services/Component/classes/class.ilComponentRepository.php b/Services/Component/classes/class.ilComponentRepository.php index edda64714eed..d1c8b0568e24 100644 --- a/Services/Component/classes/class.ilComponentRepository.php +++ b/Services/Component/classes/class.ilComponentRepository.php @@ -1,4 +1,5 @@ [ + "Services", + "Service2", + "Slot4", + "Plugin3", + "2.9.2", + "8.1", + "8.999", + "Richard Klees", + "richard.klees@concepts-and-training.de", + null, + true, + false ] ]; @@ -74,6 +89,10 @@ protected function setUp(): void $this->plugin_state_db = new class () implements ilPluginStateDB { public function isPluginActivated(string $id): bool { + if ($id == 'plg3') { + return true; + } + return false; } public function setActivation(string $id, bool $activated): void @@ -191,6 +210,7 @@ public function _buildDatabase(): void $plugins4 ); $slots4 = ["slt4" => $this->slt4]; + $this->plg2 = new ilPluginInfo( $this->ilias_version, $this->slt4, @@ -209,6 +229,25 @@ public function _buildDatabase(): void false ); $plugins4["plg2"] = $this->plg2; + + $this->plg3 = new ilPluginInfo( + $this->ilias_version, + $this->slt4, + "plg3", + "Plugin3", + true, + $this->data_factory->version("0.9.1"), + 13, + $this->data_factory->version("2.9.2"), + $this->data_factory->version("8.1"), + $this->data_factory->version("8.999"), + "Richard Klees", + "richard.klees@concepts-and-training.de", + false, + true, + false + ); + $plugins4["plg3"] = $this->plg3; } public function testHasComponent(): void @@ -339,7 +378,7 @@ public function testGetPlugins(): void $plugins = iterator_to_array($this->db->getPlugins()); $ids = array_keys($plugins); - $expected_ids = ["plg1", "plg2"]; + $expected_ids = ["plg1", "plg2", "plg3"]; sort($ids); sort($expected_ids); @@ -692,4 +731,17 @@ protected function readPluginData(): array $this->assertEquals(2, $db->build_called); } + + public function testHasPluginId(): void + { + $this->assertTrue($this->db->hasPluginId("plg1")); + $this->assertFalse($this->db->hasPluginId("plg666")); + } + + public function testHasActivatedPlugin(): void + { + $this->assertFalse($this->db->hasActivatedPlugin("plg1")); // exists, but is not activated + $this->assertFalse($this->db->hasActivatedPlugin("plg666")); // does not exist + $this->assertTrue($this->db->hasActivatedPlugin("plg3")); // exists and is activated + } } From 96257232bd081866abb47d9eb24039a7f748ffb3 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 20 Nov 2023 17:37:12 +0100 Subject: [PATCH 170/497] =?UTF-8?q?38908:=20Failed=20test:=20Eigenschaften?= =?UTF-8?q?=20der=20Instanz=20=C3=A4ndern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/class.ilPCMediaObjectGUI.php | 66 ++++++++++++++----- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/Services/COPage/classes/class.ilPCMediaObjectGUI.php b/Services/COPage/classes/class.ilPCMediaObjectGUI.php index f633a81bc671..ec5fa8d04343 100755 --- a/Services/COPage/classes/class.ilPCMediaObjectGUI.php +++ b/Services/COPage/classes/class.ilPCMediaObjectGUI.php @@ -643,7 +643,11 @@ public function initAliasForm(): void // width height $width_height = new ilWidthHeightInputGUI($lng->txt("cont_width") . " / " . $lng->txt("cont_height"), "st_width_height"); - $width_height->setConstrainProportions(true); + if (is_int(strpos($std_item->getFormat(), "image")) + && $std_item->getLocationType() === "LocalFile") { + $width_height->setSupportConstraintsProps(true); + $width_height->setConstrainProportions(true); + } $op2->addSubItem($width_height); $radio_size->addOption($op2); @@ -762,7 +766,11 @@ public function initAliasForm(): void // width height $width_height = new ilWidthHeightInputGUI($lng->txt("cont_width") . " / " . $lng->txt("cont_height"), "full_width_height"); - $width_height->setConstrainProportions(true); + if (is_int(strpos($full_item->getFormat(), "image")) + && $full_item->getLocationType() === "LocalFile") { + $width_height->setSupportConstraintsProps(true); + $width_height->setConstrainProportions(true); + } $op2->addSubItem($width_height); $radio_size->addOption($op2); @@ -870,9 +878,24 @@ public function getAliasValues(): void $values["st_format"] = $std_item->getFormat(); // size - $values["st_width_height"]["width"] = $std_alias_item->getWidth(); - $values["st_width_height"]["height"] = $std_alias_item->getHeight(); - $values["st_width_height"]["constr_prop"] = true; + if ($std_alias_item->definesSize()) { + $values["st_width_height"]["width"] = $std_alias_item->getWidth(); + $values["st_width_height"]["height"] = $std_alias_item->getHeight(); + $values["st_width_height"]["constr_prop"] = true; + } else { + if ($std_item->getWidth() !== "" || $std_item->getHeight() !== "") { + $values["st_width_height"]["width"] = $std_item->getWidth(); + $values["st_width_height"]["height"] = $std_item->getHeight(); + $values["st_width_height"]["constr_prop"] = true; + } else { + $orig_size = $std_item->getOriginalSize(); + if (!is_null($orig_size)) { + $values["st_width_height"]["width"] = $orig_size["width"]; + $values["st_width_height"]["height"] = $orig_size["height"]; + $values["st_width_height"]["constr_prop"] = true; + } + } + } // caption $values["st_caption"] = $std_alias_item->getCaption(); @@ -908,10 +931,6 @@ public function getAliasValues(): void $values["st_derive_size"] = $std_alias_item->definesSize() ? "n" : "y"; - if ($values["st_derive_size"] == "y") { - $values["st_width_height"]["width"] = $std_item->getWidth(); - $values["st_width_height"]["height"] = $std_item->getHeight(); - } $values["st_derive_caption"] = $std_alias_item->definesCaption() ? "n" : "y"; @@ -939,9 +958,25 @@ public function getAliasValues(): void $values["full_location"] = $full_item->getLocation(); $values["full_format"] = $full_item->getFormat(); - $values["full_width_height"]["width"] = $full_alias_item->getWidth(); - $values["full_width_height"]["height"] = $full_alias_item->getHeight(); - $values["full_width_height"]["constr_prop"] = true; + + if ($full_alias_item->definesSize()) { + $values["full_width_height"]["width"] = $full_alias_item->getWidth(); + $values["full_width_height"]["height"] = $full_alias_item->getHeight(); + $values["full_width_height"]["constr_prop"] = true; + } else { + if ($full_item->getWidth() !== "" || $full_item->getHeight() !== "") { + $values["full_width_height"]["width"] = $full_item->getWidth(); + $values["full_width_height"]["height"] = $full_item->getHeight(); + $values["full_width_height"]["constr_prop"] = true; + } else { + $orig_full_size = $full_item->getOriginalSize(); + if (!is_null($orig_full_size)) { + $values["full_width_height"]["width"] = $orig_full_size["width"]; + $values["full_width_height"]["height"] = $orig_full_size["height"]; + $values["full_width_height"]["constr_prop"] = true; + } + } + } $values["full_caption"] = $full_alias_item->getCaption(); if (trim($full_item->getCaption()) == "") { $values["full_def_caption"] = $lng->txt("cont_no_caption"); @@ -958,10 +993,6 @@ public function getAliasValues(): void $values["full_derive_size"] = $full_alias_item->definesSize() ? "n" : "y"; - if ($values["full_derive_size"] == "y") { - $values["full_width_height"]["width"] = $full_item->getWidth(); - $values["full_width_height"]["height"] = $full_item->getHeight(); - } $values["full_derive_caption"] = $full_alias_item->definesCaption() ? "n" : "y"; @@ -992,8 +1023,7 @@ public function getAliasValues(): void $values["full_def_parameters"] = $full_item->getParameterString(); } } - - $this->form_gui->setValuesByArray($values); + $this->form_gui->setValuesByArray($values, true); } /** From 3a9d7295a27cf5b12a99d6c20522ef0d19a6e388 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 20 Nov 2023 20:01:31 +0100 Subject: [PATCH 171/497] Forum: Fix German translation See: https://mantis.ilias.de/view.php?id=38945 --- 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 190076f342b9..89ce8c1e931a 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -9760,7 +9760,7 @@ forum#:#number_of_threads#:#Anzahl dargestellter Themen pro Seite forum#:#please_choose_target#:#Bitte wählen Sie ein Thema als Ziel der Zusammenführung. forum#:#post_activation_desc#:#Alle Beiträge müssen durch die Moderation freigeschaltet werden.###Modified as part of gender mainstreaming activities for ILIAS 8 forum#:#post_censored_by#:#folgender Beitrag im Forum "%2$s" wurde von "%1$s" zensiert: -forum#:#post_censored_comment_by_moderator#:#Beitrag zensiert! Bemerkung des Moderation###Modified as part of gender mainstreaming activities for ILIAS 8 +forum#:#post_censored_comment_by_moderator#:#Beitrag zensiert! Bemerkung der Moderation###Modified as part of gender mainstreaming activities for ILIAS 8 forum#:#post_deleted_by#:#folgender Beitrag im Forum "%2$s" wurde von "%1$s" gelöscht: forum#:#post_reply#:#Re: forum#:#post_reply_count#:#Re (%s): From 6b49a939f7f40f2b19008d85db3598650cef32e4 Mon Sep 17 00:00:00 2001 From: Richard Klees Date: Tue, 21 Nov 2023 05:52:28 +0100 Subject: [PATCH 172/497] fixed sorting of sv lang-file --- lang/ilias_sv.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/ilias_sv.lang b/lang/ilias_sv.lang index 2b7c32a95ee6..839158a911af 100755 --- a/lang/ilias_sv.lang +++ b/lang/ilias_sv.lang @@ -17086,4 +17086,4 @@ wsp#:#wsp_type_ltiv#:#Certifikat LTI-Konsument wsp#:#wsp_type_scov#:#Certifikat SCORM wsp#:#wsp_type_tstv#:#Certifikat Test wsp#:#wsp_type_webr#:#Webblänk -wsp#:#wsp_type_wfld#:#Folder +wsp#:#wsp_type_wfld#:#Folder \ No newline at end of file From b5abd853506e1f8fa442b6d839d2ae3e4c236a5e Mon Sep 17 00:00:00 2001 From: sroenchen <145426925+sroenchen@users.noreply.github.com> Date: Tue, 21 Nov 2023 08:27:03 +0100 Subject: [PATCH 173/497] #38956 fix error on new scorm1.2 version upload fixes a php8.0 compatibility issue --- Modules/ScormAicc/classes/class.ilObjSCORMLearningModuleGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/ScormAicc/classes/class.ilObjSCORMLearningModuleGUI.php b/Modules/ScormAicc/classes/class.ilObjSCORMLearningModuleGUI.php index 5f05bbc296bc..5b9343fa8667 100755 --- a/Modules/ScormAicc/classes/class.ilObjSCORMLearningModuleGUI.php +++ b/Modules/ScormAicc/classes/class.ilObjSCORMLearningModuleGUI.php @@ -568,7 +568,7 @@ public function newModuleVersionUpload(): void exit; } - if ($source_is_copy) { + if (isset($source_is_copy)) { unlink($source); } From 3ca9bfa0fb3c626705865258c59fd5c85cf5c1b0 Mon Sep 17 00:00:00 2001 From: sroenchen <145426925+sroenchen@users.noreply.github.com> Date: Tue, 21 Nov 2023 11:25:42 +0100 Subject: [PATCH 174/497] fix copyright issue --- .../ScormAicc/classes/class.ilObjSCORMLearningModuleGUI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/ScormAicc/classes/class.ilObjSCORMLearningModuleGUI.php b/Modules/ScormAicc/classes/class.ilObjSCORMLearningModuleGUI.php index 5b9343fa8667..cfbcee94aa76 100755 --- a/Modules/ScormAicc/classes/class.ilObjSCORMLearningModuleGUI.php +++ b/Modules/ScormAicc/classes/class.ilObjSCORMLearningModuleGUI.php @@ -1,7 +1,5 @@ Date: Tue, 21 Nov 2023 16:19:49 +0100 Subject: [PATCH 175/497] Object: Make Property Key Value More Robust See: https://mantis.ilias.de/view.php?id=38966 --- Services/Object/classes/class.ilObjectListGUI.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Services/Object/classes/class.ilObjectListGUI.php b/Services/Object/classes/class.ilObjectListGUI.php index 1eea09049127..1368d81ceb1f 100644 --- a/Services/Object/classes/class.ilObjectListGUI.php +++ b/Services/Object/classes/class.ilObjectListGUI.php @@ -3367,7 +3367,8 @@ public function getAsCard( $l = []; foreach ($this->determineProperties() as $p) { - if (($p["alert"] ?? false) && $p['property'] !== $this->lng->txt('learning_progress')) { + if (isset($p['alert']) && $p['alert'] == true + && isset($p['property']) && $p['property'] !== $this->lng->txt('learning_progress')) { $l[(string) $p['property']] = (string) $p['value']; } } From 3059f4b66c4c7521d31084df478f98ee43ab3eda Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Tue, 21 Nov 2023 16:38:02 +0100 Subject: [PATCH 176/497] Fix wrong param issue in english lang file --- lang/ilias_en.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index c0a5cb84baca..3b4a7726e112 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -12242,7 +12242,7 @@ obj#:#obj_activation#:#Activation obj#:#obj_activation_list_gui#:#Availability obj#:#obj_add_languages#:#Add Languages obj#:#obj_additional_langs#:#Additional Languages -obj#:#obj_conf_delete_lang#:#obj#:#Do you really want to stop the presentation of title and description in these languages? +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages? obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated. obj#:#obj_copy_progress#:#Copy Progress obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing @@ -17108,4 +17108,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 From 9fad4f2d2766ec55b871cf0d9e56ddc41ddf65a8 Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Tue, 21 Nov 2023 16:38:26 +0100 Subject: [PATCH 177/497] Change file mod --- lang/ilias_sv.lang | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 lang/ilias_sv.lang diff --git a/lang/ilias_sv.lang b/lang/ilias_sv.lang old mode 100755 new mode 100644 From 85ce5deea98fed5f8fc490e51ac29d3ac20d9765 Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Tue, 21 Nov 2023 16:55:32 +0100 Subject: [PATCH 178/497] sort lang file --- lang/ilias_en.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 3b4a7726e112..1506b721c9ce 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -17108,4 +17108,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 +wsp#:#wsp_type_wfld#:#Folder \ No newline at end of file From 329d4c9326f717ad4a8ffe6b609c812e12d61b27 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 21 Nov 2023 22:45:38 +0100 Subject: [PATCH 179/497] =?UTF-8?q?38981:=20Failed=20test:=20Inhaltsbauste?= =?UTF-8?q?in=20zur=20Seite=20hinzuf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Portfolio/Page/class.ilPortfolioPage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Portfolio/Page/class.ilPortfolioPage.php b/Modules/Portfolio/Page/class.ilPortfolioPage.php index aa2b70159eaa..79aaed00f44b 100644 --- a/Modules/Portfolio/Page/class.ilPortfolioPage.php +++ b/Modules/Portfolio/Page/class.ilPortfolioPage.php @@ -344,7 +344,7 @@ public static function updateInternalLinks( // outgoing links to be fixed if (count($fix) > 0) { $t = ilObject::_lookupType($pid); - if (is_array($all_fixes[$t . ":" . $copied_id])) { + if (is_array($all_fixes[$t . ":" . $copied_id] ?? false)) { $all_fixes[$t . ":" . $copied_id] += $fix; } else { $all_fixes[$t . ":" . $copied_id] = $fix; From a84c4499b65d15c0986665c11169f59e8763105e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Katrin=20Gro=C3=9Fkopf?= Date: Wed, 22 Nov 2023 11:05:42 +0100 Subject: [PATCH 180/497] Fixed Mantis Bug #37783: language update objective fails because of missing db precondition --- ...lass.ilLanguagesInstalledAndUpdatedObjective.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Services/Language/classes/Setup/class.ilLanguagesInstalledAndUpdatedObjective.php b/Services/Language/classes/Setup/class.ilLanguagesInstalledAndUpdatedObjective.php index fd777aa6f4bf..2008242e1061 100644 --- a/Services/Language/classes/Setup/class.ilLanguagesInstalledAndUpdatedObjective.php +++ b/Services/Language/classes/Setup/class.ilLanguagesInstalledAndUpdatedObjective.php @@ -1,7 +1,5 @@ il_setup_language->getInstalledLanguages() ?: ['en']; + return $this->il_setup_language->getInstalledLanguages() ?? ['en']; } /** @@ -77,7 +76,9 @@ public function isNotable(): bool */ public function getPreconditions(Setup\Environment $environment): array { - return []; + return [ + new ilDatabaseInitializedObjective() + ]; } /** From 9b6314c861d7546381f9696ce6adb2d29728bf19 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 22 Nov 2023 20:51:21 +0100 Subject: [PATCH 181/497] 38989: Content Style Editor: Images in the content style cannot be deleted. --- Services/Style/Content/Images/class.ilContentStyleImageGUI.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Services/Style/Content/Images/class.ilContentStyleImageGUI.php b/Services/Style/Content/Images/class.ilContentStyleImageGUI.php index 6e8eb985c5c1..76ad1b83ebb9 100644 --- a/Services/Style/Content/Images/class.ilContentStyleImageGUI.php +++ b/Services/Style/Content/Images/class.ilContentStyleImageGUI.php @@ -57,9 +57,9 @@ public function __construct( $this->gui = $gui_service; $images = $this->request->getFiles(); - if (count($images) == 1 && $manager->filenameExists(current($images))) { $this->current_image = current($images); + $this->current_images = $images; } else { $this->current_images = array_filter($images, function ($i) use ($manager) { return $manager->filenameExists($i); @@ -166,7 +166,6 @@ protected function getImageForm(): ilPropertyFormGUI public function deleteImage(): void { $ilCtrl = $this->gui->ctrl(); - foreach ($this->current_images as $i) { $this->manager->deleteByFilename($i); } From c017f1148dd41308e75465b3db7d0db85dd64e2f Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 23 Nov 2023 08:00:07 +0100 Subject: [PATCH 182/497] User: Don't set Null as Value See: https://mantis.ilias.de/view.php?id=39010 --- .../classes/class.ilCustomUserFieldsHelper.php | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Services/User/classes/class.ilCustomUserFieldsHelper.php b/Services/User/classes/class.ilCustomUserFieldsHelper.php index aaad34f73d1b..83cb089566b2 100644 --- a/Services/User/classes/class.ilCustomUserFieldsHelper.php +++ b/Services/User/classes/class.ilCustomUserFieldsHelper.php @@ -89,10 +89,11 @@ public function getActivePlugins(): array */ public function getFormPropertyForDefinition( array $definition, - bool $a_changeable = true, + bool $changeable = true, string $a_default_value = null ): ?ilFormPropertyGUI { $fprop = null; + $default_value = $a_default_value ?? ''; switch ($definition['field_type']) { case UDF_TYPE_TEXT: @@ -101,11 +102,11 @@ public function getFormPropertyForDefinition( 'udf_' . $definition['field_id'] ); - $fprop->setValue((string) $a_default_value); + $fprop->setValue($default_value); $fprop->setSize(40); $fprop->setMaxLength(255); $fprop->setRequired((bool) $definition['required']); - if (!$a_changeable && (!$definition['required'] || $a_default_value)) { + if (!$changeable && (!$definition['required'] || $default_value !== '')) { $fprop->setDisabled(true); } break; @@ -116,10 +117,10 @@ public function getFormPropertyForDefinition( 'udf_' . $definition['field_id'] ); - $fprop->setValue((string) $a_default_value); + $fprop->setValue($default_value); $fprop->setUseRte(true); $fprop->setRequired((bool) $definition['required']); - if (!$a_changeable && (!$definition['required'] || $a_default_value)) { + if (!$changeable && (!$definition['required'] || $default_value !== '')) { $fprop->setDisabled(true); } break; @@ -133,9 +134,9 @@ public function getFormPropertyForDefinition( $user_defined_fields = ilUserDefinedFields::_getInstance(); $fprop->setOptions($user_defined_fields->fieldValuesToSelectArray($definition['field_values'])); - $fprop->setValue($a_default_value); + $fprop->setValue($default_value); $fprop->setRequired((bool) $definition['required']); - if (!$a_changeable && (!$definition['required'] || $a_default_value)) { + if (!$changeable && (!$definition['required'] || $default_value !== '')) { $fprop->setDisabled(true); } break; @@ -146,7 +147,7 @@ public function getFormPropertyForDefinition( if ($plugin->getDefinitionType() == $definition['field_type']) { $fprop = $plugin->getFormPropertyForDefinition( $definition, - $a_changeable, + $changeable, $a_default_value ); break; From a083107e37e50159a6504f33e965ef3be39cb013 Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 23 Nov 2023 14:13:17 +0100 Subject: [PATCH 183/497] Certificate: Use `file://` schema to make background images work with new `ilServer` See: https://mantis.ilias.de/view.php?id=38729 (cherry picked from commit 57e65faa38d157e8344224e83d2b376faf09cb82) --- .../classes/File/Certificate/class.ilPdfGenerator.php | 2 +- .../Action/Preview/ilCertificateTemplatePreviewAction.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/Certificate/classes/File/Certificate/class.ilPdfGenerator.php b/Services/Certificate/classes/File/Certificate/class.ilPdfGenerator.php index 7c79d89640ab..14c72e2a6ace 100644 --- a/Services/Certificate/classes/File/Certificate/class.ilPdfGenerator.php +++ b/Services/Certificate/classes/File/Certificate/class.ilPdfGenerator.php @@ -106,7 +106,7 @@ private function createPDFScalar(ilUserCertificate $certificate): string $certificateContent = str_replace( ['[BACKGROUND_IMAGE]', '[CLIENT_WEB_DIR]'], - ['[CLIENT_WEB_DIR]' . $certificate->getBackgroundImagePath(), CLIENT_WEB_DIR], + ['[CLIENT_WEB_DIR]' . $certificate->getBackgroundImagePath(), 'file://' . CLIENT_WEB_DIR], $certificateContent ); diff --git a/Services/Certificate/classes/Template/Action/Preview/ilCertificateTemplatePreviewAction.php b/Services/Certificate/classes/Template/Action/Preview/ilCertificateTemplatePreviewAction.php index 9435bec5bc67..385c6c801de0 100644 --- a/Services/Certificate/classes/Template/Action/Preview/ilCertificateTemplatePreviewAction.php +++ b/Services/Certificate/classes/Template/Action/Preview/ilCertificateTemplatePreviewAction.php @@ -146,7 +146,7 @@ private function exchangeCertificateVariables( $certificate_text = str_replace( '[CLIENT_WEB_DIR]', - $this->rootDirectory, + 'file://' . $this->rootDirectory, $certificate_text ); @@ -154,7 +154,7 @@ private function exchangeCertificateVariables( return str_replace( '[BACKGROUND_IMAGE]', - $this->rootDirectory . $backgroundImagePath, + 'file://' . $this->rootDirectory . $backgroundImagePath, $certificate_text ); } From 34bfa05c1401ea3b06608c87e2724aaf086475b3 Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 23 Nov 2023 15:16:19 +0100 Subject: [PATCH 184/497] Certificate: PSR-12 --- .../Values/class.ilScormPlaceholderValues.php | 10 +++++----- .../Values/class.ilStudyProgrammePlaceholderValues.php | 8 ++++---- .../Preview/ilCertificateTemplatePreviewAction.php | 2 +- .../classes/class.ilObjCertificateSettingsGUI.php | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Services/Certificate/classes/Placeholder/Values/class.ilScormPlaceholderValues.php b/Services/Certificate/classes/Placeholder/Values/class.ilScormPlaceholderValues.php index cb2eb033dd45..03233e468291 100644 --- a/Services/Certificate/classes/Placeholder/Values/class.ilScormPlaceholderValues.php +++ b/Services/Certificate/classes/Placeholder/Values/class.ilScormPlaceholderValues.php @@ -102,11 +102,11 @@ public function getPlaceholderValues(int $userId, int $objId): array $txtPoints = $this->language->txt('certificate_points_notavailable'); } else { $txtPoints = number_format( - $points, - 1, - $this->language->txt('lang_sep_decimal'), - $this->language->txt('lang_sep_thousand') - ) . ' %'; + $points, + 1, + $this->language->txt('lang_sep_decimal'), + $this->language->txt('lang_sep_thousand') + ) . ' %'; } $max_points = $object->getMaxPoints(); diff --git a/Services/Certificate/classes/Placeholder/Values/class.ilStudyProgrammePlaceholderValues.php b/Services/Certificate/classes/Placeholder/Values/class.ilStudyProgrammePlaceholderValues.php index a6587312e5dd..810919046351 100644 --- a/Services/Certificate/classes/Placeholder/Values/class.ilStudyProgrammePlaceholderValues.php +++ b/Services/Certificate/classes/Placeholder/Values/class.ilStudyProgrammePlaceholderValues.php @@ -154,8 +154,8 @@ protected function getLatestSuccessfulAssignment(array $assignments): ?ilPRGAssi if (count($unlimited) > 0) { $successful = $unlimited; usort($successful, static function (ilPRGAssignment $a, ilPRGAssignment $b): int { - $a_dat =$a->getProgressTree()->getCompletionDate(); - $b_dat =$b->getProgressTree()->getCompletionDate(); + $a_dat = $a->getProgressTree()->getCompletionDate(); + $b_dat = $b->getProgressTree()->getCompletionDate(); if ($a_dat > $b_dat) { return -1; } elseif ($a_dat < $b_dat) { @@ -172,8 +172,8 @@ protected function getLatestSuccessfulAssignment(array $assignments): ?ilPRGAssi ); $successful = $limited; usort($successful, static function (ilPRGAssignment $a, ilPRGAssignment $b): int { - $a_dat =$a->getProgressTree()->getValidityOfQualification(); - $b_dat =$b->getProgressTree()->getValidityOfQualification(); + $a_dat = $a->getProgressTree()->getValidityOfQualification(); + $b_dat = $b->getProgressTree()->getValidityOfQualification(); if ($a_dat > $b_dat) { return -1; } elseif ($a_dat < $b_dat) { diff --git a/Services/Certificate/classes/Template/Action/Preview/ilCertificateTemplatePreviewAction.php b/Services/Certificate/classes/Template/Action/Preview/ilCertificateTemplatePreviewAction.php index 385c6c801de0..9a991e2345a7 100644 --- a/Services/Certificate/classes/Template/Action/Preview/ilCertificateTemplatePreviewAction.php +++ b/Services/Certificate/classes/Template/Action/Preview/ilCertificateTemplatePreviewAction.php @@ -146,7 +146,7 @@ private function exchangeCertificateVariables( $certificate_text = str_replace( '[CLIENT_WEB_DIR]', - 'file://' . $this->rootDirectory, + 'file://' . $this->rootDirectory, $certificate_text ); diff --git a/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php b/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php index 2cd5c1e09576..eddd7c16551d 100644 --- a/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php +++ b/Services/Certificate/classes/class.ilObjCertificateSettingsGUI.php @@ -114,9 +114,9 @@ public function settings(): void if (strcmp($this->ctrl->getCmd(), 'save') === 0) { $backgroundDelete = $this->httpState->wrapper()->post()->has('background_delete') && $this->httpState->wrapper()->post()->retrieve( - 'background_delete', - $this->refinery->kindlyTo()->bool() - ); + 'background_delete', + $this->refinery->kindlyTo()->bool() + ); if ($backgroundDelete) { $this->object->deleteBackgroundImage(); } From 694d4271e53c35bcc2da19dcd50bbc42fab91740 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 23 Nov 2023 18:05:12 +0100 Subject: [PATCH 185/497] User: Fix Setting Value of Text-Field to Null P2 See: https://mantis.ilias.de/view.php?id=39010 --- Services/User/classes/class.ilUserProfile.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/User/classes/class.ilUserProfile.php b/Services/User/classes/class.ilUserProfile.php index 6cd3c298bb4f..88aaacd95dcb 100755 --- a/Services/User/classes/class.ilUserProfile.php +++ b/Services/User/classes/class.ilUserProfile.php @@ -562,7 +562,7 @@ public function addStandardFieldsToForm( if (self::userSettingVisible($f)) { $ti = new ilTextInputGUI($lng->txt($lv), "usr_" . $f); if ($a_user) { - $ti->setValue($a_user->$m()); + $ti->setValue($a_user->$m() ?? ''); } $ti->setMaxLength($p["maxlength"]); $ti->setSize($p["size"]); @@ -733,7 +733,7 @@ public function addStandardFieldsToForm( $ta->setUseStripSlashes(false); $ta->setRequired(true); $ta->setInfo(ilSecuritySettingsChecker::getPasswordRequirementsInfo()); - // $ta->setDisabled($ilSetting->get("usr_settings_disable_".$f)); + // $ta->setDisabled($ilSetting->get("usr_settings_disable_".$f)); } else { $ta = new ilNonEditableValueGUI($lng->txt($lv)); $ta->setValue($lng->txt("reg_passwd_via_mail")); From 205274d9ba60f9f789f94c4c849fc306c9dcac19 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 23 Nov 2023 18:12:40 +0100 Subject: [PATCH 186/497] User: Fix Setting Value of Text-Field to Null P3 --- Services/User/classes/class.ilUserProfile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/User/classes/class.ilUserProfile.php b/Services/User/classes/class.ilUserProfile.php index 88aaacd95dcb..e95f7cfd0e07 100755 --- a/Services/User/classes/class.ilUserProfile.php +++ b/Services/User/classes/class.ilUserProfile.php @@ -714,7 +714,7 @@ public function addStandardFieldsToForm( if (self::userSettingVisible($f)) { $ta = new ilTextAreaInputGUI($lng->txt($lv), "usr_" . $f); if ($a_user) { - $ta->setValue($a_user->$m()); + $ta->setValue($a_user->$m() ?? ''); } $ta->setRows($p["rows"]); $ta->setCols($p["cols"]); From 6b2e54777d74ffe98aafba9e382f70abff7cd350 Mon Sep 17 00:00:00 2001 From: Fabian Helfer <82493694+fhelfer@users.noreply.github.com> Date: Fri, 24 Nov 2023 07:57:20 +0100 Subject: [PATCH 187/497] T&A Bugix #0038178: Random Question rules that cannot be implemented generate error when starting test. (#6485) * bugfix intersecting qpl questions not generating error * remove is_numeric check when adding srcpooldefinitions --- ...tRandomQuestionsQuantitiesDistribution.php | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Modules/Test/classes/class.ilTestRandomQuestionsQuantitiesDistribution.php b/Modules/Test/classes/class.ilTestRandomQuestionsQuantitiesDistribution.php index 65bc65e64938..9b9e02ec9816 100644 --- a/Modules/Test/classes/class.ilTestRandomQuestionsQuantitiesDistribution.php +++ b/Modules/Test/classes/class.ilTestRandomQuestionsQuantitiesDistribution.php @@ -140,14 +140,9 @@ protected function resetQuestRelatedSrcPoolDefRegister() $this->questRelatedSrcPoolDefRegister = array(); } - /** - * @param integer $questionId - * @param ilTestRandomQuestionSetSourcePoolDefinition $definition - */ - protected function registerQuestRelatedSrcPoolDef($questionId, ilTestRandomQuestionSetSourcePoolDefinition $definition) + protected function registerQuestRelatedSrcPoolDef(int $questionId, ilTestRandomQuestionSetSourcePoolDefinition $definition): void { - if (!array_key_exists($questionId, $this->questRelatedSrcPoolDefRegister) || - !is_numeric($this->questRelatedSrcPoolDefRegister[$questionId])) { + if (!array_key_exists($questionId, $this->questRelatedSrcPoolDefRegister)) { $this->questRelatedSrcPoolDefRegister[$questionId] = $this->buildSourcePoolDefinitionListInstance(); } @@ -218,10 +213,13 @@ protected function initialiseRegisters() $randomQuestion ); - $this->registerQuestRelatedSrcPoolDef( - $randomQuestion->getQuestionId(), - $sourcePoolDefinition - ); + if ($sourcePoolDefinition && $randomQuestion->getQuestionId()) { + $this->registerQuestRelatedSrcPoolDef( + $randomQuestion->getQuestionId(), + $sourcePoolDefinition + ); + } + } } From b3cbe781685fa43b385a484d91ba0ecfbea78ba1 Mon Sep 17 00:00:00 2001 From: Stefan Meyer Date: Fri, 24 Nov 2023 10:32:09 +0100 Subject: [PATCH 188/497] fixed 0038776: Failed test: Neuen Termin anlegen --- .../Calendar/classes/class.ilCalendarAppointmentGUI.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Services/Calendar/classes/class.ilCalendarAppointmentGUI.php b/Services/Calendar/classes/class.ilCalendarAppointmentGUI.php index e46395c99aba..39d16a4f91dc 100644 --- a/Services/Calendar/classes/class.ilCalendarAppointmentGUI.php +++ b/Services/Calendar/classes/class.ilCalendarAppointmentGUI.php @@ -519,7 +519,11 @@ protected function save(bool $a_as_milestone = false): void } } else { $this->form->setValuesByPost(); - $this->tpl->setOnScreenMessage('failure', $this->error->getMessage()); + if ($this->error->getMessage() !== '') { + $this->tpl->setOnScreenMessage('failure', $this->error->getMessage()); + } else { + $this->tpl->setOnScreenMessage('failure', $this->lng->txt('err_check_input')); + } $this->add($this->form); return; } From 4ee10f13c42f696fa9691d240c9f431cca605b2c Mon Sep 17 00:00:00 2001 From: Maximilian Becker Date: Fri, 24 Nov 2023 11:17:30 +0100 Subject: [PATCH 189/497] =?UTF-8?q?38976:=20Failed=20test:=20XML=20QTI=20i?= =?UTF-8?q?mportieren=20-=20Anzahl=20Zeilen=20=C3=A4ndern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TestQuestionPool/classes/class.ilObjQuestionPoolGUI.php | 4 ++-- .../tables/class.ilQuestionPoolImportVerificationTableGUI.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.ilObjQuestionPoolGUI.php b/Modules/TestQuestionPool/classes/class.ilObjQuestionPoolGUI.php index bf71d1c6e342..3b3ee909b2c3 100755 --- a/Modules/TestQuestionPool/classes/class.ilObjQuestionPoolGUI.php +++ b/Modules/TestQuestionPool/classes/class.ilObjQuestionPoolGUI.php @@ -556,7 +556,7 @@ public function download_paragraphObject(): void public function uploadQplObject($questions_only = false) { $this->ctrl->setParameter($this, 'new_type', $this->qplrequest->raw('new_type')); - if ($_FILES["xmldoc"]["error"] > UPLOAD_ERR_OK) { + if (!isset($_FILES['xmldoc']) || !isset($_FILES['xmldoc']['error']) || $_FILES['xmldoc']['error'] > UPLOAD_ERR_OK) { $this->tpl->setOnScreenMessage('failure', $this->lng->txt("error_upload"), true); if (!$questions_only) { $this->ctrl->redirect($this, 'create'); @@ -655,7 +655,7 @@ public function uploadQplObject($questions_only = false) ilSession::set("qpl_import_subdir", $subdir); $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.qpl_import_verification.html", "Modules/TestQuestionPool"); - $table = new ilQuestionPoolImportVerificationTableGUI($this, 'uploadQplObject'); + $table = new ilQuestionPoolImportVerificationTableGUI($this, 'uploadQpl'); $rows = array(); foreach ($founditems as $item) { diff --git a/Modules/TestQuestionPool/classes/tables/class.ilQuestionPoolImportVerificationTableGUI.php b/Modules/TestQuestionPool/classes/tables/class.ilQuestionPoolImportVerificationTableGUI.php index e548f13f2cf3..e588e830ad0c 100644 --- a/Modules/TestQuestionPool/classes/tables/class.ilQuestionPoolImportVerificationTableGUI.php +++ b/Modules/TestQuestionPool/classes/tables/class.ilQuestionPoolImportVerificationTableGUI.php @@ -38,7 +38,7 @@ public function __construct($a_parent_obj, $a_parent_cmd = "", $a_template_conte $this->setRowTemplate('tpl.qpl_import_verification_row.html', 'Modules/TestQuestionPool'); $this->addMultiCommand('importVerifiedFile', $this->lng->txt("import")); $this->addCommandButton('cancelImport', $this->lng->txt("cancel")); - + $this->setShowRowsSelector(false); // Removed due to #38976 - losing upload file on roundtrip $this->initColumns(); } From 8d9cafd46c0f98470e52993e3a2219fb7b8e6751 Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Fri, 24 Nov 2023 13:10:43 +0100 Subject: [PATCH 190/497] Add missing language for google ical --- lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 2 files changed, 2 insertions(+) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 89ce8c1e931a..b968a1d92255 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -8236,6 +8236,7 @@ dateplaner#:#cal_grp_others#:#Andere dateplaner#:#cal_grp_personal#:#Persönlich dateplaner#:#cal_ical_infoscreen#:#Abonnieren dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL (Google Kalender) dateplaner#:#cal_import_appointments#:#Termine importieren dateplaner#:#cal_import_file#:#Importdatei dateplaner#:#cal_import_file_info#:#Wählen Sie die Datei aus, die Ihre Termine enthält. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 1506b721c9ce..f836a120eb90 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -8236,6 +8236,7 @@ dateplaner#:#cal_grp_others#:#Others dateplaner#:#cal_grp_personal#:#Personal dateplaner#:#cal_ical_infoscreen#:#Subscribe dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL (Google Calendar) dateplaner#:#cal_import_appointments#:#Import Appointments dateplaner#:#cal_import_file#:#Import File dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments. From 3d60435860d24ec60bc6fa416ffdd90083ffb5c5 Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Fri, 24 Nov 2023 13:18:21 +0100 Subject: [PATCH 191/497] google ical entry same as in newer versions --- lang/ilias_en.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index f836a120eb90..d8ecf653e179 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -8236,7 +8236,7 @@ dateplaner#:#cal_grp_others#:#Others dateplaner#:#cal_grp_personal#:#Personal dateplaner#:#cal_ical_infoscreen#:#Subscribe dateplaner#:#cal_ical_url#:#iCal-URL -dateplaner#:#cal_ical_url_google#:#iCal-URL (Google Calendar) +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar dateplaner#:#cal_import_appointments#:#Import Appointments dateplaner#:#cal_import_file#:#Import File dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments. @@ -17109,4 +17109,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 From b74b019da86ff7cdcab99abf3c4fe4b73ec487bd Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Fri, 24 Nov 2023 15:32:40 +0100 Subject: [PATCH 192/497] Update maintenance.md Added information about maintenances for Data Protection --- docs/development/maintenance.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/development/maintenance.md b/docs/development/maintenance.md index 9c197b7abc1f..6ae0343ac0a4 100644 --- a/docs/development/maintenance.md +++ b/docs/development/maintenance.md @@ -360,6 +360,17 @@ file containes the following fields: [//]: # (END DataCollection) +[//]: # (BEGIN DataProtection) + +* **Data Protection** + * Maintenance Model: Classic + * 1st Maintainer: [mjansen](https://docu.ilias.de/goto_docu_usr_8784.html) + * 2nd Maintainer: [lscharmer](https://docu.ilias.de/goto_docu_usr_87863.html) + * Testcases: [AUTHOR MISSING](https://docu.ilias.de/goto_docu_pg_64423_4793.html) + * Tester: [TESTER MISSING](https://docu.ilias.de/goto_docu_pg_64423_4793.html) + +[//]: # (END DataProtection) + [//]: # (BEGIN Database) * **Database** From d8e8d809d267fdeed058b2c36d13ff9cb37ba720 Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Fri, 24 Nov 2023 15:37:42 +0100 Subject: [PATCH 193/497] Update maintenance.md Wrong release. Maintenance information removed again. --- docs/development/maintenance.md | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/docs/development/maintenance.md b/docs/development/maintenance.md index 6ae0343ac0a4..9c197b7abc1f 100644 --- a/docs/development/maintenance.md +++ b/docs/development/maintenance.md @@ -360,17 +360,6 @@ file containes the following fields: [//]: # (END DataCollection) -[//]: # (BEGIN DataProtection) - -* **Data Protection** - * Maintenance Model: Classic - * 1st Maintainer: [mjansen](https://docu.ilias.de/goto_docu_usr_8784.html) - * 2nd Maintainer: [lscharmer](https://docu.ilias.de/goto_docu_usr_87863.html) - * Testcases: [AUTHOR MISSING](https://docu.ilias.de/goto_docu_pg_64423_4793.html) - * Tester: [TESTER MISSING](https://docu.ilias.de/goto_docu_pg_64423_4793.html) - -[//]: # (END DataProtection) - [//]: # (BEGIN Database) * **Database** From 1011fdaa79a38c549b39dc216c844bd39b95bf87 Mon Sep 17 00:00:00 2001 From: Robin Kluth Date: Mon, 6 Nov 2023 11:00:59 +0100 Subject: [PATCH 194/497] Update ilias_de.lang --- lang/ilias_de.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index b968a1d92255..a4589f7b1fa9 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -15870,7 +15870,7 @@ survey#:#survey_block_hidden#:#nicht sichtbar survey#:#survey_block_visible#:#sichtbar survey#:#survey_calc_skills#:#Kompetenzstufen bestimmen survey#:#survey_calculate_sum_score#:#Skalenpunktesumme berechnen -survey#:#survey_calculate_sum_score_info#:#Berechnet die Summe aller Skalenpunkt von Single Choice, Multiple Choice und Matrixfragen je Teilnehmer. Achtung: Wenn Teilnehmer solche Fragen überspringen, wird die gesammte Skalenpunktesumme nicht berechnet. +survey#:#survey_calculate_sum_score_info#:#Berechnet die Summe aller Skalenpunkt von Single Choice, Multiple Choice und Matrixfragen je Teilnehmer. Achtung: Wenn Teilnehmer solche Fragen überspringen, wird die gesamte Skalenpunktesumme nicht berechnet. survey#:#survey_cancel_preview#:#Vorschau abbrechen survey#:#survey_cannot_preview_survey#:#Vorschau nicht verfügbar survey#:#survey_clipboard_notice#:#Es befinden sich Fragen in der Zwischenablage. Wählen Sie ein Ziel oder leeren Sie die Zwischenablage. @@ -17109,4 +17109,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 From 2fbb10b24fb5296606a2244a56ca3901a55c124a Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Sat, 25 Nov 2023 10:04:58 +0100 Subject: [PATCH 195/497] Fixed typo in German lang var --- 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 a4589f7b1fa9..d23785cb3a45 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -15870,7 +15870,7 @@ survey#:#survey_block_hidden#:#nicht sichtbar survey#:#survey_block_visible#:#sichtbar survey#:#survey_calc_skills#:#Kompetenzstufen bestimmen survey#:#survey_calculate_sum_score#:#Skalenpunktesumme berechnen -survey#:#survey_calculate_sum_score_info#:#Berechnet die Summe aller Skalenpunkt von Single Choice, Multiple Choice und Matrixfragen je Teilnehmer. Achtung: Wenn Teilnehmer solche Fragen überspringen, wird die gesamte Skalenpunktesumme nicht berechnet. +survey#:#survey_calculate_sum_score_info#:#Berechnet die Summe aller Skalenpunkte von Single Choice, Multiple Choice und Matrixfragen je Teilnehmer. Achtung: Wenn Teilnehmer solche Fragen überspringen, wird die gesamte Skalenpunktesumme nicht berechnet. survey#:#survey_cancel_preview#:#Vorschau abbrechen survey#:#survey_cannot_preview_survey#:#Vorschau nicht verfügbar survey#:#survey_clipboard_notice#:#Es befinden sich Fragen in der Zwischenablage. Wählen Sie ein Ziel oder leeren Sie die Zwischenablage. From 8c445250d56d735278d6779502dbf65b713ab25f Mon Sep 17 00:00:00 2001 From: c-knof <100784517+c-knof@users.noreply.github.com> Date: Mon, 27 Nov 2023 09:11:12 +0100 Subject: [PATCH 196/497] fixed uninitialized var (#6670) --- Services/Language/classes/class.ilLanguage.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Services/Language/classes/class.ilLanguage.php b/Services/Language/classes/class.ilLanguage.php index 91eb3699cdcc..4196b52f9df1 100755 --- a/Services/Language/classes/class.ilLanguage.php +++ b/Services/Language/classes/class.ilLanguage.php @@ -85,7 +85,8 @@ public function __construct(string $a_lang_key) $this->lang_path = ILIAS_ABSOLUTE_PATH . "/lang"; $this->cust_lang_path = ILIAS_ABSOLUTE_PATH . "/Customizing/global/lang"; - $this->lang_default = $client_ini->readVariable("language", "default") ?: 'en'; + $this->lang_default = $client_ini->readVariable("language", "default") ?? 'en'; + $this->lang_user = $this->lang_default; if ($DIC->offsetExists("ilSetting")) { $ilSetting = $DIC->settings(); @@ -125,7 +126,7 @@ public function getLangKey(): string */ public function getDefaultLanguage(): string { - return $this->lang_default ?: "en"; + return $this->lang_default ?? "en"; } /** From 61a70d6d2c2fc87f213e217d7ee61b852069d188 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 27 Nov 2023 10:50:37 +0100 Subject: [PATCH 197/497] Mail: Fix NULL values in autocomplete search --- .../class.ilMailAutoCompleteSentMailsRecipientsProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php b/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php index 63b74de4a4be..2be3ecea090e 100644 --- a/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php +++ b/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php @@ -105,7 +105,7 @@ public function rewind(): void $query = " SELECT DISTINCT - mail.rcp_to login + COALESCE(mail.rcp_to, '') login FROM mail WHERE " . $this->db->like('mail.rcp_to', 'text', $this->quoted_term) . " AND sender_id = " . $this->db->quote($this->user_id, 'integer') . " From 26bd89f52208026d0414732307073f1a8cff7fbe Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 27 Nov 2023 10:52:18 +0100 Subject: [PATCH 198/497] Mail: Fix NULL values in autocomplete search --- .../class.ilMailAutoCompleteSentMailsRecipientsProvider.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php b/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php index 2be3ecea090e..ea8715a83d51 100644 --- a/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php +++ b/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php @@ -105,9 +105,10 @@ public function rewind(): void $query = " SELECT DISTINCT - COALESCE(mail.rcp_to, '') login + mail.rcp_to login FROM mail WHERE " . $this->db->like('mail.rcp_to', 'text', $this->quoted_term) . " + AND mail.rcp_to IS NOT NULL AND sender_id = " . $this->db->quote($this->user_id, 'integer') . " AND mail.sender_id = mail.user_id"; From 5678215b959e435ee4c5fccc2435d6b6b6ba5712 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Mon, 27 Nov 2023 11:07:46 +0100 Subject: [PATCH 199/497] Merge pull request #6549 from fhelfer/feature/loc-settings-indexes Course Bugfix #0028404: Index for loc_settings --- .../Setup/ilCourseObjectiveDBUpdateSteps.php | 43 ++++++++++++++ .../Setup/ilCourseObjectiveSetupAgent.php | 56 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 Modules/Course/classes/Objectives/Setup/ilCourseObjectiveDBUpdateSteps.php create mode 100644 Modules/Course/classes/Objectives/Setup/ilCourseObjectiveSetupAgent.php diff --git a/Modules/Course/classes/Objectives/Setup/ilCourseObjectiveDBUpdateSteps.php b/Modules/Course/classes/Objectives/Setup/ilCourseObjectiveDBUpdateSteps.php new file mode 100644 index 000000000000..184082538d4c --- /dev/null +++ b/Modules/Course/classes/Objectives/Setup/ilCourseObjectiveDBUpdateSteps.php @@ -0,0 +1,43 @@ +db = $db; + } + + public function step_1(): void + { + if (!$this->db->indexExistsByFields('loc_settings', ['itest'])) { + $this->db->addIndex('loc_settings', ['itest'], 'i1'); + } + } + + public function step_2(): void + { + if (!$this->db->indexExistsByFields('loc_settings', ['qtest'])) { + $this->db->addIndex('loc_settings', ['qtest'], 'i2'); + } + } +} diff --git a/Modules/Course/classes/Objectives/Setup/ilCourseObjectiveSetupAgent.php b/Modules/Course/classes/Objectives/Setup/ilCourseObjectiveSetupAgent.php new file mode 100644 index 000000000000..037bce54366a --- /dev/null +++ b/Modules/Course/classes/Objectives/Setup/ilCourseObjectiveSetupAgent.php @@ -0,0 +1,56 @@ + Date: Mon, 27 Nov 2023 12:24:15 +0100 Subject: [PATCH 200/497] Mantis Fix: #38368 --- webservice/soap/classes/class.ilSoapUserAdministration.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/webservice/soap/classes/class.ilSoapUserAdministration.php b/webservice/soap/classes/class.ilSoapUserAdministration.php index 82065583cd7c..13a6a9ef08d6 100755 --- a/webservice/soap/classes/class.ilSoapUserAdministration.php +++ b/webservice/soap/classes/class.ilSoapUserAdministration.php @@ -711,8 +711,7 @@ public function searchUser( LEFT JOIN usr_pref ON usr_pref.usr_id = usr_data.usr_id AND usr_pref.keyword = " . $ilDB->quote("language", "text") . - "'language' - WHERE 1 = 1 " . $query; + " WHERE 1 = 1 " . $query; if ($active > -1) { $query .= " AND active = " . $ilDB->quote($active); @@ -774,7 +773,7 @@ private function buildSearchQuery(array $a_keyfields, string $queryOperator, arr $field_query = array(); foreach ($a_keyvalues as $keyvalue) { if (strlen($keyvalue) >= 3) { - $field_query [] = $keyfield . " like '%" . $keyvalue . "%'"; + $field_query [] = $ilDB->like($ilDB->quoteIdentifier($keyfield), 'text', '%' . $keyvalue . "%"); } } if (count($field_query)) { From 86705ed72da33757334b4fc10e3e17e4c7c53d7b Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 27 Nov 2023 13:08:10 +0100 Subject: [PATCH 201/497] Mail: Make description to nullable See: https://mantis.ilias.de/view.php?id=39095 --- Services/Contact/classes/class.ilMailingList.php | 6 +++--- Services/Contact/classes/class.ilMailingListsGUI.php | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Services/Contact/classes/class.ilMailingList.php b/Services/Contact/classes/class.ilMailingList.php index 3749fcc52be6..48b1655791b5 100644 --- a/Services/Contact/classes/class.ilMailingList.php +++ b/Services/Contact/classes/class.ilMailingList.php @@ -27,7 +27,7 @@ class ilMailingList private int $mail_id; private int $user_id; private string $title = ''; - private string $description = ''; + private ?string $description = ''; private string $createdate; private ?string $changedate; @@ -259,12 +259,12 @@ public function getTitle(): string return $this->title; } - public function setDescription(string $a_description = ''): void + public function setDescription(?string $a_description = ''): void { $this->description = $a_description; } - public function getDescription(): string + public function getDescription(): ?string { return $this->description; } diff --git a/Services/Contact/classes/class.ilMailingListsGUI.php b/Services/Contact/classes/class.ilMailingListsGUI.php index 5ee7137298d1..d2f7c79abb07 100644 --- a/Services/Contact/classes/class.ilMailingListsGUI.php +++ b/Services/Contact/classes/class.ilMailingListsGUI.php @@ -254,7 +254,7 @@ public function showMailingLists(): bool $result[$counter]['check'] = ilLegacyFormElementsUtil::formCheckbox(false, 'ml_id[]', (string) $entry->getId()); $result[$counter]['title'] = $entry->getTitle() . " [#il_ml_" . $entry->getId() . "]"; - $result[$counter]['description'] = $entry->getDescription(); + $result[$counter]['description'] = $entry->getDescription() ?? ''; $result[$counter]['members'] = count($entry->getAssignedEntries()); $this->ctrl->setParameter($this, 'ml_id', $entry->getId()); @@ -388,7 +388,7 @@ private function setValuesByObject(): void { $this->form_gui->setValuesByArray([ 'title' => $this->mlists->getCurrentMailingList()->getTitle(), - 'description' => $this->mlists->getCurrentMailingList()->getDescription() + 'description' => $this->mlists->getCurrentMailingList()->getDescription() ?? '' ]); } From 39076f5ccf2ae6d69c7a01efbb9bcd2639c9f862 Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Mon, 27 Nov 2023 14:30:08 +0100 Subject: [PATCH 202/497] [FIX] 0037213: Visibility for roles has no effect if main menu entry is of type Repository-Link, most of the times # Conflicts: # Services/MainMenu/classes/Provider/CustomMainBarProvider.php --- .../Items/class.ilMMCustomItemStorage.php | 18 ++++++++++- .../Items/class.ilMMItemInformation.php | 2 +- .../Provider/CustomMainBarProvider.php | 29 ++++++++++++++++-- .../class.ilMMTypeHandlerRepositoryLink.php | 8 +++-- .../classes/class.ilObjMainMenuAccess.php | 30 +++++++++++++------ .../interfaces/interface.ilMainMenuAccess.php | 18 ++++++++++- .../MainMenu/Factory/AbstractBaseItem.php | 6 ++-- 7 files changed, 92 insertions(+), 19 deletions(-) diff --git a/Services/MainMenu/classes/Items/class.ilMMCustomItemStorage.php b/Services/MainMenu/classes/Items/class.ilMMCustomItemStorage.php index 3078a7eee688..891fe21f9231 100644 --- a/Services/MainMenu/classes/Items/class.ilMMCustomItemStorage.php +++ b/Services/MainMenu/classes/Items/class.ilMMCustomItemStorage.php @@ -1,5 +1,21 @@ global_role_ids); + return array_map("intval", explode(",", $this->global_role_ids)); } diff --git a/Services/MainMenu/classes/Items/class.ilMMItemInformation.php b/Services/MainMenu/classes/Items/class.ilMMItemInformation.php index e75c72f7f4ed..ab8d63dda72d 100644 --- a/Services/MainMenu/classes/Items/class.ilMMItemInformation.php +++ b/Services/MainMenu/classes/Items/class.ilMMItemInformation.php @@ -66,7 +66,7 @@ public function customTranslationForUser(hasTitle $item): hasTitle static $default_language; // see https://mantis.ilias.de/view.php?id=32276 - if (!isset($usr_language_key) && $DIC->user()->getId() === 0 || $DIC->user()->isAnonymous()) { + if (!isset($usr_language_key) && ($DIC->user()->getId() === 0 || $DIC->user()->isAnonymous())) { $usr_language_key = $DIC->http()->wrapper()->query()->has('lang') ? $DIC->http()->wrapper()->query()->retrieve('lang', $DIC->refinery()->to()->string()) : null; diff --git a/Services/MainMenu/classes/Provider/CustomMainBarProvider.php b/Services/MainMenu/classes/Provider/CustomMainBarProvider.php index abbe021b10d5..babe6213068e 100644 --- a/Services/MainMenu/classes/Provider/CustomMainBarProvider.php +++ b/Services/MainMenu/classes/Provider/CustomMainBarProvider.php @@ -1,6 +1,22 @@ globalScreen()->identification()->core($this)->identifier($storage->getIdentifier()); - $item = $this->globalScreen()->mainBar()->custom($storage->getType(), $identification)->withVisibilityCallable( - $this->mm_access->isCurrentUserAllowedToSeeCustomItem($storage) + $item = $this->globalScreen()->mainBar()->custom($storage->getType(), $identification); + + $item = $item->withVisibilityCallable( + $this->mm_access->isCurrentUserAllowedToSeeCustomItem( + $storage, + function () use ($item) { + return $item->isVisible(); + } + ) ); if ($item instanceof hasTitle && !empty($storage->getDefaultTitle())) { diff --git a/Services/MainMenu/classes/TypeHandler/class.ilMMTypeHandlerRepositoryLink.php b/Services/MainMenu/classes/TypeHandler/class.ilMMTypeHandlerRepositoryLink.php index 7cfb83c61b37..5a36065147b7 100644 --- a/Services/MainMenu/classes/TypeHandler/class.ilMMTypeHandlerRepositoryLink.php +++ b/Services/MainMenu/classes/TypeHandler/class.ilMMTypeHandlerRepositoryLink.php @@ -49,9 +49,13 @@ public function enrichItem(isItem $item): isItem $ref_id = (int) $this->links[$item->getProviderIdentification()->serialize()][self::F_ACTION]; $item = $item->withRefId($ref_id) ->withVisibilityCallable( - function () use ($DIC, $ref_id) { - return $DIC->access()->checkAccess('join', '', $ref_id) + function () use ($DIC, $ref_id, $item) { + $is_visible_parent = $item->isVisible(); + $has_access = $DIC->access()->checkAccess('join', '', $ref_id) || $DIC->access()->checkAccess('read', '', $ref_id); + + return $is_visible_parent + && $has_access; } ); } diff --git a/Services/MainMenu/classes/class.ilObjMainMenuAccess.php b/Services/MainMenu/classes/class.ilObjMainMenuAccess.php index dc26ded47d61..8f676901292b 100644 --- a/Services/MainMenu/classes/class.ilObjMainMenuAccess.php +++ b/Services/MainMenu/classes/class.ilObjMainMenuAccess.php @@ -1,5 +1,21 @@ rbacreview->assignedGlobalRoles($this->user->getId()); if (!$item->hasRoleBasedVisibility()) { - return true; + return $current(); } if (!empty($item->getGlobalRoleIDs())) { foreach ($roles_of_current_user as $role_of_current_user) { - if (in_array($role_of_current_user, $item->getGlobalRoleIDs())) { - return true; + if (in_array($role_of_current_user, $item->getGlobalRoleIDs(), true)) { + return $current(); } } } diff --git a/Services/MainMenu/interfaces/interface.ilMainMenuAccess.php b/Services/MainMenu/interfaces/interface.ilMainMenuAccess.php index da1686beb291..a534963cd16b 100644 --- a/Services/MainMenu/interfaces/interface.ilMainMenuAccess.php +++ b/Services/MainMenu/interfaces/interface.ilMainMenuAccess.php @@ -1,5 +1,21 @@ visiblility_callable = $is_visible; + $clone->is_visible_static = null; return $clone; } From 002f3455ab7448c1f1dd5e508bf64bf18742104e Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Mon, 27 Nov 2023 14:59:53 +0100 Subject: [PATCH 203/497] [FIX] Missing casting --- Services/MainMenu/classes/class.ilObjMainMenuAccess.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/MainMenu/classes/class.ilObjMainMenuAccess.php b/Services/MainMenu/classes/class.ilObjMainMenuAccess.php index 8f676901292b..6355c1f2529a 100644 --- a/Services/MainMenu/classes/class.ilObjMainMenuAccess.php +++ b/Services/MainMenu/classes/class.ilObjMainMenuAccess.php @@ -93,7 +93,7 @@ public function isCurrentUserAllowedToSeeCustomItem(ilMMCustomItemStorage $item, } if (!empty($item->getGlobalRoleIDs())) { foreach ($roles_of_current_user as $role_of_current_user) { - if (in_array($role_of_current_user, $item->getGlobalRoleIDs(), true)) { + if (in_array((int) $role_of_current_user, $item->getGlobalRoleIDs(), true)) { return $current(); } } From ff617c961bd33832aa9de6df104fa0bb88c51f62 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 27 Nov 2023 15:05:25 +0100 Subject: [PATCH 204/497] User: Fix Value Cannot By Null Part 3 See: https://mantis.ilias.de/view.php?id=39010 --- Services/User/classes/class.ilUserProfile.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Services/User/classes/class.ilUserProfile.php b/Services/User/classes/class.ilUserProfile.php index e95f7cfd0e07..ad21738bc065 100755 --- a/Services/User/classes/class.ilUserProfile.php +++ b/Services/User/classes/class.ilUserProfile.php @@ -561,9 +561,11 @@ public function addStandardFieldsToForm( case "text": if (self::userSettingVisible($f)) { $ti = new ilTextInputGUI($lng->txt($lv), "usr_" . $f); + $value = ''; if ($a_user) { - $ti->setValue($a_user->$m() ?? ''); + $value = $a_user->$m() ?? ''; } + $ti->setValue($value); $ti->setMaxLength($p["maxlength"]); $ti->setSize($p["size"]); $ti->setRequired((bool) $ilSetting->get("require_" . $f)); From 6ad20cf593f5963c1142ff13f62b767958d50eff Mon Sep 17 00:00:00 2001 From: Richard Klees Date: Mon, 27 Nov 2023 14:48:59 +0100 Subject: [PATCH 205/497] LUI: fix check #38699 --- .github/workflows/legacy-ui.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/legacy-ui.yml b/.github/workflows/legacy-ui.yml index 23391ebafe16..8ae579f43c92 100644 --- a/.github/workflows/legacy-ui.yml +++ b/.github/workflows/legacy-ui.yml @@ -12,7 +12,6 @@ on: type: choice options: - trunk - - release_8 permissions: contents: read pull-requests: read @@ -37,7 +36,7 @@ jobs: args: --no-interaction --no-progress --ignore-platform-reqs --no-scripts - name: 'PHStan Custom Rules' - run: CI/PHPStan/run_legacy_ui_report.sh + run: scripts/PHPStan/run_legacy_ui_report.sh - name: 'Store Report' uses: actions/upload-artifact@v3 From 70f65a5af39aaa6f5fe277f5a2ba623991074d61 Mon Sep 17 00:00:00 2001 From: mjansen Date: Tue, 28 Nov 2023 12:24:50 +0100 Subject: [PATCH 206/497] Mail: Force `int` as return value when searching group --- .../Mail/classes/Address/Type/class.ilMailAddressTypeHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Mail/classes/Address/Type/class.ilMailAddressTypeHelper.php b/Services/Mail/classes/Address/Type/class.ilMailAddressTypeHelper.php index 70b1dab27d36..98d989692aa6 100644 --- a/Services/Mail/classes/Address/Type/class.ilMailAddressTypeHelper.php +++ b/Services/Mail/classes/Address/Type/class.ilMailAddressTypeHelper.php @@ -38,7 +38,7 @@ public function doesGroupNameExists(string $name): bool public function getGroupObjIdByTitle(string $title): int { - return ilObjGroup::_lookupIdByTitle($title); + return (int) ilObjGroup::_lookupIdByTitle($title); } public function getInstanceByRefId(int $refId): ilObject From 79bdc91648e93f32f20959f1607a78a923eeea1c Mon Sep 17 00:00:00 2001 From: Uwe Kohnle Date: Tue, 28 Nov 2023 11:48:09 +0000 Subject: [PATCH 207/497] fix xapi statement viewer if en-us does not exist --- .../classes/XapiReport/class.ilCmiXapiStatementsReport.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/CmiXapi/classes/XapiReport/class.ilCmiXapiStatementsReport.php b/Modules/CmiXapi/classes/XapiReport/class.ilCmiXapiStatementsReport.php index d2e1f5792b10..f28aba222bb8 100644 --- a/Modules/CmiXapi/classes/XapiReport/class.ilCmiXapiStatementsReport.php +++ b/Modules/CmiXapi/classes/XapiReport/class.ilCmiXapiStatementsReport.php @@ -148,9 +148,9 @@ protected function fetchVerbId(array $statement): string protected function fetchVerbDisplay(array $statement): string { - try { + if (isset($statement['verb']['display']['en-US'])) { return $statement['verb']['display']['en-US']; - } catch (Exception $e) { + } else { return $statement['verb']['id']; } } From 32af569621d11e32fe6b84a2f227ca77660e5b64 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Tue, 28 Nov 2023 14:41:54 +0100 Subject: [PATCH 208/497] AdvMD: fix array access (38855) --- .../Translation/class.ilAdvancedMDRecordTranslationGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php b/Services/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php index 8964f91dbd12..e3f7cc445dec 100644 --- a/Services/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php +++ b/Services/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php @@ -29,7 +29,7 @@ protected function translations(): void */ protected function saveTranslations(): void { - $languages = (array) $this->request->getParsedBody()['active_languages']; + $languages = (array) ($this->request->getParsedBody()['active_languages'] ?? []); $default = (string) $this->request->getParsedBody()['default']; if (!in_array($default, $languages)) { From 7c1b9d4643c8289d799051a2aa57fdee6b513d9c Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Tue, 28 Nov 2023 15:48:52 +0100 Subject: [PATCH 209/497] Fix line/file endings --- lang/ilias_de.lang | 2 +- lang/ilias_en.lang | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index d23785cb3a45..48bb50a15280 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -17109,4 +17109,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 +wsp#:#wsp_type_wfld#:#Ordner \ No newline at end of file diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index d8ecf653e179..18c5f93e374f 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -17109,4 +17109,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 +wsp#:#wsp_type_wfld#:#Folder \ No newline at end of file From b791feac71cfeb7f3b319b23364174b7c212d06d Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Tue, 28 Nov 2023 16:33:21 +0100 Subject: [PATCH 210/497] sync language files --- lang/ilias_ar.lang | 27 +++++++++++++++++++++++++++ lang/ilias_bg.lang | 27 +++++++++++++++++++++++++++ lang/ilias_cs.lang | 27 +++++++++++++++++++++++++++ lang/ilias_da.lang | 27 +++++++++++++++++++++++++++ lang/ilias_el.lang | 27 +++++++++++++++++++++++++++ lang/ilias_es.lang | 27 +++++++++++++++++++++++++++ lang/ilias_et.lang | 27 +++++++++++++++++++++++++++ lang/ilias_fa.lang | 27 +++++++++++++++++++++++++++ lang/ilias_fr.lang | 25 +++++++++++++++++++++++++ lang/ilias_hr.lang | 27 +++++++++++++++++++++++++++ lang/ilias_hu.lang | 27 +++++++++++++++++++++++++++ lang/ilias_it.lang | 27 +++++++++++++++++++++++++++ lang/ilias_ja.lang | 27 +++++++++++++++++++++++++++ lang/ilias_ka.lang | 27 +++++++++++++++++++++++++++ lang/ilias_lt.lang | 27 +++++++++++++++++++++++++++ lang/ilias_nl.lang | 27 +++++++++++++++++++++++++++ lang/ilias_pl.lang | 27 +++++++++++++++++++++++++++ lang/ilias_pt.lang | 27 +++++++++++++++++++++++++++ lang/ilias_ro.lang | 27 +++++++++++++++++++++++++++ lang/ilias_ru.lang | 27 +++++++++++++++++++++++++++ lang/ilias_sk.lang | 27 +++++++++++++++++++++++++++ lang/ilias_sl.lang | 27 +++++++++++++++++++++++++++ lang/ilias_sq.lang | 27 +++++++++++++++++++++++++++ lang/ilias_sr.lang | 27 +++++++++++++++++++++++++++ lang/ilias_sv.lang | 31 +++++++++++++++++++++++++++---- lang/ilias_tr.lang | 27 +++++++++++++++++++++++++++ lang/ilias_uk.lang | 27 +++++++++++++++++++++++++++ lang/ilias_vi.lang | 27 +++++++++++++++++++++++++++ lang/ilias_zh.lang | 27 +++++++++++++++++++++++++++ 29 files changed, 781 insertions(+), 4 deletions(-) diff --git a/lang/ilias_ar.lang b/lang/ilias_ar.lang index 6f37ce3ec9f0..6317b2984716 100644 --- a/lang/ilias_ar.lang +++ b/lang/ilias_ar.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Please click on center of the desired area. assessment#:#circle_click_circle#:#Please click on a circle point of the desired area. assessment#:#clientip#:#Client IP assessment#:#close_text_hint#:#You can define a gap by entering [gap][/gap] at the text position of your choice. Press the 'Create gaps' button to add an editable form for every gap. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Text Field Length assessment#:#cloze_fixed_textlength_description#:#If you enter a value greater than 0, all text and numeric gap text fields will be created with the fixed length of this value. assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Minimum Level (in %) assessment#:#tst_mark_official_form#:#Official Form assessment#:#tst_mark_passed#:#Passed assessment#:#tst_mark_reset_to_simple_mark_schema#:#Create Simple Mark Schema +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Short Form assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Blog Administration blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#تم تعطيل اسلوب المصادقة ا common#:#err_auth_soap_no_ilias_user#:#Login failed. SOAP authentication successful, but no corresponding ILIAS user exists. Please contact your system administrator. common#:#err_check_input#:#من الممكن ان لا يتم حفظ الاعدادات. الرجاء فحص مشاركتك common#:#err_count_param#:#السبب: احصاء مدخل خاطئ +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Error in line common#:#err_inactive#:#تم تفعيل هذا الحساب. الرجاء الاتصال بمدير النظام من اجل الدخول common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests common#:#objs_rwik#:#ECS Wikis common#:#objs_sahs#:#الوحدات التعليمية common#:#objs_sess#:#جلسات +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#مسح مجموعة الاسئلة common#:#objs_st#:#Chapters common#:#objs_svy#:#مسوحات @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#تعديل التقويم dateplaner#:#cal_edit_milestone#:#Edit Milestone dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#تفعيل المعالم dateplaner#:#cal_enable_group_milestones_desc#:#يمكن هذا الخيار تخطيط المعالم في التقويم dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses. @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments dateplaner#:#cal_import_file#:#Import File dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments. @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#SCORM/AICC انشاء الوحدة التعليمية rbac#:#rbac_create_sess#:#انشاء جلسة +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#انشاء مسح مجموعة اسئلة rbac#:#rbac_create_svy#:#انشاء مسح rbac#:#rbac_create_tst#:#انشاء اختبار @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Read access to Sessions rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Sessions are visible rbac#:#sess_write#:#Edit Sessions +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings rbac#:#skmg_read#:#Read access to Skill Management rbac#:#skmg_visible#:#Skill Management is visible @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#الرجاء اختيار اي البيانات الشخصية التي يجب ان تكون ظاهرة لمستخدمين اخرين user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Save ordering and titles diff --git a/lang/ilias_bg.lang b/lang/ilias_bg.lang index e2fed8264efc..15c91c6d8063 100644 --- a/lang/ilias_bg.lang +++ b/lang/ilias_bg.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Моля, кликнете в центъра assessment#:#circle_click_circle#:#Моля, кликнете на точка от кръга на желаната област. assessment#:#clientip#:#Клиенски IP адрес assessment#:#close_text_hint#:#Можете да дефинирате празнина, като въведете в избраната от вас позиция в текста. Натиснете бутона "Създаване на празнини", за да добавите форма за редактиране за всяка от празнините. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Дължина на текстовото поле assessment#:#cloze_fixed_textlength_description#:#Ако въведете стойност, по-голяма от 0, всички текстови полета и текстови полета с цифрова разлика ще бъдат създадени с фиксираната дължина на тази стойност. assessment#:#cloze_gap_size_info#:#Ако въведете стойност, по-голяма от 0, това текстово поле за празнина ще бъде създадено с фиксираната дължина на тази стойност. Ако не въведете стойност, текстовото поле за празнина ще бъде създадено със стойността на глобалната фиксирана дължина. @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Минимално ниво (в %) assessment#:#tst_mark_official_form#:#Официална форма assessment#:#tst_mark_passed#:#Издържан assessment#:#tst_mark_reset_to_simple_mark_schema#:#Създаване на проста схема на оценките +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Кратка форма assessment#:#tst_max_allowed_users_heading#:#Максималният брой едновременни потребители в този тест е достигнат assessment#:#tst_max_allowed_users_message#:#Максималният брой едновременно активни потребители в теста е достигнат. Моля, опитайте отново по-късно, за да стартирате или възобновите теста. Ако един от активните потребители е неактивен за повече от %s секунди, може да успеете да въведете този тест. Благодарим ви за разбирането. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Администрация на блога blog#:#blog_settings_navigation#:#Колона за навигиране blog#:#blog_show_latest#:#Показване на последните публикации/чертежи blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Стил на блога###22 06 2022 new variable blog#:#blog_task_publishing_draft_title#:#Публикуване на проект "%s" blog#:#blog_toggle_draft#:#Запазване като чернова @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Вашият метод за удостове common#:#err_auth_soap_no_ilias_user#:#Присъединяването е неуспешно. Удостоверяването по SOAP е успешно, но не съществува съответен потребител на ILIAS. Свържете се със системния си администратор. common#:#err_check_input#:#Настройките не могат да бъдат запазени. Моля, проверете въведените данни. common#:#err_count_param#:#Причина: Грешно изброяване на параметрите +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Грешка в реда common#:#err_inactive#:#Този акаунт не е бил активиран. Моля, свържете се със системния администратор за достъп. common#:#err_inactive_login_attempts#:#Потребителският ви акаунт е деактивиран поради твърде много неуспешни опити за влизане. Щракнете върху "Свържете се с техническата поддръжка" в долния колонтитул на тази страница, за да уведомите администратора за необходимостта от повторно активиране на акаунта ви. @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS тестове common#:#objs_rwik#:#ECS Уикита common#:#objs_sahs#:#SCORM/AICC модули за обучение common#:#objs_sess#:#Сесии +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Набори въпроси за проучванията common#:#objs_st#:#Глави common#:#objs_svy#:#Проучвания @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Елементът на страницата не е намерен.###22 06 2022 new variable copg#:#copg_page_type_stys#:#Страница за оформление +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Въпросите не се поддържат в този контекст. copg#:#copg_reload_page#:#Презареждане на страницата###22 06 2022 new variable copg#:#copg_sec_link_info#:#Ако зададете връзка към целия раздел, моля, уверете се, че в раздела не са включени други интерактивни елементи. В противен случай поведението им може да бъде нестабилно. @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Редактиране на календар dateplaner#:#cal_edit_milestone#:#Редактиране на основни етапи dateplaner#:#cal_edit_recurrences#:#Редактиране на всички срещи dateplaner#:#cal_edit_single#:#Редактиране на тази среща +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Разрешаване на основни етапи dateplaner#:#cal_enable_group_milestones_desc#:#Тази опция активира планирането на етапи в календара. dateplaner#:#cal_err_invalid_notification_rcps#:#Списъкът на получателите на уведомленията не е валиден. Моля, изберете само имена на потребителски акаунти в ILIAS или валидни имейл адреси. @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others dateplaner#:#cal_grp_personal#:#Personal dateplaner#:#cal_ical_infoscreen#:#Subscribe dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments dateplaner#:#cal_import_file#:#Файл за импортиране dateplaner#:#cal_import_file_info#:#Изберете файла, който съдържа срещите от календара ви. @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Записани заглавия. lng#:#language_detection#:#Разпознаване на езици###22 06 2022 new variable lng#:#lng_disable_language_detection#:# Деактивиране на откриването на езика @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Преместване в основните елеме mme#:#msg_languages_added#:#Прибавени езици mme#:#msg_moved#:#Елементът е преместен успешно###22 06 2022 new variable mme#:#msg_not_moved#:#Елементът не можа да бъде преместен, моля, изберете валиден родител.###22 06 2022 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#Всички потребителски елементи и преводи ще бъдат изтрити, всички стандартни елементи ще бъдат възстановени до фабричните настройки по подразбиране. Всички персонализации ще бъдат загубени. mme#:#msg_restored#:#Пълно възстановяване на главното меню mme#:#msg_subitem_deleted#:#Изтрит елемент. @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation obj#:#obj_activation_list_gui#:#Availability obj#:#obj_add_languages#:#Добавяне на езици obj#:#obj_additional_langs#:#Допълнителни езици +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Преводът за редактиране на страница е деактивиран. obj#:#obj_copy_progress#:#Прогрес на копирането obj#:#obj_deactivate_content_lang#:# Деактивиране на превода за редактиране на страници @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Създаване на нова роля rbac#:#rbac_create_rolt#:#Създаване на нов шаблон на роля rbac#:#rbac_create_sahs#:#Създаване на SCORM/AICC модул за обучение rbac#:#rbac_create_sess#:#Създаване на сесия +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Създаване на анкета с въпроси rbac#:#rbac_create_svy#:#Създаване на проучване rbac#:#rbac_create_tst#:#Създаване на тест @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Достъп за четене на сесии rbac#:#sess_read_learning_progress#:#Потребителят може да види напредъка в обучението на други потребители rbac#:#sess_visible#:#Сесиите са видими rbac#:#sess_write#:#Редактиране на сесии +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Промяна на настройките на разрешението rbac#:#skmg_read#:#Достъп до управлението на уменията за четене rbac#:#skmg_visible#:#Управлението на уменията е видимо @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Изпращане на потвържде survey#:#svy_matrix_layout_percentages_sum_invalid#:#Настройките на колоните не се сумират до 100%. survey#:#svy_max_sum_score#:#Максимален общ резултат###22 06 2022 new variable survey#:#svy_neutral_answer#:#Текст за неутрален отговор ("Не е посочено", "Не знам" и т.н.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#Един имейл, включващ резултатите от проучването survey#:#svy_notification_tutor_results_alert#:#Това изисква крайна дата. survey#:#svy_notification_tutor_results_info#:#След достигане на крайните данни задача на cron ще изпрати имейл с прикрепени към него подробни резултати от проучването. @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Промотиране на повторен user#:#user_prompting_settings#:#Настройки на подканянето user#:#user_public_profile_info#:#Моля, изберете кои лични данни да бъдат видими за други потребители. user#:#user_publish_options#:#Публикуване на профил +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#Потребител - начална точка user#:#user_save_continue#:#Запазване и продължаване user#:#user_save_ordering_and_titles#:#Запазване на подредбата и заглавията diff --git a/lang/ilias_cs.lang b/lang/ilias_cs.lang index 89d87c112524..ddc917917899 100644 --- a/lang/ilias_cs.lang +++ b/lang/ilias_cs.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Klepněte prosím na střed požadované ploc assessment#:#circle_click_circle#:#Klepněte prosím na okraj požadované plochy. assessment#:#clientip#:#IP klienta assessment#:#close_text_hint#:#Můžete definovat mezeru vložením [gap][/gap] na Vámi vybranou další pozici. Stiskněte tlačítko 'Vytvořit mezery' k přidání editovatelného formuláře pro každou mezeru. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Délka textového pole assessment#:#cloze_fixed_textlength_description#:#Pokud vložíte hodnotu větší než 0, všechna textová pole textových i numerických mezer budou vytvářeny s pevnou délkou rovnou této hodnotě. assessment#:#cloze_gap_size_info#:#Pokud zadáte hodnotu větší než 0, bude toto textové pole mezery vytvořeno s pevnou délkou této hodnoty. Pokud nezadáte hodnotu, bude textové pole mezery vytvořeno s hodnotou globální pevné délky. @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Minimální hladina (v %) assessment#:#tst_mark_official_form#:#Oficiální tvar assessment#:#tst_mark_passed#:#Prošel assessment#:#tst_mark_reset_to_simple_mark_schema#:#Vytvořit jednoduché schéma známkování +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Zkrácený tvar assessment#:#tst_max_allowed_users_heading#:#Dosažen maximální počet simultánních účastníků v tomto testu assessment#:#tst_max_allowed_users_message#:#Maximální počet simultánních účastníků v tomto testu byl dosažen. Zkuste začít nebo pokračovat znovu později. Pokud bude některý z aktivních účastníků nenaktivní déle než %s s., můžete namísto něj do testu vstoupit. Děkujeme za pochopení. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Správa blogu blog#:#blog_settings_navigation#:#Sloupec navigace blog#:#blog_show_latest#:#Zobrazit nejnovější příspěvky/koncepty blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Styl blogu blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Uložit jako Draft @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Vaše metoda autentizace je deaktivována. common#:#err_auth_soap_no_ilias_user#:#Přihlášení selhalo. Autentizace SOAP úspěšná, avšak neodpovídá jméno uživatele ILIAS. Kontaktujte prosím svého systémového administrátora. common#:#err_check_input#:#Nastavení nelze uložit. Zkontrolujte prosím svůj vstup. common#:#err_count_param#:#Důvod: Chybný počet parametrů +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Chyba na řádce common#:#err_inactive#:#Tento účet nebyl aktivován. Kontaktujte prosím svého systémového administrátora. common#:#err_inactive_login_attempts#:#Váš uživatelský účet byl deaktivován z důvodu příliš mnoha neúspěšných pokusů o přihlášení. V zápatí této stránky klikněte na položku „Kontaktovat technickou podporu“ a informujte správce o nutnosti reaktivace účtu. @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Testy common#:#objs_rwik#:#ECS Wiki common#:#objs_sahs#:#Výukové moduly SCORM/AICC common#:#objs_sess#:#Lekce +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Zásobníky otázek (ankety) common#:#objs_st#:#Kapitoly common#:#objs_svy#:#Ankety @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#V tomto kontextu nejsou otázky podporovány. copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#Pokud nastavíte odkaz na celou část, ujistěte se, že v této části nejsou obsaženy žádné další interaktivní prvky. Jinak může být jejich chování nevypočitatelné. @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Upravit kalendář dateplaner#:#cal_edit_milestone#:#Upravit milník dateplaner#:#cal_edit_recurrences#:#Upravit všechny schůzky dateplaner#:#cal_edit_single#:#Upravit tuto schůzku +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Zapnout milníky dateplaner#:#cal_enable_group_milestones_desc#:#Tato volba zapíná v kalendáři plánovací milníky. dateplaner#:#cal_err_invalid_notification_rcps#:#Tento seznam příjemců upozornění není platný. Vyberte prosím jen přihlašovací jména uživatelů ILIAS, nebo platné emailové adresy. @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Ostatní dateplaner#:#cal_grp_personal#:#Osobní dateplaner#:#cal_ical_infoscreen#:#Předplatit si dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Importovat schůzky dateplaner#:#cal_import_file#:#Importovat soubor dateplaner#:#cal_import_file_info#:#Vyberte tento soubor, který obsahuje Váš kalendář se schůzkami. @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titulky byly uloženy. lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Vypnout detekci jazyka @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Přidané jazyky mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Položka byla smazána. @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Aktivace obj#:#obj_activation_list_gui#:#Dostupnost obj#:#obj_add_languages#:#Přidat jazyky obj#:#obj_additional_langs#:#Další jazyky +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Překlad pro úpravy stránky byl deaktivován. obj#:#obj_copy_progress#:#Kopírovat postup obj#:#obj_deactivate_content_lang#:#Deaktivovat překlad pro úpravy stránky @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Vytvořit novou roli rbac#:#rbac_create_rolt#:#Vytvořit novou šablonu role rbac#:#rbac_create_sahs#:#Vytvořit výukový modul SCORM/AICC rbac#:#rbac_create_sess#:#Vytvořit lekci +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Vytvořit zásobník otázek ankety rbac#:#rbac_create_svy#:#Vytvořit anketu rbac#:#rbac_create_tst#:#Vytvořit test @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Právo číst na nastavení lekce rbac#:#sess_read_learning_progress#:#Uživatel si může prohlédnout postup výuky ostatních uživatelů rbac#:#sess_visible#:#Lekce jsou viditelné rbac#:#sess_write#:#Upravit lekci +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Změnit nastavení oprávnění rbac#:#skmg_read#:#Přístup číst na management odbornosti rbac#:#skmg_visible#:#Management odbornosti je viditelný @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Poslat potvrzení účasti survey#:#svy_matrix_layout_percentages_sum_invalid#:#Nastavení sloupců neobsahuje 100 % součet. survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text pro neutrální odpověď („Neurčeno“, „Nevím“ atd.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Výzva k opakování user#:#user_prompting_settings#:#Výzva k nastavení user#:#user_public_profile_info#:#Vyberte prosím která osobní data by měla být viditelná jiným uživatelům. user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#Uživatel - Výchozí bod user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Uložit řazení a názvy diff --git a/lang/ilias_da.lang b/lang/ilias_da.lang index 4ab81f79b666..b71099f90dce 100644 --- a/lang/ilias_da.lang +++ b/lang/ilias_da.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Klik venligst i midten af det ønkede område assessment#:#circle_click_circle#:#Klik venligst på et cirkelpunkt i det ønkede område. assessment#:#clientip#:#Klient IP assessment#:#close_text_hint#:#Du definerer et hul ved at indtaste [gap][/gap] på en tekstposition efter eget valg. Tryk på 'Opret huller' knappen for at redigere hvert enkelt hul. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Længde på tekstfelt assessment#:#cloze_fixed_textlength_description#:#Hvis du indtaster en værdi der er større end 0 bliver alle numeriske og tekst huller den størrelse. assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Min. niveau (i %) assessment#:#tst_mark_official_form#:#Officiel form assessment#:#tst_mark_passed#:#Bestået assessment#:#tst_mark_reset_to_simple_mark_schema#:#Opret simpel karakterskala +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Kort form assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Blog Administration###06 08 2011 new variable blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###11 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Gem som udkast @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Din authentificeringsmetode er deaktiveret common#:#err_auth_soap_no_ilias_user#:#Login failed. SOAP authentication successful, but no corresponding ILIAS user exists. Please contact your system administrator. common#:#err_check_input#:#Rettelserne kunne ikke gemmes. Kontroller det indtastede og prøv igen. common#:#err_count_param#:#Grund: Forkert antal parametre +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Fejl i linje common#:#err_inactive#:#Denne konto er ikke blevet aktiveret. Kontakt venligst systemadministratoren for at få adgang. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests###28 08 2012 new variable common#:#objs_rwik#:#ECS Wikis###28 08 2012 new variable common#:#objs_sahs#:#SCORM/AICC Læremoduler common#:#objs_sess#:#Sessioner +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Spørgsmål til undersøgelse common#:#objs_st#:#Kapitler common#:#objs_svy#:#Undersøgelser @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Ret kalender dateplaner#:#cal_edit_milestone#:#Ret milepæl dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###16 09 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###16 09 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Brug milepæle dateplaner#:#cal_enable_group_milestones_desc#:#Slå planlægning med milepæle i kalenderen til. dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses.###27 10 2012 new variable @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Abonner dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Importer aftaler dateplaner#:#cal_import_file#:#Importer fil dateplaner#:#cal_import_file_info#:#Vælg den fil, der indeholder dine kalenderaftaler @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#Lav SCORM/AICC læremodul rbac#:#rbac_create_sess#:#Lav session +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Lav spørgsmålssamling til afstemning rbac#:#rbac_create_svy#:#Lav afstemning rbac#:#rbac_create_tst#:#Lav test @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Læseadgang til sessioner rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Sessioner er synlige rbac#:#sess_write#:#Ret sessioner +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings###10 11 2011 new variable rbac#:#skmg_read#:#Read access to Skill Management###10 11 2011 new variable rbac#:#skmg_visible#:#Skill Management is visible###10 11 2011 new variable @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%.###28 08 2012 new variable survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Tekst for neutralt svar ("ikke angivet", "ved ikke" osv.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Her vælger du hvilke af dine personlige data der er tilgængelige for andre brugere. user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Save ordering and titles###22 03 2011 new variable diff --git a/lang/ilias_el.lang b/lang/ilias_el.lang index 43f51f321897..0df9967adb86 100644 --- a/lang/ilias_el.lang +++ b/lang/ilias_el.lang @@ -600,6 +600,7 @@ assessment#:#circle_click_center#:#Παρακαλώ κάντε κλικ στο assessment#:#circle_click_circle#:#Παρακαλώ κάντε κλικ στο κυκλικό σημείο της επιθυμητής περιοχής assessment#:#clientip#:#IP Πελάτη assessment#:#close_text_hint#:#Μπορείτε να ορίσετε ένα κενό εισάγοντας [gap][/gap] στη θέση κειμένου της επιλογής σας. Πατήστε στο κουμπί 'Δημιουργία κενών' για να προσθέσετε μια επεξεργάσιμη φόρμα για κάθε κενό. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Text Field Length assessment#:#cloze_fixed_textlength_description#:#Εαν εισάγετε τιμή μεγαλύτερη του 0, όλα τα κείμενα και οι αριθμητικές τιμές θα δημιουργηθούν μέ αυτόν ώς μέγιστο αριθμό επιτρεπόμενο χαρακτήρων assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1537,6 +1538,7 @@ assessment#:#tst_mark_minimum_level#:#Ελάχιστο επίπεδο (σε %) assessment#:#tst_mark_official_form#:#Επίσημη μορφή assessment#:#tst_mark_passed#:#Πέρασε assessment#:#tst_mark_reset_to_simple_mark_schema#:#Δημιουργία απλού βαθμολογικού σχήματος +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Σύντομη μορφή assessment#:#tst_max_allowed_users_heading#:#Έχετε φθάσει το μέγιστο αριθμό ταυτόχρονων χρηστών γι' αυτό το διαγώνισμα assessment#:#tst_max_allowed_users_message#:#Έχετε φθάσει το μέγιστο αριθμό ταυτόχρονων χρηστών γι' αυτό το διαγώνισμα. Παρακαλώ ξαναπροσπαθήστε αργότερα να ξεκινήσετε ή να συνεχίσετε το διαγώνισμα. Αν κάποιος από τους ενεργούς χρήστες μείνει ανενεργός για περισσότερα από %s δευτερόλεπτα, ίσως να έχετε τη δυνατότητα να δώσετε το διαγώνισμα. Σας ευχαριστούμε για την κατανόηση. @@ -2445,6 +2447,7 @@ blog#:#blog_settings#:#Blog Administration###06 08 2011 new variable blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft###10 11 2011 new variable @@ -3962,6 +3965,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated. common#:#err_auth_soap_no_ilias_user#:#Αποτυχημένη Σύνδεση. Η επικύρωση SOAP ήταν επιτυχής, αλλά δεν υπάρχει αντίστοιχος χρήστης ILIAS. Παρακαλώ επικοινωνήστε με το διαχειριστή του συστήματος. common#:#err_check_input#:#The settings could not be saved. Please check your input. common#:#err_count_param#:#Αιτιολογία: λανθασμένος αριθμός παραμέτρων +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Σφάλμα στη γραμμή common#:#err_inactive#:#Ο λογαριασμός αυτός δεν έχει ενεργοποιηθεί. Παρακαλώ επικοινωνήστε με τον διαχειριστή συστήματος για πρόσβαση. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5118,6 +5122,7 @@ common#:#objs_rtst#:#ECS Tests###28 08 2012 new variable common#:#objs_rwik#:#ECS Wikis###28 08 2012 new variable common#:#objs_sahs#:#Εκπαιδευτικές μονάδες SCORM/AICC common#:#objs_sess#:#Συνεδρίες +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Δεξαμενή ερωτήσεων για Έρευνα common#:#objs_st#:#Κεφάλαια common#:#objs_svy#:#Έρευνες @@ -7245,6 +7250,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8185,6 +8191,7 @@ dateplaner#:#cal_edit_category#:#Edit Calendar dateplaner#:#cal_edit_milestone#:#Edit Milestone###26 06 2009 new variable dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Enable Milestones###26 06 2009 new variable dateplaner#:#cal_enable_group_milestones_desc#:#This option enables milestone planning in the calendar.###26 06 2009 new variable dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses.###27 10 2012 new variable @@ -8215,6 +8222,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe###28 08 2012 new variable dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments###28 08 2012 new variable dateplaner#:#cal_import_file#:#Import File###28 08 2012 new variable dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments.###28 08 2012 new variable @@ -8992,6 +9000,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10326,7 +10335,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11939,6 +11950,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12217,6 +12229,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13731,6 +13744,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#Create SCORM/AICC Learning Module###16 09 2009 new variable rbac#:#rbac_create_sess#:#Create Session +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Create Question Pool Survey###16 09 2009 new variable rbac#:#rbac_create_svy#:#Create Survey###16 09 2009 new variable rbac#:#rbac_create_tst#:#Create Test###16 09 2009 new variable @@ -13906,6 +13920,17 @@ rbac#:#sess_read#:#Read access to Sessions rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Sessions are visible rbac#:#sess_write#:#Edit Sessions +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings###10 11 2011 new variable rbac#:#skmg_read#:#Read access to Skill Management###10 11 2011 new variable rbac#:#skmg_visible#:#Skill Management is visible###10 11 2011 new variable @@ -16034,6 +16059,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%.###28 08 2012 new variable survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.)###28 08 2012 new variable +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16721,6 +16747,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Please select which personal data should be visible to other users.###30 04 2009 new variable user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Save ordering and titles###22 03 2011 new variable diff --git a/lang/ilias_es.lang b/lang/ilias_es.lang index ab32c41215d2..3943c78de24a 100644 --- a/lang/ilias_es.lang +++ b/lang/ilias_es.lang @@ -601,6 +601,7 @@ assessment#:#circle_click_center#:#Por favor haga click en el centro del área d assessment#:#circle_click_circle#:#Por favor haga click en un punto del círculo del área deseada. assessment#:#clientip#:#IP Cliente assessment#:#close_text_hint#:#Puede definir un hueco introduciendo [gap][/gap] en la posición del texto a tu elección. Presiona el botón 'Crear huecos' para añadir un formulario editable para cada hueco. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Longitud de Campo de Texto assessment#:#cloze_fixed_textlength_description#:#Si introduce un valor mayor que 0, todos los campos de texto y de huecos numéricos serán creados con la longitud prefijada por este valor. assessment#:#cloze_gap_size_info#:#Si se introduce un valor mayor que 0, este hueco para texto se creará con esta longitud fija. Si no se introduce un valor, su longitud será la del valor prefijado de forma global. @@ -1538,6 +1539,7 @@ assessment#:#tst_mark_minimum_level#:#Nivel Mínimo (en %) assessment#:#tst_mark_official_form#:#Forma oficial assessment#:#tst_mark_passed#:#Superado assessment#:#tst_mark_reset_to_simple_mark_schema#:#Crear un esquema simple de calificación +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Forma abreviada assessment#:#tst_max_allowed_users_heading#:#Se ha superado el número máximo de usuarios simultáneos en este test assessment#:#tst_max_allowed_users_message#:#El máximo número de usuarios activos simultáneos en el test ha sido alcanzado. Por favor intenta otra vez comenzar o retomar el test. Si uno de los usuarios activos está inactivo más de %s segundos, podrás entrar al test. Esto mejora el rendimiento en la ejecución. Disculpa las molestias @@ -2446,6 +2448,7 @@ blog#:#blog_settings#:#Administración del blog blog#:#blog_settings_navigation#:#Columna de navegación blog#:#blog_show_latest#:#Mostrar borradores y entradas más recientes blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Estilo del blog blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Guardar como borrador @@ -3963,6 +3966,7 @@ common#:#err_auth_mode_inactive#:#Su método de autenticación está desactivado common#:#err_auth_soap_no_ilias_user#:#La identificación falló. La autenticación SOAP tuvo éxito, pero no existe usuario ILIAS correspondiente. Por favor contacte con el administrador del sistema. common#:#err_check_input#:#La configuración no pudo ser guardada. Por favor compruebe sus datos. common#:#err_count_param#:#Razón: número de parámetros incorrecto +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Error en línea common#:#err_inactive#:#Esta cuenta no ha sido activada. Por favor contacte con el administrador del sistema para conseguir acceso. common#:#err_inactive_login_attempts#:#Se ha desactivado su cuenta de usuario debido a demasiados intentos de inicio de sesión erróneos. Haga clic en "Contact Technical Support" en el pie de esta página para informar al administrador de la necesidad de reactivar su cuenta. @@ -5119,6 +5123,7 @@ common#:#objs_rtst#:#Tests ECS common#:#objs_rwik#:#Wikis ECS common#:#objs_sahs#:#Módulos de Aprendizaje SCORM/AICC common#:#objs_sess#:#Sesiones +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Bancos de preguntas (Encuestas) common#:#objs_st#:#Capítulos common#:#objs_svy#:#Encuestas @@ -7246,6 +7251,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#En este contexto no se admiten preguntas. copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#Si configura un enlace a toda la sección, asegúrese de que la sección no incluya otros elementos interactivos. De lo contrario, su comportamiento podría ser errático. @@ -8186,6 +8192,7 @@ dateplaner#:#cal_edit_category#:#Editar calendario dateplaner#:#cal_edit_milestone#:#Editar cita dateplaner#:#cal_edit_recurrences#:#Editar todas las citas dateplaner#:#cal_edit_single#:#Editar esta cita +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Activar hitos dateplaner#:#cal_enable_group_milestones_desc#:#Esta opción activa la programación de hitos en el calendario. dateplaner#:#cal_err_invalid_notification_rcps#:#La lista de destinatarios para notificación no es válida. Por favor, escoja sólo cuentas de usuario o direcciones de correo válidas @@ -8216,6 +8223,7 @@ dateplaner#:#cal_grp_others#:#otros dateplaner#:#cal_grp_personal#:#Personal dateplaner#:#cal_ical_infoscreen#:#Suscribirse dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Importar citas dateplaner#:#cal_import_file#:#Importar fichero dateplaner#:#cal_import_file_info#:#Escoger el fichero que contiene tu calendario de citas @@ -8993,6 +9001,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10327,7 +10336,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Títulos guardados. lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Deshabilitar detección de idioma @@ -11940,6 +11951,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted. @@ -12218,6 +12230,7 @@ obj#:#obj_activation#:#Activación obj#:#obj_activation_list_gui#:#Disponibilidad obj#:#obj_add_languages#:#Añadir Idiomas obj#:#obj_additional_langs#:#Idiomas adicionales +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Se ha desactivado la traducción en la edición de página obj#:#obj_copy_progress#:#Propreso de copia obj#:#obj_deactivate_content_lang#:#Desactivar traducción en la edición de página @@ -13732,6 +13745,7 @@ rbac#:#rbac_create_role#:#Crear un nuevo Rol rbac#:#rbac_create_rolt#:#Crear un nuevo Rol en la Plantilla rbac#:#rbac_create_sahs#:#Crear Módulo de Aprendizaje SCORM/AICC rbac#:#rbac_create_sess#:#Crear sesión +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Crear Encuesta con Banco de Preguntas rbac#:#rbac_create_svy#:#Crear Encuesta rbac#:#rbac_create_tst#:#Crear Test @@ -13907,6 +13921,17 @@ rbac#:#sess_read#:#Acceso de lectura a las sesiones rbac#:#sess_read_learning_progress#:#Usuario puede ver progreso de aprendizaje de otros usuarios rbac#:#sess_visible#:#Las sesiones son visibles rbac#:#sess_write#:#Editar sesiones +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Cambiar configuración de permisos rbac#:#skmg_read#:#Acceso de lectura para administración de competencias rbac#:#skmg_visible#:#La gestión de competencias está visible @@ -16035,6 +16060,7 @@ survey#:#svy_mail_send_confirmation#:#Enviar confirmación de participación survey#:#svy_matrix_layout_percentages_sum_invalid#:#Los ajustes de columna no llegan al 100% survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Texto para una respuesta neutral ("No especificado", "no lo sé", etc.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16722,6 +16748,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence user#:#user_prompting_settings#:#Prompting Settings user#:#user_public_profile_info#:#Por favor seleccione que datos personales deberían ser visibles para otros usuarios. user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#Usuario - Punto de inicio user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Guardar ordenación y título diff --git a/lang/ilias_et.lang b/lang/ilias_et.lang index f9eaca4d6507..0413b8a06fcd 100644 --- a/lang/ilias_et.lang +++ b/lang/ilias_et.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Kliki soovitud ala keskele. assessment#:#circle_click_circle#:#Palun klikka soovitud ala ringjoonel. assessment#:#clientip#:#Kliendi IP assessment#:#close_text_hint#:#Lünga saad teha, sisestades [gap][/gap] soovitud teksti kohale. Klikka nupul 'Koosta lünk', et lisada igale lüngale soovitud vorm. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Tekstivälja pikkus assessment#:#cloze_fixed_textlength_description#:#Kui sisestad nullist suurema väärtuse, luuakse kõik teksti- ja numbriväljad selles väärtuses fikseeritud pikkuses. assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length. @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Miinimumtase (protsentides) assessment#:#tst_mark_official_form#:#Hinne assessment#:#tst_mark_passed#:#Läbitud assessment#:#tst_mark_reset_to_simple_mark_schema#:#Loo lihtne hindesüsteem +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Hinne (sõnaline) assessment#:#tst_max_allowed_users_heading#:#Selle testi samaaegsete kasutajate maksimumarv on täis! assessment#:#tst_max_allowed_users_message#:#Testi samaaegsete kasutajate maksimumarv on täis. Palun proovi hiljem testi alustada või testi jätkata. Kui üks kasutajatest on mitteaktiivne olnud juba kauem kui %s sekundit, saad testi siseneda. Aitäh arusaava suhtumise eest. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Ajaveebi haldus blog#:#blog_settings_navigation#:#Navigation Column blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated. common#:#err_auth_soap_no_ilias_user#:#Sisselogimine ebaõnnestus. SOAP autentimine õnnestus, ent puudub vastav ILIASe kasutaja. Palun kontakteeru oma süsteemiadministraatoriga. common#:#err_check_input#:#Seadeid ei saa salvestada. Palun kontrollige sisestatut. common#:#err_count_param#:#Reason: Wrong parameter count +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Error in line common#:#err_inactive#:#See kasutajanimi pole aktiveeritud. Palun kontakteeru ligipääsuks süsteemiadministraatoriga. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests common#:#objs_rwik#:#ECS Wikis common#:#objs_sahs#:#SCORM/AICC õppemoodulid common#:#objs_sess#:#Kohtumised +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Küsimuste varamud (küsitlus) common#:#objs_st#:#Peatükid common#:#objs_svy#:#Küsitlused @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Muuda kalendrit dateplaner#:#cal_edit_milestone#:#Muuda verstaposti dateplaner#:#cal_edit_recurrences#:#Edit all Appointments dateplaner#:#cal_edit_single#:#Edit this Appointment +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Võimalda verstapostid dateplaner#:#cal_enable_group_milestones_desc#:#Selle seadistuse abil on kalendris võimalikud verstapostid. dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses. @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments dateplaner#:#cal_import_file#:#Import File dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments. @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability obj#:#obj_add_languages#:#Add Languages obj#:#obj_additional_langs#:#Additional Languages +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated. obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role rbac#:#rbac_create_rolt#:#Create new Role Template rbac#:#rbac_create_sahs#:#Create SCORM/AICC Learning Module rbac#:#rbac_create_sess#:#Create Session +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Create Question Pool Survey rbac#:#rbac_create_svy#:#Create Survey rbac#:#rbac_create_tst#:#Create Test @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Lugemisõigused kohtumistes rbac#:#sess_read_learning_progress#:#User can view learning progress of other users rbac#:#sess_visible#:#Kohtumised on nähtavad rbac#:#sess_write#:#Muuda kohtumisi +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings rbac#:#skmg_read#:#Read access to Skill Management rbac#:#skmg_visible#:#Skill Management is visible @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Palun vali, millised isiklikud andmed peaksid teiste kasutajate jaoks nähtavad olema. user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Save ordering and title diff --git a/lang/ilias_fa.lang b/lang/ilias_fa.lang index cc5b3917bc0b..2c300a36e373 100644 --- a/lang/ilias_fa.lang +++ b/lang/ilias_fa.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Please click on center of the desired area. assessment#:#circle_click_circle#:#Please click on a circle point of the desired area. assessment#:#clientip#:#Client IP assessment#:#close_text_hint#:#برای ایجاد شکاف می توانید از [gap][/gap] هم استفاده کنید. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#طول فیلد متن assessment#:#cloze_fixed_textlength_description#:#اگر مقداری بیشتر از 0 وارد کنید، همه فیلدهای متن با این اندازه ساخته خواهند شد. assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#کمترین سطح (در %) assessment#:#tst_mark_official_form#:#فرم رسمی assessment#:#tst_mark_passed#:#موفق assessment#:#tst_mark_reset_to_simple_mark_schema#:#ساختن ساده طرح نمره +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#فرم کوتاه assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#مدیریت بلاگ blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated. common#:#err_auth_soap_no_ilias_user#:#Login failed. SOAP authentication successful, but no corresponding ILIAS user exists. Please contact your system administrator. common#:#err_check_input#:#The settings could not be saved. Please check your input. common#:#err_count_param#:#Reason: Wrong parameter count +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Error in line common#:#err_inactive#:#This account has not been activated. Please contact the system administrator for access. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests###28 08 2012 new variable common#:#objs_rwik#:#ECS Wikis###28 08 2012 new variable common#:#objs_sahs#:#ماژولهای یادگیری SCORM/AICC common#:#objs_sess#:#جلسات +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#مخزن سوال بررسی common#:#objs_st#:#فصل ها common#:#objs_svy#:#نظرسنجی ها @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Edit Calendar dateplaner#:#cal_edit_milestone#:#Edit Milestone dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#فعال کردن مراحل برجسته dateplaner#:#cal_enable_group_milestones_desc#:#این گزینه برنامه ریزی مراحل برجسته در تقویم را فعال می کند. dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses.###27 10 2012 new variable @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe###28 08 2012 new variable dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments###28 08 2012 new variable dateplaner#:#cal_import_file#:#Import File###28 08 2012 new variable dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments.###28 08 2012 new variable @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#ساختن ماژول یادگیری SCORM/AICC rbac#:#rbac_create_sess#:#ساختن جلسه +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#ساختن مخزن سوال بررسی rbac#:#rbac_create_svy#:#ساختن بررسی rbac#:#rbac_create_tst#:#ساختن تست @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#دسترسی خواندن به جلسه ها rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#جلسه ها قابل مشاهده هستند rbac#:#sess_write#:#ویرایش جلسه ها +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#تغییر تنظیمات مجوز rbac#:#skmg_read#:#دسترسی خواندن به مدیریت مهارت rbac#:#skmg_visible#:#مدریریت مهارت قابل مشاهده است @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%.###28 08 2012 new variable survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.)###28 08 2012 new variable +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#لطفا داده های شخصی که برای دیگر کاربران قابل مشاهده خواهد بود را انتخاب کنید user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#ذخیره رتبه و عناوین diff --git a/lang/ilias_fr.lang b/lang/ilias_fr.lang index a57b229bef40..c5d1738e337a 100644 --- a/lang/ilias_fr.lang +++ b/lang/ilias_fr.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Veuillez cliquer au centre de la zone désir assessment#:#circle_click_circle#:#Veuillez cliquer sur un point du cercle de la zone désirée assessment#:#clientip#:#Adresse IP assessment#:#close_text_hint#:#Vous pouvez définir un trou en saisissant les balises [gap] et [/gap] avant et après le ou les mots de votre choix dans le texte. Cliquez sur le bouton 'Créer les trous' pour ajouter un formulaire modifiable pour chaque trou. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Longueur du Champ Texte assessment#:#cloze_fixed_textlength_description#:#Si une valeur supérieure à zéro est saisie , tous les champs de texte seront créés avec cette valeur comme longueur de champ. assessment#:#cloze_gap_size_info#:#Si vous entrez une valeur supérieure à 0, ce champ de texte d'écart sera créé avec la longueur fixe de cette valeur. Si vous n'entrez pas de valeur, le champ de texte d'écart sera créé avec la valeur de la longueur fixe globale. @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Niveau Minimum (en %) assessment#:#tst_mark_official_form#:#Forme Officielle assessment#:#tst_mark_passed#:#Validé assessment#:#tst_mark_reset_to_simple_mark_schema#:#Créer une Echelle d'Evaluation Simple +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Forme Courte assessment#:#tst_max_allowed_users_heading#:#Le nombre maximum d'utilisateurs simultanés de ce test a été atteint assessment#:#tst_max_allowed_users_message#:#Le nombre maximum d'utilisateurs simultanés de ce test a été atteint. Veuillez effectuer ou reprendre ce test ultérieurement. Si l'un des participants au test est inactif pendant plus de %s secondes, vous serez autorisé à passer ce test. Merci de votre compréhension. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Administration des Blogs blog#:#blog_settings_navigation#:#Colonne de navigation blog#:#blog_show_latest#:#Montrer les dernier(ière)s publications/brouillons blog#:#blog_show_print_view#:#Show Print View###31 10 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Style du Blog blog#:#blog_task_publishing_draft_title#:#Publication de brouillon "%s" blog#:#blog_toggle_draft#:#Enregistrer comme Brouillon @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Votre méthode d'authentification a été dés common#:#err_auth_soap_no_ilias_user#:#La connexion a échoué. L'authentification au serveur SOAP a réussi, mais aucun compte utilisateur correspondant sur ILIAS n'existe. Veuillez prendre contact avec l'administrateur de la plate-forme ILIAS. common#:#err_check_input#:#Les paramètres ne peuvent être enregistrés. Veuillez vérifier votre saisie. common#:#err_count_param#:#Raison : nombre de paramètre invalide +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Erreur ligne common#:#err_inactive#:#Ce compte n'a pas été activé. Veuillez contacter l'administrateur système pour y accéder common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#Tests ECS common#:#objs_rwik#:#Wikis ECS common#:#objs_sahs#:#Modules SCORM/AICC common#:#objs_sess#:#Sessions +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Banques de questions (Enquête) common#:#objs_st#:#Chapitres common#:#objs_svy#:#Enquêtes @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 10 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 10 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found. copg#:#copg_page_type_stys#:#Layout Page +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Les questions ne sont pas supportées dans ce contexte. copg#:#copg_reload_page#:#Reload Page copg#:#copg_sec_link_info#:#Si vous définissez un lien sur toute la section, veuillez vous assurer qu’aucun autre élément interactif n’est inclus dans la section. Autrement, son comportement peut être irrégulier. @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Modifier l'agenda dateplaner#:#cal_edit_milestone#:#Modifier étape dateplaner#:#cal_edit_recurrences#:#Editer tous les Rendez-Vous dateplaner#:#cal_edit_single#:#Editer ce Rendez-Vous +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Activer étapes dateplaner#:#cal_enable_group_milestones_desc#:#Cette option active le planning par étape dans l'agenda. dateplaner#:#cal_err_invalid_notification_rcps#:#La liste des destinataires n'est pas valide. Veuillez choisir uniquement des noms d'utilisateur ILIAS ou adresses email valides. @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Autres dateplaner#:#cal_grp_personal#:#Personnel dateplaner#:#cal_ical_infoscreen#:#Souscrire dateplaner#:#cal_ical_url#:#URL iCal +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Importer Evènements dateplaner#:#cal_import_file#:#Importer Fichier dateplaner#:#cal_import_file_info#:#Choisissez le fichier contenant vos évènements d'agenda. @@ -10326,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###31 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###31 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 10 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 10 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titres sauvegardés. lng#:#language_detection#:#Détection de la langue lng#:#lng_disable_language_detection#:#Désactiver la Détection de la Langue @@ -12218,6 +12228,7 @@ obj#:#obj_activation#:#Activation obj#:#obj_activation_list_gui#:#Disponibilité obj#:#obj_add_languages#:#Ajouter Langues obj#:#obj_additional_langs#:#Langues Additionnelles +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#La traduction pour l'édition des pages a été désactivée. obj#:#obj_copy_progress#:#Progression de la Copie obj#:#obj_deactivate_content_lang#:#Désactiver la Traduction pour l'Edition des Pages @@ -13732,6 +13743,7 @@ rbac#:#rbac_create_role#:#Créer Nouveau Rôle rbac#:#rbac_create_rolt#:#Créer Nouveau Modèle de Rôle rbac#:#rbac_create_sahs#:#Créer un Module SCORM/AICC rbac#:#rbac_create_sess#:#Créer une Session +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Créer une Banque de Questions (Enquêtes) rbac#:#rbac_create_svy#:#Créer une Enquête rbac#:#rbac_create_tst#:#Créer un Test @@ -13907,6 +13919,17 @@ rbac#:#sess_read#:#Lire l'activité session rbac#:#sess_read_learning_progress#:#L'utilisateur peut afficher les progrès d'apprentissage des autres utilisateurs rbac#:#sess_visible#:#Les sessions sont visibles rbac#:#sess_write#:#Modifier sessions +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Permissions d'administration modifiables rbac#:#skmg_read#:#Panneau d'administration accessible rbac#:#skmg_visible#:#Panneau d'administration visible @@ -16035,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Envoyer une confirmation de participation survey#:#svy_matrix_layout_percentages_sum_invalid#:#Les paramètres de colonnes ne totalisent pas à 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score survey#:#svy_neutral_answer#:#Texte pour réponse neutre ("Ne sait pas", "Sans opinion", etc.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results survey#:#svy_notification_tutor_results_alert#:#This requires an end date. survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it. @@ -16722,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence user#:#user_prompting_settings#:#Prompting Settings user#:#user_public_profile_info#:#Veuillez cocher les données que vous souhaitez rendre visibles dans votre profil. user#:#user_publish_options#:#Publier le profil +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#Utilisateur - Point de départ user#:#user_save_continue#:#Sauver et continuer user#:#user_save_ordering_and_titles#:#Enregistrer l'ordre et les titres diff --git a/lang/ilias_hr.lang b/lang/ilias_hr.lang index cff448a456a0..688531868f26 100644 --- a/lang/ilias_hr.lang +++ b/lang/ilias_hr.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Molimo kliknite na središte željenog podru assessment#:#circle_click_circle#:#Molimo kliknite na točku u željenom području. assessment#:#clientip#:#IP klijenta assessment#:#close_text_hint#:#Za umetanje praznina u tekstu, pomaknite pokazivač na željeni položaj i pritisnite uklopnu površinu ‘praznina u tekstu’. Nakon toga će niže biti dostupna odgovarajuća područja za uređivanje. Također možete kliknuti izravno na praznine kako biste ih obradili u tekstu s prazninama. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Duljina tekstualnog polja assessment#:#cloze_fixed_textlength_description#:#Ako ovdje unesete vrijednost, generiraju se praznine u tekstu koje ne definiraju vlastitu vrijednost za maksimalnu duljinu kao i numeričke praznine te duljine, tako da nije moguće upisati veći broj znakova od dopuštenog. Kod numeričkih praznina također treba voditi računa da se decimalni separator također računa kao znak. assessment#:#cloze_gap_size_info#:#Ako je upisana vrijednost veća od 0, to se tekstualno polje s prazninom generira s ovdje navedenom duljinom. Ako nije upisana vrijednost, to se tekstualno polje s prazninom generira s globalno određenom duljinom polja za tekst. @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Minimalna razina (u %) assessment#:#tst_mark_official_form#:#Službeni naziv assessment#:#tst_mark_passed#:#Položeno assessment#:#tst_mark_reset_to_simple_mark_schema#:#Vrati na jednostavnu shemu ocjena +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Skraćeni naziv assessment#:#tst_max_allowed_users_heading#:#Dosegnut je maksimalan broj istovremenih korisnika za ovaj test assessment#:#tst_max_allowed_users_message#:#Dosegnut je maksimalan broj istovremenih aktivnih korisnika za ovaj test Pokušajte ponovno kasnije započeti ili nastaviti test. Ako je neki aktivan korisnik više od %s sekundi neaktivan, možda ćete biti u mogućnosti sudjelovati u ovom testu. Zahvaljujemo na razumijevanju. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Administracija bloga blog#:#blog_settings_navigation#:#Navigacijski stupac blog#:#blog_show_latest#:#Prikaži najnovije objave/nacrte blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Stil bloga blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###04 06 2021 new variable blog#:#blog_toggle_draft#:#Povuci objavu @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Vaš način autentifikacije je deaktiviran. common#:#err_auth_soap_no_ilias_user#:#Prijava nije uspjela. SOAP provjera autentičnosti uspješna, ali ne postoji odgovarajući ILIAS korisnik. Molimo kontaktirajte svog administratora sustava. common#:#err_check_input#:#Postavke se nisu mogle spremiti. Molimo provjerite svoj unos. common#:#err_count_param#:#Razlog: pogrešan broj parametara +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Pogreška u retku common#:#err_inactive#:#Ovaj račun nije aktiviran. Za pristup kontaktirajte administratora sustava. common#:#err_inactive_login_attempts#:#Vaš korisnički račun je deaktiviran zbog previše neuspjelih pokušaja prijave. Kliknite 'Kontaktiraj tehničku podršku' u podnožju ove stranice kako biste obavijestili administratora o potrebi ponovne aktivacije vašeg računa. @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS testovi common#:#objs_rwik#:#ECS Wiki common#:#objs_sahs#:#SCORM moduli za učenje common#:#objs_sess#:#Sesije +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Bazeni pitanja za ankete common#:#objs_st#:#Poglavlja common#:#objs_svy#:#Ankete @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###04 06 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###04 06 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Pitanja nisu podržana u ovom kontekstu. copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#Ako postavite poveznicu na cijeli odjeljak, pripazite da unutar odjeljka ne postoje drugi interaktivni elementi. U protivnom njihovo ponašanje može biti nestalno. @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Uredi kalendar dateplaner#:#cal_edit_milestone#:#Uredi ključnu točku dateplaner#:#cal_edit_recurrences#:#Uredi sve sastanke dateplaner#:#cal_edit_single#:#Uredi ovaj sastanak +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Omogući ključne točke dateplaner#:#cal_enable_group_milestones_desc#:#Ova opcija omogućuje planiranje ključnih točaka u kalendaru. dateplaner#:#cal_err_invalid_notification_rcps#:#Popis primatelja obavijesti nije valjan. Odaberite samo imena korisničkih računa ILIAS ili važeće adrese e-pošte. @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Drugi dateplaner#:#cal_grp_personal#:#Osobno dateplaner#:#cal_ical_infoscreen#:#Pretplati se dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Uvezi sastanke dateplaner#:#cal_import_file#:#Uvezi datoteku dateplaner#:#cal_import_file_info#:#Odaberi datoteku koja sadrži vaše sastanke iz kalendara. @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###04 06 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Naslovi spremljeni. lng#:#language_detection#:#Language Detection###04 06 2021 new variable lng#:#lng_disable_language_detection#:#Onemogući otkrivanje jezika @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###04 06 2021 new variable mme#:#msg_languages_added#:#Dodani jezici mme#:#msg_moved#:#Item successfully moved###04 06 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###04 06 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###04 06 2021 new variable mme#:#msg_restored#:#Main Menu completely reset###04 06 2021 new variable mme#:#msg_subitem_deleted#:#Stavka je izbrisana. @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Aktivacija obj#:#obj_activation_list_gui#:#Dostupnost obj#:#obj_add_languages#:#Dodaj jezike obj#:#obj_additional_langs#:#Dodatni jezici +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Prijevod za uređivanje stranica je deaktiviran. obj#:#obj_copy_progress#:#Kopiraj napredak obj#:#obj_deactivate_content_lang#:#Deaktiviraj prijevod za uređivanje stranica @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Kreiraj novu ulogu rbac#:#rbac_create_rolt#:#Kreiraj novi predložak uloge rbac#:#rbac_create_sahs#:#Kreiraj SCORM modul za učenje rbac#:#rbac_create_sess#:#Kreiraj sesiju +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Kreiraj bazen pitanje za ankete rbac#:#rbac_create_svy#:#Kreiraj anketu rbac#:#rbac_create_tst#:#Kreiraj test @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Korisnik ima pristup čitanju sesija rbac#:#sess_read_learning_progress#:#Korisnik može vidjeti napredak u učenju drugih korisnika rbac#:#sess_visible#:#Sesije su vidljive rbac#:#sess_write#:#Korisnik može uređivati sadržaj i postavke sesije +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Korisnik može promijeniti postavke dozvole administracije za upravljanje kompetencijama rbac#:#skmg_read#:#Korisnik ima pristup za čitanje administraciji upravljanja kompetencijama rbac#:#skmg_visible#:#Vidljiva je administracija upravljanja kompetencijama @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Pošalji potvrdu o sudjelovanju survey#:#svy_matrix_layout_percentages_sum_invalid#:#Postavke stupaca ne iznose u zbroju 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score###04 06 2021 new variable survey#:#svy_neutral_answer#:#Tekst za neutralni odgovor (‘Nije određeno’, ‘Ne znam’ itd.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###04 06 2021 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###04 06 2021 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###04 06 2021 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###04 06 2021 new variabl user#:#user_prompting_settings#:#Prompting Settings###04 06 2021 new variable user#:#user_public_profile_info#:#Please select which personal data is visible in your profile and which users should be able to visit your profile.###04 06 2021 new variable user#:#user_publish_options#:#Publish Profile###04 06 2021 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###04 06 2021 new variable user#:#user_save_continue#:#Save and Continue###04 06 2021 new variable user#:#user_save_ordering_and_titles#:#Save ordering and titles###04 06 2021 new variable diff --git a/lang/ilias_hu.lang b/lang/ilias_hu.lang index de3f5461132a..96030bb5ceb9 100644 --- a/lang/ilias_hu.lang +++ b/lang/ilias_hu.lang @@ -614,6 +614,7 @@ assessment#:#circle_click_center#:#Kattintson a kívánt terület középpontjá assessment#:#circle_click_circle#:#Kattintson a kívánt terület körvonalának egy pontjára. assessment#:#clientip#:#Kliens-IP assessment#:#close_text_hint#:#Új kitöltendő hely létrehozásához vigye a kurzort a kívánt helyre, majd használja a 'Szöveghely' legördülőt. A megfelelő szerkesztési szakaszok megjelennek alatta. A kitöltendő helyeket szerkesztheti úgy is, hogy kitöltendő részen belül a kitöltendő szövegre kattint. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Szövegmező hossza assessment#:#cloze_fixed_textlength_description#:#Ha megad egy értéket, akkor az összes szöveg- és szám mező evvel a rögzített hosszal kerül létrehozásra, így nincs lehetőség a több karakter bevitelére. Szövegmezőknek lehet saját korlátjuk a karakterszámra. Számmezők esetén a tizedesvessző is egy karakternek számít. assessment#:#cloze_gap_size_info#:#Ha 0-nál nagyobb értéked ad meg, ilyen hosszúságú lesz a szövegmező. Amennyiben nem ad meg értéket, a globális hossz lesz ez az érték. @@ -1551,6 +1552,7 @@ assessment#:#tst_mark_minimum_level#:#Minimumszint (%-ban) assessment#:#tst_mark_official_form#:#Hivatalos forma assessment#:#tst_mark_passed#:#Sikeres teljesítés-e assessment#:#tst_mark_reset_to_simple_mark_schema#:#Egyszerű (Teljesített/Nem teljesítette) értékelésséma visszaállítása +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Rövid forma assessment#:#tst_max_allowed_users_heading#:#Ebben a tesztben egyidejűleg jelen lévő felhasználók száma elérte a maximális számot assessment#:#tst_max_allowed_users_message#:#A tesztben egyidejűleg engedélyezett résztvevőszám elérte a maximumot. Próbálja később elkezdeni, illetve folytatni a tesztet. Ha egy jelenleg aktív felhasználó több mint %s másodpercig tétlen, Ön beléphet a tesztbe. Köszönjük megértését! @@ -2459,6 +2461,7 @@ blog#:#blog_settings#:#Blog beállításainak kezelése blog#:#blog_settings_navigation#:#Navigáció oszlop blog#:#blog_show_latest#:#Utolsó bejegyzés/piszkozat megjelenítése blog#:#blog_show_print_view#:#Nyomtatási nézet megjelenítése +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog stílus blog#:#blog_task_publishing_draft_title#:#'%s' bejegyzéspiszkozat közzététele blog#:#blog_toggle_draft#:#Közzététel visszavonása @@ -3976,6 +3979,7 @@ common#:#err_auth_mode_inactive#:#Az Ön hitelesítési módszere ki van kapcsol common#:#err_auth_soap_no_ilias_user#:#Bejelentkezés sikertelen. A SOAP-hitelesítés sikeres, de nincs megfelelő ILIAS-felhasználó. Vegye fel a kapcsolatot egy rendszergazdával! common#:#err_check_input#:#Beállítások nem menthetők. Ellenőrizze a bemeneti értékeket. common#:#err_count_param#:#Ok: hibás paraméterszám +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Hiba a sorban. common#:#err_inactive#:#Ez az ILIAS-fiók még nincs aktiválva. Vegye fel a kapcsolatot egy rendszergazdával! common#:#err_inactive_login_attempts#:#Felhasználói fiókját túl sok sikertelen bejelentkezési kísérlet miatt letiltottuk. Kattintson a láblécben lévő 'Kapcsolat' lehetőségre, hogy az üzemeltetőt megkérje ILIAS-fiókjának újraaktiválására. @@ -5132,6 +5136,7 @@ common#:#objs_rtst#:#ECS tesztek common#:#objs_rwik#:#ECS wikik common#:#objs_sahs#:#SCORM-tananyagok common#:#objs_sess#:#Események +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Kérdőívkérdés-gyűjtemény common#:#objs_st#:#Fejezetek common#:#objs_svy#:#Kérdőívek @@ -7259,6 +7264,7 @@ copg#:#copg_history_cleanup_cron#:#Oldalszerkesztőelőzmény-tisztítás copg#:#copg_history_cleanup_cron_info#:#Régi bejegyzések eltávolítása az oldalelőzményekből. copg#:#copg_page_element_not_found#:#Az oldalelem nem található. copg#:#copg_page_type_stys#:#Lapelrendezés +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Ebben a kontextusban a kérdéseket nem támogatjuk. copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#Válassza ki a cél, amire a blokk mutat. Figyelem: A blokk nem tartalmazhat önmagára mutató linket! @@ -8199,6 +8205,7 @@ dateplaner#:#cal_edit_category#:#Naptár módosítása dateplaner#:#cal_edit_milestone#:#Mérföldkő módosítása dateplaner#:#cal_edit_recurrences#:#Összes esemény módosítása dateplaner#:#cal_edit_single#:#Esemény módosítása +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Mérföldkövek engedélyezése dateplaner#:#cal_enable_group_milestones_desc#:#Ez a beállítás engedélyezi a mérföldkőtervezést a naptárban. dateplaner#:#cal_err_invalid_notification_rcps#:#Az értesítés címzettjeinek listája nem érvényes. Csak ILIAS felhasználóneveket vagy érvényes e-mail címet válasszon! @@ -8229,6 +8236,7 @@ dateplaner#:#cal_grp_others#:#További dateplaner#:#cal_grp_personal#:#Személyes dateplaner#:#cal_ical_infoscreen#:#Feliratkozás dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Események importja dateplaner#:#cal_import_file#:#Fájl importja dateplaner#:#cal_import_file_info#:#Válassza ki a naptárjának eseményeit tartalmazó fájlt. @@ -9006,6 +9014,7 @@ etal#:#notification_talks_removed#:#Az alábbi találkozókat törölték. etal#:#notification_talks_subject#:#Meghívás: %s etal#:#notification_talks_subject_update#:#Módosítás: %s etal#:#notification_talks_updated#:#Az alábbi találkozókat módosították. +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Megbeszéléssorozat etal#:#tals_add#:#Megbeszélés hozzáadása etal#:#tals_new#:#Új Megbeszélés @@ -10340,7 +10349,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Becsült olvasási idő lm#:#lm_est_reading_time_info#:#A tananyagokban a becsült olvasási idő megállapítható és megjeleníthető. +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#Tananyagoldal +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#A címeket sikeresen mentette. lng#:#language_detection#:#Nyelvfelismerés lng#:#lng_disable_language_detection#:#Nyelvfelismerés tiltása @@ -11953,6 +11964,7 @@ mme#:#move_to_top_item#:#Mozgatás a felső elemekhez mme#:#msg_languages_added#:#Hozzáadott nyelvek mme#:#msg_moved#:#Az elemet sikeresen mozgatta mme#:#msg_not_moved#:#Az elem mozgatása sikertelen, érvényes szülőt válasszon. +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#Az összes egyéni elembeállítást és fordítást töröl, és az összes standard elem visszaáll annak alapértékére. Az összes személyre szabás elveszik. mme#:#msg_restored#:#A Főmenüt alapértékeit sikeresen visszaállította mme#:#msg_subitem_deleted#:#Az elemet sikeresen törölte. @@ -12231,6 +12243,7 @@ obj#:#obj_activation#:#Aktiválás obj#:#obj_activation_list_gui#:#Elérhetőség obj#:#obj_add_languages#:#Nyelvek hozzáadása obj#:#obj_additional_langs#:#További nyelvek +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Lapszerkesztés fordítása ki van kapcsolva van. obj#:#obj_copy_progress#:#Másolási folyamat obj#:#obj_deactivate_content_lang#:#Többnyelvűség kikapcsolása @@ -13745,6 +13758,7 @@ rbac#:#rbac_create_role#:#Új szabály létrehozása rbac#:#rbac_create_rolt#:#Új szabály sablon létrehozása rbac#:#rbac_create_sahs#:#SCORM-tananyag létrehozása rbac#:#rbac_create_sess#:#Esemény létrehozása +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Kérdőívkérdés-gyűjtemény létrehozása rbac#:#rbac_create_svy#:#Kérdőív létrehozása rbac#:#rbac_create_tst#:#Teszt létrehozása @@ -13920,6 +13934,17 @@ rbac#:#sess_read#:#A felhasználónak olvasási elérése van munkamenetekhez rbac#:#sess_read_learning_progress#:#A felhasználó megnézheti mások tanulási haladását rbac#:#sess_visible#:#Az események láthatók rbac#:#sess_write#:#A felhasználó eseménytartalmakat és -beállításokat szerkeszthet +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#A felhasználó módosíthatja a Rendszerbeállítások » Kompetenciamenedzsment jogosultsági beállításait rbac#:#skmg_read#:#A felhasználónak olvasási hozzáférése van a Rendszerbeállítások » Kompetenciamenedzsment beállításaihoz rbac#:#skmg_visible#:#A felhasználó láthatja a Rendszerbeállítások » Kompetenciamenedzsment menüpontot @@ -16048,6 +16073,7 @@ survey#:#svy_mail_send_confirmation#:#A kitöltésről e-mail küldése survey#:#svy_matrix_layout_percentages_sum_invalid#:#Az oszlopbeállítások összege nem 100%. survey#:#svy_max_sum_score#:#Összpontszám maximális értéke survey#:#svy_neutral_answer#:#Szöveg semleges válaszhoz ('Nem meghatározott', 'Nem tudom' stb.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#Egy e-mail a kérdőív eredményeivel survey#:#svy_notification_tutor_results_alert#:#Adjon meg záró dátumot. survey#:#svy_notification_tutor_results_info#:#A feladatütemező el fogja küldeni csatolmányként a kérdőív részletes eredményeit a záró dátumkor. @@ -16735,6 +16761,7 @@ user#:#user_prompting_recurrence#:#Felkérés ismétlődése user#:#user_prompting_settings#:#Felkérés beállításai user#:#user_public_profile_info#:#Válassza ki, mely személyes adatai legyenek láthatóak profiljában, és hogy mely felhasználók lássák profilját. user#:#user_publish_options#:#Profil közzététele +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#Felhasználó - Kiindulási pont user#:#user_save_continue#:#Mentés és folytatás user#:#user_save_ordering_and_titles#:#Sorrend és címek mentése diff --git a/lang/ilias_it.lang b/lang/ilias_it.lang index 88535239c4d9..fbdd1578f30f 100644 --- a/lang/ilias_it.lang +++ b/lang/ilias_it.lang @@ -613,6 +613,7 @@ assessment#:#circle_click_center#:#Fare clic sul centro dell'area desiderata. assessment#:#circle_click_circle#:#Fare clic su un punto circolare dell'area desiderata. assessment#:#clientip#:#IP cliente assessment#:#close_text_hint#:#Per aggiungere un nuovo spazio, imposta il cursore sulla posizione desiderata e utilizza il menu a discesa "Spazio vuoto". Le sezioni di modifica corrispondenti verranno visualizzate di seguito. Puoi anche modificare gli spazi facendo clic sugli spazi all'interno del testo degli spazi. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Lunghezza del campo di testo assessment#:#cloze_fixed_textlength_description#:#Se si inserisce un valore maggiore di 0 tutte le mancanze di testo e di numero avranno quella lunghezza. assessment#:#cloze_gap_size_info#:#Se si immette un valore maggiore di 0, questo campo di testo spazio verrà creato con la lunghezza fissa di questo valore. Se non si immette un valore, il campo di testo del gap verrà creato con il valore della lunghezza fissa globale. @@ -1550,6 +1551,7 @@ assessment#:#tst_mark_minimum_level#:#Livello minimo (in %) assessment#:#tst_mark_official_form#:#Form ufficiale assessment#:#tst_mark_passed#:#Superato assessment#:#tst_mark_reset_to_simple_mark_schema#:#Crea uno schema voti +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Form ridotto assessment#:#tst_max_allowed_users_heading#:#È stato raggiunto il numero massimo di partecipanti a questo test assessment#:#tst_max_allowed_users_message#:#È stato raggiunto il numero massimo di utenti attivi simultanei nel test. Riprovare più tardi per avviare o riprendere il test. Se uno degli utenti attivi è inattivo per più di %s secondi, potresti essere in grado di accedere a questo test. Grazie per la vostra comprensione. @@ -2458,6 +2460,7 @@ blog#:#blog_settings#:#Amministrazione blog blog#:#blog_settings_navigation#:#Colonna di navigazione blog#:#blog_show_latest#:#Mostra ultimi messaggi/bozze blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Stile blog blog#:#blog_task_publishing_draft_title#:#Pubblicazione della Bozza "%s" blog#:#blog_toggle_draft#:#Salva come bozza @@ -3975,6 +3978,7 @@ common#:#err_auth_mode_inactive#:#Il tuo metodo di autenticazione è disattivato common#:#err_auth_soap_no_ilias_user#:#Accesso non riuscito. Autenticazione SOAP riuscita, ma non esiste alcun utente ILIAS corrispondente. Si prega di contattare il proprio amministratore di sistema. common#:#err_check_input#:#Le impostazioni non possono essere salvate. Controllare il proprio ingresso. common#:#err_count_param#:#Causa: errato numero dei parametri. +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Errore nella linea common#:#err_inactive#:#Questo account non è stato attivato. Si prega di contattare l'amministratore di sistema per l'accesso. common#:#err_inactive_login_attempts#:#Il tuo account è stato disattivato a causa dei molti tentativi di accesso falliti. Clicca su “Contatta supporto tecnico” a piè di pagina per comunicare all’amministratore la necessità di riattivare il proprio account. @@ -5131,6 +5135,7 @@ common#:#objs_rtst#:#Test ESC common#:#objs_rwik#:#ECS Wiki common#:#objs_sahs#:#Moduli SCORM/AICC common#:#objs_sess#:#Sessioni +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Raccolte di domande (per sondaggi) common#:#objs_st#:#Capitoli common#:#objs_svy#:#Sondaggi @@ -7258,6 +7263,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found. copg#:#copg_page_type_stys#:#Pagina layout +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Le domande non sono supportate in questo contesto. copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#Se si imposta un link sul tutta la sezione, bisogna assicurarsi che nessun altro elemento interattivo sia incluso nella sezione. Altrimenti il loro comportamento potrebbe essere errato. @@ -8198,6 +8204,7 @@ dateplaner#:#cal_edit_category#:#Modifica Calendario dateplaner#:#cal_edit_milestone#:#Modifica Milestone dateplaner#:#cal_edit_recurrences#:#Modifica tutti gli appuntamenti dateplaner#:#cal_edit_single#:#Modifica questo appuntamento +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Abilita Milestones dateplaner#:#cal_enable_group_milestones_desc#:#Questa opzione abilita i milestones nella pianificazione a calendario. dateplaner#:#cal_err_invalid_notification_rcps#:#L'elenco dei destinatari delle notifiche non è valido. Scegli solo nomi di account utente ILIAS o indirizzi e-mail validi. @@ -8228,6 +8235,7 @@ dateplaner#:#cal_grp_others#:#Altro dateplaner#:#cal_grp_personal#:#Personale dateplaner#:#cal_ical_infoscreen#:#Sottoscrivere dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Importa appuntamenti dateplaner#:#cal_import_file#:#Importa file dateplaner#:#cal_import_file_info#:#Scegli il file che contiene i tuoi appuntamenti sul calendario. @@ -9005,6 +9013,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10339,7 +10348,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#Pagina LM +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titoli salvati. lng#:#language_detection#:#Riconoscimento della lingua lng#:#lng_disable_language_detection#:#Disattiva riconoscimento lingua @@ -11952,6 +11963,7 @@ mme#:#move_to_top_item#:#Sposta negli oggetti preferiti mme#:#msg_languages_added#:#Lingue aggiunte mme#:#msg_moved#:#Oggetto spostato correttamente mme#:#msg_not_moved#:#L'oggetto non può essere spostato, seleziona una cartella madre valida. +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#Tutti gli articoli personalizzati e le traduzioni verranno eliminati, tutti gli articoli standard verranno ripristinati alle impostazioni di fabbrica. Tutta la personalizzazione andrà persa. mme#:#msg_restored#:#Menu principale reimpostato mme#:#msg_subitem_deleted#:#Oggetto cancellato. @@ -12230,6 +12242,7 @@ obj#:#obj_activation#:#Attivazione obj#:#obj_activation_list_gui#:#Disponibilità obj#:#obj_add_languages#:#Aggiungi lingue obj#:#obj_additional_langs#:#Lingue aggiuntive +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#La traduzione per la modifica delle pagine è stata disattivata. obj#:#obj_copy_progress#:#Progresso di copia obj#:#obj_deactivate_content_lang#:#Disattiva traduzione per la modifica delle pagine @@ -13744,6 +13757,7 @@ rbac#:#rbac_create_role#:#Crea nuovo ruolo rbac#:#rbac_create_rolt#:#Crea nuovo modello di ruolo rbac#:#rbac_create_sahs#:#Creare un modulo di apprendimento SCORM/AICC rbac#:#rbac_create_sess#:#Crea sessione +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Crea sondaggio gruppo di domande rbac#:#rbac_create_svy#:#Crea sondaggio rbac#:#rbac_create_tst#:#Crea test @@ -13919,6 +13933,17 @@ rbac#:#sess_read#:#L'utente ha accesso in lettura alle sessioni rbac#:#sess_read_learning_progress#:#L’utente può visualizzare il progresso di apprendimento degli altri utenti rbac#:#sess_visible#:#La sessione è visibile rbac#:#sess_write#:#L'utente può modificare il contenuto e le impostazioni della sessione +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#L'utente può cambiare le impostazioni dei permessi dell'amministrazione della gestione delle competenze rbac#:#skmg_read#:#L'utente ha accesso in lettura all'amministrazione della Gestione delle competenze rbac#:#skmg_visible#:#La gestione delle competenze è visibile @@ -16047,6 +16072,7 @@ survey#:#svy_mail_send_confirmation#:#Invia conferma di partecipazione survey#:#svy_matrix_layout_percentages_sum_invalid#:#Le impostazioni di colonna non raggiungono il 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score survey#:#svy_neutral_answer#:#Testo per una risposta neutra ("Non specificato", "Non lo so" ecc.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results survey#:#svy_notification_tutor_results_alert#:#This requires an end date. survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it. @@ -16734,6 +16760,7 @@ user#:#user_prompting_recurrence#:#Richiesta di ricorrenza user#:#user_prompting_settings#:#Impostazioni di richiesta user#:#user_public_profile_info#:#Seleziona quali dati personali saranno visibili agli altri utenti. user#:#user_publish_options#:#Pubblica Profilo +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#Utente - Punto di inizio user#:#user_save_continue#:#Salva e Continua user#:#user_save_ordering_and_titles#:#Salva ordine e titoli diff --git a/lang/ilias_ja.lang b/lang/ilias_ja.lang index 425c529e17bd..1b694fc1be28 100644 --- a/lang/ilias_ja.lang +++ b/lang/ilias_ja.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#希望範囲の中心をクリックしてく assessment#:#circle_click_circle#:#希望範囲の円の部分をクリックしてください。 assessment#:#clientip#:#クライアントのIP assessment#:#close_text_hint#:#新しくギャップを追加するには選択の位置にカーソルをセットして"ギャップを挿入"ボタンをクリックします。対応する編集セクションが下に表示されます。ギャップはギャップテキスト内のギャップをクリックして編集することもできます。 +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#テキスト欄の長さ assessment#:#cloze_fixed_textlength_description#:#0以上の値を入力すると全てのテキストと数値穴埋めテキストフィールドがこの値の固定長で作成されます。 assessment#:#cloze_gap_size_info#:#0以上を入力するとこのギャップテキストフィールドはこの値の固定長で作成されます。値を入力しない場合はギャップテキストフィールドはグローバル固定長で作成されます。 @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#最低レベル (%中) assessment#:#tst_mark_official_form#:#正式書式 assessment#:#tst_mark_passed#:#合格 assessment#:#tst_mark_reset_to_simple_mark_schema#:#シンプル評価尺度を作成 +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#略式書式 assessment#:#tst_max_allowed_users_heading#:#テストの同時最大ユーザ数に達しました assessment#:#tst_max_allowed_users_message#:#テストの同時最大ユーザ数に達しました。 後でやり直すかもしくはテストを再開してください。 受験中のユーザのだれかが %s 以上中断すると入力できるようになる場合があります。ご理解ありがとうございます。 @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#ブログ管理 blog#:#blog_settings_navigation#:#ナビゲーション列 blog#:#blog_show_latest#:#最終投稿/ドラフトを表示 blog#:#blog_show_print_view#:#印刷ビューを表示 +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#ブログスタイル blog#:#blog_task_publishing_draft_title#:#ドラフト "%s" の公開 blog#:#blog_toggle_draft#:#告知を取り消す @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#認証方式が使用可能になっていま common#:#err_auth_soap_no_ilias_user#:#ログイン失敗しました。SOAP認証はできましたが対応するILIASユーザが誰もいません。システム管理者へ連絡してください。 common#:#err_check_input#:#設定は保存されませんでした。入力を確認してください。 common#:#err_count_param#:#理由:パラメーターカウントの間違い +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#ライン中のエラー common#:#err_inactive#:#アカウントが使用可能になっていません。アクセスするにはシステム管理者へ連絡してください。 common#:#err_inactive_login_attempts#:#ログイン回数が失敗回数を大きく超えたためにアカウントは無効になっています。管理者へアカウントの再解除が必要であることを通知するには、このページのフッターに記載されている'テクニカルサポートへコンタクト'をクリックします。 @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECSテスト common#:#objs_rwik#:#ECS Wiki common#:#objs_sahs#:#SCORM/AICCラーニングモジュール common#:#objs_sess#:#セッション +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#サーベイ質問集 common#:#objs_st#:#章 common#:#objs_svy#:#サーベイ @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#ページエディター履歴のクリーン copg#:#copg_history_cleanup_cron_info#:#ページ履歴から過去のエントリーを削除 copg#:#copg_page_element_not_found#:#ページ要素が見つかりません。 copg#:#copg_page_type_stys#:#ページをレイアウト +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#問題はこのコンテキスト内でサポートされません。 copg#:#copg_reload_page#:#ページの再読み込み copg#:#copg_sec_link_info#:#全セクションのリンクを設定するには他のインタラクティブ要素がセクション内に含まれない事を確認して下さい。そうでないと動作が不安定になります。 @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#カレンダーを編集 dateplaner#:#cal_edit_milestone#:#マイルストーンを編集 dateplaner#:#cal_edit_recurrences#:#日程を編集 dateplaner#:#cal_edit_single#:#この日程を編集 +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#マイルストーンを利用する dateplaner#:#cal_enable_group_milestones_desc#:#カレンダー上でマイルストーン計画が利用可能になります。 dateplaner#:#cal_err_invalid_notification_rcps#:#通知受信者リストが無効です。ILIASユーザアカウント名もしくは有効なメールアドレスのどちらかを選択してください。 @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#その他 dateplaner#:#cal_grp_personal#:#パーソナル dateplaner#:#cal_ical_infoscreen#:#購読 dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#アポイントをインポート dateplaner#:#cal_import_file#:#ファイルをインポート dateplaner#:#cal_import_file_info#:#カレンダアポイントの入ったファイルを選択します。 @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#次のアポイントはキャンセルさ etal#:#notification_talks_subject#:#招待: %s etal#:#notification_talks_subject_update#:#更新: %s etal#:#notification_talks_updated#:#次のアポイントはキャンセルされました。 +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial etal#:#tals_add#:#Talksを追加 etal#:#tals_new#:#新しいトーク @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#予測読込み時間 lm#:#lm_est_reading_time_info#:#リポジトリ内の学習モジュール予測読込み時間が確定されて表示できます。 +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LMページ +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#タイトルは保存されました。 lng#:#language_detection#:#言語検知 lng#:#lng_disable_language_detection#:#言語検知を無効化 @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#トップアイテムへ移動 mme#:#msg_languages_added#:#言語を追加しました mme#:#msg_moved#:#アイテムは正しく移動されました。 mme#:#msg_not_moved#:#アイテムを移動できませんでしたので有効な親を選択してください。 +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#全カスタム項目と翻訳は削除されて全標準項目が工場出荷値へリセットされます。カスタマイズ化全ては消去されます。 mme#:#msg_restored#:#メインメニューを完全にリセット mme#:#msg_subitem_deleted#:#アイテムを削除しました。 @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#アクティベーション obj#:#obj_activation_list_gui#:#アベイラビリティ obj#:#obj_add_languages#:#言語を追加 obj#:#obj_additional_langs#:#追加言語 +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#ページ編集用の翻訳は解除されました。 obj#:#obj_copy_progress#:#進捗をコピー obj#:#obj_deactivate_content_lang#:#ページ編集用の翻訳を解除 @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#新しい役割を作成 rbac#:#rbac_create_rolt#:#新しい役割テンプレートを作成 rbac#:#rbac_create_sahs#:#SCORM/AICCラーニングモジュールを作成 rbac#:#rbac_create_sess#:#セクションを作成 +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#サーベイ質問集を作成 rbac#:#rbac_create_svy#:#サーベイを作成 rbac#:#rbac_create_tst#:#テストを作成 @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#セッションを読込む rbac#:#sess_read_learning_progress#:#ユーザは他のユーザの学習進捗を閲覧できます。 rbac#:#sess_visible#:#セッションを表示 rbac#:#sess_write#:#セッションを編集 +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#アクセス権設定の変更 rbac#:#skmg_read#:#能力管理への読み込みアクセス rbac#:#skmg_visible#:#能力管理が表示されます @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#参加確認を送る survey#:#svy_matrix_layout_percentages_sum_invalid#:#列設定は合計100%にする必要があります。 survey#:#svy_max_sum_score#:#最高累計点数 survey#:#svy_neutral_answer#:#中立回答用のテキスト("未定"、"わからない"など) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#サーベイ結果の含まれる1通のメール survey#:#svy_notification_tutor_results_alert#:#これは終了日が必須です。 survey#:#svy_notification_tutor_results_info#:#データ終了するとcronjobはそれに添付する詳細サーベイ結果と合わせてメールを送ります。 @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#更新催促 user#:#user_prompting_settings#:#更新設定 user#:#user_public_profile_info#:#どのパーソナルデータをプロファイルへ表示してどのユーザがプロファイルへ訪問できるかを選択してください。 user#:#user_publish_options#:#プロファイルを公開 +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#ユーザ - 開始点 user#:#user_save_continue#:#保存して継続 user#:#user_save_ordering_and_titles#:#順番とタイトルを保存 diff --git a/lang/ilias_ka.lang b/lang/ilias_ka.lang index 63c71d7e8d7f..07d088b61e8c 100644 --- a/lang/ilias_ka.lang +++ b/lang/ilias_ka.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#გთხოვთ დააჭიროთ assessment#:#circle_click_circle#:#გთხოვთ დააჭიროთ მრგვალ ნიშანს სასურველ არეში assessment#:#clientip#:#მომხმარებლის აი პი assessment#:#close_text_hint#:#თქვენ შეგიძლიათ განსაზღვროთ "ნაპრალი" [gap][/gap] ჩასმით ტექსტში თქვენთვის სასურველ ადგილას. დააჭირეთ "ნაპრალის შექმნა"-ის ღილაკს ნაპრალის რედაქტირებადი ფორმის გასახსნელად +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#ტექსტის ველის სიგრძე assessment#:#cloze_fixed_textlength_description#:#თუ თქვენ შეიყვანთ 0-ზე მეტ ღირებულებას მთლიანი ტექსტი და რიცხვითი "ნაპრალები" ამ ღირებულებით განისაზღვრება assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#მინიმალური დონ assessment#:#tst_mark_official_form#:#ოფიციალური ფორმა assessment#:#tst_mark_passed#:#ჩაბარებული assessment#:#tst_mark_reset_to_simple_mark_schema#:#საკუთარი სანიშნე სქემის შექმნა +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#მოკლე ფორმა assessment#:#tst_max_allowed_users_heading#:#ტესტს ერთდროულად მონაწილეთა მაქსიმალური რაოდენობა წერს assessment#:#tst_max_allowed_users_message#:#ტესტს ერთდროულად მონაწილეთა მაქსიმალური რაოდენობა წერს. გთხოვთ მოგვიანებით სცადოთ ან განაახლოთ ტესტი. თუ რომელიმე აქტიურმ მომხმარებელთაგან არააქტიურია %s წამზე მეტი ხანია, თქვენ შეძლებთ ამ ტესტის დაწყებას. Mადლობას გიხდით გაგებისთვის. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#ბლოგის ადმინისტრაცი blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#თქვენი ავტორიზებ common#:#err_auth_soap_no_ilias_user#:#შესვლა ვერ განხორციელდა, ეს ოუ ეი პი ავტორიზება წარმატებულად დასრულდა მაგრამ ილიასის კორესპონდენტი მომხმარებლი არ არსებობს. გთხოვთ დაუკავშირდეთ თქვენი სისტემის ადმინისტრატორს. common#:#err_check_input#:#ამ პარამეტრის შენახვა ვერ მოხერხდა. გთხოვთ შეამოწმოთ თქვენს მიერ შეტანილი მასალა common#:#err_count_param#:#მიზეზი: არასწორის პარამეტრის დათვლა +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#შეცდომა ხაზში common#:#err_inactive#:#ეს ანგარიში არ არის გააქტიურებული. გთხოვთ დაუკავშირდეთ თქვენი სისტემის ადმინისტრატორს შესვლისთვის common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests common#:#objs_rwik#:#ECS Wikis common#:#objs_sahs#:#SCORM/AICC სასწავლო მოდულები common#:#objs_sess#:#სესიები +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#კითხვების ნაკადების კითხვარი common#:#objs_st#:#თავები common#:#objs_svy#:#კითხვარები @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#კალენდარის რედაქ dateplaner#:#cal_edit_milestone#:#ეტაპის რედაქტირება dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#ეტაპის გააქტიურება dateplaner#:#cal_enable_group_milestones_desc#:#ეს პარამეტრის ააქტიურებს ეტაპის დაგეგმვას კალენდარში dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses. @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments dateplaner#:#cal_import_file#:#Import File dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments. @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#SCORM/AICC სასწავლო მოდულის შექმნა rbac#:#rbac_create_sess#:#სესიის შექმნა +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#კითხვების ნაკადის კითხვარის შექმნა rbac#:#rbac_create_svy#:#კითვარის შექმნა rbac#:#rbac_create_tst#:#ტესტის შექმნა @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#კითხვითი დაშვება სესი rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#სესიები ხილვადია rbac#:#sess_write#:#სესიების რედაქტირება +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#User can change permission settings of Competence Management administration rbac#:#skmg_read#:#User has read access to administration of Competence Management rbac#:#skmg_visible#:#Competence Management administration is visible @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#გთხოვთ მონიშნოთ რომელი პირადი მონაცემები გინდათ იყოს ხილვადი თქვენს პროფილში და რომელ მომხმარებლებს შეეძლებათ თქვენს პროფილის ვიზიტი user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#თანმიმდევრობისა და დასახელებების შენახვა diff --git a/lang/ilias_lt.lang b/lang/ilias_lt.lang index 95e52163c063..aa0341251202 100644 --- a/lang/ilias_lt.lang +++ b/lang/ilias_lt.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Prašome paspausti ant norimos zonos centro. assessment#:#circle_click_circle#:#Prašome paspausti ant pasirinktos zonos apskritimo taško. assessment#:#clientip#:#Kliento IP assessment#:#close_text_hint#:#Jūs galite nustatyti tarpą įrašydami pasirinktoje teksto vietoje. Norėdami sukurti redaguojamą formą kiekvienam tarpui, paspauskite 'Sukurti gaps' mygtuką. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Text Field Length###02 04 2007 new variable assessment#:#cloze_fixed_textlength_description#:#If you enter a value greater than 0, all text and numeric gap text fields will be created with the fixed length of this value.###02 04 2007 new variable assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Minimalus lygis (%) assessment#:#tst_mark_official_form#:#Oficiali forma assessment#:#tst_mark_passed#:#Išlaikyta assessment#:#tst_mark_reset_to_simple_mark_schema#:#Sukurti paprastą įvertinimo schemą +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Trumpa forma assessment#:#tst_max_allowed_users_heading#:#Maksimalus vartotojų skaičius šiame teste pasiektas assessment#:#tst_max_allowed_users_message#:#Maksimalus aktyvių vartotojų skaičius šiame teste pasiektas. Norėdami pradėti ar tęsti testą, bandykite vėliaut. Jei vienas iš aktyvių vartotojų tampa neaktyvus daugiau nei %s sekundžių, jūs galėsite spręsti šį testą. Dėkojame už supratimą. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Blog Administration###06 08 2011 new variable blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft###10 11 2011 new variable @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated.###2 common#:#err_auth_soap_no_ilias_user#:#Prisijungimas nepavyko. SOAP autorizacija sėkminga, bet nėra nurodyto ILIAS vartotojo. Susisiekite su sistemos administratoriumi. common#:#err_check_input#:#The settings could not be saved. Please check your input.###09 07 2007 new variable common#:#err_count_param#:#Priežastis: Neteisingas parametrų skaičius +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Klaida eilutėje common#:#err_inactive#:#Ši paskyra nebuvo aktyvuota. Norįdami prisijungti, susisiekite su sistemos administratoriumi. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests###28 08 2012 new variable common#:#objs_rwik#:#ECS Wikis###28 08 2012 new variable common#:#objs_sahs#:#SCORM/AICC Mokymo Moduliai common#:#objs_sess#:#Sessions###02 06 2008 new variable +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Klausimynas Apklausai common#:#objs_st#:#Skyriai common#:#objs_svy#:#Apklausos @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Edit Calendar###02 06 2008 new variable dateplaner#:#cal_edit_milestone#:#Edit Milestone###26 06 2009 new variable dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Enable Milestones###26 06 2009 new variable dateplaner#:#cal_enable_group_milestones_desc#:#This option enables milestone planning in the calendar.###26 06 2009 new variable dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses.###27 10 2012 new variable @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe###28 08 2012 new variable dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments###28 08 2012 new variable dateplaner#:#cal_import_file#:#Import File###28 08 2012 new variable dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments.###28 08 2012 new variable @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#Create SCORM/AICC Learning Module###16 09 2009 new variable rbac#:#rbac_create_sess#:#Create Session###02 06 2008 new variable +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Create Question Pool Survey###16 09 2009 new variable rbac#:#rbac_create_svy#:#Create Survey###16 09 2009 new variable rbac#:#rbac_create_tst#:#Create Test###16 09 2009 new variable @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Read access to Sessions###02 06 2008 new variable rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Sessions are visible###02 06 2008 new variable rbac#:#sess_write#:#Edit Sessions###02 06 2008 new variable +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings###10 11 2011 new variable rbac#:#skmg_read#:#Read access to Skill Management###10 11 2011 new variable rbac#:#skmg_visible#:#Skill Management is visible###10 11 2011 new variable @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%.###28 08 2012 new variable survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.)###28 08 2012 new variable +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Please select which personal data should be visible to other users.###30 04 2009 new variable user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Save ordering and titles###22 03 2011 new variable diff --git a/lang/ilias_nl.lang b/lang/ilias_nl.lang index 5deb3b79dee1..5c26ccec206c 100644 --- a/lang/ilias_nl.lang +++ b/lang/ilias_nl.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Klik in het midden van het gewenst gebied. assessment#:#circle_click_circle#:#Klik op een cirkelpunt van het gewenste gebied. assessment#:#clientip#:# Klant IP assessment#:#close_text_hint#:#U kunt een invulruimte maken door [gap][/gap] te gebruiken op de gewenste positie. Klik op de 'Aanmaken invulruimtes' knop om een formulier toe te voegen voor ieder antwoord. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Tekst veldlengte assessment#:#cloze_fixed_textlength_description#:#Als je een waarde hoger dan 0 ingeeft, dan zullen alle tekst en numerieke velden een lengte krijgen van deze waarde. assessment#:#cloze_gap_size_info#:#Als je een waarde groter dan 0 ingeeft, zal dit gap tekstveld worden aangemaakt met deze lengte. Als je geen waarde ingeeft, zal het gap tekstveld worden aangemaakt met de waarde van het globale vaste lengte. @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Minimum niveau (in % assessment#:#tst_mark_official_form#:#Officiëel formulier assessment#:#tst_mark_passed#:#Geslaagd assessment#:#tst_mark_reset_to_simple_mark_schema#:#Een simpel nootschema aanmaken +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Korte aanduiding assessment#:#tst_max_allowed_users_heading#:#Het maximum aantal gebruikers voor de toets is bereikt. assessment#:#tst_max_allowed_users_message#:#Het maximum aantal gebruikers voor de toets is bereikt. Probeer laten opnieuw @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Blog Beheer blog#:#blog_settings_navigation#:#Navigatie kolom blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Stijl blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Opslaan als concept @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated. common#:#err_auth_soap_no_ilias_user#:##Login mislukt. SOAP authenticatie succesvol, maar geen overeenkomstige ILIAS gebruiker gevonden. Gelieve de systeembeheerder te contacteren common#:#err_check_input#:#De instellingen konden niet worden bewaard. Gelieve de instellingen te controlleren. common#:#err_count_param#:#Reden: Verkeerde aantal parameters +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Fout in regel common#:#err_inactive#:#Deze gebruikers is niet ingeschakeld. Voor toegang neem contact op met de systeembeheerder. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Toetsen common#:#objs_rwik#:#ECS Wikis common#:#objs_sahs#:#SCORM/AICC lesmodules common#:#objs_sess#:#Sessies +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#vragenpoolen (Enquête) common#:#objs_st#:#Hoofdstukken common#:#objs_svy#:#Enquêtes @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Agenda wijzigen dateplaner#:#cal_edit_milestone#:#Mijlpaal wijzigen dateplaner#:#cal_edit_recurrences#:#Wijzig alle afspraken dateplaner#:#cal_edit_single#:#Wijzig deze afspraak +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Mijlpalen inschakelen dateplaner#:#cal_enable_group_milestones_desc#:#Deze optie schakelt mijlpaalplanning in de agenda in. dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid e-mail addresses. @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Afspraken importeren dateplaner#:#cal_import_file#:#Import File dateplaner#:#cal_import_file_info#:#Kies het bestand dat je agenda afspraken bevat @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Beschikbaarheid obj#:#obj_add_languages#:#Toevoegen talen obj#:#obj_additional_langs#:#Extra talen +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Vertaling voor pagina editor is uitgeschakeld. obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Uitzetten van vertalen voor pagina editor. @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Aanaken nieuwe rol rbac#:#rbac_create_rolt#:#Aanmaken nieuwe rolsjablonen rbac#:#rbac_create_sahs#:#Aanmaken SCORM/AICC Learning Module rbac#:#rbac_create_sess#:#Aanmaken Sessie +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Aanmaken vragenpool (Enquête) rbac#:#rbac_create_svy#:#Aanmaken Enquête rbac#:#rbac_create_tst#:#Aanmaken Toets @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Lees toegang voor Sessies rbac#:#sess_read_learning_progress#:#Gebruiker kan leervoortgang van andere gebruikers zien rbac#:#sess_visible#:#Sessies zijn zichtbaar rbac#:#sess_write#:#Wijzigen Sessies +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Wijzigen van rechteninstellingen rbac#:#skmg_read#:#Leestoegang tot Competentie Beheer rbac#:#skmg_visible#:#Competentiebeheer is zichtbaar @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Tekst voor een neutraal antwoord ("Niet gespecificeerd", "Ik weet het niet" enz.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Selecteer welke informatie zichtbaar mag zijn voor andere gebruikers. user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Volgorde en titels opslaan diff --git a/lang/ilias_pl.lang b/lang/ilias_pl.lang index cd01911c1b82..8d4cef816231 100644 --- a/lang/ilias_pl.lang +++ b/lang/ilias_pl.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Kliknij w środek wskazanego pola. assessment#:#circle_click_circle#:#Kliknij na punkt okręgu wybranego obszaru. assessment#:#clientip#:#IP klienta assessment#:#close_text_hint#:#Możesz zdefiniować lukę podając [gap][/gap] na wybranej pozycji tekstu. Naciśnij przycisk 'Twórz lukę' dla dodania pola edytowalnego. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Długość pola tekstowego assessment#:#cloze_fixed_textlength_description#:#Jeśli wpiszesz tutaj wartość, zostaną utworzone luki w tekście, które nie mają określonej maksymalnej długości, oraz luki numeryczne o tej długości, dzięki czemu nie będzie możliwości wprowadzić większej liczby znaków. W przypadku luk numerycznych należy również pamiętać, że przy liczeniu uwzględniany jest separator dziesiętny. assessment#:#cloze_gap_size_info#:#Jeśli wpisana wartość jest większa niż 0, ta przerwa generowane jest o tutaj wpisanej długości. Jeśli nie podano żadnej wartości, ta przerwa zostanie wygenerowana o długości pola tekstowego podanej globalnie. @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Minimalny poziom (w %) assessment#:#tst_mark_official_form#:#Oficjalna forma assessment#:#tst_mark_passed#:#Wykonany assessment#:#tst_mark_reset_to_simple_mark_schema#:#Twórz prosty schemat wyboru +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Krótka forma assessment#:#tst_max_allowed_users_heading#:#Została przekroczona maksymalna liczba jednocześnie wykonujących test. assessment#:#tst_max_allowed_users_message#:#Została przekroczona maksymalna liczba jednocześnie aktywnych użytkowników teście. Spróbuj później rozpocząć lub odzyskać test. Jeśli jeden z aktywnych użytkowników będzie bezczynny więcej niż %s sekund, to będziesz mógł podejść do testu. Dziękujemy za zrozumienie i cierpliwość. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Ustawienia systemowe blogu blog#:#blog_settings_navigation#:#Nawigacja blog#:#blog_show_latest#:#Pokaż najnowsze wpisy/szkice blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Styl blogu blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Cofnij opublikowanie @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Aktualnie logowanie nie jest możliwe. common#:#err_auth_soap_no_ilias_user#:#Logowanie nieudane. Identyfikacja SOAP udana, lecz brak odpowiedniego konta użytkownika ILIAS. Skontaktuj się z administratorem systemu. common#:#err_check_input#:#Ustawienia nie mogą być zapamiętane. Sprawdź dane wejściowe. common#:#err_count_param#:#Powód: Zła ilość parametrów +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Błąd w linii common#:#err_inactive#:#To konto nie zostało aktywowane. Skontaktuj się z administratorem systemu w celu uzyskania dostępu. common#:#err_inactive_login_attempts#:#Z powodu błędnych prób logowania Twoje konto użytkownika zostało dezaktywowane. Kliknij na opcję 'Skontaktuj się z obsługą techniczną' na dole strony, aby powiadomić administratorów o tym, żeby ponownie aktywowali Twoje konto użytkownika. @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#Testy ECS common#:#objs_rwik#:#Strony Wiki ECS common#:#objs_sahs#:#Moduły nauczania SCORM/AICC common#:#objs_sess#:#Sesje +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Pule pytań (ankieta) common#:#objs_st#:#Rozdziały common#:#objs_svy#:#Ankiety @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#W tym kontekście nie obsługiwane są żadne pytania. copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#Jeśli ustawisz link na całą sekcję, upewnij się, że nie są w niej zawarte żadne inne elementy interaktywne (np. inne linki). Ta funkcja jest gwarantowana. @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Edytuj kalendarz dateplaner#:#cal_edit_milestone#:#Edytuj kamień milowy dateplaner#:#cal_edit_recurrences#:#Edytuj wszystkie terminy dateplaner#:#cal_edit_single#:#Edytuj ten termin +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Aktywuj kamienie milowe dateplaner#:#cal_enable_group_milestones_desc#:#Ta opcja włącza funkcję zarządzania kamieniami milowymi w kalendarzu (kursy i grupy). dateplaner#:#cal_err_invalid_notification_rcps#:#Odbiorcy powiadomień mailowych są nieaktualni. Podaj tylko aktualne nazwy kont użytkowników ILIAS lub adresy mailowe. @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Inne dateplaner#:#cal_grp_personal#:#Osobiste dateplaner#:#cal_ical_infoscreen#:#Abonuj dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Importuj pojęcia dateplaner#:#cal_import_file#:#Plik importowy dateplaner#:#cal_import_file_info#:#Wybierz plik, który zawiera Twoje terminy. @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Zapisano nazwę. lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Wyłącz funkcję automatycznego rozpoznawania języka @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted. @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Aktywacja obj#:#obj_activation_list_gui#:#Dostępność obj#:#obj_add_languages#:#Dodaj języki obj#:#obj_additional_langs#:#Dodatkowe języki +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Wyłączono opcję treści w wielu językach w edytorze stron. obj#:#obj_copy_progress#:#Postęp kopiowania obj#:#obj_deactivate_content_lang#:#Wyłącz opcję treści w wielu językach dla edytora stron. @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Utwórz rolę rbac#:#rbac_create_rolt#:#Utwórz szablon roli rbac#:#rbac_create_sahs#:#Utwórz moduł nauczania SCORM/AICC rbac#:#rbac_create_sess#:#Utwórz zdarzenie +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Utwórz pulę pytań (ankieta) rbac#:#rbac_create_svy#:#Utwórz ankietę rbac#:#rbac_create_tst#:#Utwórz test @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Prawo czytania sesji rbac#:#sess_read_learning_progress#:#Użytkownik może obejrzeć postęp w nauce innych użytkowników rbac#:#sess_visible#:#Sesje są widoczne rbac#:#sess_write#:#Edytuj sesje +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Zmień ustawienia uprawnień dla zarządzania kompetencjami rbac#:#skmg_read#:#Dostęp do zarządzania kompetencjami rbac#:#skmg_visible#:#Zarządzanie kompetencjami jest widoczne @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Wyślij potwierdzenie udziału survey#:#svy_matrix_layout_percentages_sum_invalid#:#Ustawienia dotyczące kolumn nie sumują się do 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Tekst dla neutralnej odpowiedzi ("Nie zdefiniowano", "Nie wiem", "Brak danych" itd.). +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence user#:#user_prompting_settings#:#Prompting Settings user#:#user_public_profile_info#:#Proszę określ, które informacje osobiste mogą być widoczne dla innych użytkowników. user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#Użytkownik - strona startowa user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Zapisz kolejność i nazwy diff --git a/lang/ilias_pt.lang b/lang/ilias_pt.lang index 20ee9eb016ca..fffb1e5e622e 100644 --- a/lang/ilias_pt.lang +++ b/lang/ilias_pt.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Clique no centro da área desejada. assessment#:#circle_click_circle#:#Clique num ponto circular da área desejada. assessment#:#clientip#:#IP do cliente assessment#:#close_text_hint#:#Para adicionar um novo espaço coloque o cursor na posição que quiser e use a caixa de seleção ‘Espaço de texto’. Aparecem em baixo correspondentes secções de edição. Também pode editar espaços se clicar nos espaços dentro do texto de espaços. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Comprimento do campo de texto assessment#:#cloze_fixed_textlength_description#:#Se introduzir um novo valor, todos os campos de espaços do texto que não impõem uma limitação máxima própria de caracteres, assim como todos os campos de espaços numéricos, serão criados com um comprimento fixo deste valor, não sendo assim possível introduzir mais do que os caracteres permitidos. Repare que para os espaços numéricos, o separador decimal conta como um caracter regular. assessment#:#cloze_gap_size_info#:#Se introduzir um valor superior a 0, este campo de texto de espaços será criado com o comprimento fixo deste valor. Se não introduzir um valor, o campo de texto de espaços será criado com o valor do comprimento global fixo. @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Não é possível um teste com um conju assessment#:#tst_mark_official_form#:#Date da última sincronização dos bancos de perguntas selecionados: %s assessment#:#tst_mark_passed#:#Os pontos de competência foram guardados. assessment#:#tst_mark_reset_to_simple_mark_schema#:#Não é possível um teste com um conjunto aleatório de perguntas sem selecionar pelo menos um banco de perguntas. +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#A regra foi removida com sucesso. assessment#:#tst_max_allowed_users_heading#:#Foi alcançado o número máximo de utilizadores simultâneos no teste assessment#:#tst_max_allowed_users_message#:#Foi alcançado o número máximo de utilizadores ativos simultâneos no teste. Tente novamente mais tarde reiniciar ou retomar o teste. Se um dos utilizadores ativos estiver inativo durante mais de %s segundos, pode introduzir este teste. Obrigado pela sua compreensão. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Administração do blog blog#:#blog_settings_navigation#:#Coluna de navegação blog#:#blog_show_latest#:#Mostrar últimos postings/esboços blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Estilo do blog blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Precisa atualização. @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#O seu método de autenticação foi desativado common#:#err_auth_soap_no_ilias_user#:#Login falhou. A autenticação SOAP foi bem-sucedida, mas não existe um utilizador ILIAS correspondente. Entre em contacto com o administrador do seu sistema. common#:#err_check_input#:#Não foi possível guardar as definições. Verifique a sua entrada. common#:#err_count_param#:#Importante +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Importar categorias common#:#err_inactive#:#Esta conta não foi desativada. Entre em contacto com o administrador do sistema para efeitos de acesso. common#:#err_inactive_login_attempts#:#A conta de utilizador foi desativada devido a muitas tentativas de login falhadas. Clique em 'Contactar a Assistência Técnica' no rodapé desta página para notificar o administrador da necessidade de reativar a sua conta. @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#Testes ECS common#:#objs_rwik#:#Wikis ECS common#:#objs_sahs#:#Quantidade de acessos de leitura não-anónimos common#:#objs_sess#:#Destinatário +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Como ficou a saber do ILIAS? common#:#objs_st#:#Atualizar common#:#objs_svy#:#Atualizar todos os idiomas @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#As perguntas não são suportadas neste contexto. copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#Se definir uma ligação em toda a secção, certifique-se que não está incluído nenhum outro elemento interativo dentro da secção. Caso contrário, o respetivo comportamento pode ser irregular. @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Editar calendário dateplaner#:#cal_edit_milestone#:#Editar marco dateplaner#:#cal_edit_recurrences#:#Editar todas as marcações dateplaner#:#cal_edit_single#:#Editar esta marcação +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Ativar marcos dateplaner#:#cal_enable_group_milestones_desc#:#Esta opção ativa o planeamento dos marcos no calendário. dateplaner#:#cal_err_invalid_notification_rcps#:#Criado a partir de @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Outras dateplaner#:#cal_grp_personal#:#Pessoal dateplaner#:#cal_ical_infoscreen#:#Subscrever dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Marcações importadas dateplaner#:#cal_import_file#:#Importar ficheiro dateplaner#:#cal_import_file_info#:#Escolha o ficheiro que contém as suas marcações de calendário. @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Títulos guardados. lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Desativar deteção de idioma @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Defina os limites de acesso a funções para novos utilizadores registados mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Atribuição de funções @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Ativação obj#:#obj_activation_list_gui#:#Disponibilidade obj#:#obj_add_languages#:#Adicionar idiomas obj#:#obj_additional_langs#:#Idiomas adicionais +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#A tradução para edição de página foi desativada. obj#:#obj_copy_progress#:#Copiar progresso obj#:#obj_deactivate_content_lang#:#Desativar tradução para edição de página @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Criar nova função rbac#:#rbac_create_rolt#:#Criar novo modelo de função rbac#:#rbac_create_sahs#:#Se quiser usar um portefólio como o seu perfil, vá para a secção de portefólio e defina ‘O meu perfil’ para esse portefólio. rbac#:#rbac_create_sess#:#Criar sessão +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Criar inquérito banco de perguntas rbac#:#rbac_create_svy#:#Criar sondagem rbac#:#rbac_create_tst#:#Criar teste @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Permissão de escrita concedida aos utilizadores. rbac#:#sess_read_learning_progress#:#O utilizador pode ver o progresso de aprendizagem dos outros utilizadores rbac#:#sess_visible#:#As sessões estão visíveis rbac#:#sess_write#:#Vista da impressão +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Rápida navegação wiki rbac#:#skmg_read#:#Classificar esta página wiki rbac#:#skmg_visible#:#Conceder acesso de escrita @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Enviar confirmação de participação survey#:#svy_matrix_layout_percentages_sum_invalid#:#As definições das colunas não totalizam 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Alertar para recorrência user#:#user_prompting_settings#:#Alertar para definições user#:#user_public_profile_info#:#Por favor selecionar que dados pessoais devem ser visíveis para outros usuários. user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#Utilizador - ponto de início user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Salvar pedidos e títulos diff --git a/lang/ilias_ro.lang b/lang/ilias_ro.lang index ac502988a3ef..0bae68324c64 100644 --- a/lang/ilias_ro.lang +++ b/lang/ilias_ro.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Va rugam apasati in centrul perimetrului dori assessment#:#circle_click_circle#:#Va rugam apasati intr-un punct al perimetrului dorit. assessment#:#clientip#:#Adresa IP client assessment#:#close_text_hint#:#Puteti crea spatii tastand [gap][/gap] oriunde in text. Apasati butonul 'Creaza spatii' pentru a forma un spatiu editabil. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Text Field Length###02 04 2007 new variable assessment#:#cloze_fixed_textlength_description#:#If you enter a value greater than 0, all text and numeric gap text fields will be created with the fixed length of this value.###02 04 2007 new variable assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Nivelul minim (in %) assessment#:#tst_mark_official_form#:#Forma oficiala assessment#:#tst_mark_passed#:#Trecut assessment#:#tst_mark_reset_to_simple_mark_schema#:#Creati o schema de notare simpla +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Forma la limita assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached###10 Jul 2006 new variable assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding.###10 Jul 2006 new variable @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Blog Administration###06 08 2011 new variable blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft###10 11 2011 new variable @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated.###2 common#:#err_auth_soap_no_ilias_user#:#Login failed. SOAP authentication successful, but no corresponding ILIAS user exists. Please contact your system administrator.###10 Jul 2006 new variable common#:#err_check_input#:#The settings could not be saved. Please check your input.###09 07 2007 new variable common#:#err_count_param#:#Motiv: Numar gresit de parametrii +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Greseala in rand common#:#err_inactive#:#Acest cont nu a fost activat. Va rugam contactati-l pe administratorul sistemului pentru acces. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests###28 08 2012 new variable common#:#objs_rwik#:#ECS Wikis###28 08 2012 new variable common#:#objs_sahs#:#Moduluri de Invatare SCORM/AICC common#:#objs_sess#:#Sessions###02 06 2008 new variable +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Sondaj din Bazele de Intrebari common#:#objs_st#:#Capitole common#:#objs_svy#:#Sondaje @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Edit Calendar###02 06 2008 new variable dateplaner#:#cal_edit_milestone#:#Edit Milestone###26 06 2009 new variable dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Enable Milestones###26 06 2009 new variable dateplaner#:#cal_enable_group_milestones_desc#:#This option enables milestone planning in the calendar.###26 06 2009 new variable dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses.###27 10 2012 new variable @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe###28 08 2012 new variable dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments###28 08 2012 new variable dateplaner#:#cal_import_file#:#Import File###28 08 2012 new variable dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments.###28 08 2012 new variable @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#Create SCORM/AICC Learning Module###16 09 2009 new variable rbac#:#rbac_create_sess#:#Create Session###02 06 2008 new variable +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Create Question Pool Survey###16 09 2009 new variable rbac#:#rbac_create_svy#:#Create Survey###16 09 2009 new variable rbac#:#rbac_create_tst#:#Create Test###16 09 2009 new variable @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Read access to Sessions###02 06 2008 new variable rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Sessions are visible###02 06 2008 new variable rbac#:#sess_write#:#Edit Sessions###02 06 2008 new variable +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings###10 11 2011 new variable rbac#:#skmg_read#:#Read access to Skill Management###10 11 2011 new variable rbac#:#skmg_visible#:#Skill Management is visible###10 11 2011 new variable @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%.###28 08 2012 new variable survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.)###28 08 2012 new variable +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Please select which personal data should be visible to other users.###30 04 2009 new variable user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Save ordering and titles###22 03 2011 new variable diff --git a/lang/ilias_ru.lang b/lang/ilias_ru.lang index bd1153cb8e34..fa86a82ff568 100644 --- a/lang/ilias_ru.lang +++ b/lang/ilias_ru.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Пожалуйста, щелкните в ц assessment#:#circle_click_circle#:#Пожалуйста, щелкните в центре круга для нужной области. assessment#:#clientip#:#IP клиента assessment#:#close_text_hint#:#Вы можете определить интервал путем ввода тегов [gap][/gap] тексте по вашему выбору или щелкая по кнопке. Нажмите 'Создать пропуски', для добавления области редактирования для каждого пропуска. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Длинна текстового поля assessment#:#cloze_fixed_textlength_description#:#If you enter a value greater than 0, all text and numeric gap text fields will be created with the fixed length of this value. assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Минимальный уровень (в assessment#:#tst_mark_official_form#:#Официальная форма assessment#:#tst_mark_passed#:#Сдан assessment#:#tst_mark_reset_to_simple_mark_schema#:#Создать простую схему оценки +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Короткая форма assessment#:#tst_max_allowed_users_heading#:#Максимальное число пользователей, которые могут одновременно проходить этот тест assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Администрирование блога blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated. common#:#err_auth_soap_no_ilias_user#:#Login failed. SOAP authentication successful, but no corresponding ILIAS user exists. Please contact your system administrator. common#:#err_check_input#:#The settings could not be saved. Please check your input. common#:#err_count_param#:#Причина: Ошибка подсчета параметров +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Ошибка в линии common#:#err_inactive#:#Эта учетная запись неактивена. Пожалуйста, свяжитесь с системным администратором. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests common#:#objs_rwik#:#ECS вики common#:#objs_sahs#:#Обучающие модули SCORM/AICC common#:#objs_sess#:#Сессии +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Наборы вопросов для опроса (Question Pools Survey) common#:#objs_st#:#Главы common#:#objs_svy#:#Определения @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Edit Calendar dateplaner#:#cal_edit_milestone#:#Edit Milestone dateplaner#:#cal_edit_recurrences#:#Edit all Appointments dateplaner#:#cal_edit_single#:#Edit this Appointment +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Enable Milestones dateplaner#:#cal_enable_group_milestones_desc#:#This option enables milestone planning in the calendar. dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses. @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments dateplaner#:#cal_import_file#:#Import File dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments. @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Доступность obj#:#obj_add_languages#:#Add Languages obj#:#obj_additional_langs#:#Additional Languages +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated. obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role rbac#:#rbac_create_rolt#:#Create new Role Template rbac#:#rbac_create_sahs#:#Создать обучающий модуль SCORM/AICC rbac#:#rbac_create_sess#:#Создать сессию +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Создать опрос из хранилища вопросов rbac#:#rbac_create_svy#:#Создать опрос rbac#:#rbac_create_tst#:#Создать тест @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Read access to Sessions rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Sessions are visible rbac#:#sess_write#:#Edit Sessions +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings rbac#:#skmg_read#:#Read access to Skill Management rbac#:#skmg_visible#:#Skill Management is visible @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Выберите данные профиля которые будут доступны и пользователей которые будут иметь доступ к вашему профилю. user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Сохранить порядок и заголовки diff --git a/lang/ilias_sk.lang b/lang/ilias_sk.lang index 86d9145f34e6..3caf5b810fca 100644 --- a/lang/ilias_sk.lang +++ b/lang/ilias_sk.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Klepněte prosím na střed požadované ploc assessment#:#circle_click_circle#:#Klepněte prosím na okraj požadované plochy. assessment#:#clientip#:#IP klienta assessment#:#close_text_hint#:#Můžete definovat mezeru vložením [gap][/gap] na Vámi vybranou další pozici. Stiskněte tlačítko 'Vytvořit mezery' k přidání editovatelného formuláře pro každou mezeru. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Délka textového pole assessment#:#cloze_fixed_textlength_description#:#Pokud vložíte hodnotu větší než 0, všechna textová pole textových i numerických mezer budou vytvářeny s pevnou délkou rovnou této hodnotě. assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Minimální hladina (v %) assessment#:#tst_mark_official_form#:#Oficiální tvar assessment#:#tst_mark_passed#:#Prošel assessment#:#tst_mark_reset_to_simple_mark_schema#:#Vytvořit jednoduché schéma známkování +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Zkrácený tvar assessment#:#tst_max_allowed_users_heading#:#Dosažen maximální počet simultánních účastníků v tomto testu assessment#:#tst_max_allowed_users_message#:#Maximální počet simultánních účastníků v tomto testu byl dosažen. Zkuste začít nebo pokračovat znovu později. Pokud bude některý z aktivních účastníků nenaktivní déle než %s s., můžete namísto něj do testu vstoupit. Děkujeme za pochopení. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Blog Administration###06 08 2011 new variable blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft###10 11 2011 new variable @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Vaše metoda autentizace je deaktivována. common#:#err_auth_soap_no_ilias_user#:#Přihlášení selhalo. Autentizace SOAP úspěšná, avšak neodpovídá jméno uživatele ILIAS. Kontaktujte prosím svého systémového administrátora. common#:#err_check_input#:#Nastavení nelze uložit. Zkontrolujte prosím svůj vstup. common#:#err_count_param#:#Důvod: Chybný počet parametrů +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Chyba na řádce common#:#err_inactive#:#Tento účet nebyl aktivován. Kontaktujte prosím svého systémového administrátora. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests###28 08 2012 new variable common#:#objs_rwik#:#ECS Wikis###28 08 2012 new variable common#:#objs_sahs#:#Výukové moduly SCORM/AICC common#:#objs_sess#:#Lekce +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Zásobníky otázek (ankety) common#:#objs_st#:#Kapitoly common#:#objs_svy#:#Ankety @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Upravit kalendář dateplaner#:#cal_edit_milestone#:#Upravit mezník dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Zapnout mezníky dateplaner#:#cal_enable_group_milestones_desc#:#Tato volba zapíná v kalendáři plánovací mezníky. dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses.###27 10 2012 new variable @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe###28 08 2012 new variable dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments###28 08 2012 new variable dateplaner#:#cal_import_file#:#Import File###28 08 2012 new variable dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments.###28 08 2012 new variable @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#Vytvořit výukový modul SCORM/AICC rbac#:#rbac_create_sess#:#Vytvořit lekci +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Vytvořit zásobník otázek ankety rbac#:#rbac_create_svy#:#Vytvořit anketu rbac#:#rbac_create_tst#:#Vytvořit test @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Právo číst na nastavení lekce rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Lekce jsou viditelné rbac#:#sess_write#:#Upravit lekci +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings###10 11 2011 new variable rbac#:#skmg_read#:#Read access to Skill Management###10 11 2011 new variable rbac#:#skmg_visible#:#Skill Management is visible###10 11 2011 new variable @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%.###28 08 2012 new variable survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.)###28 08 2012 new variable +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Vyberte prosím která osobní data by měla být viditelná jiným uživatelům. user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Save ordering and titles###22 03 2011 new variable diff --git a/lang/ilias_sl.lang b/lang/ilias_sl.lang index edbb08c4473d..9c8899f46176 100644 --- a/lang/ilias_sl.lang +++ b/lang/ilias_sl.lang @@ -613,6 +613,7 @@ assessment#:#circle_click_center#:#Kliknite na sredino želenega območja. assessment#:#circle_click_circle#:#Kliknite na točko v okolici želenega območja. assessment#:#clientip#:#IP stranke assessment#:#close_text_hint#:#Če želite v besedilo vstaviti praznino, premaknite kurzor na želeni položaj in kliknite na gumb "praznina v besedilu". Spodaj bodo na voljo ustrezna področja za obdelavo. Prav tako lahko kliknete neposredno na praznine in jih obdelate v besedilu s prazninami. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Dolžina besedilnega polja assessment#:#cloze_fixed_textlength_description#:#Če tukaj vnesete vrednost, se v besedilu ustvarijo praznine, ki ne določajo lastne vrednosti za maksimalno dolžino, kot tudi praznine za številčni odgovor s to dolžino, zato ni mogoče vnesti več znakov, kot je dovoljeno. Pri prazninah za številčni odgovor je poleg tega treba upoštevati, da se pri štetju upoštevajo tudi decimalna ločila. assessment#:#cloze_gap_size_info#:#Če je vnesena vrednost večja od 0, se ta praznina ustvari z dolžino, ki je tukaj navedena. Če ni vnesena nobena vrednost, se ta praznina ustvari z globalno določeno dolžino besedilnega polja. @@ -1550,6 +1551,7 @@ assessment#:#tst_mark_minimum_level#:#Najnižji odstotek (v %) assessment#:#tst_mark_official_form#:#Uradno ime assessment#:#tst_mark_passed#:#Opravljeno assessment#:#tst_mark_reset_to_simple_mark_schema#:#Vrnite se na preprosto ocenjevalno shemo +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Kratko ime assessment#:#tst_max_allowed_users_heading#:#Doseženo je bilo maksimalno število sočasnih uporabnikov za ta test assessment#:#tst_max_allowed_users_message#:#Doseženo je bilo maksimalno število sočasnih udeležencev za ta test Poskusite test ponovno odpreti ali nadaljevati nekoliko pozneje. Če so aktivni udeleženci neaktivni več kot %s sekund, imate možnost, da opravljate ta test. Hvala za razumevanje. @@ -2458,6 +2460,7 @@ blog#:#blog_settings#:#Administracija bloga blog#:#blog_settings_navigation#:#Navigacija blog#:#blog_show_latest#:#Prikaži najnovejše objave/osnutke blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Slog bloga blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s" blog#:#blog_toggle_draft#:#Razveljavi objavo @@ -3975,6 +3978,7 @@ common#:#err_auth_mode_inactive#:#Prijava trenutno ni mogoča. common#:#err_auth_soap_no_ilias_user#:#Prijava ni uspela! Avtentikacija SOAP je bila uspešna, vendar ne obstaja noben ustrezen uporabnik ILIAS. Obrnite se na sistemskega administratorja. common#:#err_check_input#:#Nastavitev ni bilo mogoče shraniti. Preverite svoje vnose. common#:#err_count_param#:#Razlog: Napačno število parametrov +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Napaka v vrstici common#:#err_inactive#:#Ta uporabniški račun ni aktiven oz. še ni bil aktiviran. Za nadaljnjo pomoč se obrnite na tehnično podporo (glej povezavo spodaj). common#:#err_inactive_login_attempts#:#Vaš račun je bil onemogočen zaradi neuspelih poskusov prijave. Kliknite na 'Obrnite se na tehnično podporo' na dnu te strani, da administratorja obvestite o potrebi po ponovni aktivaciji vašega uporabniškega računa. @@ -5131,6 +5135,7 @@ common#:#objs_rtst#:#Testi ECS common#:#objs_rwik#:#Wiki ECS common#:#objs_sahs#:#Učni moduli SCORM common#:#objs_sess#:#Seje +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Skupine vprašanj za ankete common#:#objs_st#:#Poglavje common#:#objs_svy#:#Ankete @@ -7258,6 +7263,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###19 08 2022 new variable copg#:#copg_page_type_stys#:#Layout Page +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Vprašanja v tem kontekstu niso podprta. copg#:#copg_reload_page#:#Reload Page###19 08 2022 new variable copg#:#copg_sec_link_info#:#Če ustvarite povezavo do celotnega bloka, se prepričajte, da ta ne vsebuje nadaljnjih interaktivnih elementov (npr. drugih povezav). Njihovo delovanje ni zagotovljeno. @@ -8198,6 +8204,7 @@ dateplaner#:#cal_edit_category#:#Uredi koledar dateplaner#:#cal_edit_milestone#:#Uredi mejnik dateplaner#:#cal_edit_recurrences#:#Uredi vse termine dateplaner#:#cal_edit_single#:#Uredi ta termin +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Aktiviraj mejnike dateplaner#:#cal_enable_group_milestones_desc#:#Ta možnost aktivira upravljanje mejnikov v koledarju (tečaji in skupine). dateplaner#:#cal_err_invalid_notification_rcps#:#Prejemniki za obveščanje po e-pošti niso veljavni. Izberi izključno imena uporabniških računov ILIAS ali veljavne e-poštne naslove. @@ -8228,6 +8235,7 @@ dateplaner#:#cal_grp_others#:#Drugi dateplaner#:#cal_grp_personal#:#Osebno dateplaner#:#cal_ical_infoscreen#:#Naroči se dateplaner#:#cal_ical_url#:#iCal-URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Uvozi termine dateplaner#:#cal_import_file#:#Datoteka za uvoz dateplaner#:#cal_import_file_info#:#Izberite datoteko, ki vsebuje vaše termine. @@ -9005,6 +9013,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10339,7 +10348,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Naslovi so bili shranjeni. lng#:#language_detection#:#Language Detection###19 08 2022 new variable lng#:#lng_disable_language_detection#:#Onemogoči samodejno zaznavanje jezika @@ -11952,6 +11963,7 @@ mme#:#move_to_top_item#:#Move to Top Items###19 08 2022 new variable mme#:#msg_languages_added#:#Jeziki so dodani mme#:#msg_moved#:#Item successfully moved###19 08 2022 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###19 08 2022 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost. mme#:#msg_restored#:#Main Menu completely reset mme#:#msg_subitem_deleted#:#Vnos je izbrisan. @@ -12230,6 +12242,7 @@ obj#:#obj_activation#:#Aktiviranje obj#:#obj_activation_list_gui#:#Razpoložljivost obj#:#obj_add_languages#:#Dodaj jezike obj#:#obj_additional_langs#:#Dodatni jeziki +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Podpora za večjezične vsebine v urejevalniku strani je bila onemogočena. obj#:#obj_copy_progress#:#Napredek kopiranja obj#:#obj_deactivate_content_lang#:#Onemogoči večjezičnost za urejevalnik strani. @@ -13744,6 +13757,7 @@ rbac#:#rbac_create_role#:#Ustvari vlogo rbac#:#rbac_create_rolt#:#Ustvari predlogo vloge rbac#:#rbac_create_sahs#:#Ustvari učni modul SCORM rbac#:#rbac_create_sess#:#Ustvari sejo +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Ustvari skupino vprašanj za ankete rbac#:#rbac_create_svy#:#Ustvari anketo rbac#:#rbac_create_tst#:#Ustvari test @@ -13919,6 +13933,17 @@ rbac#:#sess_read#:#Bralni dostop do sej rbac#:#sess_read_learning_progress#:#Uporabnik lahko vidi učni napredek drugih uporabnikov rbac#:#sess_visible#:#Seje so vidne rbac#:#sess_write#:#Uredi seje +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Spremeni nastavitve pravic za upravljanje kompetenc rbac#:#skmg_read#:#Bralni dostop do upravljanja kompetenc rbac#:#skmg_visible#:#Upravljanje kompetenc je vidno @@ -16047,6 +16072,7 @@ survey#:#svy_mail_send_confirmation#:#Pošlji potrdilo o udeležbi survey#:#svy_matrix_layout_percentages_sum_invalid#:#Vsota nastavitev stolpcev ne dosega 100%. survey#:#svy_max_sum_score#:#Maximum Sum Score###19 08 2022 new variable survey#:#svy_neutral_answer#:#Besedilo za nevtralni odgovor ("Ni določeno", "Ne vem", "Ni podatka" itd.) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results survey#:#svy_notification_tutor_results_alert#:#This requires an end date. survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it. @@ -16734,6 +16760,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence user#:#user_prompting_settings#:#Prompting Settings user#:#user_public_profile_info#:#Please select which personal data is visible in your profile and which users should be able to visit your profile. user#:#user_publish_options#:#Publish Profile +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point user#:#user_save_continue#:#Save and Continue user#:#user_save_ordering_and_titles#:#Save ordering and titles diff --git a/lang/ilias_sq.lang b/lang/ilias_sq.lang index 8aaffb8eb5b2..aff6de2b3016 100644 --- a/lang/ilias_sq.lang +++ b/lang/ilias_sq.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Ju lutem klikoni në qendër të zonës së d assessment#:#circle_click_circle#:#Ju lutem klikoni në kornizën e zonës së dëshiruar. assessment#:#clientip#:#Client IP ### 2006-8-11 --- Add new translation here. assessment#:#close_text_hint#:#Mund të definoni zbrazëtirë duke shkruar [gap][/gap] në tekst sipas zgjedhjes së juaj. Shtyp butonin 'Krijo zbrazëtirë' për të shtuar një form të që mund të editohet për çdo zbrazëtirë +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Text Field Length###02 04 2007 new variable assessment#:#cloze_fixed_textlength_description#:#If you enter a value greater than 0, all text and numeric gap text fields will be created with the fixed length of this value.###02 04 2007 new variable assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Përqindja minimale assessment#:#tst_mark_official_form#:#Formë zyrtare assessment#:#tst_mark_passed#:#Kalon assessment#:#tst_mark_reset_to_simple_mark_schema#:#Krijo skemë të notimit të thjesht +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Formë e shkurtër assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached###10 Jul 2006 new variable assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding.###10 Jul 2006 new variable @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Blog Administration###06 08 2011 new variable blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft###10 11 2011 new variable @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated.###2 common#:#err_auth_soap_no_ilias_user#:#Login failed. SOAP authentication successful, but no corresponding ILIAS user exists. Please contact your system administrator.###10 Jul 2006 new variable common#:#err_check_input#:#The settings could not be saved. Please check your input.###09 07 2007 new variable common#:#err_count_param#:#Arsyeja: Gabim gjatë numrimit të parametrave +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Gabim në rreshtin common#:#err_inactive#:#Llogaria nuk është e aktivizuar. Ju lutem kontaktoni administratorin e sistemit për qasje. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests###28 08 2012 new variable common#:#objs_rwik#:#ECS Wikis###28 08 2012 new variable common#:#objs_sahs#:#Modulet Mësimore SCORM/AICC common#:#objs_sess#:#Sessions###02 06 2008 new variable +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Fondet e Pyetjeve për Kuestionerë common#:#objs_st#:#Kapitujt common#:#objs_svy#:#Kuestioneët @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Edit Calendar###02 06 2008 new variable dateplaner#:#cal_edit_milestone#:#Edit Milestone###26 06 2009 new variable dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Enable Milestones###26 06 2009 new variable dateplaner#:#cal_enable_group_milestones_desc#:#This option enables milestone planning in the calendar.###26 06 2009 new variable dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses.###27 10 2012 new variable @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe###28 08 2012 new variable dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments###28 08 2012 new variable dateplaner#:#cal_import_file#:#Import File###28 08 2012 new variable dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments.###28 08 2012 new variable @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#Create SCORM/AICC Learning Module###16 09 2009 new variable rbac#:#rbac_create_sess#:#Create Session###02 06 2008 new variable +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Create Question Pool Survey###16 09 2009 new variable rbac#:#rbac_create_svy#:#Create Survey###16 09 2009 new variable rbac#:#rbac_create_tst#:#Create Test###16 09 2009 new variable @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Read access to Sessions###02 06 2008 new variable rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Sessions are visible###02 06 2008 new variable rbac#:#sess_write#:#Edit Sessions###02 06 2008 new variable +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings###10 11 2011 new variable rbac#:#skmg_read#:#Read access to Skill Management###10 11 2011 new variable rbac#:#skmg_visible#:#Skill Management is visible###10 11 2011 new variable @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%.###28 08 2012 new variable survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.)###28 08 2012 new variable +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Please select which personal data should be visible to other users.###30 04 2009 new variable user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Save ordering and titles###22 03 2011 new variable diff --git a/lang/ilias_sr.lang b/lang/ilias_sr.lang index 5ae372f1a48c..6305ed43aebd 100644 --- a/lang/ilias_sr.lang +++ b/lang/ilias_sr.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Molimo vas da kliknete u centar željenog pod assessment#:#circle_click_circle#:#Molimo vas da kliknete mesto opsega željenog podrucja. assessment#:#clientip#:#Client IP ### 2006-8-11 --- Add new translation here. assessment#:#close_text_hint#:#Možete definisati razmak unošenjem [gap][/gap] na mesto vašeg izbora u tekstu. Pritisnite dugme 'Create gaps' da biste dodali formu za uredivanje za svaki razmak. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Text Field Length###02 04 2007 new variable assessment#:#cloze_fixed_textlength_description#:#If you enter a value greater than 0, all text and numeric gap text fields will be created with the fixed length of this value.###02 04 2007 new variable assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Najniži nivo (u %) assessment#:#tst_mark_official_form#:#Zvanicna forma assessment#:#tst_mark_passed#:#Prošao assessment#:#tst_mark_reset_to_simple_mark_schema#:#Krirajte jednostavnu znakovnu šemu +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Kratka forma assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached###10 Jul 2006 new variable assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding.###10 Jul 2006 new variable @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Blog Administration###06 08 2011 new variable blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft###10 11 2011 new variable @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated.###2 common#:#err_auth_soap_no_ilias_user#:#Login failed. SOAP authentication successful, but no corresponding ILIAS user exists. Please contact your system administrator.###10 Jul 2006 new variable common#:#err_check_input#:#The settings could not be saved. Please check your input.###09 07 2007 new variable common#:#err_count_param#:#Razlog: Pogrešno racunati parametri +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Greška u redu common#:#err_inactive#:#Ovaj nalog nije aktiviran. Molimo kontaktirajte sistem administratora radi pristupa. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests###28 08 2012 new variable common#:#objs_rwik#:#ECS Wikis###28 08 2012 new variable common#:#objs_sahs#:#SCORM/AICC metode ucenja common#:#objs_sess#:#Sessions###02 06 2008 new variable +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Baze pitanja za Anketu common#:#objs_st#:#Poglavlja common#:#objs_svy#:#Ankete @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Edit Calendar###02 06 2008 new variable dateplaner#:#cal_edit_milestone#:#Edit Milestone###26 06 2009 new variable dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Enable Milestones###26 06 2009 new variable dateplaner#:#cal_enable_group_milestones_desc#:#This option enables milestone planning in the calendar.###26 06 2009 new variable dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses.###27 10 2012 new variable @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe###28 08 2012 new variable dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments###28 08 2012 new variable dateplaner#:#cal_import_file#:#Import File###28 08 2012 new variable dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments.###28 08 2012 new variable @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#Create SCORM/AICC Learning Module###16 09 2009 new variable rbac#:#rbac_create_sess#:#Create Session###02 06 2008 new variable +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Create Question Pool Survey###16 09 2009 new variable rbac#:#rbac_create_svy#:#Create Survey###16 09 2009 new variable rbac#:#rbac_create_tst#:#Create Test###16 09 2009 new variable @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Read access to Sessions###02 06 2008 new variable rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Sessions are visible###02 06 2008 new variable rbac#:#sess_write#:#Edit Sessions###02 06 2008 new variable +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings###10 11 2011 new variable rbac#:#skmg_read#:#Read access to Skill Management###10 11 2011 new variable rbac#:#skmg_visible#:#Skill Management is visible###10 11 2011 new variable @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%.###28 08 2012 new variable survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.)###28 08 2012 new variable +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Please select which personal data should be visible to other users.###30 04 2009 new variable user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Save ordering and titles###22 03 2011 new variable diff --git a/lang/ilias_sv.lang b/lang/ilias_sv.lang index 839158a911af..7f3cb8e8f6ae 100644 --- a/lang/ilias_sv.lang +++ b/lang/ilias_sv.lang @@ -614,6 +614,7 @@ assessment#:#circle_click_center#:#Klicka på mitten av den önskade regionen assessment#:#circle_click_circle#:#Klicka på en punkt på omkretsen av den önskade regionen assessment#:#clientip#:#Klient IP assessment#:#close_text_hint#:#För att infoga ett mellanrum i texten, placera markören på motsvarande position och använd knappen "Textmellanrum". Därefter finns motsvarande redigeringsområden tillgängliga längre ner. Du kan också klicka direkt på luckorna för att redigera i lucktexte +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Längd på textfältet assessment#:#cloze_fixed_textlength_description#:#Om du anger ett värde här skapas textgap som inte definierar ett eget värde för en maximal längd, samt numeriska gap med denna längd, så att det inte är möjligt att ange ett större antal tecken. För numeriska luckor, observera att decimalavgränsaren ocks assessment#:#cloze_gap_size_info#:#Om ett värde större än 0 anges skapas detta mellanrum med den längd som anges här. Om inget värde anges skapas detta mellanrum med den globalt angivna textfältslängden. @@ -621,9 +622,6 @@ assessment#:#cloze_text#:#Cloze fråga assessment#:#cloze_textgap_case_insensitive#:#Ingen skillnad görs mellan stora och små bokstäver assessment#:#cloze_textgap_case_sensitive#:#Känsliga gemener assessment#:#cloze_textgap_levenshtein_of#:#Levenshtein avstånd från %s -assessment#:#cloze_textgap_multiple_whitespace#:#Flera utrymmen i rad -assessment#:#cloze_textgap_whitespace_after#:#Space efter terminen -assessment#:#cloze_textgap_whitespace_before#:#Space före terminen assessment#:#code#:#Kod assessment#:#codebase#:#Codebase assessment#:#concatenation#:#Länk @@ -1550,10 +1548,11 @@ assessment#:#tst_manscoring_question_section_header#:#Fråga assessment#:#tst_manscoring_user_notification#:#Skicka meddelande assessment#:#tst_mark#:#Note assessment#:#tst_mark_create_new_mark_step#:#Skapa ny anteckningsnivå -assessment#:#tst_mark_mark_reset_to_simple_mark_schema#:#Återställ till enkelt notsystem assessment#:#tst_mark_minimum_level#:#Minsta procentandel assessment#:#tst_mark_official_form#:#Officiell beteckning assessment#:#tst_mark_passed#:#Bekräftad +assessment#:#tst_mark_reset_to_simple_mark_schema#:#Reset to Simple Mark Schema###28 11 2023 new variable +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Kort namn assessment#:#tst_max_allowed_users_heading#:#Det maximala antalet samtidiga deltagare för detta test har uppnåtts. assessment#:#tst_max_allowed_users_message#:#Det maximala antalet samtidiga deltagare för detta test har uppnåtts. Försök att starta eller fortsätta testet igen lite senare. Om aktiva deltagare är inaktiva i mer än %s av en sekund kommer du inte att kunna delta i detta test. Tack för din förståelse @@ -2462,6 +2461,7 @@ blog#:#blog_settings#:#bloggadministration blog#:#blog_settings_navigation#:#Navigation blog#:#blog_show_latest#:#Visa senaste inlägg/utkast blog#:#blog_show_print_view#:# Skriv ut vy +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#bloggstil blog#:#blog_task_publishing_draft_title#:#Publicera utkast "%s" blog#:#blog_toggle_draft#:#Återkalla publicering @@ -3979,6 +3979,7 @@ common#:#err_auth_mode_inactive#:#Tyvärr är registrering inte möjlig för til common#:#err_auth_soap_no_ilias_user#:#Logon misslyckades! SOAP-autentiseringen lyckades, men det finns ingen motsvarande ILIAS-användare. Kontakta din systemadministratör. common#:#err_check_input#:#Inställningarna kunde inte sparas. Vänligen kontrollera dina poster. common#:#err_count_param#:#Anledning +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Fel i raden common#:#err_inactive#:#Detta ILIAS-konto är inte aktivt eller har inte aktiverats ännu. Kontakta teknisk support (se länk nedan) för ytterligare hjälp. common#:#err_inactive_login_attempts#:#Ditt ILIAS-konto har avaktiverats på grund av felaktiga inloggningsförsök. Klicka på "Kontakta teknisk support" längst ned på denna sida för att informera administratörerna om att återaktivera ditt ILIAS-konto. @@ -4976,6 +4977,7 @@ common#:#obj_petmp#:#SidaTemplate common#:#obj_peusr#:#Användare common#:#obj_pg#:#Sida common#:#obj_poll#:#Röstning +common#:#obj_poll_dupliate:#:#Copy Poll###28 11 2023 new variable common#:#obj_poll_duplicate#:#Kopiera omröstning common#:#obj_prg#:#Studieprogram common#:#obj_prg_duplicate#:#Kopiera studieprogram @@ -5134,6 +5136,7 @@ common#:#objs_rtst#:#ECS-tester common#:#objs_rwik#:#ECS wikis common#:#objs_sahs#:#SCORM utbildningsmoduler common#:#objs_sess#:#Sessioner +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Pooler med enkätfrågor common#:#objs_st#:#Kapitel common#:#objs_svy#:#Undersökningar @@ -7261,6 +7264,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor Historik rensning copg#:#copg_history_cleanup_cron_info#:# Raderar äldre poster från sidredigerarens historik. copg#:#copg_page_element_not_found#:# Okänt sidelement. copg#:#copg_page_type_stys#:#Sidans layout +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Inga frågor stöds i detta sammanhang. copg#:#copg_reload_page#:#Reload sida copg#:#copg_sec_link_info#:#Välj en destination för länkning av blocket. Uppmärksamhet @@ -8201,6 +8205,7 @@ dateplaner#:#cal_edit_category#:#Redigera kalender dateplaner#:#cal_edit_milestone#:#Redigera milstolpe dateplaner#:#cal_edit_recurrences#:#Redigera alla möten dateplaner#:#cal_edit_single#:#Redigera detta möte +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Aktivera milstolpar dateplaner#:#cal_enable_group_milestones_desc#:#Detta alternativ aktiverar hanteringen av milstolpar i kalendern (kurser och grupper). dateplaner#:#cal_err_invalid_notification_rcps#:#Vänligen korrigera din post. Ange endast ILIAS-inloggningsnamn eller giltiga e-postadresser. @@ -8231,6 +8236,7 @@ dateplaner#:#cal_grp_others#:#Andra dateplaner#:#cal_grp_personal#:#Personlig dateplaner#:#cal_ical_infoscreen#:#Prenumerera dateplaner#:#cal_ical_url#:#iCal URL +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import utnämningar dateplaner#:#cal_import_file#:#Importera fil dateplaner#:#cal_import_file_info#:#Välj den fil som innehåller dina möten. @@ -10343,7 +10349,9 @@ lm#:#lm_edit_chapters#:#Redigera kapitel lm#:#lm_edit_lm_settings#:#Redigera inställningar för lärmodulen lm#:#lm_est_reading_time#:#Uppskattad lästid lm#:#lm_est_reading_time_info#:#I lärmoduler kan en uppskattad lästid bestämmas och visas. +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#sida för utbildningsmodul +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titlar har sparats. lng#:#language_detection#:#Automatisk taligenkänning lng#:#lng_disable_language_detection#:#Avaktivera automatisk taligenkänning @@ -12235,6 +12243,7 @@ obj#:#obj_activation#:#Aktivering obj#:#obj_activation_list_gui#:#Tillgänglighet obj#:#obj_add_languages#:#Lägg till språk obj#:#obj_additional_langs#:#Ytterligare språk +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Stödet för flerspråkigt innehåll i sidredigeraren har inaktiverats. obj#:#obj_copy_progress#:#Kopiering av framsteg obj#:#obj_deactivate_content_lang#:#Inaktivera flerspråkighet för sidredigeraren. @@ -13749,6 +13758,7 @@ rbac#:#rbac_create_role#:#Skapa roll rbac#:#rbac_create_rolt#:#Skapa rollmall rbac#:#rbac_create_sahs#:#Skapa utbildningsmodul för SCORM rbac#:#rbac_create_sess#:#Skapa session +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Skapa frågepool för undersökningar rbac#:#rbac_create_svy#:#Skapa undersökning rbac#:#rbac_create_tst#:#Skapa test @@ -13924,6 +13934,17 @@ rbac#:#sess_read#:#Läs tillgång till sessioner rbac#:#sess_read_learning_progress#:#Användaren kan se andra användares inlärningsframsteg rbac#:#sess_visible#:#Sessionerna är synliga rbac#:#sess_write#:#Redigera sessioner +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Ändra rättighetsinställningar för administration av kompetenshantering rbac#:#skmg_read#:#Läsning tillgång till kompetenshantering rbac#:#skmg_visible#:#Kompetenshantering är synlig @@ -16052,6 +16073,7 @@ survey#:#svy_mail_send_confirmation#:#Skicka bekräftelse på deltagande survey#:#svy_matrix_layout_percentages_sum_invalid#:#Kolumninställningarna summerar inte till 100%. survey#:#svy_max_sum_score#:#Maximal skala punkt summa survey#:#svy_neutral_answer#:#Text för ett neutralt svar ("Ej definierat", "Jag vet inte", "Ingen indikation" etc.). +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#Ett e-postmeddelande med undersökningsresultaten survey#:#svy_notification_tutor_results_alert#:#Denna funktion kräver ett slutdatum. survey#:#svy_notification_tutor_results_info#:#Efter slutdatumet kommer ett e-postmeddelande att skickas med de detaljerade undersökningsresultaten. @@ -16739,6 +16761,7 @@ user#:#user_prompting_recurrence#:#Frekvens user#:#user_prompting_settings#:#Prompt profil publicering user#:#user_public_profile_info#:#Välj vilken data som ska visas i din profil och vilka användare som kan se den. user#:#user_publish_options#:#Publicera profil +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Hemsida user#:#user_save_continue#:#Spara och gå vidare user#:#user_save_ordering_and_titles#:#Spara order och titel diff --git a/lang/ilias_tr.lang b/lang/ilias_tr.lang index 78ddc768e579..481592ecc06a 100644 --- a/lang/ilias_tr.lang +++ b/lang/ilias_tr.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#İstenen alanın merkezine tıklayınız. assessment#:#circle_click_circle#:#İstenen alanın bir noktası üzerine tıklayınız. assessment#:#clientip#:#İstemci IP assessment#:#close_text_hint#:#Metnin istediğiniz yerine boşluk tanımlamak için [gap][/gap] yazın. Her boşluk için düzenleme formu eklemek için 'Boşluk Oluştur' butonuna tıklayın +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Metin Alanı Uzunluğu assessment#:#cloze_fixed_textlength_description#:#Eğer 0'dan büyük bir değer girerseniz , tüm metin ve sayısal alan boşluklarının karakter uzunluğu bu değer olacaktır. assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Asgari Seviye (% olarak) assessment#:#tst_mark_official_form#:#Resmi Hali assessment#:#tst_mark_passed#:#Geçti assessment#:#tst_mark_reset_to_simple_mark_schema#:#Basit Not Şeması Oluştur +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Kısa Hali assessment#:#tst_max_allowed_users_heading#:#Bu testte eşzamanlı kullanıcı maksimum sayısına ulaşıldı assessment#:#tst_max_allowed_users_message#:#Test eşzamanlı aktif kullanıcı maksimum sayısına ulaşıldı. Testi başlatmak veya sürdürmek için daha sonra tekrar deneyin. Aktif kullanıcı biri% s saniye daha hareketsiz ise, bu test girmek mümkün olabilir. Anlayışınız için teşekkür ederiz. @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Blog İdaresi blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Taslak olarak Kaydet @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Kimlik doğrulama yöntemi devre dışı bıra common#:#err_auth_soap_no_ilias_user#:#Oturum açılamadı. SOAP kimlik doğrulaması başarılı, ancak ilgili ILIAS kullanıcı bulunmadığı. Sistem yöneticinize başvurun. common#:#err_check_input#:#ayarları kaydedilemedi. Lütfen girişinizi kontrol edin. common#:#err_count_param#:#Sebep: Yanlış parametre sayısı +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Doğrultusunda Hatası common#:#err_inactive#:#Bu hesap aktif değil. Erişim için sistem yöneticinize başvurun. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Testleri common#:#objs_rwik#:#ECS Wiki'ler common#:#objs_sahs#:#SCORM / AICC Öğrenme Modülleri common#:#objs_sess#:#Oturumlar +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Anket Soru Havuzları common#:#objs_st#:#Bölümler common#:#objs_svy#:#Anketler @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Düzenleme Takvim dateplaner#:#cal_edit_milestone#:#Edit Milestone dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Etkinleştir Kilometre Taşları dateplaner#:#cal_enable_group_milestones_desc#:#Bu seçenek takvim dönüm noktası planlama sağlar. dateplaner#:#cal_err_invalid_notification_rcps#:#bildirim alıcıların listesi geçerli değil. Sadece ILIAS kullanıcı hesap adları veya geçerli e-posta adreslerini seçin. @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Abone dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Randevuları İçe Aktar dateplaner#:#cal_import_file#:#Dosya İçe aktar dateplaner#:#cal_import_file_info#:#takvim randevuları içeren dosyayı, seçin. @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#Create SCORM/AICC Learning Module###11 03 2014 new variable rbac#:#rbac_create_sess#:#Create Session###11 03 2014 new variable +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Create Question Pool Survey###11 03 2014 new variable rbac#:#rbac_create_svy#:#Create Survey###11 03 2014 new variable rbac#:#rbac_create_tst#:#Create Test###11 03 2014 new variable @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Kullanıcı oturumları için okuma erişimi vardır rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Oturumlar görebilir rbac#:#sess_write#:#Kullanıcı oturumu içeriğini ve ayarlarını düzenleyebilirsiniz +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Kullanıcı Yetkinlik Yönetimi idaresinin izin ayarlarını değiştirebilirsiniz rbac#:#skmg_read#:#Kullanıcı Yetkinlik Yönetimi idaresi okuma erişimi rbac#:#skmg_visible#:#Yetkinlik Yönetimi idaresi görülebilir @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#sütun ayarları% 100 Özetle yok. survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Bir Nötr Cevap için Metin ("Henüz", vb "bilmiyorum") +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Hangi kişisel bilgilerinizin profilinizde görüneceğini ve hangi kullanıcıların profilinizi ziyaret edebileceğini seçiniz. user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#sipariş Kaydet ve ünvanlar diff --git a/lang/ilias_uk.lang b/lang/ilias_uk.lang index 405ba1a94818..6e4e3d4b3327 100644 --- a/lang/ilias_uk.lang +++ b/lang/ilias_uk.lang @@ -599,6 +599,7 @@ assessment#:#circle_click_center#:#Будь ласка клікнітьо на assessment#:#circle_click_circle#:#Будь ласка клікніть на точку кола бажаної області. assessment#:#clientip#:#Клієнтt IP assessment#:#close_text_hint#:#Ви маєте визначити проміжок для введення в позицію в тексті що ви вибрали. Натисніть кнопку 'Створити проміжки' для додавання форми що редагується для кожного проміжку. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Text Field Length###02 04 2007 new variable assessment#:#cloze_fixed_textlength_description#:#If you enter a value greater than 0, all text and numeric gap text fields will be created with the fixed length of this value.###02 04 2007 new variable assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1536,6 +1537,7 @@ assessment#:#tst_mark_minimum_level#:#Мінімальний рівень (в %) assessment#:#tst_mark_official_form#:#Офіціальна форма assessment#:#tst_mark_passed#:#Пройдений assessment#:#tst_mark_reset_to_simple_mark_schema#:#Створити просту схему оцінок +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Коротка форма assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached###25 02 2007 new variable assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding.###25 02 2007 new variable @@ -2444,6 +2446,7 @@ blog#:#blog_settings#:#Blog Administration###06 08 2011 new variable blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft###10 11 2011 new variable @@ -3961,6 +3964,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated.###2 common#:#err_auth_soap_no_ilias_user#:#Login failed. SOAP authentication successful, but no corresponding ILIAS user exists. Please contact your system administrator.###25 02 2007 new variable common#:#err_check_input#:#The settings could not be saved. Please check your input.###09 07 2007 new variable common#:#err_count_param#:#Причина: Невірна кількість параметрів +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Помилка в стрічці common#:#err_inactive#:#Цей аккаунт ще не активований. Будь ласка зв'яжіться з системним адміністратором щоб отримати доступ. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5117,6 +5121,7 @@ common#:#objs_rtst#:#ECS Tests###28 08 2012 new variable common#:#objs_rwik#:#ECS Wikis###28 08 2012 new variable common#:#objs_sahs#:#SCORM/AICC Учбові Модулі common#:#objs_sess#:#Sessions###02 06 2008 new variable +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Банки Питань (Опитування) common#:#objs_st#:#Глави common#:#objs_svy#:#Опитування @@ -7244,6 +7249,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8184,6 +8190,7 @@ dateplaner#:#cal_edit_category#:#Edit Calendar###02 06 2008 new variable dateplaner#:#cal_edit_milestone#:#Edit Milestone###26 06 2009 new variable dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Enable Milestones###26 06 2009 new variable dateplaner#:#cal_enable_group_milestones_desc#:#This option enables milestone planning in the calendar.###26 06 2009 new variable dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses.###27 10 2012 new variable @@ -8214,6 +8221,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe###28 08 2012 new variable dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments###28 08 2012 new variable dateplaner#:#cal_import_file#:#Import File###28 08 2012 new variable dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments.###28 08 2012 new variable @@ -8991,6 +8999,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10325,7 +10334,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11938,6 +11949,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12216,6 +12228,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13730,6 +13743,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#Create SCORM/AICC Learning Module###16 09 2009 new variable rbac#:#rbac_create_sess#:#Create Session###02 06 2008 new variable +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Create Question Pool Survey###16 09 2009 new variable rbac#:#rbac_create_svy#:#Create Survey###16 09 2009 new variable rbac#:#rbac_create_tst#:#Create Test###16 09 2009 new variable @@ -13905,6 +13919,17 @@ rbac#:#sess_read#:#Read access to Sessions###02 06 2008 new variable rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Sessions are visible###02 06 2008 new variable rbac#:#sess_write#:#Edit Sessions###02 06 2008 new variable +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings###10 11 2011 new variable rbac#:#skmg_read#:#Read access to Skill Management###10 11 2011 new variable rbac#:#skmg_visible#:#Skill Management is visible###10 11 2011 new variable @@ -16033,6 +16058,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%.###28 08 2012 new variable survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.)###28 08 2012 new variable +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16720,6 +16746,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Please select which personal data should be visible to other users.###30 04 2009 new variable user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Save ordering and titles###22 03 2011 new variable diff --git a/lang/ilias_vi.lang b/lang/ilias_vi.lang index 1edf22a1b443..dbce0f5a17dd 100644 --- a/lang/ilias_vi.lang +++ b/lang/ilias_vi.lang @@ -601,6 +601,7 @@ assessment#:#circle_click_center#:#Hãy kích chuột vào tâm vùng mong muố assessment#:#circle_click_circle#:#Hãy kích chuột vào một điểm trên đường tròn của vùng mong muốn. assessment#:#clientip#:#Địa chỉ IP máy trạm assessment#:#close_text_hint#:#Bạn có thể định nghĩa một chỗ trống bằng cách nhập tại vị trí bạn chọn. Nhấn nút 'Tạo chỗ trống' để thêm một khuôn dạng có thể soạn thảo được cho tất cả các chỗ trống. +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#Text Field Length###02 04 2007 new variable assessment#:#cloze_fixed_textlength_description#:#If you enter a value greater than 0, all text and numeric gap text fields will be created with the fixed length of this value.###02 04 2007 new variable assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1538,6 +1539,7 @@ assessment#:#tst_mark_minimum_level#:#Mức tối thiểu (dạng %) assessment#:#tst_mark_official_form#:#Mẫu chính thức assessment#:#tst_mark_passed#:#Đạt assessment#:#tst_mark_reset_to_simple_mark_schema#:#Tạo giản đồ điểm +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Mẫu ngắn assessment#:#tst_max_allowed_users_heading#:#The maximum number of simultaneous users in this test has been reached###25 02 2007 new variable assessment#:#tst_max_allowed_users_message#:#The maximum number of simultaneous active users in the test has been reached. Please try again later to start or resume the test. If one of the active users is inactive for more than %s seconds, you may be able to enter this test. Thank you for your understanding.###25 02 2007 new variable @@ -2446,6 +2448,7 @@ blog#:#blog_settings#:#Blog Administration###06 08 2011 new variable blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#Save As Draft###10 11 2011 new variable @@ -3963,6 +3966,7 @@ common#:#err_auth_mode_inactive#:#Your authentication method is deactivated.###2 common#:#err_auth_soap_no_ilias_user#:#Login failed. SOAP authentication successful, but no corresponding ILIAS user exists. Please contact your system administrator.###25 02 2007 new variable common#:#err_check_input#:#The settings could not be saved. Please check your input.###09 07 2007 new variable common#:#err_count_param#:#Lý do: Số tham biến sai +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#Lỗi trong dòng common#:#err_inactive#:#Tài khoản này chưa kích hoạt. Hãy liên hệ với người quản trị hệ thống để truy cập. common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5119,6 +5123,7 @@ common#:#objs_rtst#:#ECS Tests###28 08 2012 new variable common#:#objs_rwik#:#ECS Wikis###28 08 2012 new variable common#:#objs_sahs#:#Học phần SCORM/AICC common#:#objs_sess#:#Sessions###02 06 2008 new variable +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#Thư viện câu hỏi khảo sát common#:#objs_st#:#Chương common#:#objs_svy#:#Khảo sát @@ -7246,6 +7251,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8186,6 +8192,7 @@ dateplaner#:#cal_edit_category#:#Edit Calendar###02 06 2008 new variable dateplaner#:#cal_edit_milestone#:#Edit Milestone###26 06 2009 new variable dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#Enable Milestones###26 06 2009 new variable dateplaner#:#cal_enable_group_milestones_desc#:#This option enables milestone planning in the calendar.###26 06 2009 new variable dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only ILIAS user account names or valid email addresses.###27 10 2012 new variable @@ -8216,6 +8223,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#Subscribe###28 08 2012 new variable dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#Import Appointments###28 08 2012 new variable dateplaner#:#cal_import_file#:#Import File###28 08 2012 new variable dateplaner#:#cal_import_file_info#:#Choose the file, that contains your calendar appointments.###28 08 2012 new variable @@ -8993,6 +9001,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10327,7 +10336,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11940,6 +11951,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12218,6 +12230,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13732,6 +13745,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#Create SCORM/AICC Learning Module###16 09 2009 new variable rbac#:#rbac_create_sess#:#Create Session###02 06 2008 new variable +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#Create Question Pool Survey###16 09 2009 new variable rbac#:#rbac_create_svy#:#Create Survey###16 09 2009 new variable rbac#:#rbac_create_tst#:#Create Test###16 09 2009 new variable @@ -13907,6 +13921,17 @@ rbac#:#sess_read#:#Read access to Sessions###02 06 2008 new variable rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#Sessions are visible###02 06 2008 new variable rbac#:#sess_write#:#Edit Sessions###02 06 2008 new variable +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#Change permission settings###10 11 2011 new variable rbac#:#skmg_read#:#Read access to Skill Management###10 11 2011 new variable rbac#:#skmg_visible#:#Skill Management is visible###10 11 2011 new variable @@ -16035,6 +16060,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#The column settings do not sum up to 100%.###28 08 2012 new variable survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#Text for a Neutral Answer ("Not Specified", "I don't know" etc.)###28 08 2012 new variable +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16722,6 +16748,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#Please select which personal data should be visible to other users.###30 04 2009 new variable user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#Save ordering and titles###22 03 2011 new variable diff --git a/lang/ilias_zh.lang b/lang/ilias_zh.lang index d9e28a24bef6..fa61035a23d4 100644 --- a/lang/ilias_zh.lang +++ b/lang/ilias_zh.lang @@ -598,6 +598,7 @@ assessment#:#circle_click_center#:#请点击要选取的中心区域 assessment#:#circle_click_circle#:#请点击要选取区域的周围 assessment#:#clientip#:#客户端IP assessment#:#close_text_hint#:#您可以通过在您选择的文本位置进入置标符定义一个gap。按“创建gaps”按钮为每个gap添加一个可编辑的表格 +assessment#:#cloze_answer_text_info#:#Spaces preceding or following the answer text will be deleted when the form is saved.###28 11 2023 new variable assessment#:#cloze_fixed_textlength#:#文本域长度 assessment#:#cloze_fixed_textlength_description#:#如果输入一个大于0的值,所有文本和数字的文本域将以这个值的固定长度被创建。 assessment#:#cloze_gap_size_info#:#If you enter a value greater than 0, this gap text field will be created with the fixed length of this value. If you do not enter a value the gap text fiel will be created with the value of the global fixed length.###26 09 2014 new variable @@ -1535,6 +1536,7 @@ assessment#:#tst_mark_minimum_level#:#Minimum level (in %) assessment#:#tst_mark_official_form#:#Official form官方形式 assessment#:#tst_mark_passed#:#已通过 assessment#:#tst_mark_reset_to_simple_mark_schema#:#创建简单标记模式 +assessment#:#tst_mark_reset_to_simple_mark_schema_confirmation#:#If you proceed the current mark schema set for this test will be replaced by a simple mark schema thus deleting all local changes.###28 11 2023 new variable assessment#:#tst_mark_short_form#:#Short form assessment#:#tst_max_allowed_users_heading#:#已经达到此次测试中同时允许的用户人数上限 assessment#:#tst_max_allowed_users_message#:#已经达到此次测试中同翻搅时允许的活跃用户人数上限。请稍后再尝试启动或恢复测试。如果其中某位活跃用户超过 %s 秒未活动,您将有可能进入此次测试。感谢您的理解。 @@ -2443,6 +2445,7 @@ blog#:#blog_settings#:#博客管理 blog#:#blog_settings_navigation#:#Navigation Column###26 09 2014 new variable blog#:#blog_show_latest#:#Show latest postings/drafts###25 10 2016 new variable blog#:#blog_show_print_view#:#Show Print View###31 03 2023 new variable +blog#:#blog_starting_page#:#Starting Page###28 11 2023 new variable blog#:#blog_style#:#Blog Style###24 10 2013 new variable blog#:#blog_task_publishing_draft_title#:#Publishing of Draft "%s"###07 02 2020 new variable blog#:#blog_toggle_draft#:#保存为草稿 @@ -3960,6 +3963,7 @@ common#:#err_auth_mode_inactive#:#您的身份验证方法已失效。 common#:#err_auth_soap_no_ilias_user#:#登录失败。SOAP身份验证成功,但不存在相应的ILIAS用户。请联系您的系统管理员。 common#:#err_check_input#:#设置不能被保存。请检查您输入的内容 common#:#err_count_param#:#原因错误计算参数! +common#:#err_double_entries#:#Reason: Duplicate Entries###28 11 2023 new variable common#:#err_in_line#:#行内出错 common#:#err_inactive#:#这个账号没有激活。请联系系统管理员。 common#:#err_inactive_login_attempts#:#Your user account has been deactivated due too many failed login attempts. Click 'Contact Technical Support' at the footer of this page to notify the administrator about the need to re-activate your account. ###31 08 2017 new variable @@ -5116,6 +5120,7 @@ common#:#objs_rtst#:#ECS 测试 common#:#objs_rwik#:#ECS Wikis common#:#objs_sahs#:#SCORM/AICC 学习模块 common#:#objs_sess#:#会话 +common#:#objs_skee#:#Competence Trees###28 11 2023 new variable common#:#objs_spl#:#题目池 (调查) common#:#objs_st#:#章节 common#:#objs_svy#:#问卷调查 @@ -7243,6 +7248,7 @@ copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup###31 03 2023 new copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history.###31 03 2023 new variable copg#:#copg_page_element_not_found#:#Page element not found.###30 04 2021 new variable copg#:#copg_page_type_stys#:#Layout Page###30 04 2021 new variable +copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist.###28 11 2023 new variable copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context.###07 02 2017 new variable copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable @@ -8183,6 +8189,7 @@ dateplaner#:#cal_edit_category#:#编辑日历 dateplaner#:#cal_edit_milestone#:#编辑里程碑 dateplaner#:#cal_edit_recurrences#:#Edit all Appointments###24 10 2013 new variable dateplaner#:#cal_edit_single#:#Edit this Appointment###24 10 2013 new variable +dateplaner#:#cal_edit_single_or_all_info#:#Do you want to edit only this appointment or all in its series?###28 11 2023 new variable dateplaner#:#cal_enable_group_milestones#:#启用里程碑 dateplaner#:#cal_enable_group_milestones_desc#:#这个选项在日历中启用里程碑计划。 dateplaner#:#cal_err_invalid_notification_rcps#:#这个收件人通知名单是无效的。请仅选择ILIAS用户账号名或有效的电子邮件地址。 @@ -8213,6 +8220,7 @@ dateplaner#:#cal_grp_others#:#Others###31 08 2017 new variable dateplaner#:#cal_grp_personal#:#Personal###31 08 2017 new variable dateplaner#:#cal_ical_infoscreen#:#订阅 dateplaner#:#cal_ical_url#:#iCal-URL###14 05 2014 new variable +dateplaner#:#cal_ical_url_google#:#iCal-URL for Google Calendar###28 11 2023 new variable dateplaner#:#cal_import_appointments#:#导入预约 dateplaner#:#cal_import_file#:#导入文件 dateplaner#:#cal_import_file_info#:#选择包含您的日历预约的文件。 @@ -8990,6 +8998,7 @@ etal#:#notification_talks_removed#:#The following appointments have been cancele etal#:#notification_talks_subject#:#Invitation: %s###31 03 2023 new variable etal#:#notification_talks_subject_update#:#Update: %s###31 03 2023 new variable etal#:#notification_talks_updated#:#The following talk appointments have been changed.###31 03 2023 new variable +etal#:#pending_talks_warning#:#The following pending talk appointments will be replaced:###28 11 2023 new variable etal#:#talk_serial#:#Talk Serial###31 03 2023 new variable etal#:#tals_add#:#Add Talks###31 03 2023 new variable etal#:#tals_new#:#New Talks###31 03 2023 new variable @@ -10324,7 +10333,9 @@ lm#:#lm_edit_chapters#:#Edit Chapters###23 10 2023 new variable lm#:#lm_edit_lm_settings#:#Edit Learning Module Settings###23 10 2023 new variable lm#:#lm_est_reading_time#:#Estimated Reading Time###31 03 2023 new variable lm#:#lm_est_reading_time_info#:#In Learning Modules in the repository the estimated reading time can be determined and displayed.###31 03 2023 new variable +lm#:#lm_page_added#:#Page has been added.###28 11 2023 new variable lm#:#lm_page_type_lm#:#LM Page###30 04 2021 new variable +lm#:#lm_pages_added#:#Pages have been added.###28 11 2023 new variable lm#:#lm_save_titles#:#Titles saved.###23 10 2017 new variable lng#:#language_detection#:#Language Detection###30 04 2021 new variable lng#:#lng_disable_language_detection#:#Disable Language Detection###30 08 2015 new variable @@ -11937,6 +11948,7 @@ mme#:#move_to_top_item#:#Move to Top Items###30 04 2021 new variable mme#:#msg_languages_added#:#Added languages###10 11 2018 new variable mme#:#msg_moved#:#Item successfully moved###30 04 2021 new variable mme#:#msg_not_moved#:#Item could not be moved, please select a valid parent.###30 04 2021 new variable +mme#:#msg_ref_id_not_callable#:#This reference ID cannot be used by Main-Menu. Only targets in the magazine are supported.###28 11 2023 new variable mme#:#msg_restore_confirm#:#All Custom Items and Translations will be deleted, all Standard items will be reset to factory default. All customization will be lost.###07 02 2020 new variable mme#:#msg_restored#:#Main Menu completely reset###07 02 2020 new variable mme#:#msg_subitem_deleted#:#Item deleted.###10 11 2018 new variable @@ -12215,6 +12227,7 @@ obj#:#obj_activation#:#Activation###31 08 2017 new variable obj#:#obj_activation_list_gui#:#Availability###30 12 2013 new variable obj#:#obj_add_languages#:#Add Languages###22 01 2014 new variable obj#:#obj_additional_langs#:#Additional Languages###22 01 2014 new variable +obj#:#obj_conf_delete_lang#:#Do you really want to stop the presentation of title and description in these languages?###28 11 2023 new variable obj#:#obj_cont_transl_deactivated#:#Translation for page editing has been deactivated.###22 01 2014 new variable obj#:#obj_copy_progress#:#Copy Progress###30 08 2015 new variable obj#:#obj_deactivate_content_lang#:#Deactivate Translation for Page Editing###22 01 2014 new variable @@ -13729,6 +13742,7 @@ rbac#:#rbac_create_role#:#Create new Role###30 12 2013 new variable rbac#:#rbac_create_rolt#:#Create new Role Template###30 12 2013 new variable rbac#:#rbac_create_sahs#:#创建SCROM/AICC学习模块 rbac#:#rbac_create_sess#:#创建会话 +rbac#:#rbac_create_skee#:#Create Competence Tree###28 11 2023 new variable rbac#:#rbac_create_spl#:#创建题目池调查 rbac#:#rbac_create_svy#:#创建调查 rbac#:#rbac_create_tst#:#创建测试 @@ -13904,6 +13918,17 @@ rbac#:#sess_read#:#会话的读访问权限 rbac#:#sess_read_learning_progress#:#User can view learning progress of other users###26 09 2014 new variable rbac#:#sess_visible#:#会话的可见权限 rbac#:#sess_write#:#会话的编辑权限 +rbac#:#skee_copy#:#User can copy Competence Tree (currently not available)###28 11 2023 new variable +rbac#:#skee_delete#:#User can delete Competence Tree###28 11 2023 new variable +rbac#:#skee_edit_permission#:#User can change permission settings of Competence Tree administration###28 11 2023 new variable +rbac#:#skee_manage_comp#:#User can edit Competences in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_comp_temp#:#User can edit Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_manage_profiles#:#User can edit Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_read#:#User has read access to administration of Competence Tree###28 11 2023 new variable +rbac#:#skee_read_comp#:#User has read access to Competences and Competence Templates in Competence Tree###28 11 2023 new variable +rbac#:#skee_read_profiles#:#User has read access to Competence Profiles in Competence Tree###28 11 2023 new variable +rbac#:#skee_visible#:#Competence Tree is visible###28 11 2023 new variable +rbac#:#skee_write#:#User can edit settings of Competence Tree###28 11 2023 new variable rbac#:#skmg_edit_permission#:#更改权限设置 rbac#:#skmg_read#:#技能管理读访问权限 rbac#:#skmg_visible#:#技能管理是可见的 @@ -16032,6 +16057,7 @@ survey#:#svy_mail_send_confirmation#:#Send Participation Confirmation###25 10 20 survey#:#svy_matrix_layout_percentages_sum_invalid#:#列设置加起来没有100%。 survey#:#svy_max_sum_score#:#Maximum Sum Score###30 04 2021 new variable survey#:#svy_neutral_answer#:#一个中性的答案文本("未指定的", "我不知道" 等等。) +survey#:#svy_no_appraisees_found#:#No appraisees with feedbacks found.###28 11 2023 new variable survey#:#svy_notification_tutor_results#:#One E-Mail including Survey Results###07 02 2020 new variable survey#:#svy_notification_tutor_results_alert#:#This requires an end date.###07 02 2020 new variable survey#:#svy_notification_tutor_results_info#:#After reaching the end data a cron job will send an email with the detailed survey results attached to it.###07 02 2020 new variable @@ -16719,6 +16745,7 @@ user#:#user_prompting_recurrence#:#Prompting Recurrence###10 11 2018 new variabl user#:#user_prompting_settings#:#Prompting Settings###10 11 2018 new variable user#:#user_public_profile_info#:#请选择能让其他用户可见的个人数据。 user#:#user_publish_options#:#Publish Profile###07 02 2020 new variable +user#:#user_role_selection#:#Role Selection###28 11 2023 new variable user#:#user_role_starting_point#:#User - Starting Point###31 08 2017 new variable user#:#user_save_continue#:#Save and Continue###07 02 2020 new variable user#:#user_save_ordering_and_titles#:#保存排序和标题 From 9e892e313b9c609209666c9eb26ab6f7a7b77231 Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Tue, 28 Nov 2023 16:38:55 +0100 Subject: [PATCH 211/497] Release 8.7 --- include/inc.ilias_version.php | 4 ++-- setup/sql/ilias3.sql | 22 +++++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/include/inc.ilias_version.php b/include/inc.ilias_version.php index 511424102193..3356e429f6ae 100644 --- a/include/inc.ilias_version.php +++ b/include/inc.ilias_version.php @@ -10,5 +10,5 @@ * * @package ilias-core */ -define("ILIAS_VERSION", "8.6 2023-10-23"); -define("ILIAS_VERSION_NUMERIC", "8.6"); // since version ILIAS 6 this must be always x.y: x and y are numbers +define("ILIAS_VERSION", "8.7 2023-11-28"); +define("ILIAS_VERSION_NUMERIC", "8.7"); // since version ILIAS 6 this must be always x.y: x and y are numbers diff --git a/setup/sql/ilias3.sql b/setup/sql/ilias3.sql index 84981f819584..6e9a472ff13a 100644 --- a/setup/sql/ilias3.sql +++ b/setup/sql/ilias3.sql @@ -1539,7 +1539,7 @@ CREATE TABLE `cal_cat_visibility` ( CREATE TABLE `cal_categories` ( `cat_id` int(11) NOT NULL DEFAULT 0, `obj_id` int(11) NOT NULL DEFAULT 0, - `title` char(128) DEFAULT NULL, + `title` char(255) DEFAULT NULL, `color` char(8) DEFAULT NULL, `type` tinyint(4) NOT NULL DEFAULT 0, `loc_type` tinyint(4) NOT NULL DEFAULT 1, @@ -6887,7 +6887,8 @@ CREATE TABLE `il_cert_template` ( KEY `i1_idx` (`obj_id`), KEY `i2_idx` (`obj_id`,`deleted`), KEY `i3_idx` (`obj_id`,`currently_active`,`deleted`), - KEY `i4_idx` (`obj_type`) + KEY `i4_idx` (`obj_type`), + KEY `i5_idx` (`background_image_path`,`currently_active`) ) ; -- @@ -6935,7 +6936,8 @@ CREATE TABLE `il_cert_user_cert` ( KEY `i3_idx` (`usr_id`,`currently_active`,`acquired_timestamp`), KEY `i4_idx` (`usr_id`,`obj_type`,`currently_active`), KEY `i5_idx` (`obj_id`,`currently_active`), - KEY `i6_idx` (`usr_id`,`obj_id`,`currently_active`) + KEY `i6_idx` (`usr_id`,`obj_id`,`currently_active`), + KEY `i7_idx` (`background_image_path`,`currently_active`) ) ; -- @@ -7048,10 +7050,12 @@ INSERT INTO `il_db_steps` VALUES ('ilAuthenticationDatabaseUpdateSteps8',1,'2023 INSERT INTO `il_db_steps` VALUES ('ilBibliograficDB80',1,'2023-03-31 13:10:08.334649','2023-03-31 13:10:08.339628'); INSERT INTO `il_db_steps` VALUES ('ilCalendarDBUpdateSteps8',1,'2023-05-17 16:34:13.573649','2023-05-17 16:34:13.585092'); INSERT INTO `il_db_steps` VALUES ('ilCalendarDBUpdateSteps8',2,'2023-10-23 15:11:23.252946','2023-10-23 15:11:23.265275'); +INSERT INTO `il_db_steps` VALUES ('ilCalendarDBUpdateSteps8',3,'2023-11-28 16:35:31.003064','2023-11-28 16:35:31.013966'); INSERT INTO `il_db_steps` VALUES ('ilCertificateDatabaseUpdateSteps',1,'2023-03-31 13:10:08.340522','2023-03-31 13:10:08.351832'); INSERT INTO `il_db_steps` VALUES ('ilCertificateDatabaseUpdateSteps',2,'2023-03-31 13:10:08.352314','2023-03-31 13:10:08.360574'); INSERT INTO `il_db_steps` VALUES ('ilCertificateDatabaseUpdateSteps',3,'2023-03-31 13:10:08.361030','2023-03-31 13:10:08.369035'); INSERT INTO `il_db_steps` VALUES ('ilCertificateDatabaseUpdateSteps',4,'2023-03-31 13:10:08.369600','2023-03-31 13:10:08.375204'); +INSERT INTO `il_db_steps` VALUES ('ilCertificateDatabaseUpdateSteps',5,'2023-11-28 16:35:31.014790','2023-11-28 16:35:31.030743'); INSERT INTO `il_db_steps` VALUES ('ilCmiXapiDatabaseUpdateSteps',1,'2023-03-31 13:10:08.375940','2023-03-31 13:10:08.380350'); INSERT INTO `il_db_steps` VALUES ('ilCmiXapiDatabaseUpdateSteps',2,'2023-03-31 13:10:08.380828','2023-03-31 13:10:08.385378'); INSERT INTO `il_db_steps` VALUES ('ilCmiXapiDatabaseUpdateSteps',3,'2023-03-31 13:10:08.385862','2023-03-31 13:10:08.390362'); @@ -7065,6 +7069,8 @@ INSERT INTO `il_db_steps` VALUES ('ilCmiXapiDatabaseUpdateSteps',10,'2023-03-31 INSERT INTO `il_db_steps` VALUES ('ilCmiXapiDatabaseUpdateSteps',11,'2023-03-31 13:10:08.424889','2023-03-31 13:10:08.429291'); INSERT INTO `il_db_steps` VALUES ('ilCmiXapiDatabaseUpdateSteps',12,'2023-05-17 16:34:13.586023','2023-05-17 16:34:13.586564'); INSERT INTO `il_db_steps` VALUES ('ilContentPageUpdateSteps',1,'2023-03-31 13:10:08.478093','2023-03-31 13:10:08.478487'); +INSERT INTO `il_db_steps` VALUES ('ilCourseObjectiveDBUpdateSteps',1,'2023-11-28 16:35:31.032083','2023-11-28 16:35:31.038214'); +INSERT INTO `il_db_steps` VALUES ('ilCourseObjectiveDBUpdateSteps',2,'2023-11-28 16:35:31.038821','2023-11-28 16:35:31.045221'); INSERT INTO `il_db_steps` VALUES ('ilCtrlDatabaseUpdateSteps',1,'2023-03-31 13:10:08.895434','2023-03-31 13:10:08.901218'); INSERT INTO `il_db_steps` VALUES ('ilCtrlDatabaseUpdateSteps',2,'2023-03-31 13:10:08.902626','2023-03-31 13:10:08.908797'); INSERT INTO `il_db_steps` VALUES ('ilCtrlDatabaseUpdateSteps',3,'2023-03-31 13:10:08.909297','2023-03-31 13:10:08.916505'); @@ -11344,7 +11350,9 @@ CREATE TABLE `loc_settings` ( `it_start` tinyint(4) DEFAULT 1, `qt_start` tinyint(4) DEFAULT 1, `passed_obj_mode` tinyint(4) DEFAULT 1, - PRIMARY KEY (`obj_id`) + PRIMARY KEY (`obj_id`), + KEY `i1_idx` (`itest`), + KEY `i2_idx` (`qtest`) ) ; -- @@ -13108,7 +13116,7 @@ INSERT INTO `object_data` VALUES (34,'typ','lm','Learning module Object',-1,'200 INSERT INTO `object_data` VALUES (35,'typ','notf','Note Folder Object',-1,'2002-12-21 00:04:00','2002-12-21 00:04:00','',NULL); INSERT INTO `object_data` VALUES (36,'typ','note','Note Object',-1,'2002-12-21 00:04:00','2002-12-21 00:04:00','',NULL); INSERT INTO `object_data` VALUES (37,'typ','frm','Forum object',-1,'2002-07-15 15:54:22','2003-08-15 12:36:40','',NULL); -INSERT INTO `object_data` VALUES (70,'lng','en','installed',-1,NULL,'2023-10-23 15:11:23','',NULL); +INSERT INTO `object_data` VALUES (70,'lng','en','installed',-1,NULL,'2023-11-28 16:35:30','',NULL); INSERT INTO `object_data` VALUES (71,'lng','de','not_installed',6,'2003-08-15 10:25:19','2015-12-22 16:29:24','',NULL); INSERT INTO `object_data` VALUES (72,'lng','es','not_installed',6,'2003-08-15 10:25:19','2003-08-15 10:25:19','',NULL); INSERT INTO `object_data` VALUES (73,'lng','it','not_installed',6,'2003-08-15 10:25:19','2003-08-15 10:25:19','',NULL); @@ -20101,7 +20109,7 @@ INSERT INTO `settings` VALUES ('common','ilfrmnoti1','1'); INSERT INTO `settings` VALUES ('common','ilfrmreadidx1','1'); INSERT INTO `settings` VALUES ('common','ilfrmthri2','1'); INSERT INTO `settings` VALUES ('common','ilGlobalTstPoolUsageSettingInitilisation','1'); -INSERT INTO `settings` VALUES ('common','ilias_version','8.6.0'); +INSERT INTO `settings` VALUES ('common','ilias_version','8.7.0'); INSERT INTO `settings` VALUES ('common','ilinc_akclassvalues_required','1'); INSERT INTO `settings` VALUES ('common','ilmpathix','1'); INSERT INTO `settings` VALUES ('common','iloscmsgidx1','1'); @@ -25084,4 +25092,4 @@ CREATE TABLE `xmlvalue_seq` ( --- Dump completed on 2023-10-23 15:11:24 +-- Dump completed on 2023-11-28 16:35:32 From b90ca50b117f4a558e773f64c43ca4d755d3fffc Mon Sep 17 00:00:00 2001 From: mjansen Date: Wed, 29 Nov 2023 16:54:12 +0100 Subject: [PATCH 212/497] Forum: Fix pagination See: https://mantis.ilias.de/view.php?id=39175 --- Modules/Forum/classes/class.ilObjForumGUI.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Modules/Forum/classes/class.ilObjForumGUI.php b/Modules/Forum/classes/class.ilObjForumGUI.php index 9f517c6e195f..cfd8385a5563 100755 --- a/Modules/Forum/classes/class.ilObjForumGUI.php +++ b/Modules/Forum/classes/class.ilObjForumGUI.php @@ -3139,12 +3139,14 @@ public function viewThreadObject(): void } // no posts - if ($firstNodeInThread->getId() === 0 && !$numberOfPostings = count($subtree_nodes)) { + $numberOfPostings = count($subtree_nodes); + if ($numberOfPostings === 0 && $firstNodeInThread->getId() === 0) { $this->tpl->setOnScreenMessage('info', $this->lng->txt('forums_no_posts_available')); } $pageSize = $frm->getPageHits(); $postIndex = 0; + if ($numberOfPostings > $pageSize) { $this->ctrl->setParameter($this, 'ref_id', $this->object->getRefId()); $this->ctrl->setParameter($this, 'thr_pk', $this->objCurrentTopic->getId()); From 153be4df26120bb221784c44322e2a02c0c40612 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 30 Nov 2023 10:25:25 +0100 Subject: [PATCH 213/497] AdvMD: fix validating field type (29072) --- .../classes/class.ilAdvancedMDClaimingPlugin.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Services/AdvancedMetaData/classes/class.ilAdvancedMDClaimingPlugin.php b/Services/AdvancedMetaData/classes/class.ilAdvancedMDClaimingPlugin.php index 0a2eb102bca3..1d3daa35f193 100644 --- a/Services/AdvancedMetaData/classes/class.ilAdvancedMDClaimingPlugin.php +++ b/Services/AdvancedMetaData/classes/class.ilAdvancedMDClaimingPlugin.php @@ -213,8 +213,7 @@ public static function createDBField( $field_id = $ilDB->nextId("adv_mdf_definition"); // validating type - $a_type = $a_type; - if ($a_type < 1 || $a_type > 8) { + if (!ilAdvancedMDFieldDefinition::isValidType($a_type)) { return null; } From 217218d51e8fe5033bc32234d60420ee9bd60352 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 30 Nov 2023 14:37:57 +0100 Subject: [PATCH 214/497] Search: better handling of StudyProgrammes sneaking into results (38422) --- .../Search/classes/Lucene/class.ilLuceneAdvancedSearchGUI.php | 1 + Services/Search/classes/Lucene/class.ilLuceneSearchGUI.php | 1 + Services/Search/classes/class.ilAdvancedSearchGUI.php | 1 + Services/Search/classes/class.ilSearchGUI.php | 1 + 4 files changed, 4 insertions(+) diff --git a/Services/Search/classes/Lucene/class.ilLuceneAdvancedSearchGUI.php b/Services/Search/classes/Lucene/class.ilLuceneAdvancedSearchGUI.php index fcca945bcdfd..f8f730c0b33e 100644 --- a/Services/Search/classes/Lucene/class.ilLuceneAdvancedSearchGUI.php +++ b/Services/Search/classes/Lucene/class.ilLuceneAdvancedSearchGUI.php @@ -27,6 +27,7 @@ * @ilCtrl_IsCalledBy ilLuceneAdvancedSearchGUI: ilSearchControllerGUI * @ilCtrl_Calls ilLuceneAdvancedSearchGUI: ilObjectGUI, ilContainerGUI * @ilCtrl_Calls ilLuceneAdvancedSearchGUI: ilObjCategoryGUI, ilObjCourseGUI, ilObjFolderGUI, ilObjGroupGUI +* @ilCtrl_Calls ilLuceneAdvancedSearchGUI: ilObjStudyProgrammeGUI * @ilCtrl_Calls ilLuceneAdvancedSearchGUI: ilObjRootFolderGUI, ilObjectCopyGUI * * @ingroup ServicesSearch diff --git a/Services/Search/classes/Lucene/class.ilLuceneSearchGUI.php b/Services/Search/classes/Lucene/class.ilLuceneSearchGUI.php index c9e65c4614e8..10494ff44697 100644 --- a/Services/Search/classes/Lucene/class.ilLuceneSearchGUI.php +++ b/Services/Search/classes/Lucene/class.ilLuceneSearchGUI.php @@ -27,6 +27,7 @@ * @ilCtrl_Calls ilLuceneSearchGUI: ilPropertyFormGUI * @ilCtrl_Calls ilLuceneSearchGUI: ilObjectGUI, ilContainerGUI * @ilCtrl_Calls ilLuceneSearchGUI: ilObjCategoryGUI, ilObjCourseGUI, ilObjFolderGUI, ilObjGroupGUI + * @ilCtrl_Calls ilLuceneSearchGUI: ilObjStudyProgrammeGUI * @ilCtrl_Calls ilLuceneSearchGUI: ilObjRootFolderGUI, ilObjectCopyGUI * * @ingroup ServicesSearch diff --git a/Services/Search/classes/class.ilAdvancedSearchGUI.php b/Services/Search/classes/class.ilAdvancedSearchGUI.php index 2978120f59ba..bf973b3d33cf 100644 --- a/Services/Search/classes/class.ilAdvancedSearchGUI.php +++ b/Services/Search/classes/class.ilAdvancedSearchGUI.php @@ -27,6 +27,7 @@ * * @ilCtrl_Calls ilAdvancedSearchGUI: ilObjectGUI, ilContainerGUI * @ilCtrl_Calls ilAdvancedSearchGUI: ilObjCategoryGUI, ilObjCourseGUI, ilObjFolderGUI, ilObjGroupGUI +* @ilCtrl_Calls ilAdvancedSearchGUI: ilObjStudyProgrammeGUI * @ilCtrl_Calls ilAdvancedSearchGUI: ilObjRootFolderGUI, ilObjectCopyGUI, ilPropertyFormGUI * * @package ilias-search diff --git a/Services/Search/classes/class.ilSearchGUI.php b/Services/Search/classes/class.ilSearchGUI.php index cf83704f80ad..d767830d11c2 100644 --- a/Services/Search/classes/class.ilSearchGUI.php +++ b/Services/Search/classes/class.ilSearchGUI.php @@ -27,6 +27,7 @@ * @ilCtrl_Calls ilSearchGUI: ilPropertyFormGUI * @ilCtrl_Calls ilSearchGUI: ilObjectGUI, ilContainerGUI * @ilCtrl_Calls ilSearchGUI: ilObjCategoryGUI, ilObjCourseGUI, ilObjFolderGUI, ilObjGroupGUI +* @ilCtrl_Calls ilSearchGUI: ilObjStudyProgrammeGUI * @ilCtrl_Calls ilSearchGUI: ilObjRootFolderGUI, ilObjectCopyGUI * * @ingroup ServicesSearch From 77f602d26aecfbf66e9df72e03a1d1f611be799d Mon Sep 17 00:00:00 2001 From: Stefan Meyer Date: Thu, 30 Nov 2023 15:22:30 +0100 Subject: [PATCH 215/497] 0039021: Failed test: Wochenansicht aufrufen --- Services/Calendar/classes/class.ilCalendarUtil.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Calendar/classes/class.ilCalendarUtil.php b/Services/Calendar/classes/class.ilCalendarUtil.php index 0cfae18aa18d..09ea561e638f 100755 --- a/Services/Calendar/classes/class.ilCalendarUtil.php +++ b/Services/Calendar/classes/class.ilCalendarUtil.php @@ -97,7 +97,7 @@ public static function _buildWeekDayList(ilDate $a_day, int $a_weekstart): ilDat $start = clone $a_day; $start_info = $start->get(IL_CAL_FKT_GETDATE, '', 'UTC'); $day_diff = $a_weekstart - $start_info['isoday']; - if ($day_diff == 7) { + if (abs($day_diff) === 7) { $day_diff = 0; } $start->increment(IL_CAL_DAY, $day_diff); From 63b6629a5e7cfe9ea718322f595e007969afd4f7 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 30 Nov 2023 15:42:17 +0100 Subject: [PATCH 216/497] AdvMD: fix sorting in fields table (39191) --- .../classes/class.ilAdvancedMDFieldTableGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldTableGUI.php b/Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldTableGUI.php index 2d2f88017256..ab55a78ded90 100644 --- a/Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldTableGUI.php +++ b/Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldTableGUI.php @@ -55,7 +55,7 @@ public function __construct( $this->addColumn($this->lng->txt('position'), 'position', "5%"); $this->addColumn($this->lng->txt('title'), 'title', "30%"); $this->addColumn($this->lng->txt('md_adv_field_fields'), 'type', "35%"); - $this->addColumn($this->lng->txt('options'), 'obj_types', "30%"); + $this->addColumn($this->lng->txt('options'), 'searchable', "30%"); $this->setFormAction($this->ctrl->getFormAction($a_parent_obj)); $this->setRowTemplate("tpl.edit_fields_row.html", "Services/AdvancedMetaData"); From 77435282a51d0520f16a4252e37be70d1e21de54 Mon Sep 17 00:00:00 2001 From: Fabian Helfer <82493694+fhelfer@users.noreply.github.com> Date: Thu, 30 Nov 2023 09:28:48 +0100 Subject: [PATCH 217/497] T&A Feature #0037744: Question pool titles in tests (#6221) --- Modules/Test/classes/class.ilObjTestGUI.php | 4 +- .../class.ilTestQuestionBrowserTableGUI.php | 27 ++++- .../tables/class.ilTestQuestionsTableGUI.php | 24 +++- ...ionSetSourcePoolDefinitionListTableGUI.php | 32 +++++- .../ilTestQuestionBrowserTableGUITest.php | 2 + .../tables/ilTestQuestionsTableGUITest.php | 2 + ...etSourcePoolDefinitionListTableGUITest.php | 11 +- .../traits/QuestionPoolLinkedTitleBuilder.php | 108 ++++++++++++++++++ 8 files changed, 197 insertions(+), 13 deletions(-) create mode 100644 Modules/Test/traits/QuestionPoolLinkedTitleBuilder.php diff --git a/Modules/Test/classes/class.ilObjTestGUI.php b/Modules/Test/classes/class.ilObjTestGUI.php index 33973d363225..31edc867f8cc 100755 --- a/Modules/Test/classes/class.ilObjTestGUI.php +++ b/Modules/Test/classes/class.ilObjTestGUI.php @@ -524,7 +524,9 @@ public function executeCommand(): void $this->getTestObject(), $ilAccess, $DIC->http(), - $DIC->refinery() + $DIC->refinery(), + $DIC['ui.factory'], + $DIC['ui.renderer'] ); $gui->setWriteAccess($ilAccess->checkAccess("write", "", $this->ref_id)); $gui->init(); diff --git a/Modules/Test/classes/tables/class.ilTestQuestionBrowserTableGUI.php b/Modules/Test/classes/tables/class.ilTestQuestionBrowserTableGUI.php index 8372b6dd5747..8b549e1693d5 100644 --- a/Modules/Test/classes/tables/class.ilTestQuestionBrowserTableGUI.php +++ b/Modules/Test/classes/tables/class.ilTestQuestionBrowserTableGUI.php @@ -18,12 +18,17 @@ * *********************************************************************/ +use ILIAS\UI\Factory as UIFactory; +use ILIAS\UI\Renderer as UIRenderer; +use ILIAS\Modules\Test\QuestionPoolLinkedTitleBuilder; + /** * @author Helmut Schottmüller * @ilCtrl_Calls ilTestQuestionBrowserTableGUI: ilFormPropertyDispatchGUI */ class ilTestQuestionBrowserTableGUI extends ilTable2GUI { + use QuestionPoolLinkedTitleBuilder; private const REPOSITORY_ROOT_NODE_ID = 1; public const CONTEXT_PARAMETER = 'question_browse_context'; @@ -51,6 +56,9 @@ class ilTestQuestionBrowserTableGUI extends ilTable2GUI private ilObjTest $testOBJ; private ilAccessHandler $access; + private UIFactory $ui_factory; + private UIRenderer $ui_renderer; + /** @var array */ private array $filter = []; @@ -65,7 +73,9 @@ public function __construct( ilObjTest $testOBJ, ilAccessHandler $access, ILIAS\HTTP\GlobalHttpState $httpState, - ILIAS\Refinery\Factory $refinery + ILIAS\Refinery\Factory $refinery, + UIFactory $ui_factory, + UIRenderer $ui_renderer ) { $this->ctrl = $ctrl; $this->mainTpl = $mainTpl; @@ -78,6 +88,8 @@ public function __construct( $this->access = $access; $this->httpState = $httpState; $this->refinery = $refinery; + $this->ui_factory = $ui_factory; + $this->ui_renderer = $ui_renderer; $this->setId('qpl_brows_tabl_' . $this->testOBJ->getId()); global $DIC; @@ -440,7 +452,18 @@ public function fillRow(array $a_set): void "QUESTION_UPDATED", ilDatePresentation::formatDate(new ilDate($a_set["tstamp"], IL_CAL_UNIX)) ); - $this->tpl->setVariable("QUESTION_POOL", $a_set['parent_title']); + $this->tpl->setVariable( + "QUESTION_POOL", + $this->buildPossiblyLinkedQuestonPoolTitle( + $this->ctrl, + $this->access, + $this->lng, + $this->ui_factory, + $this->ui_renderer, + (int) $a_set["obj_fi"], + $a_set["parent_title"] + ) + ); } private function buildTestQuestionSetConfig(): ilTestQuestionSetConfig diff --git a/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php b/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php index 22a600978ccc..864c0af766ed 100644 --- a/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php +++ b/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php @@ -16,6 +16,8 @@ * *********************************************************************/ +use ILIAS\Modules\Test\QuestionPoolLinkedTitleBuilder; + /** * * @author Helmut Schottmüller @@ -26,6 +28,7 @@ */ class ilTestQuestionsTableGUI extends ilTable2GUI { + use QuestionPoolLinkedTitleBuilder; private const CLASS_PATH_FOR_QUESTION_EDIT_LINKS = [ilRepositoryGUI::class, ilObjQuestionPoolGUI::class]; /** @@ -60,6 +63,7 @@ class ilTestQuestionsTableGUI extends ilTable2GUI protected \ILIAS\UI\Renderer $renderer; protected \ILIAS\UI\Factory $factory; + private ilAccess $access; public function __construct($a_parent_obj, $a_parent_cmd, $parentRefId) { @@ -67,6 +71,7 @@ public function __construct($a_parent_obj, $a_parent_cmd, $parentRefId) $this->renderer = $DIC->ui()->renderer(); $this->factory = $DIC->ui()->factory(); + $this->access = $DIC['ilAccess']; $this->setId('tst_qst_lst_' . $parentRefId); @@ -220,11 +225,21 @@ public function fillRow(array $a_set): void } } - if (ilObject::_lookupType((int) $a_set["orig_obj_fi"]) == 'qpl') { - $this->tpl->setVariable("QUESTION_POOL", ilObject::_lookupTitle($a_set["orig_obj_fi"])); - } else { - $this->tpl->setVariable("QUESTION_POOL", $this->lng->txt('tst_question_not_from_pool_info')); + if (isset($a_set['orig_obj_fi'])) { + $this->tpl->setVariable( + "QUESTION_POOL", + $this->buildPossiblyLinkedQuestonPoolTitle( + $this->ctrl, + $this->access, + $this->lng, + $this->factory, + $this->renderer, + $a_set["orig_obj_fi"], + ilObject::_lookupTitle($a_set["orig_obj_fi"]) + ) + ); } + $actions = new ilAdvancedSelectionListGUI(); $actions->setId('qst' . $a_set["question_id"]); $actions->setListTitle($this->lng->txt('actions')); @@ -378,7 +393,6 @@ protected function buildObligatoryColumnContent(array $rowData): string $icon = $this->factory->symbol()->icon()->custom( ilUtil::getImagePath("icon_checked.svg"), $this->lng->txt('question_obligatory') - ); return $this->renderer->render($icon); } diff --git a/Modules/Test/classes/tables/class.ilTestRandomQuestionSetSourcePoolDefinitionListTableGUI.php b/Modules/Test/classes/tables/class.ilTestRandomQuestionSetSourcePoolDefinitionListTableGUI.php index ee31178ccdc2..5abad6a61464 100644 --- a/Modules/Test/classes/tables/class.ilTestRandomQuestionSetSourcePoolDefinitionListTableGUI.php +++ b/Modules/Test/classes/tables/class.ilTestRandomQuestionSetSourcePoolDefinitionListTableGUI.php @@ -16,6 +16,10 @@ * *********************************************************************/ +use ILIAS\Modules\Test\QuestionPoolLinkedTitleBuilder; +use ILIAS\UI\Factory as UIFactory; +use ILIAS\UI\Renderer as UIRenderer; + /** * * @author Björn Heyser @@ -25,11 +29,17 @@ */ class ilTestRandomQuestionSetSourcePoolDefinitionListTableGUI extends ilTable2GUI { + use QuestionPoolLinkedTitleBuilder; public const IDENTIFIER = 'tstRndPools'; private bool $definitionEditModeEnabled; private bool $questionAmountColumnEnabled; private bool $showMappedTaxonomyFilter = false; private ?ilTestTaxonomyFilterLabelTranslater $taxonomyLabelTranslater = null; + + private ilAccess $access; + private UIFactory $ui_factory; + private UIRenderer $ui_renderer; + private \ILIAS\Test\InternalRequestService $testrequest; public function __construct(ilCtrl $ctrl, ilLanguage $lng, $parentGUI, $parentCMD) @@ -40,6 +50,9 @@ public function __construct(ilCtrl $ctrl, ilLanguage $lng, $parentGUI, $parentCM $this->lng = $lng; global $DIC; $this->testrequest = $DIC->test()->internal()->request(); + $this->access = $DIC['ilAccess']; + $this->ui_factory = $DIC['ui.factory']; + $this->ui_renderer = $DIC['ui.renderer']; $this->definitionEditModeEnabled = false; $this->questionAmountColumnEnabled = false; } @@ -115,11 +128,22 @@ public function fillRow(array $a_set): void $this->tpl->parseCurrentBlock(); } - $this->tpl->setVariable('SOURCE_POOL_LABEL', $a_set['source_pool_label']); + $this->tpl->setVariable( + 'SOURCE_POOL_LABEL', + $this->buildPossiblyLinkedQuestonPoolTitle( + $this->ctrl, + $this->access, + $this->lng, + $this->ui_factory, + $this->ui_renderer, + $a_set['ref_id'], + $a_set['source_pool_label'], + true + ) + ); // fau: taxFilter/typeFilter - set taxonomy/type filter label in a single coulumn each + $this->tpl->setVariable('TAXONOMY_FILTER', $this->taxonomyLabelTranslater->getTaxonomyFilterLabel($a_set['taxonomy_filter'], '
')); - #$this->tpl->setVariable('FILTER_TAXONOMY', $this->getTaxonomyTreeLabel($set['filter_taxonomy'])); - #$this->tpl->setVariable('FILTER_TAX_NODE', $this->getTaxonomyNodeLabel($set['filter_tax_node'])); $this->tpl->setVariable('LIFECYCLE_FILTER', $this->taxonomyLabelTranslater->getLifecycleFilterLabel($a_set['lifecycle_filter'])); $this->tpl->setVariable('TYPE_FILTER', $this->taxonomyLabelTranslater->getTypeFilterLabel($a_set['type_filter'])); // fau. @@ -291,7 +315,7 @@ public function init(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePool $set['type_filter'] = $sourcePoolDefinition->getTypeFilter(); // fau. $set['question_amount'] = $sourcePoolDefinition->getQuestionAmount(); - + $set['ref_id'] = $sourcePoolDefinition->getPoolRefId(); $rows[] = $set; } diff --git a/Modules/Test/test/tables/ilTestQuestionBrowserTableGUITest.php b/Modules/Test/test/tables/ilTestQuestionBrowserTableGUITest.php index 828f9d691b9f..ecf749716d65 100644 --- a/Modules/Test/test/tables/ilTestQuestionBrowserTableGUITest.php +++ b/Modules/Test/test/tables/ilTestQuestionBrowserTableGUITest.php @@ -79,6 +79,8 @@ protected function setUp(): void new \ILIAS\Data\Factory(), $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock() ), + $this->createMock(ILIAS\UI\Factory::class), + $this->createMock(ILIAS\UI\Renderer::class), ); } diff --git a/Modules/Test/test/tables/ilTestQuestionsTableGUITest.php b/Modules/Test/test/tables/ilTestQuestionsTableGUITest.php index 4b99bb733cf5..0d0467a25856 100644 --- a/Modules/Test/test/tables/ilTestQuestionsTableGUITest.php +++ b/Modules/Test/test/tables/ilTestQuestionsTableGUITest.php @@ -31,6 +31,8 @@ protected function setUp(): void { parent::setUp(); + $this->addGlobal_ilAccess(); + $lng_mock = $this->createMock(ilLanguage::class); $ctrl_mock = $this->createMock(ilCtrl::class); $ctrl_mock->expects($this->any()) diff --git a/Modules/Test/test/tables/ilTestRandomQuestionSetSourcePoolDefinitionListTableGUITest.php b/Modules/Test/test/tables/ilTestRandomQuestionSetSourcePoolDefinitionListTableGUITest.php index 52da6e082abc..07f36963c3b0 100644 --- a/Modules/Test/test/tables/ilTestRandomQuestionSetSourcePoolDefinitionListTableGUITest.php +++ b/Modules/Test/test/tables/ilTestRandomQuestionSetSourcePoolDefinitionListTableGUITest.php @@ -31,6 +31,10 @@ protected function setUp(): void { parent::setUp(); + $this->addGlobal_uiFactory(); + $this->addGlobal_uiRenderer(); + $this->addGlobal_ilAccess(); + $lng_mock = $this->createMock(ilLanguage::class); $ctrl_mock = $this->createMock(ilCtrl::class); $ctrl_mock->expects($this->any()) @@ -54,7 +58,12 @@ protected function setUp(): void $ctrl_mock, $lng_mock, $this->parentObj_mock, - "" + "", + $this->createMock(ilAccess::class), + $this->createMock(ILIAS\UI\Factory::class), + $this->createMock(ILIAS\UI\Renderer::class), + [], + [] ); } diff --git a/Modules/Test/traits/QuestionPoolLinkedTitleBuilder.php b/Modules/Test/traits/QuestionPoolLinkedTitleBuilder.php new file mode 100644 index 000000000000..a51caf55c02a --- /dev/null +++ b/Modules/Test/traits/QuestionPoolLinkedTitleBuilder.php @@ -0,0 +1,108 @@ +getFirstQuestionPoolReferenceWithCurrentUserAccess( + $access, + $reference, + $qpl_id, + ilObject::_getAllReferences($qpl_obj_id) + ); + + if ($qpl_ref_id === null) { + return $title . ' (' . $lng->txt('status_no_permission') . ')'; + } + + return $ui_renderer->render( + $this->getLinkedQuestonPoolTitle($ctrl, $ui_factory, $qpl_ref_id, $title) + ); + } + + private function getLinkedQuestonPoolTitle( + \ilCtrl $ctrl, + UIFactory $ui_factory, + int $qpl_ref_id, + string $title + ): Link { + $ctrl->setParameterByClass(ilObjQuestionPoolGUI::class, 'ref_id', $qpl_ref_id); + $linked_title = $ui_factory->link()->standard( + $title, + $ctrl->getLinkTargetByClass( + [ilObjQuestionPoolGUI::class] + ) + ); + $ctrl->clearParametersByClass(ilObjQuestionPoolGUI::class); + return $linked_title; + } + + private function getFirstQuestionPoolReferenceWithCurrentUserAccess( + \ilAccessHandler $access, + bool $reference, + int $qpl_id, + array $all_qpl_ref_ids + ): ?int { + if ($reference && $access->checkAccess('read', '', $qpl_id)) { + return $qpl_id; + } + + $qpl_references_with_access = array_filter( + array_values($all_qpl_ref_ids), + function ($ref_id) use ($access) { + return $access->checkAccess('read', '', $ref_id); + } + ); + if ($qpl_references_with_access !== []) { + return array_shift($qpl_references_with_access); + } + return null; + } +} From 2e364eba2cfd652d304e573c304af41ac096a2ce Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 30 Nov 2023 17:05:22 +0100 Subject: [PATCH 218/497] AdvMD: fix sorting by scope (21963) --- .../classes/Record/class.ilAdvancedMDRecordTableGUI.php | 2 +- .../classes/class.ilAdvancedMDSettingsGUI.php | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Services/AdvancedMetaData/classes/Record/class.ilAdvancedMDRecordTableGUI.php b/Services/AdvancedMetaData/classes/Record/class.ilAdvancedMDRecordTableGUI.php index 87cd85bc8151..54178c54b0d5 100644 --- a/Services/AdvancedMetaData/classes/Record/class.ilAdvancedMDRecordTableGUI.php +++ b/Services/AdvancedMetaData/classes/Record/class.ilAdvancedMDRecordTableGUI.php @@ -44,7 +44,7 @@ public function __construct( $this->addColumn($this->lng->txt('md_adv_col_presentation_ordering'), 'position'); $this->addColumn($this->lng->txt('title'), 'title'); $this->addColumn($this->lng->txt('md_fields'), 'fields'); - $this->addColumn($this->lng->txt('md_adv_scope'), 'scope'); + $this->addColumn($this->lng->txt('md_adv_scope'), 'first_scope'); $this->addColumn($this->lng->txt('md_obj_types'), 'obj_types'); $this->addColumn($this->lng->txt('md_adv_active'), 'active'); diff --git a/Services/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php b/Services/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php index 354516641214..8881b00e23db 100644 --- a/Services/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php +++ b/Services/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php @@ -2148,6 +2148,12 @@ protected function getParsedRecordObjects(): array $tmp_arr['title'] = $record->getTitle(); $tmp_arr['description'] = $record->getDescription(); $tmp_arr['fields'] = []; + /* + * This is a workaround to fix sorting by scope, see #21963 + */ + $tmp_arr['first_scope'] = ilObject::_lookupTitle( + ilObject::_lookupObjId($record->getScopeRefIds()[0] ?? 0) + ); $tmp_arr['obj_types'] = $record->getAssignedObjectTypes(); foreach ($record->getAssignedObjectTypes() as $idx => $item) { $tmp_arr['obj_types'][$idx]['context'] = null; From 4febb108f1a9e4309103e4053cb679a435d34366 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Fri, 1 Dec 2023 10:31:51 +0100 Subject: [PATCH 219/497] Test: Show Text When Question Not in Pool --- .../tables/class.ilTestQuestionsTableGUI.php | 26 +++++++++++-------- .../traits/QuestionPoolLinkedTitleBuilder.php | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php b/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php index 864c0af766ed..e7c0cdb90e74 100644 --- a/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php +++ b/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php @@ -225,21 +225,25 @@ public function fillRow(array $a_set): void } } + $question_pool_title = $this->lng->txt('tst_question_not_from_pool_info'); + if (isset($a_set['orig_obj_fi'])) { - $this->tpl->setVariable( - "QUESTION_POOL", - $this->buildPossiblyLinkedQuestonPoolTitle( - $this->ctrl, - $this->access, - $this->lng, - $this->factory, - $this->renderer, - $a_set["orig_obj_fi"], - ilObject::_lookupTitle($a_set["orig_obj_fi"]) - ) + $question_pool_title = $this->buildPossiblyLinkedQuestonPoolTitle( + $this->ctrl, + $this->access, + $this->lng, + $this->ui_factory, + $this->ui_renderer, + $a_set["orig_obj_fi"], + ilObject::_lookupTitle($a_set["orig_obj_fi"]) ); } + $this->tpl->setVariable( + "QUESTION_POOL", + $question_pool_title + ); + $actions = new ilAdvancedSelectionListGUI(); $actions->setId('qst' . $a_set["question_id"]); $actions->setListTitle($this->lng->txt('actions')); diff --git a/Modules/Test/traits/QuestionPoolLinkedTitleBuilder.php b/Modules/Test/traits/QuestionPoolLinkedTitleBuilder.php index a51caf55c02a..2053b2788df0 100644 --- a/Modules/Test/traits/QuestionPoolLinkedTitleBuilder.php +++ b/Modules/Test/traits/QuestionPoolLinkedTitleBuilder.php @@ -43,7 +43,7 @@ public function buildPossiblyLinkedQuestonPoolTitle( } if (ilObject::_lookupType($qpl_id, $reference) !== 'qpl') { - return ''; + return $lng->txt('tst_question_not_from_pool_info'); } $qpl_obj_id = $qpl_id; From 6bfdb2c74bd21fdb2da29e1394a9854ef84161f9 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 1 Dec 2023 14:13:26 +0100 Subject: [PATCH 220/497] AdvMD: fix mapping of select options during deletion (39186) --- ...lass.ilAdvancedMDFieldDefinitionSelect.php | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionSelect.php b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionSelect.php index d98df9613492..a3d88858401f 100644 --- a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionSelect.php +++ b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionSelect.php @@ -284,23 +284,24 @@ protected function importNewSelectOptions( if (sizeof($missing)) { $this->confirmed_objects = $this->buildConfirmedObjects($a_form); + $already_confirmed = is_array($this->confirmed_objects); - if (!is_array($this->confirmed_objects)) { - $search = ilADTFactory::getInstance()->getSearchBridgeForDefinitionInstance( - $this->getADTDefinition(), - false, - $multi - ); - foreach ($missing as $missing_idx => $missing_value) { - $in_use = $this->findBySingleValue($search, $missing_idx); - if (is_array($in_use)) { - foreach ($in_use as $item) { - if (array_key_exists($missing_idx, $index_map)) { - $complete_id = $item[0] . "_" . $item[1] . "_" . $item[2]; - $new_index = $index_map[$missing_idx]; - $this->confirmed_objects[$missing_idx][$complete_id] = $new_index; - continue; - } + $search = ilADTFactory::getInstance()->getSearchBridgeForDefinitionInstance( + $this->getADTDefinition(), + false, + $multi + ); + foreach ($missing as $missing_idx => $missing_value) { + $in_use = $this->findBySingleValue($search, $missing_idx); + if (is_array($in_use)) { + foreach ($in_use as $item) { + if (array_key_exists($missing_idx, $index_map)) { + $complete_id = $item[0] . "_" . $item[1] . "_" . $item[2]; + $new_index = $index_map[$missing_idx]; + $this->confirmed_objects[$missing_idx][$complete_id] = $new_index; + continue; + } + if (!$already_confirmed) { $this->confirm_objects[$missing_idx][] = $item; $this->confirm_objects_values[$missing_idx] = $old[$missing_idx]; } From ffcf6a218fa5e3080855c2ec1ee98f77baf7819d Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Fri, 1 Dec 2023 16:27:47 +0100 Subject: [PATCH 221/497] Test: Fix Wrong Class Property Call See: https://mantis.ilias.de/view.php?id=39182 --- Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php b/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php index e7c0cdb90e74..66b7e380cbfd 100644 --- a/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php +++ b/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php @@ -232,8 +232,8 @@ public function fillRow(array $a_set): void $this->ctrl, $this->access, $this->lng, - $this->ui_factory, - $this->ui_renderer, + $this->factory, + $this->renderer, $a_set["orig_obj_fi"], ilObject::_lookupTitle($a_set["orig_obj_fi"]) ); From e68b959ecb8ecd47a4dc6668acc89a7de8dad074 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Sat, 2 Dec 2023 17:34:16 +0100 Subject: [PATCH 222/497] Test: Fix QuestionPool Offline On Parent Clone See: https://mantis.ilias.de/view.php?id=39116 --- .../TestQuestionPool/classes/class.ilObjQuestionPool.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php b/Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php index 33c33c76707c..620ebb5f1c51 100755 --- a/Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php +++ b/Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php @@ -1329,8 +1329,11 @@ public function cloneObject(int $a_target_id, int $a_copy_id = 0, bool $a_omit_t { $newObj = parent::cloneObject($a_target_id, $a_copy_id, $a_omit_tree); - $newObj->setOnline(false); - $newObj->update(); + $cp_options = ilCopyWizardOptions::_getInstance($a_copy_id); + $newObj->setOnline($this->getOnline()); + if ($cp_options->isRootNode($this->getRefId())) { + $newObj->setOnline(0); + } $newObj->setSkillServiceEnabled($this->isSkillServiceEnabled()); $newObj->setShowTaxonomies($this->getShowTaxonomies()); From c901c614910b29d2769d8b3b6b7e04658b401520 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Mon, 4 Dec 2023 10:45:30 +0100 Subject: [PATCH 223/497] AdvMD: fix return type in datetime range search (39232) --- .../Types/DateTime/class.ilADTDateTimeSearchBridgeRange.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/ADT/classes/Types/DateTime/class.ilADTDateTimeSearchBridgeRange.php b/Services/ADT/classes/Types/DateTime/class.ilADTDateTimeSearchBridgeRange.php index 4927047de147..8309af7cf210 100644 --- a/Services/ADT/classes/Types/DateTime/class.ilADTDateTimeSearchBridgeRange.php +++ b/Services/ADT/classes/Types/DateTime/class.ilADTDateTimeSearchBridgeRange.php @@ -171,11 +171,11 @@ public function isInCondition(ilADT $a_adt): bool assert($a_adt instanceof ilADTDateTime); if (!$this->getLowerADT()->isNull() && !$this->getUpperADT()->isNull()) { - return $a_adt->isInbetweenOrEqual($this->getLowerADT(), $this->getUpperADT()); + return (bool) $a_adt->isInbetweenOrEqual($this->getLowerADT(), $this->getUpperADT()); } elseif (!$this->getLowerADT()->isNull()) { - return $a_adt->isLargerOrEqual($this->getLowerADT()); + return (bool) $a_adt->isLargerOrEqual($this->getLowerADT()); } else { - return $a_adt->isSmallerOrEqual($this->getUpperADT()); + return (bool) $a_adt->isSmallerOrEqual($this->getUpperADT()); } } From 3fde68eb56ed56bfae7e99e88755bc278ccf889a Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 30 Nov 2023 12:52:59 +0100 Subject: [PATCH 224/497] StudyProgramme: fix internal links in custom md (28060) --- .../classes/class.ilObjStudyProgrammeGUI.php | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Modules/StudyProgramme/classes/class.ilObjStudyProgrammeGUI.php b/Modules/StudyProgramme/classes/class.ilObjStudyProgrammeGUI.php index cc8de0366556..01136599bf1c 100644 --- a/Modules/StudyProgramme/classes/class.ilObjStudyProgrammeGUI.php +++ b/Modules/StudyProgramme/classes/class.ilObjStudyProgrammeGUI.php @@ -36,6 +36,7 @@ * @ilCtrl_Calls ilObjStudyProgrammeGUI: ilObjectTranslationGUI * @ilCtrl_Calls ilObjStudyProgrammeGUI: ilCertificateGUI * @ilCtrl_Calls ilObjStudyProgrammeGUI: ilObjStudyProgrammeAutoCategoriesGUI + * @ilCtrl_Calls ilObjStudyProgrammeGUI: ilPropertyFormGUI */ class ilObjStudyProgrammeGUI extends ilContainerGUI { @@ -229,7 +230,24 @@ public function executeCommand(): void $output_gui = $guiFactory->create($this->object); $this->ctrl->forwardCommand($output_gui); break; - + case strtolower(ilPropertyFormGUI::class): + /* + * Only used for async loading of the repository tree in custom md + * internal links (see #28060, #37974). This is necessary since StudyProgrammes don't + * use ilObjectMetaDataGUI. + */ + $form = $this->initAdvancedSettingsForm(); + $gui = new ilAdvancedMDRecordGUI( + ilAdvancedMDRecordGUI::MODE_EDITOR, + 'prg', + $this->object->getId(), + 'prg_type', + $this->object->getSettings()->getTypeSettings()->getTypeId() + ); + $gui->setPropertyForm($form); + $gui->parse(); + $this->ctrl->forwardCommand($form); + break; case false: $this->getSubTabs($cmd); switch ($cmd) { From a6f48eb397acc3616082656040e2b4abf4fbae09 Mon Sep 17 00:00:00 2001 From: iszmais Date: Tue, 5 Dec 2023 10:18:10 +0100 Subject: [PATCH 225/497] Restore mail notifcation setting --- Services/Notifications/ROADMAP.md | 3 ++- .../classes/Setup/ilNotificationUpdateSteps.php | 9 +++++++++ .../classes/class.ilObjNotificationAdminGUI.php | 9 ++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Services/Notifications/ROADMAP.md b/Services/Notifications/ROADMAP.md index 38185f5fe319..329e4588de89 100644 --- a/Services/Notifications/ROADMAP.md +++ b/Services/Notifications/ROADMAP.md @@ -2,7 +2,8 @@ ## Short Term -### Refactoring +Atm the notification mail channel is always acitvated and not configurable via UI. +It should have its own checkbox within the notification administration. #### Update of Toast Interface diff --git a/Services/Notifications/classes/Setup/ilNotificationUpdateSteps.php b/Services/Notifications/classes/Setup/ilNotificationUpdateSteps.php index 249948b241b7..0504d88f114b 100644 --- a/Services/Notifications/classes/Setup/ilNotificationUpdateSteps.php +++ b/Services/Notifications/classes/Setup/ilNotificationUpdateSteps.php @@ -182,4 +182,13 @@ public function step_10(): void $this->db->manipulate('TRUNCATE TABLE notification_osd'); } + + public function step_11(): void + { + $this->db->insert('settings', [ + 'module' => ['text', 'notifications'], + 'keyword' => ['text', 'enable_mail'], + 'value' => ['text', '1'] + ]); + } } diff --git a/Services/Notifications/classes/class.ilObjNotificationAdminGUI.php b/Services/Notifications/classes/class.ilObjNotificationAdminGUI.php index db3877ae9473..afa35e9e7f67 100644 --- a/Services/Notifications/classes/class.ilObjNotificationAdminGUI.php +++ b/Services/Notifications/classes/class.ilObjNotificationAdminGUI.php @@ -1,7 +1,5 @@ notifications()->system()->clear('osd'); - $settings->deleteAll(); $settings->set('enable_osd', '0'); + $settings->delete('osd_interval'); + $settings->delete('osd_vanish'); + $settings->delete('osd_delay'); + $settings->delete('osd_play_sound'); } else { $settings->set('enable_osd', '1'); $settings->set('osd_interval', ((string) $data['osd']['enable_osd']['osd_interval'])); From 7763050455233977692b1c336b1ed3d8bbdd91f1 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Tue, 5 Dec 2023 11:51:50 +0100 Subject: [PATCH 226/497] AdvMD: allow empty max lenght for text fields (39269) --- .../class.ilADTLocalizedTextDefinition.php | 4 ++-- .../class.ilAdvancedMDFieldDefinitionText.php | 23 +++++-------------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/Services/ADT/classes/Types/LocalizedText/class.ilADTLocalizedTextDefinition.php b/Services/ADT/classes/Types/LocalizedText/class.ilADTLocalizedTextDefinition.php index 8afe5de4322f..5c2942d7616d 100644 --- a/Services/ADT/classes/Types/LocalizedText/class.ilADTLocalizedTextDefinition.php +++ b/Services/ADT/classes/Types/LocalizedText/class.ilADTLocalizedTextDefinition.php @@ -14,14 +14,14 @@ class ilADTLocalizedTextDefinition extends ilADTDefinition */ private array $active_languages = []; private string $default_language = ''; - private int $max_length; + private ?int $max_length; public function getMaxLength(): ?int { return $this->max_length; } - public function setMaxLength(int $max_length): void + public function setMaxLength(?int $max_length): void { $this->max_length = $max_length; } diff --git a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php index b98922f49b00..3789a1bf1fc8 100644 --- a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php +++ b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php @@ -28,8 +28,8 @@ class ilAdvancedMDFieldDefinitionText extends ilAdvancedMDFieldDefinitionGroupBa public const XML_SEPARATOR_TRANSLATIONS = "~|~"; public const XML_SEPARATOR_TRANSLATION = '~+~'; - protected int $max_length = 0; - protected $multi = false; + protected ?int $max_length = null; + protected bool $multi = false; // // generic types @@ -64,7 +64,7 @@ protected function initADTDefinition(): ilADTDefinition $field_translations = ilAdvancedMDFieldTranslations::getInstanceByRecordId($this->getRecordId()); $definition = ilADTFactory::getInstance()->getDefinitionInstanceByType(ilADTFactory::TYPE_LOCALIZED_TEXT); - $definition->setMaxLength($this->getMaxLength() ?? 0); + $definition->setMaxLength($this->getMaxLength()); $definition->setActiveLanguages($field_translations->getActivatedLanguages($this->getFieldId(), true)); $definition->setDefaultLanguage($field_translations->getDefaultLanguage()); return $definition; @@ -75,23 +75,12 @@ protected function initADTDefinition(): ilADTDefinition // properties // - /** - * Set max length - * @param int $a_value - */ - public function setMaxLength($a_value) + public function setMaxLength(?int $max_length) { - if ($a_value !== null) { - $a_value = (int) $a_value; - } - $this->max_length = (int) $a_value; + $this->max_length = $max_length; } - /** - * Get max length - * @return int - */ - public function getMaxLength() + public function getMaxLength(): ?int { return $this->max_length; } From 25c760df3bd89d294f2c47989ac0728cbfcc6cb7 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Tue, 5 Dec 2023 12:05:00 +0100 Subject: [PATCH 227/497] AdvMD: fix creating text field with max length --- .../Types/class.ilAdvancedMDFieldDefinitionText.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php index 3789a1bf1fc8..f41b54862784 100644 --- a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php +++ b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php @@ -110,7 +110,7 @@ public function isMulti() protected function importFieldDefinition(array $a_def): void { - $this->setMaxLength($a_def["max"] ?? null); + $this->setMaxLength(isset($a_def["max"]) ? (int) $a_def["max"] : null); $this->setMulti($a_def["multi"]); } @@ -182,8 +182,7 @@ protected function addCustomFieldToDefinitionForm( public function importCustomDefinitionFormPostValues(ilPropertyFormGUI $a_form, string $language = ''): void { $max = $a_form->getInput("max"); - $this->setMaxLength(($max !== "") ? $max : null); - + $this->setMaxLength(($max !== "") ? (int) $max : null); $this->setMulti($a_form->getInput("multi")); } @@ -200,7 +199,7 @@ protected function addPropertiesToXML(ilXmlWriter $a_writer): void public function importXMLProperty(string $a_key, string $a_value): void { if ($a_key == "max") { - $this->setMaxLength($a_value != "" ? $a_value : null); + $this->setMaxLength($a_value != "" ? (int) $a_value : null); } if ($a_key == "multi") { $this->setMulti($a_value != "" ? $a_value : null); From b2040a53a0b5e6f5a07d2a07f242bad3a30fa325 Mon Sep 17 00:00:00 2001 From: mjansen Date: Tue, 5 Dec 2023 12:30:42 +0100 Subject: [PATCH 228/497] Notifications: Fix update step if data exists --- .../classes/Setup/ilNotificationUpdateSteps.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Services/Notifications/classes/Setup/ilNotificationUpdateSteps.php b/Services/Notifications/classes/Setup/ilNotificationUpdateSteps.php index 0504d88f114b..28bc0866b19c 100644 --- a/Services/Notifications/classes/Setup/ilNotificationUpdateSteps.php +++ b/Services/Notifications/classes/Setup/ilNotificationUpdateSteps.php @@ -185,6 +185,11 @@ public function step_10(): void public function step_11(): void { + $this->db->manipulateF( + 'DELETE FROM settings WHERE module = %s AND keyword = %s', + ['text', 'text'], + ['notifications', 'enable_mail'] + ); $this->db->insert('settings', [ 'module' => ['text', 'notifications'], 'keyword' => ['text', 'enable_mail'], From fbaea96c6140fd2977a8f0fdcfce6bad1ffc237c Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Tue, 5 Dec 2023 12:58:49 +0100 Subject: [PATCH 229/497] AdvMD: re-fix max length --- .../classes/Types/class.ilAdvancedMDFieldDefinitionText.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php index f41b54862784..414d779a0232 100644 --- a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php +++ b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionText.php @@ -182,7 +182,7 @@ protected function addCustomFieldToDefinitionForm( public function importCustomDefinitionFormPostValues(ilPropertyFormGUI $a_form, string $language = ''): void { $max = $a_form->getInput("max"); - $this->setMaxLength(($max !== "") ? (int) $max : null); + $this->setMaxLength(($max !== "" && $max !== null) ? (int) $max : null); $this->setMulti($a_form->getInput("multi")); } From 9ff82f936645bbc139666ac80b5e51e8631b633c Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Tue, 5 Dec 2023 14:56:14 +0100 Subject: [PATCH 230/497] [FIX] several issues during migration --- .../classes/Setup/class.ilFileObjectToStorageMigration.php | 3 +++ .../Setup/class.ilFileObjectToStorageMigrationRunner.php | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Modules/File/classes/Setup/class.ilFileObjectToStorageMigration.php b/Modules/File/classes/Setup/class.ilFileObjectToStorageMigration.php index da6de0ee9ee8..4a23d187d1ad 100644 --- a/Modules/File/classes/Setup/class.ilFileObjectToStorageMigration.php +++ b/Modules/File/classes/Setup/class.ilFileObjectToStorageMigration.php @@ -71,6 +71,9 @@ public function prepare(Environment $environment): void $irss_helper ); + global $DIC; + $DIC['ilDB'] = $irss_helper->getDatabase(); // needed inside some method calls to ILIAS + $storage_configuration = new LocalConfig($irss_helper->getClientDataDir()); $f = new FlySystemFilesystemFactory(); diff --git a/Modules/File/classes/Setup/class.ilFileObjectToStorageMigrationRunner.php b/Modules/File/classes/Setup/class.ilFileObjectToStorageMigrationRunner.php index a5d3a954520a..c54d38f5faf3 100644 --- a/Modules/File/classes/Setup/class.ilFileObjectToStorageMigrationRunner.php +++ b/Modules/File/classes/Setup/class.ilFileObjectToStorageMigrationRunner.php @@ -37,7 +37,7 @@ class ilFileObjectToStorageMigrationRunner { - protected string $movement_implementation; + protected string $movement_implementation = ''; protected ConsumerFactory $consumer_factory; protected Manager $storage_manager; From d3664f23a0150d3209f8041cf49e9da7a70ed72b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 18:23:55 +0000 Subject: [PATCH 231/497] Bump phpseclib/phpseclib from 3.0.33 to 3.0.34 Bumps [phpseclib/phpseclib](https://github.com/phpseclib/phpseclib) from 3.0.33 to 3.0.34. - [Release notes](https://github.com/phpseclib/phpseclib/releases) - [Changelog](https://github.com/phpseclib/phpseclib/blob/master/CHANGELOG.md) - [Commits](https://github.com/phpseclib/phpseclib/compare/3.0.33...3.0.34) --- updated-dependencies: - dependency-name: phpseclib/phpseclib dependency-type: indirect ... Signed-off-by: dependabot[bot] --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index bc06ed0721b0..22425c721f7f 100644 --- a/composer.lock +++ b/composer.lock @@ -1913,16 +1913,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.33", + "version": "3.0.34", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "33fa69b2514a61138dd48e7a49f99445711e0ad0" + "reference": "56c79f16a6ae17e42089c06a2144467acc35348a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/33fa69b2514a61138dd48e7a49f99445711e0ad0", - "reference": "33fa69b2514a61138dd48e7a49f99445711e0ad0", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/56c79f16a6ae17e42089c06a2144467acc35348a", + "reference": "56c79f16a6ae17e42089c06a2144467acc35348a", "shasum": "" }, "require": { @@ -2003,7 +2003,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.33" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.34" }, "funding": [ { @@ -2019,7 +2019,7 @@ "type": "tidelift" } ], - "time": "2023-10-21T14:00:39+00:00" + "time": "2023-11-27T11:13:31+00:00" }, { "name": "pimple/pimple", @@ -10605,5 +10605,5 @@ "ext-xml": "*" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From f9e0c893114ef63169948fc7df99ee8254d70423 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Tue, 5 Dec 2023 15:05:27 +0100 Subject: [PATCH 232/497] Init: 38903, check for parameter --- Services/Init/classes/class.ilInitialisation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Init/classes/class.ilInitialisation.php b/Services/Init/classes/class.ilInitialisation.php index 771d86e646cd..c08db2c1e513 100644 --- a/Services/Init/classes/class.ilInitialisation.php +++ b/Services/Init/classes/class.ilInitialisation.php @@ -1734,7 +1734,7 @@ protected static function translateMessage(string $a_message_id, array $a_messag $lang = "en"; if ($ilUser) { $lang = $ilUser->getLanguage(); - } elseif ($_REQUEST["lang"]) { + } elseif (isset($_REQUEST["lang"])) { $lang = (string) $_REQUEST["lang"]; } elseif ($ilSetting) { $lang = $ilSetting->get("language", ''); From 0134745be19caacfe455e267f472d0f127df3c47 Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Tue, 28 Nov 2023 17:13:40 +0100 Subject: [PATCH 233/497] Update composer.lock after release v8.7 --- composer.lock | 304 +++++++++++++++++++++++++------------------------- 1 file changed, 151 insertions(+), 153 deletions(-) diff --git a/composer.lock b/composer.lock index 22425c721f7f..d68e26334fbc 100644 --- a/composer.lock +++ b/composer.lock @@ -157,20 +157,20 @@ }, { "name": "ezyang/htmlpurifier", - "version": "v4.16.0", + "version": "v4.17.0", "source": { "type": "git", "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8" + "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8", - "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/bbc513d79acf6691fa9cf10f192c90dd2957f18c", + "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c", "shasum": "" }, "require": { - "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" }, "require-dev": { "cerdic/css-tidy": "^1.7 || ^2.0", @@ -212,22 +212,22 @@ ], "support": { "issues": "https://github.com/ezyang/htmlpurifier/issues", - "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0" + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.17.0" }, - "time": "2022-09-18T07:06:19+00:00" + "time": "2023-11-17T15:01:25+00:00" }, { "name": "filp/whoops", - "version": "2.15.3", + "version": "2.15.4", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "c83e88a30524f9360b11f585f71e6b17313b7187" + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/c83e88a30524f9360b11f585f71e6b17313b7187", - "reference": "c83e88a30524f9360b11f585f71e6b17313b7187", + "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", "shasum": "" }, "require": { @@ -277,7 +277,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.15.3" + "source": "https://github.com/filp/whoops/tree/2.15.4" }, "funding": [ { @@ -285,7 +285,7 @@ "type": "github" } ], - "time": "2023-07-13T12:00:00+00:00" + "time": "2023-11-03T12:00:00+00:00" }, { "name": "geshi/geshi", @@ -1320,16 +1320,16 @@ }, { "name": "monolog/monolog", - "version": "2.9.1", + "version": "2.9.2", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1" + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f259e2b15fb95494c83f52d3caad003bbf5ffaa1", - "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", "shasum": "" }, "require": { @@ -1406,7 +1406,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.9.1" + "source": "https://github.com/Seldaek/monolog/tree/2.9.2" }, "funding": [ { @@ -1418,7 +1418,7 @@ "type": "tidelift" } ], - "time": "2023-02-06T13:44:46+00:00" + "time": "2023-10-27T15:25:26+00:00" }, { "name": "myclabs/php-enum", @@ -1728,16 +1728,16 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.8.1", + "version": "v6.9.1", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "e88da8d679acc3824ff231fdc553565b802ac016" + "reference": "039de174cd9c17a8389754d3b877a2ed22743e18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e88da8d679acc3824ff231fdc553565b802ac016", - "reference": "e88da8d679acc3824ff231fdc553565b802ac016", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18", + "reference": "039de174cd9c17a8389754d3b877a2ed22743e18", "shasum": "" }, "require": { @@ -1757,6 +1757,7 @@ "yoast/phpunit-polyfills": "^1.0.4" }, "suggest": { + "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", "ext-openssl": "Needed for secure SMTP sending and DKIM signing", "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", @@ -1796,7 +1797,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.8.1" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1" }, "funding": [ { @@ -1804,7 +1805,7 @@ "type": "github" } ], - "time": "2023-08-29T08:26:30+00:00" + "time": "2023-11-25T22:23:28+00:00" }, { "name": "phpoffice/phpspreadsheet", @@ -2670,16 +2671,16 @@ }, { "name": "sabre/dav", - "version": "4.4.0", + "version": "4.5.1", "source": { "type": "git", "url": "https://github.com/sabre-io/dav.git", - "reference": "b65362abc926520eda2c57e219f022a6c288069d" + "reference": "b29899b675371aee73920165d1dc5a2235aa104b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/dav/zipball/b65362abc926520eda2c57e219f022a6c288069d", - "reference": "b65362abc926520eda2c57e219f022a6c288069d", + "url": "https://api.github.com/repos/sabre-io/dav/zipball/b29899b675371aee73920165d1dc5a2235aa104b", + "reference": "b29899b675371aee73920165d1dc5a2235aa104b", "shasum": "" }, "require": { @@ -2702,11 +2703,11 @@ "sabre/xml": "^2.0.1" }, "require-dev": { - "evert/phpdoc-md": "~0.1.0", - "friendsofphp/php-cs-fixer": "^2.17.1", - "monolog/monolog": "^1.18", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + "friendsofphp/php-cs-fixer": "^2.19", + "monolog/monolog": "^1.27", + "phpstan/phpstan": "^0.12 || ^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6" }, "suggest": { "ext-curl": "*", @@ -2720,10 +2721,7 @@ "type": "library", "autoload": { "psr-4": { - "Sabre\\DAV\\": "lib/DAV/", - "Sabre\\CalDAV\\": "lib/CalDAV/", - "Sabre\\DAVACL\\": "lib/DAVACL/", - "Sabre\\CardDAV\\": "lib/CardDAV/" + "Sabre\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2752,7 +2750,7 @@ "issues": "https://github.com/sabre-io/dav/issues", "source": "https://github.com/fruux/sabre-dav" }, - "time": "2022-06-27T09:07:55+00:00" + "time": "2023-11-23T04:33:31+00:00" }, { "name": "sabre/event", @@ -2945,16 +2943,16 @@ }, { "name": "sabre/vobject", - "version": "4.5.3", + "version": "4.5.4", "source": { "type": "git", "url": "https://github.com/sabre-io/vobject.git", - "reference": "fe6d9183154ed6f2f913f2b568d3d51d8ae9b308" + "reference": "a6d53a3e5bec85ed3dd78868b7de0f5b4e12f772" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/vobject/zipball/fe6d9183154ed6f2f913f2b568d3d51d8ae9b308", - "reference": "fe6d9183154ed6f2f913f2b568d3d51d8ae9b308", + "url": "https://api.github.com/repos/sabre-io/vobject/zipball/a6d53a3e5bec85ed3dd78868b7de0f5b4e12f772", + "reference": "a6d53a3e5bec85ed3dd78868b7de0f5b4e12f772", "shasum": "" }, "require": { @@ -3045,7 +3043,7 @@ "issues": "https://github.com/sabre-io/vobject/issues", "source": "https://github.com/fruux/sabre-vobject" }, - "time": "2023-01-22T12:21:50+00:00" + "time": "2023-11-09T12:54:37+00:00" }, { "name": "sabre/xml", @@ -4771,16 +4769,16 @@ }, { "name": "simplesamlphp/simplesamlphp-module-smartattributes", - "version": "v0.9.2", + "version": "v0.9.3", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-module-smartattributes.git", - "reference": "ba6a32fa287db0f8d767104471176f70fad7f0e1" + "reference": "a6eb6d506c16760c38df08f6b6a8c6231b42d42e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-smartattributes/zipball/ba6a32fa287db0f8d767104471176f70fad7f0e1", - "reference": "ba6a32fa287db0f8d767104471176f70fad7f0e1", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-smartattributes/zipball/a6eb6d506c16760c38df08f6b6a8c6231b42d42e", + "reference": "a6eb6d506c16760c38df08f6b6a8c6231b42d42e", "shasum": "" }, "require": { @@ -4816,7 +4814,7 @@ "issues": "https://github.com/tvdijen/simplesamlphp-module-smartattributes/issues", "source": "https://github.com/tvdijen/simplesamlphp-module-smartattributes" }, - "time": "2022-01-06T23:42:07+00:00" + "time": "2023-10-30T11:45:00+00:00" }, { "name": "simplesamlphp/simplesamlphp-module-sqlauth", @@ -5065,16 +5063,16 @@ }, { "name": "symfony/cache", - "version": "v5.4.29", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "e29c5a97bc2d81269973c3e1d7ceb9d48b4d5151" + "reference": "9c0a3a5d0718e51ff81e0605be38fe1acbee9eeb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/e29c5a97bc2d81269973c3e1d7ceb9d48b4d5151", - "reference": "e29c5a97bc2d81269973c3e1d7ceb9d48b4d5151", + "url": "https://api.github.com/repos/symfony/cache/zipball/9c0a3a5d0718e51ff81e0605be38fe1acbee9eeb", + "reference": "9c0a3a5d0718e51ff81e0605be38fe1acbee9eeb", "shasum": "" }, "require": { @@ -5102,7 +5100,7 @@ "require-dev": { "cache/integration-tests": "dev-master", "doctrine/cache": "^1.6|^2.0", - "doctrine/dbal": "^2.13.1|^3.0", + "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1", "psr/simple-cache": "^1.0|^2.0", "symfony/config": "^4.4|^5.0|^6.0", @@ -5142,7 +5140,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.29" + "source": "https://github.com/symfony/cache/tree/v5.4.31" }, "funding": [ { @@ -5158,7 +5156,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T13:25:51+00:00" + "time": "2023-11-06T17:37:55+00:00" }, { "name": "symfony/cache-contracts", @@ -5241,16 +5239,16 @@ }, { "name": "symfony/config", - "version": "v5.4.26", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "8109892f27beed9252bd1f1c1880aeb4ad842650" + "reference": "dd5ea39de228813aba0c23c3a4153da2a4cf3cd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/8109892f27beed9252bd1f1c1880aeb4ad842650", - "reference": "8109892f27beed9252bd1f1c1880aeb4ad842650", + "url": "https://api.github.com/repos/symfony/config/zipball/dd5ea39de228813aba0c23c3a4153da2a4cf3cd9", + "reference": "dd5ea39de228813aba0c23c3a4153da2a4cf3cd9", "shasum": "" }, "require": { @@ -5300,7 +5298,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.4.26" + "source": "https://github.com/symfony/config/tree/v5.4.31" }, "funding": [ { @@ -5316,20 +5314,20 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:21:11+00:00" + "time": "2023-11-09T08:22:43+00:00" }, { "name": "symfony/console", - "version": "v5.4.28", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827" + "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827", + "url": "https://api.github.com/repos/symfony/console/zipball/11ac5f154e0e5c4c77af83ad11ead9165280b92a", + "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a", "shasum": "" }, "require": { @@ -5399,7 +5397,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.28" + "source": "https://github.com/symfony/console/tree/v5.4.31" }, "funding": [ { @@ -5415,20 +5413,20 @@ "type": "tidelift" } ], - "time": "2023-08-07T06:12:30+00:00" + "time": "2023-10-31T07:58:33+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.29", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "338638ed8c9d5c7fcb136a73f5c7043465ae2f05" + "reference": "eb1bcafa54e00ed218e1b733b8b6ad1c9ff83d20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/338638ed8c9d5c7fcb136a73f5c7043465ae2f05", - "reference": "338638ed8c9d5c7fcb136a73f5c7043465ae2f05", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/eb1bcafa54e00ed218e1b733b8b6ad1c9ff83d20", + "reference": "eb1bcafa54e00ed218e1b733b8b6ad1c9ff83d20", "shasum": "" }, "require": { @@ -5488,7 +5486,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.4.29" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.31" }, "funding": [ { @@ -5504,7 +5502,7 @@ "type": "tidelift" } ], - "time": "2023-09-20T06:23:43+00:00" + "time": "2023-10-31T07:58:33+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5937,16 +5935,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v5.4.29", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "63e4ad1386fd4f31a005d751cd4dc016f9f2346e" + "reference": "4eeac66c8b0f2793324e94cfc6ac1c8bc5b92960" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/63e4ad1386fd4f31a005d751cd4dc016f9f2346e", - "reference": "63e4ad1386fd4f31a005d751cd4dc016f9f2346e", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/4eeac66c8b0f2793324e94cfc6ac1c8bc5b92960", + "reference": "4eeac66c8b0f2793324e94cfc6ac1c8bc5b92960", "shasum": "" }, "require": { @@ -6067,7 +6065,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.4.29" + "source": "https://github.com/symfony/framework-bundle/tree/v5.4.31" }, "funding": [ { @@ -6083,20 +6081,20 @@ "type": "tidelift" } ], - "time": "2023-09-27T13:49:58+00:00" + "time": "2023-10-31T07:58:33+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.28", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "365992c83a836dfe635f1e903ccca43ee03d3dd2" + "reference": "f84fd4fd8311a541ceb2ae3f257841d002450a90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/365992c83a836dfe635f1e903ccca43ee03d3dd2", - "reference": "365992c83a836dfe635f1e903ccca43ee03d3dd2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f84fd4fd8311a541ceb2ae3f257841d002450a90", + "reference": "f84fd4fd8311a541ceb2ae3f257841d002450a90", "shasum": "" }, "require": { @@ -6143,7 +6141,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.28" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.31" }, "funding": [ { @@ -6159,20 +6157,20 @@ "type": "tidelift" } ], - "time": "2023-08-21T07:23:18+00:00" + "time": "2023-11-06T22:05:57+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.29", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f53265fc6bd2a7f3a4ed4e443b76e750348ac3f7" + "reference": "d2fad58d32a7b4864d205a7289602a27ce75018c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f53265fc6bd2a7f3a4ed4e443b76e750348ac3f7", - "reference": "f53265fc6bd2a7f3a4ed4e443b76e750348ac3f7", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d2fad58d32a7b4864d205a7289602a27ce75018c", + "reference": "d2fad58d32a7b4864d205a7289602a27ce75018c", "shasum": "" }, "require": { @@ -6255,7 +6253,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.29" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.31" }, "funding": [ { @@ -6271,7 +6269,7 @@ "type": "tidelift" } ], - "time": "2023-09-30T06:31:17+00:00" + "time": "2023-11-10T13:39:09+00:00" }, { "name": "symfony/polyfill-ctype", @@ -7095,16 +7093,16 @@ }, { "name": "symfony/string", - "version": "v5.4.29", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "e41bdc93def20eaf3bfc1537c4e0a2b0680a152d" + "reference": "2765096c03f39ddf54f6af532166e42aaa05b24b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/e41bdc93def20eaf3bfc1537c4e0a2b0680a152d", - "reference": "e41bdc93def20eaf3bfc1537c4e0a2b0680a152d", + "url": "https://api.github.com/repos/symfony/string/zipball/2765096c03f39ddf54f6af532166e42aaa05b24b", + "reference": "2765096c03f39ddf54f6af532166e42aaa05b24b", "shasum": "" }, "require": { @@ -7161,7 +7159,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.29" + "source": "https://github.com/symfony/string/tree/v5.4.31" }, "funding": [ { @@ -7177,7 +7175,7 @@ "type": "tidelift" } ], - "time": "2023-09-13T11:47:41+00:00" + "time": "2023-11-09T08:19:44+00:00" }, { "name": "symfony/var-dumper", @@ -7343,16 +7341,16 @@ }, { "name": "symfony/yaml", - "version": "v5.4.23", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" + "reference": "f387675d7f5fc4231f7554baa70681f222f73563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", - "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "url": "https://api.github.com/repos/symfony/yaml/zipball/f387675d7f5fc4231f7554baa70681f222f73563", + "reference": "f387675d7f5fc4231f7554baa70681f222f73563", "shasum": "" }, "require": { @@ -7398,7 +7396,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.23" + "source": "https://github.com/symfony/yaml/tree/v5.4.31" }, "funding": [ { @@ -7414,7 +7412,7 @@ "type": "tidelift" } ], - "time": "2023-04-23T19:33:36+00:00" + "time": "2023-11-03T14:41:28+00:00" }, { "name": "technosophos/libris", @@ -7598,16 +7596,16 @@ }, { "name": "twig/twig", - "version": "v2.15.5", + "version": "v2.15.6", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e" + "reference": "ad637405a828601a56f32ccab9a85541c4b66c9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/fc02a6af3eeb97c4bf5650debc76c2eda85ac22e", - "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/ad637405a828601a56f32ccab9a85541c4b66c9d", + "reference": "ad637405a828601a56f32ccab9a85541c4b66c9d", "shasum": "" }, "require": { @@ -7618,7 +7616,7 @@ }, "require-dev": { "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "symfony/phpunit-bridge": "^5.4.9|^6.3" }, "type": "library", "extra": { @@ -7662,7 +7660,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.15.5" + "source": "https://github.com/twigphp/Twig/tree/v2.15.6" }, "funding": [ { @@ -7674,7 +7672,7 @@ "type": "tidelift" } ], - "time": "2023-05-03T17:49:41+00:00" + "time": "2023-11-21T17:34:48+00:00" }, { "name": "webmozart/assert", @@ -7786,16 +7784,16 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.18.2", + "version": "5.18.3", "source": { "type": "git", "url": "https://github.com/captainhookphp/captainhook.git", - "reference": "61c24442f71ea216e9e172861d48d7676439dd18" + "reference": "b7bc503a40ccfe80ea9638e4921b4697669d725f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/61c24442f71ea216e9e172861d48d7676439dd18", - "reference": "61c24442f71ea216e9e172861d48d7676439dd18", + "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/b7bc503a40ccfe80ea9638e4921b4697669d725f", + "reference": "b7bc503a40ccfe80ea9638e4921b4697669d725f", "shasum": "" }, "require": { @@ -7857,7 +7855,7 @@ ], "support": { "issues": "https://github.com/captainhookphp/captainhook/issues", - "source": "https://github.com/captainhookphp/captainhook/tree/5.18.2" + "source": "https://github.com/captainhookphp/captainhook/tree/5.18.3" }, "funding": [ { @@ -7865,7 +7863,7 @@ "type": "github" } ], - "time": "2023-10-16T15:13:42+00:00" + "time": "2023-11-05T13:56:19+00:00" }, { "name": "composer/pcre", @@ -8157,50 +8155,50 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.35.1", + "version": "v3.40.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "ec1ccc264994b6764882669973ca435cf05bab08" + "reference": "27d2b3265b5d550ec411b4319967ae7cfddfb2e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/ec1ccc264994b6764882669973ca435cf05bab08", - "reference": "ec1ccc264994b6764882669973ca435cf05bab08", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/27d2b3265b5d550ec411b4319967ae7cfddfb2e0", + "reference": "27d2b3265b5d550ec411b4319967ae7cfddfb2e0", "shasum": "" }, "require": { - "composer/semver": "^3.3", + "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.3", "ext-json": "*", "ext-tokenizer": "*", "php": "^7.4 || ^8.0", "sebastian/diff": "^4.0 || ^5.0", - "symfony/console": "^5.4 || ^6.0", - "symfony/event-dispatcher": "^5.4 || ^6.0", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/options-resolver": "^5.4 || ^6.0", - "symfony/polyfill-mbstring": "^1.27", - "symfony/polyfill-php80": "^1.27", - "symfony/polyfill-php81": "^1.27", - "symfony/process": "^5.4 || ^6.0", - "symfony/stopwatch": "^5.4 || ^6.0" + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { "facile-it/paraunit": "^1.3 || ^2.0", "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^2.0", + "keradus/cli-executor": "^2.1", "mikey179/vfsstream": "^1.6.11", - "php-coveralls/php-coveralls": "^2.5.3", + "php-coveralls/php-coveralls": "^2.7", "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy": "^1.16", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", + "phpspec/prophecy": "^1.17", "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "symfony/phpunit-bridge": "^6.2.3", - "symfony/yaml": "^5.4 || ^6.0" + "phpunit/phpunit": "^9.6", + "symfony/phpunit-bridge": "^6.3.8 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -8238,7 +8236,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.35.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.40.0" }, "funding": [ { @@ -8246,7 +8244,7 @@ "type": "github" } ], - "time": "2023-10-12T13:47:26+00:00" + "time": "2023-11-26T09:25:53+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -8663,16 +8661,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.39", + "version": "1.10.46", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4" + "reference": "90d3d25c5b98b8068916bbf08ce42d5cb6c54e70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d9dedb0413f678b4d03cbc2279a48f91592c97c4", - "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/90d3d25c5b98b8068916bbf08ce42d5cb6c54e70", + "reference": "90d3d25c5b98b8068916bbf08ce42d5cb6c54e70", "shasum": "" }, "require": { @@ -8721,7 +8719,7 @@ "type": "tidelift" } ], - "time": "2023-10-17T15:46:26+00:00" + "time": "2023-11-28T14:57:26+00:00" }, { "name": "phpunit/php-code-coverage", @@ -10539,16 +10537,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -10577,7 +10575,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -10585,7 +10583,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" } ], "aliases": [], From 42c55fa4eb871259668a53e13ee0954771eae527 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Wed, 6 Dec 2023 13:12:13 +0100 Subject: [PATCH 234/497] AdvMD: fix queries for lucene index for global sets (39265) --- Modules/MediaPool/LuceneObjectDefinition.xml | 2 ++ .../AdvancedMetaData/LuceneDataSource.xml | 32 +++++++++---------- .../LuceneSubItemDataSource.xml | 32 +++++++++---------- 3 files changed, 34 insertions(+), 32 deletions(-) diff --git a/Modules/MediaPool/LuceneObjectDefinition.xml b/Modules/MediaPool/LuceneObjectDefinition.xml index e9ae8ddb0c69..6ba696a7b147 100644 --- a/Modules/MediaPool/LuceneObjectDefinition.xml +++ b/Modules/MediaPool/LuceneObjectDefinition.xml @@ -3,6 +3,8 @@ + + diff --git a/Services/AdvancedMetaData/LuceneDataSource.xml b/Services/AdvancedMetaData/LuceneDataSource.xml index c36c1ea97f49..cd984b30bbbb 100644 --- a/Services/AdvancedMetaData/LuceneDataSource.xml +++ b/Services/AdvancedMetaData/LuceneDataSource.xml @@ -19,7 +19,7 @@ AND robj.sub_type = '-' AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -45,7 +45,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -99,7 +99,7 @@ AND robj.sub_type = '-' AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -124,7 +124,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -170,7 +170,7 @@ AND robj.sub_type = '-' AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -195,7 +195,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -241,7 +241,7 @@ AND robj.sub_type = '-' AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -266,7 +266,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -312,7 +312,7 @@ AND robj.sub_type = '-' AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -337,7 +337,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -383,7 +383,7 @@ AND robj.sub_type = '-' AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -408,7 +408,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -454,7 +454,7 @@ AND robj.sub_type = '-' AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -481,7 +481,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -531,7 +531,7 @@ AND robj.sub_type = '-' AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); @@ -556,7 +556,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?); diff --git a/Services/AdvancedMetaData/LuceneSubItemDataSource.xml b/Services/AdvancedMetaData/LuceneSubItemDataSource.xml index ac43be6631d9..194d7fcdf0f1 100644 --- a/Services/AdvancedMetaData/LuceneSubItemDataSource.xml +++ b/Services/AdvancedMetaData/LuceneSubItemDataSource.xml @@ -19,7 +19,7 @@ WHERE robj.optional = 0 AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -48,7 +48,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -108,7 +108,7 @@ WHERE robj.optional = 0 AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -136,7 +136,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -189,7 +189,7 @@ WHERE robj.optional = 0 AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -217,7 +217,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -270,7 +270,7 @@ WHERE robj.optional = 0 AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -298,7 +298,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -351,7 +351,7 @@ WHERE robj.optional = 0 AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -379,7 +379,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -432,7 +432,7 @@ WHERE robj.optional = 0 AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -460,7 +460,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -513,7 +513,7 @@ WHERE robj.optional = 0 AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -543,7 +543,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -600,7 +600,7 @@ WHERE robj.optional = 0 AND rec.active = 1 AND def.searchable = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) @@ -628,7 +628,7 @@ AND def.searchable = 1 AND cont.keyword = 'cont_custom_md' AND cont.value = 1 - AND rec.parent_obj IS NULL + AND IFNULL(rec.parent_obj, 0) = 0 AND robj.obj_type IN (?) AND val.obj_id IN (?) AND val.sub_type IN (?) From 7d0f5ece795cff7177c5eb5377f0b20129b7f610 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 6 Dec 2023 13:19:03 +0100 Subject: [PATCH 235/497] =?UTF-8?q?39251:=20Beim=20Klicken=20auf=20den=20M?= =?UTF-8?q?en=C3=BCpunkt=20Lernfortschritt=20erscheint=20sofort=20ein=20Fe?= =?UTF-8?q?hler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collection/class.ilLPCollectionOfRepositoryObjects.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Tracking/classes/collection/class.ilLPCollectionOfRepositoryObjects.php b/Services/Tracking/classes/collection/class.ilLPCollectionOfRepositoryObjects.php index abe689147a79..03daa316c508 100644 --- a/Services/Tracking/classes/collection/class.ilLPCollectionOfRepositoryObjects.php +++ b/Services/Tracking/classes/collection/class.ilLPCollectionOfRepositoryObjects.php @@ -431,7 +431,7 @@ public function getTableGUIData(int $a_parent_ref_id): array if (count((array) ($grouped_items['items'] ?? [])) > 1) { foreach ($grouped_items['items'] as $grouped_item_id) { if ($grouped_item_id == $item_id || - !is_array($items[$grouped_item_id])) { // #15498 + !is_array($items[$grouped_item_id] ?? false)) { // #15498 continue; } From 95b03f0d074e1495cf1f09bd224469e2de1d0b0a Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 6 Dec 2023 13:37:55 +0100 Subject: [PATCH 236/497] 39082: editing view is shown without permission --- .../class.ilGlossaryPresentationGUI.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Modules/Glossary/Presentation/class.ilGlossaryPresentationGUI.php b/Modules/Glossary/Presentation/class.ilGlossaryPresentationGUI.php index 30bfdf982a39..919635d116bd 100755 --- a/Modules/Glossary/Presentation/class.ilGlossaryPresentationGUI.php +++ b/Modules/Glossary/Presentation/class.ilGlossaryPresentationGUI.php @@ -604,11 +604,17 @@ public function showDefinitionTabs(string $a_act): void $ilCtrl->setParameterByClass("ilglossarytermgui", "term_id", $this->term_id); if (ilGlossaryTerm::_lookGlossaryID($this->term_id) == $this->glossary->getId()) { - $ilTabs->addNonTabbedLink( - "editing_view", - $lng->txt("glo_editing_view"), - $ilCtrl->getLinkTargetByClass(array("ilglossaryeditorgui", "ilobjglossarygui", "ilglossarytermgui"), "listDefinitions") - ); + if ($this->access->checkAccess("write", "", (int) $this->requested_ref_id) || + $this->access->checkAccess("edit_content", "", (int) $this->requested_ref_id)) { + $ilTabs->addNonTabbedLink( + "editing_view", + $lng->txt("glo_editing_view"), + $ilCtrl->getLinkTargetByClass(array("ilglossaryeditorgui", + "ilobjglossarygui", + "ilglossarytermgui" + ), "listDefinitions") + ); + } //"ilias.php?baseClass=ilGlossaryEditorGUI&ref_id=".$this->requested_ref_id."&edit_term=".$this->term_id); } $ilTabs->activateTab($a_act); From 4f979c2109348b90f490f45f39e30c3d8733dda3 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Wed, 6 Dec 2023 14:20:22 +0100 Subject: [PATCH 237/497] AdvMD: add current state of mob and mpg search as readme --- Services/Search/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 Services/Search/README.md diff --git a/Services/Search/README.md b/Services/Search/README.md new file mode 100644 index 000000000000..7c154b446c4b --- /dev/null +++ b/Services/Search/README.md @@ -0,0 +1,12 @@ +# Search + +## Media Objects and Content Snippets + +Content Snippets and Media Objects are only found when using Lucene +search, and not direct search. They are displayed as sub-objects of +Media Pools. + +When searching by (Custom) Metadata in the Advanced Search, Content +Snippets and Media Objects are never found, regardless of whether +Lucene or Advanced Search is used (but they can be found when +in the 'Content' field of the Advanced Search). From a1c88f2f97dc9e45b897659f6ca0fb7b1169864d Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 6 Dec 2023 15:15:47 +0100 Subject: [PATCH 238/497] 38088: setting an individual deadline for teams crashes --- .../Exercise/Assignment/class.ilExAssignmentMemberStatus.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Exercise/Assignment/class.ilExAssignmentMemberStatus.php b/Modules/Exercise/Assignment/class.ilExAssignmentMemberStatus.php index b07ac2a993a0..1fd02f44e846 100644 --- a/Modules/Exercise/Assignment/class.ilExAssignmentMemberStatus.php +++ b/Modules/Exercise/Assignment/class.ilExAssignmentMemberStatus.php @@ -220,7 +220,7 @@ protected function getFields(): array { return array( "notice" => array("text", $this->getNotice()) - ,"returned" => array("integer", $this->getReturned()) + ,"returned" => array("integer", (int) $this->getReturned()) ,"solved" => array("integer", $this->getSolved()) ,"status_time" => array("timestamp", $this->getStatusTime()) ,"sent" => array("integer", $this->getSent()) From e0381b6d34119116e792b7b314e0afc8fcb2a183 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 6 Dec 2023 15:54:58 +0100 Subject: [PATCH 239/497] 38686: Its not possible to adopt a single object from a specific course --- .../Container/Sorting/class.ilContainerSorting.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Services/Container/Sorting/class.ilContainerSorting.php b/Services/Container/Sorting/class.ilContainerSorting.php index 41bde6f18e97..04b6715c4921 100644 --- a/Services/Container/Sorting/class.ilContainerSorting.php +++ b/Services/Container/Sorting/class.ilContainerSorting.php @@ -101,12 +101,15 @@ public function cloneSorting( ); if (($rec = $ilDB->fetchAssoc($set)) && $rec["block_ids"] != "") { $ilLog->debug("Got block sorting for obj_id = " . $this->obj_id . ": " . $rec["block_ids"]); - $new_ids = implode(";", array_map(static function ($block_id) use ($mappings) { - if (is_numeric($block_id)) { - $block_id = $mappings[$block_id]; + $new_block_ids = []; + foreach (explode(";", $rec["block_ids"]) as $block_id) { + if (is_numeric($block_id) && isset($mappings[$block_id])) { + $new_block_ids[] = $mappings[$block_id]; + } else { + $new_block_ids[] = $block_id; } - return $block_id; - }, explode(";", $rec["block_ids"]))); + } + $new_ids = implode(";", $new_block_ids); $ilDB->replace( "container_sorting_bl", From 270904c83921a34ddae294a22ea1b18a62d85e78 Mon Sep 17 00:00:00 2001 From: iszmais Date: Wed, 6 Dec 2023 12:44:17 +0100 Subject: [PATCH 240/497] Fix flipped CI roles --- CI/PHPStan/constants.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CI/PHPStan/constants.php b/CI/PHPStan/constants.php index 0f74a99b1dc7..fd237ae5ce98 100644 --- a/CI/PHPStan/constants.php +++ b/CI/PHPStan/constants.php @@ -1,4 +1,4 @@ - Date: Thu, 7 Dec 2023 13:37:30 +0100 Subject: [PATCH 241/497] Search: a few fixes for custom metadata in advanced search (39265) --- Modules/Glossary/LuceneObjectDefinition.xml | 4 +- Modules/MediaPool/LuceneObjectDefinition.xml | 8 +- Modules/Wiki/LuceneObjectDefinition.xml | 4 +- .../AdvancedMetaData/LuceneDataSource.xml | 12 +- .../LuceneSubItemDataSource.xml | 182 ++++++++---------- Services/Search/README.md | 11 +- 6 files changed, 97 insertions(+), 124 deletions(-) diff --git a/Modules/Glossary/LuceneObjectDefinition.xml b/Modules/Glossary/LuceneObjectDefinition.xml index f4ef27f31032..6226817fea9e 100644 --- a/Modules/Glossary/LuceneObjectDefinition.xml +++ b/Modules/Glossary/LuceneObjectDefinition.xml @@ -17,7 +17,7 @@ - SELECT 'glo' type,term,glo_id,id,'term' metaSubType,id metaSubId + SELECT 'glo' objType,term,glo_id,id,'term' metaType,id metaObjId,glo_id metaRbacId FROM glossary_term gt WHERE glo_id IN (?) @@ -25,7 +25,7 @@ - + diff --git a/Modules/MediaPool/LuceneObjectDefinition.xml b/Modules/MediaPool/LuceneObjectDefinition.xml index 6ba696a7b147..8677139efe93 100644 --- a/Modules/MediaPool/LuceneObjectDefinition.xml +++ b/Modules/MediaPool/LuceneObjectDefinition.xml @@ -3,8 +3,6 @@ - - @@ -22,7 +20,7 @@ - SELECT title, obj_id, foreign_id AS metaObjId, mep_id, type AS metaType,0 AS metaRbacId, child FROM mep_tree + SELECT title, obj_id, foreign_id AS metaObjId, mep_id, type AS metaType,0 AS metaRbacId, 'mep' as objType, child FROM mep_tree JOIN mep_item ON child = obj_id WHERE type = 'mob' AND mep_id IN (?) @@ -33,6 +31,7 @@ + SELECT caption, location, text_representation FROM media_item @@ -48,7 +47,7 @@ - SELECT title,content, obj_id AS metaObjId, mep_id, type AS metaType,0 AS metaRbacId, child, parent_type FROM mep_tree + SELECT title,content, obj_id AS metaObjId, mep_id, 'mpg' AS metaType, mep_id AS metaRbacId, child, parent_type FROM mep_tree JOIN mep_item ON child = obj_id JOIN page_object po ON obj_id = po.page_id WHERE type = 'pg' AND parent_type = 'mep' @@ -63,6 +62,7 @@ + \ No newline at end of file diff --git a/Modules/Wiki/LuceneObjectDefinition.xml b/Modules/Wiki/LuceneObjectDefinition.xml index e17b5ee8c2de..7d1a9ee27498 100644 --- a/Modules/Wiki/LuceneObjectDefinition.xml +++ b/Modules/Wiki/LuceneObjectDefinition.xml @@ -48,7 +48,7 @@ - SELECT 'wiki' type,id,title,wiki_id,create_user,content,'wpg' metaSubType,id metaSubId + SELECT 'wiki' objType,id,title,wiki_id,wiki_id metaRbacId,create_user,content,'wpg' metaType,id metaObjId FROM il_wiki_page wp JOIN page_object po ON wp.id = po.page_id WHERE wiki_id IN(?) @@ -62,7 +62,7 @@ - + diff --git a/Services/AdvancedMetaData/LuceneDataSource.xml b/Services/AdvancedMetaData/LuceneDataSource.xml index cd984b30bbbb..83ba53ea9951 100644 --- a/Services/AdvancedMetaData/LuceneDataSource.xml +++ b/Services/AdvancedMetaData/LuceneDataSource.xml @@ -9,7 +9,7 @@ - SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value + SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value, vd.idx FROM adv_md_values_enum val JOIN adv_mdf_enum vd ON (val.field_id = vd.field_id AND value_index = idx) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) @@ -25,13 +25,13 @@ - + - SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value + SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value, vd.idx FROM adv_md_values_enum val JOIN adv_mdf_enum vd ON (val.field_id = vd.field_id AND value_index = idx) JOIN object_data obj ON (obj.obj_id = val.obj_id) @@ -51,13 +51,13 @@ - + - SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value + SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value, vd.idx FROM adv_md_values_enum val JOIN adv_mdf_enum vd ON (val.field_id = vd.field_id AND value_index = idx) JOIN object_data obj ON (obj.obj_id = val.obj_id) @@ -77,7 +77,7 @@ - + diff --git a/Services/AdvancedMetaData/LuceneSubItemDataSource.xml b/Services/AdvancedMetaData/LuceneSubItemDataSource.xml index 194d7fcdf0f1..149cd730240f 100644 --- a/Services/AdvancedMetaData/LuceneSubItemDataSource.xml +++ b/Services/AdvancedMetaData/LuceneSubItemDataSource.xml @@ -9,10 +9,9 @@ - SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value + SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value, vd.idx FROM adv_md_values_enum val JOIN adv_mdf_enum vd ON (val.field_id = vd.field_id AND value_index = idx) - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -26,19 +25,18 @@ AND val.sub_id IN (?); - - - - + + + + - SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value + SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value, vd.idx FROM adv_md_values_enum val JOIN adv_mdf_enum vd ON (val.field_id = vd.field_id AND value_index = idx) - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -55,19 +53,18 @@ AND val.sub_id IN (?); - - - - + + + + - SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value + SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, vd.value, vd.idx FROM adv_md_values_enum val JOIN adv_mdf_enum vd ON (val.field_id = vd.field_id AND value_index = idx) - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -84,16 +81,16 @@ AND val.sub_id IN (?); - - - - + + + + @@ -101,7 +98,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_ltext val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -115,9 +111,9 @@ AND val.sub_id IN (?); - - - + + + @@ -126,7 +122,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_ltext val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -143,9 +138,9 @@ AND val.sub_id IN (?); - - - + + + @@ -154,7 +149,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_ltext val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -171,9 +165,9 @@ AND val.sub_id IN (?); - - - + + + @@ -182,7 +176,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_date val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -196,9 +189,9 @@ AND val.sub_id IN (?); - - - + + + @@ -207,7 +200,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_date val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -224,9 +216,9 @@ AND val.sub_id IN (?); - - - + + + @@ -235,7 +227,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_date val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -252,9 +243,9 @@ AND val.sub_id IN (?); - - - + + + @@ -263,7 +254,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_datetime val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -277,9 +267,9 @@ AND val.sub_id IN (?); - - - + + + @@ -288,7 +278,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_datetime val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -305,9 +294,9 @@ AND val.sub_id IN (?); - - - + + + @@ -316,7 +305,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_datetime val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -333,9 +321,9 @@ AND val.sub_id IN (?); - - - + + + @@ -344,7 +332,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_float val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -358,9 +345,9 @@ AND val.sub_id IN (?); - - - + + + @@ -369,7 +356,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_float val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -386,9 +372,9 @@ AND val.sub_id IN (?); - - - + + + @@ -397,7 +383,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_float val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -414,9 +399,9 @@ AND val.sub_id IN (?); - - - + + + @@ -425,7 +410,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_int val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -439,9 +423,9 @@ AND val.sub_id IN (?); - - - + + + @@ -450,7 +434,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_int val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -467,9 +450,9 @@ AND val.sub_id IN (?); - - - + + + @@ -478,7 +461,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_int val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -495,9 +477,9 @@ AND val.sub_id IN (?); - - - + + + @@ -506,7 +488,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value, val.title FROM adv_md_values_extlink val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -520,9 +501,9 @@ AND val.sub_id IN (?); - - - + + + @@ -533,7 +514,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value, val.title FROM adv_md_values_extlink val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -550,9 +530,9 @@ AND val.sub_id IN (?); - - - + + + @@ -563,7 +543,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value, val.title FROM adv_md_values_extlink val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -580,9 +559,9 @@ AND val.sub_id IN (?); - - - + + + @@ -593,7 +572,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_intlink val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -607,9 +585,9 @@ AND val.sub_id IN (?); - - - + + + @@ -618,7 +596,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_intlink val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -635,9 +612,9 @@ AND val.sub_id IN (?); - - - + + + @@ -646,7 +623,6 @@ SELECT concat('advancedMetaData_', val.field_id) field_name, val.field_id, val.value FROM adv_md_values_intlink val - JOIN object_data obj ON (obj.obj_id = val.obj_id) JOIN adv_mdf_definition def ON (def.field_id = val.field_id) JOIN adv_md_record rec ON (rec.record_id = def.record_id) JOIN adv_md_record_objs robj ON (robj.record_id = rec.record_id AND robj.sub_type = val.sub_type) @@ -663,9 +639,9 @@ AND val.sub_id IN (?); - - - + + + diff --git a/Services/Search/README.md b/Services/Search/README.md index 7c154b446c4b..d5b7abaf58a7 100644 --- a/Services/Search/README.md +++ b/Services/Search/README.md @@ -2,11 +2,8 @@ ## Media Objects and Content Snippets -Content Snippets and Media Objects are only found when using Lucene +Content Snippets and Media Objects are only found when using Lucene search, and not direct search. They are displayed as sub-objects of -Media Pools. - -When searching by (Custom) Metadata in the Advanced Search, Content -Snippets and Media Objects are never found, regardless of whether -Lucene or Advanced Search is used (but they can be found when -in the 'Content' field of the Advanced Search). +Media Pools. This is also the case in the 'Advanced Search', except +when searching via the 'Content' field: there Content Snippets and +Media Objects are also included in the direct search. From 876cf07ffce2f39d166de4e38c11364d48c4b3ae Mon Sep 17 00:00:00 2001 From: iszmais <45942348+iszmais@users.noreply.github.com> Date: Thu, 7 Dec 2023 14:49:54 +0100 Subject: [PATCH 242/497] Fix typo in DataCollection fth check (#6732) --- .../classes/Fields/class.ilDclFieldFactory.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/DataCollection/classes/Fields/class.ilDclFieldFactory.php b/Modules/DataCollection/classes/Fields/class.ilDclFieldFactory.php index 0ee41c671f42..dedba0c1593b 100644 --- a/Modules/DataCollection/classes/Fields/class.ilDclFieldFactory.php +++ b/Modules/DataCollection/classes/Fields/class.ilDclFieldFactory.php @@ -1,4 +1,5 @@ getId() == ilDclDatatype::INPUTFORMAT_PLUGIN) { if ($field->hasProperty(ilDclBaseFieldModel::PROP_PLUGIN_HOOK_NAME)) { - if ($component_repository->getPluginSlotById(ilDclFieldTypePlugin::SLOT_ID)->hasPluginName($field->getProperty(ilDclBaseFieldModel::PROP_PLUGIN_HOOK_NAME))) { + if (!$component_repository->getPluginSlotById(ilDclFieldTypePlugin::SLOT_ID)->hasPluginName($field->getProperty(ilDclBaseFieldModel::PROP_PLUGIN_HOOK_NAME))) { throw new ilDclException( "Something went wrong by initializing the FieldHook-Plugin '" . $field->getProperty(ilDclBaseFieldModel::PROP_PLUGIN_HOOK_NAME) . "' on Component '" From 897c89e27bec652076c015c92ec2f583e9ac021f Mon Sep 17 00:00:00 2001 From: kergomard <13102171+kergomard@users.noreply.github.com> Date: Thu, 7 Dec 2023 18:14:34 +0100 Subject: [PATCH 243/497] RBAC: Fix Access to Unsubscribe (#6514) See: https://mantis.ilias.de/view.php?id=32243 --- Modules/Course/classes/class.ilObjCourseGUI.php | 1 + Services/AccessControl/classes/class.ilAccess.php | 9 +++++---- Services/Object/classes/class.ilObjectGUI.php | 10 +++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Modules/Course/classes/class.ilObjCourseGUI.php b/Modules/Course/classes/class.ilObjCourseGUI.php index b1826072ff9b..fc12cfc610a5 100755 --- a/Modules/Course/classes/class.ilObjCourseGUI.php +++ b/Modules/Course/classes/class.ilObjCourseGUI.php @@ -2384,6 +2384,7 @@ public function executeCommand(): void && $cmd != 'deliverCertificate' && $cmd != 'performUnsubscribe' && $cmd != 'removeFromDesk' + && $cmd !== 'leave' && !$this->access->checkAccess("read", '', $this->object->getRefId()) || $cmd == 'join' || $cmd == 'subscribe') { diff --git a/Services/AccessControl/classes/class.ilAccess.php b/Services/AccessControl/classes/class.ilAccess.php index 91c7f55f83a3..3ed55d0002c4 100644 --- a/Services/AccessControl/classes/class.ilAccess.php +++ b/Services/AccessControl/classes/class.ilAccess.php @@ -543,7 +543,7 @@ public function doActivationCheck( int $a_obj_id, string $a_type ): bool { - $cache_perm = ($a_permission == "visible") + $cache_perm = ($a_permission === "visible" || $a_permission === 'leave') ? "visible" : "other"; @@ -552,7 +552,7 @@ public function doActivationCheck( } // nothings needs to be done if current permission is write permission - if ($a_permission == 'write') { + if ($a_permission === 'write') { return true; } @@ -600,8 +600,9 @@ public function doActivationCheck( return true; } - // if current permission is visible and visible is set in activation - if ($a_permission == 'visible' && $item_data['visible']) { + // if current permission is visible or leave and visible is set in activation + if (($a_permission === 'visible' || $a_permission === 'leave') + && $item_data['visible']) { $this->ac_cache[$cache_perm][$a_ref_id][$a_user_id] = true; return true; } diff --git a/Services/Object/classes/class.ilObjectGUI.php b/Services/Object/classes/class.ilObjectGUI.php index 87e29ddf22cc..d2f5a6fd0c74 100755 --- a/Services/Object/classes/class.ilObjectGUI.php +++ b/Services/Object/classes/class.ilObjectGUI.php @@ -1516,8 +1516,16 @@ protected function checkPermission(string $perm, string $cmd = "", string $type if ($perm != "create" && !is_object($this->object)) { return; } - throw new ilObjectException($this->lng->txt("permission_denied")); + + ilSession::clear("il_rep_ref_id"); + + $this->tpl->setOnScreenMessage('failure', $this->lng->txt('msg_no_perm_read'), true); + $parent_ref_id = $this->tree->getParentNodeData($this->object->getRefId())['ref_id']; + $this->ctrl->redirectToURL(ilLink::_getLink($parent_ref_id)); } + + $this->tpl->setOnScreenMessage('failure', $this->lng->txt('msg_no_perm_read'), true); + self::_gotoRepositoryRoot(); } } From 85edf3cc9cc6ab0bef5feb46817323d8a85c3de3 Mon Sep 17 00:00:00 2001 From: mjansen Date: Fri, 8 Dec 2023 10:21:41 +0100 Subject: [PATCH 244/497] Calendar: Fix accessing undefined array key See: https://mantis.ilias.de/view.php?id=39337 --- .../classes/class.ilCalendarRemoteAccessHandler.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/Calendar/classes/class.ilCalendarRemoteAccessHandler.php b/Services/Calendar/classes/class.ilCalendarRemoteAccessHandler.php index df33f44a9b16..2b913705e645 100644 --- a/Services/Calendar/classes/class.ilCalendarRemoteAccessHandler.php +++ b/Services/Calendar/classes/class.ilCalendarRemoteAccessHandler.php @@ -122,12 +122,12 @@ protected function initTokenHandler(): void ); } - protected function initLimitEnabled() + protected function initLimitEnabled(): void { - $this->limit_enabled = (bool) $_GET[self::LIMITED_QUERY_PARAM]; + $this->limit_enabled = (bool) ($_GET[self::LIMITED_QUERY_PARAM] ?? false); } - protected function initIlias() + protected function initIlias(): void { include_once './Services/Context/classes/class.ilContext.php'; ilContext::init(ilContext::CONTEXT_ICAL); From 74b2980a7188836506535cca255820c133a04a06 Mon Sep 17 00:00:00 2001 From: Luka Stocker <67695434+lukastocker@users.noreply.github.com> Date: Fri, 8 Dec 2023 14:34:26 +0100 Subject: [PATCH 245/497] BOOK: adjust deletion of booking objects. (#21705) (#6401) If a booking object is deleted all reservations and calendar entries related to the booking object will be deleted too. Those steps were missing before, therefore the entry was still visible in the calendar. Mantis Ticket: https://mantis.ilias.de/view.php?id=21705 --- .../Objects/class.ilBookingObject.php | 13 +++++++++++++ .../Objects/class.ilBookingObjectGUI.php | 1 + .../class.ilBookingReservationDBRepository.php | 13 +++++++++++++ 3 files changed, 27 insertions(+) diff --git a/Modules/BookingManager/Objects/class.ilBookingObject.php b/Modules/BookingManager/Objects/class.ilBookingObject.php index 3ed70e7f9704..165cc1d3e62f 100644 --- a/Modules/BookingManager/Objects/class.ilBookingObject.php +++ b/Modules/BookingManager/Objects/class.ilBookingObject.php @@ -410,6 +410,19 @@ public function delete(): int return 0; } + public function deleteReservationAndCalEntry(int $object_id): void + { + $reservation_db = new ilBookingReservationDBRepository($this->db); + $reservation_ids = $reservation_db->getReservationIdByBookingObjectId($object_id); + + foreach ($reservation_ids as $reservation_id) { + $reservation = new ilBookingReservation($reservation_id); + $entry = new ilCalendarEntry($reservation->getCalendarEntry()); + $reservation_db->delete($reservation_id); + $entry->delete(); + } + } + /** * Get nr of available items for a set of object ids * @param int[] $a_obj_ids diff --git a/Modules/BookingManager/Objects/class.ilBookingObjectGUI.php b/Modules/BookingManager/Objects/class.ilBookingObjectGUI.php index 5ce1fc26fff6..7f933249d0d5 100644 --- a/Modules/BookingManager/Objects/class.ilBookingObjectGUI.php +++ b/Modules/BookingManager/Objects/class.ilBookingObjectGUI.php @@ -536,6 +536,7 @@ public function delete(): void $lng = $this->lng; $obj = new ilBookingObject($this->object_id); + $obj->deleteReservationAndCalEntry($this->object_id); $obj->delete(); $this->tpl->setOnScreenMessage('success', $lng->txt('book_object_deleted'), true); diff --git a/Modules/BookingManager/Reservations/class.ilBookingReservationDBRepository.php b/Modules/BookingManager/Reservations/class.ilBookingReservationDBRepository.php index 6c0c69fab296..aac063eef097 100644 --- a/Modules/BookingManager/Reservations/class.ilBookingReservationDBRepository.php +++ b/Modules/BookingManager/Reservations/class.ilBookingReservationDBRepository.php @@ -328,4 +328,17 @@ public function getCachedContextObjBookingInfo( return ($row["context_obj_id"] == $context_obj_id); }); } + + public function getReservationIdByBookingObjectId(int $booking_object_id): array + { + $query = "SELECT booking_reservation_id FROM booking_reservation " . PHP_EOL + . " WHERE object_id = " . $this->db->quote($booking_object_id, "integer"); + $res = $this->db->query($query); + $ret = []; + while ($row = $this->db->fetchAssoc($res)) { + $ret[] = (int) $row['booking_reservation_id']; + } + + return $ret; + } } From 1b582f7708d41c2ad6fd208ed2068d94b420ddc7 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 8 Dec 2023 14:51:00 +0100 Subject: [PATCH 246/497] BOOK: adjust deletion of booking objects. (#21705) (#6401); part ii --- .../Objects/class.ilBookingObject.php | 9 +++++---- .../Objects/class.ilBookingObjectGUI.php | 2 +- .../class.ilBookingReservationDBRepository.php | 13 ++++++++----- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Modules/BookingManager/Objects/class.ilBookingObject.php b/Modules/BookingManager/Objects/class.ilBookingObject.php index 165cc1d3e62f..b9b577ce6990 100644 --- a/Modules/BookingManager/Objects/class.ilBookingObject.php +++ b/Modules/BookingManager/Objects/class.ilBookingObject.php @@ -410,11 +410,12 @@ public function delete(): int return 0; } - public function deleteReservationAndCalEntry(int $object_id): void + public function deleteReservationsAndCalEntries(int $object_id): void { - $reservation_db = new ilBookingReservationDBRepository($this->db); - $reservation_ids = $reservation_db->getReservationIdByBookingObjectId($object_id); - + $repo_fac = new ilBookingReservationDBRepositoryFactory(); + $reservation_db = $repo_fac->getRepo(); + $reservation_ids = $reservation_db->getReservationIdsByBookingObjectId($object_id); + foreach ($reservation_ids as $reservation_id) { $reservation = new ilBookingReservation($reservation_id); $entry = new ilCalendarEntry($reservation->getCalendarEntry()); diff --git a/Modules/BookingManager/Objects/class.ilBookingObjectGUI.php b/Modules/BookingManager/Objects/class.ilBookingObjectGUI.php index 7f933249d0d5..90da3b3f4b58 100644 --- a/Modules/BookingManager/Objects/class.ilBookingObjectGUI.php +++ b/Modules/BookingManager/Objects/class.ilBookingObjectGUI.php @@ -536,7 +536,7 @@ public function delete(): void $lng = $this->lng; $obj = new ilBookingObject($this->object_id); - $obj->deleteReservationAndCalEntry($this->object_id); + $obj->deleteReservationsAndCalEntries($this->object_id); $obj->delete(); $this->tpl->setOnScreenMessage('success', $lng->txt('book_object_deleted'), true); diff --git a/Modules/BookingManager/Reservations/class.ilBookingReservationDBRepository.php b/Modules/BookingManager/Reservations/class.ilBookingReservationDBRepository.php index aac063eef097..5dce56bef44a 100644 --- a/Modules/BookingManager/Reservations/class.ilBookingReservationDBRepository.php +++ b/Modules/BookingManager/Reservations/class.ilBookingReservationDBRepository.php @@ -329,13 +329,16 @@ public function getCachedContextObjBookingInfo( }); } - public function getReservationIdByBookingObjectId(int $booking_object_id): array + public function getReservationIdsByBookingObjectId(int $booking_object_id): array { - $query = "SELECT booking_reservation_id FROM booking_reservation " . PHP_EOL - . " WHERE object_id = " . $this->db->quote($booking_object_id, "integer"); - $res = $this->db->query($query); + $set = $this->db->queryF( + "SELECT booking_reservation_id FROM booking_reservation " . + " WHERE object_id = %s ", + ["integer"], + [$booking_object_id] + ); $ret = []; - while ($row = $this->db->fetchAssoc($res)) { + while ($row = $this->db->fetchAssoc($set)) { $ret[] = (int) $row['booking_reservation_id']; } From bdbae9e039b8d31816040d5d54f9d8cd29c0e9ec Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 8 Dec 2023 16:06:22 +0100 Subject: [PATCH 247/497] MetaData: fix default for format field in advanced search (39301) --- .../MetaData/classes/class.ilMDUtilSelect.php | 55 +++++++------------ 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/Services/MetaData/classes/class.ilMDUtilSelect.php b/Services/MetaData/classes/class.ilMDUtilSelect.php index 68d7ef6f3601..93df324d6d56 100644 --- a/Services/MetaData/classes/class.ilMDUtilSelect.php +++ b/Services/MetaData/classes/class.ilMDUtilSelect.php @@ -1,7 +1,5 @@ @@ -37,8 +37,7 @@ public static function _getLanguageSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -75,8 +74,7 @@ public static function _getStructureSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -112,8 +110,7 @@ public static function _getStatusSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -149,8 +146,7 @@ public static function _getRoleSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -204,8 +200,7 @@ public static function _getOperatingSystemSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -241,8 +236,7 @@ public static function _getBrowserSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -278,13 +272,13 @@ public static function _getFormatSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; $ilDB = $DIC['ilDB']; + $options = []; foreach ($prepend as $value => $translation) { $options[$value] = $translation; } @@ -297,7 +291,7 @@ public static function _getFormatSelect( if (!$res->numRows()) { return ''; } - $options = []; + while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) { if (is_string($row->forma) && $row->forma !== '') { $options[$row->forma] = substr($row->forma, 0, 48); @@ -359,8 +353,7 @@ public static function _getInteractivityTypeSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -397,8 +390,7 @@ public static function _getLearningResourceTypeSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -492,8 +484,7 @@ public static function _getSemanticDensitySelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -530,8 +521,7 @@ public static function _getIntendedEndUserRoleSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -567,8 +557,7 @@ public static function _getContextSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -629,8 +618,7 @@ public static function _getDifficultySelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -729,8 +717,7 @@ public static function _getCostsSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -767,8 +754,7 @@ public static function _getCopyrightAndOtherRestrictionsSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; @@ -805,8 +791,7 @@ public static function _getPurposeSelect( string $a_name, array $prepend = array(), bool $a_options_only = false - ) // END PATCH Lucene Search - { + ) { // END PATCH Lucene Search global $DIC; $lng = $DIC['lng']; From c41f481622ace1292cc8502a2d37da887598a727 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 8 Dec 2023 16:57:23 +0100 Subject: [PATCH 248/497] 37419: Course links created in item groups are not part of the item group --- .../classes/class.ilContainerReferenceGUI.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Services/ContainerReference/classes/class.ilContainerReferenceGUI.php b/Services/ContainerReference/classes/class.ilContainerReferenceGUI.php index 89dbaf40747e..0b17986fd5c1 100644 --- a/Services/ContainerReference/classes/class.ilContainerReferenceGUI.php +++ b/Services/ContainerReference/classes/class.ilContainerReferenceGUI.php @@ -129,6 +129,8 @@ public function createObject(): void )) { $ilErr->raiseError($this->lng->txt("permission_denied"), $ilErr->MESSAGE); } + $this->ctrl->saveParameter($this, "crtptrefid"); + $this->ctrl->saveParameter($this, "crtcb"); $form = $this->initForm(self::MODE_CREATE); $this->tpl->setContent($form->getHTML()); } From 4251b2be31dbb3f5c5f9df0bf1024f38c186ffb5 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 10 Dec 2023 22:24:22 +0100 Subject: [PATCH 249/497] 39317: Abgaben & Noten nicht aufrufbar --- .../Exercise/Submission/class.ilExerciseSubmissionTableGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Exercise/Submission/class.ilExerciseSubmissionTableGUI.php b/Modules/Exercise/Submission/class.ilExerciseSubmissionTableGUI.php index c1bf963ee37d..45271ca7a76b 100644 --- a/Modules/Exercise/Submission/class.ilExerciseSubmissionTableGUI.php +++ b/Modules/Exercise/Submission/class.ilExerciseSubmissionTableGUI.php @@ -305,7 +305,7 @@ protected function parseRow( // do not grade or mark if no team yet if (!$has_no_team_yet) { // status - $this->tpl->setVariable("SEL_" . strtoupper($a_row["status"]), ' selected="selected" '); + $this->tpl->setVariable("SEL_" . strtoupper($a_row["status"] ?? ""), ' selected="selected" '); $this->tpl->setVariable("TXT_NOTGRADED", $this->lng->txt("exc_notgraded")); $this->tpl->setVariable("TXT_PASSED", $this->lng->txt("exc_passed")); $this->tpl->setVariable("TXT_FAILED", $this->lng->txt("exc_failed")); From d29600107efd2a890a15a7979b26dd99dc5e57b7 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 11 Dec 2023 11:00:35 +0100 Subject: [PATCH 250/497] 39357: BookingManager: ilBookingReservation::setGroupId(): Argument #1 () must be of type int, null given --- .../Reservations/class.ilBookingReservation.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/BookingManager/Reservations/class.ilBookingReservation.php b/Modules/BookingManager/Reservations/class.ilBookingReservation.php index ac3d138bc653..d2f0b06e72aa 100644 --- a/Modules/BookingManager/Reservations/class.ilBookingReservation.php +++ b/Modules/BookingManager/Reservations/class.ilBookingReservation.php @@ -172,13 +172,13 @@ protected function read(): void if ($this->id) { $row = $this->repo->getForId($this->id); $this->setUserId($row['user_id']); - $this->setAssignerId($row['assigner_id']); + $this->setAssignerId((int) $row['assigner_id']); $this->setObjectId($row['object_id']); $this->setFrom($row['date_from']); $this->setTo($row['date_to']); $this->setStatus($row['status']); - $this->setGroupId($row['group_id']); - $this->setContextObjId($row['context_obj_id']); + $this->setGroupId((int) $row['group_id']); + $this->setContextObjId((int) $row['context_obj_id']); } } From a36c192581785aeb009f6ec672a650cc64495eaa Mon Sep 17 00:00:00 2001 From: iszmais Date: Mon, 11 Dec 2023 11:36:22 +0100 Subject: [PATCH 251/497] Remove link to unpublished profiles --- .../BuddySystem/classes/class.ilBuddySystemNotification.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Services/Contact/BuddySystem/classes/class.ilBuddySystemNotification.php b/Services/Contact/BuddySystem/classes/class.ilBuddySystemNotification.php index 668f91c16b26..2e5a95982f3b 100644 --- a/Services/Contact/BuddySystem/classes/class.ilBuddySystemNotification.php +++ b/Services/Contact/BuddySystem/classes/class.ilBuddySystemNotification.php @@ -84,11 +84,6 @@ public function send(): void ), $personalProfileLink ); - } else { - $links[] = new ilNotificationLink( - new ilNotificationParameter($recipientLanguage->txt('buddy_noti_cr_profile_not_published')), - '#' - ); } $links[] = new ilNotificationLink( new ilNotificationParameter('buddy_notification_contact_request_link_osd', [], 'buddysystem'), From ef0fbd0cf9dd0e3c1aafdb7ef4d84511bace2b73 Mon Sep 17 00:00:00 2001 From: iszmais Date: Mon, 11 Dec 2023 11:46:07 +0100 Subject: [PATCH 252/497] Remove link to unpublished profiles --- .../BuddySystem/classes/class.ilBuddySystemNotification.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Services/Contact/BuddySystem/classes/class.ilBuddySystemNotification.php b/Services/Contact/BuddySystem/classes/class.ilBuddySystemNotification.php index 2e5a95982f3b..89899230182a 100644 --- a/Services/Contact/BuddySystem/classes/class.ilBuddySystemNotification.php +++ b/Services/Contact/BuddySystem/classes/class.ilBuddySystemNotification.php @@ -1,7 +1,5 @@ Date: Mon, 11 Dec 2023 12:13:10 +0100 Subject: [PATCH 253/497] Mail: Fix '' values in autocomplete search --- .../class.ilMailAutoCompleteSentMailsRecipientsProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php b/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php index ea8715a83d51..b35030d90576 100644 --- a/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php +++ b/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php @@ -108,7 +108,7 @@ public function rewind(): void mail.rcp_to login FROM mail WHERE " . $this->db->like('mail.rcp_to', 'text', $this->quoted_term) . " - AND mail.rcp_to IS NOT NULL + AND mail.rcp_to IS NOT NULL AND mail.rcp_to != '' AND sender_id = " . $this->db->quote($this->user_id, 'integer') . " AND mail.sender_id = mail.user_id"; From 9ad8479624c79e4d18ebb4dc34910a30ba0f8d70 Mon Sep 17 00:00:00 2001 From: Marvin Beym <79150442+mBeym@users.noreply.github.com> Date: Mon, 11 Dec 2023 14:14:19 +0100 Subject: [PATCH 254/497] Fix new lines in written text causing mail to be malformed (#6721) --- .../Content/class.ilDclRecordEditGUI.php | 5 +- .../Base/class.ilDclBaseRecordModel.php | 12 ++-- .../classes/class.ilObjDataCollection.php | 59 ++++++++++--------- 3 files changed, 44 insertions(+), 32 deletions(-) diff --git a/Modules/DataCollection/classes/Content/class.ilDclRecordEditGUI.php b/Modules/DataCollection/classes/Content/class.ilDclRecordEditGUI.php index 7176ade55c2d..0a53d6288b93 100644 --- a/Modules/DataCollection/classes/Content/class.ilDclRecordEditGUI.php +++ b/Modules/DataCollection/classes/Content/class.ilDclRecordEditGUI.php @@ -1,4 +1,5 @@ table_id, $record_obj->getId()); + $ref_id = $this->http->wrapper()->query()->retrieve('ref_id', $this->refinery->kindlyTo()->int()); + $objDataCollection = new ilObjDataCollection($ref_id); + $objDataCollection->sendNotification("new_record", $this->table_id, $record_obj->getId()); } else { $dispatchEventData['prev_record'] = $unchanged_obj; } diff --git a/Modules/DataCollection/classes/Fields/Base/class.ilDclBaseRecordModel.php b/Modules/DataCollection/classes/Fields/Base/class.ilDclBaseRecordModel.php index 130f69fa3d56..713db8029f00 100644 --- a/Modules/DataCollection/classes/Fields/Base/class.ilDclBaseRecordModel.php +++ b/Modules/DataCollection/classes/Fields/Base/class.ilDclBaseRecordModel.php @@ -1,4 +1,5 @@ getTableId(), $this->id); + $ref_id = $this->http->wrapper()->query()->retrieve('ref_id', $this->refinery->kindlyTo()->int()); + $objDataCollection = new ilObjDataCollection($ref_id); + $objDataCollection->sendNotification("update_record", $this->getTableId(), $this->id); } } @@ -658,7 +660,9 @@ public function doDelete(bool $omit_notification = false): void $this->table->loadRecords(); if (!$omit_notification) { - ilObjDataCollection::sendNotification("delete_record", $this->getTableId(), $this->getId()); + $ref_id = $this->http->wrapper()->query()->retrieve('ref_id', $this->refinery->kindlyTo()->int()); + $objDataCollection = new ilObjDataCollection($ref_id); + $objDataCollection->sendNotification("delete_record", $this->getTableId(), $this->getId()); $this->event->raise( 'Modules/DataCollection', diff --git a/Modules/DataCollection/classes/class.ilObjDataCollection.php b/Modules/DataCollection/classes/class.ilObjDataCollection.php index 58573ecb21e8..4b245833ac90 100644 --- a/Modules/DataCollection/classes/class.ilObjDataCollection.php +++ b/Modules/DataCollection/classes/class.ilObjDataCollection.php @@ -14,8 +14,7 @@ * https://www.ilias.de * https://github.com/ILIAS-eLearning * - ******************************************************************** - */ + *********************************************************************/ /** * Class ilObjDataCollection @@ -129,46 +128,34 @@ protected function doUpdate(): void * @param $a_table_id * @param null $a_record_id */ - public static function sendNotification($a_action, $a_table_id, $a_record_id = null) + public function sendNotification($a_action, $a_table_id, $a_record_id = null) { global $DIC; - $ilUser = $DIC['ilUser']; - $ilAccess = $DIC['ilAccess']; - $http = $DIC->http(); - $refinery = $DIC->refinery(); - - $ref_id = $http->wrapper()->query()->retrieve('ref_id', $refinery->kindlyTo()->int()); + $ilUser = $DIC->user(); // If coming from trash, never send notifications and don't load dcl Object - if ($ref_id === SYSTEM_FOLDER_ID) { + if ($this->getRefId() === SYSTEM_FOLDER_ID) { return; } - $dclObj = new ilObjDataCollection($ref_id); - - if ($dclObj->getNotification() != 1) { + if ($this->getNotification() != 1) { return; } $obj_table = ilDclCache::getTableCache($a_table_id); - $obj_dcl = $obj_table->getCollectionObject(); // recipients $users = ilNotification::getNotificationsForObject( ilNotification::TYPE_DATA_COLLECTION, - $obj_dcl->getId(), + $this->getId(), true ); if (!count($users)) { return; } - ilNotification::updateNotificationTime(ilNotification::TYPE_DATA_COLLECTION, $obj_dcl->getId(), $users); + ilNotification::updateNotificationTime(ilNotification::TYPE_DATA_COLLECTION, $this->getId(), $users); - $http = $DIC->http(); - $refinery = $DIC->refinery(); - $ref_id = $http->wrapper()->query()->retrieve('ref_id', $refinery->kindlyTo()->int()); - - $link = ilLink::_getLink($ref_id); + $link = ilLink::_getLink($this->getRefId()); // prepare mail content // use language of recipient to compose message @@ -186,11 +173,11 @@ public static function sendNotification($a_action, $a_table_id, $a_record_id = n $ulng = ilLanguageFactory::_getLanguageOfUser($user_id); $ulng->loadLanguageModule('dcl'); - $subject = sprintf($ulng->txt('dcl_change_notification_subject'), $obj_dcl->getTitle()); + $subject = sprintf($ulng->txt('dcl_change_notification_subject'), $this->getTitle()); // update/delete $message = $ulng->txt("dcl_hello") . " " . ilObjUser::_lookupFullname($user_id) . ",\n\n"; $message .= $ulng->txt('dcl_change_notification_dcl_' . $a_action) . ":\n\n"; - $message .= $ulng->txt('obj_dcl') . ": " . $obj_dcl->getTitle() . "\n\n"; + $message .= $ulng->txt('obj_dcl') . ": " . $this->getTitle() . "\n\n"; $message .= $ulng->txt('dcl_table') . ": " . $obj_table->getTitle() . "\n\n"; $message .= $ulng->txt('dcl_record') . ":\n"; $message .= "------------------------------------\n"; @@ -201,9 +188,7 @@ public static function sendNotification($a_action, $a_table_id, $a_record_id = n // $message .= $ulng->txt('dcl_record_id').": ".$a_record_id.":\n"; $t = ""; - $ref_id = $http->wrapper()->query()->retrieve('ref_id', $refinery->kindlyTo()->int()); - - if ($tableview_id = $record->getTable()->getFirstTableViewId($ref_id, $user_id)) { + if ($tableview_id = $record->getTable()->getFirstTableViewId($this->getRefId(), $user_id)) { $visible_fields = ilDclTableView::find($tableview_id)->getVisibleFields(); if (empty($visible_fields)) { continue; @@ -221,7 +206,7 @@ public static function sendNotification($a_action, $a_table_id, $a_record_id = n } } } - $message .= $t; + $message .= $this->prepareMessageText($t); } $message .= "------------------------------------\n"; $message .= $ulng->txt('dcl_changed_by') . ": " . $ilUser->getFullname() . " " . ilUserUtil::getNamePresentation($ilUser->getId()) @@ -471,4 +456,24 @@ public function getStyleSheetId(): int { return 0; } + + public function prepareMessageText(string $body): string + { + if (preg_match_all('/<.*?br.*?>/', $body, $matches)) { + $matches = array_unique($matches[0]); + $brNewLineMatches = array_map(static function($match): string { + return $match . "\n"; + }, $matches); + + //Remove carriage return to guarantee all new line can be properly found + $body = str_replace("\r", '', $body); + //Replace occurrence of
+ \n with a single \n + $body = str_replace($brNewLineMatches, "\n", $body); + //Replace additional
with a \” + $body = str_replace($matches, "\n", $body); + //Revert removal of carriage return + return str_replace("\n", "\r\n", $body); + } + return $body; + } } From cc960ceeb03f85dc3c44c4505b0958e2f765c733 Mon Sep 17 00:00:00 2001 From: mjansen Date: Tue, 12 Dec 2023 09:15:41 +0100 Subject: [PATCH 255/497] Mail: Improve validation/error handling in MailAutoCompleteRecipientProvider The modifications improve data validation and exception handling in the "ilMailAutoCompleteSentMailsRecipientsProvider" class. Empty data cases are now accounted for and an "OutOfBoundsException" is thrown when no more users are available, making the logic cleaner and easier to follow. --- ...utoCompleteSentMailsRecipientsProvider.php | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php b/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php index b35030d90576..74bfe927a2af 100644 --- a/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php +++ b/Services/Mail/classes/class.ilMailAutoCompleteSentMailsRecipientsProvider.php @@ -23,15 +23,16 @@ */ class ilMailAutoCompleteSentMailsRecipientsProvider extends ilMailAutoCompleteRecipientProvider { - /** @var string[] */ - protected array $users_stack = []; + /** @var list */ + private array $users_stack = []; /** - * @return array{login?: string, firstname?: string, lastname?: string} + * @return array{login: string, firstname: string, lastname: string} + * @throws OutOfBoundsException */ public function current(): array { - if (is_array($this->data)) { + if (is_array($this->data) && !empty($this->data)) { return [ 'login' => $this->data['login'], 'firstname' => '', @@ -39,7 +40,7 @@ public function current(): array ]; } - if (count($this->users_stack) > 0) { + if ($this->users_stack !== []) { return [ 'login' => array_shift($this->users_stack), 'firstname' => '', @@ -47,11 +48,7 @@ public function current(): array ]; } - return [ - 'login' => '', - 'firstname' => '', - 'lastname' => '', - ]; + throw new OutOfBoundsException('No more users available'); } public function key(): string @@ -60,8 +57,8 @@ public function key(): string return $this->data['login']; } - if (count($this->users_stack) > 0) { - return $this->users_stack[0]; + if ($this->users_stack !== []) { + return $this->users_stack[0]['login']; } return ''; @@ -70,17 +67,18 @@ public function key(): string public function valid(): bool { $this->data = $this->db->fetchAssoc($this->res); - if ( - is_array($this->data) && + if (is_array($this->data) && + !empty($this->data) && ( strpos($this->data['login'], ',') || strpos($this->data['login'], ';') - ) - ) { - $parts = array_filter(array_map( - 'trim', - preg_split("/[ ]*[;,][ ]*/", trim($this->data['login'])) - )); + )) { + $parts = array_filter( + array_map( + 'trim', + preg_split("/[ ]*[;,][ ]*/", trim($this->data['login'])) + ) + ); foreach ($parts as $part) { if (ilStr::strPos(ilStr::strToLower($part), ilStr::strToLower($this->term)) !== false) { @@ -89,11 +87,11 @@ public function valid(): bool } if ($this->users_stack) { - $this->data = []; + $this->data = null; } } - return is_array($this->data) || count($this->users_stack) > 0; + return (is_array($this->data) && !empty($this->data)) || $this->users_stack !== []; } public function rewind(): void From 9872037730561913eeba2f91ef597b73a92c882e Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 12 Dec 2023 09:34:31 +0100 Subject: [PATCH 256/497] Object: Fix Back-Button Target in Adopt Content See: https://mantis.ilias.de/view.php?id=39304 --- Services/Object/classes/class.ilObjectCopyGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Object/classes/class.ilObjectCopyGUI.php b/Services/Object/classes/class.ilObjectCopyGUI.php index f3a45f49b8f1..e730d04dd14f 100644 --- a/Services/Object/classes/class.ilObjectCopyGUI.php +++ b/Services/Object/classes/class.ilObjectCopyGUI.php @@ -726,7 +726,7 @@ protected function showItemSelection(): void $back_cmd = ""; switch ($this->getMode()) { case self::SOURCE_SELECTION: - $back_cmd = 'showSourceSelectionTree'; + $back_cmd = 'adoptContent'; break; case self::TARGET_SELECTION: From 89f302eb716a35dc38d891f79693d60bbab1eef2 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Tue, 28 Nov 2023 12:23:46 +0100 Subject: [PATCH 257/497] LSO: add missing lang-vars for editor --- lang/ilias_de.lang | 2 ++ lang/ilias_en.lang | 2 ++ 2 files changed, 4 insertions(+) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 48bb50a15280..de680fb7f3b0 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -10396,6 +10396,8 @@ lso#:#abstract_img#:#Bild für die Einleitungsseite lso#:#avail_time_period#:#Zeitraum lso#:#completed_steps#:#Bestandene Schritte lso#:#condition_always#:#Immer +lso#:#cont_ed_insert_lsocurriculum#:#Lernsequenz Curriculum einfügen +lso#:#cont_ed_insert_lsostartbutton#:#Lernsequenz 'Start' einfügen lso#:#curriculum#:#Inhalt lso#:#delete_confirmation#:#Möchten Sie folgende Objekte wirklich löschen? lso#:#entries_deleted#:#Einträge wurden erfolgreich gelöscht. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 18c5f93e374f..4dac1e7aa644 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -10396,6 +10396,8 @@ lso#:#abstract_img#:#Image for Abstract lso#:#avail_time_period#:#Period lso#:#completed_steps#:#Passed Steps lso#:#condition_always#:#Always +lso#:#cont_ed_insert_lsocurriculum#:#Insert Learning Sequence Curriculum +lso#:#cont_ed_insert_lsostartbutton#:#Insert Learning Sequence Start Button lso#:#curriculum#:#Content lso#:#delete_confirmation#:#Are you sure you want to delete this objects? lso#:#entries_deleted#:#Successfully deleted entries. From 3776a43d5c3815230f39c878c22a2be99c4ea4db Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 12 Dec 2023 10:02:05 +0100 Subject: [PATCH 258/497] User: Fix Anonymous Starting Point Does Not Work See: https://mantis.ilias.de/view.php?id=26343 --- Services/AccessControl/classes/class.ilStartingPoint.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Services/AccessControl/classes/class.ilStartingPoint.php b/Services/AccessControl/classes/class.ilStartingPoint.php index 34ef691128c2..7c5ee8a7e871 100644 --- a/Services/AccessControl/classes/class.ilStartingPoint.php +++ b/Services/AccessControl/classes/class.ilStartingPoint.php @@ -240,6 +240,9 @@ public static function getGlobalRolesWithoutStartingPoint(): array $roles = array(); foreach ($ids_roles_without_sp as $roleid) { + if ($roleid === ANONYMOUS_ROLE_ID) { + continue; + } $role_obj = new ilObjRole($roleid); $roles[] = array( "id" => $role_obj->getId(), From b1dda65cb6ccf7e16ba0c849757af036788761bf Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 30 Nov 2023 12:32:54 +0100 Subject: [PATCH 259/497] OrgUnit: fix internal links in custom md (24875) --- Modules/OrgUnit/classes/class.ilObjOrgUnitGUI.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Modules/OrgUnit/classes/class.ilObjOrgUnitGUI.php b/Modules/OrgUnit/classes/class.ilObjOrgUnitGUI.php index 31a71a90d193..60538b91104d 100644 --- a/Modules/OrgUnit/classes/class.ilObjOrgUnitGUI.php +++ b/Modules/OrgUnit/classes/class.ilObjOrgUnitGUI.php @@ -268,6 +268,18 @@ public function executeCommand(): void $ilOrgUnitUserAssignmentGUI = new ilOrgUnitUserAssignmentGUI(); $this->ctrl->forwardCommand($ilOrgUnitUserAssignmentGUI); break; + case strtolower(ilPropertyFormGUI::class): + /* + * Only used for async loading of the repository tree in custom md + * internal links (see #24875). This is necessary since OrgUnits don't + * use ilObjectMetaDataGUI. + */ + $form = $this->initAdvancedSettingsForm(); + $gui = new ilAdvancedMDRecordGUI(ilAdvancedMDRecordGUI::MODE_EDITOR, 'orgu', $this->object->getId(), 'orgu_type', $this->object->getOrgUnitTypeId()); + $gui->setPropertyForm($form); + $gui->parse(); + $this->ctrl->forwardCommand($form); + break; default: $this->tabs_gui->activateTab(self::TAB_VIEW_CONTENT); switch ($cmd) { From b4ac37449ef1358841bd6cfaac35751d572fc1e4 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 12 Dec 2023 10:47:36 +0100 Subject: [PATCH 260/497] RBAC: Fix Tabs in Role Copy And Delete See: https://mantis.ilias.de/view.php?id=31916 --- Services/AccessControl/classes/class.ilObjRoleGUI.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Services/AccessControl/classes/class.ilObjRoleGUI.php b/Services/AccessControl/classes/class.ilObjRoleGUI.php index 3c06c1e031bc..50ed4056a5f8 100755 --- a/Services/AccessControl/classes/class.ilObjRoleGUI.php +++ b/Services/AccessControl/classes/class.ilObjRoleGUI.php @@ -531,6 +531,9 @@ protected function adoptPermObject(): void { $output = []; $parent_role_ids = $this->rbac_review->getParentRoleIds($this->obj_ref_id, true); + + $this->tabs_gui->clearTargets(); + $ids = []; foreach (array_keys($parent_role_ids) as $id) { $ids[] = $id; @@ -561,6 +564,8 @@ protected function adoptPermObject(): void */ protected function confirmDeleteRoleObject(): void { + $this->tabs_gui->clearTargets(); + if (!$this->checkAccess('visible,write', 'edit_permission')) { $this->tpl->setOnScreenMessage('msg_no_perm_perm', $this->lng->txt('permission_denied'), true); $this->ctrl->redirectByClass(ilRepositoryGUI::class); @@ -1011,7 +1016,6 @@ protected function addAdminLocatorItems(bool $do_not_add_object = false): void protected function getTabs(): void { $base_role_container = $this->rbac_review->getFoldersAssignedToRole($this->object->getId(), true); - $activate_role_edit = false; // todo: activate the following (allow editing of local roles in From d8352fefe4d67bd6d95e97edded350a7c9ed47c2 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 12 Dec 2023 17:17:09 +0100 Subject: [PATCH 261/497] Test: Fix Allow Empty Cloze-Text Feedback --- Modules/TestQuestionPool/classes/class.assClozeTestGUI.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/TestQuestionPool/classes/class.assClozeTestGUI.php b/Modules/TestQuestionPool/classes/class.assClozeTestGUI.php index 0aa32c413d3d..21f4ab5b2154 100755 --- a/Modules/TestQuestionPool/classes/class.assClozeTestGUI.php +++ b/Modules/TestQuestionPool/classes/class.assClozeTestGUI.php @@ -1285,7 +1285,8 @@ public function getSpecificFeedbackOutput(array $userSolution): string foreach ($this->object->gaps as $gapIndex => $gap) { $answerValue = $this->object->fetchAnswerValueForGap($userSolution, $gapIndex); - if ($answerValue === '') { + if ($gap->getType() !== assClozeGap::TYPE_TEXT + && $answerValue === '') { continue; } $answerIndex = $this->object->feedbackOBJ->determineAnswerIndexForAnswerValue($gap, $answerValue); From 1b0c0f6703c2e8381e5e8b65822aedb819cd9ad3 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 12 Dec 2023 18:54:23 +0100 Subject: [PATCH 262/497] Test: Fix Determination of Cloze-Feedback See: https://mantis.ilias.de/view.php?id=39371 --- .../feedback/class.ilAssClozeTestFeedback.php | 22 +++++++++++++++++++ ...class.ilAssMultiOptionQuestionFeedback.php | 21 +++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/Modules/TestQuestionPool/classes/feedback/class.ilAssClozeTestFeedback.php b/Modules/TestQuestionPool/classes/feedback/class.ilAssClozeTestFeedback.php index a62bd6f3e575..2a4d7594a2ca 100644 --- a/Modules/TestQuestionPool/classes/feedback/class.ilAssClozeTestFeedback.php +++ b/Modules/TestQuestionPool/classes/feedback/class.ilAssClozeTestFeedback.php @@ -770,6 +770,28 @@ protected function fetchFeedbackIdsForGapAnswersMode(): array return $feedbackIds; } + public function isSpecificAnswerFeedbackAvailable(int $question_id): bool + { + if ($this->questionOBJ->getFeedbackMode() === self::FB_MODE_GAP_QUESTION) { + $feedback_ids = $this->fetchFeedbackIdsForGapQuestionMode(); + } else { + $feedback_ids = $this->fetchFeedbackIdsForGapAnswersMode(); + } + + if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) { + $all_feedback_content = ''; + foreach ($feedback_ids as $feedback_id) { + $all_feedback_content .= $this->getPageObjectXML( + $this->getSpecificAnswerFeedbackPageObjectType(), + $feedback_id + ); + } + return trim(strip_tags($all_feedback_content)) !== ''; + } + + return implode('', $this->getSpecificFeedbackContentForFeedbackIds($feedback_ids)) !== ''; + } + /** * @param int[] $feedbackIds */ diff --git a/Modules/TestQuestionPool/classes/feedback/class.ilAssMultiOptionQuestionFeedback.php b/Modules/TestQuestionPool/classes/feedback/class.ilAssMultiOptionQuestionFeedback.php index 23ae5954bd80..e04b014e5842 100644 --- a/Modules/TestQuestionPool/classes/feedback/class.ilAssMultiOptionQuestionFeedback.php +++ b/Modules/TestQuestionPool/classes/feedback/class.ilAssMultiOptionQuestionFeedback.php @@ -153,7 +153,7 @@ public function getAllSpecificAnswerFeedbackContents(int $questionId): string require_once 'Services/RTE/classes/class.ilRTE.php'; $res = $this->db->queryF( - "SELECT * FROM {$this->getSpecificFeedbackTableName()} WHERE question_fi = %s", + "SELECT feedback FROM {$this->getSpecificFeedbackTableName()} WHERE question_fi = %s", ['integer'], [$questionId] ); @@ -298,6 +298,25 @@ final protected function getSpecificAnswerFeedbackId(int $questionId, int $quest return $row['feedback_id'] ?? -1; } + /** + * + * @param array $feedback_ids + * @return array + */ + protected function getSpecificFeedbackContentForFeedbackIds(array $feedback_ids): array + { + $res = $this->db->query( + "SELECT feedback_id, feedback FROM {$this->getSpecificFeedbackTableName()} WHERE " + . $this->db->in('feedback_id', $feedback_ids, false, ilDBConstants::T_INTEGER) + ); + + $content = []; + while($row = $this->db->fetchAssoc($res)) { + $content[$row['feedback_id']] = $row['feedback']; + } + return $content; + } + protected function isSpecificAnswerFeedbackId(int $feedbackId): bool { $row = $this->db->fetchAssoc($this->db->queryF( From e7646210395182fa77cf40b88d8740aa272a38ce Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Wed, 13 Dec 2023 07:59:40 +0100 Subject: [PATCH 263/497] Test: Fix Variable Substitution In Formulas See: https://mantis.ilias.de/view.php?id=39297 --- .../classes/class.assFormulaQuestion.php | 4 +++- .../TestQuestionPool/classes/class.assQuestion.php | 11 ++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php b/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php index b60642197602..579599facab7 100755 --- a/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php +++ b/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php @@ -264,7 +264,7 @@ public function substituteVariables(array $userdata, bool $graphicalOutput = fal return false; } - $text = $this->getQuestionForHTMLOutput(); + $text = $this->getQuestion(); foreach ($this->fetchAllVariables($this->getQuestion()) as $varObj) { if (isset($userdata[$varObj->getVariable()]) && strlen($userdata[$varObj->getVariable()])) { @@ -277,6 +277,8 @@ public function substituteVariables(array $userdata, bool $graphicalOutput = fal $text = preg_replace("/\\$" . substr($varObj->getVariable(), 1) . "(?![0-9]+)/", $val . " " . $unit . "\\1", $text); } + $text = $this->purifyAndPrepareTextAreaOutput($text); + if (preg_match_all("/(\\\$r\\d+)/ims", $this->getQuestion(), $rmatches)) { foreach ($rmatches[1] as $result) { $resObj = $this->getResult($result); diff --git a/Modules/TestQuestionPool/classes/class.assQuestion.php b/Modules/TestQuestionPool/classes/class.assQuestion.php index 13270a2a2e81..373d0a73df4f 100755 --- a/Modules/TestQuestionPool/classes/class.assQuestion.php +++ b/Modules/TestQuestionPool/classes/class.assQuestion.php @@ -2966,13 +2966,18 @@ public function getQuestion(): string public function getQuestionForHTMLOutput(): string { - $question_text = $this->getHtmlQuestionContentPurifier()->purify($this->question); + return $this->purifyAndPrepareTextAreaOutput($this->question); + } + + protected function purifyAndPrepareTextAreaOutput(string $content) : string + { + $purified_content = $this->getHtmlQuestionContentPurifier()->purify($content); if ($this->isAdditionalContentEditingModePageObject() || !(new ilSetting('advanced_editing'))->get('advanced_editing_javascript_editor') === 'tinymce') { - $question_text = nl2br($question_text); + $purified_content = nl2br($purified_content); } return $this->prepareTextareaOutput( - $question_text, + $purified_content, true, true ); From a9b1ef0ea5e022c2f50cc23e72ca012cd896b146 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 13 Dec 2023 11:12:50 +0100 Subject: [PATCH 264/497] Maps: 39144, check for input (#6783) --- Services/Form/classes/class.ilLocationInputGUI.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Services/Form/classes/class.ilLocationInputGUI.php b/Services/Form/classes/class.ilLocationInputGUI.php index df9e239d6d19..d1d0210296eb 100755 --- a/Services/Form/classes/class.ilLocationInputGUI.php +++ b/Services/Form/classes/class.ilLocationInputGUI.php @@ -1,7 +1,5 @@ lng; $val = $this->strArray($this->getPostVar()); - if ($this->getRequired() && - (trim($val["latitude"]) == "" || trim($val["longitude"]) == "")) { + if ($this->getRequired() && ( + !isset($val["latitude"]) || trim($val["latitude"]) == "" || + !isset($val["longitude"]) || trim($val["longitude"]) == "" + )) { $this->setAlert($lng->txt("msg_input_is_required")); return false; } @@ -113,8 +115,8 @@ public function getInput(): array { $val = $this->strArray($this->getPostVar()); return [ - "latitude" => (float) $val["latitude"], - "longitude" => (float) $val["longitude"], + "latitude" => (float) ($val["latitude"] ?? 0), + "longitude" => (float) ($val["longitude"] ?? 0), "zoom" => (int) ($val["zoom"] ?? 0), "address" => ($val["address"] ?? "") ]; From 851e1637a20f54bf6a60661101b59babd197a260 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 13 Dec 2023 17:19:25 +0100 Subject: [PATCH 265/497] excercise: added log entries --- Modules/Exercise/classes/class.ilExerciseManagementGUI.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Modules/Exercise/classes/class.ilExerciseManagementGUI.php b/Modules/Exercise/classes/class.ilExerciseManagementGUI.php index 4ceedfa8f920..7937184e72ef 100644 --- a/Modules/Exercise/classes/class.ilExerciseManagementGUI.php +++ b/Modules/Exercise/classes/class.ilExerciseManagementGUI.php @@ -2147,9 +2147,11 @@ public function openSubmissionViewObject(bool $print_version = false): void // e.g. ///ilExercise/3/exc_367/subm_1//20210628175716_368 $zip_original_full_path = $this->getSubmissionZipFilePath($submission, $print_version); + $this->log->debug("zip original full path: " . $zip_original_full_path); // e.g. ilExercise/3/exc_367/subm_1//20210628175716_368 $zip_internal_path = $this->getWebFilePathFromExternalFilePath($zip_original_full_path); + $this->log->debug("zip internal path: " . $zip_internal_path); $arr = explode("_", basename($zip_original_full_path)); $obj_date = $arr[0]; @@ -2175,6 +2177,7 @@ public function openSubmissionViewObject(bool $print_version = false): void $obj_dir . DIRECTORY_SEPARATOR . "index.html"; + $this->log->debug("index html file: " . $index_html_file); ilWACSignedPath::signFolderOfStartFile($index_html_file); @@ -2185,10 +2188,12 @@ public function openSubmissionViewObject(bool $print_version = false): void $error_msg = ""; if ($zip_original_full_path) { $file_copied = $this->copyFileToWebDir($zip_internal_path); + $this->log->debug("file copied: " . $file_copied); if ($file_copied) { ilFileUtils::unzip($file_copied, true); $web_filesystem->delete($zip_internal_path); + $this->log->debug("deleting: " . $zip_internal_path); $submission_repository = $this->service->repo()->submission(); $submission_repository->updateWebDirAccessTime($this->assignment->getId(), $member_id); @@ -2246,11 +2251,13 @@ protected function copyFileToWebDir( $zip_file = basename($internal_file_path); if ($data_filesystem->has($internal_file_path)) { + $this->log->debug("internal file path: " . $internal_file_path); if (!$web_filesystem->hasDir($internal_dirs)) { $web_filesystem->createDir($internal_dirs); } if (!$web_filesystem->has($internal_file_path)) { + $this->log->debug("writing: " . $internal_file_path); $stream = $data_filesystem->readStream($internal_file_path); $web_filesystem->writeStream($internal_file_path, $stream); From f43b8071972b4b645fb3b3665fa7b0bf25cb3f06 Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 14 Dec 2023 07:56:35 +0100 Subject: [PATCH 266/497] Mail: Change size presentation See: https://mantis.ilias.de/view.php?id=39454 (cherry picked from commit 2c5642fb1845809278ade4d6b6d2467fdbeb1111) --- Services/Mail/classes/class.ilMailAttachmentTableGUI.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/Mail/classes/class.ilMailAttachmentTableGUI.php b/Services/Mail/classes/class.ilMailAttachmentTableGUI.php index f42233ad95ff..aee7911753e3 100644 --- a/Services/Mail/classes/class.ilMailAttachmentTableGUI.php +++ b/Services/Mail/classes/class.ilMailAttachmentTableGUI.php @@ -1,7 +1,5 @@ * @ingroup ServicesMail @@ -90,7 +90,7 @@ protected function formatValue(string $column, string $value): ?string return ilDatePresentation::formatDate(new ilDateTime($value, IL_CAL_UNIX)); case 'filesize': - return ilUtil::formatSize((int) $value); + return ilUtil::formatSize((int) $value, 'long'); default: return $value; From 6965ceeebd4a20c1a0a2650ac8fc9f6529d1e06b Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 14 Dec 2023 10:13:20 +0100 Subject: [PATCH 267/497] Test: Fix Unnecessary Parameter in Back-Link See: https://mantis.ilias.de/view.php?id=34472 --- .../TestQuestionPool/classes/class.ilAssQuestionPreviewGUI.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/TestQuestionPool/classes/class.ilAssQuestionPreviewGUI.php b/Modules/TestQuestionPool/classes/class.ilAssQuestionPreviewGUI.php index 332ab888623f..9fcac3835eea 100644 --- a/Modules/TestQuestionPool/classes/class.ilAssQuestionPreviewGUI.php +++ b/Modules/TestQuestionPool/classes/class.ilAssQuestionPreviewGUI.php @@ -151,7 +151,8 @@ public function initQuestion($questionId, $parentObjId): void $this->tabs->setBackTarget($this->lng->txt("qpl"), ilLink::_getLink($ref_id)); } } else { - $this->tabs->setBackTarget($this->lng->txt("backtocallingpool"), $this->ctrl->getLinkTargetByClass("ilobjquestionpoolgui", "questions")); + $this->ctrl->clearParameterByClass(ilObjQuestionPoolGUI::class, 'q_id'); + $this->tabs->setBackTarget($this->lng->txt("backtocallingpool"), $this->ctrl->getLinkTargetByClass(ilObjQuestionPoolGUI::class, "questions")); } } } From 809d238dfbb94c875ddfe4ee64d513aac998087c Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 14 Dec 2023 11:08:14 +0100 Subject: [PATCH 268/497] Calendar: display consultation hours in repository in additional block (37245) --- Services/Block/classes/class.ilColumnGUI.php | 14 ++- .../class.ilConsultationHourUtils.php | 25 +++-- .../classes/class.ilCalendarBlockGUI.php | 42 +------ ...ss.ilConsultationHoursCalendarBlockGUI.php | 104 ++++++++++++++++++ lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 6 files changed, 136 insertions(+), 51 deletions(-) create mode 100644 Services/Calendar/classes/class.ilConsultationHoursCalendarBlockGUI.php diff --git a/Services/Block/classes/class.ilColumnGUI.php b/Services/Block/classes/class.ilColumnGUI.php index b374cbeddfab..cfcd33eb31df 100644 --- a/Services/Block/classes/class.ilColumnGUI.php +++ b/Services/Block/classes/class.ilColumnGUI.php @@ -1,7 +1,5 @@ "Services/News/", "ilCalendarBlockGUI" => "Services/Calendar/", "ilPDCalendarBlockGUI" => "Services/Calendar/", + "ilConsultationHoursCalendarBlockGUI" => "Services/Calendar/", "ilPDTasksBlockGUI" => "Services/Tasks/", "ilPDMailBlockGUI" => "Services/Mail/", "ilPDSelectedItemsBlockGUI" => "Services/Dashboard/ItemsBlock/", @@ -91,6 +92,7 @@ class ilColumnGUI "ilNewsForContextBlockGUI" => "news", "ilCalendarBlockGUI" => "cal", "ilPDCalendarBlockGUI" => "pdcal", + "ilConsultationHoursCalendarBlockGUI" => "chcal", "ilPDSelectedItemsBlockGUI" => "pditems", 'ilPollBlockGUI' => 'poll', 'ilClassificationBlockGUI' => 'clsfct', @@ -107,11 +109,13 @@ class ilColumnGUI "crs" => array( "ilNewsForContextBlockGUI" => IL_COL_RIGHT, "ilCalendarBlockGUI" => IL_COL_RIGHT, + "ilConsultationHoursCalendarBlockGUI" => IL_COL_RIGHT, "ilClassificationBlockGUI" => IL_COL_RIGHT ), "grp" => array( "ilNewsForContextBlockGUI" => IL_COL_RIGHT, "ilCalendarBlockGUI" => IL_COL_RIGHT, + "ilConsultationHoursCalendarBlockGUI" => IL_COL_RIGHT, "ilClassificationBlockGUI" => IL_COL_RIGHT ), "frm" => array("ilNewsForContextBlockGUI" => IL_COL_RIGHT), @@ -148,6 +152,7 @@ class ilColumnGUI array("news" => true, "cal" => true, "pdcal" => true, + "chcal" => true, "pdnews" => true, "pdtag" => true, "pdmail" => true, @@ -564,6 +569,9 @@ public function determineBlocks(): void if ($type == "cal") { $nr = -8; } + if ($type == "chcal") { // consultation hours always directly below calendar + $nr = -7; + } if ($type == "pdfeedb") { // always show feedback request second $nr = -10; } @@ -714,7 +722,7 @@ protected function isGloballyActivated( ); } elseif ($ilSetting->get("block_activated_" . $a_type)) { return true; - } elseif ($a_type == 'cal') { + } elseif ($a_type == 'cal' || $a_type == 'chcal') { return ilCalendarSettings::lookupCalendarContentPresentationEnabled($ilCtrl->getContextObjId()); } elseif ($a_type == 'pdcal') { if (!$this->dash_side_panel_settings->isEnabled($this->dash_side_panel_settings::CALENDAR)) { diff --git a/Services/Calendar/classes/ConsultationHours/class.ilConsultationHourUtils.php b/Services/Calendar/classes/ConsultationHours/class.ilConsultationHourUtils.php index 70677117a985..624fc5e40f72 100644 --- a/Services/Calendar/classes/ConsultationHours/class.ilConsultationHourUtils.php +++ b/Services/Calendar/classes/ConsultationHours/class.ilConsultationHourUtils.php @@ -1,8 +1,22 @@ @@ -17,7 +31,6 @@ public static function getConsultationHourLinksForRepositoryObject( global $DIC; $ctrl = $DIC->ctrl(); - $lng = $DIC->language(); $logger = $DIC->logger()->cal(); $ctrl->setParameterByClass(end($ctrl_class_structure), 'seed', ''); $ctrl->setParameterByClass(end($ctrl_class_structure), 'category_id', ''); @@ -63,11 +76,7 @@ public static function getConsultationHourLinksForRepositoryObject( } $current_link = [ 'link' => $ctrl->getLinkTargetByClass($ctrl_class_structure, 'selectCHCalendarOfUser'), - 'txt' => str_replace( - "%1", - ilObjUser::_lookupFullname($user_id), - $lng->txt("cal_consultation_hours_for_user") - ) + 'txt' => ilObjUser::_lookupFullname($user_id) ]; $links[] = $current_link; } diff --git a/Services/Calendar/classes/class.ilCalendarBlockGUI.php b/Services/Calendar/classes/class.ilCalendarBlockGUI.php index 9ad581ffb48f..45779ec3409d 100644 --- a/Services/Calendar/classes/class.ilCalendarBlockGUI.php +++ b/Services/Calendar/classes/class.ilCalendarBlockGUI.php @@ -1,7 +1,5 @@ addConsultationHourButtons($panel_tpl); $this->addSubscriptionButton($panel_tpl); return $tpl->get() . $panel_tpl->get(); @@ -908,43 +907,6 @@ public function getNoItemFoundContent(): string return $this->lng->txt("cal_no_events_block"); } - /** - * Add consultation hour buttons - */ - protected function addConsultationHourButtons(ilTemplate $panel_template): void - { - global $DIC; - - $user = $DIC->user(); - - if (!$this->getRepositoryMode()) { - return; - } - - $links = \ilConsultationHourUtils::getConsultationHourLinksForRepositoryObject( - (int) $this->requested_ref_id, - $user->getId(), - $this->getTargetGUIClassPath() - ); - $counter = 0; - foreach ($links as $link) { - $ui_factory = $DIC->ui()->factory(); - $ui_renderer = $DIC->ui()->renderer(); - - $link_button = $ui_factory->button()->shy( - $link['txt'], - $link['link'] - ); - if ($counter) { - $panel_template->touchBlock('consultation_hour_buttons_multi'); - } - $panel_template->setCurrentBlock('consultation_hour_buttons'); - $panel_template->setVariable('SHY_BUTTON', $ui_renderer->render([$link_button])); - $panel_template->parseCurrentBlock(); - $counter++; - } - } - /** * Add subscription button */ diff --git a/Services/Calendar/classes/class.ilConsultationHoursCalendarBlockGUI.php b/Services/Calendar/classes/class.ilConsultationHoursCalendarBlockGUI.php new file mode 100644 index 000000000000..24dd90b68ba6 --- /dev/null +++ b/Services/Calendar/classes/class.ilConsultationHoursCalendarBlockGUI.php @@ -0,0 +1,104 @@ +lng->loadLanguageModule("dateplaner"); + + $this->setBlockId('ch_' . $this->ctrl->getContextObjId()); + $this->setLimit(5); + $this->setEnableNumInfo(false); + $this->setTitle($this->lng->txt('consultation_hours_block_title')); + $this->setPresentation(self::PRES_SEC_LIST); + } + + public function getBlockType(): string + { + return 'chcal'; + } + + protected function isRepositoryObject(): bool + { + return false; + } + + /** + * Get target gui class path (for presenting the calendar) + */ + public function getTargetGUIClassPath(): array + { + $target_class = []; + if (!$this->getRepositoryMode()) { + $target_class = ["ildashboardgui", "ilcalendarpresentationgui"]; + } else { + switch (ilObject::_lookupType((int) $this->requested_ref_id, true)) { + case "crs": + $target_class = ["ilobjcoursegui", "ilcalendarpresentationgui"]; + break; + + case "grp": + $target_class = ["ilobjgroupgui", "ilcalendarpresentationgui"]; + break; + } + } + return $target_class; + } + + public function getData(): array + { + if (isset($this->consultation_hour_links)) { + return $this->consultation_hour_links; + } + return $this->consultation_hour_links = \ilConsultationHourUtils::getConsultationHourLinksForRepositoryObject( + (int) $this->requested_ref_id, + $this->user->getId(), + $this->getTargetGUIClassPath() + ); + } + + protected function getListItemForData(array $data): Item + { + $button = $this->ui->factory()->button()->shy( + $data['txt'] ?? '', + $data['link'] ?? '' + ); + return $this->ui->factory()->item()->standard($button); + } + + public function getHTMLNew(): string + { + if (empty($this->getData())) { + return ''; + } + return parent::getHTMLNew(); + } +} diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index de680fb7f3b0..024cd9dbed71 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -8367,6 +8367,7 @@ dateplaner#:#cal_weekly#:#Wöchentlich dateplaner#:#cal_where#:#Ort dateplaner#:#cal_year_s#:#Jahr(e) dateplaner#:#cal_yearly#:#Jährlich +dateplaner#:#consultation_hours_block_title#:#Sprechstunden dateplaner#:#created#:#erstellt am dateplaner#:#crs_cal_activation_end#:#Kursende dateplaner#:#crs_cal_activation_start#:#Kursbeginn diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 4dac1e7aa644..57e5e7d7e295 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -8367,6 +8367,7 @@ dateplaner#:#cal_weekly#:#Weekly dateplaner#:#cal_where#:#Location dateplaner#:#cal_year_s#:#Year(s) dateplaner#:#cal_yearly#:#Yearly +dateplaner#:#consultation_hours_block_title#:#Consultation Hours dateplaner#:#created#:#Created dateplaner#:#crs_cal_activation_end#:#Course Availability ends dateplaner#:#crs_cal_activation_start#:#Course Availability starts From 798368c3b5cc75d5f00022cbfe2503084ed9512d Mon Sep 17 00:00:00 2001 From: Uwe Kohnle Date: Thu, 14 Dec 2023 12:55:43 +0000 Subject: [PATCH 269/497] avoid multiple satisfied for some content --- .../XapiResults/class.ilXapiStatementEvaluation.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Modules/CmiXapi/classes/XapiResults/class.ilXapiStatementEvaluation.php b/Modules/CmiXapi/classes/XapiResults/class.ilXapiStatementEvaluation.php index 3f51cbbe8587..7b68a57dee42 100755 --- a/Modules/CmiXapi/classes/XapiResults/class.ilXapiStatementEvaluation.php +++ b/Modules/CmiXapi/classes/XapiResults/class.ilXapiStatementEvaluation.php @@ -135,9 +135,12 @@ public function evaluateStatement(object $xapiStatement, int $usrId): void if (($xapiVerb == ilCmiXapiVerbList::COMPLETED || $xapiVerb == ilCmiXapiVerbList::PASSED) && $this->isLpModeInterestedInResultStatus($newResultStatus, false)) { // it is possible to check against authToken usrId! $cmixUser = $this->getCmixUser($xapiStatement); - $cmixUser->setSatisfied(true); - $cmixUser->save(); - $this->sendSatisfiedStatement($cmixUser); + // avoid multiple satisfied + if (!$cmixUser->getSatisfied()) { + $cmixUser->setSatisfied(true); + $cmixUser->save(); + $this->sendSatisfiedStatement($cmixUser); + } } } } From b801200689c7446591bb926ae5de58633d19f7ab Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 14 Dec 2023 15:07:29 +0100 Subject: [PATCH 270/497] User: Fix LangVar for User Information See: https://mantis.ilias.de/view.php?id=26138 --- lang/ilias_bg.lang | 4 ++-- lang/ilias_cs.lang | 2 +- lang/ilias_de.lang | 6 +++--- lang/ilias_el.lang | 6 +++--- lang/ilias_en.lang | 6 +++--- lang/ilias_es.lang | 2 +- lang/ilias_et.lang | 2 +- lang/ilias_fa.lang | 6 +++--- lang/ilias_fr.lang | 2 +- lang/ilias_hr.lang | 6 +++--- lang/ilias_it.lang | 4 ++-- lang/ilias_ja.lang | 6 +++--- lang/ilias_lt.lang | 2 +- lang/ilias_nl.lang | 4 ++-- lang/ilias_pt.lang | 6 +++--- lang/ilias_ro.lang | 2 +- lang/ilias_ru.lang | 4 ++-- lang/ilias_sk.lang | 4 ++-- lang/ilias_sl.lang | 6 +++--- lang/ilias_sq.lang | 4 ++-- lang/ilias_sr.lang | 2 +- lang/ilias_tr.lang | 6 +++--- lang/ilias_uk.lang | 4 ++-- lang/ilias_vi.lang | 4 ++-- lang/ilias_zh.lang | 4 ++-- 25 files changed, 52 insertions(+), 52 deletions(-) diff --git a/lang/ilias_bg.lang b/lang/ilias_bg.lang index 15c91c6d8063..b397783ee148 100644 --- a/lang/ilias_bg.lang +++ b/lang/ilias_bg.lang @@ -5341,8 +5341,8 @@ common#:#reg_mail_body_salutation#:#Здравейте common#:#reg_mail_body_text1#:#Добре дошли в ILIAS eLearning! common#:#reg_mail_body_text2#:#За достъп в ILIAS използвайте следните данни: common#:#reg_mail_body_text3#:#Допълнителна лична информация: -common#:#reg_mail_subject#:#ILIAS eLearning - Вашите данни за достъп -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Вашата връзка за потвърждение +common#:#reg_mail_subject#:#Вашите данни за достъп +common#:#reg_mail_subject_confirmation#:#Вашата връзка за потвърждение common#:#reg_passwd_via_mail#:#Вашата парола ще бъде изпратена на вашия имейл адрес, даден по-долу. common#:#register#:#Регистриране common#:#register_notification#:#"%s" е кандидатствал за сесия "%s". diff --git a/lang/ilias_cs.lang b/lang/ilias_cs.lang index ddc917917899..7cba9c681da3 100644 --- a/lang/ilias_cs.lang +++ b/lang/ilias_cs.lang @@ -5282,7 +5282,7 @@ common#:#private_notes#:#Osobní poznámky common#:#pro#:#Pro common#:#proceed#:#Postoupit common#:#profile#:#Profil -common#:#profile_changed#:#ILIAS eLearning - Váš profil byl změněn +common#:#profile_changed#:#Váš profil byl změněn common#:#profile_incomplete#:#Váš profil není kompletní. Vyplňte prosím všechna požadovaná data. common#:#profile_of#:#Profil pro common#:#properties#:#Vlastnosti diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 024cd9dbed71..df3afc3f0b10 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -5297,7 +5297,7 @@ common#:#private_notes#:#Private Notizen common#:#pro#:#Pro common#:#proceed#:#Fortfahren common#:#profile#:#Profil -common#:#profile_changed#:#ILIAS eLearning - Ihre Profildaten wurden geändert +common#:#profile_changed#:#Ihre Profildaten wurden geändert common#:#profile_incomplete#:#Ihr Profil ist nicht vollständig. Bitte geben Sie alle erforderlichen Daten an. common#:#profile_of#:#Profil von common#:#properties#:#Eigenschaften @@ -5356,8 +5356,8 @@ common#:#reg_mail_body_salutation#:#Hallo common#:#reg_mail_body_text1#:#Willkommen auf der eLearning-Plattform ILIAS! common#:#reg_mail_body_text2#:#Ihre Zugangsdaten: common#:#reg_mail_body_text3#:#Weitere persönliche Angaben: -common#:#reg_mail_subject#:#ILIAS eLearning - Ihre Zugangsdaten -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Ihr Bestätigungslink +common#:#reg_mail_subject#:#Ihre Zugangsdaten +common#:#reg_mail_subject_confirmation#:#Ihr Bestätigungslink common#:#reg_passwd_via_mail#:#Das Passwort wird an die unten eingegebene E-Mail-Adresse geschickt. common#:#register#:#Registrieren common#:#register_notification#:#"%s" hat die Teilnahme an der Sitzung "%s" beantragt. diff --git a/lang/ilias_el.lang b/lang/ilias_el.lang index 0df9967adb86..21b543985780 100644 --- a/lang/ilias_el.lang +++ b/lang/ilias_el.lang @@ -5283,7 +5283,7 @@ common#:#private_notes#:#Ιδιωτικές σημειώσεις common#:#pro#:#Προ common#:#proceed#:#Proceed common#:#profile#:#Προφίλ -common#:#profile_changed#:#ILIAS eLearning - Το προφίλ σας έχει αλλάξει +common#:#profile_changed#:#Το προφίλ σας έχει αλλάξει common#:#profile_incomplete#:#Το προφίλ σας είναι ελλειπές. Παρακαλώ συμπληρώστε όλα τ' απαραίτητα δεδομένα. common#:#profile_of#:#Προφίλ του common#:#properties#:#Ιδιότητες @@ -5342,8 +5342,8 @@ common#:#reg_mail_body_salutation#:#Γεια common#:#reg_mail_body_text1#:#Καλως ήρθατε στο σύστημα τηλεκατάρτισης ILIAS! common#:#reg_mail_body_text2#:#Για να έχετε πρόσβαση στο ILIAS χρησιμοποιείστε τα ακόλουθα δεδομένα: common#:#reg_mail_body_text3#:#Περαιτέρω προσωπικές πληροφορίες: -common#:#reg_mail_subject#:#ILIAS eLearning - Τα δεδομένα πρόσβασής σας -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmationlink###24 07 2009 new variable +common#:#reg_mail_subject#:#Τα δεδομένα πρόσβασής σας +common#:#reg_mail_subject_confirmation#:#Your Confirmationlink###24 07 2009 new variable common#:#reg_passwd_via_mail#:#Ο κωδικός θα σας αποσταλεί στην email διεύθυνση σας που δίνεται παρακάτω. common#:#register#:#Εγγραφή common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 57e5e7d7e295..aa4e7275b983 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -5297,7 +5297,7 @@ common#:#private_notes#:#Private Notes common#:#pro#:#Pro common#:#proceed#:#Proceed common#:#profile#:#Profile -common#:#profile_changed#:#ILIAS eLearning - Your profile has changed +common#:#profile_changed#:#Your profile has changed common#:#profile_incomplete#:#Your profile is incomplete. Please fill in all required data. common#:#profile_of#:#Profile of common#:#properties#:#Properties @@ -5356,8 +5356,8 @@ common#:#reg_mail_body_salutation#:#Hello common#:#reg_mail_body_text1#:#Welcome to ILIAS eLearning! common#:#reg_mail_body_text2#:#To access ILIAS use the following data: common#:#reg_mail_body_text3#:#Further personal information: -common#:#reg_mail_subject#:#ILIAS eLearning - Your access data -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmation Link +common#:#reg_mail_subject#:#Your access data +common#:#reg_mail_subject_confirmation#:#Your Confirmation Link common#:#reg_passwd_via_mail#:#Your password will be sent to your e-mail address given below. common#:#register#:#Register common#:#register_notification#:#"%s" has applied for session "%s". diff --git a/lang/ilias_es.lang b/lang/ilias_es.lang index 3943c78de24a..48f347c9e1b4 100644 --- a/lang/ilias_es.lang +++ b/lang/ilias_es.lang @@ -5344,7 +5344,7 @@ common#:#reg_mail_body_text1#:#¡Bienvenido a ILIAS! common#:#reg_mail_body_text2#:#Para acceder a ILIAS use los siguientes datos: common#:#reg_mail_body_text3#:#Información personal detallada: common#:#reg_mail_subject#:#ILIAS - Sus datos de acceso -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Su enlace de confirmación +common#:#reg_mail_subject_confirmation#:#Su enlace de confirmación common#:#reg_passwd_via_mail#:#Su contraseña será enviada a su dirección de e-mail mostrada abajo. common#:#register#:#Registrarse common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_et.lang b/lang/ilias_et.lang index 0413b8a06fcd..cd012c6e32df 100644 --- a/lang/ilias_et.lang +++ b/lang/ilias_et.lang @@ -5342,7 +5342,7 @@ common#:#reg_mail_body_text1#:#teretulemast e-õppe keskkonda ILIAS! common#:#reg_mail_body_text2#:#ILIASesse sisenemiseks kasuta järgnevaid andmeid: common#:#reg_mail_body_text3#:#Muu isiklik info: common#:#reg_mail_subject#:#ILIAS - sinu salasõna -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmation Link +common#:#reg_mail_subject_confirmation#:#Your Confirmation Link common#:#reg_passwd_via_mail#:#Sinu salasõna saadetakse sinu e-posti aadressile - seetõttu peab e-posti aadress olema korrektselt sisestatud. NB! Hot.ee, hotmail.com, mail.ee, gmail.com jm e-posti rakendused võivad ILIASe süsteemi kirju spämmiks lugeda ja need kustutada. Palume võimalusel kasutada ametiaadressi. common#:#register#:#Registreeru common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_fa.lang b/lang/ilias_fa.lang index 2c300a36e373..fd5df4436db1 100644 --- a/lang/ilias_fa.lang +++ b/lang/ilias_fa.lang @@ -5282,7 +5282,7 @@ common#:#private_notes#:#یادداشت های شخصی common#:#pro#:#Pro common#:#proceed#:#Proceed common#:#profile#:#نمایه -common#:#profile_changed#:#ILIAS eLearning - Your profile has changed +common#:#profile_changed#:#Your profile has changed common#:#profile_incomplete#:#Your profile is incomplete. Please fill in all required data. common#:#profile_of#:#Profile of common#:#properties#:#ویژگیها @@ -5341,8 +5341,8 @@ common#:#reg_mail_body_salutation#:#سلام common#:#reg_mail_body_text1#:#Welcome to ILIAS eLearning! common#:#reg_mail_body_text2#:#To access ILIAS use the following data: common#:#reg_mail_body_text3#:#Further personal information: -common#:#reg_mail_subject#:#ILIAS eLearning - Your access data -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmation Link +common#:#reg_mail_subject#:#Your access data +common#:#reg_mail_subject_confirmation#:#Your Confirmation Link common#:#reg_passwd_via_mail#:#Your password will be sent to your e-mail address given below. common#:#register#:#Register common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_fr.lang b/lang/ilias_fr.lang index c5d1738e337a..c5909a6d88f0 100644 --- a/lang/ilias_fr.lang +++ b/lang/ilias_fr.lang @@ -5342,7 +5342,7 @@ common#:#reg_mail_body_text1#:#Bienvenue sur MediaEcole, votre compte a été cr common#:#reg_mail_body_text2#:#Pour vous connecter, cliquer sur : http://p-form.intradef.gouv.fr/login.php?client_id=mediaecole common#:#reg_mail_body_text3#:#Informations personnelles supplémentaires : common#:#reg_mail_subject#:#MediaEcole - Vos données d'accès -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Votre lien de confirmation +common#:#reg_mail_subject_confirmation#:#Votre lien de confirmation common#:#reg_passwd_via_mail#:#Votre mot de passe sera envoyé à l'adresse email précisée ci-dessous. common#:#register#:#Créer un Compte common#:#register_notification#:#"%s" has applied for session "%s". diff --git a/lang/ilias_hr.lang b/lang/ilias_hr.lang index 688531868f26..acbc54d749dc 100644 --- a/lang/ilias_hr.lang +++ b/lang/ilias_hr.lang @@ -5282,7 +5282,7 @@ common#:#private_notes#:#Privatne bilješke common#:#pro#:#Pro common#:#proceed#:#Nastavi common#:#profile#:#Profil -common#:#profile_changed#:#ILIAS eLearning - Vaš profil je promijenjen +common#:#profile_changed#:#Vaš profil je promijenjen common#:#profile_incomplete#:#Vaš je profil nepotpun. Molimo ispunite sve potrebne podatke. common#:#profile_of#:#Profil korisnika common#:#properties#:#Svojstva @@ -5341,8 +5341,8 @@ common#:#reg_mail_body_salutation#:#Dobar dan common#:#reg_mail_body_text1#:#Dobrodošli u ILIAS eLearning! common#:#reg_mail_body_text2#:#Za pristup ILIAS-u koristite sljedeće podatke: common#:#reg_mail_body_text3#:#Ostali osobni podaci: -common#:#reg_mail_subject#:#ILIAS eLearning - Vaši pristupni podaci -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Vaša povezica za potvrdu +common#:#reg_mail_subject#:#Vaši pristupni podaci +common#:#reg_mail_subject_confirmation#:#Vaša povezica za potvrdu common#:#reg_passwd_via_mail#:#Vaša lozinka bit će poslana na vašu adresu e-pošte navedenu u nastavku. common#:#register#:#Registariraj se common#:#register_notification#:#"%s" has applied for session "%s".###04 06 2021 new variable diff --git a/lang/ilias_it.lang b/lang/ilias_it.lang index fbdd1578f30f..6f4ba9b09274 100644 --- a/lang/ilias_it.lang +++ b/lang/ilias_it.lang @@ -5355,8 +5355,8 @@ common#:#reg_mail_body_salutation#:#Ciao common#:#reg_mail_body_text1#:#Benvenuto in ILIAS eLearning! common#:#reg_mail_body_text2#:#Per accedere ad ILIAS utilizza i seguenti dati: common#:#reg_mail_body_text3#:#Ulteriori informazioni personali: -common#:#reg_mail_subject#:#ILIAS eLearning - I tuoi dati di accesso -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Link di Conferma +common#:#reg_mail_subject#:#I tuoi dati di accesso +common#:#reg_mail_subject_confirmation#:#Link di Conferma common#:#reg_passwd_via_mail#:#La password verrà inviata al tuo indirizzo e-mail indicato di seguito. common#:#register#:#Registrati common#:#register_notification#:#"%s" ha fatto domanda per la sessione "%s". diff --git a/lang/ilias_ja.lang b/lang/ilias_ja.lang index 1b694fc1be28..c118f8c66bd8 100644 --- a/lang/ilias_ja.lang +++ b/lang/ilias_ja.lang @@ -5282,7 +5282,7 @@ common#:#private_notes#:#プライベートメモ common#:#pro#:#いいね common#:#proceed#:#続ける common#:#profile#:#プロファイル -common#:#profile_changed#:#ILIAS eLearning - プロファイルが変更されました +common#:#profile_changed#:#プロファイルが変更されました common#:#profile_incomplete#:#プロファイル作成が未完了です。必要事項を記入してください common#:#profile_of#:#プロファイル common#:#properties#:#プロパティ @@ -5341,8 +5341,8 @@ common#:#reg_mail_body_salutation#:#こんにちは common#:#reg_mail_body_text1#:#学習管理システムILIASのご利用ありがとうございます。 common#:#reg_mail_body_text2#:#LIASへアクセスするには次のURIを使用します: common#:#reg_mail_body_text3#:#詳細情報 -common#:#reg_mail_subject#:#ILIAS eLearning - アクセス情報 -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - リンク 確認用 +common#:#reg_mail_subject#:#アクセス情報 +common#:#reg_mail_subject_confirmation#:#リンク 確認用 common#:#reg_passwd_via_mail#:#パスワードは以下のemailアドレスへ送信されます。 common#:#register#:#登録 common#:#register_notification#:#%s がセッション "%s"へ適用されました。 diff --git a/lang/ilias_lt.lang b/lang/ilias_lt.lang index aa0341251202..19c75e689d7a 100644 --- a/lang/ilias_lt.lang +++ b/lang/ilias_lt.lang @@ -5342,7 +5342,7 @@ common#:#reg_mail_body_text1#:#Sveiki atvykę į ILIAS eMokymo sistemą! common#:#reg_mail_body_text2#:#Norėdami prisijungti prie ILIAS naudokite šiuos duomenis: common#:#reg_mail_body_text3#:#Daugiau asmeninės informacijos: common#:#reg_mail_subject#:#ILIAS eMokymas - Jūsų prisijungimo duomenys -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmationlink###24 07 2009 new variable +common#:#reg_mail_subject_confirmation#:#Your Confirmationlink###24 07 2009 new variable common#:#reg_passwd_via_mail#:#Jūsų slaptažodis bus išsiųstas žemiau nurodytu el. pašto adresu. common#:#register#:#Registruotis common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_nl.lang b/lang/ilias_nl.lang index 5c26ccec206c..c876d3e152a5 100644 --- a/lang/ilias_nl.lang +++ b/lang/ilias_nl.lang @@ -5341,8 +5341,8 @@ common#:#reg_mail_body_salutation#:#Hallo common#:#reg_mail_body_text1#:#Welkom bij ILIAS! common#:#reg_mail_body_text2#:#Om ILIAS te bereiken gebruik je volgende gegevens:
common#:#reg_mail_body_text3#:#Persoonlijke informatie: -common#:#reg_mail_subject#:#ILIAS eLearning - Je toegangsgegevens -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Je bevestigingslink +common#:#reg_mail_subject#:#Je toegangsgegevens +common#:#reg_mail_subject_confirmation#:#Je bevestigingslink common#:#reg_passwd_via_mail#:#Je wachtwoord zal worden verzonden naar je e-mailadres. common#:#register#:#Registreer common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_pt.lang b/lang/ilias_pt.lang index fffb1e5e622e..396fee6595af 100644 --- a/lang/ilias_pt.lang +++ b/lang/ilias_pt.lang @@ -4822,11 +4822,11 @@ common#:#obj_cals#:#Calendário common#:#obj_cals_desc#:#Definições gerais de calendário. common#:#obj_cat#:#Informações pessoais adicionais: common#:#obj_cat_duplicate#:#Copiar categoria -common#:#obj_catr#:#ILIAS eLearning - Os seus dados de acesso +common#:#obj_catr#:#Os seus dados de acesso common#:#obj_cert#:#Certificados common#:#obj_cert_desc#:#Definições para certificados common#:#obj_chap#:#Capítulo -common#:#obj_chta#:#ILIAS eLearning - O seu link de confirmação +common#:#obj_chta#:#O seu link de confirmação common#:#obj_chtr#:#A sua palavra-passe será enviada para o seu endereço de e-mail em baixo. common#:#obj_chtr_duplicate#:#Copy Chat Room###09 03 2022 new variable common#:#obj_cld#:#Objeto da cloud @@ -5086,7 +5086,7 @@ common#:#objs_crsr#:#Per common#:#objs_dcl#:#Coleções de dados common#:#objs_etal#:#Employee Talks###31 03 2023 new variable common#:#objs_exc#:#Perfil -common#:#objs_file#:#ILIAS eLearning - O seu perfil mudou +common#:#objs_file#:#O seu perfil mudou common#:#objs_fold#:#O seu perfil está incompleto. Preencha todos os dados necessários. common#:#objs_frm#:#Perfil de common#:#objs_glo#:#Propriedades diff --git a/lang/ilias_ro.lang b/lang/ilias_ro.lang index 0bae68324c64..3f493d7b6940 100644 --- a/lang/ilias_ro.lang +++ b/lang/ilias_ro.lang @@ -5342,7 +5342,7 @@ common#:#reg_mail_body_text1#:#Bine ati venit la ILIAS eLearning! common#:#reg_mail_body_text2#:#Pentru a accesa ILIAs folositi urmatoarele date:###10 Jul 2006 content changed common#:#reg_mail_body_text3#:#Mai multe informatii personale: common#:#reg_mail_subject#:#ILIAS eLearning – Datele dumneavoastra de acces -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmationlink###24 07 2009 new variable +common#:#reg_mail_subject_confirmation#:#Your Confirmationlink###24 07 2009 new variable common#:#reg_passwd_via_mail#:#Parola va va fi trimisa la adresa de mail de mai jos. common#:#register#:#Inregistrare common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_ru.lang b/lang/ilias_ru.lang index fa86a82ff568..dc54b07a9d71 100644 --- a/lang/ilias_ru.lang +++ b/lang/ilias_ru.lang @@ -5341,8 +5341,8 @@ common#:#reg_mail_body_salutation#:#Привет common#:#reg_mail_body_text1#:#Добро пожаловать в ILIAS eLearning! common#:#reg_mail_body_text2#:#ILIAS использует доступ к следующим данным: common#:#reg_mail_body_text3#:#Дополнительная персональная информация: -common#:#reg_mail_subject#:#ILIAS eLearning - Ваши данные доступа -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmationlink +common#:#reg_mail_subject#:#Ваши данные доступа +common#:#reg_mail_subject_confirmation#:#Your Confirmationlink common#:#reg_passwd_via_mail#:#Ваш пароль будет послан по е-майл адресу приведенному ниже. common#:#register#:#Регистрация common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_sk.lang b/lang/ilias_sk.lang index 3caf5b810fca..0ba616c86c62 100644 --- a/lang/ilias_sk.lang +++ b/lang/ilias_sk.lang @@ -5282,7 +5282,7 @@ common#:#private_notes#:#Osobní poznámky common#:#pro#:#Pro common#:#proceed#:#Postoupit common#:#profile#:#Profil -common#:#profile_changed#:#ILIAS eLearning - Váš profil byl změněn +common#:#profile_changed#:#Váš profil byl změněn common#:#profile_incomplete#:#Váš profil je nekompletní. Vyplňte prosím všechna požadovaná data. common#:#profile_of#:#Profil pro common#:#properties#:#Vlastnosti @@ -5342,7 +5342,7 @@ common#:#reg_mail_body_text1#:#Vítejte v e-learningu ILIAS! common#:#reg_mail_body_text2#:#K přístupu do ILIAS použijte následující údaje: common#:#reg_mail_body_text3#:#Další osobní informace: common#:#reg_mail_subject#:#E-learning ILIAS - Vaše přístupové údaje -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmationlink +common#:#reg_mail_subject_confirmation#:#Your Confirmationlink common#:#reg_passwd_via_mail#:#Vaše heslo bude zasláno na Vaši e-mail adresu uvedenou níže. common#:#register#:#Zaregistrovat common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_sl.lang b/lang/ilias_sl.lang index 9c8899f46176..c0c1e9cbef01 100644 --- a/lang/ilias_sl.lang +++ b/lang/ilias_sl.lang @@ -5296,7 +5296,7 @@ common#:#private_notes#:#Zasebne opombe common#:#pro#:#Pro common#:#proceed#:#Nadaljuj common#:#profile#:#Profile -common#:#profile_changed#:#ILIAS eLearning - Vaši profilni podatki so bili spremenjeni +common#:#profile_changed#:#Vaši profilni podatki so bili spremenjeni common#:#profile_incomplete#:#Vaš profil ni popoln. Vnesite vse zahtevane podatke common#:#profile_of#:#Profil od common#:#properties#:#Lastnosti @@ -5355,8 +5355,8 @@ common#:#reg_mail_body_salutation#:#Pozdravljeni common#:#reg_mail_body_text1#:#Dobrodošli v eLearning platformi ILIAS! common#:#reg_mail_body_text2#:#Vaši dostopni podatki: common#:#reg_mail_body_text3#:#Nadaljnji osebni podatki: -common#:#reg_mail_subject#:#ILIAS eLearning - Vaši dostopni podatki -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Vaša povezava za potrditev +common#:#reg_mail_subject#:#Vaši dostopni podatki +common#:#reg_mail_subject_confirmation#:#Vaša povezava za potrditev common#:#reg_passwd_via_mail#:#Geslo bo poslano na spodaj navedeni e-poštni naslov. common#:#register#:#Registriracija common#:#register_notification#:#"%s" has applied for session "%s". diff --git a/lang/ilias_sq.lang b/lang/ilias_sq.lang index aff6de2b3016..fd4a4a185e02 100644 --- a/lang/ilias_sq.lang +++ b/lang/ilias_sq.lang @@ -5341,8 +5341,8 @@ common#:#reg_mail_body_salutation#:#Tungjatjeta common#:#reg_mail_body_text1#:#Mirë se vini në ILIAS eLearning! common#:#reg_mail_body_text2#:#Për tu qasur në ILIAS përdorni shënimet vijuese:###10 Jul 2006 content changed common#:#reg_mail_body_text3#:#Informacione personale të mëtejshme: -common#:#reg_mail_subject#:#ILIAS eLearning - Të dhënat për qasjen tuaj -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmationlink###24 07 2009 new variable +common#:#reg_mail_subject#:#Të dhënat për qasjen tuaj +common#:#reg_mail_subject_confirmation#:#Your Confirmationlink###24 07 2009 new variable common#:#reg_passwd_via_mail#:#Parulla do tu dërgohet në e-mail adresën e dhënë më poshtë. common#:#register#:#Regjistrimi common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_sr.lang b/lang/ilias_sr.lang index 6305ed43aebd..17ab6db446ba 100644 --- a/lang/ilias_sr.lang +++ b/lang/ilias_sr.lang @@ -5342,7 +5342,7 @@ common#:#reg_mail_body_text1#:#Dobro došli na ILIAS eUcenje! common#:#reg_mail_body_text2#:#Da biste pristupili ILIAS-u upotrebite sledece podatke:###10 Jul 2006 content changed common#:#reg_mail_body_text3#:#Sledeci licni podaci: common#:#reg_mail_subject#:#ILIAS eUcenje - Vadi podaci za pristup -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmationlink###24 07 2009 new variable +common#:#reg_mail_subject_confirmation#:#Your Confirmationlink###24 07 2009 new variable common#:#reg_passwd_via_mail#:#Vaša lozinka ce biti poslata na dole naznacenu adresu elektronske pošte. common#:#register#:#Registruj common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_tr.lang b/lang/ilias_tr.lang index 481592ecc06a..ab88c67cb216 100644 --- a/lang/ilias_tr.lang +++ b/lang/ilias_tr.lang @@ -5282,7 +5282,7 @@ common#:#private_notes#:#Özel Notlar common#:#pro#:#Pro common#:#proceed#:#Devam common#:#profile#:#Profil -common#:#profile_changed#:#ILIAS eLearning - profiliniz değişti +common#:#profile_changed#:#profiliniz değişti common#:#profile_incomplete#:#Profiliniz eksiktir. Gerekli tüm bilgileri doldurun. common#:#profile_of#:#Profili common#:#properties#:#Özellikleri @@ -5341,8 +5341,8 @@ common#:#reg_mail_body_salutation#:#Merhaba common#:#reg_mail_body_text1#:#ILIAS eLearning Hoş geldiniz! common#:#reg_mail_body_text2#:#ILIAS'a erişmek için aşağıdaki verileri kullanın : common#:#reg_mail_body_text3#:#Ayrıntılı kişisel bilgiler: -common#:#reg_mail_subject#:#ILIAS eLearning - Erişim veriniz -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Onay Linkiniz +common#:#reg_mail_subject#:#Erişim veriniz +common#:#reg_mail_subject_confirmation#:#Onay Linkiniz common#:#reg_passwd_via_mail#:#Şifrenizi aşağıda verilen e-posta adresine gönderilecektir. common#:#register#:#Kayıt common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_uk.lang b/lang/ilias_uk.lang index 6e4e3d4b3327..e633c59926b5 100644 --- a/lang/ilias_uk.lang +++ b/lang/ilias_uk.lang @@ -5341,8 +5341,8 @@ common#:#reg_mail_body_salutation#:#Привіт common#:#reg_mail_body_text1#:#Ласково просимо до ILIAS eLearning! common#:#reg_mail_body_text2#:#Для доступу в ILIAs використовуйте наступні дані: common#:#reg_mail_body_text3#:#Подальша персональна інформація: -common#:#reg_mail_subject#:#ILIAS eLearning - Ваші дані доступу -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmationlink###24 07 2009 new variable +common#:#reg_mail_subject#:#Ваші дані доступу +common#:#reg_mail_subject_confirmation#:#Your Confirmationlink###24 07 2009 new variable common#:#reg_passwd_via_mail#:#Ваш пароль буде відсланий на вашу поштову адресу вказану нижче. common#:#register#:#Зареєструвати common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_vi.lang b/lang/ilias_vi.lang index dbce0f5a17dd..708303c71c2b 100644 --- a/lang/ilias_vi.lang +++ b/lang/ilias_vi.lang @@ -5343,8 +5343,8 @@ common#:#reg_mail_body_salutation#:#Xin chào common#:#reg_mail_body_text1#:#Chào mừng đến với ILIAS eLearning Đại học Sư phạm Hà Nội! common#:#reg_mail_body_text2#:#Để truy cập ILIAS hãy sử dụng các thông tin sau: common#:#reg_mail_body_text3#:#Thông tin cá nhân bổ sung: -common#:#reg_mail_subject#:#ILIAS eLearning - Thông tin truy cập của bạn -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - Your Confirmationlink###24 07 2009 new variable +common#:#reg_mail_subject#:#Thông tin truy cập của bạn +common#:#reg_mail_subject_confirmation#:#Your Confirmationlink###24 07 2009 new variable common#:#reg_passwd_via_mail#:#mật khẩu của bạn sẽ được gửi tới hòm thư của bạn ở phía dưới. common#:#register#:#Đăng ký common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable diff --git a/lang/ilias_zh.lang b/lang/ilias_zh.lang index fa61035a23d4..900483befc01 100644 --- a/lang/ilias_zh.lang +++ b/lang/ilias_zh.lang @@ -5340,8 +5340,8 @@ common#:#reg_mail_body_salutation#:#Hello common#:#reg_mail_body_text1#:#欢迎来到ILIAS学习! common#:#reg_mail_body_text2#:#使用以下数据访问ILIAS: common#:#reg_mail_body_text3#:#更多的个人信息: -common#:#reg_mail_subject#:#ILIAS eLearning - 您的访问数据 -common#:#reg_mail_subject_confirmation#:#ILIAS eLearning - 您的确认链接 +common#:#reg_mail_subject#:#您的访问数据 +common#:#reg_mail_subject_confirmation#:#您的确认链接 common#:#reg_passwd_via_mail#:#您的密码将会发送到下面您的电子邮箱地址中。 common#:#register#:#注册 common#:#register_notification#:#"%s" has applied for session "%s".###07 02 2020 new variable From b28d06d9f9df4aff50e30e9d52d6657d13ed70be Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 14 Dec 2023 16:56:03 +0100 Subject: [PATCH 271/497] Test: Fix RowCleanUpCallback Not a Function See: https://mantis.ilias.de/view.php?id=37058 --- .../forms/class.ilMultipleImagesInputGUI.php | 94 ++++++++++--------- 1 file changed, 49 insertions(+), 45 deletions(-) diff --git a/Modules/TestQuestionPool/classes/forms/class.ilMultipleImagesInputGUI.php b/Modules/TestQuestionPool/classes/forms/class.ilMultipleImagesInputGUI.php index 16d2f52d985b..9ccaa46c6d0b 100644 --- a/Modules/TestQuestionPool/classes/forms/class.ilMultipleImagesInputGUI.php +++ b/Modules/TestQuestionPool/classes/forms/class.ilMultipleImagesInputGUI.php @@ -175,40 +175,40 @@ public function onCheckInput(): bool switch ($error) { case UPLOAD_ERR_FORM_SIZE: case UPLOAD_ERR_INI_SIZE: - $this->setAlert($this->lng->txt("form_msg_file_size_exceeds")); - return false; - break; + $this->setAlert($this->lng->txt("form_msg_file_size_exceeds")); + return false; + break; case UPLOAD_ERR_PARTIAL: - $this->setAlert($this->lng->txt("form_msg_file_partially_uploaded")); - return false; - break; - - case UPLOAD_ERR_NO_FILE: - if (!$this->getRequired()) { + $this->setAlert($this->lng->txt("form_msg_file_partially_uploaded")); + return false; break; - } elseif (isset($F[self::FILE_DATA_INDEX_DODGING_FILE][$index]) && $F[self::FILE_DATA_INDEX_DODGING_FILE][$index] !== '') { + + case UPLOAD_ERR_NO_FILE: + if (!$this->getRequired()) { + break; + } elseif (isset($F[self::FILE_DATA_INDEX_DODGING_FILE][$index]) && $F[self::FILE_DATA_INDEX_DODGING_FILE][$index] !== '') { + break; + } + $this->setAlert($this->lng->txt("form_msg_file_no_upload")); + return false; break; - } - $this->setAlert($this->lng->txt("form_msg_file_no_upload")); - return false; - break; - case UPLOAD_ERR_NO_TMP_DIR: - $this->setAlert($this->lng->txt("form_msg_file_missing_tmp_dir")); - return false; - break; + case UPLOAD_ERR_NO_TMP_DIR: + $this->setAlert($this->lng->txt("form_msg_file_missing_tmp_dir")); + return false; + break; - case UPLOAD_ERR_CANT_WRITE: - $this->setAlert($this->lng->txt("form_msg_file_cannot_write_to_disk")); - return false; - break; + case UPLOAD_ERR_CANT_WRITE: + $this->setAlert($this->lng->txt("form_msg_file_cannot_write_to_disk")); + return false; + break; - case UPLOAD_ERR_EXTENSION: - $this->setAlert($this->lng->txt("form_msg_file_upload_stopped_ext")); - return false; - break; - } + case UPLOAD_ERR_EXTENSION: + $this->setAlert($this->lng->txt("form_msg_file_upload_stopped_ext")); + return false; + break; + } } } } @@ -338,27 +338,31 @@ public function render(string $a_mode = ""): string $tpl->setVariable("COMMANDS_TEXT", $lng->txt('actions')); if (!$this->getDisabled()) { - $config = [ - 'fieldContainerSelector' => '.ilWzdContainerImage', - 'reindexingRequiredElementsSelectors' => [ - 'input:hidden[name*="[' . self::ITERATOR_SUBFIELD_NAME . ']"]', - 'input:file[id*="__' . self::IMAGE_UPLOAD_SUBFIELD_NAME . '__"]', - 'input:submit[name*="[' . $this->getImageUploadCommand() . ']"]', - 'input:submit[name*="[' . $this->getImageRemovalCommand() . ']"]', - 'button' - ], - 'handleRowCleanUpCallback' => 'function(rowElem) - { - $(rowElem).find("div.imagepresentation").remove(); - $(rowElem).find("input[type=text]").val(""); - }' - ]; + $iterator_subfield_name = self::ITERATOR_SUBFIELD_NAME; + $image_upload_subfield_name = self::IMAGE_UPLOAD_SUBFIELD_NAME; + + $init_code = <<tpl->addJavascript("./Services/Form/js/ServiceFormWizardInput.js"); $this->tpl->addJavascript("./Services/Form/js/ServiceFormIdentifiedWizardInputExtend.js"); - $this->tpl->addOnLoadCode("$.extend({}, ilWizardInput, ilIdentifiedWizardInputExtend).init(" - . json_encode($config) - . ");"); + $this->tpl->addOnLoadCode($init_code); } return $tpl->get(); From c790cb8326271507d3b9ac2363895702afd3ee8d Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 14 Dec 2023 18:03:07 +0100 Subject: [PATCH 272/497] Test: Fix Parameter Needs Readding --- .../TestQuestionPool/classes/class.ilAssQuestionPreviewGUI.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/TestQuestionPool/classes/class.ilAssQuestionPreviewGUI.php b/Modules/TestQuestionPool/classes/class.ilAssQuestionPreviewGUI.php index 9fcac3835eea..3aa8c5e6b1a5 100644 --- a/Modules/TestQuestionPool/classes/class.ilAssQuestionPreviewGUI.php +++ b/Modules/TestQuestionPool/classes/class.ilAssQuestionPreviewGUI.php @@ -153,6 +153,7 @@ public function initQuestion($questionId, $parentObjId): void } else { $this->ctrl->clearParameterByClass(ilObjQuestionPoolGUI::class, 'q_id'); $this->tabs->setBackTarget($this->lng->txt("backtocallingpool"), $this->ctrl->getLinkTargetByClass(ilObjQuestionPoolGUI::class, "questions")); + $this->ctrl->setParameterByClass(ilObjQuestionPoolGUI::class, 'q_id', $questionId); } } } From 1f805b7a12d70326351a7a33c9227b63afd871a1 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 14 Dec 2023 18:13:25 +0100 Subject: [PATCH 273/497] Test: Fix Differing Indexes on Setting and Getting See: https://mantis.ilias.de/view.php?id=38431 --- Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php b/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php index 4930e280da33..cb62eb862148 100755 --- a/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php +++ b/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php @@ -256,7 +256,7 @@ public function getPreview($show_question_only = false, $showInlineFeedback = fa } } $template->setVariable("COUNTER", $i + 1); - $template->setVariable("TEXTFIELD_ID", $i + 1); + $template->setVariable("TEXTFIELD_ID", $i); $template->setVariable("TEXTFIELD_SIZE", $width); $template->parseCurrentBlock(); } @@ -289,7 +289,7 @@ public function getTestOutput($active_id, $pass = null, $is_postponed = false, $ } } $template->setVariable("COUNTER", $i + 1); - $template->setVariable("TEXTFIELD_ID", $i + 1); + $template->setVariable("TEXTFIELD_ID", $i); $template->setVariable("TEXTFIELD_SIZE", $width); $template->parseCurrentBlock(); } From 3ed28daa73e9d7754a3c2a906483c3446cf0a127 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 14 Dec 2023 19:19:15 +0100 Subject: [PATCH 274/497] BAC: Fix Importing Roles With Missing Rights See: https://mantis.ilias.de/view.php?id=37208 --- Services/AccessControl/classes/class.ilRoleXmlImporter.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Services/AccessControl/classes/class.ilRoleXmlImporter.php b/Services/AccessControl/classes/class.ilRoleXmlImporter.php index e2ac9c6c35aa..696a7a2308bb 100644 --- a/Services/AccessControl/classes/class.ilRoleXmlImporter.php +++ b/Services/AccessControl/classes/class.ilRoleXmlImporter.php @@ -150,8 +150,12 @@ public function importSimpleXml(SimpleXMLElement $role): int foreach ($role->operations as $sxml_operations) { foreach ($sxml_operations as $sxml_op) { + $operation = trim((string) $sxml_op); + if (!array_key_exists($operation, $operations)) { + continue; + } $ops_group = (string) $sxml_op['group']; - $ops_id = (int) $operations[trim((string) $sxml_op)]; + $ops_id = (int) $operations[$operation]; $ops = trim((string) $sxml_op); if ($ops_group && $ops_id) { From a4e027c47503b6189fd60978fbf355637adc914c Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 14 Dec 2023 20:40:45 +0100 Subject: [PATCH 275/497] Test: Fix Missing Question Titles in Best Solution See: https://mantis.ilias.de/view.php?id=29802 --- Modules/Test/classes/class.ilTestScoring.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/Test/classes/class.ilTestScoring.php b/Modules/Test/classes/class.ilTestScoring.php index 682c45fd46a9..2f89e5036e54 100644 --- a/Modules/Test/classes/class.ilTestScoring.php +++ b/Modules/Test/classes/class.ilTestScoring.php @@ -199,6 +199,7 @@ public function calculateBestSolutionForTest(): string foreach ($this->test->getAllQuestions() as $question) { /** @var AssQuestionGUI $question_gui */ $question_gui = $this->test->createQuestionGUI("", $question['question_id']); + $solution .= '

' . $question_gui->object->getTitle() . '

'; $solution .= $question_gui->getSolutionOutput(0, null, true, true, false, false, true, false); } @@ -217,7 +218,7 @@ public function getRecalculatedPassesByActives(): array public function addRecalculatedPassByActive($activeId, $pass) { - if (! array_key_exists($activeId, $this->recalculatedPasses) + if (!array_key_exists($activeId, $this->recalculatedPasses) || !is_array($this->recalculatedPasses[$activeId]) ) { $this->recalculatedPasses[$activeId] = array(); From 44f336671d33faa164e5a6bb7e9f98cd88743937 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Fri, 15 Dec 2023 09:35:14 +0100 Subject: [PATCH 276/497] Test: Fix Longmenu Input-Length in Solutions --- Modules/TestQuestionPool/classes/class.assLongMenuGUI.php | 3 +++ .../default/tpl.il_as_qpl_longmenu_question_text_gap.html | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Modules/TestQuestionPool/classes/class.assLongMenuGUI.php b/Modules/TestQuestionPool/classes/class.assLongMenuGUI.php index 1c0581a14537..43e6e1d42750 100644 --- a/Modules/TestQuestionPool/classes/class.assLongMenuGUI.php +++ b/Modules/TestQuestionPool/classes/class.assLongMenuGUI.php @@ -552,6 +552,9 @@ private function getTextGapTemplate($key, $value, $solution, $ok = false, $graph $tpl->setVariable("ICON_OK", $correctness_icon); } } + if ($solution) { + $tpl->setVariable('SIZE', 'size="' . mb_strlen($value) . '"'); + } $tpl->setVariable('VALUE', $value); $tpl->setVariable('KEY', $key); diff --git a/Modules/TestQuestionPool/templates/default/tpl.il_as_qpl_longmenu_question_text_gap.html b/Modules/TestQuestionPool/templates/default/tpl.il_as_qpl_longmenu_question_text_gap.html index 28035decd4e7..7d08da3c1b39 100644 --- a/Modules/TestQuestionPool/templates/default/tpl.il_as_qpl_longmenu_question_text_gap.html +++ b/Modules/TestQuestionPool/templates/default/tpl.il_as_qpl_longmenu_question_text_gap.html @@ -1 +1 @@ -{ICON_OK} \ No newline at end of file +{ICON_OK} \ No newline at end of file From bd693ecf0d07baf4c6ad599a82b43a550060b6ee Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Fri, 15 Dec 2023 10:40:04 +0100 Subject: [PATCH 277/497] User: Harden Selection of StartingPoint-Form See: https://mantis.ilias.de/view_all_bug_page.php --- .../User/classes/class.StandardGUIRequest.php | 4 +- .../classes/class.ilUserStartingPointGUI.php | 50 +++++++++---------- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/Services/User/classes/class.StandardGUIRequest.php b/Services/User/classes/class.StandardGUIRequest.php index a10a1d2fd65e..93b501c0d5e4 100644 --- a/Services/User/classes/class.StandardGUIRequest.php +++ b/Services/User/classes/class.StandardGUIRequest.php @@ -81,7 +81,7 @@ public function getTerm(): string public function getStartingPointId(): string { $id = $this->str("spid"); - if ($id == 0) { + if ($id === '0' || $id === '') { $id = $this->str("start_point_id"); } return $id; @@ -90,7 +90,7 @@ public function getStartingPointId(): string public function getRoleId(): string { $role_id = $this->str("rolid"); - if ($role_id == 0) { + if ($role_id === '0' || $role_id === '') { $role_id = $this->str("role_id"); } return $role_id; diff --git a/Services/User/classes/class.ilUserStartingPointGUI.php b/Services/User/classes/class.ilUserStartingPointGUI.php index e1c6bc6321f0..6838e4e11143 100644 --- a/Services/User/classes/class.ilUserStartingPointGUI.php +++ b/Services/User/classes/class.ilUserStartingPointGUI.php @@ -151,34 +151,32 @@ protected function getRoleStartingPointForm(): ilPropertyFormGUI $spoint_id = $this->user_request->getStartingPointId(); $req_role_id = $this->user_request->getRoleId(); - //edit no default - if ($spoint_id > 0 && $spoint_id != 'default') { - $st_point = new ilStartingPoint($spoint_id); + if ($spoint_id === 'default') { + $starting_point = ilUserUtil::getStartingPoint(); + } elseif (is_numeric($spoint_id) && intval($spoint_id) > 0) { + $st_point = new ilStartingPoint((int) $spoint_id); //starting point role based - if ($st_point->getRuleType() == ilStartingPoint::ROLE_BASED && $req_role_id) { - $rolid = $req_role_id; - if ($role = new ilObjRole($rolid)) { - $options[$rolid] = $role->getTitle(); - $starting_point = $st_point->getStartingPoint(); - - // role title, non editable - $ne = new ilNonEditableValueGUI($this->lng->txt("editing_this_role"), 'role_disabled'); - $ne->setValue($role->getTitle()); - $form->addItem($ne); - - $hi = new ilHiddenInputGUI("role"); - $hi->setValue($rolid); - $form->addItem($hi); - - $hidde_sp_id = new ilHiddenInputGUI("start_point_id"); - $hidde_sp_id->setValue($spoint_id); - $form->addItem($hidde_sp_id); - } + if ($st_point->getRuleType() === ilStartingPoint::ROLE_BASED + && is_numeric($req_role_id) && intval($req_role_id) > 0 + && ($role = new ilObjRole((int) $req_role_id))) { + $options[$req_role_id] = $role->getTitle(); + $starting_point = $st_point->getStartingPoint(); + + // role title, non editable + $ne = new ilNonEditableValueGUI($this->lng->txt("editing_this_role"), 'role_disabled'); + $ne->setValue($role->getTitle()); + $form->addItem($ne); + + $hi = new ilHiddenInputGUI("role"); + $hi->setValue($req_role_id); + $form->addItem($hi); + + $hidde_sp_id = new ilHiddenInputGUI("start_point_id"); + $hidde_sp_id->setValue($spoint_id); + $form->addItem($hidde_sp_id); } - } - //create - elseif (!$spoint_id || $spoint_id != 'default') { + } else { //starting point role based if (ilStartingPoint::ROLE_BASED) { $roles = ilStartingPoint::getGlobalRolesWithoutStartingPoint(); @@ -204,8 +202,6 @@ protected function getRoleStartingPointForm(): ilPropertyFormGUI $role_search->setSize(40); $op2->addSubItem($role_search); } - } else { - $starting_point = ilUserUtil::getStartingPoint(); } // starting point From 7b5dd03428da6a7914211c1ae73afb67a3471360 Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Mon, 18 Dec 2023 06:51:51 +0100 Subject: [PATCH 278/497] [FIX] normalization of wac path # Conflicts: # Services/WebAccessChecker/classes/class.ilWACPath.php # Services/WebAccessChecker/test/SecurePath/ilWACSecurePathTest.php --- .../classes/class.ilWACPath.php | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Services/WebAccessChecker/classes/class.ilWACPath.php b/Services/WebAccessChecker/classes/class.ilWACPath.php index 89b5177491d0..0182fafba98b 100644 --- a/Services/WebAccessChecker/classes/class.ilWACPath.php +++ b/Services/WebAccessChecker/classes/class.ilWACPath.php @@ -86,6 +86,8 @@ class ilWACPath public function __construct(string $path) { + $path = $this->normalizePath($path); + $this->setOriginalRequest($path); $re = '/' . self::REGEX . '/'; preg_match($re, $path, $result); @@ -228,6 +230,24 @@ public static function setVideoSuffixes(array $video_suffixes): void self::$video_suffixes = $video_suffixes; } + protected function normalizePath(string $path): string + { + $original_path = parse_url($path, PHP_URL_PATH); + $query = parse_url($path, PHP_URL_QUERY); + $base_path = strstr(realpath("." . $original_path), '/' . self::DIR_DATA . '/', true) . '/'; + $realpath = realpath("." . $original_path); + if ($realpath === false) { + return $path; + } + $normalized_path = str_replace( + $base_path, + '', + $realpath + ); + + return "/" . $normalized_path . (!empty($query) ? '?' . $query : ''); + } + public function getPrefix(): string { return $this->prefix; From d5cbcb1b8790a77df791a95dbc237ba01afd2657 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 18 Dec 2023 08:52:53 +0100 Subject: [PATCH 279/497] Badge: Fix WAC checking instance (cherry picked from commit f3eb210438f32d21c0a57a7072ac8bdb4259c9e3) --- Services/Badge/classes/class.ilBadgeWAC.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Services/Badge/classes/class.ilBadgeWAC.php b/Services/Badge/classes/class.ilBadgeWAC.php index 6d8d03269976..5bbad1f802b4 100644 --- a/Services/Badge/classes/class.ilBadgeWAC.php +++ b/Services/Badge/classes/class.ilBadgeWAC.php @@ -23,6 +23,14 @@ class ilBadgeWAC implements ilWACCheckingClass { public function canBeDelivered(ilWACPath $ilWACPath): bool { - return true; + if (strpos($ilWACPath->getPath(), '..') !== false) { + return false; + } + + if (preg_match('@ilBadge\/badge(.*?)\/@ui', $ilWACPath->getPath())) { + return true; + } + + return false; } } From 1ea367b87d1f352c491a4bddefcbabf2d3810145 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 18 Dec 2023 11:49:04 +0100 Subject: [PATCH 280/497] Badge: Restrict access to badge images (cherry picked from commit 5d9d6ecb5604241df7ee3f796442101f551e417f) --- Services/Badge/classes/class.ilBadgeWAC.php | 108 +++++++++++++++++++- 1 file changed, 106 insertions(+), 2 deletions(-) diff --git a/Services/Badge/classes/class.ilBadgeWAC.php b/Services/Badge/classes/class.ilBadgeWAC.php index 5bbad1f802b4..048910bb6411 100644 --- a/Services/Badge/classes/class.ilBadgeWAC.php +++ b/Services/Badge/classes/class.ilBadgeWAC.php @@ -23,12 +23,116 @@ class ilBadgeWAC implements ilWACCheckingClass { public function canBeDelivered(ilWACPath $ilWACPath): bool { + global $DIC; + if (strpos($ilWACPath->getPath(), '..') !== false) { return false; } - if (preg_match('@ilBadge\/badge(.*?)\/@ui', $ilWACPath->getPath())) { - return true; + if (!preg_match('@ilBadge\/badge(tmpl)?_(\d+)\/@ui', $ilWACPath->getPath())) { + return false; + } + + $obj_id = array_keys(ilObject::_getObjectsByType('bdga'))[0] ?? null; + $admin_ref_id = null; + if ($obj_id > 0) { + $admin_ref_id = array_values(ilObject::_getAllReferences($obj_id))[0] ?? null; + } + + $has_global_badge_administration_access = ( + $admin_ref_id > 0 && + $DIC->rbac()->system()->checkAccessOfUser($DIC->user()->getId(), 'read', $admin_ref_id) + ); + + if (preg_match('@\/badgetmpl_(\d+)\/@ui', $ilWACPath->getPath())) { + // Badge template images must only be accessible for accounts with `read` permission on the badge administration node + return $has_global_badge_administration_access; + } + + if (preg_match('@\/badge_(\d+)\/@ui', $ilWACPath->getPath(), $matches)) { + if ($has_global_badge_administration_access) { + return true; + } + + $badge_id = (int) $matches[1]; + + return ( + $this->isAssignedBadge($DIC, $badge_id) || + $this->isAssignedBadgeOfPublishedUserProfile($DIC, $badge_id) || + $this->hasAccessToBadgeParentIdNode($DIC, $badge_id, $has_global_badge_administration_access) + ); + } + + return false; + } + + private function hasAccessToBadgeParentIdNode( + \ILIAS\DI\Container $DIC, + int $badge_id, + bool $has_global_badge_administration_access + ) : bool { + // If the acting user still does not have access, check if the image is used in an object badge type + $badge = new ilBadge($badge_id); + if ($badge->getParentId() > 0) { + return false; + } + + $badge_handler = ilBadgeHandler::getInstance(); + if (!$badge_handler->isObjectActive((int) $badge->getParentId())) { + return false; + } + + $context_ref_id = array_values(ilObject::_getAllReferences((int) $badge->getParentId()))[0] ?? null; + if (!($context_ref_id > 0)) { + return false; + } + + $context_ref_id = (int) $context_ref_id; + if ($DIC->repositoryTree()->isGrandChild((int) SYSTEM_FOLDER_ID, $context_ref_id)) { + $has_access = $has_global_badge_administration_access; + } else { + $has_access = $DIC->access()->checkAccessOfUser( + $DIC->user()->getId(), + 'write', + '', + $context_ref_id + ); + } + + return $has_access; + } + + private function isAssignedBadge(\ILIAS\DI\Container $DIC, int $badge_id) : bool + { + // First, check all badge assignments of the current user for a match + $badges_of_user = ilBadgeAssignment::getInstancesByUserId($DIC->user()->getId()); + foreach ($badges_of_user as $user_badge) { + if ((int) $user_badge->getBadgeId() === $badge_id) { + return true; + } + } + + return false; + } + + private function isAssignedBadgeOfPublishedUserProfile(\ILIAS\DI\Container $DIC, int $badge_id) : bool + { + // It seems the badge is not assigned to the curent user, so check if the profile of the badge user is made visible + $assignments = ilBadgeAssignment::getInstancesByBadgeId($badge_id); + foreach ($assignments as $assignment) { + if (!$assignment->getPosition()) { + continue; + } + + $user = ilObjectFactory::getInstanceByObjId((int) $assignment->getUserId(), false); + if (!$user instanceof ilObjUser) { + continue; + } + + $profile_visibility = $user->getPref('public_profile'); + if ($profile_visibility === 'g' || ($profile_visibility === 'y' && !$DIC->user()->isAnonymous())) { + return true; + } } return false; From 990af2fbf0100e491a0757ddb4ac88478c3a8583 Mon Sep 17 00:00:00 2001 From: Stefan Meyer Date: Mon, 18 Dec 2023 15:58:08 +0100 Subject: [PATCH 281/497] =?UTF-8?q?Fixed=200038818:=20Failed=20test:=20iCa?= =?UTF-8?q?l-Link=20pr=C3=BCfen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Services/Calendar/classes/Export/class.ilCalendarExport.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Services/Calendar/classes/Export/class.ilCalendarExport.php b/Services/Calendar/classes/Export/class.ilCalendarExport.php index c8c3703cc11b..3b7fb69c94ce 100644 --- a/Services/Calendar/classes/Export/class.ilCalendarExport.php +++ b/Services/Calendar/classes/Export/class.ilCalendarExport.php @@ -186,6 +186,9 @@ protected function addCategories(int $remaining_bytes): ilICalWriter $time_now = new ilDateTime(time(), IL_CAL_UNIX); $str_time_now = $time_now->get(IL_CAL_FKT_DATE, 'Ymd', ilTimeZone::UTC); $str_time_start = $a->getStart()->get(IL_CAL_FKT_DATE, 'Ymd', $this->il_user->getTimeZone()); + if ($str_time_start === null) { + return false; + } $start = new DateTimeImmutable($str_time_start); $now = new DateTimeImmutable($str_time_now); $lower_bound = $now->sub(new DateInterval('P30D')); From 9493a8a2a4ba1d908ad6c60cd35815e60499f3cb Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Mon, 18 Dec 2023 17:39:15 +0100 Subject: [PATCH 282/497] Fixed Mantis #39513: Typo DE: orgu#:#ext_id_updated# --- 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 df3afc3f0b10..34e9a9a1fec3 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -12320,7 +12320,7 @@ orgu#:#deassign_user_successful#:#Benutzer wurde erfolgreich ausgetragen. orgu#:#edit_translations#:#Titel und Beschreibung orgu#:#employee#:#Mitarbeiter orgu#:#ext_id#:#Externe ID -orgu#:#ext_id_updated#:#Die externe ID wurde erfolgreich bearbeitet.n, da die Daten anonymisiert gespeichert werden. +orgu#:#ext_id_updated#:#Die externe ID wurde erfolgreich bearbeitet. orgu#:#form_title_org_default_permissions_update#:#Standardrechte orgu#:#import_failed#:#Der Import ist fehlgeschlagen. Stellen Sie sicher, dass die Datei im XML-Format geschrieben ist und eine valide Struktur aufweist. orgu#:#import_successful#:#Der Import wurde erfolgreich durchgeführt. Neu erstellt: %s, Bearbeitet/Verschoben: %s, Gelöscht: %s. From c69887c71236dcf7ad2ed3f41fcc0988581fa5d6 Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Mon, 18 Dec 2023 17:44:16 +0100 Subject: [PATCH 283/497] Fixed Mantis #39511: Typo DE in prtf#:#prtt_title_info# --- 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 34e9a9a1fec3..6a82c2df38fb 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -13005,7 +13005,7 @@ prtf#:#prtf_template_title#:#Portfoliovorlage prtf#:#prtf_unset_as_default#:#Nicht als Mein Profil verwenden prtf#:#prtf_unset_default_share_info#:#Die Änderungen wurden gespeichert. Bitte überprüfen Sie die aktuellen Freigaben für das Portfolio. prtf#:#prtf_use_page_layout#:#Seitenlayout benutzen -prtf#:#prtt_title_info#:#Bitte beachten Sie, dass dieser Titel auch für die aus der Vorlage erstellten Porfolios verwendet wird. +prtf#:#prtt_title_info#:#Bitte beachten Sie, dass dieser Titel auch für die aus der Vorlage erstellten Portfolios verwendet wird. prtt#:#prtt_activation_limited_visibility_info#:#Falls aktiv, ist die Portfoliovorlage auch außerhalb der Zugriffszeiten sichtbar. prtt#:#prtt_activation_online_info#:#Wählen Sie diese Einstellung, um die Portfoliovorlage für Benutzer verfügbar zu machen. prtt#:#prtt_add#:#Portfoliovorlage anlegen From 59f9ef66aa3d75678d8c7dd942bc219c75e58b4d Mon Sep 17 00:00:00 2001 From: Timon Amstutz Date: Tue, 19 Dec 2023 10:23:21 +0100 Subject: [PATCH 284/497] Skin, fix of #38247 --- .../default/images/text_placeholder_thumb.png | Bin 0 -> 3079 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 templates/default/images/text_placeholder_thumb.png diff --git a/templates/default/images/text_placeholder_thumb.png b/templates/default/images/text_placeholder_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf47a0c8c4cc66dd8f82b42584d4f8dedf8f3c1 GIT binary patch literal 3079 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 VYs60(b4vgK002ovPDHLkV1jA*w$K0o literal 0 HcmV?d00001 From f252ecc8502d52bdf52359fc49b518f07d421439 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Thu, 21 Dec 2023 15:47:32 +0100 Subject: [PATCH 285/497] =?UTF-8?q?37085:=20Seiteneditor:=20Beschriftung?= =?UTF-8?q?=20der=20Zeichenformat-Buttons=20nicht=20aussagekr=C3=A4ftig.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../COPage/Editor/Server/class.UIWrapper.php | 15 ++-- .../COPage/classes/class.ilPageObjectGUI.php | 70 +++++++++++++++---- lang/ilias_de.lang | 8 ++- lang/ilias_en.lang | 8 ++- 4 files changed, 76 insertions(+), 25 deletions(-) diff --git a/Services/COPage/Editor/Server/class.UIWrapper.php b/Services/COPage/Editor/Server/class.UIWrapper.php index cbb783f368d7..677858a4f83b 100644 --- a/Services/COPage/Editor/Server/class.UIWrapper.php +++ b/Services/COPage/Editor/Server/class.UIWrapper.php @@ -41,7 +41,8 @@ public function getButton( string $type, string $action, array $data = null, - string $component = "" + string $component = "", + string $aria_label = "" ): \ILIAS\UI\Component\Button\Standard { $ui = $this->ui; $f = $ui->factory(); @@ -50,10 +51,13 @@ public function getButton( $data = []; } $b = $b->withOnLoadCode( - function ($id) use ($type, $data, $action, $component) { + function ($id) use ($type, $data, $action, $component, $aria_label) { $code = "document.querySelector('#$id').setAttribute('data-copg-ed-type', '$type'); document.querySelector('#$id').setAttribute('data-copg-ed-component', '$component'); - document.querySelector('#$id').setAttribute('data-copg-ed-action', '$action')"; + document.querySelector('#$id').setAttribute('data-copg-ed-action', '$action'); "; + if ($aria_label !== "") { + $code.= "document.querySelector('#$id').setAttribute('aria-label', '$aria_label'); "; + } foreach ($data as $key => $val) { $code .= "\n document.querySelector('#$id').setAttribute('data-copg-ed-par-$key', '$val');"; } @@ -86,10 +90,11 @@ public function getRenderedButton( string $type, string $action, array $data = null, - string $component = "" + string $component = "", + string $aria_label = "" ): string { $ui = $this->ui; - $b = $this->getButton($content, $type, $action, $data, $component); + $b = $this->getButton($content, $type, $action, $data, $component, $aria_label); return $ui->renderer()->renderAsync($b); } diff --git a/Services/COPage/classes/class.ilPageObjectGUI.php b/Services/COPage/classes/class.ilPageObjectGUI.php index 8761116fadd0..23419c76d290 100755 --- a/Services/COPage/classes/class.ilPageObjectGUI.php +++ b/Services/COPage/classes/class.ilPageObjectGUI.php @@ -1857,50 +1857,77 @@ public static function getTinyMenu( case "str": $c_formats[] = ["text" => '' . $str . '', "action" => "selection.format", - "data" => ["format" => "Strong"] + "data" => ["format" => "Strong"], + "aria-label" => $lng->txt("cont_text_str") ]; break; case "emp": $c_formats[] = ["text" => '' . $emp . '', "action" => "selection.format", - "data" => ["format" => "Emph"] + "data" => ["format" => "Emph"], + "aria-label" => $lng->txt("cont_text_emp") ]; break; case "imp": $c_formats[] = ["text" => '' . $imp . '', "action" => "selection.format", - "data" => ["format" => "Important"] + "data" => ["format" => "Important"], + "aria-label" => $lng->txt("cont_text_imp") ]; break; case "sup": $c_formats[] = ["text" => 'x2', "action" => "selection.format", - "data" => ["format" => "Sup"] + "data" => ["format" => "Sup"], + "aria-label" => $lng->txt("cont_text_sup") ]; break; case "sub": $c_formats[] = ["text" => 'x2', "action" => "selection.format", - "data" => ["format" => "Sub"] + "data" => ["format" => "Sub"], + "aria-label" => $lng->txt("cont_text_sub") ]; break; } } } $c_formats[] = ["text" => "A", - "action" => $char_formats + "action" => $char_formats, + "aria-label" => $lng->txt("copg_more_character_formats") ]; $c_formats[] = ["text" => 'Tx', "action" => "selection.removeFormat", - "data" => [] + "data" => [], + "aria-label" => $lng->txt("copg_remove_formats") ]; $menu = [ "cont_char_format" => $c_formats, "cont_lists" => [ - ["text" => $bullet_list, "action" => "list.bullet", "data" => []], - ["text" => $numbered_list, "action" => "list.number", "data" => []], - ["text" => $outdent, "action" => "list.outdent", "data" => []], - ["text" => $indent, "action" => "list.indent", "data" => []] + [ + "text" => $bullet_list, + "action" => "list.bullet", + "data" => [], + "aria-label" => $lng->txt("cont_bullet_list") + ], + [ + "text" => $numbered_list, + "action" => "list.number", + "data" => [], + "aria-label" => $lng->txt("cont_numbered_list") + ], + [ + "text" => $outdent, + "action" => "list.outdent", + "data" => [], + "aria-label" => $lng->txt("cont_list_outdent") + ], + [ + "text" => $indent, + "action" => "list.indent", + "data" => [], + "aria-label" => $lng->txt("cont_list_indent") + ] ] ]; @@ -1963,13 +1990,28 @@ public static function getTinyMenu( if (is_array($item["action"])) { $buttons = []; foreach ($item["action"] as $i) { - $buttons[] = $ui_wrapper->getButton($i["text"], "par-action", $i["action"], $i["data"]); + $buttons[] = $ui_wrapper->getButton( + $i["text"], + "par-action", + $i["action"], + $i["data"], + "", + $i["aria-label"] ?? "" + ); } - $dd = $ui->factory()->dropdown()->standard($buttons)->withLabel($item["text"]); + $dd = $ui->factory()->dropdown()->standard($buttons)->withLabel($item["text"]) + ->withAriaLabel($item["aria-label"] ?? ""); $btpl->setCurrentBlock("button"); $btpl->setVariable("BUTTON", $ui->renderer()->renderAsync($dd)); } else { - $b = $ui_wrapper->getRenderedButton($item["text"], "par-action", $item["action"], $item["data"]); + $b = $ui_wrapper->getRenderedButton( + $item["text"], + "par-action", + $item["action"], + $item["data"], + "", + $item["aria-label"] ?? "" + ); $btpl->setCurrentBlock("button"); $btpl->setVariable("BUTTON", $b); } diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 6a82c2df38fb..acaa7ea9f11d 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -7044,15 +7044,15 @@ content#:#cont_text_acc#:#Akzent: content#:#cont_text_code#:#Programmcode: content#:#cont_text_com#:#Kommentar: content#:#cont_text_editing#:#Text bearbeiten -content#:#cont_text_emp#:#Betonter Text: +content#:#cont_text_emp#:#Betont content#:#cont_text_fn#:#Fußnote: content#:#cont_text_iln_link#:#Interner Link -content#:#cont_text_imp#:#Wichtig: +content#:#cont_text_imp#:#Wichtig content#:#cont_text_keyword#:#Schlagwort content#:#cont_text_placeh#:#Klicken und bearbeiten, um einen Text einzufügen content#:#cont_text_placehl#:#Text-Platzhalter content#:#cont_text_quot#:#Zitat: -content#:#cont_text_str#:#Stark betonter Text: +content#:#cont_text_str#:#Stark betont content#:#cont_text_sub#:#Tiefgestellt content#:#cont_text_sup#:#Hochgestellt content#:#cont_text_tex#:#LaTeX-Code: @@ -7262,9 +7262,11 @@ copg#:#copg_error_occured_modal#:#Es ist leider ein Fehler aufgetreten. Bitte dr copg#:#copg_est_reading_time#:#Geschätzte Lesezeit copg#:#copg_history_cleanup_cron#:#Seiteneditor Verlaufsbereinigung copg#:#copg_history_cleanup_cron_info#:#Löscht ältere Einträge aus dem Seiteneditorverlauf. +copg#:#copg_more_character_formats#:#Weitere Zeichenformate copg#:#copg_page_element_not_found#:#Unbekanntes Seitenelement. copg#:#copg_page_type_stys#:#Seitenlayout copg#:#copg_pc_mob_does_not_exist#:#Das Medienobjekt wurde nicht gefunden. +copg#:#copg_remove_formats#:#Zeichenformate entfernen copg#:#copg_questions_not_supported_here#:#In diesem Kontext werden keine Fragen unterstützt. copg#:#copg_reload_page#:#Seite neu laden copg#:#copg_sec_link_info#:#Wählen Sie ein Ziel für die Verlinkung des Blocks. Achtung: In diesem Fall darf der Inhalt des Blocks dann selbst keine weiteren Links enthalten! diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index aa4e7275b983..c80378dba90c 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -7044,15 +7044,15 @@ content#:#cont_text_acc#:#Accent: content#:#cont_text_code#:#Code: content#:#cont_text_com#:#Comment: content#:#cont_text_editing#:#Edit Text -content#:#cont_text_emp#:#Emphatic Text: +content#:#cont_text_emp#:#Emphasised content#:#cont_text_fn#:#Footnote: content#:#cont_text_iln_link#:#Internal Link -content#:#cont_text_imp#:#Important: +content#:#cont_text_imp#:#Important content#:#cont_text_keyword#:#Keyword content#:#cont_text_placeh#:#Click and edit to insert text content#:#cont_text_placehl#:#Text Placeholder content#:#cont_text_quot#:#Quotation -content#:#cont_text_str#:#Strong Text +content#:#cont_text_str#:#Strongly Emphasised content#:#cont_text_sub#:#Subscript content#:#cont_text_sup#:#Superscript content#:#cont_text_tex#:#LaTeX Code @@ -7262,9 +7262,11 @@ copg#:#copg_error_occured_modal#:#An error occured while processing the page. Hi copg#:#copg_est_reading_time#:#Estimated Reading Time copg#:#copg_history_cleanup_cron#:#Page Editor History Cleanup copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page history. +copg#:#copg_more_character_formats#:#More Styles for Characters copg#:#copg_page_element_not_found#:#Page element not found. copg#:#copg_page_type_stys#:#Layout Page copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist. +copg#:#copg_remove_formats#:#Remove Formatting copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context. copg#:#copg_reload_page#:#Reload Page copg#:#copg_sec_link_info#:#Select a target for linking the block. Attention: In this case, the content of the block must not contain any further links itself! From 5695ecc466648c5e3e48a3db17bbe05c4e9b820b Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Thu, 21 Dec 2023 17:04:35 +0100 Subject: [PATCH 286/497] 36823: Seiteneditor: Zu geringer Kontrast bei Anzeige der aktuellen Bearbeitung --- templates/default/delos.css | 2 +- templates/default/less/Services/COPage/delos.less | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/default/delos.css b/templates/default/delos.css index 319c78e7f644..301f14ff72af 100644 --- a/templates/default/delos.css +++ b/templates/default/delos.css @@ -14054,7 +14054,7 @@ div.copg-current-edit, #tinytarget_ifr { border-style: solid; border-width: 2px; - border-color: #bbda9b; + border-color: #557b2e; } div.il_editarea_selected:hover { border-color: #6ea03c; diff --git a/templates/default/less/Services/COPage/delos.less b/templates/default/less/Services/COPage/delos.less index 8e9492967f12..2d9586c53b36 100644 --- a/templates/default/less/Services/COPage/delos.less +++ b/templates/default/less/Services/COPage/delos.less @@ -186,7 +186,7 @@ div.il_editarea_disabled, div.copg-disabled-page { div.il_editarea_selected, div.copg-current-edit, #tinytarget_ifr { border-style: solid; border-width: 2px; - border-color: lighten(@il-secondary-color, 30%); + border-color: darken(@il-secondary-color, 10%); } div.il_editarea_selected:hover { From 1592d8b46515394f77771a5affb9a4cdb1e2b3b0 Mon Sep 17 00:00:00 2001 From: Stefan Meyer Date: Fri, 22 Dec 2023 10:45:28 +0100 Subject: [PATCH 287/497] Merge pull request #6834 from chlulei/7_mantis_ilias_29409 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0029409: Failed test: Datei zur Kursinfo hinzufügen --- lang/ilias_de.lang | 4 ++-- lang/ilias_en.lang | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index acaa7ea9f11d..267be6ce1d60 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -7266,9 +7266,9 @@ copg#:#copg_more_character_formats#:#Weitere Zeichenformate copg#:#copg_page_element_not_found#:#Unbekanntes Seitenelement. copg#:#copg_page_type_stys#:#Seitenlayout copg#:#copg_pc_mob_does_not_exist#:#Das Medienobjekt wurde nicht gefunden. -copg#:#copg_remove_formats#:#Zeichenformate entfernen copg#:#copg_questions_not_supported_here#:#In diesem Kontext werden keine Fragen unterstützt. copg#:#copg_reload_page#:#Seite neu laden +copg#:#copg_remove_formats#:#Zeichenformate entfernen copg#:#copg_sec_link_info#:#Wählen Sie ein Ziel für die Verlinkung des Blocks. Achtung: In diesem Fall darf der Inhalt des Blocks dann selbst keine weiteren Links enthalten! copg#:#copg_snippet_cannot_be_edited#:#Dies ist ein vordefinierter Inhaltsbaustein, der an dieser Stelle nicht editiert werden kann. copg#:#copg_x_minutes#:#%s Minute(n) @@ -7411,7 +7411,7 @@ crs#:#crs_edit_timings#:#Zeitvorgaben bearbeiten crs#:#crs_enable_map#:#Karte zum Kurs aktivieren crs#:#crs_end#:#Ende crs#:#crs_export#:#Kursexport -crs#:#crs_file#:#Datei +crs#:#crs_file#:#Titel crs#:#crs_file_download#:#Dateien zum Herunterladen crs#:#crs_file_name#:#Dateiname crs#:#crs_file_size_info#:#Dateigröße diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index c80378dba90c..fb345d6aae9c 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -7266,9 +7266,9 @@ copg#:#copg_more_character_formats#:#More Styles for Characters copg#:#copg_page_element_not_found#:#Page element not found. copg#:#copg_page_type_stys#:#Layout Page copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist. -copg#:#copg_remove_formats#:#Remove Formatting copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context. copg#:#copg_reload_page#:#Reload Page +copg#:#copg_remove_formats#:#Remove Formatting copg#:#copg_sec_link_info#:#Select a target for linking the block. Attention: In this case, the content of the block must not contain any further links itself! copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here. copg#:#copg_x_minutes#:#%s minute(s) @@ -7411,7 +7411,7 @@ crs#:#crs_edit_timings#:#Edit Timings crs#:#crs_enable_map#:#Enable Course Map crs#:#crs_end#:#End crs#:#crs_export#:#Course export -crs#:#crs_file#:#File +crs#:#crs_file#:#Title crs#:#crs_file_download#:#Files for Download crs#:#crs_file_name#:#File Name crs#:#crs_file_size_info#:#Filesize From 5f071cc89568a7b141341862abf71cfeb8ff2ead Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sat, 23 Dec 2023 00:02:23 +0100 Subject: [PATCH 288/497] =?UTF-8?q?36837:=20Seiteneditor,=20Plus-Symbolen?= =?UTF-8?q?=20zum=20Hinzuf=C3=BCgen=20fehlt=20sichtbarer=20Tastaturfokus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/default/delos.css | 7 ++++++- templates/default/less/Services/COPage/delos.less | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/templates/default/delos.css b/templates/default/delos.css index 301f14ff72af..6bdb5832ef8b 100644 --- a/templates/default/delos.css +++ b/templates/default/delos.css @@ -13954,10 +13954,15 @@ button.copg-add.dropdown-toggle.btn:hover .il-copg-add-text, color: #4c6586; font-size: 1rem; } -button.copg-add.dropdown-toggle.btn:hover { +button.copg-add.dropdown-toggle.btn:hover, +button.copg-add.dropdown-toggle.btn:focus-visible { background-color: #e2e8ef; color: #6f6f6f; } +button.copg-add.dropdown-toggle.btn:focus-visible { + outline: 3px solid #0078D7; + outline-offset: -3px; +} [data-copg-ed-type='add-area'] ul.dropdown-menu { left: 45%; } diff --git a/templates/default/less/Services/COPage/delos.less b/templates/default/less/Services/COPage/delos.less index 2d9586c53b36..a3a3c2a57736 100644 --- a/templates/default/less/Services/COPage/delos.less +++ b/templates/default/less/Services/COPage/delos.less @@ -78,11 +78,16 @@ button.copg-add.dropdown-toggle.btn:hover, } } -button.copg-add.dropdown-toggle.btn:hover { +button.copg-add.dropdown-toggle.btn:hover, button.copg-add.dropdown-toggle.btn:focus-visible { background-color: lighten(@il-btn-standard-bg, 50%); color: @il-text-light-color; } +button.copg-add.dropdown-toggle.btn:focus-visible { + outline: @il-focus-outline-inner; + outline-offset: -@il-focus-outline-inner-width; +} + [data-copg-ed-type='add-area'] ul.dropdown-menu { left: 45%; } From dd9e4f3f96b36b4c798f422ce3dbcf87c57b33d9 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sat, 23 Dec 2023 13:09:54 +0100 Subject: [PATCH 289/497] 36829: Seiteneditor, Tastaturfalle wenn Fokus im bearbeiteten Textfeld --- .../js/src/components/paragraph/ui/paragraph-ui.js | 10 ++++++++++ .../components/paragraph/ui/tiny-wrapper-cb-types.js | 3 ++- .../js/src/components/paragraph/ui/tiny-wrapper.js | 7 ++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js b/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js index b811fba9767e..2410190031ff 100644 --- a/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js +++ b/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js @@ -714,6 +714,11 @@ export default class ParagraphUI { } } + escape() { + const b = document.querySelector("[data-copg-ed-action='save.return']"); + b.focus(); + } + initWrapperCallbacks() { const wrapper = this.tinyWrapper; const parUI = this; @@ -734,6 +739,11 @@ export default class ParagraphUI { parUI.switchToNext(); } }); + wrapper.addCallback(TINY_CB.ESCAPE, () => { + if (pageModel.getCurrentPCName() === "Paragraph") { + parUI.escape(); + } + }); wrapper.addCallback(TINY_CB.SWITCH_DOWN, () => { if (pageModel.getCurrentPCName() === "Paragraph") { parUI.switchToNext(); diff --git a/Services/COPage/Editor/js/src/components/paragraph/ui/tiny-wrapper-cb-types.js b/Services/COPage/Editor/js/src/components/paragraph/ui/tiny-wrapper-cb-types.js index 8b5bdf1b0d87..3301a5ba7501 100644 --- a/Services/COPage/Editor/js/src/components/paragraph/ui/tiny-wrapper-cb-types.js +++ b/Services/COPage/Editor/js/src/components/paragraph/ui/tiny-wrapper-cb-types.js @@ -26,7 +26,8 @@ const CBTYPES = { KEY_UP: 7, AFTER_INIT: 8, TAB: 9, - SHIFT_TAB: 10 + SHIFT_TAB: 10, + ESCAPE: 11 }; export default CBTYPES; \ No newline at end of file diff --git a/Services/COPage/Editor/js/src/components/paragraph/ui/tiny-wrapper.js b/Services/COPage/Editor/js/src/components/paragraph/ui/tiny-wrapper.js index d2cad404b5bd..64c1f528519f 100644 --- a/Services/COPage/Editor/js/src/components/paragraph/ui/tiny-wrapper.js +++ b/Services/COPage/Editor/js/src/components/paragraph/ui/tiny-wrapper.js @@ -337,8 +337,13 @@ export default class TinyWrapper { cb(); }); - const currentRng = tiny.selection.getRng(); + if (ev.key === "Escape") { + wrapper.getCallbacks(CB.ESCAPE).forEach((cb) => { + cb(); + }); + } + const currentRng = tiny.selection.getRng(); // down, right if ([39,40].includes(ev.keyCode)) { if ( From 668e6bd68f80fb0de85a940c1f3ef0366ee0b366 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sat, 23 Dec 2023 14:33:15 +0100 Subject: [PATCH 290/497] =?UTF-8?q?36755:=20Seiteneditor,=20=C3=9Cberschri?= =?UTF-8?q?ften=20der=20Formatierbuttongroups=20nicht=20als=20HTML-Headlin?= =?UTF-8?q?e=20ausgezeichnet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Services/COPage/templates/default/tpl.tiny_menu.html | 6 +++--- templates/default/delos.css | 4 ++-- templates/default/less/Services/COPage/delos.less | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Services/COPage/templates/default/tpl.tiny_menu.html b/Services/COPage/templates/default/tpl.tiny_menu.html index b05da6dfc2d0..f0288db01454 100644 --- a/Services/COPage/templates/default/tpl.tiny_menu.html +++ b/Services/COPage/templates/default/tpl.tiny_menu.html @@ -16,20 +16,20 @@

{TINY_HEADER}

 

-

{TXT_PAR_FORMAT}

+

{TXT_PAR_FORMAT}

{STYLE_SELECTOR}
-

{TXT_SECTION}

+

{TXT_SECTION}

{BUTTON}
-

{TXT_BLOCK}

+

{TXT_BLOCK}

{BLOCK_STYLE_SELECTOR}
diff --git a/templates/default/delos.css b/templates/default/delos.css index 6bdb5832ef8b..7c5b0fd7c09b 100644 --- a/templates/default/delos.css +++ b/templates/default/delos.css @@ -14522,12 +14522,12 @@ div.ilCOPGMediaPrint { padding: 0; margin: 5px 0; } -#copg-editor-slate-content p.ilTinyInfo { +#copg-editor-slate-content h3.ilTinyInfo { padding: 4px; width: 100%; } @media only screen and (max-width: 768px) { - #copg-editor-slate-content p.ilTinyInfo { + #copg-editor-slate-content h3.ilTinyInfo { display: none; } } diff --git a/templates/default/less/Services/COPage/delos.less b/templates/default/less/Services/COPage/delos.less index a3a3c2a57736..afa90801e73a 100644 --- a/templates/default/less/Services/COPage/delos.less +++ b/templates/default/less/Services/COPage/delos.less @@ -742,7 +742,7 @@ div.ilCOPGMediaPrint { margin: 5px 0; } - p.ilTinyInfo { + h3.ilTinyInfo { padding: 4px; width: 100%; @media only screen and (max-width: @grid-float-breakpoint-max) { From cbc14fcf098bcc1b18daf0a9b17339300fffe939 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sat, 23 Dec 2023 14:49:18 +0100 Subject: [PATCH 291/497] =?UTF-8?q?36832:=20Seiteneditor:=20title-Attribut?= =?UTF-8?q?=20f=C3=BCr=20iFrame=20falsch=20bzw.=20nicht=20aussagekr=C3=A4f?= =?UTF-8?q?tig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/js/src/components/paragraph/ui/paragraph-ui.js | 2 ++ Services/COPage/classes/class.ilPageObjectGUI.php | 1 + lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 4 files changed, 5 insertions(+) diff --git a/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js b/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js index 2410190031ff..e110dc2a6a2f 100644 --- a/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js +++ b/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js @@ -866,6 +866,8 @@ export default class ParagraphUI { const action = this.actionFactory; const ef = action.paragraph().editor(); const tblact = action.table().editor(); + const ifrm = document.getElementById('tinytarget_ifr'); + ifrm.title = il.Language.txt("copg_edit_iframe_title"); //#0017152 $('#tinytarget_ifr').contents().find("html").attr('lang', $('html').attr('lang')); diff --git a/Services/COPage/classes/class.ilPageObjectGUI.php b/Services/COPage/classes/class.ilPageObjectGUI.php index 23419c76d290..a3eff3fe9130 100755 --- a/Services/COPage/classes/class.ilPageObjectGUI.php +++ b/Services/COPage/classes/class.ilPageObjectGUI.php @@ -2449,6 +2449,7 @@ protected function initEditing(): void $this->lng->toJS("cont_ed_item_up"); $this->lng->toJS("cont_ed_item_down"); $this->lng->toJS("cont_ed_delete_item"); + $this->lng->toJS("copg_edit_iframe_title"); // workaroun: we need this js for the new editor version, e.g. for new section form to work // @todo: solve this in a smarter way $this->tpl->addJavaScript("./Services/UIComponent/AdvancedSelectionList/js/AdvancedSelectionList.js"); diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 267be6ce1d60..b6fb0f54e96a 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -7256,6 +7256,7 @@ copg#:#copg_cron_keep_entries#:#Mindestanzahl Einträge copg#:#copg_cron_keep_entries_info#:#Diese Anzahl an Einträgen wird im Verlauf behalten, auch wenn diese älter als der angegebene Zeitraum sind. copg#:#copg_days#:#Tage copg#:#copg_details#:#Details +copg#:#copg_edit_iframe_title#:#Eingabebereich für Text copg#:#copg_entries#:#Einträge copg#:#copg_error#:#Problem copg#:#copg_error_occured_modal#:#Es ist leider ein Fehler aufgetreten. Bitte drücken Sie "Seite neu laden" um zum zuletzt gespeicherten Inhalt zu gelangen. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index fb345d6aae9c..80d1dd744bd5 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -7256,6 +7256,7 @@ copg#:#copg_cron_keep_entries#:#Keep Minimum copg#:#copg_cron_keep_entries_info#:#This number is the minimum of entries that will be kept, even if they are older than the deletion period. copg#:#copg_days#:#Days copg#:#copg_details#:#Details +copg#:#copg_edit_iframe_title#:#Text Editing Area copg#:#copg_entries#:#Entries copg#:#copg_error#:#Error copg#:#copg_error_occured_modal#:#An error occured while processing the page. Hit "Reload Page" to return to the previously saved state. From 2a089c78df3b5e5950a5e319b0b8744a446c5997 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sat, 23 Dec 2023 22:07:51 +0100 Subject: [PATCH 292/497] =?UTF-8?q?36832:=20Seiteneditor:=20title-Attribut?= =?UTF-8?q?=20f=C3=BCr=20iFrame=20falsch=20bzw.=20nicht=20aussagekr=C3=A4f?= =?UTF-8?q?tig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lang/ilias_de.lang | 2 +- lang/ilias_en.lang | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index b6fb0f54e96a..bee510541b40 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -7256,7 +7256,7 @@ copg#:#copg_cron_keep_entries#:#Mindestanzahl Einträge copg#:#copg_cron_keep_entries_info#:#Diese Anzahl an Einträgen wird im Verlauf behalten, auch wenn diese älter als der angegebene Zeitraum sind. copg#:#copg_days#:#Tage copg#:#copg_details#:#Details -copg#:#copg_edit_iframe_title#:#Eingabebereich für Text +copg#:#copg_edit_iframe_title#:#Text bearbeiten im Seiteneditor copg#:#copg_entries#:#Einträge copg#:#copg_error#:#Problem copg#:#copg_error_occured_modal#:#Es ist leider ein Fehler aufgetreten. Bitte drücken Sie "Seite neu laden" um zum zuletzt gespeicherten Inhalt zu gelangen. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 80d1dd744bd5..1d0da7ad2275 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -7256,7 +7256,7 @@ copg#:#copg_cron_keep_entries#:#Keep Minimum copg#:#copg_cron_keep_entries_info#:#This number is the minimum of entries that will be kept, even if they are older than the deletion period. copg#:#copg_days#:#Days copg#:#copg_details#:#Details -copg#:#copg_edit_iframe_title#:#Text Editing Area +copg#:#copg_edit_iframe_title#:#Text Editing of Page Editor copg#:#copg_entries#:#Entries copg#:#copg_error#:#Error copg#:#copg_error_occured_modal#:#An error occured while processing the page. Hit "Reload Page" to return to the previously saved state. From 6e3592488ea85672937de5703204b0342bec60d0 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 24 Dec 2023 10:23:12 +0100 Subject: [PATCH 293/497] =?UTF-8?q?37134:=20Seiteneditor:=20Aktionen-Liste?= =?UTF-8?q?=20f=C3=BCr=20die=20Absatzformatauswahl=20nicht=20korrekt=20gel?= =?UTF-8?q?abelt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/js/src/components/paragraph/ui/paragraph-ui.js | 1 + Services/COPage/classes/class.ilPageObjectGUI.php | 3 ++- lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js b/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js index e110dc2a6a2f..1a60dc4cef8a 100644 --- a/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js +++ b/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js @@ -439,6 +439,7 @@ export default class ParagraphUI { if (fc) { this.log("SETTin DROP DOWN BUTTON: " + i) fc.firstChild.textContent = ddbtn.textContent + " "; + fc.ariaLabel = il.Language.txt('copg_par_format_selection') + ": " + ddbtn.textContent; } this.tinyWrapper.setParagraphClass(i); } diff --git a/Services/COPage/classes/class.ilPageObjectGUI.php b/Services/COPage/classes/class.ilPageObjectGUI.php index a3eff3fe9130..5bacdd6865d1 100755 --- a/Services/COPage/classes/class.ilPageObjectGUI.php +++ b/Services/COPage/classes/class.ilPageObjectGUI.php @@ -1790,7 +1790,7 @@ public static function getTinyMenu( $aset = new ilSetting("adve"); - $f = static function (string $type, string $code) use ($char_manager, $lng) : string { + $f = static function (string $type, string $code) use ($char_manager, $lng): string { $title = $char_manager->getPresentationTitle("text_inline", $type); if ($title === $type) { $title = $lng->txt("cont_char_style_" . $code); @@ -2450,6 +2450,7 @@ protected function initEditing(): void $this->lng->toJS("cont_ed_item_down"); $this->lng->toJS("cont_ed_delete_item"); $this->lng->toJS("copg_edit_iframe_title"); + $this->lng->toJS("copg_par_format_selection"); // workaroun: we need this js for the new editor version, e.g. for new section form to work // @todo: solve this in a smarter way $this->tpl->addJavaScript("./Services/UIComponent/AdvancedSelectionList/js/AdvancedSelectionList.js"); diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index bee510541b40..5282c569dbc7 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -7266,6 +7266,7 @@ copg#:#copg_history_cleanup_cron_info#:#Löscht ältere Einträge aus dem Seiten copg#:#copg_more_character_formats#:#Weitere Zeichenformate copg#:#copg_page_element_not_found#:#Unbekanntes Seitenelement. copg#:#copg_page_type_stys#:#Seitenlayout +copg#:#copg_par_format_selection#:#Absatzformatauswahl copg#:#copg_pc_mob_does_not_exist#:#Das Medienobjekt wurde nicht gefunden. copg#:#copg_questions_not_supported_here#:#In diesem Kontext werden keine Fragen unterstützt. copg#:#copg_reload_page#:#Seite neu laden diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 1d0da7ad2275..a74c3436302a 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -7266,6 +7266,7 @@ copg#:#copg_history_cleanup_cron_info#:#Removes older entries from the page hist copg#:#copg_more_character_formats#:#More Styles for Characters copg#:#copg_page_element_not_found#:#Page element not found. copg#:#copg_page_type_stys#:#Layout Page +copg#:#copg_par_format_selection#:#Paragraph Format Selection copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist. copg#:#copg_questions_not_supported_here#:#Questions are not supported in this context. copg#:#copg_reload_page#:#Reload Page From 856d8b5bcdd004649839a186518a92a74782f60c Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 29 Dec 2023 10:20:56 +0100 Subject: [PATCH 294/497] =?UTF-8?q?36832:=20Seiteneditor:=20title-Attribut?= =?UTF-8?q?=20f=C3=BCr=20iFrame=20falsch=20bzw.=20nicht=20aussagekr=C3=A4f?= =?UTF-8?q?tig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/js/src/components/paragraph/ui/paragraph-ui.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js b/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js index 1a60dc4cef8a..62a55cd58c25 100644 --- a/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js +++ b/Services/COPage/Editor/js/src/components/paragraph/ui/paragraph-ui.js @@ -868,7 +868,9 @@ export default class ParagraphUI { const ef = action.paragraph().editor(); const tblact = action.table().editor(); const ifrm = document.getElementById('tinytarget_ifr'); - ifrm.title = il.Language.txt("copg_edit_iframe_title"); + if (ifrm) { + ifrm.title = il.Language.txt("copg_edit_iframe_title"); + } //#0017152 $('#tinytarget_ifr').contents().find("html").attr('lang', $('html').attr('lang')); From ba56c00b39f6b5e0305fa468f88272ddda36c917 Mon Sep 17 00:00:00 2001 From: Guido Vollbach Date: Tue, 2 Jan 2024 09:10:42 +0100 Subject: [PATCH 295/497] Fix pdf config form #39500 --- .../classes/class.ilPDFGeneratorUtils.php | 14 --------- .../class.ilWkhtmlToPdfConfigFormGUI.php | 29 +++++++------------ 2 files changed, 10 insertions(+), 33 deletions(-) diff --git a/Services/PDFGeneration/classes/class.ilPDFGeneratorUtils.php b/Services/PDFGeneration/classes/class.ilPDFGeneratorUtils.php index ea569db2c864..fc6156b42bb5 100644 --- a/Services/PDFGeneration/classes/class.ilPDFGeneratorUtils.php +++ b/Services/PDFGeneration/classes/class.ilPDFGeneratorUtils.php @@ -67,20 +67,6 @@ public static function removeWrongPathFromStyleFiles(string $path): void } } - /** - * @param ilPropertyFormGUI $form - */ - public static function setCheckedIfTrue(ilPropertyFormGUI $form): void - { - foreach ($form->getItems() as $item) { - if ($item instanceof ilCheckboxInputGUI) { - if ($item->getValue() || $item->getValue() === '1') { - $item->setChecked(true); - } - } - } - } - /** * @return array */ diff --git a/Services/PDFGeneration/classes/renderer/wkhtmltopdf/class.ilWkhtmlToPdfConfigFormGUI.php b/Services/PDFGeneration/classes/renderer/wkhtmltopdf/class.ilWkhtmlToPdfConfigFormGUI.php index c9c2845d5c5f..2c938cc736a8 100644 --- a/Services/PDFGeneration/classes/renderer/wkhtmltopdf/class.ilWkhtmlToPdfConfigFormGUI.php +++ b/Services/PDFGeneration/classes/renderer/wkhtmltopdf/class.ilWkhtmlToPdfConfigFormGUI.php @@ -441,23 +441,18 @@ public function populateForm(ilPropertyFormGUI $form, ilWkhtmlToPdfConfig $confi { $form->getItemByPostVar('path')->setValue($config->getWKHTMLToPdfDefaultPath()); $form->getItemByPostVar('zoom')->setValue($config->getZoom()); - $form->getItemByPostVar('external_links')->setValue("1"); - $form->getItemByPostVar('external_links')->setChecked($config->getExternalLinks()); - $form->getItemByPostVar('enable_forms')->setValue("1"); - $form->getItemByPostVar('enable_forms')->setChecked($config->getEnabledForms()); + $form->getItemByPostVar('external_links')->setChecked((bool) $config->getExternalLinks()); + $form->getItemByPostVar('enable_forms')->setChecked((bool) $config->getEnabledForms()); $form->getItemByPostVar('user_stylesheet')->setValue($config->getUserStylesheet()); - $form->getItemByPostVar('low_quality')->setValue("1"); - $form->getItemByPostVar('low_quality')->setChecked($config->getLowQuality()); - $form->getItemByPostVar('greyscale')->setValue("1"); - $form->getItemByPostVar('greyscale')->setChecked($config->getGreyscale()); + $form->getItemByPostVar('low_quality')->setChecked((bool) $config->getLowQuality()); + $form->getItemByPostVar('greyscale')->setChecked((bool) $config->getGreyscale()); $form->getItemByPostVar('orientation')->setValue($config->getOrientation()); $form->getItemByPostVar('page_size')->setValue($config->getPageSize()); $form->getItemByPostVar('margin_left')->setValue($config->getMarginLeft()); $form->getItemByPostVar('margin_right')->setValue($config->getMarginRight()); $form->getItemByPostVar('margin_top')->setValue($config->getMarginTop()); $form->getItemByPostVar('margin_bottom')->setValue($config->getMarginBottom()); - $form->getItemByPostVar('print_media_type')->setValue("1"); - $form->getItemByPostVar('print_media_type')->setChecked($config->getPrintMediaType()); + $form->getItemByPostVar('print_media_type')->setChecked(( bool) $config->getPrintMediaType()); $form->getItemByPostVar('javascript_delay')->setValue($config->getJavascriptDelay()); $form->getItemByPostVar('checkbox_svg')->setValue($config->getCheckboxSvg()); $form->getItemByPostVar('checkbox_checked_svg')->setValue($config->getCheckboxCheckedSvg()); @@ -468,10 +463,9 @@ public function populateForm(ilPropertyFormGUI $form, ilWkhtmlToPdfConfig $confi $form->getItemByPostVar('head_text_center')->setValue($config->getHeaderTextCenter()); $form->getItemByPostVar('head_text_right')->setValue($config->getHeaderTextRight()); $form->getItemByPostVar('head_text_spacing')->setValue($config->getHeaderTextSpacing()); - $form->getItemByPostVar('head_text_line')->setValue("1"); - $form->getItemByPostVar('head_text_line')->setChecked($config->isHeaderTextLine()); - $form->getItemByPostVar('head_html_line')->setValue("1"); - $form->getItemByPostVar('head_html_line')->setChecked($config->isHeaderHtmlLine()); + + $form->getItemByPostVar('head_text_line')->setChecked((bool) $config->isHeaderTextLine()); + $form->getItemByPostVar('head_html_line')->setChecked((bool) $config->isHeaderHtmlLine()); $form->getItemByPostVar('head_html_spacing')->setValue($config->getHeaderHtmlSpacing()); $form->getItemByPostVar('head_html')->setValue($config->getHeaderHtml()); $form->getItemByPostVar('footer_select')->setValue((string) $config->getFooterType()); @@ -479,14 +473,11 @@ public function populateForm(ilPropertyFormGUI $form, ilWkhtmlToPdfConfig $confi $form->getItemByPostVar('footer_text_center')->setValue($config->getFooterTextCenter()); $form->getItemByPostVar('footer_text_right')->setValue($config->getFooterTextRight()); $form->getItemByPostVar('footer_text_spacing')->setValue($config->getFooterTextSpacing()); - $form->getItemByPostVar('footer_text_line')->setValue("1"); - $form->getItemByPostVar('footer_text_line')->setChecked($config->isFooterTextLine()); - $form->getItemByPostVar('footer_html_line')->setValue("1"); - $form->getItemByPostVar('footer_html_line')->setChecked($config->isFooterHtmlLine()); + $form->getItemByPostVar('footer_text_line')->setChecked((bool) $config->isFooterTextLine()); + $form->getItemByPostVar('footer_html_line')->setChecked((bool) $config->isFooterHtmlLine()); $form->getItemByPostVar('footer_html')->setValue($config->getFooterHtml()); $form->getItemByPostVar('footer_html_spacing')->setValue($config->getFooterHtmlSpacing()); $form->getItemByPostVar('overwrite_font')->setValue($config->getOverwriteDefaultFont(false)); - ilPDFGeneratorUtils::setCheckedIfTrue($form); } } From 0df90cebb7a5ae82b7bf2c40f91c4e98598f59b9 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Tue, 2 Jan 2024 11:17:08 +0100 Subject: [PATCH 296/497] Poll: use KS icons in participants results table (39621) --- .../Poll/classes/class.ilPollUserTableGUI.php | 17 ++++++++++++++++- lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Modules/Poll/classes/class.ilPollUserTableGUI.php b/Modules/Poll/classes/class.ilPollUserTableGUI.php index ee68ae7c3328..01439b743d75 100644 --- a/Modules/Poll/classes/class.ilPollUserTableGUI.php +++ b/Modules/Poll/classes/class.ilPollUserTableGUI.php @@ -19,6 +19,8 @@ ******************************************************************** */ +use ILIAS\UI\Component\Symbol\Icon\Icon; + /** * TableGUI class for poll users * @@ -27,6 +29,7 @@ class ilPollUserTableGUI extends ilTable2GUI { protected array $answer_ids = []; + protected string $rendered_checked_icon; public function __construct(object $a_parent_obj, string $a_parent_cmd) { @@ -36,6 +39,18 @@ public function __construct(object $a_parent_obj, string $a_parent_cmd) $this->lng = $DIC->language(); $ilCtrl = $DIC->ctrl(); $lng = $DIC->language(); + $ui_factory = $DIC->ui()->factory(); + $ui_renderer = $DIC->ui()->renderer(); + + $lng->loadLanguageModule('poll'); + + $this->rendered_checked_icon = $ui_renderer->render( + $ui_factory->symbol()->icon()->custom( + ilUtil::getImagePath('icon_ok.svg'), + $lng->txt('poll_answer_selected_alt_text'), + Icon::MEDIUM + ) + ); $this->setId("ilobjpollusr"); @@ -88,7 +103,7 @@ protected function fillRow(array $a_set): void $this->tpl->setCurrentBlock("answer_bl"); foreach ($this->answer_ids as $answer_id) { if ($a_set["answer" . $answer_id]) { - $this->tpl->setVariable("ANSWER", ''); + $this->tpl->setVariable("ANSWER", $this->rendered_checked_icon); } else { $this->tpl->setVariable("ANSWER", " "); } diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 5282c569dbc7..d19d4a09d296 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -12542,6 +12542,7 @@ poll#:#poll_activation_online_info#:#Wählen Sie diese Einstellung, um die Absti poll#:#poll_add#:#Abstimmung anlegen poll#:#poll_anonymous_warning#:#Ihr Name wird in den Abstimmungsergebnissen nicht angezeigt. poll#:#poll_answer#:#Antwort +poll#:#poll_answer_selected_alt_text#:#Ausgewählt poll#:#poll_answers#:#Mögliche Antworten poll#:#poll_barchart#:#Balkendiagramm poll#:#poll_block_message_already_voted#:#Sie haben bereits abgestimmt. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index a74c3436302a..6cf550b49245 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -12542,6 +12542,7 @@ poll#:#poll_activation_online_info#:#Activate this setting to make the poll acce poll#:#poll_add#:#Add Poll poll#:#poll_anonymous_warning#:#Your name is not visible in the poll results. poll#:#poll_answer#:#Answer +poll#:#poll_answer_selected_alt_text#:#Selected poll#:#poll_answers#:#Possible Answers poll#:#poll_barchart#:#Bar Chart poll#:#poll_block_message_already_voted#:#You already voted in this poll. From f02a1605c6f262c35e8d74e699472dafbd01c14d Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Tue, 2 Jan 2024 13:46:12 +0100 Subject: [PATCH 297/497] EmployeeTalk: improve timezone handling when building vevents (39613) --- Modules/EmployeeTalk/classes/Service/VEvent.php | 14 ++++++++++---- .../test/ilModulesEmployeeTalkVEventTest.php | 8 ++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Modules/EmployeeTalk/classes/Service/VEvent.php b/Modules/EmployeeTalk/classes/Service/VEvent.php index 3e1d373a815f..ff6c62fb5d08 100644 --- a/Modules/EmployeeTalk/classes/Service/VEvent.php +++ b/Modules/EmployeeTalk/classes/Service/VEvent.php @@ -101,13 +101,19 @@ public function __construct( private function getStartAndEnd(): string { + // creating DateTimes from Unix timestamps automatically sets the initial timezone to UTC + $start = new \DateTimeImmutable('@' . $this->startTime); + $start = $start->setTimezone(new \DateTimeZone('Europe/Paris')); + $end = new \DateTimeImmutable('@' . $this->endTime); + $end = $end->setTimezone(new \DateTimeZone('Europe/Paris')); + if ($this->allDay) { - return 'DTSTART;TZID=Europe/Paris;VALUE=DATE:' . date("Ymd", $this->startTime) . "\r\n" . - 'DTEND;TZID=Europe/Paris;VALUE=DATE:' . date("Ymd", $this->endTime) . "\r\n" . + return 'DTSTART;TZID=Europe/Paris;VALUE=DATE:' . $start->format('Ymd') . "\r\n" . + 'DTEND;TZID=Europe/Paris;VALUE=DATE:' . $end->format('Ymd') . "\r\n" . "X-MICROSOFT-CDO-ALLDAYEVENT: TRUE\r\n"; } else { - return 'DTSTART;TZID=Europe/Paris:' . date("Ymd\THis", $this->startTime) . "\r\n" . - 'DTEND;TZID=Europe/Paris:' . date("Ymd\THis", $this->endTime) . "\r\n"; + return 'DTSTART;TZID=Europe/Paris:' . $start->format('Ymd\THis') . "\r\n" . + 'DTEND;TZID=Europe/Paris:' . $end->format('Ymd\THis') . "\r\n"; } } diff --git a/Modules/EmployeeTalk/test/ilModulesEmployeeTalkVEventTest.php b/Modules/EmployeeTalk/test/ilModulesEmployeeTalkVEventTest.php index eef299c1311d..63c3dd809e9d 100644 --- a/Modules/EmployeeTalk/test/ilModulesEmployeeTalkVEventTest.php +++ b/Modules/EmployeeTalk/test/ilModulesEmployeeTalkVEventTest.php @@ -1,7 +1,5 @@ Date: Tue, 2 Jan 2024 17:29:56 +0100 Subject: [PATCH 298/497] Tracking: fix headers in daily usage statistics table (39715) --- .../class.ilLPObjectStatisticsDailyTableGUI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsDailyTableGUI.php b/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsDailyTableGUI.php index 9d9c0c9f8716..b7c3e35c1334 100644 --- a/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsDailyTableGUI.php +++ b/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsDailyTableGUI.php @@ -63,8 +63,8 @@ public function init(): void } for ($loop = 0; $loop < 24; $loop += 2) { $this->addColumn( - str_pad($loop, 2, "0", STR_PAD_LEFT) . ":00-
" . - str_pad((string) $loop, 2, "0", STR_PAD_LEFT) . ":00 ", + str_pad((string) $loop, 2, "0", STR_PAD_LEFT) . ":00-
" . + str_pad((string) ($loop + 2), 2, "0", STR_PAD_LEFT) . ":00 ", "hour" . $loop ); } From 6c77dd0786f156d52e1bde60c33aa4eba221692d Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Tue, 2 Jan 2024 17:46:09 +0100 Subject: [PATCH 299/497] Tracking: fix numeric ordering in daily usage table (39718) --- .../class.ilLPObjectStatisticsDailyTableGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsDailyTableGUI.php b/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsDailyTableGUI.php index b7c3e35c1334..89aa76f56ae4 100644 --- a/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsDailyTableGUI.php +++ b/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsDailyTableGUI.php @@ -139,7 +139,7 @@ public function numericOrdering(string $a_field): bool $alphabetic_ordering = [ 'title' ]; - if (in_array($a_field, $alphabetic_ordering)) { + if (!in_array($a_field, $alphabetic_ordering)) { return true; } return false; From 2e09013b1e31dae7b2f5dee77452cf1bf32f0a96 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Tue, 2 Jan 2024 17:56:13 +0100 Subject: [PATCH 300/497] Tracking: fix numeric ordering in more tables --- .../object_statistics/class.ilLPObjectStatisticsLPTableGUI.php | 2 +- .../object_statistics/class.ilLPObjectStatisticsTableGUI.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsLPTableGUI.php b/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsLPTableGUI.php index 660919a5caae..15e215882a3c 100644 --- a/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsLPTableGUI.php +++ b/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsLPTableGUI.php @@ -204,7 +204,7 @@ public function numericOrdering(string $a_field): bool $alphabetic_ordering = [ 'title' ]; - if (in_array($a_field, $alphabetic_ordering)) { + if (!in_array($a_field, $alphabetic_ordering)) { return true; } return false; diff --git a/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsTableGUI.php b/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsTableGUI.php index 844a91938db5..0fd0595efe42 100644 --- a/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsTableGUI.php +++ b/Services/Tracking/classes/object_statistics/class.ilLPObjectStatisticsTableGUI.php @@ -132,7 +132,7 @@ public function numericOrdering(string $a_field): bool $alphabetic_ordering = [ 'title' ]; - if (in_array($a_field, $alphabetic_ordering)) { + if (!in_array($a_field, $alphabetic_ordering)) { return true; } return false; From 2b82ba041ae042fd7e693ea8920c109a1038830e Mon Sep 17 00:00:00 2001 From: Thomas Famula Date: Tue, 2 Jan 2024 18:59:28 +0100 Subject: [PATCH 301/497] =?UTF-8?q?Fix=2039085:=20Failed=20test:=20Kompete?= =?UTF-8?q?nzbaum=20anlegen=20und=20l=C3=B6schen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/class.ilSkillGSToolProvider.php | 4 ++-- Services/Skill/Tree/class.ilObjSkillTreeGUI.php | 16 ++++++++++------ .../class.ilSkillTemplateTreeExplorerGUI.php | 6 +++--- ...dminGUI.php => class.ilSkillTreeAdminGUI.php} | 4 ++-- .../Skill/Tree/class.ilSkillTreeExplorerGUI.php | 2 +- .../classes/class.ilObjSkillManagementGUI.php | 10 +++++----- 6 files changed, 23 insertions(+), 19 deletions(-) rename Services/Skill/Tree/{class.SkillTreeAdminGUI.php => class.ilSkillTreeAdminGUI.php} (97%) diff --git a/Services/Skill/GlobalScreen/classes/class.ilSkillGSToolProvider.php b/Services/Skill/GlobalScreen/classes/class.ilSkillGSToolProvider.php index 41692c09b273..1e11cb09feed 100644 --- a/Services/Skill/GlobalScreen/classes/class.ilSkillGSToolProvider.php +++ b/Services/Skill/GlobalScreen/classes/class.ilSkillGSToolProvider.php @@ -87,7 +87,7 @@ public function getToolsForContextStack(CalledContexts $called_contexts): array private function getSkillTree(int $tree_id): string { $exp = new ilSkillTreeExplorerGUI(["ilAdministrationGUI", "ilObjSkillManagementGUI", - "SkillTreeAdminGUI", "ilObjSkillTreeGUI"], "showTree", $tree_id); + "ilSkillTreeAdminGUI", "ilObjSkillTreeGUI"], "showTree", $tree_id); return $exp->getHTML(); } @@ -95,7 +95,7 @@ private function getSkillTree(int $tree_id): string private function getTemplateTree(int $tree_id): string { $exp = new ilSkillTemplateTreeExplorerGUI(["ilAdministrationGUI", "ilObjSkillManagementGUI", - "SkillTreeAdminGUI", "ilObjSkillTreeGUI"], "showTree", $tree_id); + "ilSkillTreeAdminGUI", "ilObjSkillTreeGUI"], "showTree", $tree_id); return $exp->getHTML(); } diff --git a/Services/Skill/Tree/class.ilObjSkillTreeGUI.php b/Services/Skill/Tree/class.ilObjSkillTreeGUI.php index 8bd78321a34d..bed858955efd 100644 --- a/Services/Skill/Tree/class.ilObjSkillTreeGUI.php +++ b/Services/Skill/Tree/class.ilObjSkillTreeGUI.php @@ -398,7 +398,7 @@ public function save(): void if ($request->getMethod() == "POST") { $form = $form->withRequest($request); $data = $form->getData(); - if (is_array($data["props"])) { + if (isset($data["props"]) && is_array($data["props"])) { $props = $data["props"]; $this->skill_tree_manager->createTree( $props["title"], @@ -428,7 +428,7 @@ public function update(): void if ($request->getMethod() == "POST") { $form = $form->withRequest($request); $data = $form->getData(); - if (is_array($data["props"])) { + if (isset($data["props"]) && is_array($data["props"])) { $props = $data["props"]; /** @var ilObjSkillTree $obj */ $obj = $this->object; @@ -605,7 +605,8 @@ public function deleteNodes(object $a_gui): void $ilToolbar = $this->toolbar; if (empty($this->requested_node_ids)) { - $this->ilias->raiseError($this->lng->txt("no_checkbox"), $this->ilias->error_obj->MESSAGE); + $tpl->setOnScreenMessage("info", $lng->txt("no_checkbox"), true); + $ilCtrl->redirectByClass("ilskilltreeadmingui", "listTrees"); } $ilTabs->clearTargets(); @@ -625,7 +626,8 @@ public function deleteNodes(object $a_gui): void } if (in_array(ilSkillTreeNode::_lookupType($id), array("skll", "scat", "sktr"))) { if ($mode == "templates") { - $this->ilias->raiseError("Skill Deletion - type mismatch.", $this->ilias->error_obj->MESSAGE); + $tpl->setOnScreenMessage("failure", "Skill Deletion - type mismatch.", true); + $ilCtrl->redirectByClass("ilskilltreeadmingui", "listTrees"); } $mode = "basic"; $skill_id = $id; @@ -638,7 +640,8 @@ public function deleteNodes(object $a_gui): void } if (in_array(ilSkillTreeNode::_lookupType($id), array("sktp", "sctp"))) { if ($mode == "basic") { - $this->ilias->raiseError("Skill Deletion - type mismatch.", $this->ilias->error_obj->MESSAGE); + $tpl->setOnScreenMessage("failure", "Skill Deletion - type mismatch.", true); + $ilCtrl->redirectByClass("ilskilltreeadmingui", "listTrees"); } $mode = "templates"; @@ -657,7 +660,8 @@ public function deleteNodes(object $a_gui): void } elseif ($mode == "basic" || $mode == "templates") { $usages = $u->getAllUsagesInfoOfSubtrees($cskill_ids); } else { - $this->ilias->raiseError("Skill Deletion - type mismatch.", $this->ilias->error_obj->MESSAGE); + $tpl->setOnScreenMessage("failure", "Skill Deletion - type mismatch.", true); + $ilCtrl->redirectByClass("ilskilltreeadmingui", "listTrees"); } if (count($usages) > 0) { diff --git a/Services/Skill/Tree/class.ilSkillTemplateTreeExplorerGUI.php b/Services/Skill/Tree/class.ilSkillTemplateTreeExplorerGUI.php index 1b0a466b7b95..d6486701334a 100644 --- a/Services/Skill/Tree/class.ilSkillTemplateTreeExplorerGUI.php +++ b/Services/Skill/Tree/class.ilSkillTemplateTreeExplorerGUI.php @@ -157,7 +157,7 @@ public function getNodeHref($a_node): string $ilCtrl->setParameterByClass("ilskillrootgui", "node_id", $a_node["child"]); $ret = $ilCtrl->getLinkTargetByClass(["ilAdministrationGUI", "ilObjSkillManagementGUI", - "SkillTreeAdminGUI", + "ilSkillTreeAdminGUI", "ilObjSkillTreeGUI", "ilskillrootgui" ], "listTemplates"); @@ -169,7 +169,7 @@ public function getNodeHref($a_node): string $ilCtrl->setParameterByClass("ilbasicskilltemplategui", "node_id", $a_node["child"]); $ret = $ilCtrl->getLinkTargetByClass(["ilAdministrationGUI", "ilObjSkillManagementGUI", - "SkillTreeAdminGUI", + "ilSkillTreeAdminGUI", "ilObjSkillTreeGUI", "ilbasicskilltemplategui" ], "edit"); @@ -181,7 +181,7 @@ public function getNodeHref($a_node): string $ilCtrl->setParameterByClass("ilskilltemplatecategorygui", "node_id", $a_node["child"]); $ret = $ilCtrl->getLinkTargetByClass(["ilAdministrationGUI", "ilObjSkillManagementGUI", - "SkillTreeAdminGUI", + "ilSkillTreeAdminGUI", "ilObjSkillTreeGUI", "ilskilltemplatecategorygui" ], "listItems"); diff --git a/Services/Skill/Tree/class.SkillTreeAdminGUI.php b/Services/Skill/Tree/class.ilSkillTreeAdminGUI.php similarity index 97% rename from Services/Skill/Tree/class.SkillTreeAdminGUI.php rename to Services/Skill/Tree/class.ilSkillTreeAdminGUI.php index ec141ae01933..19da76f30cf9 100644 --- a/Services/Skill/Tree/class.SkillTreeAdminGUI.php +++ b/Services/Skill/Tree/class.ilSkillTreeAdminGUI.php @@ -32,9 +32,9 @@ * Skill tree administration * * @author Alexander Killing - * @ilCtrl_Calls SkillTreeAdminGUI: ilObjSkillTreeGUI + * @ilCtrl_Calls ilSkillTreeAdminGUI: ilObjSkillTreeGUI */ -class SkillTreeAdminGUI +class ilSkillTreeAdminGUI { protected ilCtrl $ctrl; protected ilGlobalTemplateInterface $main_tpl; diff --git a/Services/Skill/Tree/class.ilSkillTreeExplorerGUI.php b/Services/Skill/Tree/class.ilSkillTreeExplorerGUI.php index 45bc90a70a6e..cfeb7403d6bb 100644 --- a/Services/Skill/Tree/class.ilSkillTreeExplorerGUI.php +++ b/Services/Skill/Tree/class.ilSkillTreeExplorerGUI.php @@ -190,7 +190,7 @@ public function getNodeHref($a_node): string $ilCtrl->setParameterByClass($gui_class, "tref_id", $tref_id); $ilCtrl->setParameterByClass($gui_class, "node_id", $skill_id); $ret = $ilCtrl->getLinkTargetByClass(["ilAdministrationGUI", "ilObjSkillManagementGUI", - "SkillTreeAdminGUI", "ilObjSkillTreeGUI", $gui_class], $cmd); + "ilSkillTreeAdminGUI", "ilObjSkillTreeGUI", $gui_class], $cmd); $ilCtrl->setParameterByClass($gui_class, "node_id", $this->requested_skill_node_id); $ilCtrl->setParameterByClass($gui_class, "tref_id", $this->requested_tref_id); diff --git a/Services/Skill/classes/class.ilObjSkillManagementGUI.php b/Services/Skill/classes/class.ilObjSkillManagementGUI.php index 65f3a8c1d690..0a1f6e9490a4 100644 --- a/Services/Skill/classes/class.ilObjSkillManagementGUI.php +++ b/Services/Skill/classes/class.ilObjSkillManagementGUI.php @@ -29,7 +29,7 @@ * Skill management main GUI class * * @author Alex Killing - * @ilCtrl_Calls ilObjSkillManagementGUI: ilPermissionGUI, SkillTreeAdminGUI + * @ilCtrl_Calls ilObjSkillManagementGUI: ilPermissionGUI, ilSkillTreeAdminGUI * @ilCtrl_isCalledBy ilObjSkillManagementGUI: ilAdministrationGUI */ class ilObjSkillManagementGUI extends ilObjectGUI @@ -126,10 +126,10 @@ public function executeCommand(): void } switch ($next_class) { - case "skilltreeadmingui": + case "ilskilltreeadmingui": $this->prepareOutput(); $ilTabs->activateTab("skill_trees"); - $gui = new SkillTreeAdminGUI($this->skill_manager); + $gui = new ilSkillTreeAdminGUI($this->skill_manager); $this->ctrl->forwardCommand($gui); break; @@ -165,7 +165,7 @@ public function getAdminTabs(): void $this->tabs_gui->addTab( "skill_trees", $lng->txt("skmg_skill_trees"), - $this->ctrl->getLinkTargetByClass("skilltreeadmingui", "") + $this->ctrl->getLinkTargetByClass("ilskilltreeadmingui", "") ); $this->tabs_gui->addTab( @@ -259,7 +259,7 @@ public function editSettings(): void public function listTrees(): void { $this->ctrl->clearParameterByClass(get_class($this), "node_id"); - $this->ctrl->redirectByClass("skilltreeadmingui", "listTrees"); + $this->ctrl->redirectByClass("ilskilltreeadmingui", "listTrees"); } public function saveAllTitles(bool $a_succ_mess = true): void From 43ee29c6b079444700fadf3eedaa41886a0fd5bb Mon Sep 17 00:00:00 2001 From: Timon Amstutz Date: Wed, 3 Jan 2024 15:32:34 +0100 Subject: [PATCH 302/497] UI Component fix of #37834 --- .../System/classes/Overview/class.ilSystemStylesTableGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Style/System/classes/Overview/class.ilSystemStylesTableGUI.php b/Services/Style/System/classes/Overview/class.ilSystemStylesTableGUI.php index ef798f83a078..d9b9b12d2b22 100644 --- a/Services/Style/System/classes/Overview/class.ilSystemStylesTableGUI.php +++ b/Services/Style/System/classes/Overview/class.ilSystemStylesTableGUI.php @@ -116,7 +116,7 @@ protected function fillRow(array $a_set): void $this->tpl->setVariable('STYLE_NAME', $a_set['style_name']); $this->tpl->setVariable('SKIN_NAME', $a_set['skin_name']); - $is_substyle = $a_set['substyle_of'] != ''; + $is_substyle = isset($a_set['substyle_of']) && $a_set['substyle_of'] != ''; if (!$is_substyle) { $this->tpl->setVariable('USERS', $a_set['users']); From b1fe2295508bd5037acd4018f9566ae020111e7a Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Wed, 3 Jan 2024 16:48:26 +0100 Subject: [PATCH 303/497] Improved German labels --- lang/ilias_de.lang | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index d19d4a09d296..2c506fdb98a0 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -4210,7 +4210,7 @@ common#:#grp_deleted_export_files#:#Die ausgewählte Datei wurde gelöscht. common#:#grp_dismiss_member#:#Sie möchten folgende Mitglieder aus der Gruppe austragen? common#:#grp_dismiss_myself#:#Sind Sie sicher, dass Sie die Mitgliedschaft in dieser Gruppe beenden möchten? common#:#grp_edit#:#Einstellungen der Gruppe -common#:#grp_err_administrator_required#:#Gruppenmitglied wurde nicht entfernt, es wird mindestens ein Administrator pro Gruppe benötigt. +common#:#grp_err_administrator_required#:#Gruppenmitglied wurde nicht entfernt. Es wird mindestens ein Administrator pro Gruppe benötigt. common#:#grp_header_edit_members#:#Mitglieder bearbeiten common#:#grp_list_members#:#Teilnehmer auflisten common#:#grp_list_reg#:#Beitritt @@ -4226,10 +4226,10 @@ common#:#grp_mem_send_mail#:#Mitglied eine Mail senden common#:#grp_members_gallery#:#Mitgliedergalerie 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 +common#:#grp_msg_membership_annulled#:#Die Mitgliedschaft wurde aufgehoben. common#:#grp_new#:#Neue Gruppe anlegen -common#:#grp_registration#:#Zur Gruppe beitreten -common#:#grp_registration_completed#:#Sie sind zur Gruppe beigetreten +common#:#grp_registration#:#Der Gruppe beitreten +common#:#grp_registration_completed#:#Sie sind der Gruppe beigetreten. common#:#grp_removed_from_waiting_list#:#Sie wurden aus der Warteliste der Gruppe "%s" ausgetragen. common#:#grp_select_one_file#:#Bitte wählen Sie eine Datei aus. common#:#grp_wizard_page#:#Gruppe kopieren (Schritt 2/2) From 4dc2fd2b8a6734dad9ff18187003f0339061cdf5 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 4 Jan 2024 09:54:49 +0100 Subject: [PATCH 304/497] Poll: add link action (39730) --- Services/Block/classes/class.ilBlockGUI.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Services/Block/classes/class.ilBlockGUI.php b/Services/Block/classes/class.ilBlockGUI.php index 643dad65a7ee..fc344a581b6e 100644 --- a/Services/Block/classes/class.ilBlockGUI.php +++ b/Services/Block/classes/class.ilBlockGUI.php @@ -821,6 +821,12 @@ protected function addRepoCommands(): void $lng->txt("delete") ); + $this->addBlockCommand( + "ilias.php?baseClass=ilRepositoryGUI&ref_id=" . $this->requested_ref_id . "&cmd=link" . + "&item_ref_id=" . $this->getRefId(), + $lng->txt("link") + ); + // see ilObjectListGUI::insertCutCommand(); $this->addBlockCommand( "ilias.php?baseClass=ilRepositoryGUI&ref_id=" . $this->requested_ref_id . "&cmd=cut" . From 35457cf613a717d750f7d4542f16f5adaf490927 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Fri, 22 Dec 2023 12:20:20 +0100 Subject: [PATCH 305/497] PRG: 39639, status of course is not relayed to PRG --- .../StudyProgramme/classes/class.ilObjStudyProgramme.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php b/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php index 598dd43653af..77d2b5207f75 100644 --- a/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php +++ b/Modules/StudyProgramme/classes/class.ilObjStudyProgramme.php @@ -1498,14 +1498,6 @@ public static function setProgressesCompletedFor(int $obj_id, int $user_id): voi // We only use courses via crs_refs $type = ilObject::_lookupType($obj_id); if ($type === "crsr") { - require_once("Services/ContainerReference/classes/class.ilContainerReference.php"); - $crs_reference_obj_ids = ilContainerReference::_lookupSourceIds($obj_id); - foreach ($crs_reference_obj_ids as $crs_reference_obj_id) { - foreach (ilObject::_getAllReferences($crs_reference_obj_id) as $ref_id) { - self::setProgressesCompletedIfParentIsProgrammeInLPCompletedMode($ref_id, $crs_reference_obj_id, $user_id); - } - } - } else { foreach (ilObject::_getAllReferences($obj_id) as $ref_id) { self::setProgressesCompletedIfParentIsProgrammeInLPCompletedMode($ref_id, $obj_id, $user_id); } From 70b6048237cf4a990119948778da733a60184ea4 Mon Sep 17 00:00:00 2001 From: Luka Stocker Date: Thu, 4 Jan 2024 09:38:34 +0100 Subject: [PATCH 306/497] IASS: adjust language variable for 'iass_finalize_info'. (#39423) https://mantis.ilias.de/view.php?id=39423 --- 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 2c506fdb98a0..e408759e8ed3 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -10064,7 +10064,7 @@ iass#:#iass_filter_finalized#:#Nur bestandene iass#:#iass_filter_not_finalized#:#Nur nicht abgeschlossene iass#:#iass_filter_not_started#:#Nur nicht bewertete iass#:#iass_finalize#:#Abschließen -iass#:#iass_finalize_info#:#Die Individuellen Bewertung wird abgeschlossen. +iass#:#iass_finalize_info#:#Die Individuelle Bewertung wird abgeschlossen. iass#:#iass_finalize_user_qst#:#Soll die Bewertung des Teilnehmers wirklich final abgeschlossen werden? Änderungen an der Bewertung sind hinterher nicht mehr möglich. iass#:#iass_further_field_headline#:#Detaillierte Informationen iass#:#iass_graded_by#:#Bewertet von From 39fd5ac7854f44e5c4b86a01bcb428c979928ffe Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 4 Jan 2024 13:46:56 +0100 Subject: [PATCH 307/497] RBAC: Fix Language Retrieved to Early See: https://mantis.ilias.de/view.php?id=39622 --- .../AccessControl/classes/class.ilAccess.php | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/Services/AccessControl/classes/class.ilAccess.php b/Services/AccessControl/classes/class.ilAccess.php index 3ed55d0002c4..312082e022ea 100644 --- a/Services/AccessControl/classes/class.ilAccess.php +++ b/Services/AccessControl/classes/class.ilAccess.php @@ -55,22 +55,20 @@ class ilAccess implements ilAccessHandler protected ilLogger $ac_logger; protected ilDBInterface $db; protected ilTree $repositoryTree; - protected ilLanguage $language; protected ilObjectDefinition $objDefinition; + protected ?ilLanguage $language = null; + public function __construct() { global $DIC; - $rbacsystem = $DIC->rbac()->system(); - $this->user = $DIC->user(); $this->db = $DIC->database(); - $this->rbacsystem = $rbacsystem; + $this->rbacsystem = $DIC['rbacsystem']; $this->results = array(); $this->current_info = new ilAccessInfo(); $this->repositoryTree = $DIC->repositoryTree(); - $this->language = $DIC->language(); $this->objDefinition = $DIC['objDefinition']; // use function enable to switch on/off tests (only cache is used so far) @@ -90,6 +88,16 @@ public function __construct() $this->ac_logger = ilLoggerFactory::getLogger('ac'); } + private function getLanguage(): ilLanguage + { + if ($this->language === null) { + global $DIC; + $this->language = $DIC['lng']; + } + + return $this->language; + } + /** * @inheritdoc */ @@ -249,7 +257,6 @@ public function checkAccessOfUser( global $DIC; $ilBench = $DIC['ilBench']; - $lng = $DIC['lng']; $this->setPreventCachingLastResult(false); // for external db based caches @@ -262,7 +269,7 @@ public function checkAccessOfUser( if ($cached["hit"]) { // Store access result if (!$cached["granted"]) { - $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $lng->txt("status_no_permission")); + $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $this->getLanguage()->txt("status_no_permission")); } if ($cached["prevent_db_cache"]) { $this->setPreventCachingLastResult(true); // should have been saved in previous call already @@ -295,14 +302,14 @@ public function checkAccessOfUser( // check if object is in tree and not deleted if ($a_tree_id != 1 && !$this->doTreeCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id)) { - $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $lng->txt("status_no_permission")); + $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $this->getLanguage()->txt("status_no_permission")); $this->storeAccessResult($a_permission, $a_cmd, $a_ref_id, false, $a_user_id); return false; } // rbac check for current object if (!$this->doRBACCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id, $a_type)) { - $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $lng->txt("status_no_permission")); + $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $this->getLanguage()->txt("status_no_permission")); $this->storeAccessResult($a_permission, $a_cmd, $a_ref_id, false, $a_user_id); return false; } @@ -318,7 +325,7 @@ public function checkAccessOfUser( ); if (!$act_check) { - $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $lng->txt('status_no_permission')); + $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $this->getLanguage()->txt('status_no_permission')); $this->storeAccessResult($a_permission, $a_cmd, $a_ref_id, false, $a_user_id); return false; } @@ -326,14 +333,14 @@ public function checkAccessOfUser( // check read permission for all parents $par_check = $this->doPathCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id); if (!$par_check) { - $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $lng->txt("status_no_permission")); + $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $this->getLanguage()->txt("status_no_permission")); $this->storeAccessResult($a_permission, $a_cmd, $a_ref_id, false, $a_user_id); return false; } // condition check (currently only implemented for read permission) if (!$this->doConditionCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id, $a_obj_id, $a_type)) { - $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $lng->txt("status_no_permission")); + $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $this->getLanguage()->txt("status_no_permission")); $this->storeAccessResult($a_permission, $a_cmd, $a_ref_id, false, $a_user_id); $this->setPreventCachingLastResult(true); // do not store this in db, since condition updates are not monitored return false; @@ -341,7 +348,7 @@ public function checkAccessOfUser( // object type specific check if (!$this->doStatusCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id, $a_obj_id, $a_type)) { - $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $lng->txt("status_no_permission")); + $this->current_info->addInfoItem(ilAccessInfo::IL_NO_PERMISSION, $this->getLanguage()->txt("status_no_permission")); $this->storeAccessResult($a_permission, $a_cmd, $a_ref_id, false, $a_user_id); $this->setPreventCachingLastResult(true); // do not store this in db, since status updates are not monitored return false; @@ -420,7 +427,7 @@ public function doTreeCheck(string $a_permission, string $a_cmd, int $a_ref_id, if (!$this->obj_tree_cache[$tree_cache_key]) { $this->current_info->addInfoItem( ilAccessInfo::IL_NO_PERMISSION, - $this->language->txt("status_no_permission") + $this->getLanguage()->txt("status_no_permission") ); } $this->storeAccessResult( @@ -443,7 +450,7 @@ public function doTreeCheck(string $a_permission, string $a_cmd, int $a_ref_id, } // Store in result cache - $this->current_info->addInfoItem(ilAccessInfo::IL_DELETED, $this->language->txt("object_deleted")); + $this->current_info->addInfoItem(ilAccessInfo::IL_DELETED, $this->getLanguage()->txt("object_deleted")); $this->storeAccessResult($a_permission, $a_cmd, $a_ref_id, false, $a_user_id); return false; } @@ -493,7 +500,7 @@ public function doRBACCheck( if (!$access) { $this->current_info->addInfoItem( ilAccessInfo::IL_NO_PERMISSION, - $this->language->txt("status_no_permission") + $this->getLanguage()->txt("status_no_permission") ); } if ($a_permission != "create") { @@ -521,7 +528,7 @@ public function doPathCheck( if ($access == false) { $this->current_info->addInfoItem( ilAccessInfo::IL_NO_PARENT_ACCESS, - $this->language->txt("no_parent_access"), + $this->getLanguage()->txt("no_parent_access"), (string) $id ); if ($a_all == false) { @@ -638,9 +645,9 @@ public function doConditionCheck( foreach ($conditions as $condition) { $this->current_info->addInfoItem( ilAccessInfo::IL_MISSING_PRECONDITION, - $this->language->txt("missing_precondition") . ": " . + $this->getLanguage()->txt("missing_precondition") . ": " . ilObject::_lookupTitle($condition["trigger_obj_id"]) . " " . - $this->language->txt("condition_" . $condition["operator"]) . " " . + $this->getLanguage()->txt("condition_" . $condition["operator"]) . " " . $condition["value"], serialize($condition) ); @@ -657,9 +664,9 @@ public function doConditionCheck( foreach ($conditions as $condition) { $this->current_info->addInfoItem( ilAccessInfo::IL_MISSING_PRECONDITION, - $this->language->txt("missing_precondition") . ": " . + $this->getLanguage()->txt("missing_precondition") . ": " . ilObject::_lookupTitle($condition["trigger_obj_id"]) . " " . - $this->language->txt("condition_" . $condition["operator"]) . " " . + $this->getLanguage()->txt("condition_" . $condition["operator"]) . " " . $condition["value"], serialize($condition) ); From c1e8281160613587b6144ddab40e39be2566c3ad Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 7 Dec 2023 10:14:29 +0100 Subject: [PATCH 308/497] Exceptions: Fix `Plain Text` error handler This commit fixes the `Plain Text` error handler. It is broken since ILIAS overwrites the super global variables. When transforming those back to arrays for debugging/output purposes, `NULL` bytes are introduced. This breaks the HTTP response. Furthermore, this commit fixes the `ilDelegationHandler` by also returning the return value of `handle` of the current `HandlerInterface` to the caller. The same applies for the `contentType` value provided by the actual/wrapped handler. --- .../classes/class.ilDelegatingHandler.php | 31 ++++++++++---- .../classes/class.ilPlainTextHandler.php | 40 +++++-------------- .../classes/class.ilTestingHandler.php | 21 +++------- 3 files changed, 38 insertions(+), 54 deletions(-) diff --git a/Services/Exceptions/classes/class.ilDelegatingHandler.php b/Services/Exceptions/classes/class.ilDelegatingHandler.php index abae3e1f81c0..2ef32e84c398 100644 --- a/Services/Exceptions/classes/class.ilDelegatingHandler.php +++ b/Services/Exceptions/classes/class.ilDelegatingHandler.php @@ -1,7 +1,5 @@ hideSensitiveData($_SERVER); - $handler = $this->error_handling->getHandler(); - $handler->setRun($this->getRun()); - $handler->setException($this->getException()); - $handler->setInspector($this->getInspector()); - $handler->handle(); - return null; + $this->current_handler = $this->error_handling->getHandler(); + $this->current_handler->setRun($this->getRun()); + $this->current_handler->setException($this->getException()); + $this->current_handler->setInspector($this->getInspector()); + return $this->current_handler->handle(); + } + + /** + * This is an implicit interface method of the Whoops handlers + * @see: \Whoops\Run::handleException + */ + public function contentType(): ?string + { + if ($this->current_handler === null || + !method_exists($this->current_handler, 'contentType')) { + return null; + } + + return $this->current_handler->contentType(); } } diff --git a/Services/Exceptions/classes/class.ilPlainTextHandler.php b/Services/Exceptions/classes/class.ilPlainTextHandler.php index 2aa37fb34650..af2f65b6fff6 100644 --- a/Services/Exceptions/classes/class.ilPlainTextHandler.php +++ b/Services/Exceptions/classes/class.ilPlainTextHandler.php @@ -1,7 +1,5 @@ */ -class ilPlainTextHandler extends Handler +class ilPlainTextHandler extends \Whoops\Handler\PlainTextHandler { protected const KEY_SPACE = 25; - /** - * Last missing method from HandlerInterface. - */ - public function handle(): ?int + private function stripNullBytes(string $ret): string { - header("Content-Type: text/plain"); - echo "
\n";
-        echo $this->content();
-        echo "
\n"; - return null; + return str_replace("\0", '', $ret); } - /** - * Assemble the output for this handler. - */ - protected function content(): string + public function generateResponse(): string { - return $this->pageHeader() - . $this->exceptionContent() - . $this->tablesContent(); - } - - /** - * Get the header for the page. - */ - protected function pageHeader(): string - { - return ""; + return $this->getExceptionOutput() . $this->tablesContent() . "\n"; } /** * Get a short info about the exception. */ - protected function exceptionContent(): string + protected function getExceptionOutput(): string { return Formatter::formatExceptionPlain($this->getInspector()); } @@ -104,7 +83,8 @@ static function ($line) use (&$first, $indentation): string { $ret .= "empty\n"; } } - return $ret; + + return $this->stripNullBytes($ret); } /** diff --git a/Services/Exceptions/classes/class.ilTestingHandler.php b/Services/Exceptions/classes/class.ilTestingHandler.php index d427edf33888..bd5b969c52ea 100644 --- a/Services/Exceptions/classes/class.ilTestingHandler.php +++ b/Services/Exceptions/classes/class.ilTestingHandler.php @@ -1,7 +1,5 @@ pageHeader() - . $this->exceptionContent(); + return "DEAR TESTER! AN ERROR OCCURRED... PLEASE INCLUDE THE FOLLOWING OUTPUT AS ADDITIONAL INFORMATION IN YOUR BUG REPORT.\n\n" + . $this->getExceptionOutput(); } } From d1daf3dfedcab46bcd4f1663d6bc3e7458dfafee Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Wed, 20 Dec 2023 11:48:44 +0100 Subject: [PATCH 309/497] Orgu: 36658, tolerate deleted users and mark inactive --- ...OrgUnitRecursiveUserAssignmentTableGUI.php | 30 +++++++++++++---- .../class.ilOrgUnitUserAssignmentTableGUI.php | 33 +++++++++++++------ .../templates/default/tpl.staff_row.html | 6 ++++ 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitRecursiveUserAssignmentTableGUI.php b/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitRecursiveUserAssignmentTableGUI.php index c1fb31068dae..e1822d5c88e9 100644 --- a/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitRecursiveUserAssignmentTableGUI.php +++ b/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitRecursiveUserAssignmentTableGUI.php @@ -105,17 +105,29 @@ public function loadData(): array foreach ($orgu_tree->getAssignements($ref_id, $this->ilOrgUnitPosition) as $usr_id) { $usr_id = (int) $usr_id; if (!array_key_exists($usr_id, $data)) { - $user = new ilObjUser($usr_id); - $set["login"] = $user->getLogin(); - $set["first_name"] = $user->getFirstname(); - $set["last_name"] = $user->getLastname(); - $set["user_id"] = $usr_id; - $set["orgu_assignments"] = []; - $set['view_lp'] = false; + $set = [ + 'login' => " - ", + 'first_name' => '', + 'last_name' => '', + 'user_id' => $usr_id, + 'active' => false, + 'orgu_assignments' => [], + 'view_lp' => false + ]; + if(\ilObjUser::_lookupLogin($usr_id) !== '') { + $user = new ilObjUser($usr_id); + $set["login"] = $user->getLogin(); + $set["first_name"] = $user->getFirstname(); + $set["last_name"] = $user->getLastname(); + $set["active"] = $user->getActive(); + } $data[$usr_id] = $set; } $data[$usr_id]['orgu_assignments'][] = ilObject::_lookupTitle(ilObject::_lookupObjId($ref_id)); $data[$usr_id]['view_lp'] = $permission_view_lp || $data[$usr_id]['view_lp']; + if(! array_key_exists('active', $data[$usr_id])) { + $data[$usr_id]["active"] = \ilObjUser::_lookupActive($usr_id); + } } } @@ -159,6 +171,10 @@ public function fillRow(array $a_set): void $this->tpl->setVariable("LOGIN", $a_set["login"]); $this->tpl->setVariable("FIRST_NAME", $a_set["first_name"]); $this->tpl->setVariable("LAST_NAME", $a_set["last_name"]); + if($a_set["active"] === false) { + $this->tpl->setVariable("INACTIVE", $this->lng->txt('usr_account_inactive')); + } + $orgus = $a_set['orgu_assignments']; sort($orgus); $this->tpl->setVariable("ORG_UNITS", implode(',', $orgus)); diff --git a/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentTableGUI.php b/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentTableGUI.php index 6a6e8c2a4883..fe1020d40c38 100644 --- a/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentTableGUI.php +++ b/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentTableGUI.php @@ -70,7 +70,7 @@ public function parseData(): void */ private function parseRows(array $user_ids): array { - $data = array(); + $data = []; foreach ($user_ids as $user_id) { $data[] = $this->getRowForUser($user_id); } @@ -79,13 +79,23 @@ private function parseRows(array $user_ids): array private function getRowForUser(int $user_id): array { - $user = new ilObjUser($user_id); - $set = []; - $set["login"] = $user->getLogin(); - $set["first_name"] = $user->getFirstname(); - $set["last_name"] = $user->getLastname(); - $set["user_object"] = $user; - $set["user_id"] = $user_id; + $set = [ + 'login' => " - ", + 'first_name' => '', + 'last_name' => '', + 'user_object' => null, + 'user_id' => $user_id, + 'active' => false, + ]; + if(\ilObjUser::_lookupLogin($user_id) !== '') { + $user = new ilObjUser($user_id); + $set["login"] = $user->getLogin(); + $set["first_name"] = $user->getFirstname(); + $set["last_name"] = $user->getLastname(); + $set["user_object"] = $user; + $set["active"] = $user->getActive(); + } + return $set; } @@ -98,8 +108,11 @@ public function fillRow(array $a_set): void $this->tpl->setVariable("LOGIN", $a_set["login"]); $this->tpl->setVariable("FIRST_NAME", $a_set["first_name"]); $this->tpl->setVariable("LAST_NAME", $a_set["last_name"]); - // $this->ctrl->setParameterByClass(ilLearningProgressGUI::class, "obj_id", $set["user_id"]); - // $this->ctrl->setParameterByClass(ilObjOrgUnitGUI::class, "obj_id", $set["user_id"]); + + if($a_set["active"] === false) { + $this->tpl->setVariable("INACTIVE", $this->lng->txt('usr_account_inactive')); + } + $this->ctrl->setParameterByClass(ilOrgUnitUserAssignmentGUI::class, 'usr_id', $a_set["user_id"]); $this->ctrl->setParameterByClass( ilOrgUnitUserAssignmentGUI::class, diff --git a/Modules/OrgUnit/templates/default/tpl.staff_row.html b/Modules/OrgUnit/templates/default/tpl.staff_row.html index 90aa2f426b37..e678699fb92e 100644 --- a/Modules/OrgUnit/templates/default/tpl.staff_row.html +++ b/Modules/OrgUnit/templates/default/tpl.staff_row.html @@ -2,6 +2,12 @@ {LOGIN} + +
+ + {INACTIVE} + + From 0f33770fa8cb820ddfde499cb9f49d11045975e6 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Thu, 4 Jan 2024 16:32:18 +0100 Subject: [PATCH 310/497] Orgu: 36658, add objective to remove assignments of delete users --- ...OrgUnitRecursiveUserAssignmentTableGUI.php | 21 ++--- .../class.ilOrgUnitUserAssignmentTableGUI.php | 23 ++---- ...nitOperationContextRegisteredObjective.php | 4 +- ....ilOrgUnitOperationRegisteredObjective.php | 4 +- ...s.ilOrgUnitRemoveDeletedUsersObjective.php | 68 ++++++++++++++++ .../Setup/class.ilOrgUnitSetupAgent.php | 78 +++++++++++++++++++ 6 files changed, 164 insertions(+), 34 deletions(-) create mode 100644 Modules/OrgUnit/classes/Setup/class.ilOrgUnitRemoveDeletedUsersObjective.php create mode 100644 Modules/OrgUnit/classes/Setup/class.ilOrgUnitSetupAgent.php diff --git a/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitRecursiveUserAssignmentTableGUI.php b/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitRecursiveUserAssignmentTableGUI.php index e1822d5c88e9..9907b708fb92 100644 --- a/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitRecursiveUserAssignmentTableGUI.php +++ b/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitRecursiveUserAssignmentTableGUI.php @@ -105,29 +105,22 @@ public function loadData(): array foreach ($orgu_tree->getAssignements($ref_id, $this->ilOrgUnitPosition) as $usr_id) { $usr_id = (int) $usr_id; if (!array_key_exists($usr_id, $data)) { + $user = new ilObjUser($usr_id); $set = [ - 'login' => " - ", - 'first_name' => '', - 'last_name' => '', + 'login' => $user->getLogin(), + 'first_name' => $user->getFirstname(), + 'last_name' => $user->getLastname(), 'user_id' => $usr_id, - 'active' => false, + 'active' => $user->getActive(), 'orgu_assignments' => [], 'view_lp' => false ]; - if(\ilObjUser::_lookupLogin($usr_id) !== '') { - $user = new ilObjUser($usr_id); - $set["login"] = $user->getLogin(); - $set["first_name"] = $user->getFirstname(); - $set["last_name"] = $user->getLastname(); - $set["active"] = $user->getActive(); - } $data[$usr_id] = $set; + } else { + $data[$usr_id]["active"] = \ilObjUser::_lookupActive($usr_id); } $data[$usr_id]['orgu_assignments'][] = ilObject::_lookupTitle(ilObject::_lookupObjId($ref_id)); $data[$usr_id]['view_lp'] = $permission_view_lp || $data[$usr_id]['view_lp']; - if(! array_key_exists('active', $data[$usr_id])) { - $data[$usr_id]["active"] = \ilObjUser::_lookupActive($usr_id); - } } } diff --git a/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentTableGUI.php b/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentTableGUI.php index fe1020d40c38..9236b3375fe9 100644 --- a/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentTableGUI.php +++ b/Modules/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentTableGUI.php @@ -79,24 +79,15 @@ private function parseRows(array $user_ids): array private function getRowForUser(int $user_id): array { - $set = [ - 'login' => " - ", - 'first_name' => '', - 'last_name' => '', - 'user_object' => null, + $user = new ilObjUser($user_id); + return [ + 'login' => $user->getLogin(), + 'first_name' => $user->getFirstname(), + 'last_name' => $user->getLastname(), + 'user_object' => $user, 'user_id' => $user_id, - 'active' => false, + 'active' => $user->getActive() ]; - if(\ilObjUser::_lookupLogin($user_id) !== '') { - $user = new ilObjUser($user_id); - $set["login"] = $user->getLogin(); - $set["first_name"] = $user->getFirstname(); - $set["last_name"] = $user->getLastname(); - $set["user_object"] = $user; - $set["active"] = $user->getActive(); - } - - return $set; } public function fillRow(array $a_set): void diff --git a/Modules/OrgUnit/classes/Setup/class.ilOrgUnitOperationContextRegisteredObjective.php b/Modules/OrgUnit/classes/Setup/class.ilOrgUnitOperationContextRegisteredObjective.php index b5bdd40fcbfe..52cef8caa244 100644 --- a/Modules/OrgUnit/classes/Setup/class.ilOrgUnitOperationContextRegisteredObjective.php +++ b/Modules/OrgUnit/classes/Setup/class.ilOrgUnitOperationContextRegisteredObjective.php @@ -1,7 +1,5 @@ getResource(Environment::RESOURCE_DATABASE); + $query = 'DELETE FROM il_orgu_ua' . PHP_EOL + . 'WHERE user_id NOT IN (' . PHP_EOL + . 'SELECT usr_id FROM usr_data' . PHP_EOL + . ')'; + $db->manipulate($query); + return $environment; + } + + public function isApplicable(Environment $environment): bool + { + return true; + } +} diff --git a/Modules/OrgUnit/classes/Setup/class.ilOrgUnitSetupAgent.php b/Modules/OrgUnit/classes/Setup/class.ilOrgUnitSetupAgent.php new file mode 100644 index 000000000000..28b67359563e --- /dev/null +++ b/Modules/OrgUnit/classes/Setup/class.ilOrgUnitSetupAgent.php @@ -0,0 +1,78 @@ +refinery = $refinery; + } + + public function hasConfig(): bool + { + return false; + } + + public function getArrayToConfigTransformation(): Refinery\Transformation + { + throw new LogicException("Agent has no config"); + } + + public function getInstallObjective(Setup\Config $config = null): Setup\Objective + { + return new Setup\Objective\NullObjective(); + } + + public function getUpdateObjective(Setup\Config $config = null): Setup\Objective + { + return new Setup\Objective\NullObjective(); + } + + public function getBuildArtifactObjective(): Setup\Objective + { + return new Setup\Objective\NullObjective(); + } + + public function getStatusObjective(Setup\Metrics\Storage $storage): Setup\Objective + { + return new Setup\Objective\NullObjective(); + } + + public function getMigrations(): array + { + return []; + } + + public function getNamedObjectives(?Setup\Config $config = null): array + { + return [ + 'removeDeletedUsersFromOrgUnits' => new Setup\ObjectiveConstructor( + 'clean assignments of deleted users', + static fn(): Setup\Objective => new ilOrgUnitRemoveDeletedUsersObjective() + ) + ]; + } +} From 828fdad633d1ac9a46a4df565fd53f1d5848e5a4 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Fri, 1 Dec 2023 11:23:03 +0100 Subject: [PATCH 311/497] Maps: 38720, rollup as iife --- Services/Maps/js/dist/ServiceOpenLayers.js | 21575 +--------------- Services/Maps/js/rollup.config.js | 56 +- Services/Maps/js/src/ServiceOpenLayers.js | 458 +- Services/Maps/js/src/ilOl.js | 23 +- .../templates/default/tpl.openlayers_map.js | 69 +- 5 files changed, 363 insertions(+), 21818 deletions(-) diff --git a/Services/Maps/js/dist/ServiceOpenLayers.js b/Services/Maps/js/dist/ServiceOpenLayers.js index ac8b11cd78cd..a06e941175fe 100644 --- a/Services/Maps/js/dist/ServiceOpenLayers.js +++ b/Services/Maps/js/dist/ServiceOpenLayers.js @@ -1,21559 +1,18 @@ /** - * @module ol/events/Event - */ -/** - * @classdesc - * Stripped down implementation of the W3C DOM Level 2 Event interface. - * See https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-interface. - * - * This implementation only provides `type` and `target` properties, and - * `stopPropagation` and `preventDefault` methods. It is meant as base class - * for higher level events defined in the library, and works with - * {@link module:ol/events/Target~Target}. - */ -var BaseEvent = /** @class */ (function () { - /** - * @param {string} type Type. - */ - function BaseEvent(type) { - /** - * @type {boolean} - */ - this.propagationStopped; - /** - * The event type. - * @type {string} - * @api - */ - this.type = type; - /** - * The event target. - * @type {Object} - * @api - */ - this.target = null; - } - /** - * Stop event propagation. - * @api - */ - BaseEvent.prototype.preventDefault = function () { - this.propagationStopped = true; - }; - /** - * Stop event propagation. - * @api - */ - BaseEvent.prototype.stopPropagation = function () { - this.propagationStopped = true; - }; - return BaseEvent; -}()); - -/** - * @module ol/ObjectEventType - */ -/** - * @enum {string} - */ -var ObjectEventType = { - /** - * Triggered when a property is changed. - * @event module:ol/Object.ObjectEvent#propertychange - * @api - */ - PROPERTYCHANGE: 'propertychange', -}; - -/** - * @module ol/Disposable - */ -/** - * @classdesc - * Objects that need to clean up after themselves. - */ -var Disposable = /** @class */ (function () { - function Disposable() { - /** - * The object has already been disposed. - * @type {boolean} - * @protected - */ - this.disposed = false; - } - /** - * Clean up. - */ - Disposable.prototype.dispose = function () { - if (!this.disposed) { - this.disposed = true; - this.disposeInternal(); - } - }; - /** - * Extension point for disposable objects. - * @protected - */ - Disposable.prototype.disposeInternal = function () { }; - return Disposable; -}()); - -/** - * @module ol/array - */ -/** - * Compare function for array sort that is safe for numbers. - * @param {*} a The first object to be compared. - * @param {*} b The second object to be compared. - * @return {number} A negative number, zero, or a positive number as the first - * argument is less than, equal to, or greater than the second. - */ -function numberSafeCompareFunction(a, b) { - return a > b ? 1 : a < b ? -1 : 0; -} -/** - * @param {Array} arr Array. - * @param {number} target Target. - * @param {number} direction 0 means return the nearest, > 0 - * means return the largest nearest, < 0 means return the - * smallest nearest. - * @return {number} Index. - */ -function linearFindNearest(arr, target, direction) { - var n = arr.length; - if (arr[0] <= target) { - return 0; - } - else if (target <= arr[n - 1]) { - return n - 1; - } - else { - var i = void 0; - if (direction > 0) { - for (i = 1; i < n; ++i) { - if (arr[i] < target) { - return i - 1; - } - } - } - else if (direction < 0) { - for (i = 1; i < n; ++i) { - if (arr[i] <= target) { - return i; - } - } - } - else { - for (i = 1; i < n; ++i) { - if (arr[i] == target) { - return i; - } - else if (arr[i] < target) { - if (arr[i - 1] - target < target - arr[i]) { - return i - 1; - } - else { - return i; - } - } - } - } - return n - 1; - } -} -/** - * @param {Array} arr The array to modify. - * @param {!Array|VALUE} data The elements or arrays of elements to add to arr. - * @template VALUE - */ -function extend(arr, data) { - var extension = Array.isArray(data) ? data : [data]; - var length = extension.length; - for (var i = 0; i < length; i++) { - arr[arr.length] = extension[i]; - } -} -/** - * @param {Array|Uint8ClampedArray} arr1 The first array to compare. - * @param {Array|Uint8ClampedArray} arr2 The second array to compare. - * @return {boolean} Whether the two arrays are equal. - */ -function equals(arr1, arr2) { - var len1 = arr1.length; - if (len1 !== arr2.length) { - return false; - } - for (var i = 0; i < len1; i++) { - if (arr1[i] !== arr2[i]) { - return false; - } - } - return true; -} -/** - * @param {Array<*>} arr The array to test. - * @param {Function=} opt_func Comparison function. - * @param {boolean=} opt_strict Strictly sorted (default false). - * @return {boolean} Return index. - */ -function isSorted(arr, opt_func, opt_strict) { - var compare = opt_func || numberSafeCompareFunction; - return arr.every(function (currentVal, index) { - if (index === 0) { - return true; - } - var res = compare(arr[index - 1], currentVal); - return !(res > 0 || (opt_strict && res === 0)); - }); -} - -/** - * @module ol/functions - */ -/** - * Always returns true. - * @returns {boolean} true. - */ -function TRUE() { - return true; -} -/** - * Always returns false. - * @returns {boolean} false. - */ -function FALSE() { - return false; -} -/** - * A reusable function, used e.g. as a default for callbacks. - * - * @return {void} Nothing. - */ -function VOID() { } -/** - * Wrap a function in another function that remembers the last return. If the - * returned function is called twice in a row with the same arguments and the same - * this object, it will return the value from the first call in the second call. - * - * @param {function(...any): ReturnType} fn The function to memoize. - * @return {function(...any): ReturnType} The memoized function. - * @template ReturnType - */ -function memoizeOne(fn) { - var called = false; - /** @type {ReturnType} */ - var lastResult; - /** @type {Array} */ - var lastArgs; - var lastThis; - return function () { - var nextArgs = Array.prototype.slice.call(arguments); - if (!called || this !== lastThis || !equals(nextArgs, lastArgs)) { - called = true; - lastThis = this; - lastArgs = nextArgs; - lastResult = fn.apply(this, arguments); - } - return lastResult; - }; -} - -/** - * @module ol/obj - */ -/** - * Polyfill for Object.assign(). Assigns enumerable and own properties from - * one or more source objects to a target object. - * See https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign. - * - * @param {!Object} target The target object. - * @param {...Object} var_sources The source object(s). - * @return {!Object} The modified target object. - */ -var assign = typeof Object.assign === 'function' - ? Object.assign - : function (target, var_sources) { - if (target === undefined || target === null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var output = Object(target); - for (var i = 1, ii = arguments.length; i < ii; ++i) { - var source = arguments[i]; - if (source !== undefined && source !== null) { - for (var key in source) { - if (source.hasOwnProperty(key)) { - output[key] = source[key]; - } - } - } - } - return output; - }; -/** - * Removes all properties from an object. - * @param {Object} object The object to clear. - */ -function clear(object) { - for (var property in object) { - delete object[property]; - } -} -/** - * Polyfill for Object.values(). Get an array of property values from an object. - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values - * - * @param {!Object} object The object from which to get the values. - * @return {!Array} The property values. - * @template K,V - */ -var getValues = typeof Object.values === 'function' - ? Object.values - : function (object) { - var values = []; - for (var property in object) { - values.push(object[property]); - } - return values; - }; -/** - * Determine if an object has any properties. - * @param {Object} object The object to check. - * @return {boolean} The object is empty. - */ -function isEmpty(object) { - var property; - for (property in object) { - return false; - } - return !property; -} - -var __extends = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {EventTarget|Target} EventTargetLike - */ -/** - * @classdesc - * A simplified implementation of the W3C DOM Level 2 EventTarget interface. - * See https://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-EventTarget. - * - * There are two important simplifications compared to the specification: - * - * 1. The handling of `useCapture` in `addEventListener` and - * `removeEventListener`. There is no real capture model. - * 2. The handling of `stopPropagation` and `preventDefault` on `dispatchEvent`. - * There is no event target hierarchy. When a listener calls - * `stopPropagation` or `preventDefault` on an event object, it means that no - * more listeners after this one will be called. Same as when the listener - * returns false. - */ -var Target = /** @class */ (function (_super) { - __extends(Target, _super); - /** - * @param {*=} opt_target Default event target for dispatched events. - */ - function Target(opt_target) { - var _this = _super.call(this) || this; - /** - * @private - * @type {*} - */ - _this.eventTarget_ = opt_target; - /** - * @private - * @type {Object} - */ - _this.pendingRemovals_ = null; - /** - * @private - * @type {Object} - */ - _this.dispatching_ = null; - /** - * @private - * @type {Object>} - */ - _this.listeners_ = null; - return _this; - } - /** - * @param {string} type Type. - * @param {import("../events.js").Listener} listener Listener. - */ - Target.prototype.addEventListener = function (type, listener) { - if (!type || !listener) { - return; - } - var listeners = this.listeners_ || (this.listeners_ = {}); - var listenersForType = listeners[type] || (listeners[type] = []); - if (listenersForType.indexOf(listener) === -1) { - listenersForType.push(listener); - } - }; - /** - * Dispatches an event and calls all listeners listening for events - * of this type. The event parameter can either be a string or an - * Object with a `type` property. - * - * @param {import("./Event.js").default|string} event Event object. - * @return {boolean|undefined} `false` if anyone called preventDefault on the - * event object or if any of the listeners returned false. - * @api - */ - Target.prototype.dispatchEvent = function (event) { - /** @type {import("./Event.js").default|Event} */ - var evt = typeof event === 'string' ? new BaseEvent(event) : event; - var type = evt.type; - if (!evt.target) { - evt.target = this.eventTarget_ || this; - } - var listeners = this.listeners_ && this.listeners_[type]; - var propagate; - if (listeners) { - var dispatching = this.dispatching_ || (this.dispatching_ = {}); - var pendingRemovals = this.pendingRemovals_ || (this.pendingRemovals_ = {}); - if (!(type in dispatching)) { - dispatching[type] = 0; - pendingRemovals[type] = 0; - } - ++dispatching[type]; - for (var i = 0, ii = listeners.length; i < ii; ++i) { - if ('handleEvent' in listeners[i]) { - propagate = /** @type {import("../events.js").ListenerObject} */ (listeners[i]).handleEvent(evt); - } - else { - propagate = /** @type {import("../events.js").ListenerFunction} */ (listeners[i]).call(this, evt); - } - if (propagate === false || evt.propagationStopped) { - propagate = false; - break; - } - } - --dispatching[type]; - if (dispatching[type] === 0) { - var pr = pendingRemovals[type]; - delete pendingRemovals[type]; - while (pr--) { - this.removeEventListener(type, VOID); - } - delete dispatching[type]; - } - return propagate; - } - }; - /** - * Clean up. - */ - Target.prototype.disposeInternal = function () { - this.listeners_ && clear(this.listeners_); - }; - /** - * Get the listeners for a specified event type. Listeners are returned in the - * order that they will be called in. - * - * @param {string} type Type. - * @return {Array|undefined} Listeners. - */ - Target.prototype.getListeners = function (type) { - return (this.listeners_ && this.listeners_[type]) || undefined; - }; - /** - * @param {string=} opt_type Type. If not provided, - * `true` will be returned if this event target has any listeners. - * @return {boolean} Has listeners. - */ - Target.prototype.hasListener = function (opt_type) { - if (!this.listeners_) { - return false; - } - return opt_type - ? opt_type in this.listeners_ - : Object.keys(this.listeners_).length > 0; - }; - /** - * @param {string} type Type. - * @param {import("../events.js").Listener} listener Listener. - */ - Target.prototype.removeEventListener = function (type, listener) { - var listeners = this.listeners_ && this.listeners_[type]; - if (listeners) { - var index = listeners.indexOf(listener); - if (index !== -1) { - if (this.pendingRemovals_ && type in this.pendingRemovals_) { - // make listener a no-op, and remove later in #dispatchEvent() - listeners[index] = VOID; - ++this.pendingRemovals_[type]; - } - else { - listeners.splice(index, 1); - if (listeners.length === 0) { - delete this.listeners_[type]; - } - } - } - } - }; - return Target; -}(Disposable)); - -/** - * @module ol/events/EventType - */ -/** - * @enum {string} - * @const - */ -var EventType = { - /** - * Generic change event. Triggered when the revision counter is increased. - * @event module:ol/events/Event~BaseEvent#change - * @api - */ - CHANGE: 'change', - /** - * Generic error event. Triggered when an error occurs. - * @event module:ol/events/Event~BaseEvent#error - * @api - */ - ERROR: 'error', - BLUR: 'blur', - CLEAR: 'clear', - CONTEXTMENU: 'contextmenu', - CLICK: 'click', - DBLCLICK: 'dblclick', - DRAGENTER: 'dragenter', - DRAGOVER: 'dragover', - DROP: 'drop', - FOCUS: 'focus', - KEYDOWN: 'keydown', - KEYPRESS: 'keypress', - LOAD: 'load', - RESIZE: 'resize', - TOUCHMOVE: 'touchmove', - WHEEL: 'wheel', -}; - -/** - * @module ol/events - */ -/** - * Key to use with {@link module:ol/Observable~Observable#unByKey}. - * @typedef {Object} EventsKey - * @property {ListenerFunction} listener - * @property {import("./events/Target.js").EventTargetLike} target - * @property {string} type - * @api - */ -/** - * Listener function. This function is called with an event object as argument. - * When the function returns `false`, event propagation will stop. - * - * @typedef {function((Event|import("./events/Event.js").default)): (void|boolean)} ListenerFunction - * @api - */ -/** - * @typedef {Object} ListenerObject - * @property {ListenerFunction} handleEvent - */ -/** - * @typedef {ListenerFunction|ListenerObject} Listener - */ -/** - * Registers an event listener on an event target. Inspired by - * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html - * - * This function efficiently binds a `listener` to a `this` object, and returns - * a key for use with {@link module:ol/events~unlistenByKey}. - * - * @param {import("./events/Target.js").EventTargetLike} target Event target. - * @param {string} type Event type. - * @param {ListenerFunction} listener Listener. - * @param {Object=} opt_this Object referenced by the `this` keyword in the - * listener. Default is the `target`. - * @param {boolean=} opt_once If true, add the listener as one-off listener. - * @return {EventsKey} Unique key for the listener. - */ -function listen(target, type, listener, opt_this, opt_once) { - if (opt_this && opt_this !== target) { - listener = listener.bind(opt_this); - } - if (opt_once) { - var originalListener_1 = listener; - listener = function () { - target.removeEventListener(type, listener); - originalListener_1.apply(this, arguments); - }; - } - var eventsKey = { - target: target, - type: type, - listener: listener, - }; - target.addEventListener(type, listener); - return eventsKey; -} -/** - * Registers a one-off event listener on an event target. Inspired by - * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html - * - * This function efficiently binds a `listener` as self-unregistering listener - * to a `this` object, and returns a key for use with - * {@link module:ol/events~unlistenByKey} in case the listener needs to be - * unregistered before it is called. - * - * When {@link module:ol/events~listen} is called with the same arguments after this - * function, the self-unregistering listener will be turned into a permanent - * listener. - * - * @param {import("./events/Target.js").EventTargetLike} target Event target. - * @param {string} type Event type. - * @param {ListenerFunction} listener Listener. - * @param {Object=} opt_this Object referenced by the `this` keyword in the - * listener. Default is the `target`. - * @return {EventsKey} Key for unlistenByKey. - */ -function listenOnce(target, type, listener, opt_this) { - return listen(target, type, listener, opt_this, true); -} -/** - * Unregisters event listeners on an event target. Inspired by - * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html - * - * The argument passed to this function is the key returned from - * {@link module:ol/events~listen} or {@link module:ol/events~listenOnce}. - * - * @param {EventsKey} key The key. - */ -function unlistenByKey(key) { - if (key && key.target) { - key.target.removeEventListener(key.type, key.listener); - clear(key); - } -} - -var __extends$1 = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @classdesc - * Abstract base class; normally only used for creating subclasses and not - * instantiated in apps. - * An event target providing convenient methods for listener registration - * and unregistration. A generic `change` event is always available through - * {@link module:ol/Observable~Observable#changed}. - * - * @fires import("./events/Event.js").default - * @api - */ -var Observable = /** @class */ (function (_super) { - __extends$1(Observable, _super); - function Observable() { - var _this = _super.call(this) || this; - /** - * @private - * @type {number} - */ - _this.revision_ = 0; - return _this; - } - /** - * Increases the revision counter and dispatches a 'change' event. - * @api - */ - Observable.prototype.changed = function () { - ++this.revision_; - this.dispatchEvent(EventType.CHANGE); - }; - /** - * Get the version number for this object. Each time the object is modified, - * its version number will be incremented. - * @return {number} Revision. - * @api - */ - Observable.prototype.getRevision = function () { - return this.revision_; - }; - /** - * Listen for a certain type of event. - * @param {string|Array} type The event type or array of event types. - * @param {function(?): ?} listener The listener function. - * @return {import("./events.js").EventsKey|Array} Unique key for the listener. If - * called with an array of event types as the first argument, the return - * will be an array of keys. - * @api - */ - Observable.prototype.on = function (type, listener) { - if (Array.isArray(type)) { - var len = type.length; - var keys = new Array(len); - for (var i = 0; i < len; ++i) { - keys[i] = listen(this, type[i], listener); - } - return keys; - } - else { - return listen(this, /** @type {string} */ (type), listener); - } - }; - /** - * Listen once for a certain type of event. - * @param {string|Array} type The event type or array of event types. - * @param {function(?): ?} listener The listener function. - * @return {import("./events.js").EventsKey|Array} Unique key for the listener. If - * called with an array of event types as the first argument, the return - * will be an array of keys. - * @api - */ - Observable.prototype.once = function (type, listener) { - var key; - if (Array.isArray(type)) { - var len = type.length; - key = new Array(len); - for (var i = 0; i < len; ++i) { - key[i] = listenOnce(this, type[i], listener); - } - } - else { - key = listenOnce(this, /** @type {string} */ (type), listener); - } - /** @type {Object} */ (listener).ol_key = key; - return key; - }; - /** - * Unlisten for a certain type of event. - * @param {string|Array} type The event type or array of event types. - * @param {function(?): ?} listener The listener function. - * @api - */ - Observable.prototype.un = function (type, listener) { - var key = /** @type {Object} */ (listener).ol_key; - if (key) { - unByKey(key); - } - else if (Array.isArray(type)) { - for (var i = 0, ii = type.length; i < ii; ++i) { - this.removeEventListener(type[i], listener); - } - } - else { - this.removeEventListener(type, listener); - } - }; - return Observable; -}(Target)); -/** - * Removes an event listener using the key returned by `on()` or `once()`. - * @param {import("./events.js").EventsKey|Array} key The key returned by `on()` - * or `once()` (or an array of keys). - * @api - */ -function unByKey(key) { - if (Array.isArray(key)) { - for (var i = 0, ii = key.length; i < ii; ++i) { - unlistenByKey(key[i]); - } - } - else { - unlistenByKey(/** @type {import("./events.js").EventsKey} */ (key)); - } -} - -/** - * @module ol/util - */ -/** - * @return {?} Any return. - */ -function abstract() { - return /** @type {?} */ ((function () { - throw new Error('Unimplemented abstract method.'); - })()); -} -/** - * Counter for getUid. - * @type {number} - * @private - */ -var uidCounter_ = 0; -/** - * Gets a unique ID for an object. This mutates the object so that further calls - * with the same object as a parameter returns the same value. Unique IDs are generated - * as a strictly increasing sequence. Adapted from goog.getUid. - * - * @param {Object} obj The object to get the unique ID for. - * @return {string} The unique ID for the object. - * @api - */ -function getUid(obj) { - return obj.ol_uid || (obj.ol_uid = String(++uidCounter_)); -} -/** - * OpenLayers version. - * @type {string} - */ -var VERSION = '6.5.0'; - -var __extends$2 = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @classdesc - * Events emitted by {@link module:ol/Object~BaseObject} instances are instances of this type. - */ -var ObjectEvent = /** @class */ (function (_super) { - __extends$2(ObjectEvent, _super); - /** - * @param {string} type The event type. - * @param {string} key The property name. - * @param {*} oldValue The old value for `key`. - */ - function ObjectEvent(type, key, oldValue) { - var _this = _super.call(this, type) || this; - /** - * The name of the property whose value is changing. - * @type {string} - * @api - */ - _this.key = key; - /** - * The old value. To get the new value use `e.target.get(e.key)` where - * `e` is the event object. - * @type {*} - * @api - */ - _this.oldValue = oldValue; - return _this; - } - return ObjectEvent; -}(BaseEvent)); -/** - * @classdesc - * Abstract base class; normally only used for creating subclasses and not - * instantiated in apps. - * Most non-trivial classes inherit from this. - * - * This extends {@link module:ol/Observable} with observable - * properties, where each property is observable as well as the object as a - * whole. - * - * Classes that inherit from this have pre-defined properties, to which you can - * add your owns. The pre-defined properties are listed in this documentation as - * 'Observable Properties', and have their own accessors; for example, - * {@link module:ol/Map~Map} has a `target` property, accessed with - * `getTarget()` and changed with `setTarget()`. Not all properties are however - * settable. There are also general-purpose accessors `get()` and `set()`. For - * example, `get('target')` is equivalent to `getTarget()`. - * - * The `set` accessors trigger a change event, and you can monitor this by - * registering a listener. For example, {@link module:ol/View~View} has a - * `center` property, so `view.on('change:center', function(evt) {...});` would - * call the function whenever the value of the center property changes. Within - * the function, `evt.target` would be the view, so `evt.target.getCenter()` - * would return the new center. - * - * You can add your own observable properties with - * `object.set('prop', 'value')`, and retrieve that with `object.get('prop')`. - * You can listen for changes on that property value with - * `object.on('change:prop', listener)`. You can get a list of all - * properties with {@link module:ol/Object~BaseObject#getProperties}. - * - * Note that the observable properties are separate from standard JS properties. - * You can, for example, give your map object a title with - * `map.title='New title'` and with `map.set('title', 'Another title')`. The - * first will be a `hasOwnProperty`; the second will appear in - * `getProperties()`. Only the second is observable. - * - * Properties can be deleted by using the unset method. E.g. - * object.unset('foo'). - * - * @fires ObjectEvent - * @api - */ -var BaseObject = /** @class */ (function (_super) { - __extends$2(BaseObject, _super); - /** - * @param {Object=} opt_values An object with key-value pairs. - */ - function BaseObject(opt_values) { - var _this = _super.call(this) || this; - // Call {@link module:ol/util~getUid} to ensure that the order of objects' ids is - // the same as the order in which they were created. This also helps to - // ensure that object properties are always added in the same order, which - // helps many JavaScript engines generate faster code. - getUid(_this); - /** - * @private - * @type {Object} - */ - _this.values_ = null; - if (opt_values !== undefined) { - _this.setProperties(opt_values); - } - return _this; - } - /** - * Gets a value. - * @param {string} key Key name. - * @return {*} Value. - * @api - */ - BaseObject.prototype.get = function (key) { - var value; - if (this.values_ && this.values_.hasOwnProperty(key)) { - value = this.values_[key]; - } - return value; - }; - /** - * Get a list of object property names. - * @return {Array} List of property names. - * @api - */ - BaseObject.prototype.getKeys = function () { - return (this.values_ && Object.keys(this.values_)) || []; - }; - /** - * Get an object of all property names and values. - * @return {Object} Object. - * @api - */ - BaseObject.prototype.getProperties = function () { - return (this.values_ && assign({}, this.values_)) || {}; - }; - /** - * @return {boolean} The object has properties. - */ - BaseObject.prototype.hasProperties = function () { - return !!this.values_; - }; - /** - * @param {string} key Key name. - * @param {*} oldValue Old value. - */ - BaseObject.prototype.notify = function (key, oldValue) { - var eventType; - eventType = getChangeEventType(key); - this.dispatchEvent(new ObjectEvent(eventType, key, oldValue)); - eventType = ObjectEventType.PROPERTYCHANGE; - this.dispatchEvent(new ObjectEvent(eventType, key, oldValue)); - }; - /** - * Sets a value. - * @param {string} key Key name. - * @param {*} value Value. - * @param {boolean=} opt_silent Update without triggering an event. - * @api - */ - BaseObject.prototype.set = function (key, value, opt_silent) { - var values = this.values_ || (this.values_ = {}); - if (opt_silent) { - values[key] = value; - } - else { - var oldValue = values[key]; - values[key] = value; - if (oldValue !== value) { - this.notify(key, oldValue); - } - } - }; - /** - * Sets a collection of key-value pairs. Note that this changes any existing - * properties and adds new ones (it does not remove any existing properties). - * @param {Object} values Values. - * @param {boolean=} opt_silent Update without triggering an event. - * @api - */ - BaseObject.prototype.setProperties = function (values, opt_silent) { - for (var key in values) { - this.set(key, values[key], opt_silent); - } - }; - /** - * Apply any properties from another object without triggering events. - * @param {BaseObject} source The source object. - * @protected - */ - BaseObject.prototype.applyProperties = function (source) { - if (!source.values_) { - return; - } - assign(this.values_ || (this.values_ = {}), source.values_); - }; - /** - * Unsets a property. - * @param {string} key Key name. - * @param {boolean=} opt_silent Unset without triggering an event. - * @api - */ - BaseObject.prototype.unset = function (key, opt_silent) { - if (this.values_ && key in this.values_) { - var oldValue = this.values_[key]; - delete this.values_[key]; - if (isEmpty(this.values_)) { - this.values_ = null; - } - if (!opt_silent) { - this.notify(key, oldValue); - } - } - }; - return BaseObject; -}(Observable)); -/** - * @type {Object} - */ -var changeEventTypeCache = {}; -/** - * @param {string} key Key name. - * @return {string} Change name. - */ -function getChangeEventType(key) { - return changeEventTypeCache.hasOwnProperty(key) - ? changeEventTypeCache[key] - : (changeEventTypeCache[key] = 'change:' + key); -} - -/** - * @module ol/geom/GeometryType - */ -/** - * The geometry type. One of `'Point'`, `'LineString'`, `'LinearRing'`, - * `'Polygon'`, `'MultiPoint'`, `'MultiLineString'`, `'MultiPolygon'`, - * `'GeometryCollection'`, `'Circle'`. - * @enum {string} - */ -var GeometryType = { - POINT: 'Point', - LINE_STRING: 'LineString', - LINEAR_RING: 'LinearRing', - POLYGON: 'Polygon', - MULTI_POINT: 'MultiPoint', - MULTI_LINE_STRING: 'MultiLineString', - MULTI_POLYGON: 'MultiPolygon', - GEOMETRY_COLLECTION: 'GeometryCollection', - CIRCLE: 'Circle', -}; - -/** - * @module ol/proj/Units - */ -/** - * Projection units: `'degrees'`, `'ft'`, `'m'`, `'pixels'`, `'tile-pixels'` or - * `'us-ft'`. - * @enum {string} - */ -var Units = { - /** - * Degrees - * @api - */ - DEGREES: 'degrees', - /** - * Feet - * @api - */ - FEET: 'ft', - /** - * Meters - * @api - */ - METERS: 'm', - /** - * Pixels - * @api - */ - PIXELS: 'pixels', - /** - * Tile Pixels - * @api - */ - TILE_PIXELS: 'tile-pixels', - /** - * US Feet - * @api - */ - USFEET: 'us-ft', -}; -/** - * Meters per unit lookup table. - * @const - * @type {Object} - * @api - */ -var METERS_PER_UNIT = {}; -// use the radius of the Normal sphere -METERS_PER_UNIT[Units.DEGREES] = (2 * Math.PI * 6370997) / 360; -METERS_PER_UNIT[Units.FEET] = 0.3048; -METERS_PER_UNIT[Units.METERS] = 1; -METERS_PER_UNIT[Units.USFEET] = 1200 / 3937; - -/** - * @module ol/ViewHint - */ -/** - * @enum {number} - */ -var ViewHint = { - ANIMATING: 0, - INTERACTING: 1, -}; - -/** - * @module ol/ViewProperty - */ -/** - * @enum {string} - */ -var ViewProperty = { - CENTER: 'center', - RESOLUTION: 'resolution', - ROTATION: 'rotation', -}; - -/** - * @module ol/tilegrid/common - */ -/** - * Default maximum zoom for default tile grids. - * @type {number} - */ -var DEFAULT_MAX_ZOOM = 42; -/** - * Default tile size. - * @type {number} - */ -var DEFAULT_TILE_SIZE = 256; - -/** - * @module ol/proj/Projection - */ -/** - * @typedef {Object} Options - * @property {string} code The SRS identifier code, e.g. `EPSG:4326`. - * @property {import("./Units.js").default|string} [units] Units. Required unless a - * proj4 projection is defined for `code`. - * @property {import("../extent.js").Extent} [extent] The validity extent for the SRS. - * @property {string} [axisOrientation='enu'] The axis orientation as specified in Proj4. - * @property {boolean} [global=false] Whether the projection is valid for the whole globe. - * @property {number} [metersPerUnit] The meters per unit for the SRS. - * If not provided, the `units` are used to get the meters per unit from the {@link module:ol/proj/Units~METERS_PER_UNIT} - * lookup table. - * @property {import("../extent.js").Extent} [worldExtent] The world extent for the SRS. - * @property {function(number, import("../coordinate.js").Coordinate):number} [getPointResolution] - * Function to determine resolution at a point. The function is called with a - * `{number}` view resolution and an `{import("../coordinate.js").Coordinate}` as arguments, and returns - * the `{number}` resolution in projection units at the passed coordinate. If this is `undefined`, - * the default {@link module:ol/proj#getPointResolution} function will be used. - */ -/** - * @classdesc - * Projection definition class. One of these is created for each projection - * supported in the application and stored in the {@link module:ol/proj} namespace. - * You can use these in applications, but this is not required, as API params - * and options use {@link module:ol/proj~ProjectionLike} which means the simple string - * code will suffice. - * - * You can use {@link module:ol/proj~get} to retrieve the object for a particular - * projection. - * - * The library includes definitions for `EPSG:4326` and `EPSG:3857`, together - * with the following aliases: - * * `EPSG:4326`: CRS:84, urn:ogc:def:crs:EPSG:6.6:4326, - * urn:ogc:def:crs:OGC:1.3:CRS84, urn:ogc:def:crs:OGC:2:84, - * http://www.opengis.net/gml/srs/epsg.xml#4326, - * urn:x-ogc:def:crs:EPSG:4326 - * * `EPSG:3857`: EPSG:102100, EPSG:102113, EPSG:900913, - * urn:ogc:def:crs:EPSG:6.18:3:3857, - * http://www.opengis.net/gml/srs/epsg.xml#3857 - * - * If you use [proj4js](https://github.com/proj4js/proj4js), aliases can - * be added using `proj4.defs()`. After all required projection definitions are - * added, call the {@link module:ol/proj/proj4~register} function. - * - * @api - */ -var Projection = /** @class */ (function () { - /** - * @param {Options} options Projection options. - */ - function Projection(options) { - /** - * @private - * @type {string} - */ - this.code_ = options.code; - /** - * Units of projected coordinates. When set to `TILE_PIXELS`, a - * `this.extent_` and `this.worldExtent_` must be configured properly for each - * tile. - * @private - * @type {import("./Units.js").default} - */ - this.units_ = /** @type {import("./Units.js").default} */ (options.units); - /** - * Validity extent of the projection in projected coordinates. For projections - * with `TILE_PIXELS` units, this is the extent of the tile in - * tile pixel space. - * @private - * @type {import("../extent.js").Extent} - */ - this.extent_ = options.extent !== undefined ? options.extent : null; - /** - * Extent of the world in EPSG:4326. For projections with - * `TILE_PIXELS` units, this is the extent of the tile in - * projected coordinate space. - * @private - * @type {import("../extent.js").Extent} - */ - this.worldExtent_ = - options.worldExtent !== undefined ? options.worldExtent : null; - /** - * @private - * @type {string} - */ - this.axisOrientation_ = - options.axisOrientation !== undefined ? options.axisOrientation : 'enu'; - /** - * @private - * @type {boolean} - */ - this.global_ = options.global !== undefined ? options.global : false; - /** - * @private - * @type {boolean} - */ - this.canWrapX_ = !!(this.global_ && this.extent_); - /** - * @private - * @type {function(number, import("../coordinate.js").Coordinate):number|undefined} - */ - this.getPointResolutionFunc_ = options.getPointResolution; - /** - * @private - * @type {import("../tilegrid/TileGrid.js").default} - */ - this.defaultTileGrid_ = null; - /** - * @private - * @type {number|undefined} - */ - this.metersPerUnit_ = options.metersPerUnit; - } - /** - * @return {boolean} The projection is suitable for wrapping the x-axis - */ - Projection.prototype.canWrapX = function () { - return this.canWrapX_; - }; - /** - * Get the code for this projection, e.g. 'EPSG:4326'. - * @return {string} Code. - * @api - */ - Projection.prototype.getCode = function () { - return this.code_; - }; - /** - * Get the validity extent for this projection. - * @return {import("../extent.js").Extent} Extent. - * @api - */ - Projection.prototype.getExtent = function () { - return this.extent_; - }; - /** - * Get the units of this projection. - * @return {import("./Units.js").default} Units. - * @api - */ - Projection.prototype.getUnits = function () { - return this.units_; - }; - /** - * Get the amount of meters per unit of this projection. If the projection is - * not configured with `metersPerUnit` or a units identifier, the return is - * `undefined`. - * @return {number|undefined} Meters. - * @api - */ - Projection.prototype.getMetersPerUnit = function () { - return this.metersPerUnit_ || METERS_PER_UNIT[this.units_]; - }; - /** - * Get the world extent for this projection. - * @return {import("../extent.js").Extent} Extent. - * @api - */ - Projection.prototype.getWorldExtent = function () { - return this.worldExtent_; - }; - /** - * Get the axis orientation of this projection. - * Example values are: - * enu - the default easting, northing, elevation. - * neu - northing, easting, up - useful for "lat/long" geographic coordinates, - * or south orientated transverse mercator. - * wnu - westing, northing, up - some planetary coordinate systems have - * "west positive" coordinate systems - * @return {string} Axis orientation. - * @api - */ - Projection.prototype.getAxisOrientation = function () { - return this.axisOrientation_; - }; - /** - * Is this projection a global projection which spans the whole world? - * @return {boolean} Whether the projection is global. - * @api - */ - Projection.prototype.isGlobal = function () { - return this.global_; - }; - /** - * Set if the projection is a global projection which spans the whole world - * @param {boolean} global Whether the projection is global. - * @api - */ - Projection.prototype.setGlobal = function (global) { - this.global_ = global; - this.canWrapX_ = !!(global && this.extent_); - }; - /** - * @return {import("../tilegrid/TileGrid.js").default} The default tile grid. - */ - Projection.prototype.getDefaultTileGrid = function () { - return this.defaultTileGrid_; - }; - /** - * @param {import("../tilegrid/TileGrid.js").default} tileGrid The default tile grid. - */ - Projection.prototype.setDefaultTileGrid = function (tileGrid) { - this.defaultTileGrid_ = tileGrid; - }; - /** - * Set the validity extent for this projection. - * @param {import("../extent.js").Extent} extent Extent. - * @api - */ - Projection.prototype.setExtent = function (extent) { - this.extent_ = extent; - this.canWrapX_ = !!(this.global_ && extent); - }; - /** - * Set the world extent for this projection. - * @param {import("../extent.js").Extent} worldExtent World extent - * [minlon, minlat, maxlon, maxlat]. - * @api - */ - Projection.prototype.setWorldExtent = function (worldExtent) { - this.worldExtent_ = worldExtent; - }; - /** - * Set the getPointResolution function (see {@link module:ol/proj~getPointResolution} - * for this projection. - * @param {function(number, import("../coordinate.js").Coordinate):number} func Function - * @api - */ - Projection.prototype.setGetPointResolution = function (func) { - this.getPointResolutionFunc_ = func; - }; - /** - * Get the custom point resolution function for this projection (if set). - * @return {function(number, import("../coordinate.js").Coordinate):number|undefined} The custom point - * resolution function (if set). - */ - Projection.prototype.getPointResolutionFunc = function () { - return this.getPointResolutionFunc_; - }; - return Projection; -}()); - -/** - * @module ol/math - */ -/** - * Takes a number and clamps it to within the provided bounds. - * @param {number} value The input number. - * @param {number} min The minimum value to return. - * @param {number} max The maximum value to return. - * @return {number} The input number if it is within bounds, or the nearest - * number within the bounds. - */ -function clamp(value, min, max) { - return Math.min(Math.max(value, min), max); -} -/** - * Return the hyperbolic cosine of a given number. The method will use the - * native `Math.cosh` function if it is available, otherwise the hyperbolic - * cosine will be calculated via the reference implementation of the Mozilla - * developer network. - * - * @param {number} x X. - * @return {number} Hyperbolic cosine of x. - */ -var cosh = (function () { - // Wrapped in a iife, to save the overhead of checking for the native - // implementation on every invocation. - var cosh; - if ('cosh' in Math) { - // The environment supports the native Math.cosh function, use it… - cosh = Math.cosh; - } - else { - // … else, use the reference implementation of MDN: - cosh = function (x) { - var y = /** @type {Math} */ (Math).exp(x); - return (y + 1 / y) / 2; - }; - } - return cosh; -})(); -/** - * Return the base 2 logarithm of a given number. The method will use the - * native `Math.log2` function if it is available, otherwise the base 2 - * logarithm will be calculated via the reference implementation of the - * Mozilla developer network. - * - * @param {number} x X. - * @return {number} Base 2 logarithm of x. - */ -var log2 = (function () { - // Wrapped in a iife, to save the overhead of checking for the native - // implementation on every invocation. - var log2; - if ('log2' in Math) { - // The environment supports the native Math.log2 function, use it… - log2 = Math.log2; - } - else { - // … else, use the reference implementation of MDN: - log2 = function (x) { - return Math.log(x) * Math.LOG2E; - }; - } - return log2; -})(); -/** - * Returns the square of the closest distance between the point (x, y) and the - * line segment (x1, y1) to (x2, y2). - * @param {number} x X. - * @param {number} y Y. - * @param {number} x1 X1. - * @param {number} y1 Y1. - * @param {number} x2 X2. - * @param {number} y2 Y2. - * @return {number} Squared distance. - */ -function squaredSegmentDistance(x, y, x1, y1, x2, y2) { - var dx = x2 - x1; - var dy = y2 - y1; - if (dx !== 0 || dy !== 0) { - var t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy); - if (t > 1) { - x1 = x2; - y1 = y2; - } - else if (t > 0) { - x1 += dx * t; - y1 += dy * t; - } - } - return squaredDistance(x, y, x1, y1); -} -/** - * Returns the square of the distance between the points (x1, y1) and (x2, y2). - * @param {number} x1 X1. - * @param {number} y1 Y1. - * @param {number} x2 X2. - * @param {number} y2 Y2. - * @return {number} Squared distance. - */ -function squaredDistance(x1, y1, x2, y2) { - var dx = x2 - x1; - var dy = y2 - y1; - return dx * dx + dy * dy; -} -/** - * Solves system of linear equations using Gaussian elimination method. - * - * @param {Array>} mat Augmented matrix (n x n + 1 column) - * in row-major order. - * @return {Array} The resulting vector. - */ -function solveLinearSystem(mat) { - var n = mat.length; - for (var i = 0; i < n; i++) { - // Find max in the i-th column (ignoring i - 1 first rows) - var maxRow = i; - var maxEl = Math.abs(mat[i][i]); - for (var r = i + 1; r < n; r++) { - var absValue = Math.abs(mat[r][i]); - if (absValue > maxEl) { - maxEl = absValue; - maxRow = r; - } - } - if (maxEl === 0) { - return null; // matrix is singular - } - // Swap max row with i-th (current) row - var tmp = mat[maxRow]; - mat[maxRow] = mat[i]; - mat[i] = tmp; - // Subtract the i-th row to make all the remaining rows 0 in the i-th column - for (var j = i + 1; j < n; j++) { - var coef = -mat[j][i] / mat[i][i]; - for (var k = i; k < n + 1; k++) { - if (i == k) { - mat[j][k] = 0; - } - else { - mat[j][k] += coef * mat[i][k]; - } - } - } - } - // Solve Ax=b for upper triangular matrix A (mat) - var x = new Array(n); - for (var l = n - 1; l >= 0; l--) { - x[l] = mat[l][n] / mat[l][l]; - for (var m = l - 1; m >= 0; m--) { - mat[m][n] -= mat[m][l] * x[l]; - } - } - return x; -} -/** - * Converts degrees to radians. - * - * @param {number} angleInDegrees Angle in degrees. - * @return {number} Angle in radians. - */ -function toRadians(angleInDegrees) { - return (angleInDegrees * Math.PI) / 180; -} -/** - * Returns the modulo of a / b, depending on the sign of b. - * - * @param {number} a Dividend. - * @param {number} b Divisor. - * @return {number} Modulo. - */ -function modulo(a, b) { - var r = a % b; - return r * b < 0 ? r + b : r; -} -/** - * Calculates the linearly interpolated value of x between a and b. - * - * @param {number} a Number - * @param {number} b Number - * @param {number} x Value to be interpolated. - * @return {number} Interpolated value. - */ -function lerp(a, b, x) { - return a + x * (b - a); -} - -var __extends$3 = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * Radius of WGS84 sphere - * - * @const - * @type {number} - */ -var RADIUS = 6378137; -/** - * @const - * @type {number} - */ -var HALF_SIZE = Math.PI * RADIUS; -/** - * @const - * @type {import("../extent.js").Extent} - */ -var EXTENT = [-HALF_SIZE, -HALF_SIZE, HALF_SIZE, HALF_SIZE]; -/** - * @const - * @type {import("../extent.js").Extent} - */ -var WORLD_EXTENT = [-180, -85, 180, 85]; -/** - * Maximum safe value in y direction - * @const - * @type {number} - */ -var MAX_SAFE_Y = RADIUS * Math.log(Math.tan(Math.PI / 2)); -/** - * @classdesc - * Projection object for web/spherical Mercator (EPSG:3857). - */ -var EPSG3857Projection = /** @class */ (function (_super) { - __extends$3(EPSG3857Projection, _super); - /** - * @param {string} code Code. - */ - function EPSG3857Projection(code) { - return _super.call(this, { - code: code, - units: Units.METERS, - extent: EXTENT, - global: true, - worldExtent: WORLD_EXTENT, - getPointResolution: function (resolution, point) { - return resolution / cosh(point[1] / RADIUS); - }, - }) || this; - } - return EPSG3857Projection; -}(Projection)); -/** - * Projections equal to EPSG:3857. - * - * @const - * @type {Array} - */ -var PROJECTIONS = [ - new EPSG3857Projection('EPSG:3857'), - new EPSG3857Projection('EPSG:102100'), - new EPSG3857Projection('EPSG:102113'), - new EPSG3857Projection('EPSG:900913'), - new EPSG3857Projection('http://www.opengis.net/gml/srs/epsg.xml#3857'), -]; -/** - * Transformation from EPSG:4326 to EPSG:3857. - * - * @param {Array} input Input array of coordinate values. - * @param {Array=} opt_output Output array of coordinate values. - * @param {number=} opt_dimension Dimension (default is `2`). - * @return {Array} Output array of coordinate values. - */ -function fromEPSG4326(input, opt_output, opt_dimension) { - var length = input.length; - var dimension = opt_dimension > 1 ? opt_dimension : 2; - var output = opt_output; - if (output === undefined) { - if (dimension > 2) { - // preserve values beyond second dimension - output = input.slice(); - } - else { - output = new Array(length); - } - } - for (var i = 0; i < length; i += dimension) { - output[i] = (HALF_SIZE * input[i]) / 180; - var y = RADIUS * Math.log(Math.tan((Math.PI * (+input[i + 1] + 90)) / 360)); - if (y > MAX_SAFE_Y) { - y = MAX_SAFE_Y; - } - else if (y < -MAX_SAFE_Y) { - y = -MAX_SAFE_Y; - } - output[i + 1] = y; - } - return output; -} -/** - * Transformation from EPSG:3857 to EPSG:4326. - * - * @param {Array} input Input array of coordinate values. - * @param {Array=} opt_output Output array of coordinate values. - * @param {number=} opt_dimension Dimension (default is `2`). - * @return {Array} Output array of coordinate values. - */ -function toEPSG4326(input, opt_output, opt_dimension) { - var length = input.length; - var dimension = opt_dimension > 1 ? opt_dimension : 2; - var output = opt_output; - if (output === undefined) { - if (dimension > 2) { - // preserve values beyond second dimension - output = input.slice(); - } - else { - output = new Array(length); - } - } - for (var i = 0; i < length; i += dimension) { - output[i] = (180 * input[i]) / HALF_SIZE; - output[i + 1] = - (360 * Math.atan(Math.exp(input[i + 1] / RADIUS))) / Math.PI - 90; - } - return output; -} - -var __extends$4 = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * Semi-major radius of the WGS84 ellipsoid. - * - * @const - * @type {number} - */ -var RADIUS$1 = 6378137; -/** - * Extent of the EPSG:4326 projection which is the whole world. - * - * @const - * @type {import("../extent.js").Extent} - */ -var EXTENT$1 = [-180, -90, 180, 90]; -/** - * @const - * @type {number} - */ -var METERS_PER_UNIT$1 = (Math.PI * RADIUS$1) / 180; -/** - * @classdesc - * Projection object for WGS84 geographic coordinates (EPSG:4326). - * - * Note that OpenLayers does not strictly comply with the EPSG definition. - * The EPSG registry defines 4326 as a CRS for Latitude,Longitude (y,x). - * OpenLayers treats EPSG:4326 as a pseudo-projection, with x,y coordinates. - */ -var EPSG4326Projection = /** @class */ (function (_super) { - __extends$4(EPSG4326Projection, _super); - /** - * @param {string} code Code. - * @param {string=} opt_axisOrientation Axis orientation. - */ - function EPSG4326Projection(code, opt_axisOrientation) { - return _super.call(this, { - code: code, - units: Units.DEGREES, - extent: EXTENT$1, - axisOrientation: opt_axisOrientation, - global: true, - metersPerUnit: METERS_PER_UNIT$1, - worldExtent: EXTENT$1, - }) || this; - } - return EPSG4326Projection; -}(Projection)); -/** - * Projections equal to EPSG:4326. - * - * @const - * @type {Array} - */ -var PROJECTIONS$1 = [ - new EPSG4326Projection('CRS:84'), - new EPSG4326Projection('EPSG:4326', 'neu'), - new EPSG4326Projection('urn:ogc:def:crs:OGC:1.3:CRS84'), - new EPSG4326Projection('urn:ogc:def:crs:OGC:2:84'), - new EPSG4326Projection('http://www.opengis.net/gml/srs/epsg.xml#4326', 'neu'), -]; - -/** - * @module ol/proj/projections - */ -/** - * @type {Object} - */ -var cache = {}; -/** - * Get a cached projection by code. - * @param {string} code The code for the projection. - * @return {import("./Projection.js").default} The projection (if cached). - */ -function get(code) { - return (cache[code] || - cache[code.replace(/urn:(x-)?ogc:def:crs:EPSG:(.*:)?(\w+)$/, 'EPSG:$3')] || - null); -} -/** - * Add a projection to the cache. - * @param {string} code The projection code. - * @param {import("./Projection.js").default} projection The projection to cache. - */ -function add(code, projection) { - cache[code] = projection; -} - -/** - * @module ol/proj/transforms - */ -/** - * @private - * @type {!Object>} - */ -var transforms = {}; -/** - * Registers a conversion function to convert coordinates from the source - * projection to the destination projection. - * - * @param {import("./Projection.js").default} source Source. - * @param {import("./Projection.js").default} destination Destination. - * @param {import("../proj.js").TransformFunction} transformFn Transform. - */ -function add$1(source, destination, transformFn) { - var sourceCode = source.getCode(); - var destinationCode = destination.getCode(); - if (!(sourceCode in transforms)) { - transforms[sourceCode] = {}; - } - transforms[sourceCode][destinationCode] = transformFn; -} -/** - * Get a transform given a source code and a destination code. - * @param {string} sourceCode The code for the source projection. - * @param {string} destinationCode The code for the destination projection. - * @return {import("../proj.js").TransformFunction|undefined} The transform function (if found). - */ -function get$1(sourceCode, destinationCode) { - var transform; - if (sourceCode in transforms && destinationCode in transforms[sourceCode]) { - transform = transforms[sourceCode][destinationCode]; - } - return transform; -} - -/** - * @module ol/extent/Corner - */ -/** - * Extent corner. - * @enum {string} - */ -var Corner = { - BOTTOM_LEFT: 'bottom-left', - BOTTOM_RIGHT: 'bottom-right', - TOP_LEFT: 'top-left', - TOP_RIGHT: 'top-right', -}; - -/** - * @module ol/extent/Relationship - */ -/** - * Relationship to an extent. - * @enum {number} - */ -var Relationship = { - UNKNOWN: 0, - INTERSECTING: 1, - ABOVE: 2, - RIGHT: 4, - BELOW: 8, - LEFT: 16, -}; - -var __extends$5 = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * Error object thrown when an assertion failed. This is an ECMA-262 Error, - * extended with a `code` property. - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error. - */ -var AssertionError = /** @class */ (function (_super) { - __extends$5(AssertionError, _super); - /** - * @param {number} code Error code. - */ - function AssertionError(code) { - var _this = this; - var path = 'v' + VERSION.split('-')[0]; - var message = 'Assertion failed. See https://openlayers.org/en/' + - path + - '/doc/errors/#' + - code + - ' for details.'; - _this = _super.call(this, message) || this; - /** - * Error code. The meaning of the code can be found on - * https://openlayers.org/en/latest/doc/errors/ (replace `latest` with - * the version found in the OpenLayers script's header comment if a version - * other than the latest is used). - * @type {number} - * @api - */ - _this.code = code; - /** - * @type {string} - */ - _this.name = 'AssertionError'; - // Re-assign message, see https://github.com/Rich-Harris/buble/issues/40 - _this.message = message; - return _this; - } - return AssertionError; -}(Error)); - -/** - * @module ol/asserts - */ -/** - * @param {*} assertion Assertion we expected to be truthy. - * @param {number} errorCode Error code. - */ -function assert(assertion, errorCode) { - if (!assertion) { - throw new AssertionError(errorCode); - } -} - -/** - * @module ol/extent - */ -/** - * An array of numbers representing an extent: `[minx, miny, maxx, maxy]`. - * @typedef {Array} Extent - * @api - */ -/** - * Build an extent that includes all given coordinates. - * - * @param {Array} coordinates Coordinates. - * @return {Extent} Bounding extent. - * @api - */ -function boundingExtent(coordinates) { - var extent = createEmpty(); - for (var i = 0, ii = coordinates.length; i < ii; ++i) { - extendCoordinate(extent, coordinates[i]); - } - return extent; -} -/** - * Creates a clone of an extent. - * - * @param {Extent} extent Extent to clone. - * @param {Extent=} opt_extent Extent. - * @return {Extent} The clone. - */ -function clone(extent, opt_extent) { - if (opt_extent) { - opt_extent[0] = extent[0]; - opt_extent[1] = extent[1]; - opt_extent[2] = extent[2]; - opt_extent[3] = extent[3]; - return opt_extent; - } - else { - return extent.slice(); - } -} -/** - * @param {Extent} extent Extent. - * @param {number} x X. - * @param {number} y Y. - * @return {number} Closest squared distance. - */ -function closestSquaredDistanceXY(extent, x, y) { - var dx, dy; - if (x < extent[0]) { - dx = extent[0] - x; - } - else if (extent[2] < x) { - dx = x - extent[2]; - } - else { - dx = 0; - } - if (y < extent[1]) { - dy = extent[1] - y; - } - else if (extent[3] < y) { - dy = y - extent[3]; - } - else { - dy = 0; - } - return dx * dx + dy * dy; -} -/** - * Check if the passed coordinate is contained or on the edge of the extent. - * - * @param {Extent} extent Extent. - * @param {import("./coordinate.js").Coordinate} coordinate Coordinate. - * @return {boolean} The coordinate is contained in the extent. - * @api - */ -function containsCoordinate(extent, coordinate) { - return containsXY(extent, coordinate[0], coordinate[1]); -} -/** - * Check if one extent contains another. - * - * An extent is deemed contained if it lies completely within the other extent, - * including if they share one or more edges. - * - * @param {Extent} extent1 Extent 1. - * @param {Extent} extent2 Extent 2. - * @return {boolean} The second extent is contained by or on the edge of the - * first. - * @api - */ -function containsExtent(extent1, extent2) { - return (extent1[0] <= extent2[0] && - extent2[2] <= extent1[2] && - extent1[1] <= extent2[1] && - extent2[3] <= extent1[3]); -} -/** - * Check if the passed coordinate is contained or on the edge of the extent. - * - * @param {Extent} extent Extent. - * @param {number} x X coordinate. - * @param {number} y Y coordinate. - * @return {boolean} The x, y values are contained in the extent. - * @api - */ -function containsXY(extent, x, y) { - return extent[0] <= x && x <= extent[2] && extent[1] <= y && y <= extent[3]; -} -/** - * Get the relationship between a coordinate and extent. - * @param {Extent} extent The extent. - * @param {import("./coordinate.js").Coordinate} coordinate The coordinate. - * @return {import("./extent/Relationship.js").default} The relationship (bitwise compare with - * import("./extent/Relationship.js").Relationship). - */ -function coordinateRelationship(extent, coordinate) { - var minX = extent[0]; - var minY = extent[1]; - var maxX = extent[2]; - var maxY = extent[3]; - var x = coordinate[0]; - var y = coordinate[1]; - var relationship = Relationship.UNKNOWN; - if (x < minX) { - relationship = relationship | Relationship.LEFT; - } - else if (x > maxX) { - relationship = relationship | Relationship.RIGHT; - } - if (y < minY) { - relationship = relationship | Relationship.BELOW; - } - else if (y > maxY) { - relationship = relationship | Relationship.ABOVE; - } - if (relationship === Relationship.UNKNOWN) { - relationship = Relationship.INTERSECTING; - } - return relationship; -} -/** - * Create an empty extent. - * @return {Extent} Empty extent. - * @api - */ -function createEmpty() { - return [Infinity, Infinity, -Infinity, -Infinity]; -} -/** - * Create a new extent or update the provided extent. - * @param {number} minX Minimum X. - * @param {number} minY Minimum Y. - * @param {number} maxX Maximum X. - * @param {number} maxY Maximum Y. - * @param {Extent=} opt_extent Destination extent. - * @return {Extent} Extent. - */ -function createOrUpdate(minX, minY, maxX, maxY, opt_extent) { - if (opt_extent) { - opt_extent[0] = minX; - opt_extent[1] = minY; - opt_extent[2] = maxX; - opt_extent[3] = maxY; - return opt_extent; - } - else { - return [minX, minY, maxX, maxY]; - } -} -/** - * Create a new empty extent or make the provided one empty. - * @param {Extent=} opt_extent Extent. - * @return {Extent} Extent. - */ -function createOrUpdateEmpty(opt_extent) { - return createOrUpdate(Infinity, Infinity, -Infinity, -Infinity, opt_extent); -} -/** - * @param {import("./coordinate.js").Coordinate} coordinate Coordinate. - * @param {Extent=} opt_extent Extent. - * @return {Extent} Extent. - */ -function createOrUpdateFromCoordinate(coordinate, opt_extent) { - var x = coordinate[0]; - var y = coordinate[1]; - return createOrUpdate(x, y, x, y, opt_extent); -} -/** - * @param {Array} coordinates Coordinates. - * @param {Extent=} opt_extent Extent. - * @return {Extent} Extent. - */ -function createOrUpdateFromCoordinates(coordinates, opt_extent) { - var extent = createOrUpdateEmpty(opt_extent); - return extendCoordinates(extent, coordinates); -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {Extent=} opt_extent Extent. - * @return {Extent} Extent. - */ -function createOrUpdateFromFlatCoordinates(flatCoordinates, offset, end, stride, opt_extent) { - var extent = createOrUpdateEmpty(opt_extent); - return extendFlatCoordinates(extent, flatCoordinates, offset, end, stride); -} -/** - * Determine if two extents are equivalent. - * @param {Extent} extent1 Extent 1. - * @param {Extent} extent2 Extent 2. - * @return {boolean} The two extents are equivalent. - * @api - */ -function equals$1(extent1, extent2) { - return (extent1[0] == extent2[0] && - extent1[2] == extent2[2] && - extent1[1] == extent2[1] && - extent1[3] == extent2[3]); -} -/** - * Modify an extent to include another extent. - * @param {Extent} extent1 The extent to be modified. - * @param {Extent} extent2 The extent that will be included in the first. - * @return {Extent} A reference to the first (extended) extent. - * @api - */ -function extend$1(extent1, extent2) { - if (extent2[0] < extent1[0]) { - extent1[0] = extent2[0]; - } - if (extent2[2] > extent1[2]) { - extent1[2] = extent2[2]; - } - if (extent2[1] < extent1[1]) { - extent1[1] = extent2[1]; - } - if (extent2[3] > extent1[3]) { - extent1[3] = extent2[3]; - } - return extent1; -} -/** - * @param {Extent} extent Extent. - * @param {import("./coordinate.js").Coordinate} coordinate Coordinate. - */ -function extendCoordinate(extent, coordinate) { - if (coordinate[0] < extent[0]) { - extent[0] = coordinate[0]; - } - if (coordinate[0] > extent[2]) { - extent[2] = coordinate[0]; - } - if (coordinate[1] < extent[1]) { - extent[1] = coordinate[1]; - } - if (coordinate[1] > extent[3]) { - extent[3] = coordinate[1]; - } -} -/** - * @param {Extent} extent Extent. - * @param {Array} coordinates Coordinates. - * @return {Extent} Extent. - */ -function extendCoordinates(extent, coordinates) { - for (var i = 0, ii = coordinates.length; i < ii; ++i) { - extendCoordinate(extent, coordinates[i]); - } - return extent; -} -/** - * @param {Extent} extent Extent. - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @return {Extent} Extent. - */ -function extendFlatCoordinates(extent, flatCoordinates, offset, end, stride) { - for (; offset < end; offset += stride) { - extendXY(extent, flatCoordinates[offset], flatCoordinates[offset + 1]); - } - return extent; -} -/** - * @param {Extent} extent Extent. - * @param {number} x X. - * @param {number} y Y. - */ -function extendXY(extent, x, y) { - extent[0] = Math.min(extent[0], x); - extent[1] = Math.min(extent[1], y); - extent[2] = Math.max(extent[2], x); - extent[3] = Math.max(extent[3], y); -} -/** - * This function calls `callback` for each corner of the extent. If the - * callback returns a truthy value the function returns that value - * immediately. Otherwise the function returns `false`. - * @param {Extent} extent Extent. - * @param {function(import("./coordinate.js").Coordinate): S} callback Callback. - * @return {S|boolean} Value. - * @template S - */ -function forEachCorner(extent, callback) { - var val; - val = callback(getBottomLeft(extent)); - if (val) { - return val; - } - val = callback(getBottomRight(extent)); - if (val) { - return val; - } - val = callback(getTopRight(extent)); - if (val) { - return val; - } - val = callback(getTopLeft(extent)); - if (val) { - return val; - } - return false; -} -/** - * Get the size of an extent. - * @param {Extent} extent Extent. - * @return {number} Area. - * @api - */ -function getArea(extent) { - var area = 0; - if (!isEmpty$1(extent)) { - area = getWidth(extent) * getHeight(extent); - } - return area; -} -/** - * Get the bottom left coordinate of an extent. - * @param {Extent} extent Extent. - * @return {import("./coordinate.js").Coordinate} Bottom left coordinate. - * @api - */ -function getBottomLeft(extent) { - return [extent[0], extent[1]]; -} -/** - * Get the bottom right coordinate of an extent. - * @param {Extent} extent Extent. - * @return {import("./coordinate.js").Coordinate} Bottom right coordinate. - * @api - */ -function getBottomRight(extent) { - return [extent[2], extent[1]]; -} -/** - * Get the center coordinate of an extent. - * @param {Extent} extent Extent. - * @return {import("./coordinate.js").Coordinate} Center. - * @api - */ -function getCenter(extent) { - return [(extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2]; -} -/** - * Get a corner coordinate of an extent. - * @param {Extent} extent Extent. - * @param {import("./extent/Corner.js").default} corner Corner. - * @return {import("./coordinate.js").Coordinate} Corner coordinate. - */ -function getCorner(extent, corner) { - var coordinate; - if (corner === Corner.BOTTOM_LEFT) { - coordinate = getBottomLeft(extent); - } - else if (corner === Corner.BOTTOM_RIGHT) { - coordinate = getBottomRight(extent); - } - else if (corner === Corner.TOP_LEFT) { - coordinate = getTopLeft(extent); - } - else if (corner === Corner.TOP_RIGHT) { - coordinate = getTopRight(extent); - } - else { - assert(false, 13); // Invalid corner - } - return coordinate; -} -/** - * @param {import("./coordinate.js").Coordinate} center Center. - * @param {number} resolution Resolution. - * @param {number} rotation Rotation. - * @param {import("./size.js").Size} size Size. - * @param {Extent=} opt_extent Destination extent. - * @return {Extent} Extent. - */ -function getForViewAndSize(center, resolution, rotation, size, opt_extent) { - var dx = (resolution * size[0]) / 2; - var dy = (resolution * size[1]) / 2; - var cosRotation = Math.cos(rotation); - var sinRotation = Math.sin(rotation); - var xCos = dx * cosRotation; - var xSin = dx * sinRotation; - var yCos = dy * cosRotation; - var ySin = dy * sinRotation; - var x = center[0]; - var y = center[1]; - var x0 = x - xCos + ySin; - var x1 = x - xCos - ySin; - var x2 = x + xCos - ySin; - var x3 = x + xCos + ySin; - var y0 = y - xSin - yCos; - var y1 = y - xSin + yCos; - var y2 = y + xSin + yCos; - var y3 = y + xSin - yCos; - return createOrUpdate(Math.min(x0, x1, x2, x3), Math.min(y0, y1, y2, y3), Math.max(x0, x1, x2, x3), Math.max(y0, y1, y2, y3), opt_extent); -} -/** - * Get the height of an extent. - * @param {Extent} extent Extent. - * @return {number} Height. - * @api - */ -function getHeight(extent) { - return extent[3] - extent[1]; -} -/** - * Get the intersection of two extents. - * @param {Extent} extent1 Extent 1. - * @param {Extent} extent2 Extent 2. - * @param {Extent=} opt_extent Optional extent to populate with intersection. - * @return {Extent} Intersecting extent. - * @api - */ -function getIntersection(extent1, extent2, opt_extent) { - var intersection = opt_extent ? opt_extent : createEmpty(); - if (intersects(extent1, extent2)) { - if (extent1[0] > extent2[0]) { - intersection[0] = extent1[0]; - } - else { - intersection[0] = extent2[0]; - } - if (extent1[1] > extent2[1]) { - intersection[1] = extent1[1]; - } - else { - intersection[1] = extent2[1]; - } - if (extent1[2] < extent2[2]) { - intersection[2] = extent1[2]; - } - else { - intersection[2] = extent2[2]; - } - if (extent1[3] < extent2[3]) { - intersection[3] = extent1[3]; - } - else { - intersection[3] = extent2[3]; - } - } - else { - createOrUpdateEmpty(intersection); - } - return intersection; -} -/** - * Get the top left coordinate of an extent. - * @param {Extent} extent Extent. - * @return {import("./coordinate.js").Coordinate} Top left coordinate. - * @api - */ -function getTopLeft(extent) { - return [extent[0], extent[3]]; -} -/** - * Get the top right coordinate of an extent. - * @param {Extent} extent Extent. - * @return {import("./coordinate.js").Coordinate} Top right coordinate. - * @api - */ -function getTopRight(extent) { - return [extent[2], extent[3]]; -} -/** - * Get the width of an extent. - * @param {Extent} extent Extent. - * @return {number} Width. - * @api - */ -function getWidth(extent) { - return extent[2] - extent[0]; -} -/** - * Determine if one extent intersects another. - * @param {Extent} extent1 Extent 1. - * @param {Extent} extent2 Extent. - * @return {boolean} The two extents intersect. - * @api - */ -function intersects(extent1, extent2) { - return (extent1[0] <= extent2[2] && - extent1[2] >= extent2[0] && - extent1[1] <= extent2[3] && - extent1[3] >= extent2[1]); -} -/** - * Determine if an extent is empty. - * @param {Extent} extent Extent. - * @return {boolean} Is empty. - * @api - */ -function isEmpty$1(extent) { - return extent[2] < extent[0] || extent[3] < extent[1]; -} -/** - * @param {Extent} extent Extent. - * @param {Extent=} opt_extent Extent. - * @return {Extent} Extent. - */ -function returnOrUpdate(extent, opt_extent) { - if (opt_extent) { - opt_extent[0] = extent[0]; - opt_extent[1] = extent[1]; - opt_extent[2] = extent[2]; - opt_extent[3] = extent[3]; - return opt_extent; - } - else { - return extent; - } -} -/** - * @param {Extent} extent Extent. - * @param {number} value Value. - */ -function scaleFromCenter(extent, value) { - var deltaX = ((extent[2] - extent[0]) / 2) * (value - 1); - var deltaY = ((extent[3] - extent[1]) / 2) * (value - 1); - extent[0] -= deltaX; - extent[2] += deltaX; - extent[1] -= deltaY; - extent[3] += deltaY; -} -/** - * Determine if the segment between two coordinates intersects (crosses, - * touches, or is contained by) the provided extent. - * @param {Extent} extent The extent. - * @param {import("./coordinate.js").Coordinate} start Segment start coordinate. - * @param {import("./coordinate.js").Coordinate} end Segment end coordinate. - * @return {boolean} The segment intersects the extent. - */ -function intersectsSegment(extent, start, end) { - var intersects = false; - var startRel = coordinateRelationship(extent, start); - var endRel = coordinateRelationship(extent, end); - if (startRel === Relationship.INTERSECTING || - endRel === Relationship.INTERSECTING) { - intersects = true; - } - else { - var minX = extent[0]; - var minY = extent[1]; - var maxX = extent[2]; - var maxY = extent[3]; - var startX = start[0]; - var startY = start[1]; - var endX = end[0]; - var endY = end[1]; - var slope = (endY - startY) / (endX - startX); - var x = void 0, y = void 0; - if (!!(endRel & Relationship.ABOVE) && !(startRel & Relationship.ABOVE)) { - // potentially intersects top - x = endX - (endY - maxY) / slope; - intersects = x >= minX && x <= maxX; - } - if (!intersects && - !!(endRel & Relationship.RIGHT) && - !(startRel & Relationship.RIGHT)) { - // potentially intersects right - y = endY - (endX - maxX) * slope; - intersects = y >= minY && y <= maxY; - } - if (!intersects && - !!(endRel & Relationship.BELOW) && - !(startRel & Relationship.BELOW)) { - // potentially intersects bottom - x = endX - (endY - minY) / slope; - intersects = x >= minX && x <= maxX; - } - if (!intersects && - !!(endRel & Relationship.LEFT) && - !(startRel & Relationship.LEFT)) { - // potentially intersects left - y = endY - (endX - minX) * slope; - intersects = y >= minY && y <= maxY; - } - } - return intersects; -} - -/** - * @module ol/sphere - */ -/** - * Object literal with options for the {@link getLength} or {@link getArea} - * functions. - * @typedef {Object} SphereMetricOptions - * @property {import("./proj.js").ProjectionLike} [projection='EPSG:3857'] - * Projection of the geometry. By default, the geometry is assumed to be in - * Web Mercator. - * @property {number} [radius=6371008.8] Sphere radius. By default, the - * [mean Earth radius](https://en.wikipedia.org/wiki/Earth_radius#Mean_radius) - * for the WGS84 ellipsoid is used. - */ -/** - * The mean Earth radius (1/3 * (2a + b)) for the WGS84 ellipsoid. - * https://en.wikipedia.org/wiki/Earth_radius#Mean_radius - * @type {number} - */ -var DEFAULT_RADIUS = 6371008.8; -/** - * Get the great circle distance (in meters) between two geographic coordinates. - * @param {Array} c1 Starting coordinate. - * @param {Array} c2 Ending coordinate. - * @param {number=} opt_radius The sphere radius to use. Defaults to the Earth's - * mean radius using the WGS84 ellipsoid. - * @return {number} The great circle distance between the points (in meters). - * @api - */ -function getDistance(c1, c2, opt_radius) { - var radius = opt_radius || DEFAULT_RADIUS; - var lat1 = toRadians(c1[1]); - var lat2 = toRadians(c2[1]); - var deltaLatBy2 = (lat2 - lat1) / 2; - var deltaLonBy2 = toRadians(c2[0] - c1[0]) / 2; - var a = Math.sin(deltaLatBy2) * Math.sin(deltaLatBy2) + - Math.sin(deltaLonBy2) * - Math.sin(deltaLonBy2) * - Math.cos(lat1) * - Math.cos(lat2); - return 2 * radius * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); -} - -/** - * @module ol/coordinate - */ -/** - * An array of numbers representing an xy coordinate. Example: `[16, 48]`. - * @typedef {Array} Coordinate - * @api - */ -/** - * A function that takes a {@link module:ol/coordinate~Coordinate} and - * transforms it into a `{string}`. - * - * @typedef {function((Coordinate|undefined)): string} CoordinateFormat - * @api - */ -/** - * Add `delta` to `coordinate`. `coordinate` is modified in place and returned - * by the function. - * - * Example: - * - * import {add} from 'ol/coordinate'; - * - * var coord = [7.85, 47.983333]; - * add(coord, [-2, 4]); - * // coord is now [5.85, 51.983333] - * - * @param {Coordinate} coordinate Coordinate. - * @param {Coordinate} delta Delta. - * @return {Coordinate} The input coordinate adjusted by - * the given delta. - * @api - */ -function add$2(coordinate, delta) { - coordinate[0] += +delta[0]; - coordinate[1] += +delta[1]; - return coordinate; -} -/** - * @param {Coordinate} coordinate1 First coordinate. - * @param {Coordinate} coordinate2 Second coordinate. - * @return {boolean} The two coordinates are equal. - */ -function equals$2(coordinate1, coordinate2) { - var equals = true; - for (var i = coordinate1.length - 1; i >= 0; --i) { - if (coordinate1[i] != coordinate2[i]) { - equals = false; - break; - } - } - return equals; -} -/** - * Rotate `coordinate` by `angle`. `coordinate` is modified in place and - * returned by the function. - * - * Example: - * - * import {rotate} from 'ol/coordinate'; - * - * var coord = [7.85, 47.983333]; - * var rotateRadians = Math.PI / 2; // 90 degrees - * rotate(coord, rotateRadians); - * // coord is now [-47.983333, 7.85] - * - * @param {Coordinate} coordinate Coordinate. - * @param {number} angle Angle in radian. - * @return {Coordinate} Coordinate. - * @api - */ -function rotate(coordinate, angle) { - var cosAngle = Math.cos(angle); - var sinAngle = Math.sin(angle); - var x = coordinate[0] * cosAngle - coordinate[1] * sinAngle; - var y = coordinate[1] * cosAngle + coordinate[0] * sinAngle; - coordinate[0] = x; - coordinate[1] = y; - return coordinate; -} -/** - * Scale `coordinate` by `scale`. `coordinate` is modified in place and returned - * by the function. - * - * Example: - * - * import {scale as scaleCoordinate} from 'ol/coordinate'; - * - * var coord = [7.85, 47.983333]; - * var scale = 1.2; - * scaleCoordinate(coord, scale); - * // coord is now [9.42, 57.5799996] - * - * @param {Coordinate} coordinate Coordinate. - * @param {number} scale Scale factor. - * @return {Coordinate} Coordinate. - */ -function scale(coordinate, scale) { - coordinate[0] *= scale; - coordinate[1] *= scale; - return coordinate; -} -/** - * Modifies the provided coordinate in-place to be within the real world - * extent. The lower projection extent boundary is inclusive, the upper one - * exclusive. - * - * @param {Coordinate} coordinate Coordinate. - * @param {import("./proj/Projection.js").default} projection Projection. - * @return {Coordinate} The coordinate within the real world extent. - */ -function wrapX(coordinate, projection) { - if (projection.canWrapX()) { - var worldWidth = getWidth(projection.getExtent()); - var worldsAway = getWorldsAway(coordinate, projection, worldWidth); - if (worldsAway) { - coordinate[0] -= worldsAway * worldWidth; - } - } - return coordinate; -} -/** - * @param {Coordinate} coordinate Coordinate. - * @param {import("./proj/Projection.js").default} projection Projection. - * @param {number=} opt_sourceExtentWidth Width of the source extent. - * @return {number} Offset in world widths. - */ -function getWorldsAway(coordinate, projection, opt_sourceExtentWidth) { - var projectionExtent = projection.getExtent(); - var worldsAway = 0; - if (projection.canWrapX() && - (coordinate[0] < projectionExtent[0] || coordinate[0] > projectionExtent[2])) { - var sourceExtentWidth = opt_sourceExtentWidth || getWidth(projectionExtent); - worldsAway = Math.floor((coordinate[0] - projectionExtent[0]) / sourceExtentWidth); - } - return worldsAway; -} - -/** - * @module ol/proj - */ -/** - * @param {Array} input Input coordinate array. - * @param {Array=} opt_output Output array of coordinate values. - * @param {number=} opt_dimension Dimension. - * @return {Array} Output coordinate array (new array, same coordinate - * values). - */ -function cloneTransform(input, opt_output, opt_dimension) { - var output; - if (opt_output !== undefined) { - for (var i = 0, ii = input.length; i < ii; ++i) { - opt_output[i] = input[i]; - } - output = opt_output; - } - else { - output = input.slice(); - } - return output; -} -/** - * @param {Array} input Input coordinate array. - * @param {Array=} opt_output Output array of coordinate values. - * @param {number=} opt_dimension Dimension. - * @return {Array} Input coordinate array (same array as input). - */ -function identityTransform(input, opt_output, opt_dimension) { - if (opt_output !== undefined && input !== opt_output) { - for (var i = 0, ii = input.length; i < ii; ++i) { - opt_output[i] = input[i]; - } - input = opt_output; - } - return input; -} -/** - * Add a Projection object to the list of supported projections that can be - * looked up by their code. - * - * @param {Projection} projection Projection instance. - * @api - */ -function addProjection(projection) { - add(projection.getCode(), projection); - add$1(projection, projection, cloneTransform); -} -/** - * @param {Array} projections Projections. - */ -function addProjections(projections) { - projections.forEach(addProjection); -} -/** - * Fetches a Projection object for the code specified. - * - * @param {ProjectionLike} projectionLike Either a code string which is - * a combination of authority and identifier such as "EPSG:4326", or an - * existing projection object, or undefined. - * @return {Projection} Projection object, or null if not in list. - * @api - */ -function get$2(projectionLike) { - return typeof projectionLike === 'string' - ? get(/** @type {string} */ (projectionLike)) - : /** @type {Projection} */ (projectionLike) || null; -} -/** - * Get the resolution of the point in degrees or distance units. - * For projections with degrees as the unit this will simply return the - * provided resolution. For other projections the point resolution is - * by default estimated by transforming the 'point' pixel to EPSG:4326, - * measuring its width and height on the normal sphere, - * and taking the average of the width and height. - * A custom function can be provided for a specific projection, either - * by setting the `getPointResolution` option in the - * {@link module:ol/proj/Projection~Projection} constructor or by using - * {@link module:ol/proj/Projection~Projection#setGetPointResolution} to change an existing - * projection object. - * @param {ProjectionLike} projection The projection. - * @param {number} resolution Nominal resolution in projection units. - * @param {import("./coordinate.js").Coordinate} point Point to find adjusted resolution at. - * @param {import("./proj/Units.js").default=} opt_units Units to get the point resolution in. - * Default is the projection's units. - * @return {number} Point resolution. - * @api - */ -function getPointResolution(projection, resolution, point, opt_units) { - projection = get$2(projection); - var pointResolution; - var getter = projection.getPointResolutionFunc(); - if (getter) { - pointResolution = getter(resolution, point); - if (opt_units && opt_units !== projection.getUnits()) { - var metersPerUnit = projection.getMetersPerUnit(); - if (metersPerUnit) { - pointResolution = - (pointResolution * metersPerUnit) / METERS_PER_UNIT[opt_units]; - } - } - } - else { - var units = projection.getUnits(); - if ((units == Units.DEGREES && !opt_units) || opt_units == Units.DEGREES) { - pointResolution = resolution; - } - else { - // Estimate point resolution by transforming the center pixel to EPSG:4326, - // measuring its width and height on the normal sphere, and taking the - // average of the width and height. - var toEPSG4326_1 = getTransformFromProjections(projection, get$2('EPSG:4326')); - if (toEPSG4326_1 === identityTransform && units !== Units.DEGREES) { - // no transform is available - pointResolution = resolution * projection.getMetersPerUnit(); - } - else { - var vertices = [ - point[0] - resolution / 2, - point[1], - point[0] + resolution / 2, - point[1], - point[0], - point[1] - resolution / 2, - point[0], - point[1] + resolution / 2, - ]; - vertices = toEPSG4326_1(vertices, vertices, 2); - var width = getDistance(vertices.slice(0, 2), vertices.slice(2, 4)); - var height = getDistance(vertices.slice(4, 6), vertices.slice(6, 8)); - pointResolution = (width + height) / 2; - } - var metersPerUnit = opt_units - ? METERS_PER_UNIT[opt_units] - : projection.getMetersPerUnit(); - if (metersPerUnit !== undefined) { - pointResolution /= metersPerUnit; - } - } - } - return pointResolution; -} -/** - * Registers transformation functions that don't alter coordinates. Those allow - * to transform between projections with equal meaning. - * - * @param {Array} projections Projections. - * @api - */ -function addEquivalentProjections(projections) { - addProjections(projections); - projections.forEach(function (source) { - projections.forEach(function (destination) { - if (source !== destination) { - add$1(source, destination, cloneTransform); - } - }); - }); -} -/** - * Registers transformation functions to convert coordinates in any projection - * in projection1 to any projection in projection2. - * - * @param {Array} projections1 Projections with equal - * meaning. - * @param {Array} projections2 Projections with equal - * meaning. - * @param {TransformFunction} forwardTransform Transformation from any - * projection in projection1 to any projection in projection2. - * @param {TransformFunction} inverseTransform Transform from any projection - * in projection2 to any projection in projection1.. - */ -function addEquivalentTransforms(projections1, projections2, forwardTransform, inverseTransform) { - projections1.forEach(function (projection1) { - projections2.forEach(function (projection2) { - add$1(projection1, projection2, forwardTransform); - add$1(projection2, projection1, inverseTransform); - }); - }); -} -/** - * @param {Projection|string|undefined} projection Projection. - * @param {string} defaultCode Default code. - * @return {Projection} Projection. - */ -function createProjection(projection, defaultCode) { - if (!projection) { - return get$2(defaultCode); - } - else if (typeof projection === 'string') { - return get$2(projection); - } - else { - return /** @type {Projection} */ (projection); - } -} -/** - * Checks if two projections are the same, that is every coordinate in one - * projection does represent the same geographic point as the same coordinate in - * the other projection. - * - * @param {Projection} projection1 Projection 1. - * @param {Projection} projection2 Projection 2. - * @return {boolean} Equivalent. - * @api - */ -function equivalent(projection1, projection2) { - if (projection1 === projection2) { - return true; - } - var equalUnits = projection1.getUnits() === projection2.getUnits(); - if (projection1.getCode() === projection2.getCode()) { - return equalUnits; - } - else { - var transformFunc = getTransformFromProjections(projection1, projection2); - return transformFunc === cloneTransform && equalUnits; - } -} -/** - * Searches in the list of transform functions for the function for converting - * coordinates from the source projection to the destination projection. - * - * @param {Projection} sourceProjection Source Projection object. - * @param {Projection} destinationProjection Destination Projection - * object. - * @return {TransformFunction} Transform function. - */ -function getTransformFromProjections(sourceProjection, destinationProjection) { - var sourceCode = sourceProjection.getCode(); - var destinationCode = destinationProjection.getCode(); - var transformFunc = get$1(sourceCode, destinationCode); - if (!transformFunc) { - transformFunc = identityTransform; - } - return transformFunc; -} -/** - * Given the projection-like objects, searches for a transformation - * function to convert a coordinates array from the source projection to the - * destination projection. - * - * @param {ProjectionLike} source Source. - * @param {ProjectionLike} destination Destination. - * @return {TransformFunction} Transform function. - * @api - */ -function getTransform(source, destination) { - var sourceProjection = get$2(source); - var destinationProjection = get$2(destination); - return getTransformFromProjections(sourceProjection, destinationProjection); -} -/** - * Transforms a coordinate from source projection to destination projection. - * This returns a new coordinate (and does not modify the original). - * - * See {@link module:ol/proj~transformExtent} for extent transformation. - * See the transform method of {@link module:ol/geom/Geometry~Geometry} and its - * subclasses for geometry transforms. - * - * @param {import("./coordinate.js").Coordinate} coordinate Coordinate. - * @param {ProjectionLike} source Source projection-like. - * @param {ProjectionLike} destination Destination projection-like. - * @return {import("./coordinate.js").Coordinate} Coordinate. - * @api - */ -function transform(coordinate, source, destination) { - var transformFunc = getTransform(source, destination); - return transformFunc(coordinate, undefined, coordinate.length); -} -/** - * @type {?Projection} - */ -var userProjection = null; -/** - * Get the projection for coordinates supplied from and returned by API methods. - * Note that this method is not yet a part of the stable API. Support for user - * projections is not yet complete and should be considered experimental. - * @returns {?Projection} The user projection (or null if not set). - */ -function getUserProjection() { - return userProjection; -} -/** - * Return a coordinate transformed into the user projection. If no user projection - * is set, the original coordinate is returned. - * @param {Array} coordinate Input coordinate. - * @param {ProjectionLike} sourceProjection The input coordinate projection. - * @returns {Array} The input coordinate in the user projection. - */ -function toUserCoordinate(coordinate, sourceProjection) { - { - return coordinate; - } -} -/** - * Return a coordinate transformed from the user projection. If no user projection - * is set, the original coordinate is returned. - * @param {Array} coordinate Input coordinate. - * @param {ProjectionLike} destProjection The destination projection. - * @returns {Array} The input coordinate transformed. - */ -function fromUserCoordinate(coordinate, destProjection) { - { - return coordinate; - } -} -/** - * Return an extent transformed into the user projection. If no user projection - * is set, the original extent is returned. - * @param {import("./extent.js").Extent} extent Input extent. - * @param {ProjectionLike} sourceProjection The input extent projection. - * @returns {import("./extent.js").Extent} The input extent in the user projection. - */ -function toUserExtent(extent, sourceProjection) { - { - return extent; - } -} -/** - * Return an extent transformed from the user projection. If no user projection - * is set, the original extent is returned. - * @param {import("./extent.js").Extent} extent Input extent. - * @param {ProjectionLike} destProjection The destination projection. - * @returns {import("./extent.js").Extent} The input extent transformed. - */ -function fromUserExtent(extent, destProjection) { - { - return extent; - } -} -/** - * Add transforms to and from EPSG:4326 and EPSG:3857. This function is called - * by when this module is executed and should only need to be called again after - * `clearAllProjections()` is called (e.g. in tests). - */ -function addCommon() { - // Add transformations that don't alter coordinates to convert within set of - // projections with equal meaning. - addEquivalentProjections(PROJECTIONS); - addEquivalentProjections(PROJECTIONS$1); - // Add transformations to convert EPSG:4326 like coordinates to EPSG:3857 like - // coordinates and back. - addEquivalentTransforms(PROJECTIONS$1, PROJECTIONS, fromEPSG4326, toEPSG4326); -} -addCommon(); - -/** - * @module ol/centerconstraint - */ -/** - * @typedef {function((import("./coordinate.js").Coordinate|undefined), number, import("./size.js").Size, boolean=, Array=): (import("./coordinate.js").Coordinate|undefined)} Type - */ -/** - * @param {import("./extent.js").Extent} extent Extent. - * @param {boolean} onlyCenter If true, the constraint will only apply to the view center. - * @param {boolean} smooth If true, the view will be able to go slightly out of the given extent - * (only during interaction and animation). - * @return {Type} The constraint. - */ -function createExtent(extent, onlyCenter, smooth) { - return ( - /** - * @param {import("./coordinate.js").Coordinate|undefined} center Center. - * @param {number} resolution Resolution. - * @param {import("./size.js").Size} size Viewport size; unused if `onlyCenter` was specified. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. - * @param {Array=} opt_centerShift Shift between map center and viewport center. - * @return {import("./coordinate.js").Coordinate|undefined} Center. - */ - function (center, resolution, size, opt_isMoving, opt_centerShift) { - if (center) { - var viewWidth = onlyCenter ? 0 : size[0] * resolution; - var viewHeight = onlyCenter ? 0 : size[1] * resolution; - var shiftX = opt_centerShift ? opt_centerShift[0] : 0; - var shiftY = opt_centerShift ? opt_centerShift[1] : 0; - var minX = extent[0] + viewWidth / 2 + shiftX; - var maxX = extent[2] - viewWidth / 2 + shiftX; - var minY = extent[1] + viewHeight / 2 + shiftY; - var maxY = extent[3] - viewHeight / 2 + shiftY; - // note: when zooming out of bounds, min and max values for x and y may - // end up inverted (min > max); this has to be accounted for - if (minX > maxX) { - minX = (maxX + minX) / 2; - maxX = minX; - } - if (minY > maxY) { - minY = (maxY + minY) / 2; - maxY = minY; - } - var x = clamp(center[0], minX, maxX); - var y = clamp(center[1], minY, maxY); - var ratio = 30 * resolution; - // during an interaction, allow some overscroll - if (opt_isMoving && smooth) { - x += - -ratio * Math.log(1 + Math.max(0, minX - center[0]) / ratio) + - ratio * Math.log(1 + Math.max(0, center[0] - maxX) / ratio); - y += - -ratio * Math.log(1 + Math.max(0, minY - center[1]) / ratio) + - ratio * Math.log(1 + Math.max(0, center[1] - maxY) / ratio); - } - return [x, y]; - } - else { - return undefined; - } - }); -} -/** - * @param {import("./coordinate.js").Coordinate=} center Center. - * @return {import("./coordinate.js").Coordinate|undefined} Center. - */ -function none(center) { - return center; -} - -/** - * @module ol/resolutionconstraint - */ -/** - * @typedef {function((number|undefined), number, import("./size.js").Size, boolean=): (number|undefined)} Type - */ -/** - * Returns a modified resolution taking into account the viewport size and maximum - * allowed extent. - * @param {number} resolution Resolution - * @param {import("./extent.js").Extent} maxExtent Maximum allowed extent. - * @param {import("./size.js").Size} viewportSize Viewport size. - * @param {boolean} showFullExtent Whether to show the full extent. - * @return {number} Capped resolution. - */ -function getViewportClampedResolution(resolution, maxExtent, viewportSize, showFullExtent) { - var xResolution = getWidth(maxExtent) / viewportSize[0]; - var yResolution = getHeight(maxExtent) / viewportSize[1]; - if (showFullExtent) { - return Math.min(resolution, Math.max(xResolution, yResolution)); - } - return Math.min(resolution, Math.min(xResolution, yResolution)); -} -/** - * Returns a modified resolution to be between maxResolution and minResolution while - * still allowing the value to be slightly out of bounds. - * Note: the computation is based on the logarithm function (ln): - * - at 1, ln(x) is 0 - * - above 1, ln(x) keeps increasing but at a much slower pace than x - * The final result is clamped to prevent getting too far away from bounds. - * @param {number} resolution Resolution. - * @param {number} maxResolution Max resolution. - * @param {number} minResolution Min resolution. - * @return {number} Smoothed resolution. - */ -function getSmoothClampedResolution(resolution, maxResolution, minResolution) { - var result = Math.min(resolution, maxResolution); - var ratio = 50; - result *= - Math.log(1 + ratio * Math.max(0, resolution / maxResolution - 1)) / ratio + - 1; - if (minResolution) { - result = Math.max(result, minResolution); - result /= - Math.log(1 + ratio * Math.max(0, minResolution / resolution - 1)) / - ratio + - 1; - } - return clamp(result, minResolution / 2, maxResolution * 2); -} -/** - * @param {Array} resolutions Resolutions. - * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. - * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. - * @param {boolean=} opt_showFullExtent If true, allows us to show the full extent. Default: false. - * @return {Type} Zoom function. - */ -function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent, opt_showFullExtent) { - return ( - /** - * @param {number|undefined} resolution Resolution. - * @param {number} direction Direction. - * @param {import("./size.js").Size} size Viewport size. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. - * @return {number|undefined} Resolution. - */ - function (resolution, direction, size, opt_isMoving) { - if (resolution !== undefined) { - var maxResolution = resolutions[0]; - var minResolution = resolutions[resolutions.length - 1]; - var cappedMaxRes = opt_maxExtent - ? getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_showFullExtent) - : maxResolution; - // during interacting or animating, allow intermediary values - if (opt_isMoving) { - var smooth = opt_smooth !== undefined ? opt_smooth : true; - if (!smooth) { - return clamp(resolution, minResolution, cappedMaxRes); - } - return getSmoothClampedResolution(resolution, cappedMaxRes, minResolution); - } - var capped = Math.min(cappedMaxRes, resolution); - var z = Math.floor(linearFindNearest(resolutions, capped, direction)); - if (resolutions[z] > cappedMaxRes && z < resolutions.length - 1) { - return resolutions[z + 1]; - } - return resolutions[z]; - } - else { - return undefined; - } - }); -} -/** - * @param {number} power Power. - * @param {number} maxResolution Maximum resolution. - * @param {number=} opt_minResolution Minimum resolution. - * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. - * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. - * @param {boolean=} opt_showFullExtent If true, allows us to show the full extent. Default: false. - * @return {Type} Zoom function. - */ -function createSnapToPower(power, maxResolution, opt_minResolution, opt_smooth, opt_maxExtent, opt_showFullExtent) { - return ( - /** - * @param {number|undefined} resolution Resolution. - * @param {number} direction Direction. - * @param {import("./size.js").Size} size Viewport size. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. - * @return {number|undefined} Resolution. - */ - function (resolution, direction, size, opt_isMoving) { - if (resolution !== undefined) { - var cappedMaxRes = opt_maxExtent - ? getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_showFullExtent) - : maxResolution; - var minResolution = opt_minResolution !== undefined ? opt_minResolution : 0; - // during interacting or animating, allow intermediary values - if (opt_isMoving) { - var smooth = opt_smooth !== undefined ? opt_smooth : true; - if (!smooth) { - return clamp(resolution, minResolution, cappedMaxRes); - } - return getSmoothClampedResolution(resolution, cappedMaxRes, minResolution); - } - var tolerance = 1e-9; - var minZoomLevel = Math.ceil(Math.log(maxResolution / cappedMaxRes) / Math.log(power) - tolerance); - var offset = -direction * (0.5 - tolerance) + 0.5; - var capped = Math.min(cappedMaxRes, resolution); - var cappedZoomLevel = Math.floor(Math.log(maxResolution / capped) / Math.log(power) + offset); - var zoomLevel = Math.max(minZoomLevel, cappedZoomLevel); - var newResolution = maxResolution / Math.pow(power, zoomLevel); - return clamp(newResolution, minResolution, cappedMaxRes); - } - else { - return undefined; - } - }); -} -/** - * @param {number} maxResolution Max resolution. - * @param {number} minResolution Min resolution. - * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. - * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. - * @param {boolean=} opt_showFullExtent If true, allows us to show the full extent. Default: false. - * @return {Type} Zoom function. - */ -function createMinMaxResolution(maxResolution, minResolution, opt_smooth, opt_maxExtent, opt_showFullExtent) { - return ( - /** - * @param {number|undefined} resolution Resolution. - * @param {number} direction Direction. - * @param {import("./size.js").Size} size Viewport size. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. - * @return {number|undefined} Resolution. - */ - function (resolution, direction, size, opt_isMoving) { - if (resolution !== undefined) { - var cappedMaxRes = opt_maxExtent - ? getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_showFullExtent) - : maxResolution; - var smooth = opt_smooth !== undefined ? opt_smooth : true; - if (!smooth || !opt_isMoving) { - return clamp(resolution, minResolution, cappedMaxRes); - } - return getSmoothClampedResolution(resolution, cappedMaxRes, minResolution); - } - else { - return undefined; - } - }); -} - -/** - * @module ol/rotationconstraint - */ -/** - * @typedef {function((number|undefined), boolean=): (number|undefined)} Type - */ -/** - * @param {number|undefined} rotation Rotation. - * @return {number|undefined} Rotation. - */ -function disable(rotation) { - if (rotation !== undefined) { - return 0; - } - else { - return undefined; - } -} -/** - * @param {number|undefined} rotation Rotation. - * @return {number|undefined} Rotation. - */ -function none$1(rotation) { - if (rotation !== undefined) { - return rotation; - } - else { - return undefined; - } -} -/** - * @param {number} n N. - * @return {Type} Rotation constraint. - */ -function createSnapToN(n) { - var theta = (2 * Math.PI) / n; - return ( - /** - * @param {number|undefined} rotation Rotation. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. - * @return {number|undefined} Rotation. - */ - function (rotation, opt_isMoving) { - if (opt_isMoving) { - return rotation; - } - if (rotation !== undefined) { - rotation = Math.floor(rotation / theta + 0.5) * theta; - return rotation; - } - else { - return undefined; - } - }); -} -/** - * @param {number=} opt_tolerance Tolerance. - * @return {Type} Rotation constraint. - */ -function createSnapToZero(opt_tolerance) { - var tolerance = opt_tolerance || toRadians(5); - return ( - /** - * @param {number|undefined} rotation Rotation. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. - * @return {number|undefined} Rotation. - */ - function (rotation, opt_isMoving) { - if (opt_isMoving) { - return rotation; - } - if (rotation !== undefined) { - if (Math.abs(rotation) <= tolerance) { - return 0; - } - else { - return rotation; - } - } - else { - return undefined; - } - }); -} - -/** - * @module ol/easing - */ -/** - * Start slow and speed up. - * @param {number} t Input between 0 and 1. - * @return {number} Output between 0 and 1. - * @api - */ -function easeIn(t) { - return Math.pow(t, 3); -} -/** - * Start fast and slow down. - * @param {number} t Input between 0 and 1. - * @return {number} Output between 0 and 1. - * @api - */ -function easeOut(t) { - return 1 - easeIn(1 - t); -} -/** - * Start slow, speed up, and then slow down again. - * @param {number} t Input between 0 and 1. - * @return {number} Output between 0 and 1. - * @api - */ -function inAndOut(t) { - return 3 * t * t - 2 * t * t * t; -} -/** - * Maintain a constant speed over time. - * @param {number} t Input between 0 and 1. - * @return {number} Output between 0 and 1. - * @api - */ -function linear(t) { - return t; -} - -/** - * @module ol/geom/GeometryLayout - */ -/** - * The coordinate layout for geometries, indicating whether a 3rd or 4th z ('Z') - * or measure ('M') coordinate is available. Supported values are `'XY'`, - * `'XYZ'`, `'XYM'`, `'XYZM'`. - * @enum {string} - */ -var GeometryLayout = { - XY: 'XY', - XYZ: 'XYZ', - XYM: 'XYM', - XYZM: 'XYZM', -}; - -/** - * @module ol/transform - */ -/** - * An array representing an affine 2d transformation for use with - * {@link module:ol/transform} functions. The array has 6 elements. - * @typedef {!Array} Transform - * @api - */ -/** - * Collection of affine 2d transformation functions. The functions work on an - * array of 6 elements. The element order is compatible with the [SVGMatrix - * interface](https://developer.mozilla.org/en-US/docs/Web/API/SVGMatrix) and is - * a subset (elements a to f) of a 3×3 matrix: - * ``` - * [ a c e ] - * [ b d f ] - * [ 0 0 1 ] - * ``` - */ -/** - * @private - * @type {Transform} - */ -var tmp_ = new Array(6); -/** - * Create an identity transform. - * @return {!Transform} Identity transform. - */ -function create() { - return [1, 0, 0, 1, 0, 0]; -} -/** - * Transforms the given coordinate with the given transform returning the - * resulting, transformed coordinate. The coordinate will be modified in-place. - * - * @param {Transform} transform The transformation. - * @param {import("./coordinate.js").Coordinate|import("./pixel.js").Pixel} coordinate The coordinate to transform. - * @return {import("./coordinate.js").Coordinate|import("./pixel.js").Pixel} return coordinate so that operations can be - * chained together. - */ -function apply(transform, coordinate) { - var x = coordinate[0]; - var y = coordinate[1]; - coordinate[0] = transform[0] * x + transform[2] * y + transform[4]; - coordinate[1] = transform[1] * x + transform[3] * y + transform[5]; - return coordinate; -} -/** - * Creates a composite transform given an initial translation, scale, rotation, and - * final translation (in that order only, not commutative). - * @param {!Transform} transform The transform (will be modified in place). - * @param {number} dx1 Initial translation x. - * @param {number} dy1 Initial translation y. - * @param {number} sx Scale factor x. - * @param {number} sy Scale factor y. - * @param {number} angle Rotation (in counter-clockwise radians). - * @param {number} dx2 Final translation x. - * @param {number} dy2 Final translation y. - * @return {!Transform} The composite transform. - */ -function compose(transform, dx1, dy1, sx, sy, angle, dx2, dy2) { - var sin = Math.sin(angle); - var cos = Math.cos(angle); - transform[0] = sx * cos; - transform[1] = sy * sin; - transform[2] = -sx * sin; - transform[3] = sy * cos; - transform[4] = dx2 * sx * cos - dy2 * sx * sin + dx1; - transform[5] = dx2 * sy * sin + dy2 * sy * cos + dy1; - return transform; -} -/** - * Invert the given transform. - * @param {!Transform} target Transform to be set as the inverse of - * the source transform. - * @param {!Transform} source The source transform to invert. - * @return {!Transform} The inverted (target) transform. - */ -function makeInverse(target, source) { - var det = determinant(source); - assert(det !== 0, 32); // Transformation matrix cannot be inverted - var a = source[0]; - var b = source[1]; - var c = source[2]; - var d = source[3]; - var e = source[4]; - var f = source[5]; - target[0] = d / det; - target[1] = -b / det; - target[2] = -c / det; - target[3] = a / det; - target[4] = (c * f - d * e) / det; - target[5] = -(a * f - b * e) / det; - return target; -} -/** - * Returns the determinant of the given matrix. - * @param {!Transform} mat Matrix. - * @return {number} Determinant. - */ -function determinant(mat) { - return mat[0] * mat[3] - mat[1] * mat[2]; -} -/** - * A string version of the transform. This can be used - * for CSS transforms. - * @param {!Transform} mat Matrix. - * @return {string} The transform as a string. - */ -function toString(mat) { - return 'matrix(' + mat.join(', ') + ')'; -} - -/** - * @module ol/geom/flat/transform - */ -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {import("../../transform.js").Transform} transform Transform. - * @param {Array=} opt_dest Destination. - * @return {Array} Transformed coordinates. - */ -function transform2D(flatCoordinates, offset, end, stride, transform, opt_dest) { - var dest = opt_dest ? opt_dest : []; - var i = 0; - for (var j = offset; j < end; j += stride) { - var x = flatCoordinates[j]; - var y = flatCoordinates[j + 1]; - dest[i++] = transform[0] * x + transform[2] * y + transform[4]; - dest[i++] = transform[1] * x + transform[3] * y + transform[5]; - } - if (opt_dest && dest.length != i) { - dest.length = i; - } - return dest; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {number} angle Angle. - * @param {Array} anchor Rotation anchor point. - * @param {Array=} opt_dest Destination. - * @return {Array} Transformed coordinates. - */ -function rotate$1(flatCoordinates, offset, end, stride, angle, anchor, opt_dest) { - var dest = opt_dest ? opt_dest : []; - var cos = Math.cos(angle); - var sin = Math.sin(angle); - var anchorX = anchor[0]; - var anchorY = anchor[1]; - var i = 0; - for (var j = offset; j < end; j += stride) { - var deltaX = flatCoordinates[j] - anchorX; - var deltaY = flatCoordinates[j + 1] - anchorY; - dest[i++] = anchorX + deltaX * cos - deltaY * sin; - dest[i++] = anchorY + deltaX * sin + deltaY * cos; - for (var k = j + 2; k < j + stride; ++k) { - dest[i++] = flatCoordinates[k]; - } - } - if (opt_dest && dest.length != i) { - dest.length = i; - } - return dest; -} -/** - * Scale the coordinates. - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {number} sx Scale factor in the x-direction. - * @param {number} sy Scale factor in the y-direction. - * @param {Array} anchor Scale anchor point. - * @param {Array=} opt_dest Destination. - * @return {Array} Transformed coordinates. - */ -function scale$1(flatCoordinates, offset, end, stride, sx, sy, anchor, opt_dest) { - var dest = opt_dest ? opt_dest : []; - var anchorX = anchor[0]; - var anchorY = anchor[1]; - var i = 0; - for (var j = offset; j < end; j += stride) { - var deltaX = flatCoordinates[j] - anchorX; - var deltaY = flatCoordinates[j + 1] - anchorY; - dest[i++] = anchorX + sx * deltaX; - dest[i++] = anchorY + sy * deltaY; - for (var k = j + 2; k < j + stride; ++k) { - dest[i++] = flatCoordinates[k]; - } - } - if (opt_dest && dest.length != i) { - dest.length = i; - } - return dest; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {number} deltaX Delta X. - * @param {number} deltaY Delta Y. - * @param {Array=} opt_dest Destination. - * @return {Array} Transformed coordinates. - */ -function translate(flatCoordinates, offset, end, stride, deltaX, deltaY, opt_dest) { - var dest = opt_dest ? opt_dest : []; - var i = 0; - for (var j = offset; j < end; j += stride) { - dest[i++] = flatCoordinates[j] + deltaX; - dest[i++] = flatCoordinates[j + 1] + deltaY; - for (var k = j + 2; k < j + stride; ++k) { - dest[i++] = flatCoordinates[k]; - } - } - if (opt_dest && dest.length != i) { - dest.length = i; - } - return dest; -} - -var __extends$6 = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @type {import("../transform.js").Transform} - */ -var tmpTransform = create(); -/** - * @classdesc - * Abstract base class; normally only used for creating subclasses and not - * instantiated in apps. - * Base class for vector geometries. - * - * To get notified of changes to the geometry, register a listener for the - * generic `change` event on your geometry instance. - * - * @abstract - * @api - */ -var Geometry = /** @class */ (function (_super) { - __extends$6(Geometry, _super); - function Geometry() { - var _this = _super.call(this) || this; - /** - * @private - * @type {import("../extent.js").Extent} - */ - _this.extent_ = createEmpty(); - /** - * @private - * @type {number} - */ - _this.extentRevision_ = -1; - /** - * @protected - * @type {number} - */ - _this.simplifiedGeometryMaxMinSquaredTolerance = 0; - /** - * @protected - * @type {number} - */ - _this.simplifiedGeometryRevision = 0; - /** - * Get a transformed and simplified version of the geometry. - * @abstract - * @param {number} revision The geometry revision. - * @param {number} squaredTolerance Squared tolerance. - * @param {import("../proj.js").TransformFunction} [opt_transform] Optional transform function. - * @return {Geometry} Simplified geometry. - */ - _this.simplifyTransformedInternal = memoizeOne(function (revision, squaredTolerance, opt_transform) { - if (!opt_transform) { - return this.getSimplifiedGeometry(squaredTolerance); - } - var clone = this.clone(); - clone.applyTransform(opt_transform); - return clone.getSimplifiedGeometry(squaredTolerance); - }); - return _this; - } - /** - * Get a transformed and simplified version of the geometry. - * @abstract - * @param {number} squaredTolerance Squared tolerance. - * @param {import("../proj.js").TransformFunction} [opt_transform] Optional transform function. - * @return {Geometry} Simplified geometry. - */ - Geometry.prototype.simplifyTransformed = function (squaredTolerance, opt_transform) { - return this.simplifyTransformedInternal(this.getRevision(), squaredTolerance, opt_transform); - }; - /** - * Make a complete copy of the geometry. - * @abstract - * @return {!Geometry} Clone. - */ - Geometry.prototype.clone = function () { - return abstract(); - }; - /** - * @abstract - * @param {number} x X. - * @param {number} y Y. - * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. - * @param {number} minSquaredDistance Minimum squared distance. - * @return {number} Minimum squared distance. - */ - Geometry.prototype.closestPointXY = function (x, y, closestPoint, minSquaredDistance) { - return abstract(); - }; - /** - * @param {number} x X. - * @param {number} y Y. - * @return {boolean} Contains (x, y). - */ - Geometry.prototype.containsXY = function (x, y) { - var coord = this.getClosestPoint([x, y]); - return coord[0] === x && coord[1] === y; - }; - /** - * Return the closest point of the geometry to the passed point as - * {@link module:ol/coordinate~Coordinate coordinate}. - * @param {import("../coordinate.js").Coordinate} point Point. - * @param {import("../coordinate.js").Coordinate=} opt_closestPoint Closest point. - * @return {import("../coordinate.js").Coordinate} Closest point. - * @api - */ - Geometry.prototype.getClosestPoint = function (point, opt_closestPoint) { - var closestPoint = opt_closestPoint ? opt_closestPoint : [NaN, NaN]; - this.closestPointXY(point[0], point[1], closestPoint, Infinity); - return closestPoint; - }; - /** - * Returns true if this geometry includes the specified coordinate. If the - * coordinate is on the boundary of the geometry, returns false. - * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. - * @return {boolean} Contains coordinate. - * @api - */ - Geometry.prototype.intersectsCoordinate = function (coordinate) { - return this.containsXY(coordinate[0], coordinate[1]); - }; - /** - * @abstract - * @param {import("../extent.js").Extent} extent Extent. - * @protected - * @return {import("../extent.js").Extent} extent Extent. - */ - Geometry.prototype.computeExtent = function (extent) { - return abstract(); - }; - /** - * Get the extent of the geometry. - * @param {import("../extent.js").Extent=} opt_extent Extent. - * @return {import("../extent.js").Extent} extent Extent. - * @api - */ - Geometry.prototype.getExtent = function (opt_extent) { - if (this.extentRevision_ != this.getRevision()) { - var extent = this.computeExtent(this.extent_); - if (isNaN(extent[0]) || isNaN(extent[1])) { - createOrUpdateEmpty(extent); - } - this.extentRevision_ = this.getRevision(); - } - return returnOrUpdate(this.extent_, opt_extent); - }; - /** - * Rotate the geometry around a given coordinate. This modifies the geometry - * coordinates in place. - * @abstract - * @param {number} angle Rotation angle in radians. - * @param {import("../coordinate.js").Coordinate} anchor The rotation center. - * @api - */ - Geometry.prototype.rotate = function (angle, anchor) { - abstract(); - }; - /** - * Scale the geometry (with an optional origin). This modifies the geometry - * coordinates in place. - * @abstract - * @param {number} sx The scaling factor in the x-direction. - * @param {number=} opt_sy The scaling factor in the y-direction (defaults to sx). - * @param {import("../coordinate.js").Coordinate=} opt_anchor The scale origin (defaults to the center - * of the geometry extent). - * @api - */ - Geometry.prototype.scale = function (sx, opt_sy, opt_anchor) { - abstract(); - }; - /** - * Create a simplified version of this geometry. For linestrings, this uses - * the [Douglas Peucker](https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm) - * algorithm. For polygons, a quantization-based - * simplification is used to preserve topology. - * @param {number} tolerance The tolerance distance for simplification. - * @return {Geometry} A new, simplified version of the original geometry. - * @api - */ - Geometry.prototype.simplify = function (tolerance) { - return this.getSimplifiedGeometry(tolerance * tolerance); - }; - /** - * Create a simplified version of this geometry using the Douglas Peucker - * algorithm. - * See https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm. - * @abstract - * @param {number} squaredTolerance Squared tolerance. - * @return {Geometry} Simplified geometry. - */ - Geometry.prototype.getSimplifiedGeometry = function (squaredTolerance) { - return abstract(); - }; - /** - * Get the type of this geometry. - * @abstract - * @return {import("./GeometryType.js").default} Geometry type. - */ - Geometry.prototype.getType = function () { - return abstract(); - }; - /** - * Apply a transform function to the coordinates of the geometry. - * The geometry is modified in place. - * If you do not want the geometry modified in place, first `clone()` it and - * then use this function on the clone. - * @abstract - * @param {import("../proj.js").TransformFunction} transformFn Transform function. - * Called with a flat array of geometry coordinates. - */ - Geometry.prototype.applyTransform = function (transformFn) { - abstract(); - }; - /** - * Test if the geometry and the passed extent intersect. - * @abstract - * @param {import("../extent.js").Extent} extent Extent. - * @return {boolean} `true` if the geometry and the extent intersect. - */ - Geometry.prototype.intersectsExtent = function (extent) { - return abstract(); - }; - /** - * Translate the geometry. This modifies the geometry coordinates in place. If - * instead you want a new geometry, first `clone()` this geometry. - * @abstract - * @param {number} deltaX Delta X. - * @param {number} deltaY Delta Y. - * @api - */ - Geometry.prototype.translate = function (deltaX, deltaY) { - abstract(); - }; - /** - * Transform each coordinate of the geometry from one coordinate reference - * system to another. The geometry is modified in place. - * For example, a line will be transformed to a line and a circle to a circle. - * If you do not want the geometry modified in place, first `clone()` it and - * then use this function on the clone. - * - * @param {import("../proj.js").ProjectionLike} source The current projection. Can be a - * string identifier or a {@link module:ol/proj/Projection~Projection} object. - * @param {import("../proj.js").ProjectionLike} destination The desired projection. Can be a - * string identifier or a {@link module:ol/proj/Projection~Projection} object. - * @return {Geometry} This geometry. Note that original geometry is - * modified in place. - * @api - */ - Geometry.prototype.transform = function (source, destination) { - /** @type {import("../proj/Projection.js").default} */ - var sourceProj = get$2(source); - var transformFn = sourceProj.getUnits() == Units.TILE_PIXELS - ? function (inCoordinates, outCoordinates, stride) { - var pixelExtent = sourceProj.getExtent(); - var projectedExtent = sourceProj.getWorldExtent(); - var scale = getHeight(projectedExtent) / getHeight(pixelExtent); - compose(tmpTransform, projectedExtent[0], projectedExtent[3], scale, -scale, 0, 0, 0); - transform2D(inCoordinates, 0, inCoordinates.length, stride, tmpTransform, outCoordinates); - return getTransform(sourceProj, destination)(inCoordinates, outCoordinates, stride); - } - : getTransform(sourceProj, destination); - this.applyTransform(transformFn); - return this; - }; - return Geometry; -}(BaseObject)); - -var __extends$7 = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @classdesc - * Abstract base class; only used for creating subclasses; do not instantiate - * in apps, as cannot be rendered. - * - * @abstract - * @api - */ -var SimpleGeometry = /** @class */ (function (_super) { - __extends$7(SimpleGeometry, _super); - function SimpleGeometry() { - var _this = _super.call(this) || this; - /** - * @protected - * @type {import("./GeometryLayout.js").default} - */ - _this.layout = GeometryLayout.XY; - /** - * @protected - * @type {number} - */ - _this.stride = 2; - /** - * @protected - * @type {Array} - */ - _this.flatCoordinates = null; - return _this; - } - /** - * @param {import("../extent.js").Extent} extent Extent. - * @protected - * @return {import("../extent.js").Extent} extent Extent. - */ - SimpleGeometry.prototype.computeExtent = function (extent) { - return createOrUpdateFromFlatCoordinates(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, extent); - }; - /** - * @abstract - * @return {Array<*>} Coordinates. - */ - SimpleGeometry.prototype.getCoordinates = function () { - return abstract(); - }; - /** - * Return the first coordinate of the geometry. - * @return {import("../coordinate.js").Coordinate} First coordinate. - * @api - */ - SimpleGeometry.prototype.getFirstCoordinate = function () { - return this.flatCoordinates.slice(0, this.stride); - }; - /** - * @return {Array} Flat coordinates. - */ - SimpleGeometry.prototype.getFlatCoordinates = function () { - return this.flatCoordinates; - }; - /** - * Return the last coordinate of the geometry. - * @return {import("../coordinate.js").Coordinate} Last point. - * @api - */ - SimpleGeometry.prototype.getLastCoordinate = function () { - return this.flatCoordinates.slice(this.flatCoordinates.length - this.stride); - }; - /** - * Return the {@link module:ol/geom/GeometryLayout layout} of the geometry. - * @return {import("./GeometryLayout.js").default} Layout. - * @api - */ - SimpleGeometry.prototype.getLayout = function () { - return this.layout; - }; - /** - * Create a simplified version of this geometry using the Douglas Peucker algorithm. - * @param {number} squaredTolerance Squared tolerance. - * @return {SimpleGeometry} Simplified geometry. - */ - SimpleGeometry.prototype.getSimplifiedGeometry = function (squaredTolerance) { - if (this.simplifiedGeometryRevision !== this.getRevision()) { - this.simplifiedGeometryMaxMinSquaredTolerance = 0; - this.simplifiedGeometryRevision = this.getRevision(); - } - // If squaredTolerance is negative or if we know that simplification will not - // have any effect then just return this. - if (squaredTolerance < 0 || - (this.simplifiedGeometryMaxMinSquaredTolerance !== 0 && - squaredTolerance <= this.simplifiedGeometryMaxMinSquaredTolerance)) { - return this; - } - var simplifiedGeometry = this.getSimplifiedGeometryInternal(squaredTolerance); - var simplifiedFlatCoordinates = simplifiedGeometry.getFlatCoordinates(); - if (simplifiedFlatCoordinates.length < this.flatCoordinates.length) { - return simplifiedGeometry; - } - else { - // Simplification did not actually remove any coordinates. We now know - // that any calls to getSimplifiedGeometry with a squaredTolerance less - // than or equal to the current squaredTolerance will also not have any - // effect. This allows us to short circuit simplification (saving CPU - // cycles) and prevents the cache of simplified geometries from filling - // up with useless identical copies of this geometry (saving memory). - this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance; - return this; - } - }; - /** - * @param {number} squaredTolerance Squared tolerance. - * @return {SimpleGeometry} Simplified geometry. - * @protected - */ - SimpleGeometry.prototype.getSimplifiedGeometryInternal = function (squaredTolerance) { - return this; - }; - /** - * @return {number} Stride. - */ - SimpleGeometry.prototype.getStride = function () { - return this.stride; - }; - /** - * @param {import("./GeometryLayout.js").default} layout Layout. - * @param {Array} flatCoordinates Flat coordinates. - */ - SimpleGeometry.prototype.setFlatCoordinates = function (layout, flatCoordinates) { - this.stride = getStrideForLayout(layout); - this.layout = layout; - this.flatCoordinates = flatCoordinates; - }; - /** - * @abstract - * @param {!Array<*>} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. - */ - SimpleGeometry.prototype.setCoordinates = function (coordinates, opt_layout) { - abstract(); - }; - /** - * @param {import("./GeometryLayout.js").default|undefined} layout Layout. - * @param {Array<*>} coordinates Coordinates. - * @param {number} nesting Nesting. - * @protected - */ - SimpleGeometry.prototype.setLayout = function (layout, coordinates, nesting) { - /** @type {number} */ - var stride; - if (layout) { - stride = getStrideForLayout(layout); - } - else { - for (var i = 0; i < nesting; ++i) { - if (coordinates.length === 0) { - this.layout = GeometryLayout.XY; - this.stride = 2; - return; - } - else { - coordinates = /** @type {Array} */ (coordinates[0]); - } - } - stride = coordinates.length; - layout = getLayoutForStride(stride); - } - this.layout = layout; - this.stride = stride; - }; - /** - * Apply a transform function to the coordinates of the geometry. - * The geometry is modified in place. - * If you do not want the geometry modified in place, first `clone()` it and - * then use this function on the clone. - * @param {import("../proj.js").TransformFunction} transformFn Transform function. - * Called with a flat array of geometry coordinates. - * @api - */ - SimpleGeometry.prototype.applyTransform = function (transformFn) { - if (this.flatCoordinates) { - transformFn(this.flatCoordinates, this.flatCoordinates, this.stride); - this.changed(); - } - }; - /** - * Rotate the geometry around a given coordinate. This modifies the geometry - * coordinates in place. - * @param {number} angle Rotation angle in counter-clockwise radians. - * @param {import("../coordinate.js").Coordinate} anchor The rotation center. - * @api - */ - SimpleGeometry.prototype.rotate = function (angle, anchor) { - var flatCoordinates = this.getFlatCoordinates(); - if (flatCoordinates) { - var stride = this.getStride(); - rotate$1(flatCoordinates, 0, flatCoordinates.length, stride, angle, anchor, flatCoordinates); - this.changed(); - } - }; - /** - * Scale the geometry (with an optional origin). This modifies the geometry - * coordinates in place. - * @param {number} sx The scaling factor in the x-direction. - * @param {number=} opt_sy The scaling factor in the y-direction (defaults to sx). - * @param {import("../coordinate.js").Coordinate=} opt_anchor The scale origin (defaults to the center - * of the geometry extent). - * @api - */ - SimpleGeometry.prototype.scale = function (sx, opt_sy, opt_anchor) { - var sy = opt_sy; - if (sy === undefined) { - sy = sx; - } - var anchor = opt_anchor; - if (!anchor) { - anchor = getCenter(this.getExtent()); - } - var flatCoordinates = this.getFlatCoordinates(); - if (flatCoordinates) { - var stride = this.getStride(); - scale$1(flatCoordinates, 0, flatCoordinates.length, stride, sx, sy, anchor, flatCoordinates); - this.changed(); - } - }; - /** - * Translate the geometry. This modifies the geometry coordinates in place. If - * instead you want a new geometry, first `clone()` this geometry. - * @param {number} deltaX Delta X. - * @param {number} deltaY Delta Y. - * @api - */ - SimpleGeometry.prototype.translate = function (deltaX, deltaY) { - var flatCoordinates = this.getFlatCoordinates(); - if (flatCoordinates) { - var stride = this.getStride(); - translate(flatCoordinates, 0, flatCoordinates.length, stride, deltaX, deltaY, flatCoordinates); - this.changed(); - } - }; - return SimpleGeometry; -}(Geometry)); -/** - * @param {number} stride Stride. - * @return {import("./GeometryLayout.js").default} layout Layout. - */ -function getLayoutForStride(stride) { - var layout; - if (stride == 2) { - layout = GeometryLayout.XY; - } - else if (stride == 3) { - layout = GeometryLayout.XYZ; - } - else if (stride == 4) { - layout = GeometryLayout.XYZM; - } - return /** @type {import("./GeometryLayout.js").default} */ (layout); -} -/** - * @param {import("./GeometryLayout.js").default} layout Layout. - * @return {number} Stride. - */ -function getStrideForLayout(layout) { - var stride; - if (layout == GeometryLayout.XY) { - stride = 2; - } - else if (layout == GeometryLayout.XYZ || layout == GeometryLayout.XYM) { - stride = 3; - } - else if (layout == GeometryLayout.XYZM) { - stride = 4; - } - return /** @type {number} */ (stride); -} - -/** - * @module ol/geom/flat/closest - */ -/** - * Returns the point on the 2D line segment flatCoordinates[offset1] to - * flatCoordinates[offset2] that is closest to the point (x, y). Extra - * dimensions are linearly interpolated. - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset1 Offset 1. - * @param {number} offset2 Offset 2. - * @param {number} stride Stride. - * @param {number} x X. - * @param {number} y Y. - * @param {Array} closestPoint Closest point. - */ -function assignClosest(flatCoordinates, offset1, offset2, stride, x, y, closestPoint) { - var x1 = flatCoordinates[offset1]; - var y1 = flatCoordinates[offset1 + 1]; - var dx = flatCoordinates[offset2] - x1; - var dy = flatCoordinates[offset2 + 1] - y1; - var offset; - if (dx === 0 && dy === 0) { - offset = offset1; - } - else { - var t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy); - if (t > 1) { - offset = offset2; - } - else if (t > 0) { - for (var i = 0; i < stride; ++i) { - closestPoint[i] = lerp(flatCoordinates[offset1 + i], flatCoordinates[offset2 + i], t); - } - closestPoint.length = stride; - return; - } - else { - offset = offset1; - } - } - for (var i = 0; i < stride; ++i) { - closestPoint[i] = flatCoordinates[offset + i]; - } - closestPoint.length = stride; -} -/** - * Return the squared of the largest distance between any pair of consecutive - * coordinates. - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {number} max Max squared delta. - * @return {number} Max squared delta. - */ -function maxSquaredDelta(flatCoordinates, offset, end, stride, max) { - var x1 = flatCoordinates[offset]; - var y1 = flatCoordinates[offset + 1]; - for (offset += stride; offset < end; offset += stride) { - var x2 = flatCoordinates[offset]; - var y2 = flatCoordinates[offset + 1]; - var squaredDelta = squaredDistance(x1, y1, x2, y2); - if (squaredDelta > max) { - max = squaredDelta; - } - x1 = x2; - y1 = y2; - } - return max; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array} ends Ends. - * @param {number} stride Stride. - * @param {number} max Max squared delta. - * @return {number} Max squared delta. - */ -function arrayMaxSquaredDelta(flatCoordinates, offset, ends, stride, max) { - for (var i = 0, ii = ends.length; i < ii; ++i) { - var end = ends[i]; - max = maxSquaredDelta(flatCoordinates, offset, end, stride, max); - offset = end; - } - return max; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {number} maxDelta Max delta. - * @param {boolean} isRing Is ring. - * @param {number} x X. - * @param {number} y Y. - * @param {Array} closestPoint Closest point. - * @param {number} minSquaredDistance Minimum squared distance. - * @param {Array=} opt_tmpPoint Temporary point object. - * @return {number} Minimum squared distance. - */ -function assignClosestPoint(flatCoordinates, offset, end, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, opt_tmpPoint) { - if (offset == end) { - return minSquaredDistance; - } - var i, squaredDistance$1; - if (maxDelta === 0) { - // All points are identical, so just test the first point. - squaredDistance$1 = squaredDistance(x, y, flatCoordinates[offset], flatCoordinates[offset + 1]); - if (squaredDistance$1 < minSquaredDistance) { - for (i = 0; i < stride; ++i) { - closestPoint[i] = flatCoordinates[offset + i]; - } - closestPoint.length = stride; - return squaredDistance$1; - } - else { - return minSquaredDistance; - } - } - var tmpPoint = opt_tmpPoint ? opt_tmpPoint : [NaN, NaN]; - var index = offset + stride; - while (index < end) { - assignClosest(flatCoordinates, index - stride, index, stride, x, y, tmpPoint); - squaredDistance$1 = squaredDistance(x, y, tmpPoint[0], tmpPoint[1]); - if (squaredDistance$1 < minSquaredDistance) { - minSquaredDistance = squaredDistance$1; - for (i = 0; i < stride; ++i) { - closestPoint[i] = tmpPoint[i]; - } - closestPoint.length = stride; - index += stride; - } - else { - // Skip ahead multiple points, because we know that all the skipped - // points cannot be any closer than the closest point we have found so - // far. We know this because we know how close the current point is, how - // close the closest point we have found so far is, and the maximum - // distance between consecutive points. For example, if we're currently - // at distance 10, the best we've found so far is 3, and that the maximum - // distance between consecutive points is 2, then we'll need to skip at - // least (10 - 3) / 2 == 3 (rounded down) points to have any chance of - // finding a closer point. We use Math.max(..., 1) to ensure that we - // always advance at least one point, to avoid an infinite loop. - index += - stride * - Math.max(((Math.sqrt(squaredDistance$1) - Math.sqrt(minSquaredDistance)) / - maxDelta) | - 0, 1); - } - } - if (isRing) { - // Check the closing segment. - assignClosest(flatCoordinates, end - stride, offset, stride, x, y, tmpPoint); - squaredDistance$1 = squaredDistance(x, y, tmpPoint[0], tmpPoint[1]); - if (squaredDistance$1 < minSquaredDistance) { - minSquaredDistance = squaredDistance$1; - for (i = 0; i < stride; ++i) { - closestPoint[i] = tmpPoint[i]; - } - closestPoint.length = stride; - } - } - return minSquaredDistance; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array} ends Ends. - * @param {number} stride Stride. - * @param {number} maxDelta Max delta. - * @param {boolean} isRing Is ring. - * @param {number} x X. - * @param {number} y Y. - * @param {Array} closestPoint Closest point. - * @param {number} minSquaredDistance Minimum squared distance. - * @param {Array=} opt_tmpPoint Temporary point object. - * @return {number} Minimum squared distance. - */ -function assignClosestArrayPoint(flatCoordinates, offset, ends, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, opt_tmpPoint) { - var tmpPoint = opt_tmpPoint ? opt_tmpPoint : [NaN, NaN]; - for (var i = 0, ii = ends.length; i < ii; ++i) { - var end = ends[i]; - minSquaredDistance = assignClosestPoint(flatCoordinates, offset, end, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint); - offset = end; - } - return minSquaredDistance; -} - -/** - * @module ol/geom/flat/deflate - */ -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {import("../../coordinate.js").Coordinate} coordinate Coordinate. - * @param {number} stride Stride. - * @return {number} offset Offset. - */ -function deflateCoordinate(flatCoordinates, offset, coordinate, stride) { - for (var i = 0, ii = coordinate.length; i < ii; ++i) { - flatCoordinates[offset++] = coordinate[i]; - } - return offset; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array} coordinates Coordinates. - * @param {number} stride Stride. - * @return {number} offset Offset. - */ -function deflateCoordinates(flatCoordinates, offset, coordinates, stride) { - for (var i = 0, ii = coordinates.length; i < ii; ++i) { - var coordinate = coordinates[i]; - for (var j = 0; j < stride; ++j) { - flatCoordinates[offset++] = coordinate[j]; - } - } - return offset; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array>} coordinatess Coordinatess. - * @param {number} stride Stride. - * @param {Array=} opt_ends Ends. - * @return {Array} Ends. - */ -function deflateCoordinatesArray(flatCoordinates, offset, coordinatess, stride, opt_ends) { - var ends = opt_ends ? opt_ends : []; - var i = 0; - for (var j = 0, jj = coordinatess.length; j < jj; ++j) { - var end = deflateCoordinates(flatCoordinates, offset, coordinatess[j], stride); - ends[i++] = end; - offset = end; - } - ends.length = i; - return ends; -} - -/** - * @module ol/geom/flat/simplify - */ -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {number} squaredTolerance Squared tolerance. - * @param {Array} simplifiedFlatCoordinates Simplified flat - * coordinates. - * @param {number} simplifiedOffset Simplified offset. - * @return {number} Simplified offset. - */ -function douglasPeucker(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) { - var n = (end - offset) / stride; - if (n < 3) { - for (; offset < end; offset += stride) { - simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset]; - simplifiedFlatCoordinates[simplifiedOffset++] = - flatCoordinates[offset + 1]; - } - return simplifiedOffset; - } - /** @type {Array} */ - var markers = new Array(n); - markers[0] = 1; - markers[n - 1] = 1; - /** @type {Array} */ - var stack = [offset, end - stride]; - var index = 0; - while (stack.length > 0) { - var last = stack.pop(); - var first = stack.pop(); - var maxSquaredDistance = 0; - var x1 = flatCoordinates[first]; - var y1 = flatCoordinates[first + 1]; - var x2 = flatCoordinates[last]; - var y2 = flatCoordinates[last + 1]; - for (var i = first + stride; i < last; i += stride) { - var x = flatCoordinates[i]; - var y = flatCoordinates[i + 1]; - var squaredDistance_1 = squaredSegmentDistance(x, y, x1, y1, x2, y2); - if (squaredDistance_1 > maxSquaredDistance) { - index = i; - maxSquaredDistance = squaredDistance_1; - } - } - if (maxSquaredDistance > squaredTolerance) { - markers[(index - offset) / stride] = 1; - if (first + stride < index) { - stack.push(first, index); - } - if (index + stride < last) { - stack.push(index, last); - } - } - } - for (var i = 0; i < n; ++i) { - if (markers[i]) { - simplifiedFlatCoordinates[simplifiedOffset++] = - flatCoordinates[offset + i * stride]; - simplifiedFlatCoordinates[simplifiedOffset++] = - flatCoordinates[offset + i * stride + 1]; - } - } - return simplifiedOffset; -} -/** - * @param {number} value Value. - * @param {number} tolerance Tolerance. - * @return {number} Rounded value. - */ -function snap(value, tolerance) { - return tolerance * Math.round(value / tolerance); -} -/** - * Simplifies a line string using an algorithm designed by Tim Schaub. - * Coordinates are snapped to the nearest value in a virtual grid and - * consecutive duplicate coordinates are discarded. This effectively preserves - * topology as the simplification of any subsection of a line string is - * independent of the rest of the line string. This means that, for examples, - * the common edge between two polygons will be simplified to the same line - * string independently in both polygons. This implementation uses a single - * pass over the coordinates and eliminates intermediate collinear points. - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {number} tolerance Tolerance. - * @param {Array} simplifiedFlatCoordinates Simplified flat - * coordinates. - * @param {number} simplifiedOffset Simplified offset. - * @return {number} Simplified offset. - */ -function quantize(flatCoordinates, offset, end, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset) { - // do nothing if the line is empty - if (offset == end) { - return simplifiedOffset; - } - // snap the first coordinate (P1) - var x1 = snap(flatCoordinates[offset], tolerance); - var y1 = snap(flatCoordinates[offset + 1], tolerance); - offset += stride; - // add the first coordinate to the output - simplifiedFlatCoordinates[simplifiedOffset++] = x1; - simplifiedFlatCoordinates[simplifiedOffset++] = y1; - // find the next coordinate that does not snap to the same value as the first - // coordinate (P2) - var x2, y2; - do { - x2 = snap(flatCoordinates[offset], tolerance); - y2 = snap(flatCoordinates[offset + 1], tolerance); - offset += stride; - if (offset == end) { - // all coordinates snap to the same value, the line collapses to a point - // push the last snapped value anyway to ensure that the output contains - // at least two points - // FIXME should we really return at least two points anyway? - simplifiedFlatCoordinates[simplifiedOffset++] = x2; - simplifiedFlatCoordinates[simplifiedOffset++] = y2; - return simplifiedOffset; - } - } while (x2 == x1 && y2 == y1); - while (offset < end) { - // snap the next coordinate (P3) - var x3 = snap(flatCoordinates[offset], tolerance); - var y3 = snap(flatCoordinates[offset + 1], tolerance); - offset += stride; - // skip P3 if it is equal to P2 - if (x3 == x2 && y3 == y2) { - continue; - } - // calculate the delta between P1 and P2 - var dx1 = x2 - x1; - var dy1 = y2 - y1; - // calculate the delta between P3 and P1 - var dx2 = x3 - x1; - var dy2 = y3 - y1; - // if P1, P2, and P3 are colinear and P3 is further from P1 than P2 is from - // P1 in the same direction then P2 is on the straight line between P1 and - // P3 - if (dx1 * dy2 == dy1 * dx2 && - ((dx1 < 0 && dx2 < dx1) || dx1 == dx2 || (dx1 > 0 && dx2 > dx1)) && - ((dy1 < 0 && dy2 < dy1) || dy1 == dy2 || (dy1 > 0 && dy2 > dy1))) { - // discard P2 and set P2 = P3 - x2 = x3; - y2 = y3; - continue; - } - // either P1, P2, and P3 are not colinear, or they are colinear but P3 is - // between P3 and P1 or on the opposite half of the line to P2. add P2, - // and continue with P1 = P2 and P2 = P3 - simplifiedFlatCoordinates[simplifiedOffset++] = x2; - simplifiedFlatCoordinates[simplifiedOffset++] = y2; - x1 = x2; - y1 = y2; - x2 = x3; - y2 = y3; - } - // add the last point (P2) - simplifiedFlatCoordinates[simplifiedOffset++] = x2; - simplifiedFlatCoordinates[simplifiedOffset++] = y2; - return simplifiedOffset; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array} ends Ends. - * @param {number} stride Stride. - * @param {number} tolerance Tolerance. - * @param {Array} simplifiedFlatCoordinates Simplified flat - * coordinates. - * @param {number} simplifiedOffset Simplified offset. - * @param {Array} simplifiedEnds Simplified ends. - * @return {number} Simplified offset. - */ -function quantizeArray(flatCoordinates, offset, ends, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds) { - for (var i = 0, ii = ends.length; i < ii; ++i) { - var end = ends[i]; - simplifiedOffset = quantize(flatCoordinates, offset, end, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset); - simplifiedEnds.push(simplifiedOffset); - offset = end; - } - return simplifiedOffset; -} - -/** - * @module ol/geom/flat/inflate - */ -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {Array=} opt_coordinates Coordinates. - * @return {Array} Coordinates. - */ -function inflateCoordinates(flatCoordinates, offset, end, stride, opt_coordinates) { - var coordinates = opt_coordinates !== undefined ? opt_coordinates : []; - var i = 0; - for (var j = offset; j < end; j += stride) { - coordinates[i++] = flatCoordinates.slice(j, j + stride); - } - coordinates.length = i; - return coordinates; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array} ends Ends. - * @param {number} stride Stride. - * @param {Array>=} opt_coordinatess Coordinatess. - * @return {Array>} Coordinatess. - */ -function inflateCoordinatesArray(flatCoordinates, offset, ends, stride, opt_coordinatess) { - var coordinatess = opt_coordinatess !== undefined ? opt_coordinatess : []; - var i = 0; - for (var j = 0, jj = ends.length; j < jj; ++j) { - var end = ends[j]; - coordinatess[i++] = inflateCoordinates(flatCoordinates, offset, end, stride, coordinatess[i]); - offset = end; - } - coordinatess.length = i; - return coordinatess; -} - -/** - * @module ol/geom/flat/area - */ -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @return {number} Area. - */ -function linearRing(flatCoordinates, offset, end, stride) { - var twiceArea = 0; - var x1 = flatCoordinates[end - stride]; - var y1 = flatCoordinates[end - stride + 1]; - for (; offset < end; offset += stride) { - var x2 = flatCoordinates[offset]; - var y2 = flatCoordinates[offset + 1]; - twiceArea += y1 * x2 - x1 * y2; - x1 = x2; - y1 = y2; - } - return twiceArea / 2; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array} ends Ends. - * @param {number} stride Stride. - * @return {number} Area. - */ -function linearRings(flatCoordinates, offset, ends, stride) { - var area = 0; - for (var i = 0, ii = ends.length; i < ii; ++i) { - var end = ends[i]; - area += linearRing(flatCoordinates, offset, end, stride); - offset = end; - } - return area; -} - -var __extends$8 = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @classdesc - * Linear ring geometry. Only used as part of polygon; cannot be rendered - * on its own. - * - * @api - */ -var LinearRing = /** @class */ (function (_super) { - __extends$8(LinearRing, _super); - /** - * @param {Array|Array} coordinates Coordinates. - * For internal use, flat coordinates in combination with `opt_layout` are also accepted. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. - */ - function LinearRing(coordinates, opt_layout) { - var _this = _super.call(this) || this; - /** - * @private - * @type {number} - */ - _this.maxDelta_ = -1; - /** - * @private - * @type {number} - */ - _this.maxDeltaRevision_ = -1; - if (opt_layout !== undefined && !Array.isArray(coordinates[0])) { - _this.setFlatCoordinates(opt_layout, - /** @type {Array} */ (coordinates)); - } - else { - _this.setCoordinates( - /** @type {Array} */ (coordinates), opt_layout); - } - return _this; - } - /** - * Make a complete copy of the geometry. - * @return {!LinearRing} Clone. - * @api - */ - LinearRing.prototype.clone = function () { - return new LinearRing(this.flatCoordinates.slice(), this.layout); - }; - /** - * @param {number} x X. - * @param {number} y Y. - * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. - * @param {number} minSquaredDistance Minimum squared distance. - * @return {number} Minimum squared distance. - */ - LinearRing.prototype.closestPointXY = function (x, y, closestPoint, minSquaredDistance) { - if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) { - return minSquaredDistance; - } - if (this.maxDeltaRevision_ != this.getRevision()) { - this.maxDelta_ = Math.sqrt(maxSquaredDelta(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, 0)); - this.maxDeltaRevision_ = this.getRevision(); - } - return assignClosestPoint(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.maxDelta_, true, x, y, closestPoint, minSquaredDistance); - }; - /** - * Return the area of the linear ring on projected plane. - * @return {number} Area (on projected plane). - * @api - */ - LinearRing.prototype.getArea = function () { - return linearRing(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); - }; - /** - * Return the coordinates of the linear ring. - * @return {Array} Coordinates. - * @api - */ - LinearRing.prototype.getCoordinates = function () { - return inflateCoordinates(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); - }; - /** - * @param {number} squaredTolerance Squared tolerance. - * @return {LinearRing} Simplified LinearRing. - * @protected - */ - LinearRing.prototype.getSimplifiedGeometryInternal = function (squaredTolerance) { - var simplifiedFlatCoordinates = []; - simplifiedFlatCoordinates.length = douglasPeucker(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, squaredTolerance, simplifiedFlatCoordinates, 0); - return new LinearRing(simplifiedFlatCoordinates, GeometryLayout.XY); - }; - /** - * Get the type of this geometry. - * @return {import("./GeometryType.js").default} Geometry type. - * @api - */ - LinearRing.prototype.getType = function () { - return GeometryType.LINEAR_RING; - }; - /** - * Test if the geometry and the passed extent intersect. - * @param {import("../extent.js").Extent} extent Extent. - * @return {boolean} `true` if the geometry and the extent intersect. - * @api - */ - LinearRing.prototype.intersectsExtent = function (extent) { - return false; - }; - /** - * Set the coordinates of the linear ring. - * @param {!Array} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. - * @api - */ - LinearRing.prototype.setCoordinates = function (coordinates, opt_layout) { - this.setLayout(opt_layout, coordinates, 1); - if (!this.flatCoordinates) { - this.flatCoordinates = []; - } - this.flatCoordinates.length = deflateCoordinates(this.flatCoordinates, 0, coordinates, this.stride); - this.changed(); - }; - return LinearRing; -}(SimpleGeometry)); - -var __extends$9 = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @classdesc - * Point geometry. - * - * @api - */ -var Point = /** @class */ (function (_super) { - __extends$9(Point, _super); - /** - * @param {import("../coordinate.js").Coordinate} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. - */ - function Point(coordinates, opt_layout) { - var _this = _super.call(this) || this; - _this.setCoordinates(coordinates, opt_layout); - return _this; - } - /** - * Make a complete copy of the geometry. - * @return {!Point} Clone. - * @api - */ - Point.prototype.clone = function () { - var point = new Point(this.flatCoordinates.slice(), this.layout); - point.applyProperties(this); - return point; - }; - /** - * @param {number} x X. - * @param {number} y Y. - * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. - * @param {number} minSquaredDistance Minimum squared distance. - * @return {number} Minimum squared distance. - */ - Point.prototype.closestPointXY = function (x, y, closestPoint, minSquaredDistance) { - var flatCoordinates = this.flatCoordinates; - var squaredDistance$1 = squaredDistance(x, y, flatCoordinates[0], flatCoordinates[1]); - if (squaredDistance$1 < minSquaredDistance) { - var stride = this.stride; - for (var i = 0; i < stride; ++i) { - closestPoint[i] = flatCoordinates[i]; - } - closestPoint.length = stride; - return squaredDistance$1; - } - else { - return minSquaredDistance; - } - }; - /** - * Return the coordinate of the point. - * @return {import("../coordinate.js").Coordinate} Coordinates. - * @api - */ - Point.prototype.getCoordinates = function () { - return !this.flatCoordinates ? [] : this.flatCoordinates.slice(); - }; - /** - * @param {import("../extent.js").Extent} extent Extent. - * @protected - * @return {import("../extent.js").Extent} extent Extent. - */ - Point.prototype.computeExtent = function (extent) { - return createOrUpdateFromCoordinate(this.flatCoordinates, extent); - }; - /** - * Get the type of this geometry. - * @return {import("./GeometryType.js").default} Geometry type. - * @api - */ - Point.prototype.getType = function () { - return GeometryType.POINT; - }; - /** - * Test if the geometry and the passed extent intersect. - * @param {import("../extent.js").Extent} extent Extent. - * @return {boolean} `true` if the geometry and the extent intersect. - * @api - */ - Point.prototype.intersectsExtent = function (extent) { - return containsXY(extent, this.flatCoordinates[0], this.flatCoordinates[1]); - }; - /** - * @param {!Array<*>} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. - * @api - */ - Point.prototype.setCoordinates = function (coordinates, opt_layout) { - this.setLayout(opt_layout, coordinates, 0); - if (!this.flatCoordinates) { - this.flatCoordinates = []; - } - this.flatCoordinates.length = deflateCoordinate(this.flatCoordinates, 0, coordinates, this.stride); - this.changed(); - }; - return Point; -}(SimpleGeometry)); - -/** - * @module ol/geom/flat/contains - */ -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {import("../../extent.js").Extent} extent Extent. - * @return {boolean} Contains extent. - */ -function linearRingContainsExtent(flatCoordinates, offset, end, stride, extent) { - var outside = forEachCorner(extent, - /** - * @param {import("../../coordinate.js").Coordinate} coordinate Coordinate. - * @return {boolean} Contains (x, y). - */ - function (coordinate) { - return !linearRingContainsXY(flatCoordinates, offset, end, stride, coordinate[0], coordinate[1]); - }); - return !outside; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {number} x X. - * @param {number} y Y. - * @return {boolean} Contains (x, y). - */ -function linearRingContainsXY(flatCoordinates, offset, end, stride, x, y) { - // http://geomalgorithms.com/a03-_inclusion.html - // Copyright 2000 softSurfer, 2012 Dan Sunday - // This code may be freely used and modified for any purpose - // providing that this copyright notice is included with it. - // SoftSurfer makes no warranty for this code, and cannot be held - // liable for any real or imagined damage resulting from its use. - // Users of this code must verify correctness for their application. - var wn = 0; - var x1 = flatCoordinates[end - stride]; - var y1 = flatCoordinates[end - stride + 1]; - for (; offset < end; offset += stride) { - var x2 = flatCoordinates[offset]; - var y2 = flatCoordinates[offset + 1]; - if (y1 <= y) { - if (y2 > y && (x2 - x1) * (y - y1) - (x - x1) * (y2 - y1) > 0) { - wn++; - } - } - else if (y2 <= y && (x2 - x1) * (y - y1) - (x - x1) * (y2 - y1) < 0) { - wn--; - } - x1 = x2; - y1 = y2; - } - return wn !== 0; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array} ends Ends. - * @param {number} stride Stride. - * @param {number} x X. - * @param {number} y Y. - * @return {boolean} Contains (x, y). - */ -function linearRingsContainsXY(flatCoordinates, offset, ends, stride, x, y) { - if (ends.length === 0) { - return false; - } - if (!linearRingContainsXY(flatCoordinates, offset, ends[0], stride, x, y)) { - return false; - } - for (var i = 1, ii = ends.length; i < ii; ++i) { - if (linearRingContainsXY(flatCoordinates, ends[i - 1], ends[i], stride, x, y)) { - return false; - } - } - return true; -} - -/** - * @module ol/geom/flat/interiorpoint - */ -/** - * Calculates a point that is likely to lie in the interior of the linear rings. - * Inspired by JTS's com.vividsolutions.jts.geom.Geometry#getInteriorPoint. - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array} ends Ends. - * @param {number} stride Stride. - * @param {Array} flatCenters Flat centers. - * @param {number} flatCentersOffset Flat center offset. - * @param {Array=} opt_dest Destination. - * @return {Array} Destination point as XYM coordinate, where M is the - * length of the horizontal intersection that the point belongs to. - */ -function getInteriorPointOfArray(flatCoordinates, offset, ends, stride, flatCenters, flatCentersOffset, opt_dest) { - var i, ii, x, x1, x2, y1, y2; - var y = flatCenters[flatCentersOffset + 1]; - /** @type {Array} */ - var intersections = []; - // Calculate intersections with the horizontal line - for (var r = 0, rr = ends.length; r < rr; ++r) { - var end = ends[r]; - x1 = flatCoordinates[end - stride]; - y1 = flatCoordinates[end - stride + 1]; - for (i = offset; i < end; i += stride) { - x2 = flatCoordinates[i]; - y2 = flatCoordinates[i + 1]; - if ((y <= y1 && y2 <= y) || (y1 <= y && y <= y2)) { - x = ((y - y1) / (y2 - y1)) * (x2 - x1) + x1; - intersections.push(x); - } - x1 = x2; - y1 = y2; - } - } - // Find the longest segment of the horizontal line that has its center point - // inside the linear ring. - var pointX = NaN; - var maxSegmentLength = -Infinity; - intersections.sort(numberSafeCompareFunction); - x1 = intersections[0]; - for (i = 1, ii = intersections.length; i < ii; ++i) { - x2 = intersections[i]; - var segmentLength = Math.abs(x2 - x1); - if (segmentLength > maxSegmentLength) { - x = (x1 + x2) / 2; - if (linearRingsContainsXY(flatCoordinates, offset, ends, stride, x, y)) { - pointX = x; - maxSegmentLength = segmentLength; - } - } - x1 = x2; - } - if (isNaN(pointX)) { - // There is no horizontal line that has its center point inside the linear - // ring. Use the center of the the linear ring's extent. - pointX = flatCenters[flatCentersOffset]; - } - if (opt_dest) { - opt_dest.push(pointX, y, maxSegmentLength); - return opt_dest; - } - else { - return [pointX, y, maxSegmentLength]; - } -} - -/** - * @module ol/geom/flat/segments - */ -/** - * This function calls `callback` for each segment of the flat coordinates - * array. If the callback returns a truthy value the function returns that - * value immediately. Otherwise the function returns `false`. - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {function(import("../../coordinate.js").Coordinate, import("../../coordinate.js").Coordinate): T} callback Function - * called for each segment. - * @return {T|boolean} Value. - * @template T - */ -function forEach(flatCoordinates, offset, end, stride, callback) { - var point1 = [flatCoordinates[offset], flatCoordinates[offset + 1]]; - var point2 = []; - var ret; - for (; offset + stride < end; offset += stride) { - point2[0] = flatCoordinates[offset + stride]; - point2[1] = flatCoordinates[offset + stride + 1]; - ret = callback(point1, point2); - if (ret) { - return ret; - } - point1[0] = point2[0]; - point1[1] = point2[1]; - } - return false; -} - -/** - * @module ol/geom/flat/intersectsextent - */ -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {import("../../extent.js").Extent} extent Extent. - * @return {boolean} True if the geometry and the extent intersect. - */ -function intersectsLineString(flatCoordinates, offset, end, stride, extent) { - var coordinatesExtent = extendFlatCoordinates(createEmpty(), flatCoordinates, offset, end, stride); - if (!intersects(extent, coordinatesExtent)) { - return false; - } - if (containsExtent(extent, coordinatesExtent)) { - return true; - } - if (coordinatesExtent[0] >= extent[0] && coordinatesExtent[2] <= extent[2]) { - return true; - } - if (coordinatesExtent[1] >= extent[1] && coordinatesExtent[3] <= extent[3]) { - return true; - } - return forEach(flatCoordinates, offset, end, stride, - /** - * @param {import("../../coordinate.js").Coordinate} point1 Start point. - * @param {import("../../coordinate.js").Coordinate} point2 End point. - * @return {boolean} `true` if the segment and the extent intersect, - * `false` otherwise. - */ - function (point1, point2) { - return intersectsSegment(extent, point1, point2); - }); -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @param {import("../../extent.js").Extent} extent Extent. - * @return {boolean} True if the geometry and the extent intersect. - */ -function intersectsLinearRing(flatCoordinates, offset, end, stride, extent) { - if (intersectsLineString(flatCoordinates, offset, end, stride, extent)) { - return true; - } - if (linearRingContainsXY(flatCoordinates, offset, end, stride, extent[0], extent[1])) { - return true; - } - if (linearRingContainsXY(flatCoordinates, offset, end, stride, extent[0], extent[3])) { - return true; - } - if (linearRingContainsXY(flatCoordinates, offset, end, stride, extent[2], extent[1])) { - return true; - } - if (linearRingContainsXY(flatCoordinates, offset, end, stride, extent[2], extent[3])) { - return true; - } - return false; -} -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array} ends Ends. - * @param {number} stride Stride. - * @param {import("../../extent.js").Extent} extent Extent. - * @return {boolean} True if the geometry and the extent intersect. - */ -function intersectsLinearRingArray(flatCoordinates, offset, ends, stride, extent) { - if (!intersectsLinearRing(flatCoordinates, offset, ends[0], stride, extent)) { - return false; - } - if (ends.length === 1) { - return true; - } - for (var i = 1, ii = ends.length; i < ii; ++i) { - if (linearRingContainsExtent(flatCoordinates, ends[i - 1], ends[i], stride, extent)) { - if (!intersectsLineString(flatCoordinates, ends[i - 1], ends[i], stride, extent)) { - return false; - } - } - } - return true; -} - -/** - * @module ol/geom/flat/reverse - */ -/** - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - */ -function coordinates(flatCoordinates, offset, end, stride) { - while (offset < end - stride) { - for (var i = 0; i < stride; ++i) { - var tmp = flatCoordinates[offset + i]; - flatCoordinates[offset + i] = flatCoordinates[end - stride + i]; - flatCoordinates[end - stride + i] = tmp; - } - offset += stride; - end -= stride; - } -} - -/** - * @module ol/geom/flat/orient - */ -/** - * Is the linear ring oriented clockwise in a coordinate system with a bottom-left - * coordinate origin? For a coordinate system with a top-left coordinate origin, - * the ring's orientation is clockwise when this function returns false. - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {number} end End. - * @param {number} stride Stride. - * @return {boolean} Is clockwise. - */ -function linearRingIsClockwise(flatCoordinates, offset, end, stride) { - // http://tinyurl.com/clockwise-method - // https://github.com/OSGeo/gdal/blob/trunk/gdal/ogr/ogrlinearring.cpp - var edge = 0; - var x1 = flatCoordinates[end - stride]; - var y1 = flatCoordinates[end - stride + 1]; - for (; offset < end; offset += stride) { - var x2 = flatCoordinates[offset]; - var y2 = flatCoordinates[offset + 1]; - edge += (x2 - x1) * (y2 + y1); - x1 = x2; - y1 = y2; - } - return edge === 0 ? undefined : edge > 0; -} -/** - * Determines if linear rings are oriented. By default, left-hand orientation - * is tested (first ring must be clockwise, remaining rings counter-clockwise). - * To test for right-hand orientation, use the `opt_right` argument. - * - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array} ends Array of end indexes. - * @param {number} stride Stride. - * @param {boolean=} opt_right Test for right-hand orientation - * (counter-clockwise exterior ring and clockwise interior rings). - * @return {boolean} Rings are correctly oriented. - */ -function linearRingsAreOriented(flatCoordinates, offset, ends, stride, opt_right) { - var right = opt_right !== undefined ? opt_right : false; - for (var i = 0, ii = ends.length; i < ii; ++i) { - var end = ends[i]; - var isClockwise = linearRingIsClockwise(flatCoordinates, offset, end, stride); - if (i === 0) { - if ((right && isClockwise) || (!right && !isClockwise)) { - return false; - } - } - else { - if ((right && !isClockwise) || (!right && isClockwise)) { - return false; - } - } - offset = end; - } - return true; -} -/** - * Orient coordinates in a flat array of linear rings. By default, rings - * are oriented following the left-hand rule (clockwise for exterior and - * counter-clockwise for interior rings). To orient according to the - * right-hand rule, use the `opt_right` argument. - * - * @param {Array} flatCoordinates Flat coordinates. - * @param {number} offset Offset. - * @param {Array} ends Ends. - * @param {number} stride Stride. - * @param {boolean=} opt_right Follow the right-hand rule for orientation. - * @return {number} End. - */ -function orientLinearRings(flatCoordinates, offset, ends, stride, opt_right) { - var right = opt_right !== undefined ? opt_right : false; - for (var i = 0, ii = ends.length; i < ii; ++i) { - var end = ends[i]; - var isClockwise = linearRingIsClockwise(flatCoordinates, offset, end, stride); - var reverse = i === 0 - ? (right && isClockwise) || (!right && !isClockwise) - : (right && !isClockwise) || (!right && isClockwise); - if (reverse) { - coordinates(flatCoordinates, offset, end, stride); - } - offset = end; - } - return offset; -} - -var __extends$a = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @classdesc - * Polygon geometry. - * - * @api - */ -var Polygon = /** @class */ (function (_super) { - __extends$a(Polygon, _super); - /** - * @param {!Array>|!Array} coordinates - * Array of linear rings that define the polygon. The first linear ring of the - * array defines the outer-boundary or surface of the polygon. Each subsequent - * linear ring defines a hole in the surface of the polygon. A linear ring is - * an array of vertices' coordinates where the first coordinate and the last are - * equivalent. (For internal use, flat coordinates in combination with - * `opt_layout` and `opt_ends` are also accepted.) - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. - * @param {Array=} opt_ends Ends (for internal use with flat coordinates). - */ - function Polygon(coordinates, opt_layout, opt_ends) { - var _this = _super.call(this) || this; - /** - * @type {Array} - * @private - */ - _this.ends_ = []; - /** - * @private - * @type {number} - */ - _this.flatInteriorPointRevision_ = -1; - /** - * @private - * @type {import("../coordinate.js").Coordinate} - */ - _this.flatInteriorPoint_ = null; - /** - * @private - * @type {number} - */ - _this.maxDelta_ = -1; - /** - * @private - * @type {number} - */ - _this.maxDeltaRevision_ = -1; - /** - * @private - * @type {number} - */ - _this.orientedRevision_ = -1; - /** - * @private - * @type {Array} - */ - _this.orientedFlatCoordinates_ = null; - if (opt_layout !== undefined && opt_ends) { - _this.setFlatCoordinates(opt_layout, - /** @type {Array} */ (coordinates)); - _this.ends_ = opt_ends; - } - else { - _this.setCoordinates( - /** @type {Array>} */ (coordinates), opt_layout); - } - return _this; - } - /** - * Append the passed linear ring to this polygon. - * @param {LinearRing} linearRing Linear ring. - * @api - */ - Polygon.prototype.appendLinearRing = function (linearRing) { - if (!this.flatCoordinates) { - this.flatCoordinates = linearRing.getFlatCoordinates().slice(); - } - else { - extend(this.flatCoordinates, linearRing.getFlatCoordinates()); - } - this.ends_.push(this.flatCoordinates.length); - this.changed(); - }; - /** - * Make a complete copy of the geometry. - * @return {!Polygon} Clone. - * @api - */ - Polygon.prototype.clone = function () { - var polygon = new Polygon(this.flatCoordinates.slice(), this.layout, this.ends_.slice()); - polygon.applyProperties(this); - return polygon; - }; - /** - * @param {number} x X. - * @param {number} y Y. - * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. - * @param {number} minSquaredDistance Minimum squared distance. - * @return {number} Minimum squared distance. - */ - Polygon.prototype.closestPointXY = function (x, y, closestPoint, minSquaredDistance) { - if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) { - return minSquaredDistance; - } - if (this.maxDeltaRevision_ != this.getRevision()) { - this.maxDelta_ = Math.sqrt(arrayMaxSquaredDelta(this.flatCoordinates, 0, this.ends_, this.stride, 0)); - this.maxDeltaRevision_ = this.getRevision(); - } - return assignClosestArrayPoint(this.flatCoordinates, 0, this.ends_, this.stride, this.maxDelta_, true, x, y, closestPoint, minSquaredDistance); - }; - /** - * @param {number} x X. - * @param {number} y Y. - * @return {boolean} Contains (x, y). - */ - Polygon.prototype.containsXY = function (x, y) { - return linearRingsContainsXY(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, x, y); - }; - /** - * Return the area of the polygon on projected plane. - * @return {number} Area (on projected plane). - * @api - */ - Polygon.prototype.getArea = function () { - return linearRings(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride); - }; - /** - * Get the coordinate array for this geometry. This array has the structure - * of a GeoJSON coordinate array for polygons. - * - * @param {boolean=} opt_right Orient coordinates according to the right-hand - * rule (counter-clockwise for exterior and clockwise for interior rings). - * If `false`, coordinates will be oriented according to the left-hand rule - * (clockwise for exterior and counter-clockwise for interior rings). - * By default, coordinate orientation will depend on how the geometry was - * constructed. - * @return {Array>} Coordinates. - * @api - */ - Polygon.prototype.getCoordinates = function (opt_right) { - var flatCoordinates; - if (opt_right !== undefined) { - flatCoordinates = this.getOrientedFlatCoordinates().slice(); - orientLinearRings(flatCoordinates, 0, this.ends_, this.stride, opt_right); - } - else { - flatCoordinates = this.flatCoordinates; - } - return inflateCoordinatesArray(flatCoordinates, 0, this.ends_, this.stride); - }; - /** - * @return {Array} Ends. - */ - Polygon.prototype.getEnds = function () { - return this.ends_; - }; - /** - * @return {Array} Interior point. - */ - Polygon.prototype.getFlatInteriorPoint = function () { - if (this.flatInteriorPointRevision_ != this.getRevision()) { - var flatCenter = getCenter(this.getExtent()); - this.flatInteriorPoint_ = getInteriorPointOfArray(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, flatCenter, 0); - this.flatInteriorPointRevision_ = this.getRevision(); - } - return this.flatInteriorPoint_; - }; - /** - * Return an interior point of the polygon. - * @return {Point} Interior point as XYM coordinate, where M is the - * length of the horizontal intersection that the point belongs to. - * @api - */ - Polygon.prototype.getInteriorPoint = function () { - return new Point(this.getFlatInteriorPoint(), GeometryLayout.XYM); - }; - /** - * Return the number of rings of the polygon, this includes the exterior - * ring and any interior rings. - * - * @return {number} Number of rings. - * @api - */ - Polygon.prototype.getLinearRingCount = function () { - return this.ends_.length; - }; - /** - * Return the Nth linear ring of the polygon geometry. Return `null` if the - * given index is out of range. - * The exterior linear ring is available at index `0` and the interior rings - * at index `1` and beyond. - * - * @param {number} index Index. - * @return {LinearRing} Linear ring. - * @api - */ - Polygon.prototype.getLinearRing = function (index) { - if (index < 0 || this.ends_.length <= index) { - return null; - } - return new LinearRing(this.flatCoordinates.slice(index === 0 ? 0 : this.ends_[index - 1], this.ends_[index]), this.layout); - }; - /** - * Return the linear rings of the polygon. - * @return {Array} Linear rings. - * @api - */ - Polygon.prototype.getLinearRings = function () { - var layout = this.layout; - var flatCoordinates = this.flatCoordinates; - var ends = this.ends_; - var linearRings = []; - var offset = 0; - for (var i = 0, ii = ends.length; i < ii; ++i) { - var end = ends[i]; - var linearRing = new LinearRing(flatCoordinates.slice(offset, end), layout); - linearRings.push(linearRing); - offset = end; - } - return linearRings; - }; - /** - * @return {Array} Oriented flat coordinates. - */ - Polygon.prototype.getOrientedFlatCoordinates = function () { - if (this.orientedRevision_ != this.getRevision()) { - var flatCoordinates = this.flatCoordinates; - if (linearRingsAreOriented(flatCoordinates, 0, this.ends_, this.stride)) { - this.orientedFlatCoordinates_ = flatCoordinates; - } - else { - this.orientedFlatCoordinates_ = flatCoordinates.slice(); - this.orientedFlatCoordinates_.length = orientLinearRings(this.orientedFlatCoordinates_, 0, this.ends_, this.stride); - } - this.orientedRevision_ = this.getRevision(); - } - return this.orientedFlatCoordinates_; - }; - /** - * @param {number} squaredTolerance Squared tolerance. - * @return {Polygon} Simplified Polygon. - * @protected - */ - Polygon.prototype.getSimplifiedGeometryInternal = function (squaredTolerance) { - var simplifiedFlatCoordinates = []; - var simplifiedEnds = []; - simplifiedFlatCoordinates.length = quantizeArray(this.flatCoordinates, 0, this.ends_, this.stride, Math.sqrt(squaredTolerance), simplifiedFlatCoordinates, 0, simplifiedEnds); - return new Polygon(simplifiedFlatCoordinates, GeometryLayout.XY, simplifiedEnds); - }; - /** - * Get the type of this geometry. - * @return {import("./GeometryType.js").default} Geometry type. - * @api - */ - Polygon.prototype.getType = function () { - return GeometryType.POLYGON; - }; - /** - * Test if the geometry and the passed extent intersect. - * @param {import("../extent.js").Extent} extent Extent. - * @return {boolean} `true` if the geometry and the extent intersect. - * @api - */ - Polygon.prototype.intersectsExtent = function (extent) { - return intersectsLinearRingArray(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, extent); - }; - /** - * Set the coordinates of the polygon. - * @param {!Array>} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. - * @api - */ - Polygon.prototype.setCoordinates = function (coordinates, opt_layout) { - this.setLayout(opt_layout, coordinates, 2); - if (!this.flatCoordinates) { - this.flatCoordinates = []; - } - var ends = deflateCoordinatesArray(this.flatCoordinates, 0, coordinates, this.stride, this.ends_); - this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1]; - this.changed(); - }; - return Polygon; -}(SimpleGeometry)); -/** - * Create a polygon from an extent. The layout used is `XY`. - * @param {import("../extent.js").Extent} extent The extent. - * @return {Polygon} The polygon. - * @api - */ -function fromExtent(extent) { - var minX = extent[0]; - var minY = extent[1]; - var maxX = extent[2]; - var maxY = extent[3]; - var flatCoordinates = [ - minX, - minY, - minX, - maxY, - maxX, - maxY, - maxX, - minY, - minX, - minY, - ]; - return new Polygon(flatCoordinates, GeometryLayout.XY, [ - flatCoordinates.length, - ]); -} - -var __extends$b = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * An animation configuration - * - * @typedef {Object} Animation - * @property {import("./coordinate.js").Coordinate} [sourceCenter] - * @property {import("./coordinate.js").Coordinate} [targetCenter] - * @property {number} [sourceResolution] - * @property {number} [targetResolution] - * @property {number} [sourceRotation] - * @property {number} [targetRotation] - * @property {import("./coordinate.js").Coordinate} [anchor] - * @property {number} start - * @property {number} duration - * @property {boolean} complete - * @property {function(number):number} easing - * @property {function(boolean):void} callback - */ -/** - * @typedef {Object} Constraints - * @property {import("./centerconstraint.js").Type} center - * @property {import("./resolutionconstraint.js").Type} resolution - * @property {import("./rotationconstraint.js").Type} rotation - */ -/** - * @typedef {Object} FitOptions - * @property {import("./size.js").Size} [size] The size in pixels of the box to fit - * the extent into. Default is the current size of the first map in the DOM that - * uses this view, or `[100, 100]` if no such map is found. - * @property {!Array} [padding=[0, 0, 0, 0]] Padding (in pixels) to be - * cleared inside the view. Values in the array are top, right, bottom and left - * padding. - * @property {boolean} [nearest=false] If the view `constrainResolution` option is `true`, - * get the nearest extent instead of the closest that actually fits the view. - * @property {number} [minResolution=0] Minimum resolution that we zoom to. - * @property {number} [maxZoom] Maximum zoom level that we zoom to. If - * `minResolution` is given, this property is ignored. - * @property {number} [duration] The duration of the animation in milliseconds. - * By default, there is no animation to the target extent. - * @property {function(number):number} [easing] The easing function used during - * the animation (defaults to {@link module:ol/easing~inAndOut}). - * The function will be called for each frame with a number representing a - * fraction of the animation's duration. The function should return a number - * between 0 and 1 representing the progress toward the destination state. - * @property {function(boolean):void} [callback] Function called when the view is in - * its final position. The callback will be called with `true` if the animation - * series completed on its own or `false` if it was cancelled. - */ -/** - * @typedef {Object} ViewOptions - * @property {import("./coordinate.js").Coordinate} [center] The initial center for - * the view. If a user projection is not set, the coordinate system for the center is - * specified with the `projection` option. Layer sources will not be fetched if this - * is not set, but the center can be set later with {@link #setCenter}. - * @property {boolean|number} [constrainRotation=true] Rotation constraint. - * `false` means no constraint. `true` means no constraint, but snap to zero - * near zero. A number constrains the rotation to that number of values. For - * example, `4` will constrain the rotation to 0, 90, 180, and 270 degrees. - * @property {boolean} [enableRotation=true] Enable rotation. - * If `false`, a rotation constraint that always sets the rotation to zero is - * used. The `constrainRotation` option has no effect if `enableRotation` is - * `false`. - * @property {import("./extent.js").Extent} [extent] The extent that constrains the - * view, in other words, nothing outside of this extent can be visible on the map. - * @property {boolean} [constrainOnlyCenter=false] If true, the extent - * constraint will only apply to the view center and not the whole extent. - * @property {boolean} [smoothExtentConstraint=true] If true, the extent - * constraint will be applied smoothly, i.e. allow the view to go slightly outside - * of the given `extent`. - * @property {number} [maxResolution] The maximum resolution used to determine - * the resolution constraint. It is used together with `minResolution` (or - * `maxZoom`) and `zoomFactor`. If unspecified it is calculated in such a way - * that the projection's validity extent fits in a 256x256 px tile. If the - * projection is Spherical Mercator (the default) then `maxResolution` defaults - * to `40075016.68557849 / 256 = 156543.03392804097`. - * @property {number} [minResolution] The minimum resolution used to determine - * the resolution constraint. It is used together with `maxResolution` (or - * `minZoom`) and `zoomFactor`. If unspecified it is calculated assuming 29 - * zoom levels (with a factor of 2). If the projection is Spherical Mercator - * (the default) then `minResolution` defaults to - * `40075016.68557849 / 256 / Math.pow(2, 28) = 0.0005831682455839253`. - * @property {number} [maxZoom=28] The maximum zoom level used to determine the - * resolution constraint. It is used together with `minZoom` (or - * `maxResolution`) and `zoomFactor`. Note that if `minResolution` is also - * provided, it is given precedence over `maxZoom`. - * @property {number} [minZoom=0] The minimum zoom level used to determine the - * resolution constraint. It is used together with `maxZoom` (or - * `minResolution`) and `zoomFactor`. Note that if `maxResolution` is also - * provided, it is given precedence over `minZoom`. - * @property {boolean} [multiWorld=false] If `false` the view is constrained so - * only one world is visible, and you cannot pan off the edge. If `true` the map - * may show multiple worlds at low zoom levels. Only used if the `projection` is - * global. Note that if `extent` is also provided it is given precedence. - * @property {boolean} [constrainResolution=false] If true, the view will always - * animate to the closest zoom level after an interaction; false means - * intermediary zoom levels are allowed. - * @property {boolean} [smoothResolutionConstraint=true] If true, the resolution - * min/max values will be applied smoothly, i. e. allow the view to exceed slightly - * the given resolution or zoom bounds. - * @property {boolean} [showFullExtent=false] Allow the view to be zoomed out to - * show the full configured extent. By default, when a view is configured with an - * extent, users will not be able to zoom out so the viewport exceeds the extent in - * either dimension. This means the full extent may not be visible if the viewport - * is taller or wider than the aspect ratio of the configured extent. If - * showFullExtent is true, the user will be able to zoom out so that the viewport - * exceeds the height or width of the configured extent, but not both, allowing the - * full extent to be shown. - * @property {import("./proj.js").ProjectionLike} [projection='EPSG:3857'] The - * projection. The default is Spherical Mercator. - * @property {number} [resolution] The initial resolution for the view. The - * units are `projection` units per pixel (e.g. meters per pixel). An - * alternative to setting this is to set `zoom`. Layer sources will not be - * fetched if neither this nor `zoom` are defined, but they can be set later - * with {@link #setZoom} or {@link #setResolution}. - * @property {Array} [resolutions] Resolutions to determine the - * resolution constraint. If set the `maxResolution`, `minResolution`, - * `minZoom`, `maxZoom`, and `zoomFactor` options are ignored. - * @property {number} [rotation=0] The initial rotation for the view in radians - * (positive rotation clockwise, 0 means North). - * @property {number} [zoom] Only used if `resolution` is not defined. Zoom - * level used to calculate the initial resolution for the view. - * @property {number} [zoomFactor=2] The zoom factor used to compute the - * corresponding resolution. - * @property {!Array} [padding=[0, 0, 0, 0]] Padding (in css pixels). - * If the map viewport is partially covered with other content (overlays) along - * its edges, this setting allows to shift the center of the viewport away from - * that content. The order of the values is top, right, bottom, left. - */ -/** - * @typedef {Object} AnimationOptions - * @property {import("./coordinate.js").Coordinate} [center] The center of the view at the end of - * the animation. - * @property {number} [zoom] The zoom level of the view at the end of the - * animation. This takes precedence over `resolution`. - * @property {number} [resolution] The resolution of the view at the end - * of the animation. If `zoom` is also provided, this option will be ignored. - * @property {number} [rotation] The rotation of the view at the end of - * the animation. - * @property {import("./coordinate.js").Coordinate} [anchor] Optional anchor to remain fixed - * during a rotation or resolution animation. - * @property {number} [duration=1000] The duration of the animation in milliseconds. - * @property {function(number):number} [easing] The easing function used - * during the animation (defaults to {@link module:ol/easing~inAndOut}). - * The function will be called for each frame with a number representing a - * fraction of the animation's duration. The function should return a number - * between 0 and 1 representing the progress toward the destination state. - */ -/** - * @typedef {Object} State - * @property {import("./coordinate.js").Coordinate} center - * @property {import("./proj/Projection.js").default} projection - * @property {number} resolution - * @property {number} rotation - * @property {number} zoom - */ -/** - * Default min zoom level for the map view. - * @type {number} - */ -var DEFAULT_MIN_ZOOM = 0; -/** - * @classdesc - * A View object represents a simple 2D view of the map. - * - * This is the object to act upon to change the center, resolution, - * and rotation of the map. - * - * A View has a `projection`. The projection determines the - * coordinate system of the center, and its units determine the units of the - * resolution (projection units per pixel). The default projection is - * Spherical Mercator (EPSG:3857). - * - * ### The view states - * - * A View is determined by three states: `center`, `resolution`, - * and `rotation`. Each state has a corresponding getter and setter, e.g. - * `getCenter` and `setCenter` for the `center` state. - * - * The `zoom` state is actually not saved on the view: all computations - * internally use the `resolution` state. Still, the `setZoom` and `getZoom` - * methods are available, as well as `getResolutionForZoom` and - * `getZoomForResolution` to switch from one system to the other. - * - * ### The constraints - * - * `setCenter`, `setResolution` and `setRotation` can be used to change the - * states of the view, but any constraint defined in the constructor will - * be applied along the way. - * - * A View object can have a *resolution constraint*, a *rotation constraint* - * and a *center constraint*. - * - * The *resolution constraint* typically restricts min/max values and - * snaps to specific resolutions. It is determined by the following - * options: `resolutions`, `maxResolution`, `maxZoom` and `zoomFactor`. - * If `resolutions` is set, the other three options are ignored. See - * documentation for each option for more information. By default, the view - * only has a min/max restriction and allow intermediary zoom levels when - * pinch-zooming for example. - * - * The *rotation constraint* snaps to specific angles. It is determined - * by the following options: `enableRotation` and `constrainRotation`. - * By default rotation is allowed and its value is snapped to zero when approaching the - * horizontal. - * - * The *center constraint* is determined by the `extent` option. By - * default the view center is not constrained at all. - * - * ### Changing the view state - * - * It is important to note that `setZoom`, `setResolution`, `setCenter` and - * `setRotation` are subject to the above mentioned constraints. As such, it - * may sometimes not be possible to know in advance the resulting state of the - * View. For example, calling `setResolution(10)` does not guarantee that - * `getResolution()` will return `10`. - * - * A consequence of this is that, when applying a delta on the view state, one - * should use `adjustCenter`, `adjustRotation`, `adjustZoom` and `adjustResolution` - * rather than the corresponding setters. This will let view do its internal - * computations. Besides, the `adjust*` methods also take an `opt_anchor` - * argument which allows specifying an origin for the transformation. - * - * ### Interacting with the view - * - * View constraints are usually only applied when the view is *at rest*, meaning that - * no interaction or animation is ongoing. As such, if the user puts the view in a - * state that is not equivalent to a constrained one (e.g. rotating the view when - * the snap angle is 0), an animation will be triggered at the interaction end to - * put back the view to a stable state; - * - * @api - */ -var View = /** @class */ (function (_super) { - __extends$b(View, _super); - /** - * @param {ViewOptions=} opt_options View options. - */ - function View(opt_options) { - var _this = _super.call(this) || this; - var options = assign({}, opt_options); - /** - * @private - * @type {Array} - */ - _this.hints_ = [0, 0]; - /** - * @private - * @type {Array>} - */ - _this.animations_ = []; - /** - * @private - * @type {number|undefined} - */ - _this.updateAnimationKey_; - /** - * @private - * @const - * @type {import("./proj/Projection.js").default} - */ - _this.projection_ = createProjection(options.projection, 'EPSG:3857'); - /** - * @private - * @type {import("./size.js").Size} - */ - _this.viewportSize_ = [100, 100]; - /** - * @private - * @type {import("./coordinate.js").Coordinate|undefined} - */ - _this.targetCenter_ = null; - /** - * @private - * @type {number|undefined} - */ - _this.targetResolution_; - /** - * @private - * @type {number|undefined} - */ - _this.targetRotation_; - /** - * @private - * @type {import("./coordinate.js").Coordinate|undefined} - */ - _this.cancelAnchor_ = undefined; - if (options.center) { - options.center = fromUserCoordinate(options.center, _this.projection_); - } - if (options.extent) { - options.extent = fromUserExtent(options.extent, _this.projection_); - } - _this.applyOptions_(options); - return _this; - } - /** - * Set up the view with the given options. - * @param {ViewOptions} options View options. - */ - View.prototype.applyOptions_ = function (options) { - /** - * @type {Object} - */ - var properties = {}; - var resolutionConstraintInfo = createResolutionConstraint(options); - /** - * @private - * @type {number} - */ - this.maxResolution_ = resolutionConstraintInfo.maxResolution; - /** - * @private - * @type {number} - */ - this.minResolution_ = resolutionConstraintInfo.minResolution; - /** - * @private - * @type {number} - */ - this.zoomFactor_ = resolutionConstraintInfo.zoomFactor; - /** - * @private - * @type {Array|undefined} - */ - this.resolutions_ = options.resolutions; - /** - * Padding (in css pixels). - * If the map viewport is partially covered with other content (overlays) along - * its edges, this setting allows to shift the center of the viewport away from that - * content. The order of the values in the array is top, right, bottom, left. - * The default is no padding, which is equivalent to `[0, 0, 0, 0]`. - * @type {Array|undefined} - * @api - */ - this.padding = options.padding; - /** - * @private - * @type {number} - */ - this.minZoom_ = resolutionConstraintInfo.minZoom; - var centerConstraint = createCenterConstraint(options); - var resolutionConstraint = resolutionConstraintInfo.constraint; - var rotationConstraint = createRotationConstraint(options); - /** - * @private - * @type {Constraints} - */ - this.constraints_ = { - center: centerConstraint, - resolution: resolutionConstraint, - rotation: rotationConstraint, - }; - this.setRotation(options.rotation !== undefined ? options.rotation : 0); - this.setCenterInternal(options.center !== undefined ? options.center : null); - if (options.resolution !== undefined) { - this.setResolution(options.resolution); - } - else if (options.zoom !== undefined) { - this.setZoom(options.zoom); - } - this.setProperties(properties); - /** - * @private - * @type {ViewOptions} - */ - this.options_ = options; - }; - /** - * Get an updated version of the view options used to construct the view. The - * current resolution (or zoom), center, and rotation are applied to any stored - * options. The provided options can be used to apply new min/max zoom or - * resolution limits. - * @param {ViewOptions} newOptions New options to be applied. - * @return {ViewOptions} New options updated with the current view state. - */ - View.prototype.getUpdatedOptions_ = function (newOptions) { - var options = assign({}, this.options_); - // preserve resolution (or zoom) - if (options.resolution !== undefined) { - options.resolution = this.getResolution(); - } - else { - options.zoom = this.getZoom(); - } - // preserve center - options.center = this.getCenterInternal(); - // preserve rotation - options.rotation = this.getRotation(); - return assign({}, options, newOptions); - }; - /** - * Animate the view. The view's center, zoom (or resolution), and rotation - * can be animated for smooth transitions between view states. For example, - * to animate the view to a new zoom level: - * - * view.animate({zoom: view.getZoom() + 1}); - * - * By default, the animation lasts one second and uses in-and-out easing. You - * can customize this behavior by including `duration` (in milliseconds) and - * `easing` options (see {@link module:ol/easing}). - * - * To chain together multiple animations, call the method with multiple - * animation objects. For example, to first zoom and then pan: - * - * view.animate({zoom: 10}, {center: [0, 0]}); - * - * If you provide a function as the last argument to the animate method, it - * will get called at the end of an animation series. The callback will be - * called with `true` if the animation series completed on its own or `false` - * if it was cancelled. - * - * Animations are cancelled by user interactions (e.g. dragging the map) or by - * calling `view.setCenter()`, `view.setResolution()`, or `view.setRotation()` - * (or another method that calls one of these). - * - * @param {...(AnimationOptions|function(boolean): void)} var_args Animation - * options. Multiple animations can be run in series by passing multiple - * options objects. To run multiple animations in parallel, call the method - * multiple times. An optional callback can be provided as a final - * argument. The callback will be called with a boolean indicating whether - * the animation completed without being cancelled. - * @api - */ - View.prototype.animate = function (var_args) { - if (this.isDef() && !this.getAnimating()) { - this.resolveConstraints(0); - } - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - var options = arguments[i]; - if (options.center) { - options = assign({}, options); - options.center = fromUserCoordinate(options.center, this.getProjection()); - } - if (options.anchor) { - options = assign({}, options); - options.anchor = fromUserCoordinate(options.anchor, this.getProjection()); - } - args[i] = options; - } - this.animateInternal.apply(this, args); - }; - /** - * @param {...(AnimationOptions|function(boolean): void)} var_args Animation options. - */ - View.prototype.animateInternal = function (var_args) { - var animationCount = arguments.length; - var callback; - if (animationCount > 1 && - typeof arguments[animationCount - 1] === 'function') { - callback = arguments[animationCount - 1]; - --animationCount; - } - if (!this.isDef()) { - // if view properties are not yet set, shortcut to the final state - var state = arguments[animationCount - 1]; - if (state.center) { - this.setCenterInternal(state.center); - } - if (state.zoom !== undefined) { - this.setZoom(state.zoom); - } - if (state.rotation !== undefined) { - this.setRotation(state.rotation); - } - if (callback) { - animationCallback(callback, true); - } - return; - } - var start = Date.now(); - var center = this.targetCenter_.slice(); - var resolution = this.targetResolution_; - var rotation = this.targetRotation_; - var series = []; - for (var i = 0; i < animationCount; ++i) { - var options = /** @type {AnimationOptions} */ (arguments[i]); - var animation = { - start: start, - complete: false, - anchor: options.anchor, - duration: options.duration !== undefined ? options.duration : 1000, - easing: options.easing || inAndOut, - callback: callback, - }; - if (options.center) { - animation.sourceCenter = center; - animation.targetCenter = options.center.slice(); - center = animation.targetCenter; - } - if (options.zoom !== undefined) { - animation.sourceResolution = resolution; - animation.targetResolution = this.getResolutionForZoom(options.zoom); - resolution = animation.targetResolution; - } - else if (options.resolution) { - animation.sourceResolution = resolution; - animation.targetResolution = options.resolution; - resolution = animation.targetResolution; - } - if (options.rotation !== undefined) { - animation.sourceRotation = rotation; - var delta = modulo(options.rotation - rotation + Math.PI, 2 * Math.PI) - Math.PI; - animation.targetRotation = rotation + delta; - rotation = animation.targetRotation; - } - // check if animation is a no-op - if (isNoopAnimation(animation)) { - animation.complete = true; - // we still push it onto the series for callback handling - } - else { - start += animation.duration; - } - series.push(animation); - } - this.animations_.push(series); - this.setHint(ViewHint.ANIMATING, 1); - this.updateAnimations_(); - }; - /** - * Determine if the view is being animated. - * @return {boolean} The view is being animated. - * @api - */ - View.prototype.getAnimating = function () { - return this.hints_[ViewHint.ANIMATING] > 0; - }; - /** - * Determine if the user is interacting with the view, such as panning or zooming. - * @return {boolean} The view is being interacted with. - * @api - */ - View.prototype.getInteracting = function () { - return this.hints_[ViewHint.INTERACTING] > 0; - }; - /** - * Cancel any ongoing animations. - * @api - */ - View.prototype.cancelAnimations = function () { - this.setHint(ViewHint.ANIMATING, -this.hints_[ViewHint.ANIMATING]); - var anchor; - for (var i = 0, ii = this.animations_.length; i < ii; ++i) { - var series = this.animations_[i]; - if (series[0].callback) { - animationCallback(series[0].callback, false); - } - if (!anchor) { - for (var j = 0, jj = series.length; j < jj; ++j) { - var animation = series[j]; - if (!animation.complete) { - anchor = animation.anchor; - break; - } - } - } - } - this.animations_.length = 0; - this.cancelAnchor_ = anchor; - }; - /** - * Update all animations. - */ - View.prototype.updateAnimations_ = function () { - if (this.updateAnimationKey_ !== undefined) { - cancelAnimationFrame(this.updateAnimationKey_); - this.updateAnimationKey_ = undefined; - } - if (!this.getAnimating()) { - return; - } - var now = Date.now(); - var more = false; - for (var i = this.animations_.length - 1; i >= 0; --i) { - var series = this.animations_[i]; - var seriesComplete = true; - for (var j = 0, jj = series.length; j < jj; ++j) { - var animation = series[j]; - if (animation.complete) { - continue; - } - var elapsed = now - animation.start; - var fraction = animation.duration > 0 ? elapsed / animation.duration : 1; - if (fraction >= 1) { - animation.complete = true; - fraction = 1; - } - else { - seriesComplete = false; - } - var progress = animation.easing(fraction); - if (animation.sourceCenter) { - var x0 = animation.sourceCenter[0]; - var y0 = animation.sourceCenter[1]; - var x1 = animation.targetCenter[0]; - var y1 = animation.targetCenter[1]; - var x = x0 + progress * (x1 - x0); - var y = y0 + progress * (y1 - y0); - this.targetCenter_ = [x, y]; - } - if (animation.sourceResolution && animation.targetResolution) { - var resolution = progress === 1 - ? animation.targetResolution - : animation.sourceResolution + - progress * - (animation.targetResolution - animation.sourceResolution); - if (animation.anchor) { - var size = this.getViewportSize_(this.getRotation()); - var constrainedResolution = this.constraints_.resolution(resolution, 0, size, true); - this.targetCenter_ = this.calculateCenterZoom(constrainedResolution, animation.anchor); - } - this.targetResolution_ = resolution; - this.applyTargetState_(true); - } - if (animation.sourceRotation !== undefined && - animation.targetRotation !== undefined) { - var rotation = progress === 1 - ? modulo(animation.targetRotation + Math.PI, 2 * Math.PI) - - Math.PI - : animation.sourceRotation + - progress * - (animation.targetRotation - animation.sourceRotation); - if (animation.anchor) { - var constrainedRotation = this.constraints_.rotation(rotation, true); - this.targetCenter_ = this.calculateCenterRotate(constrainedRotation, animation.anchor); - } - this.targetRotation_ = rotation; - } - this.applyTargetState_(true); - more = true; - if (!animation.complete) { - break; - } - } - if (seriesComplete) { - this.animations_[i] = null; - this.setHint(ViewHint.ANIMATING, -1); - var callback = series[0].callback; - if (callback) { - animationCallback(callback, true); - } - } - } - // prune completed series - this.animations_ = this.animations_.filter(Boolean); - if (more && this.updateAnimationKey_ === undefined) { - this.updateAnimationKey_ = requestAnimationFrame(this.updateAnimations_.bind(this)); - } - }; - /** - * @param {number} rotation Target rotation. - * @param {import("./coordinate.js").Coordinate} anchor Rotation anchor. - * @return {import("./coordinate.js").Coordinate|undefined} Center for rotation and anchor. - */ - View.prototype.calculateCenterRotate = function (rotation, anchor) { - var center; - var currentCenter = this.getCenterInternal(); - if (currentCenter !== undefined) { - center = [currentCenter[0] - anchor[0], currentCenter[1] - anchor[1]]; - rotate(center, rotation - this.getRotation()); - add$2(center, anchor); - } - return center; - }; - /** - * @param {number} resolution Target resolution. - * @param {import("./coordinate.js").Coordinate} anchor Zoom anchor. - * @return {import("./coordinate.js").Coordinate|undefined} Center for resolution and anchor. - */ - View.prototype.calculateCenterZoom = function (resolution, anchor) { - var center; - var currentCenter = this.getCenterInternal(); - var currentResolution = this.getResolution(); - if (currentCenter !== undefined && currentResolution !== undefined) { - var x = anchor[0] - - (resolution * (anchor[0] - currentCenter[0])) / currentResolution; - var y = anchor[1] - - (resolution * (anchor[1] - currentCenter[1])) / currentResolution; - center = [x, y]; - } - return center; - }; - /** - * Returns the current viewport size. - * @private - * @param {number=} opt_rotation Take into account the rotation of the viewport when giving the size - * @return {import("./size.js").Size} Viewport size or `[100, 100]` when no viewport is found. - */ - View.prototype.getViewportSize_ = function (opt_rotation) { - var size = this.viewportSize_; - if (opt_rotation) { - var w = size[0]; - var h = size[1]; - return [ - Math.abs(w * Math.cos(opt_rotation)) + - Math.abs(h * Math.sin(opt_rotation)), - Math.abs(w * Math.sin(opt_rotation)) + - Math.abs(h * Math.cos(opt_rotation)), - ]; - } - else { - return size; - } - }; - /** - * Stores the viewport size on the view. The viewport size is not read every time from the DOM - * to avoid performance hit and layout reflow. - * This should be done on map size change. - * Note: the constraints are not resolved during an animation to avoid stopping it - * @param {import("./size.js").Size=} opt_size Viewport size; if undefined, [100, 100] is assumed - */ - View.prototype.setViewportSize = function (opt_size) { - this.viewportSize_ = Array.isArray(opt_size) - ? opt_size.slice() - : [100, 100]; - if (!this.getAnimating()) { - this.resolveConstraints(0); - } - }; - /** - * Get the view center. - * @return {import("./coordinate.js").Coordinate|undefined} The center of the view. - * @observable - * @api - */ - View.prototype.getCenter = function () { - var center = this.getCenterInternal(); - if (!center) { - return center; - } - return toUserCoordinate(center, this.getProjection()); - }; - /** - * Get the view center without transforming to user projection. - * @return {import("./coordinate.js").Coordinate|undefined} The center of the view. - */ - View.prototype.getCenterInternal = function () { - return /** @type {import("./coordinate.js").Coordinate|undefined} */ (this.get(ViewProperty.CENTER)); - }; - /** - * @return {Constraints} Constraints. - */ - View.prototype.getConstraints = function () { - return this.constraints_; - }; - /** - * @return {boolean} Resolution constraint is set - */ - View.prototype.getConstrainResolution = function () { - return this.options_.constrainResolution; - }; - /** - * @param {Array=} opt_hints Destination array. - * @return {Array} Hint. - */ - View.prototype.getHints = function (opt_hints) { - if (opt_hints !== undefined) { - opt_hints[0] = this.hints_[0]; - opt_hints[1] = this.hints_[1]; - return opt_hints; - } - else { - return this.hints_.slice(); - } - }; - /** - * Calculate the extent for the current view state and the passed size. - * The size is the pixel dimensions of the box into which the calculated extent - * should fit. In most cases you want to get the extent of the entire map, - * that is `map.getSize()`. - * @param {import("./size.js").Size=} opt_size Box pixel size. If not provided, the size - * of the map that uses this view will be used. - * @return {import("./extent.js").Extent} Extent. - * @api - */ - View.prototype.calculateExtent = function (opt_size) { - var extent = this.calculateExtentInternal(opt_size); - return toUserExtent(extent, this.getProjection()); - }; - /** - * @param {import("./size.js").Size=} opt_size Box pixel size. If not provided, - * the map's last known viewport size will be used. - * @return {import("./extent.js").Extent} Extent. - */ - View.prototype.calculateExtentInternal = function (opt_size) { - var size = opt_size || this.getViewportSize_(); - var center = /** @type {!import("./coordinate.js").Coordinate} */ (this.getCenterInternal()); - assert(center, 1); // The view center is not defined - var resolution = /** @type {!number} */ (this.getResolution()); - assert(resolution !== undefined, 2); // The view resolution is not defined - var rotation = /** @type {!number} */ (this.getRotation()); - assert(rotation !== undefined, 3); // The view rotation is not defined - return getForViewAndSize(center, resolution, rotation, size); - }; - /** - * Get the maximum resolution of the view. - * @return {number} The maximum resolution of the view. - * @api - */ - View.prototype.getMaxResolution = function () { - return this.maxResolution_; - }; - /** - * Get the minimum resolution of the view. - * @return {number} The minimum resolution of the view. - * @api - */ - View.prototype.getMinResolution = function () { - return this.minResolution_; - }; - /** - * Get the maximum zoom level for the view. - * @return {number} The maximum zoom level. - * @api - */ - View.prototype.getMaxZoom = function () { - return /** @type {number} */ (this.getZoomForResolution(this.minResolution_)); - }; - /** - * Set a new maximum zoom level for the view. - * @param {number} zoom The maximum zoom level. - * @api - */ - View.prototype.setMaxZoom = function (zoom) { - this.applyOptions_(this.getUpdatedOptions_({ maxZoom: zoom })); - }; - /** - * Get the minimum zoom level for the view. - * @return {number} The minimum zoom level. - * @api - */ - View.prototype.getMinZoom = function () { - return /** @type {number} */ (this.getZoomForResolution(this.maxResolution_)); - }; - /** - * Set a new minimum zoom level for the view. - * @param {number} zoom The minimum zoom level. - * @api - */ - View.prototype.setMinZoom = function (zoom) { - this.applyOptions_(this.getUpdatedOptions_({ minZoom: zoom })); - }; - /** - * Set whether the view shoud allow intermediary zoom levels. - * @param {boolean} enabled Whether the resolution is constrained. - * @api - */ - View.prototype.setConstrainResolution = function (enabled) { - this.applyOptions_(this.getUpdatedOptions_({ constrainResolution: enabled })); - }; - /** - * Get the view projection. - * @return {import("./proj/Projection.js").default} The projection of the view. - * @api - */ - View.prototype.getProjection = function () { - return this.projection_; - }; - /** - * Get the view resolution. - * @return {number|undefined} The resolution of the view. - * @observable - * @api - */ - View.prototype.getResolution = function () { - return /** @type {number|undefined} */ (this.get(ViewProperty.RESOLUTION)); - }; - /** - * Get the resolutions for the view. This returns the array of resolutions - * passed to the constructor of the View, or undefined if none were given. - * @return {Array|undefined} The resolutions of the view. - * @api - */ - View.prototype.getResolutions = function () { - return this.resolutions_; - }; - /** - * Get the resolution for a provided extent (in map units) and size (in pixels). - * @param {import("./extent.js").Extent} extent Extent. - * @param {import("./size.js").Size=} opt_size Box pixel size. - * @return {number} The resolution at which the provided extent will render at - * the given size. - * @api - */ - View.prototype.getResolutionForExtent = function (extent, opt_size) { - return this.getResolutionForExtentInternal(fromUserExtent(extent, this.getProjection()), opt_size); - }; - /** - * Get the resolution for a provided extent (in map units) and size (in pixels). - * @param {import("./extent.js").Extent} extent Extent. - * @param {import("./size.js").Size=} opt_size Box pixel size. - * @return {number} The resolution at which the provided extent will render at - * the given size. - */ - View.prototype.getResolutionForExtentInternal = function (extent, opt_size) { - var size = opt_size || this.getViewportSize_(); - var xResolution = getWidth(extent) / size[0]; - var yResolution = getHeight(extent) / size[1]; - return Math.max(xResolution, yResolution); - }; - /** - * Return a function that returns a value between 0 and 1 for a - * resolution. Exponential scaling is assumed. - * @param {number=} opt_power Power. - * @return {function(number): number} Resolution for value function. - */ - View.prototype.getResolutionForValueFunction = function (opt_power) { - var power = opt_power || 2; - var maxResolution = this.getConstrainedResolution(this.maxResolution_); - var minResolution = this.minResolution_; - var max = Math.log(maxResolution / minResolution) / Math.log(power); - return ( - /** - * @param {number} value Value. - * @return {number} Resolution. - */ - function (value) { - var resolution = maxResolution / Math.pow(power, value * max); - return resolution; - }); - }; - /** - * Get the view rotation. - * @return {number} The rotation of the view in radians. - * @observable - * @api - */ - View.prototype.getRotation = function () { - return /** @type {number} */ (this.get(ViewProperty.ROTATION)); - }; - /** - * Return a function that returns a resolution for a value between - * 0 and 1. Exponential scaling is assumed. - * @param {number=} opt_power Power. - * @return {function(number): number} Value for resolution function. - */ - View.prototype.getValueForResolutionFunction = function (opt_power) { - var logPower = Math.log(opt_power || 2); - var maxResolution = this.getConstrainedResolution(this.maxResolution_); - var minResolution = this.minResolution_; - var max = Math.log(maxResolution / minResolution) / logPower; - return ( - /** - * @param {number} resolution Resolution. - * @return {number} Value. - */ - function (resolution) { - var value = Math.log(maxResolution / resolution) / logPower / max; - return value; - }); - }; - /** - * Returns the size of the viewport minus padding. - * @private - * @param {number=} opt_rotation Take into account the rotation of the viewport when giving the size - * @return {import("./size.js").Size} Viewport size reduced by the padding. - */ - View.prototype.getViewportSizeMinusPadding_ = function (opt_rotation) { - var size = this.getViewportSize_(opt_rotation); - var padding = this.padding; - if (padding) { - size = [ - size[0] - padding[1] - padding[3], - size[1] - padding[0] - padding[2], - ]; - } - return size; - }; - /** - * @return {State} View state. - */ - View.prototype.getState = function () { - var projection = this.getProjection(); - var resolution = /** @type {number} */ (this.getResolution()); - var rotation = this.getRotation(); - var center = /** @type {import("./coordinate.js").Coordinate} */ (this.getCenterInternal()); - var padding = this.padding; - if (padding) { - var reducedSize = this.getViewportSizeMinusPadding_(); - center = calculateCenterOn(center, this.getViewportSize_(), [reducedSize[0] / 2 + padding[3], reducedSize[1] / 2 + padding[0]], resolution, rotation); - } - return { - center: center.slice(0), - projection: projection !== undefined ? projection : null, - resolution: resolution, - rotation: rotation, - zoom: this.getZoom(), - }; - }; - /** - * Get the current zoom level. This method may return non-integer zoom levels - * if the view does not constrain the resolution, or if an interaction or - * animation is underway. - * @return {number|undefined} Zoom. - * @api - */ - View.prototype.getZoom = function () { - var zoom; - var resolution = this.getResolution(); - if (resolution !== undefined) { - zoom = this.getZoomForResolution(resolution); - } - return zoom; - }; - /** - * Get the zoom level for a resolution. - * @param {number} resolution The resolution. - * @return {number|undefined} The zoom level for the provided resolution. - * @api - */ - View.prototype.getZoomForResolution = function (resolution) { - var offset = this.minZoom_ || 0; - var max, zoomFactor; - if (this.resolutions_) { - var nearest = linearFindNearest(this.resolutions_, resolution, 1); - offset = nearest; - max = this.resolutions_[nearest]; - if (nearest == this.resolutions_.length - 1) { - zoomFactor = 2; - } - else { - zoomFactor = max / this.resolutions_[nearest + 1]; - } - } - else { - max = this.maxResolution_; - zoomFactor = this.zoomFactor_; - } - return offset + Math.log(max / resolution) / Math.log(zoomFactor); - }; - /** - * Get the resolution for a zoom level. - * @param {number} zoom Zoom level. - * @return {number} The view resolution for the provided zoom level. - * @api - */ - View.prototype.getResolutionForZoom = function (zoom) { - if (this.resolutions_) { - if (this.resolutions_.length <= 1) { - return 0; - } - var baseLevel = clamp(Math.floor(zoom), 0, this.resolutions_.length - 2); - var zoomFactor = this.resolutions_[baseLevel] / this.resolutions_[baseLevel + 1]; - return (this.resolutions_[baseLevel] / - Math.pow(zoomFactor, clamp(zoom - baseLevel, 0, 1))); - } - else { - return (this.maxResolution_ / Math.pow(this.zoomFactor_, zoom - this.minZoom_)); - } - }; - /** - * Fit the given geometry or extent based on the given map size and border. - * The size is pixel dimensions of the box to fit the extent into. - * In most cases you will want to use the map size, that is `map.getSize()`. - * Takes care of the map angle. - * @param {import("./geom/SimpleGeometry.js").default|import("./extent.js").Extent} geometryOrExtent The geometry or - * extent to fit the view to. - * @param {FitOptions=} opt_options Options. - * @api - */ - View.prototype.fit = function (geometryOrExtent, opt_options) { - /** @type {import("./geom/SimpleGeometry.js").default} */ - var geometry; - assert(Array.isArray(geometryOrExtent) || - typeof ( /** @type {?} */(geometryOrExtent).getSimplifiedGeometry) === - 'function', 24); // Invalid extent or geometry provided as `geometry` - if (Array.isArray(geometryOrExtent)) { - assert(!isEmpty$1(geometryOrExtent), 25); // Cannot fit empty extent provided as `geometry` - var extent = fromUserExtent(geometryOrExtent, this.getProjection()); - geometry = fromExtent(extent); - } - else if (geometryOrExtent.getType() === GeometryType.CIRCLE) { - var extent = fromUserExtent(geometryOrExtent.getExtent(), this.getProjection()); - geometry = fromExtent(extent); - geometry.rotate(this.getRotation(), getCenter(extent)); - } - else { - var userProjection = getUserProjection(); - if (userProjection) { - geometry = /** @type {import("./geom/SimpleGeometry.js").default} */ (geometryOrExtent - .clone() - .transform(userProjection, this.getProjection())); - } - else { - geometry = geometryOrExtent; - } - } - this.fitInternal(geometry, opt_options); - }; - /** - * @param {import("./geom/SimpleGeometry.js").default} geometry The geometry. - * @param {FitOptions=} opt_options Options. - */ - View.prototype.fitInternal = function (geometry, opt_options) { - var options = opt_options || {}; - var size = options.size; - if (!size) { - size = this.getViewportSizeMinusPadding_(); - } - var padding = options.padding !== undefined ? options.padding : [0, 0, 0, 0]; - var nearest = options.nearest !== undefined ? options.nearest : false; - var minResolution; - if (options.minResolution !== undefined) { - minResolution = options.minResolution; - } - else if (options.maxZoom !== undefined) { - minResolution = this.getResolutionForZoom(options.maxZoom); - } - else { - minResolution = 0; - } - var coords = geometry.getFlatCoordinates(); - // calculate rotated extent - var rotation = this.getRotation(); - var cosAngle = Math.cos(-rotation); - var sinAngle = Math.sin(-rotation); - var minRotX = +Infinity; - var minRotY = +Infinity; - var maxRotX = -Infinity; - var maxRotY = -Infinity; - var stride = geometry.getStride(); - for (var i = 0, ii = coords.length; i < ii; i += stride) { - var rotX = coords[i] * cosAngle - coords[i + 1] * sinAngle; - var rotY = coords[i] * sinAngle + coords[i + 1] * cosAngle; - minRotX = Math.min(minRotX, rotX); - minRotY = Math.min(minRotY, rotY); - maxRotX = Math.max(maxRotX, rotX); - maxRotY = Math.max(maxRotY, rotY); - } - // calculate resolution - var resolution = this.getResolutionForExtentInternal([minRotX, minRotY, maxRotX, maxRotY], [size[0] - padding[1] - padding[3], size[1] - padding[0] - padding[2]]); - resolution = isNaN(resolution) - ? minResolution - : Math.max(resolution, minResolution); - resolution = this.getConstrainedResolution(resolution, nearest ? 0 : 1); - // calculate center - sinAngle = -sinAngle; // go back to original rotation - var centerRotX = (minRotX + maxRotX) / 2; - var centerRotY = (minRotY + maxRotY) / 2; - centerRotX += ((padding[1] - padding[3]) / 2) * resolution; - centerRotY += ((padding[0] - padding[2]) / 2) * resolution; - var centerX = centerRotX * cosAngle - centerRotY * sinAngle; - var centerY = centerRotY * cosAngle + centerRotX * sinAngle; - var center = this.getConstrainedCenter([centerX, centerY], resolution); - var callback = options.callback ? options.callback : VOID; - if (options.duration !== undefined) { - this.animateInternal({ - resolution: resolution, - center: center, - duration: options.duration, - easing: options.easing, - }, callback); - } - else { - this.targetResolution_ = resolution; - this.targetCenter_ = center; - this.applyTargetState_(false, true); - animationCallback(callback, true); - } - }; - /** - * Center on coordinate and view position. - * @param {import("./coordinate.js").Coordinate} coordinate Coordinate. - * @param {import("./size.js").Size} size Box pixel size. - * @param {import("./pixel.js").Pixel} position Position on the view to center on. - * @api - */ - View.prototype.centerOn = function (coordinate, size, position) { - this.centerOnInternal(fromUserCoordinate(coordinate, this.getProjection()), size, position); - }; - /** - * @param {import("./coordinate.js").Coordinate} coordinate Coordinate. - * @param {import("./size.js").Size} size Box pixel size. - * @param {import("./pixel.js").Pixel} position Position on the view to center on. - */ - View.prototype.centerOnInternal = function (coordinate, size, position) { - this.setCenterInternal(calculateCenterOn(coordinate, size, position, this.getResolution(), this.getRotation())); - }; - /** - * Calculates the shift between map and viewport center. - * @param {import("./coordinate.js").Coordinate} center Center. - * @param {number} resolution Resolution. - * @param {number} rotation Rotation. - * @param {import("./size.js").Size} size Size. - * @return {Array|undefined} Center shift. - */ - View.prototype.calculateCenterShift = function (center, resolution, rotation, size) { - var centerShift; - var padding = this.padding; - if (padding && center) { - var reducedSize = this.getViewportSizeMinusPadding_(-rotation); - var shiftedCenter = calculateCenterOn(center, size, [reducedSize[0] / 2 + padding[3], reducedSize[1] / 2 + padding[0]], resolution, rotation); - centerShift = [ - center[0] - shiftedCenter[0], - center[1] - shiftedCenter[1], - ]; - } - return centerShift; - }; - /** - * @return {boolean} Is defined. - */ - View.prototype.isDef = function () { - return !!this.getCenterInternal() && this.getResolution() !== undefined; - }; - /** - * Adds relative coordinates to the center of the view. Any extent constraint will apply. - * @param {import("./coordinate.js").Coordinate} deltaCoordinates Relative value to add. - * @api - */ - View.prototype.adjustCenter = function (deltaCoordinates) { - var center = toUserCoordinate(this.targetCenter_, this.getProjection()); - this.setCenter([ - center[0] + deltaCoordinates[0], - center[1] + deltaCoordinates[1], - ]); - }; - /** - * Adds relative coordinates to the center of the view. Any extent constraint will apply. - * @param {import("./coordinate.js").Coordinate} deltaCoordinates Relative value to add. - */ - View.prototype.adjustCenterInternal = function (deltaCoordinates) { - var center = this.targetCenter_; - this.setCenterInternal([ - center[0] + deltaCoordinates[0], - center[1] + deltaCoordinates[1], - ]); - }; - /** - * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution - * constraint will apply. - * @param {number} ratio The ratio to apply on the view resolution. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. - * @api - */ - View.prototype.adjustResolution = function (ratio, opt_anchor) { - var anchor = opt_anchor && fromUserCoordinate(opt_anchor, this.getProjection()); - this.adjustResolutionInternal(ratio, anchor); - }; - /** - * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution - * constraint will apply. - * @param {number} ratio The ratio to apply on the view resolution. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. - */ - View.prototype.adjustResolutionInternal = function (ratio, opt_anchor) { - var isMoving = this.getAnimating() || this.getInteracting(); - var size = this.getViewportSize_(this.getRotation()); - var newResolution = this.constraints_.resolution(this.targetResolution_ * ratio, 0, size, isMoving); - if (opt_anchor) { - this.targetCenter_ = this.calculateCenterZoom(newResolution, opt_anchor); - } - this.targetResolution_ *= ratio; - this.applyTargetState_(); - }; - /** - * Adds a value to the view zoom level, optionally using an anchor. Any resolution - * constraint will apply. - * @param {number} delta Relative value to add to the zoom level. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. - * @api - */ - View.prototype.adjustZoom = function (delta, opt_anchor) { - this.adjustResolution(Math.pow(this.zoomFactor_, -delta), opt_anchor); - }; - /** - * Adds a value to the view rotation, optionally using an anchor. Any rotation - * constraint will apply. - * @param {number} delta Relative value to add to the zoom rotation, in radians. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The rotation center. - * @api - */ - View.prototype.adjustRotation = function (delta, opt_anchor) { - if (opt_anchor) { - opt_anchor = fromUserCoordinate(opt_anchor, this.getProjection()); - } - this.adjustRotationInternal(delta, opt_anchor); - }; - /** - * @param {number} delta Relative value to add to the zoom rotation, in radians. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The rotation center. - */ - View.prototype.adjustRotationInternal = function (delta, opt_anchor) { - var isMoving = this.getAnimating() || this.getInteracting(); - var newRotation = this.constraints_.rotation(this.targetRotation_ + delta, isMoving); - if (opt_anchor) { - this.targetCenter_ = this.calculateCenterRotate(newRotation, opt_anchor); - } - this.targetRotation_ += delta; - this.applyTargetState_(); - }; - /** - * Set the center of the current view. Any extent constraint will apply. - * @param {import("./coordinate.js").Coordinate|undefined} center The center of the view. - * @observable - * @api - */ - View.prototype.setCenter = function (center) { - this.setCenterInternal(fromUserCoordinate(center, this.getProjection())); - }; - /** - * Set the center using the view projection (not the user projection). - * @param {import("./coordinate.js").Coordinate|undefined} center The center of the view. - */ - View.prototype.setCenterInternal = function (center) { - this.targetCenter_ = center; - this.applyTargetState_(); - }; - /** - * @param {import("./ViewHint.js").default} hint Hint. - * @param {number} delta Delta. - * @return {number} New value. - */ - View.prototype.setHint = function (hint, delta) { - this.hints_[hint] += delta; - this.changed(); - return this.hints_[hint]; - }; - /** - * Set the resolution for this view. Any resolution constraint will apply. - * @param {number|undefined} resolution The resolution of the view. - * @observable - * @api - */ - View.prototype.setResolution = function (resolution) { - this.targetResolution_ = resolution; - this.applyTargetState_(); - }; - /** - * Set the rotation for this view. Any rotation constraint will apply. - * @param {number} rotation The rotation of the view in radians. - * @observable - * @api - */ - View.prototype.setRotation = function (rotation) { - this.targetRotation_ = rotation; - this.applyTargetState_(); - }; - /** - * Zoom to a specific zoom level. Any resolution constrain will apply. - * @param {number} zoom Zoom level. - * @api - */ - View.prototype.setZoom = function (zoom) { - this.setResolution(this.getResolutionForZoom(zoom)); - }; - /** - * Recompute rotation/resolution/center based on target values. - * Note: we have to compute rotation first, then resolution and center considering that - * parameters can influence one another in case a view extent constraint is present. - * @param {boolean=} opt_doNotCancelAnims Do not cancel animations. - * @param {boolean=} opt_forceMoving Apply constraints as if the view is moving. - * @private - */ - View.prototype.applyTargetState_ = function (opt_doNotCancelAnims, opt_forceMoving) { - var isMoving = this.getAnimating() || this.getInteracting() || opt_forceMoving; - // compute rotation - var newRotation = this.constraints_.rotation(this.targetRotation_, isMoving); - var size = this.getViewportSize_(newRotation); - var newResolution = this.constraints_.resolution(this.targetResolution_, 0, size, isMoving); - var newCenter = this.constraints_.center(this.targetCenter_, newResolution, size, isMoving, this.calculateCenterShift(this.targetCenter_, newResolution, newRotation, size)); - if (this.get(ViewProperty.ROTATION) !== newRotation) { - this.set(ViewProperty.ROTATION, newRotation); - } - if (this.get(ViewProperty.RESOLUTION) !== newResolution) { - this.set(ViewProperty.RESOLUTION, newResolution); - } - if (!this.get(ViewProperty.CENTER) || - !equals$2(this.get(ViewProperty.CENTER), newCenter)) { - this.set(ViewProperty.CENTER, newCenter); - } - if (this.getAnimating() && !opt_doNotCancelAnims) { - this.cancelAnimations(); - } - this.cancelAnchor_ = undefined; - }; - /** - * If any constraints need to be applied, an animation will be triggered. - * This is typically done on interaction end. - * Note: calling this with a duration of 0 will apply the constrained values straight away, - * without animation. - * @param {number=} opt_duration The animation duration in ms. - * @param {number=} opt_resolutionDirection Which direction to zoom. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. - */ - View.prototype.resolveConstraints = function (opt_duration, opt_resolutionDirection, opt_anchor) { - var duration = opt_duration !== undefined ? opt_duration : 200; - var direction = opt_resolutionDirection || 0; - var newRotation = this.constraints_.rotation(this.targetRotation_); - var size = this.getViewportSize_(newRotation); - var newResolution = this.constraints_.resolution(this.targetResolution_, direction, size); - var newCenter = this.constraints_.center(this.targetCenter_, newResolution, size, false, this.calculateCenterShift(this.targetCenter_, newResolution, newRotation, size)); - if (duration === 0 && !this.cancelAnchor_) { - this.targetResolution_ = newResolution; - this.targetRotation_ = newRotation; - this.targetCenter_ = newCenter; - this.applyTargetState_(); - return; - } - var anchor = opt_anchor || (duration === 0 ? this.cancelAnchor_ : undefined); - this.cancelAnchor_ = undefined; - if (this.getResolution() !== newResolution || - this.getRotation() !== newRotation || - !this.getCenterInternal() || - !equals$2(this.getCenterInternal(), newCenter)) { - if (this.getAnimating()) { - this.cancelAnimations(); - } - this.animateInternal({ - rotation: newRotation, - center: newCenter, - resolution: newResolution, - duration: duration, - easing: easeOut, - anchor: anchor, - }); - } - }; - /** - * Notify the View that an interaction has started. - * The view state will be resolved to a stable one if needed - * (depending on its constraints). - * @api - */ - View.prototype.beginInteraction = function () { - this.resolveConstraints(0); - this.setHint(ViewHint.INTERACTING, 1); - }; - /** - * Notify the View that an interaction has ended. The view state will be resolved - * to a stable one if needed (depending on its constraints). - * @param {number=} opt_duration Animation duration in ms. - * @param {number=} opt_resolutionDirection Which direction to zoom. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. - * @api - */ - View.prototype.endInteraction = function (opt_duration, opt_resolutionDirection, opt_anchor) { - var anchor = opt_anchor && fromUserCoordinate(opt_anchor, this.getProjection()); - this.endInteractionInternal(opt_duration, opt_resolutionDirection, anchor); - }; - /** - * Notify the View that an interaction has ended. The view state will be resolved - * to a stable one if needed (depending on its constraints). - * @param {number=} opt_duration Animation duration in ms. - * @param {number=} opt_resolutionDirection Which direction to zoom. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. - */ - View.prototype.endInteractionInternal = function (opt_duration, opt_resolutionDirection, opt_anchor) { - this.setHint(ViewHint.INTERACTING, -1); - this.resolveConstraints(opt_duration, opt_resolutionDirection, opt_anchor); - }; - /** - * Get a valid position for the view center according to the current constraints. - * @param {import("./coordinate.js").Coordinate|undefined} targetCenter Target center position. - * @param {number=} opt_targetResolution Target resolution. If not supplied, the current one will be used. - * This is useful to guess a valid center position at a different zoom level. - * @return {import("./coordinate.js").Coordinate|undefined} Valid center position. - */ - View.prototype.getConstrainedCenter = function (targetCenter, opt_targetResolution) { - var size = this.getViewportSize_(this.getRotation()); - return this.constraints_.center(targetCenter, opt_targetResolution || this.getResolution(), size); - }; - /** - * Get a valid zoom level according to the current view constraints. - * @param {number|undefined} targetZoom Target zoom. - * @param {number=} [opt_direction=0] Indicate which resolution should be used - * by a renderer if the view resolution does not match any resolution of the tile source. - * If 0, the nearest resolution will be used. If 1, the nearest lower resolution - * will be used. If -1, the nearest higher resolution will be used. - * @return {number|undefined} Valid zoom level. - */ - View.prototype.getConstrainedZoom = function (targetZoom, opt_direction) { - var targetRes = this.getResolutionForZoom(targetZoom); - return this.getZoomForResolution(this.getConstrainedResolution(targetRes, opt_direction)); - }; - /** - * Get a valid resolution according to the current view constraints. - * @param {number|undefined} targetResolution Target resolution. - * @param {number=} [opt_direction=0] Indicate which resolution should be used - * by a renderer if the view resolution does not match any resolution of the tile source. - * If 0, the nearest resolution will be used. If 1, the nearest lower resolution - * will be used. If -1, the nearest higher resolution will be used. - * @return {number|undefined} Valid resolution. - */ - View.prototype.getConstrainedResolution = function (targetResolution, opt_direction) { - var direction = opt_direction || 0; - var size = this.getViewportSize_(this.getRotation()); - return this.constraints_.resolution(targetResolution, direction, size); - }; - return View; -}(BaseObject)); -/** - * @param {Function} callback Callback. - * @param {*} returnValue Return value. - */ -function animationCallback(callback, returnValue) { - setTimeout(function () { - callback(returnValue); - }, 0); -} -/** - * @param {ViewOptions} options View options. - * @return {import("./centerconstraint.js").Type} The constraint. - */ -function createCenterConstraint(options) { - if (options.extent !== undefined) { - var smooth = options.smoothExtentConstraint !== undefined - ? options.smoothExtentConstraint - : true; - return createExtent(options.extent, options.constrainOnlyCenter, smooth); - } - var projection = createProjection(options.projection, 'EPSG:3857'); - if (options.multiWorld !== true && projection.isGlobal()) { - var extent = projection.getExtent().slice(); - extent[0] = -Infinity; - extent[2] = Infinity; - return createExtent(extent, false, false); - } - return none; -} -/** - * @param {ViewOptions} options View options. - * @return {{constraint: import("./resolutionconstraint.js").Type, maxResolution: number, - * minResolution: number, minZoom: number, zoomFactor: number}} The constraint. - */ -function createResolutionConstraint(options) { - var resolutionConstraint; - var maxResolution; - var minResolution; - // TODO: move these to be ol constants - // see https://github.com/openlayers/openlayers/issues/2076 - var defaultMaxZoom = 28; - var defaultZoomFactor = 2; - var minZoom = options.minZoom !== undefined ? options.minZoom : DEFAULT_MIN_ZOOM; - var maxZoom = options.maxZoom !== undefined ? options.maxZoom : defaultMaxZoom; - var zoomFactor = options.zoomFactor !== undefined ? options.zoomFactor : defaultZoomFactor; - var multiWorld = options.multiWorld !== undefined ? options.multiWorld : false; - var smooth = options.smoothResolutionConstraint !== undefined - ? options.smoothResolutionConstraint - : true; - var showFullExtent = options.showFullExtent !== undefined ? options.showFullExtent : false; - var projection = createProjection(options.projection, 'EPSG:3857'); - var projExtent = projection.getExtent(); - var constrainOnlyCenter = options.constrainOnlyCenter; - var extent = options.extent; - if (!multiWorld && !extent && projection.isGlobal()) { - constrainOnlyCenter = false; - extent = projExtent; - } - if (options.resolutions !== undefined) { - var resolutions = options.resolutions; - maxResolution = resolutions[minZoom]; - minResolution = - resolutions[maxZoom] !== undefined - ? resolutions[maxZoom] - : resolutions[resolutions.length - 1]; - if (options.constrainResolution) { - resolutionConstraint = createSnapToResolutions(resolutions, smooth, !constrainOnlyCenter && extent, showFullExtent); - } - else { - resolutionConstraint = createMinMaxResolution(maxResolution, minResolution, smooth, !constrainOnlyCenter && extent, showFullExtent); - } - } - else { - // calculate the default min and max resolution - var size = !projExtent - ? // use an extent that can fit the whole world if need be - (360 * METERS_PER_UNIT[Units.DEGREES]) / projection.getMetersPerUnit() - : Math.max(getWidth(projExtent), getHeight(projExtent)); - var defaultMaxResolution = size / DEFAULT_TILE_SIZE / Math.pow(defaultZoomFactor, DEFAULT_MIN_ZOOM); - var defaultMinResolution = defaultMaxResolution / - Math.pow(defaultZoomFactor, defaultMaxZoom - DEFAULT_MIN_ZOOM); - // user provided maxResolution takes precedence - maxResolution = options.maxResolution; - if (maxResolution !== undefined) { - minZoom = 0; - } - else { - maxResolution = defaultMaxResolution / Math.pow(zoomFactor, minZoom); - } - // user provided minResolution takes precedence - minResolution = options.minResolution; - if (minResolution === undefined) { - if (options.maxZoom !== undefined) { - if (options.maxResolution !== undefined) { - minResolution = maxResolution / Math.pow(zoomFactor, maxZoom); - } - else { - minResolution = defaultMaxResolution / Math.pow(zoomFactor, maxZoom); - } - } - else { - minResolution = defaultMinResolution; - } - } - // given discrete zoom levels, minResolution may be different than provided - maxZoom = - minZoom + - Math.floor(Math.log(maxResolution / minResolution) / Math.log(zoomFactor)); - minResolution = maxResolution / Math.pow(zoomFactor, maxZoom - minZoom); - if (options.constrainResolution) { - resolutionConstraint = createSnapToPower(zoomFactor, maxResolution, minResolution, smooth, !constrainOnlyCenter && extent, showFullExtent); - } - else { - resolutionConstraint = createMinMaxResolution(maxResolution, minResolution, smooth, !constrainOnlyCenter && extent, showFullExtent); - } - } - return { - constraint: resolutionConstraint, - maxResolution: maxResolution, - minResolution: minResolution, - minZoom: minZoom, - zoomFactor: zoomFactor, - }; -} -/** - * @param {ViewOptions} options View options. - * @return {import("./rotationconstraint.js").Type} Rotation constraint. - */ -function createRotationConstraint(options) { - var enableRotation = options.enableRotation !== undefined ? options.enableRotation : true; - if (enableRotation) { - var constrainRotation = options.constrainRotation; - if (constrainRotation === undefined || constrainRotation === true) { - return createSnapToZero(); - } - else if (constrainRotation === false) { - return none$1; - } - else if (typeof constrainRotation === 'number') { - return createSnapToN(constrainRotation); - } - else { - return none$1; - } - } - else { - return disable; - } -} -/** - * Determine if an animation involves no view change. - * @param {Animation} animation The animation. - * @return {boolean} The animation involves no view change. - */ -function isNoopAnimation(animation) { - if (animation.sourceCenter && animation.targetCenter) { - if (!equals$2(animation.sourceCenter, animation.targetCenter)) { - return false; - } - } - if (animation.sourceResolution !== animation.targetResolution) { - return false; - } - if (animation.sourceRotation !== animation.targetRotation) { - return false; - } - return true; -} -/** - * @param {import("./coordinate.js").Coordinate} coordinate Coordinate. - * @param {import("./size.js").Size} size Box pixel size. - * @param {import("./pixel.js").Pixel} position Position on the view to center on. - * @param {number} resolution Resolution. - * @param {number} rotation Rotation. - * @return {import("./coordinate.js").Coordinate} Shifted center. - */ -function calculateCenterOn(coordinate, size, position, resolution, rotation) { - // calculate rotated position - var cosAngle = Math.cos(-rotation); - var sinAngle = Math.sin(-rotation); - var rotX = coordinate[0] * cosAngle - coordinate[1] * sinAngle; - var rotY = coordinate[1] * cosAngle + coordinate[0] * sinAngle; - rotX += (size[0] / 2 - position[0]) * resolution; - rotY += (position[1] - size[1] / 2) * resolution; - // go back to original angle - sinAngle = -sinAngle; // go back to original rotation - var centerX = rotX * cosAngle - rotY * sinAngle; - var centerY = rotY * cosAngle + rotX * sinAngle; - return [centerX, centerY]; -} - -/** - * @module ol/color - */ -/** - * Return the color as an rgba string. - * @param {Color|string} color Color. - * @return {string} Rgba string. - * @api - */ -function asString(color) { - if (typeof color === 'string') { - return color; - } - else { - return toString$1(color); - } -} -/** - * @param {Color} color Color. - * @return {string} String. - */ -function toString$1(color) { - var r = color[0]; - if (r != (r | 0)) { - r = (r + 0.5) | 0; - } - var g = color[1]; - if (g != (g | 0)) { - g = (g + 0.5) | 0; - } - var b = color[2]; - if (b != (b | 0)) { - b = (b + 0.5) | 0; - } - var a = color[3] === undefined ? 1 : color[3]; - return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; -} - -/** - * @module ol/style/IconImageCache - */ -/** - * @classdesc - * Singleton class. Available through {@link module:ol/style/IconImageCache~shared}. - */ -var IconImageCache = /** @class */ (function () { - function IconImageCache() { - /** - * @type {!Object} - * @private - */ - this.cache_ = {}; - /** - * @type {number} - * @private - */ - this.cacheSize_ = 0; - /** - * @type {number} - * @private - */ - this.maxCacheSize_ = 32; - } - /** - * FIXME empty description for jsdoc - */ - IconImageCache.prototype.clear = function () { - this.cache_ = {}; - this.cacheSize_ = 0; - }; - /** - * @return {boolean} Can expire cache. - */ - IconImageCache.prototype.canExpireCache = function () { - return this.cacheSize_ > this.maxCacheSize_; - }; - /** - * FIXME empty description for jsdoc - */ - IconImageCache.prototype.expire = function () { - if (this.canExpireCache()) { - var i = 0; - for (var key in this.cache_) { - var iconImage = this.cache_[key]; - if ((i++ & 3) === 0 && !iconImage.hasListener()) { - delete this.cache_[key]; - --this.cacheSize_; - } - } - } - }; - /** - * @param {string} src Src. - * @param {?string} crossOrigin Cross origin. - * @param {import("../color.js").Color} color Color. - * @return {import("./IconImage.js").default} Icon image. - */ - IconImageCache.prototype.get = function (src, crossOrigin, color) { - var key = getKey(src, crossOrigin, color); - return key in this.cache_ ? this.cache_[key] : null; - }; - /** - * @param {string} src Src. - * @param {?string} crossOrigin Cross origin. - * @param {import("../color.js").Color} color Color. - * @param {import("./IconImage.js").default} iconImage Icon image. - */ - IconImageCache.prototype.set = function (src, crossOrigin, color, iconImage) { - var key = getKey(src, crossOrigin, color); - this.cache_[key] = iconImage; - ++this.cacheSize_; - }; - /** - * Set the cache size of the icon cache. Default is `32`. Change this value when - * your map uses more than 32 different icon images and you are not caching icon - * styles on the application level. - * @param {number} maxCacheSize Cache max size. - * @api - */ - IconImageCache.prototype.setSize = function (maxCacheSize) { - this.maxCacheSize_ = maxCacheSize; - this.expire(); - }; - return IconImageCache; -}()); -/** - * @param {string} src Src. - * @param {?string} crossOrigin Cross origin. - * @param {import("../color.js").Color} color Color. - * @return {string} Cache key. - */ -function getKey(src, crossOrigin, color) { - var colorString = color ? asString(color) : 'null'; - return crossOrigin + ':' + src + ':' + colorString; -} -/** - * The {@link module:ol/style/IconImageCache~IconImageCache} for - * {@link module:ol/style/Icon~Icon} images. - * @api - */ -var shared = new IconImageCache(); - -/** - * @module ol/layer/Property - */ -/** - * @enum {string} - */ -var LayerProperty = { - OPACITY: 'opacity', - VISIBLE: 'visible', - EXTENT: 'extent', - Z_INDEX: 'zIndex', - MAX_RESOLUTION: 'maxResolution', - MIN_RESOLUTION: 'minResolution', - MAX_ZOOM: 'maxZoom', - MIN_ZOOM: 'minZoom', - SOURCE: 'source', -}; - -var __extends$c = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {Object} Options - * @property {string} [className='ol-layer'] A CSS class name to set to the layer element. - * @property {number} [opacity=1] Opacity (0, 1). - * @property {boolean} [visible=true] Visibility. - * @property {import("../extent.js").Extent} [extent] The bounding extent for layer rendering. The layer will not be - * rendered outside of this extent. - * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers - * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed - * for layers that are added to the map's `layers` collection, or `Infinity` when the layer's `setMap()` - * method was used. - * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be - * visible. - * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will - * be visible. - * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be - * visible. - * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will - * be visible. - */ -/** - * @classdesc - * Abstract base class; normally only used for creating subclasses and not - * instantiated in apps. - * Note that with {@link module:ol/layer/Base} and all its subclasses, any property set in - * the options is set as a {@link module:ol/Object} property on the layer object, so - * is observable, and has get/set accessors. - * - * @api - */ -var BaseLayer = /** @class */ (function (_super) { - __extends$c(BaseLayer, _super); - /** - * @param {Options} options Layer options. - */ - function BaseLayer(options) { - var _this = _super.call(this) || this; - /** - * @type {Object} - */ - var properties = assign({}, options); - properties[LayerProperty.OPACITY] = - options.opacity !== undefined ? options.opacity : 1; - assert(typeof properties[LayerProperty.OPACITY] === 'number', 64); // Layer opacity must be a number - properties[LayerProperty.VISIBLE] = - options.visible !== undefined ? options.visible : true; - properties[LayerProperty.Z_INDEX] = options.zIndex; - properties[LayerProperty.MAX_RESOLUTION] = - options.maxResolution !== undefined ? options.maxResolution : Infinity; - properties[LayerProperty.MIN_RESOLUTION] = - options.minResolution !== undefined ? options.minResolution : 0; - properties[LayerProperty.MIN_ZOOM] = - options.minZoom !== undefined ? options.minZoom : -Infinity; - properties[LayerProperty.MAX_ZOOM] = - options.maxZoom !== undefined ? options.maxZoom : Infinity; - /** - * @type {string} - * @private - */ - _this.className_ = - properties.className !== undefined ? options.className : 'ol-layer'; - delete properties.className; - _this.setProperties(properties); - /** - * @type {import("./Layer.js").State} - * @private - */ - _this.state_ = null; - return _this; - } - /** - * @return {string} CSS class name. - */ - BaseLayer.prototype.getClassName = function () { - return this.className_; - }; - /** - * This method is not meant to be called by layers or layer renderers because the state - * is incorrect if the layer is included in a layer group. - * - * @param {boolean=} opt_managed Layer is managed. - * @return {import("./Layer.js").State} Layer state. - */ - BaseLayer.prototype.getLayerState = function (opt_managed) { - /** @type {import("./Layer.js").State} */ - var state = this.state_ || - /** @type {?} */ ({ - layer: this, - managed: opt_managed === undefined ? true : opt_managed, - }); - var zIndex = this.getZIndex(); - state.opacity = clamp(Math.round(this.getOpacity() * 100) / 100, 0, 1); - state.sourceState = this.getSourceState(); - state.visible = this.getVisible(); - state.extent = this.getExtent(); - state.zIndex = - zIndex !== undefined ? zIndex : state.managed === false ? Infinity : 0; - state.maxResolution = this.getMaxResolution(); - state.minResolution = Math.max(this.getMinResolution(), 0); - state.minZoom = this.getMinZoom(); - state.maxZoom = this.getMaxZoom(); - this.state_ = state; - return state; - }; - /** - * @abstract - * @param {Array=} opt_array Array of layers (to be - * modified in place). - * @return {Array} Array of layers. - */ - BaseLayer.prototype.getLayersArray = function (opt_array) { - return abstract(); - }; - /** - * @abstract - * @param {Array=} opt_states Optional list of layer - * states (to be modified in place). - * @return {Array} List of layer states. - */ - BaseLayer.prototype.getLayerStatesArray = function (opt_states) { - return abstract(); - }; - /** - * Return the {@link module:ol/extent~Extent extent} of the layer or `undefined` if it - * will be visible regardless of extent. - * @return {import("../extent.js").Extent|undefined} The layer extent. - * @observable - * @api - */ - BaseLayer.prototype.getExtent = function () { - return /** @type {import("../extent.js").Extent|undefined} */ (this.get(LayerProperty.EXTENT)); - }; - /** - * Return the maximum resolution of the layer. - * @return {number} The maximum resolution of the layer. - * @observable - * @api - */ - BaseLayer.prototype.getMaxResolution = function () { - return /** @type {number} */ (this.get(LayerProperty.MAX_RESOLUTION)); - }; - /** - * Return the minimum resolution of the layer. - * @return {number} The minimum resolution of the layer. - * @observable - * @api - */ - BaseLayer.prototype.getMinResolution = function () { - return /** @type {number} */ (this.get(LayerProperty.MIN_RESOLUTION)); - }; - /** - * Return the minimum zoom level of the layer. - * @return {number} The minimum zoom level of the layer. - * @observable - * @api - */ - BaseLayer.prototype.getMinZoom = function () { - return /** @type {number} */ (this.get(LayerProperty.MIN_ZOOM)); - }; - /** - * Return the maximum zoom level of the layer. - * @return {number} The maximum zoom level of the layer. - * @observable - * @api - */ - BaseLayer.prototype.getMaxZoom = function () { - return /** @type {number} */ (this.get(LayerProperty.MAX_ZOOM)); - }; - /** - * Return the opacity of the layer (between 0 and 1). - * @return {number} The opacity of the layer. - * @observable - * @api - */ - BaseLayer.prototype.getOpacity = function () { - return /** @type {number} */ (this.get(LayerProperty.OPACITY)); - }; - /** - * @abstract - * @return {import("../source/State.js").default} Source state. - */ - BaseLayer.prototype.getSourceState = function () { - return abstract(); - }; - /** - * Return the visibility of the layer (`true` or `false`). - * @return {boolean} The visibility of the layer. - * @observable - * @api - */ - BaseLayer.prototype.getVisible = function () { - return /** @type {boolean} */ (this.get(LayerProperty.VISIBLE)); - }; - /** - * Return the Z-index of the layer, which is used to order layers before - * rendering. The default Z-index is 0. - * @return {number} The Z-index of the layer. - * @observable - * @api - */ - BaseLayer.prototype.getZIndex = function () { - return /** @type {number} */ (this.get(LayerProperty.Z_INDEX)); - }; - /** - * Set the extent at which the layer is visible. If `undefined`, the layer - * will be visible at all extents. - * @param {import("../extent.js").Extent|undefined} extent The extent of the layer. - * @observable - * @api - */ - BaseLayer.prototype.setExtent = function (extent) { - this.set(LayerProperty.EXTENT, extent); - }; - /** - * Set the maximum resolution at which the layer is visible. - * @param {number} maxResolution The maximum resolution of the layer. - * @observable - * @api - */ - BaseLayer.prototype.setMaxResolution = function (maxResolution) { - this.set(LayerProperty.MAX_RESOLUTION, maxResolution); - }; - /** - * Set the minimum resolution at which the layer is visible. - * @param {number} minResolution The minimum resolution of the layer. - * @observable - * @api - */ - BaseLayer.prototype.setMinResolution = function (minResolution) { - this.set(LayerProperty.MIN_RESOLUTION, minResolution); - }; - /** - * Set the maximum zoom (exclusive) at which the layer is visible. - * Note that the zoom levels for layer visibility are based on the - * view zoom level, which may be different from a tile source zoom level. - * @param {number} maxZoom The maximum zoom of the layer. - * @observable - * @api - */ - BaseLayer.prototype.setMaxZoom = function (maxZoom) { - this.set(LayerProperty.MAX_ZOOM, maxZoom); - }; - /** - * Set the minimum zoom (inclusive) at which the layer is visible. - * Note that the zoom levels for layer visibility are based on the - * view zoom level, which may be different from a tile source zoom level. - * @param {number} minZoom The minimum zoom of the layer. - * @observable - * @api - */ - BaseLayer.prototype.setMinZoom = function (minZoom) { - this.set(LayerProperty.MIN_ZOOM, minZoom); - }; - /** - * Set the opacity of the layer, allowed values range from 0 to 1. - * @param {number} opacity The opacity of the layer. - * @observable - * @api - */ - BaseLayer.prototype.setOpacity = function (opacity) { - assert(typeof opacity === 'number', 64); // Layer opacity must be a number - this.set(LayerProperty.OPACITY, opacity); - }; - /** - * Set the visibility of the layer (`true` or `false`). - * @param {boolean} visible The visibility of the layer. - * @observable - * @api - */ - BaseLayer.prototype.setVisible = function (visible) { - this.set(LayerProperty.VISIBLE, visible); - }; - /** - * Set Z-index of the layer, which is used to order layers before rendering. - * The default Z-index is 0. - * @param {number} zindex The z-index of the layer. - * @observable - * @api - */ - BaseLayer.prototype.setZIndex = function (zindex) { - this.set(LayerProperty.Z_INDEX, zindex); - }; - /** - * Clean up. - */ - BaseLayer.prototype.disposeInternal = function () { - if (this.state_) { - this.state_.layer = null; - this.state_ = null; - } - _super.prototype.disposeInternal.call(this); - }; - return BaseLayer; -}(BaseObject)); - -/** - * @module ol/render/EventType - */ -/** - * @enum {string} - */ -var RenderEventType = { - /** - * Triggered before a layer is rendered. - * @event module:ol/render/Event~RenderEvent#prerender - * @api - */ - PRERENDER: 'prerender', - /** - * Triggered after a layer is rendered. - * @event module:ol/render/Event~RenderEvent#postrender - * @api - */ - POSTRENDER: 'postrender', - /** - * Triggered before layers are rendered. - * The event object will not have a `context` set. - * @event module:ol/render/Event~RenderEvent#precompose - * @api - */ - PRECOMPOSE: 'precompose', - /** - * Triggered after all layers are rendered. - * The event object will not have a `context` set. - * @event module:ol/render/Event~RenderEvent#postcompose - * @api - */ - POSTCOMPOSE: 'postcompose', - /** - * Triggered when rendering is complete, i.e. all sources and tiles have - * finished loading for the current viewport, and all tiles are faded in. - * The event object will not have a `context` set. - * @event module:ol/render/Event~RenderEvent#rendercomplete - * @api - */ - RENDERCOMPLETE: 'rendercomplete', -}; - -/** - * @module ol/source/State - */ -/** - * @enum {string} - * State of the source, one of 'undefined', 'loading', 'ready' or 'error'. - */ -var SourceState = { - UNDEFINED: 'undefined', - LOADING: 'loading', - READY: 'ready', - ERROR: 'error', -}; - -var __extends$d = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {function(import("../PluggableMap.js").FrameState):HTMLElement} RenderFunction - */ -/** - * @typedef {Object} Options - * @property {string} [className='ol-layer'] A CSS class name to set to the layer element. - * @property {number} [opacity=1] Opacity (0, 1). - * @property {boolean} [visible=true] Visibility. - * @property {import("../extent.js").Extent} [extent] The bounding extent for layer rendering. The layer will not be - * rendered outside of this extent. - * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers - * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed - * for layers that are added to the map's `layers` collection, or `Infinity` when the layer's `setMap()` - * method was used. - * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be - * visible. - * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will - * be visible. - * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be - * visible. - * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will - * be visible. - * @property {import("../source/Source.js").default} [source] Source for this layer. If not provided to the constructor, - * the source can be set by calling {@link module:ol/layer/Layer#setSource layer.setSource(source)} after - * construction. - * @property {import("../PluggableMap.js").default} [map] Map. - * @property {RenderFunction} [render] Render function. Takes the frame state as input and is expected to return an - * HTML element. Will overwrite the default rendering for the layer. - */ -/** - * @typedef {Object} State - * @property {import("./Layer.js").default} layer - * @property {number} opacity Opacity, the value is rounded to two digits to appear after the decimal point. - * @property {import("../source/State.js").default} sourceState - * @property {boolean} visible - * @property {boolean} managed - * @property {import("../extent.js").Extent} [extent] - * @property {number} zIndex - * @property {number} maxResolution - * @property {number} minResolution - * @property {number} minZoom - * @property {number} maxZoom - */ -/** - * @classdesc - * Base class from which all layer types are derived. This should only be instantiated - * in the case where a custom layer is be added to the map with a custom `render` function. - * Such a function can be specified in the `options` object, and is expected to return an HTML element. - * - * A visual representation of raster or vector map data. - * Layers group together those properties that pertain to how the data is to be - * displayed, irrespective of the source of that data. - * - * Layers are usually added to a map with {@link module:ol/Map#addLayer}. Components - * like {@link module:ol/interaction/Select~Select} use unmanaged layers - * internally. These unmanaged layers are associated with the map using - * {@link module:ol/layer/Layer~Layer#setMap} instead. - * - * A generic `change` event is fired when the state of the source changes. - * - * Please note that for performance reasons several layers might get rendered to - * the same HTML element, which will cause {@link module:ol/Map~Map#forEachLayerAtPixel} to - * give false positives. To avoid this, apply different `className` properties to the - * layers at creation time. - * - * @fires import("../render/Event.js").RenderEvent#prerender - * @fires import("../render/Event.js").RenderEvent#postrender - * - * @template {import("../source/Source.js").default} SourceType - * @api - */ -var Layer = /** @class */ (function (_super) { - __extends$d(Layer, _super); - /** - * @param {Options} options Layer options. - */ - function Layer(options) { - var _this = this; - var baseOptions = assign({}, options); - delete baseOptions.source; - _this = _super.call(this, baseOptions) || this; - /** - * @private - * @type {?import("../events.js").EventsKey} - */ - _this.mapPrecomposeKey_ = null; - /** - * @private - * @type {?import("../events.js").EventsKey} - */ - _this.mapRenderKey_ = null; - /** - * @private - * @type {?import("../events.js").EventsKey} - */ - _this.sourceChangeKey_ = null; - /** - * @private - * @type {import("../renderer/Layer.js").default} - */ - _this.renderer_ = null; - // Overwrite default render method with a custom one - if (options.render) { - _this.render = options.render; - } - if (options.map) { - _this.setMap(options.map); - } - _this.addEventListener(getChangeEventType(LayerProperty.SOURCE), _this.handleSourcePropertyChange_); - var source = options.source - ? /** @type {SourceType} */ (options.source) - : null; - _this.setSource(source); - return _this; - } - /** - * @param {Array=} opt_array Array of layers (to be modified in place). - * @return {Array} Array of layers. - */ - Layer.prototype.getLayersArray = function (opt_array) { - var array = opt_array ? opt_array : []; - array.push(this); - return array; - }; - /** - * @param {Array=} opt_states Optional list of layer states (to be modified in place). - * @return {Array} List of layer states. - */ - Layer.prototype.getLayerStatesArray = function (opt_states) { - var states = opt_states ? opt_states : []; - states.push(this.getLayerState()); - return states; - }; - /** - * Get the layer source. - * @return {SourceType} The layer source (or `null` if not yet set). - * @observable - * @api - */ - Layer.prototype.getSource = function () { - return /** @type {SourceType} */ (this.get(LayerProperty.SOURCE)) || null; - }; - /** - * @return {import("../source/State.js").default} Source state. - */ - Layer.prototype.getSourceState = function () { - var source = this.getSource(); - return !source ? SourceState.UNDEFINED : source.getState(); - }; - /** - * @private - */ - Layer.prototype.handleSourceChange_ = function () { - this.changed(); - }; - /** - * @private - */ - Layer.prototype.handleSourcePropertyChange_ = function () { - if (this.sourceChangeKey_) { - unlistenByKey(this.sourceChangeKey_); - this.sourceChangeKey_ = null; - } - var source = this.getSource(); - if (source) { - this.sourceChangeKey_ = listen(source, EventType.CHANGE, this.handleSourceChange_, this); - } - this.changed(); - }; - /** - * @param {import("../pixel").Pixel} pixel Pixel. - * @return {Promise>} Promise that resolves with - * an array of features. - */ - Layer.prototype.getFeatures = function (pixel) { - return this.renderer_.getFeatures(pixel); - }; - /** - * In charge to manage the rendering of the layer. One layer type is - * bounded with one layer renderer. - * @param {?import("../PluggableMap.js").FrameState} frameState Frame state. - * @param {HTMLElement} target Target which the renderer may (but need not) use - * for rendering its content. - * @return {HTMLElement} The rendered element. - */ - Layer.prototype.render = function (frameState, target) { - var layerRenderer = this.getRenderer(); - if (layerRenderer.prepareFrame(frameState)) { - return layerRenderer.renderFrame(frameState, target); - } - }; - /** - * Sets the layer to be rendered on top of other layers on a map. The map will - * not manage this layer in its layers collection, and the callback in - * {@link module:ol/Map#forEachLayerAtPixel} will receive `null` as layer. This - * is useful for temporary layers. To remove an unmanaged layer from the map, - * use `#setMap(null)`. - * - * To add the layer to a map and have it managed by the map, use - * {@link module:ol/Map#addLayer} instead. - * @param {import("../PluggableMap.js").default} map Map. - * @api - */ - Layer.prototype.setMap = function (map) { - if (this.mapPrecomposeKey_) { - unlistenByKey(this.mapPrecomposeKey_); - this.mapPrecomposeKey_ = null; - } - if (!map) { - this.changed(); - } - if (this.mapRenderKey_) { - unlistenByKey(this.mapRenderKey_); - this.mapRenderKey_ = null; - } - if (map) { - this.mapPrecomposeKey_ = listen(map, RenderEventType.PRECOMPOSE, function (evt) { - var renderEvent = /** @type {import("../render/Event.js").default} */ (evt); - var layerStatesArray = renderEvent.frameState.layerStatesArray; - var layerState = this.getLayerState(false); - // A layer can only be added to the map once. Use either `layer.setMap()` or `map.addLayer()`, not both. - assert(!layerStatesArray.some(function (arrayLayerState) { - return arrayLayerState.layer === layerState.layer; - }), 67); - layerStatesArray.push(layerState); - }, this); - this.mapRenderKey_ = listen(this, EventType.CHANGE, map.render, map); - this.changed(); - } - }; - /** - * Set the layer source. - * @param {SourceType} source The layer source. - * @observable - * @api - */ - Layer.prototype.setSource = function (source) { - this.set(LayerProperty.SOURCE, source); - }; - /** - * Get the renderer for this layer. - * @return {import("../renderer/Layer.js").default} The layer renderer. - */ - Layer.prototype.getRenderer = function () { - if (!this.renderer_) { - this.renderer_ = this.createRenderer(); - } - return this.renderer_; - }; - /** - * @return {boolean} The layer has a renderer. - */ - Layer.prototype.hasRenderer = function () { - return !!this.renderer_; - }; - /** - * Create a renderer for this layer. - * @return {import("../renderer/Layer.js").default} A layer renderer. - * @protected - */ - Layer.prototype.createRenderer = function () { - return null; - }; - /** - * Clean up. - */ - Layer.prototype.disposeInternal = function () { - this.setSource(null); - _super.prototype.disposeInternal.call(this); - }; - return Layer; -}(BaseLayer)); -/** - * Return `true` if the layer is visible and if the provided view state - * has resolution and zoom levels that are in range of the layer's min/max. - * @param {State} layerState Layer state. - * @param {import("../View.js").State} viewState View state. - * @return {boolean} The layer is visible at the given view state. - */ -function inView(layerState, viewState) { - if (!layerState.visible) { - return false; - } - var resolution = viewState.resolution; - if (resolution < layerState.minResolution || - resolution >= layerState.maxResolution) { - return false; - } - var zoom = viewState.zoom; - return zoom > layerState.minZoom && zoom <= layerState.maxZoom; -} - -var __extends$e = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef HitMatch - * @property {import("../Feature.js").FeatureLike} feature - * @property {import("../layer/Layer.js").default} layer - * @property {import("../geom/SimpleGeometry.js").default} geometry - * @property {number} distanceSq - * @property {import("./vector.js").FeatureCallback} callback - * @template T - */ -/** - * @abstract - */ -var MapRenderer = /** @class */ (function (_super) { - __extends$e(MapRenderer, _super); - /** - * @param {import("../PluggableMap.js").default} map Map. - */ - function MapRenderer(map) { - var _this = _super.call(this) || this; - /** - * @private - * @type {import("../PluggableMap.js").default} - */ - _this.map_ = map; - return _this; - } - /** - * @abstract - * @param {import("../render/EventType.js").default} type Event type. - * @param {import("../PluggableMap.js").FrameState} frameState Frame state. - */ - MapRenderer.prototype.dispatchRenderEvent = function (type, frameState) { - abstract(); - }; - /** - * @param {import("../PluggableMap.js").FrameState} frameState FrameState. - * @protected - */ - MapRenderer.prototype.calculateMatrices2D = function (frameState) { - var viewState = frameState.viewState; - var coordinateToPixelTransform = frameState.coordinateToPixelTransform; - var pixelToCoordinateTransform = frameState.pixelToCoordinateTransform; - compose(coordinateToPixelTransform, frameState.size[0] / 2, frameState.size[1] / 2, 1 / viewState.resolution, -1 / viewState.resolution, -viewState.rotation, -viewState.center[0], -viewState.center[1]); - makeInverse(pixelToCoordinateTransform, coordinateToPixelTransform); - }; - /** - * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. - * @param {import("../PluggableMap.js").FrameState} frameState FrameState. - * @param {number} hitTolerance Hit tolerance in pixels. - * @param {boolean} checkWrapped Check for wrapped geometries. - * @param {import("./vector.js").FeatureCallback} callback Feature callback. - * @param {S} thisArg Value to use as `this` when executing `callback`. - * @param {function(this: U, import("../layer/Layer.js").default): boolean} layerFilter Layer filter - * function, only layers which are visible and for which this function - * returns `true` will be tested for features. By default, all visible - * layers will be tested. - * @param {U} thisArg2 Value to use as `this` when executing `layerFilter`. - * @return {T|undefined} Callback result. - * @template S,T,U - */ - MapRenderer.prototype.forEachFeatureAtCoordinate = function (coordinate, frameState, hitTolerance, checkWrapped, callback, thisArg, layerFilter, thisArg2) { - var result; - var viewState = frameState.viewState; - /** - * @param {boolean} managed Managed layer. - * @param {import("../Feature.js").FeatureLike} feature Feature. - * @param {import("../layer/Layer.js").default} layer Layer. - * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @return {T|undefined} Callback result. - */ - function forEachFeatureAtCoordinate(managed, feature, layer, geometry) { - return callback.call(thisArg, feature, managed ? layer : null, geometry); - } - var projection = viewState.projection; - var translatedCoordinate = wrapX(coordinate.slice(), projection); - var offsets = [[0, 0]]; - if (projection.canWrapX() && checkWrapped) { - var projectionExtent = projection.getExtent(); - var worldWidth = getWidth(projectionExtent); - offsets.push([-worldWidth, 0], [worldWidth, 0]); - } - var layerStates = frameState.layerStatesArray; - var numLayers = layerStates.length; - var matches = /** @type {Array>} */ ([]); - var tmpCoord = []; - for (var i = 0; i < offsets.length; i++) { - for (var j = numLayers - 1; j >= 0; --j) { - var layerState = layerStates[j]; - var layer = layerState.layer; - if (layer.hasRenderer() && - inView(layerState, viewState) && - layerFilter.call(thisArg2, layer)) { - var layerRenderer = layer.getRenderer(); - var source = layer.getSource(); - if (layerRenderer && source) { - var coordinates = source.getWrapX() - ? translatedCoordinate - : coordinate; - var callback_1 = forEachFeatureAtCoordinate.bind(null, layerState.managed); - tmpCoord[0] = coordinates[0] + offsets[i][0]; - tmpCoord[1] = coordinates[1] + offsets[i][1]; - result = layerRenderer.forEachFeatureAtCoordinate(tmpCoord, frameState, hitTolerance, callback_1, matches); - } - if (result) { - return result; - } - } - } - } - if (matches.length === 0) { - return undefined; - } - var order = 1 / matches.length; - matches.forEach(function (m, i) { return (m.distanceSq += i * order); }); - matches.sort(function (a, b) { return a.distanceSq - b.distanceSq; }); - matches.some(function (m) { - return (result = m.callback(m.feature, m.layer, m.geometry)); - }); - return result; - }; - /** - * @abstract - * @param {import("../pixel.js").Pixel} pixel Pixel. - * @param {import("../PluggableMap.js").FrameState} frameState FrameState. - * @param {number} hitTolerance Hit tolerance in pixels. - * @param {function(import("../layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback Layer - * callback. - * @param {function(import("../layer/Layer.js").default): boolean} layerFilter Layer filter - * function, only layers which are visible and for which this function - * returns `true` will be tested for features. By default, all visible - * layers will be tested. - * @return {T|undefined} Callback result. - * @template T - */ - MapRenderer.prototype.forEachLayerAtPixel = function (pixel, frameState, hitTolerance, callback, layerFilter) { - return abstract(); - }; - /** - * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. - * @param {import("../PluggableMap.js").FrameState} frameState FrameState. - * @param {number} hitTolerance Hit tolerance in pixels. - * @param {boolean} checkWrapped Check for wrapped geometries. - * @param {function(this: U, import("../layer/Layer.js").default): boolean} layerFilter Layer filter - * function, only layers which are visible and for which this function - * returns `true` will be tested for features. By default, all visible - * layers will be tested. - * @param {U} thisArg Value to use as `this` when executing `layerFilter`. - * @return {boolean} Is there a feature at the given coordinate? - * @template U - */ - MapRenderer.prototype.hasFeatureAtCoordinate = function (coordinate, frameState, hitTolerance, checkWrapped, layerFilter, thisArg) { - var hasFeature = this.forEachFeatureAtCoordinate(coordinate, frameState, hitTolerance, checkWrapped, TRUE, this, layerFilter, thisArg); - return hasFeature !== undefined; - }; - /** - * @return {import("../PluggableMap.js").default} Map. - */ - MapRenderer.prototype.getMap = function () { - return this.map_; - }; - /** - * Render. - * @abstract - * @param {?import("../PluggableMap.js").FrameState} frameState Frame state. - */ - MapRenderer.prototype.renderFrame = function (frameState) { - abstract(); - }; - /** - * @param {import("../PluggableMap.js").FrameState} frameState Frame state. - * @protected - */ - MapRenderer.prototype.scheduleExpireIconCache = function (frameState) { - if (shared.canExpireCache()) { - frameState.postRenderFunctions.push(expireIconCache); - } - }; - return MapRenderer; -}(Disposable)); -/** - * @param {import("../PluggableMap.js").default} map Map. - * @param {import("../PluggableMap.js").FrameState} frameState Frame state. - */ -function expireIconCache(map, frameState) { - shared.expire(); -} - -/** - * @module ol/render/Event - */ -var __extends$f = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -var RenderEvent = /** @class */ (function (_super) { - __extends$f(RenderEvent, _super); - /** - * @param {import("./EventType.js").default} type Type. - * @param {import("../transform.js").Transform=} opt_inversePixelTransform Transform for - * CSS pixels to rendered pixels. - * @param {import("../PluggableMap.js").FrameState=} opt_frameState Frame state. - * @param {?CanvasRenderingContext2D=} opt_context Context. - */ - function RenderEvent(type, opt_inversePixelTransform, opt_frameState, opt_context) { - var _this = _super.call(this, type) || this; - /** - * Transform from CSS pixels (relative to the top-left corner of the map viewport) - * to rendered pixels on this event's `context`. Only available when a Canvas renderer is used, null otherwise. - * @type {import("../transform.js").Transform|undefined} - * @api - */ - _this.inversePixelTransform = opt_inversePixelTransform; - /** - * An object representing the current render frame state. - * @type {import("../PluggableMap.js").FrameState|undefined} - * @api - */ - _this.frameState = opt_frameState; - /** - * Canvas context. Not available when the event is dispatched by the map. Only available - * when a Canvas renderer is used, null otherwise. - * @type {CanvasRenderingContext2D|null|undefined} - * @api - */ - _this.context = opt_context; - return _this; - } - return RenderEvent; -}(BaseEvent)); - -/** - * @module ol/css - */ -/** - * @typedef {Object} FontParameters - * @property {string} style - * @property {string} variant - * @property {string} weight - * @property {string} size - * @property {string} lineHeight - * @property {string} family - * @property {Array} families - */ -/** - * The CSS class for hidden feature. - * - * @const - * @type {string} - */ -var CLASS_HIDDEN = 'ol-hidden'; -/** - * The CSS class that we'll give the DOM elements to have them selectable. - * - * @const - * @type {string} - */ -var CLASS_SELECTABLE = 'ol-selectable'; -/** - * The CSS class that we'll give the DOM elements to have them unselectable. - * - * @const - * @type {string} - */ -var CLASS_UNSELECTABLE = 'ol-unselectable'; -/** - * The CSS class for unsupported feature. - * - * @const - * @type {string} - */ -var CLASS_UNSUPPORTED = 'ol-unsupported'; -/** - * The CSS class for controls. - * - * @const - * @type {string} - */ -var CLASS_CONTROL = 'ol-control'; -/** - * The CSS class that we'll give the DOM elements that are collapsed, i.e. - * to those elements which usually can be expanded. - * - * @const - * @type {string} - */ -var CLASS_COLLAPSED = 'ol-collapsed'; - -/** - * @module ol/has - */ -var ua = typeof navigator !== 'undefined' && typeof navigator.userAgent !== 'undefined' - ? navigator.userAgent.toLowerCase() - : ''; -/** - * User agent string says we are dealing with Firefox as browser. - * @type {boolean} - */ -var FIREFOX = ua.indexOf('firefox') !== -1; -/** - * User agent string says we are dealing with Safari as browser. - * @type {boolean} - */ -var SAFARI = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') == -1; -/** - * User agent string says we are dealing with a WebKit engine. - * @type {boolean} - */ -var WEBKIT = ua.indexOf('webkit') !== -1 && ua.indexOf('edge') == -1; -/** - * User agent string says we are dealing with a Mac as platform. - * @type {boolean} - */ -var MAC = ua.indexOf('macintosh') !== -1; -/** - * The ratio between physical pixels and device-independent pixels - * (dips) on the device (`window.devicePixelRatio`). - * @const - * @type {number} - * @api - */ -var DEVICE_PIXEL_RATIO = typeof devicePixelRatio !== 'undefined' ? devicePixelRatio : 1; -/** - * The execution context is a worker with OffscreenCanvas available. - * @const - * @type {boolean} - */ -var WORKER_OFFSCREEN_CANVAS = typeof WorkerGlobalScope !== 'undefined' && - typeof OffscreenCanvas !== 'undefined' && - self instanceof WorkerGlobalScope; //eslint-disable-line -/** - * Image.prototype.decode() is supported. - * @type {boolean} - */ -var IMAGE_DECODE = typeof Image !== 'undefined' && Image.prototype.decode; -/** - * @type {boolean} - */ -var PASSIVE_EVENT_LISTENERS = (function () { - var passive = false; - try { - var options = Object.defineProperty({}, 'passive', { - get: function () { - passive = true; - }, - }); - window.addEventListener('_', null, options); - window.removeEventListener('_', null, options); - } - catch (error) { - // passive not supported - } - return passive; -})(); - -/** - * @module ol/dom - */ -//FIXME Move this function to the canvas module -/** - * Create an html canvas element and returns its 2d context. - * @param {number=} opt_width Canvas width. - * @param {number=} opt_height Canvas height. - * @param {Array=} opt_canvasPool Canvas pool to take existing canvas from. - * @return {CanvasRenderingContext2D} The context. - */ -function createCanvasContext2D(opt_width, opt_height, opt_canvasPool) { - var canvas = opt_canvasPool && opt_canvasPool.length - ? opt_canvasPool.shift() - : WORKER_OFFSCREEN_CANVAS - ? new OffscreenCanvas(opt_width || 300, opt_height || 300) - : document.createElement('canvas'); - if (opt_width) { - canvas.width = opt_width; - } - if (opt_height) { - canvas.height = opt_height; - } - //FIXME Allow OffscreenCanvasRenderingContext2D as return type - return /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d')); -} -/** - * Get the current computed width for the given element including margin, - * padding and border. - * Equivalent to jQuery's `$(el).outerWidth(true)`. - * @param {!HTMLElement} element Element. - * @return {number} The width. - */ -function outerWidth(element) { - var width = element.offsetWidth; - var style = getComputedStyle(element); - width += parseInt(style.marginLeft, 10) + parseInt(style.marginRight, 10); - return width; -} -/** - * Get the current computed height for the given element including margin, - * padding and border. - * Equivalent to jQuery's `$(el).outerHeight(true)`. - * @param {!HTMLElement} element Element. - * @return {number} The height. - */ -function outerHeight(element) { - var height = element.offsetHeight; - var style = getComputedStyle(element); - height += parseInt(style.marginTop, 10) + parseInt(style.marginBottom, 10); - return height; -} -/** - * @param {Node} newNode Node to replace old node - * @param {Node} oldNode The node to be replaced - */ -function replaceNode(newNode, oldNode) { - var parent = oldNode.parentNode; - if (parent) { - parent.replaceChild(newNode, oldNode); - } -} -/** - * @param {Node} node The node to remove. - * @returns {Node} The node that was removed or null. - */ -function removeNode(node) { - return node && node.parentNode ? node.parentNode.removeChild(node) : null; -} -/** - * @param {Node} node The node to remove the children from. - */ -function removeChildren(node) { - while (node.lastChild) { - node.removeChild(node.lastChild); - } -} -/** - * Transform the children of a parent node so they match the - * provided list of children. This function aims to efficiently - * remove, add, and reorder child nodes while maintaining a simple - * implementation (it is not guaranteed to minimize DOM operations). - * @param {Node} node The parent node whose children need reworking. - * @param {Array} children The desired children. - */ -function replaceChildren(node, children) { - var oldChildren = node.childNodes; - for (var i = 0; true; ++i) { - var oldChild = oldChildren[i]; - var newChild = children[i]; - // check if our work is done - if (!oldChild && !newChild) { - break; - } - // check if children match - if (oldChild === newChild) { - continue; - } - // check if a new child needs to be added - if (!oldChild) { - node.appendChild(newChild); - continue; - } - // check if an old child needs to be removed - if (!newChild) { - node.removeChild(oldChild); - --i; - continue; - } - // reorder - node.insertBefore(newChild, oldChild); - } -} - -/** - * @module ol/render/canvas - */ -/** - * @type {BaseObject} - */ -var checkedFonts = new BaseObject(); -/** - * The label cache for text rendering. To change the default cache size of 2048 - * entries, use {@link module:ol/structs/LRUCache#setSize}. - * Deprecated - there is no label cache any more. - * @type {?} - * @api - * @deprecated - */ -var labelCache = new Target(); -labelCache.setSize = function () { - console.warn('labelCache is deprecated.'); //eslint-disable-line -}; -/** - * @param {CanvasRenderingContext2D} context Context. - * @param {number} rotation Rotation. - * @param {number} offsetX X offset. - * @param {number} offsetY Y offset. - */ -function rotateAtOffset(context, rotation, offsetX, offsetY) { - if (rotation !== 0) { - context.translate(offsetX, offsetY); - context.rotate(rotation); - context.translate(-offsetX, -offsetY); - } -} -/** - * @type {HTMLCanvasElement} - * @private - */ -var createTransformStringCanvas = null; -/** - * @param {import("../transform.js").Transform} transform Transform. - * @return {string} CSS transform. - */ -function createTransformString(transform) { - if (WORKER_OFFSCREEN_CANVAS) { - return toString(transform); - } - else { - if (!createTransformStringCanvas) { - createTransformStringCanvas = createCanvasContext2D(1, 1).canvas; - } - createTransformStringCanvas.style.transform = toString(transform); - return createTransformStringCanvas.style.transform; - } -} - -var __extends$g = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @classdesc - * Canvas map renderer. - * @api - */ -var CompositeMapRenderer = /** @class */ (function (_super) { - __extends$g(CompositeMapRenderer, _super); - /** - * @param {import("../PluggableMap.js").default} map Map. - */ - function CompositeMapRenderer(map) { - var _this = _super.call(this, map) || this; - /** - * @type {import("../events.js").EventsKey} - */ - _this.fontChangeListenerKey_ = listen(checkedFonts, ObjectEventType.PROPERTYCHANGE, map.redrawText.bind(map)); - /** - * @private - * @type {HTMLDivElement} - */ - _this.element_ = document.createElement('div'); - var style = _this.element_.style; - style.position = 'absolute'; - style.width = '100%'; - style.height = '100%'; - style.zIndex = '0'; - _this.element_.className = CLASS_UNSELECTABLE + ' ol-layers'; - var container = map.getViewport(); - container.insertBefore(_this.element_, container.firstChild || null); - /** - * @private - * @type {Array} - */ - _this.children_ = []; - /** - * @private - * @type {boolean} - */ - _this.renderedVisible_ = true; - return _this; - } - /** - * @param {import("../render/EventType.js").default} type Event type. - * @param {import("../PluggableMap.js").FrameState} frameState Frame state. - */ - CompositeMapRenderer.prototype.dispatchRenderEvent = function (type, frameState) { - var map = this.getMap(); - if (map.hasListener(type)) { - var event_1 = new RenderEvent(type, undefined, frameState); - map.dispatchEvent(event_1); - } - }; - CompositeMapRenderer.prototype.disposeInternal = function () { - unlistenByKey(this.fontChangeListenerKey_); - this.element_.parentNode.removeChild(this.element_); - _super.prototype.disposeInternal.call(this); - }; - /** - * Render. - * @param {?import("../PluggableMap.js").FrameState} frameState Frame state. - */ - CompositeMapRenderer.prototype.renderFrame = function (frameState) { - if (!frameState) { - if (this.renderedVisible_) { - this.element_.style.display = 'none'; - this.renderedVisible_ = false; - } - return; - } - this.calculateMatrices2D(frameState); - this.dispatchRenderEvent(RenderEventType.PRECOMPOSE, frameState); - var layerStatesArray = frameState.layerStatesArray.sort(function (a, b) { - return a.zIndex - b.zIndex; - }); - var viewState = frameState.viewState; - this.children_.length = 0; - /** - * @type {Array} - */ - var declutterLayers = []; - var previousElement = null; - for (var i = 0, ii = layerStatesArray.length; i < ii; ++i) { - var layerState = layerStatesArray[i]; - frameState.layerIndex = i; - if (!inView(layerState, viewState) || - (layerState.sourceState != SourceState.READY && - layerState.sourceState != SourceState.UNDEFINED)) { - continue; - } - var layer = layerState.layer; - var element = layer.render(frameState, previousElement); - if (!element) { - continue; - } - if (element !== previousElement) { - this.children_.push(element); - previousElement = element; - } - if ('getDeclutter' in layer) { - declutterLayers.push(layer); - } - } - for (var i = declutterLayers.length - 1; i >= 0; --i) { - declutterLayers[i].renderDeclutter(frameState); - } - replaceChildren(this.element_, this.children_); - this.dispatchRenderEvent(RenderEventType.POSTCOMPOSE, frameState); - if (!this.renderedVisible_) { - this.element_.style.display = ''; - this.renderedVisible_ = true; - } - this.scheduleExpireIconCache(frameState); - }; - /** - * @param {import("../pixel.js").Pixel} pixel Pixel. - * @param {import("../PluggableMap.js").FrameState} frameState FrameState. - * @param {number} hitTolerance Hit tolerance in pixels. - * @param {function(import("../layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback Layer - * callback. - * @param {function(import("../layer/Layer.js").default): boolean} layerFilter Layer filter - * function, only layers which are visible and for which this function - * returns `true` will be tested for features. By default, all visible - * layers will be tested. - * @return {T|undefined} Callback result. - * @template T - */ - CompositeMapRenderer.prototype.forEachLayerAtPixel = function (pixel, frameState, hitTolerance, callback, layerFilter) { - var viewState = frameState.viewState; - var layerStates = frameState.layerStatesArray; - var numLayers = layerStates.length; - for (var i = numLayers - 1; i >= 0; --i) { - var layerState = layerStates[i]; - var layer = layerState.layer; - if (layer.hasRenderer() && - inView(layerState, viewState) && - layerFilter(layer)) { - var layerRenderer = layer.getRenderer(); - var data = layerRenderer.getDataAtPixel(pixel, frameState, hitTolerance); - if (data) { - var result = callback(layer, data); - if (result) { - return result; - } - } - } - } - return undefined; - }; - return CompositeMapRenderer; -}(MapRenderer)); - -/** - * @module ol/CollectionEventType - */ -/** - * @enum {string} - */ -var CollectionEventType = { - /** - * Triggered when an item is added to the collection. - * @event module:ol/Collection.CollectionEvent#add - * @api - */ - ADD: 'add', - /** - * Triggered when an item is removed from the collection. - * @event module:ol/Collection.CollectionEvent#remove - * @api - */ - REMOVE: 'remove', -}; - -var __extends$h = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @enum {string} - * @private - */ -var Property = { - LENGTH: 'length', -}; -/** - * @classdesc - * Events emitted by {@link module:ol/Collection~Collection} instances are instances of this - * type. - */ -var CollectionEvent = /** @class */ (function (_super) { - __extends$h(CollectionEvent, _super); - /** - * @param {import("./CollectionEventType.js").default} type Type. - * @param {*=} opt_element Element. - * @param {number=} opt_index The index of the added or removed element. - */ - function CollectionEvent(type, opt_element, opt_index) { - var _this = _super.call(this, type) || this; - /** - * The element that is added to or removed from the collection. - * @type {*} - * @api - */ - _this.element = opt_element; - /** - * The index of the added or removed element. - * @type {number} - * @api - */ - _this.index = opt_index; - return _this; - } - return CollectionEvent; -}(BaseEvent)); -/** - * @typedef {Object} Options - * @property {boolean} [unique=false] Disallow the same item from being added to - * the collection twice. - */ -/** - * @classdesc - * An expanded version of standard JS Array, adding convenience methods for - * manipulation. Add and remove changes to the Collection trigger a Collection - * event. Note that this does not cover changes to the objects _within_ the - * Collection; they trigger events on the appropriate object, not on the - * Collection as a whole. - * - * @fires CollectionEvent - * - * @template T - * @api - */ -var Collection = /** @class */ (function (_super) { - __extends$h(Collection, _super); - /** - * @param {Array=} opt_array Array. - * @param {Options=} opt_options Collection options. - */ - function Collection(opt_array, opt_options) { - var _this = _super.call(this) || this; - var options = opt_options || {}; - /** - * @private - * @type {boolean} - */ - _this.unique_ = !!options.unique; - /** - * @private - * @type {!Array} - */ - _this.array_ = opt_array ? opt_array : []; - if (_this.unique_) { - for (var i = 0, ii = _this.array_.length; i < ii; ++i) { - _this.assertUnique_(_this.array_[i], i); - } - } - _this.updateLength_(); - return _this; - } - /** - * Remove all elements from the collection. - * @api - */ - Collection.prototype.clear = function () { - while (this.getLength() > 0) { - this.pop(); - } - }; - /** - * Add elements to the collection. This pushes each item in the provided array - * to the end of the collection. - * @param {!Array} arr Array. - * @return {Collection} This collection. - * @api - */ - Collection.prototype.extend = function (arr) { - for (var i = 0, ii = arr.length; i < ii; ++i) { - this.push(arr[i]); - } - return this; - }; - /** - * Iterate over each element, calling the provided callback. - * @param {function(T, number, Array): *} f The function to call - * for every element. This function takes 3 arguments (the element, the - * index and the array). The return value is ignored. - * @api - */ - Collection.prototype.forEach = function (f) { - var array = this.array_; - for (var i = 0, ii = array.length; i < ii; ++i) { - f(array[i], i, array); - } - }; - /** - * Get a reference to the underlying Array object. Warning: if the array - * is mutated, no events will be dispatched by the collection, and the - * collection's "length" property won't be in sync with the actual length - * of the array. - * @return {!Array} Array. - * @api - */ - Collection.prototype.getArray = function () { - return this.array_; - }; - /** - * Get the element at the provided index. - * @param {number} index Index. - * @return {T} Element. - * @api - */ - Collection.prototype.item = function (index) { - return this.array_[index]; - }; - /** - * Get the length of this collection. - * @return {number} The length of the array. - * @observable - * @api - */ - Collection.prototype.getLength = function () { - return this.get(Property.LENGTH); - }; - /** - * Insert an element at the provided index. - * @param {number} index Index. - * @param {T} elem Element. - * @api - */ - Collection.prototype.insertAt = function (index, elem) { - if (this.unique_) { - this.assertUnique_(elem); - } - this.array_.splice(index, 0, elem); - this.updateLength_(); - this.dispatchEvent(new CollectionEvent(CollectionEventType.ADD, elem, index)); - }; - /** - * Remove the last element of the collection and return it. - * Return `undefined` if the collection is empty. - * @return {T|undefined} Element. - * @api - */ - Collection.prototype.pop = function () { - return this.removeAt(this.getLength() - 1); - }; - /** - * Insert the provided element at the end of the collection. - * @param {T} elem Element. - * @return {number} New length of the collection. - * @api - */ - Collection.prototype.push = function (elem) { - if (this.unique_) { - this.assertUnique_(elem); - } - var n = this.getLength(); - this.insertAt(n, elem); - return this.getLength(); - }; - /** - * Remove the first occurrence of an element from the collection. - * @param {T} elem Element. - * @return {T|undefined} The removed element or undefined if none found. - * @api - */ - Collection.prototype.remove = function (elem) { - var arr = this.array_; - for (var i = 0, ii = arr.length; i < ii; ++i) { - if (arr[i] === elem) { - return this.removeAt(i); - } - } - return undefined; - }; - /** - * Remove the element at the provided index and return it. - * Return `undefined` if the collection does not contain this index. - * @param {number} index Index. - * @return {T|undefined} Value. - * @api - */ - Collection.prototype.removeAt = function (index) { - var prev = this.array_[index]; - this.array_.splice(index, 1); - this.updateLength_(); - this.dispatchEvent(new CollectionEvent(CollectionEventType.REMOVE, prev, index)); - return prev; - }; - /** - * Set the element at the provided index. - * @param {number} index Index. - * @param {T} elem Element. - * @api - */ - Collection.prototype.setAt = function (index, elem) { - var n = this.getLength(); - if (index < n) { - if (this.unique_) { - this.assertUnique_(elem, index); - } - var prev = this.array_[index]; - this.array_[index] = elem; - this.dispatchEvent(new CollectionEvent(CollectionEventType.REMOVE, prev, index)); - this.dispatchEvent(new CollectionEvent(CollectionEventType.ADD, elem, index)); - } - else { - for (var j = n; j < index; ++j) { - this.insertAt(j, undefined); - } - this.insertAt(index, elem); - } - }; - /** - * @private - */ - Collection.prototype.updateLength_ = function () { - this.set(Property.LENGTH, this.array_.length); - }; - /** - * @private - * @param {T} elem Element. - * @param {number=} opt_except Optional index to ignore. - */ - Collection.prototype.assertUnique_ = function (elem, opt_except) { - for (var i = 0, ii = this.array_.length; i < ii; ++i) { - if (this.array_[i] === elem && i !== opt_except) { - throw new AssertionError(58); - } - } - }; - return Collection; -}(BaseObject)); - -var __extends$i = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {Object} Options - * @property {number} [opacity=1] Opacity (0, 1). - * @property {boolean} [visible=true] Visibility. - * @property {import("../extent.js").Extent} [extent] The bounding extent for layer rendering. The layer will not be - * rendered outside of this extent. - * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers - * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed - * for layers that are added to the map's `layers` collection, or `Infinity` when the layer's `setMap()` - * method was used. - * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be - * visible. - * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will - * be visible. - * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be - * visible. - * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will - * be visible. - * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be - * visible. - * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will - * be visible. - * @property {Array|import("../Collection.js").default} [layers] Child layers. - */ -/** - * @enum {string} - * @private - */ -var Property$1 = { - LAYERS: 'layers', -}; -/** - * @classdesc - * A {@link module:ol/Collection~Collection} of layers that are handled together. - * - * A generic `change` event is triggered when the group/Collection changes. - * - * @api - */ -var LayerGroup = /** @class */ (function (_super) { - __extends$i(LayerGroup, _super); - /** - * @param {Options=} opt_options Layer options. - */ - function LayerGroup(opt_options) { - var _this = this; - var options = opt_options || {}; - var baseOptions = /** @type {Options} */ (assign({}, options)); - delete baseOptions.layers; - var layers = options.layers; - _this = _super.call(this, baseOptions) || this; - /** - * @private - * @type {Array} - */ - _this.layersListenerKeys_ = []; - /** - * @private - * @type {Object>} - */ - _this.listenerKeys_ = {}; - _this.addEventListener(getChangeEventType(Property$1.LAYERS), _this.handleLayersChanged_); - if (layers) { - if (Array.isArray(layers)) { - layers = new Collection(layers.slice(), { unique: true }); - } - else { - assert(typeof ( /** @type {?} */(layers).getArray) === 'function', 43); // Expected `layers` to be an array or a `Collection` - } - } - else { - layers = new Collection(undefined, { unique: true }); - } - _this.setLayers(layers); - return _this; - } - /** - * @private - */ - LayerGroup.prototype.handleLayerChange_ = function () { - this.changed(); - }; - /** - * @private - */ - LayerGroup.prototype.handleLayersChanged_ = function () { - this.layersListenerKeys_.forEach(unlistenByKey); - this.layersListenerKeys_.length = 0; - var layers = this.getLayers(); - this.layersListenerKeys_.push(listen(layers, CollectionEventType.ADD, this.handleLayersAdd_, this), listen(layers, CollectionEventType.REMOVE, this.handleLayersRemove_, this)); - for (var id in this.listenerKeys_) { - this.listenerKeys_[id].forEach(unlistenByKey); - } - clear(this.listenerKeys_); - var layersArray = layers.getArray(); - for (var i = 0, ii = layersArray.length; i < ii; i++) { - var layer = layersArray[i]; - this.listenerKeys_[getUid(layer)] = [ - listen(layer, ObjectEventType.PROPERTYCHANGE, this.handleLayerChange_, this), - listen(layer, EventType.CHANGE, this.handleLayerChange_, this), - ]; - } - this.changed(); - }; - /** - * @param {import("../Collection.js").CollectionEvent} collectionEvent CollectionEvent. - * @private - */ - LayerGroup.prototype.handleLayersAdd_ = function (collectionEvent) { - var layer = /** @type {import("./Base.js").default} */ (collectionEvent.element); - this.listenerKeys_[getUid(layer)] = [ - listen(layer, ObjectEventType.PROPERTYCHANGE, this.handleLayerChange_, this), - listen(layer, EventType.CHANGE, this.handleLayerChange_, this), - ]; - this.changed(); - }; - /** - * @param {import("../Collection.js").CollectionEvent} collectionEvent CollectionEvent. - * @private - */ - LayerGroup.prototype.handleLayersRemove_ = function (collectionEvent) { - var layer = /** @type {import("./Base.js").default} */ (collectionEvent.element); - var key = getUid(layer); - this.listenerKeys_[key].forEach(unlistenByKey); - delete this.listenerKeys_[key]; - this.changed(); - }; - /** - * Returns the {@link module:ol/Collection collection} of {@link module:ol/layer/Layer~Layer layers} - * in this group. - * @return {!import("../Collection.js").default} Collection of - * {@link module:ol/layer/Base layers} that are part of this group. - * @observable - * @api - */ - LayerGroup.prototype.getLayers = function () { - return /** @type {!import("../Collection.js").default} */ (this.get(Property$1.LAYERS)); - }; - /** - * Set the {@link module:ol/Collection collection} of {@link module:ol/layer/Layer~Layer layers} - * in this group. - * @param {!import("../Collection.js").default} layers Collection of - * {@link module:ol/layer/Base layers} that are part of this group. - * @observable - * @api - */ - LayerGroup.prototype.setLayers = function (layers) { - this.set(Property$1.LAYERS, layers); - }; - /** - * @param {Array=} opt_array Array of layers (to be modified in place). - * @return {Array} Array of layers. - */ - LayerGroup.prototype.getLayersArray = function (opt_array) { - var array = opt_array !== undefined ? opt_array : []; - this.getLayers().forEach(function (layer) { - layer.getLayersArray(array); - }); - return array; - }; - /** - * @param {Array=} opt_states Optional list of layer states (to be modified in place). - * @return {Array} List of layer states. - */ - LayerGroup.prototype.getLayerStatesArray = function (opt_states) { - var states = opt_states !== undefined ? opt_states : []; - var pos = states.length; - this.getLayers().forEach(function (layer) { - layer.getLayerStatesArray(states); - }); - var ownLayerState = this.getLayerState(); - for (var i = pos, ii = states.length; i < ii; i++) { - var layerState = states[i]; - layerState.opacity *= ownLayerState.opacity; - layerState.visible = layerState.visible && ownLayerState.visible; - layerState.maxResolution = Math.min(layerState.maxResolution, ownLayerState.maxResolution); - layerState.minResolution = Math.max(layerState.minResolution, ownLayerState.minResolution); - layerState.minZoom = Math.max(layerState.minZoom, ownLayerState.minZoom); - layerState.maxZoom = Math.min(layerState.maxZoom, ownLayerState.maxZoom); - if (ownLayerState.extent !== undefined) { - if (layerState.extent !== undefined) { - layerState.extent = getIntersection(layerState.extent, ownLayerState.extent); - } - else { - layerState.extent = ownLayerState.extent; - } - } - } - return states; - }; - /** - * @return {import("../source/State.js").default} Source state. - */ - LayerGroup.prototype.getSourceState = function () { - return SourceState.READY; - }; - return LayerGroup; -}(BaseLayer)); - -var __extends$j = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @classdesc - * Events emitted as map events are instances of this type. - * See {@link module:ol/PluggableMap~PluggableMap} for which events trigger a map event. - */ -var MapEvent = /** @class */ (function (_super) { - __extends$j(MapEvent, _super); - /** - * @param {string} type Event type. - * @param {import("./PluggableMap.js").default} map Map. - * @param {?import("./PluggableMap.js").FrameState=} opt_frameState Frame state. - */ - function MapEvent(type, map, opt_frameState) { - var _this = _super.call(this, type) || this; - /** - * The map where the event occurred. - * @type {import("./PluggableMap.js").default} - * @api - */ - _this.map = map; - /** - * The frame state at the time of the event. - * @type {?import("./PluggableMap.js").FrameState} - * @api - */ - _this.frameState = opt_frameState !== undefined ? opt_frameState : null; - return _this; - } - return MapEvent; -}(BaseEvent)); - -var __extends$k = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @classdesc - * Events emitted as map browser events are instances of this type. - * See {@link module:ol/PluggableMap~PluggableMap} for which events trigger a map browser event. - * @template {UIEvent} EVENT - */ -var MapBrowserEvent = /** @class */ (function (_super) { - __extends$k(MapBrowserEvent, _super); - /** - * @param {string} type Event type. - * @param {import("./PluggableMap.js").default} map Map. - * @param {EVENT} originalEvent Original event. - * @param {boolean=} opt_dragging Is the map currently being dragged? - * @param {?import("./PluggableMap.js").FrameState=} opt_frameState Frame state. - */ - function MapBrowserEvent(type, map, originalEvent, opt_dragging, opt_frameState) { - var _this = _super.call(this, type, map, opt_frameState) || this; - /** - * The original browser event. - * @const - * @type {EVENT} - * @api - */ - _this.originalEvent = originalEvent; - /** - * The map pixel relative to the viewport corresponding to the original browser event. - * @type {?import("./pixel.js").Pixel} - */ - _this.pixel_ = null; - /** - * The coordinate in the user projection corresponding to the original browser event. - * @type {?import("./coordinate.js").Coordinate} - */ - _this.coordinate_ = null; - /** - * Indicates if the map is currently being dragged. Only set for - * `POINTERDRAG` and `POINTERMOVE` events. Default is `false`. - * - * @type {boolean} - * @api - */ - _this.dragging = opt_dragging !== undefined ? opt_dragging : false; - return _this; - } - Object.defineProperty(MapBrowserEvent.prototype, "pixel", { - /** - * The map pixel relative to the viewport corresponding to the original event. - * @type {import("./pixel.js").Pixel} - * @api - */ - get: function () { - if (!this.pixel_) { - this.pixel_ = this.map.getEventPixel(this.originalEvent); - } - return this.pixel_; - }, - set: function (pixel) { - this.pixel_ = pixel; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(MapBrowserEvent.prototype, "coordinate", { - /** - * The coordinate corresponding to the original browser event. This will be in the user - * projection if one is set. Otherwise it will be in the view projection. - * @type {import("./coordinate.js").Coordinate} - * @api - */ - get: function () { - if (!this.coordinate_) { - this.coordinate_ = this.map.getCoordinateFromPixel(this.pixel); - } - return this.coordinate_; - }, - set: function (coordinate) { - this.coordinate_ = coordinate; - }, - enumerable: false, - configurable: true - }); - /** - * Prevents the default browser action. - * See https://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault. - * @api - */ - MapBrowserEvent.prototype.preventDefault = function () { - _super.prototype.preventDefault.call(this); - this.originalEvent.preventDefault(); - }; - /** - * Prevents further propagation of the current event. - * See https://developer.mozilla.org/en-US/docs/Web/API/event.stopPropagation. - * @api - */ - MapBrowserEvent.prototype.stopPropagation = function () { - _super.prototype.stopPropagation.call(this); - this.originalEvent.stopPropagation(); - }; - return MapBrowserEvent; -}(MapEvent)); - -/** - * @module ol/MapBrowserEventType - */ -/** - * Constants for event names. - * @enum {string} - */ -var MapBrowserEventType = { - /** - * A true single click with no dragging and no double click. Note that this - * event is delayed by 250 ms to ensure that it is not a double click. - * @event module:ol/MapBrowserEvent~MapBrowserEvent#singleclick - * @api - */ - SINGLECLICK: 'singleclick', - /** - * A click with no dragging. A double click will fire two of this. - * @event module:ol/MapBrowserEvent~MapBrowserEvent#click - * @api - */ - CLICK: EventType.CLICK, - /** - * A true double click, with no dragging. - * @event module:ol/MapBrowserEvent~MapBrowserEvent#dblclick - * @api - */ - DBLCLICK: EventType.DBLCLICK, - /** - * Triggered when a pointer is dragged. - * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointerdrag - * @api - */ - POINTERDRAG: 'pointerdrag', - /** - * Triggered when a pointer is moved. Note that on touch devices this is - * triggered when the map is panned, so is not the same as mousemove. - * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointermove - * @api - */ - POINTERMOVE: 'pointermove', - POINTERDOWN: 'pointerdown', - POINTERUP: 'pointerup', - POINTEROVER: 'pointerover', - POINTEROUT: 'pointerout', - POINTERENTER: 'pointerenter', - POINTERLEAVE: 'pointerleave', - POINTERCANCEL: 'pointercancel', -}; - -/** - * @module ol/pointer/EventType - */ -/** - * Constants for event names. - * @enum {string} - */ -var PointerEventType = { - POINTERMOVE: 'pointermove', - POINTERDOWN: 'pointerdown', - POINTERUP: 'pointerup', - POINTEROVER: 'pointerover', - POINTEROUT: 'pointerout', - POINTERENTER: 'pointerenter', - POINTERLEAVE: 'pointerleave', - POINTERCANCEL: 'pointercancel', -}; - -/** - * @module ol/MapBrowserEventHandler - */ -var __extends$l = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -var MapBrowserEventHandler = /** @class */ (function (_super) { - __extends$l(MapBrowserEventHandler, _super); - /** - * @param {import("./PluggableMap.js").default} map The map with the viewport to listen to events on. - * @param {number=} moveTolerance The minimal distance the pointer must travel to trigger a move. - */ - function MapBrowserEventHandler(map, moveTolerance) { - var _this = _super.call(this, map) || this; - /** - * This is the element that we will listen to the real events on. - * @type {import("./PluggableMap.js").default} - * @private - */ - _this.map_ = map; - /** - * @type {any} - * @private - */ - _this.clickTimeoutId_; - /** - * Emulate dblclick and singleclick. Will be true when only one pointer is active. - * @type {boolean} - */ - _this.emulateClicks_ = false; - /** - * @type {boolean} - * @private - */ - _this.dragging_ = false; - /** - * @type {!Array} - * @private - */ - _this.dragListenerKeys_ = []; - /** - * @type {number} - * @private - */ - _this.moveTolerance_ = moveTolerance - ? moveTolerance * DEVICE_PIXEL_RATIO - : DEVICE_PIXEL_RATIO; - /** - * The most recent "down" type event (or null if none have occurred). - * Set on pointerdown. - * @type {PointerEvent} - * @private - */ - _this.down_ = null; - var element = _this.map_.getViewport(); - /** - * @type {number} - * @private - */ - _this.activePointers_ = 0; - /** - * @type {!Object} - * @private - */ - _this.trackedTouches_ = {}; - _this.element_ = element; - /** - * @type {?import("./events.js").EventsKey} - * @private - */ - _this.pointerdownListenerKey_ = listen(element, PointerEventType.POINTERDOWN, _this.handlePointerDown_, _this); - /** - * @type {PointerEvent} - * @private - */ - _this.originalPointerMoveEvent_; - /** - * @type {?import("./events.js").EventsKey} - * @private - */ - _this.relayedListenerKey_ = listen(element, PointerEventType.POINTERMOVE, _this.relayEvent_, _this); - /** - * @private - */ - _this.boundHandleTouchMove_ = _this.handleTouchMove_.bind(_this); - _this.element_.addEventListener(EventType.TOUCHMOVE, _this.boundHandleTouchMove_, PASSIVE_EVENT_LISTENERS ? { passive: false } : false); - return _this; - } - /** - * @param {PointerEvent} pointerEvent Pointer - * event. - * @private - */ - MapBrowserEventHandler.prototype.emulateClick_ = function (pointerEvent) { - var newEvent = new MapBrowserEvent(MapBrowserEventType.CLICK, this.map_, pointerEvent); - this.dispatchEvent(newEvent); - if (this.clickTimeoutId_ !== undefined) { - // double-click - clearTimeout(this.clickTimeoutId_); - this.clickTimeoutId_ = undefined; - newEvent = new MapBrowserEvent(MapBrowserEventType.DBLCLICK, this.map_, pointerEvent); - this.dispatchEvent(newEvent); - } - else { - // click - this.clickTimeoutId_ = setTimeout( - /** @this {MapBrowserEventHandler} */ - function () { - this.clickTimeoutId_ = undefined; - var newEvent = new MapBrowserEvent(MapBrowserEventType.SINGLECLICK, this.map_, pointerEvent); - this.dispatchEvent(newEvent); - }.bind(this), 250); - } - }; - /** - * Keeps track on how many pointers are currently active. - * - * @param {PointerEvent} pointerEvent Pointer - * event. - * @private - */ - MapBrowserEventHandler.prototype.updateActivePointers_ = function (pointerEvent) { - var event = pointerEvent; - if (event.type == MapBrowserEventType.POINTERUP || - event.type == MapBrowserEventType.POINTERCANCEL) { - delete this.trackedTouches_[event.pointerId]; - } - else if (event.type == MapBrowserEventType.POINTERDOWN) { - this.trackedTouches_[event.pointerId] = true; - } - this.activePointers_ = Object.keys(this.trackedTouches_).length; - }; - /** - * @param {PointerEvent} pointerEvent Pointer - * event. - * @private - */ - MapBrowserEventHandler.prototype.handlePointerUp_ = function (pointerEvent) { - this.updateActivePointers_(pointerEvent); - var newEvent = new MapBrowserEvent(MapBrowserEventType.POINTERUP, this.map_, pointerEvent); - this.dispatchEvent(newEvent); - // We emulate click events on left mouse button click, touch contact, and pen - // contact. isMouseActionButton returns true in these cases (evt.button is set - // to 0). - // See http://www.w3.org/TR/pointerevents/#button-states - // We only fire click, singleclick, and doubleclick if nobody has called - // event.stopPropagation() or event.preventDefault(). - if (this.emulateClicks_ && - !newEvent.propagationStopped && - !this.dragging_ && - this.isMouseActionButton_(pointerEvent)) { - this.emulateClick_(this.down_); - } - if (this.activePointers_ === 0) { - this.dragListenerKeys_.forEach(unlistenByKey); - this.dragListenerKeys_.length = 0; - this.dragging_ = false; - this.down_ = null; - } - }; - /** - * @param {PointerEvent} pointerEvent Pointer - * event. - * @return {boolean} If the left mouse button was pressed. - * @private - */ - MapBrowserEventHandler.prototype.isMouseActionButton_ = function (pointerEvent) { - return pointerEvent.button === 0; - }; - /** - * @param {PointerEvent} pointerEvent Pointer - * event. - * @private - */ - MapBrowserEventHandler.prototype.handlePointerDown_ = function (pointerEvent) { - this.emulateClicks_ = this.activePointers_ === 0; - this.updateActivePointers_(pointerEvent); - var newEvent = new MapBrowserEvent(MapBrowserEventType.POINTERDOWN, this.map_, pointerEvent); - this.dispatchEvent(newEvent); - this.down_ = pointerEvent; - if (this.dragListenerKeys_.length === 0) { - var doc = this.map_.getOwnerDocument(); - this.dragListenerKeys_.push(listen(doc, MapBrowserEventType.POINTERMOVE, this.handlePointerMove_, this), listen(doc, MapBrowserEventType.POINTERUP, this.handlePointerUp_, this), - /* Note that the listener for `pointercancel is set up on - * `pointerEventHandler_` and not `documentPointerEventHandler_` like - * the `pointerup` and `pointermove` listeners. - * - * The reason for this is the following: `TouchSource.vacuumTouches_()` - * issues `pointercancel` events, when there was no `touchend` for a - * `touchstart`. Now, let's say a first `touchstart` is registered on - * `pointerEventHandler_`. The `documentPointerEventHandler_` is set up. - * But `documentPointerEventHandler_` doesn't know about the first - * `touchstart`. If there is no `touchend` for the `touchstart`, we can - * only receive a `touchcancel` from `pointerEventHandler_`, because it is - * only registered there. - */ - listen(this.element_, MapBrowserEventType.POINTERCANCEL, this.handlePointerUp_, this)); - if (this.element_.getRootNode && this.element_.getRootNode() !== doc) { - this.dragListenerKeys_.push(listen(this.element_.getRootNode(), MapBrowserEventType.POINTERUP, this.handlePointerUp_, this)); - } - } - }; - /** - * @param {PointerEvent} pointerEvent Pointer - * event. - * @private - */ - MapBrowserEventHandler.prototype.handlePointerMove_ = function (pointerEvent) { - // Between pointerdown and pointerup, pointermove events are triggered. - // To avoid a 'false' touchmove event to be dispatched, we test if the pointer - // moved a significant distance. - if (this.isMoving_(pointerEvent)) { - this.dragging_ = true; - var newEvent = new MapBrowserEvent(MapBrowserEventType.POINTERDRAG, this.map_, pointerEvent, this.dragging_); - this.dispatchEvent(newEvent); - } - }; - /** - * Wrap and relay a pointer event. Note that this requires that the type - * string for the MapBrowserEvent matches the PointerEvent type. - * @param {PointerEvent} pointerEvent Pointer - * event. - * @private - */ - MapBrowserEventHandler.prototype.relayEvent_ = function (pointerEvent) { - this.originalPointerMoveEvent_ = pointerEvent; - var dragging = !!(this.down_ && this.isMoving_(pointerEvent)); - this.dispatchEvent(new MapBrowserEvent(pointerEvent.type, this.map_, pointerEvent, dragging)); - }; - /** - * Flexible handling of a `touch-action: none` css equivalent: because calling - * `preventDefault()` on a `pointermove` event does not stop native page scrolling - * and zooming, we also listen for `touchmove` and call `preventDefault()` on it - * when an interaction (currently `DragPan` handles the event. - * @param {TouchEvent} event Event. - * @private - */ - MapBrowserEventHandler.prototype.handleTouchMove_ = function (event) { - // Due to https://github.com/mpizenberg/elm-pep/issues/2, `this.originalPointerMoveEvent_` - // may not be initialized yet when we get here on a platform without native pointer events. - if (!this.originalPointerMoveEvent_ || - this.originalPointerMoveEvent_.defaultPrevented) { - event.preventDefault(); - } - }; - /** - * @param {PointerEvent} pointerEvent Pointer - * event. - * @return {boolean} Is moving. - * @private - */ - MapBrowserEventHandler.prototype.isMoving_ = function (pointerEvent) { - return (this.dragging_ || - Math.abs(pointerEvent.clientX - this.down_.clientX) > - this.moveTolerance_ || - Math.abs(pointerEvent.clientY - this.down_.clientY) > this.moveTolerance_); - }; - /** - * Clean up. - */ - MapBrowserEventHandler.prototype.disposeInternal = function () { - if (this.relayedListenerKey_) { - unlistenByKey(this.relayedListenerKey_); - this.relayedListenerKey_ = null; - } - this.element_.removeEventListener(EventType.TOUCHMOVE, this.boundHandleTouchMove_); - if (this.pointerdownListenerKey_) { - unlistenByKey(this.pointerdownListenerKey_); - this.pointerdownListenerKey_ = null; - } - this.dragListenerKeys_.forEach(unlistenByKey); - this.dragListenerKeys_.length = 0; - this.element_ = null; - _super.prototype.disposeInternal.call(this); - }; - return MapBrowserEventHandler; -}(Target)); - -/** - * @module ol/MapEventType - */ -/** - * @enum {string} - */ -var MapEventType = { - /** - * Triggered after a map frame is rendered. - * @event module:ol/MapEvent~MapEvent#postrender - * @api - */ - POSTRENDER: 'postrender', - /** - * Triggered when the map starts moving. - * @event module:ol/MapEvent~MapEvent#movestart - * @api - */ - MOVESTART: 'movestart', - /** - * Triggered after the map is moved. - * @event module:ol/MapEvent~MapEvent#moveend - * @api - */ - MOVEEND: 'moveend', -}; - -/** - * @module ol/MapProperty - */ -/** - * @enum {string} - */ -var MapProperty = { - LAYERGROUP: 'layergroup', - SIZE: 'size', - TARGET: 'target', - VIEW: 'view', -}; - -/** - * @module ol/structs/PriorityQueue - */ -/** - * @type {number} - */ -var DROP = Infinity; -/** - * @classdesc - * Priority queue. - * - * The implementation is inspired from the Closure Library's Heap class and - * Python's heapq module. - * - * See http://closure-library.googlecode.com/svn/docs/closure_goog_structs_heap.js.source.html - * and http://hg.python.org/cpython/file/2.7/Lib/heapq.py. - * - * @template T - */ -var PriorityQueue = /** @class */ (function () { - /** - * @param {function(T): number} priorityFunction Priority function. - * @param {function(T): string} keyFunction Key function. - */ - function PriorityQueue(priorityFunction, keyFunction) { - /** - * @type {function(T): number} - * @private - */ - this.priorityFunction_ = priorityFunction; - /** - * @type {function(T): string} - * @private - */ - this.keyFunction_ = keyFunction; - /** - * @type {Array} - * @private - */ - this.elements_ = []; - /** - * @type {Array} - * @private - */ - this.priorities_ = []; - /** - * @type {!Object} - * @private - */ - this.queuedElements_ = {}; - } - /** - * FIXME empty description for jsdoc - */ - PriorityQueue.prototype.clear = function () { - this.elements_.length = 0; - this.priorities_.length = 0; - clear(this.queuedElements_); - }; - /** - * Remove and return the highest-priority element. O(log N). - * @return {T} Element. - */ - PriorityQueue.prototype.dequeue = function () { - var elements = this.elements_; - var priorities = this.priorities_; - var element = elements[0]; - if (elements.length == 1) { - elements.length = 0; - priorities.length = 0; - } - else { - elements[0] = elements.pop(); - priorities[0] = priorities.pop(); - this.siftUp_(0); - } - var elementKey = this.keyFunction_(element); - delete this.queuedElements_[elementKey]; - return element; - }; - /** - * Enqueue an element. O(log N). - * @param {T} element Element. - * @return {boolean} The element was added to the queue. - */ - PriorityQueue.prototype.enqueue = function (element) { - assert(!(this.keyFunction_(element) in this.queuedElements_), 31); // Tried to enqueue an `element` that was already added to the queue - var priority = this.priorityFunction_(element); - if (priority != DROP) { - this.elements_.push(element); - this.priorities_.push(priority); - this.queuedElements_[this.keyFunction_(element)] = true; - this.siftDown_(0, this.elements_.length - 1); - return true; - } - return false; - }; - /** - * @return {number} Count. - */ - PriorityQueue.prototype.getCount = function () { - return this.elements_.length; - }; - /** - * Gets the index of the left child of the node at the given index. - * @param {number} index The index of the node to get the left child for. - * @return {number} The index of the left child. - * @private - */ - PriorityQueue.prototype.getLeftChildIndex_ = function (index) { - return index * 2 + 1; - }; - /** - * Gets the index of the right child of the node at the given index. - * @param {number} index The index of the node to get the right child for. - * @return {number} The index of the right child. - * @private - */ - PriorityQueue.prototype.getRightChildIndex_ = function (index) { - return index * 2 + 2; - }; - /** - * Gets the index of the parent of the node at the given index. - * @param {number} index The index of the node to get the parent for. - * @return {number} The index of the parent. - * @private - */ - PriorityQueue.prototype.getParentIndex_ = function (index) { - return (index - 1) >> 1; - }; - /** - * Make this a heap. O(N). - * @private - */ - PriorityQueue.prototype.heapify_ = function () { - var i; - for (i = (this.elements_.length >> 1) - 1; i >= 0; i--) { - this.siftUp_(i); - } - }; - /** - * @return {boolean} Is empty. - */ - PriorityQueue.prototype.isEmpty = function () { - return this.elements_.length === 0; - }; - /** - * @param {string} key Key. - * @return {boolean} Is key queued. - */ - PriorityQueue.prototype.isKeyQueued = function (key) { - return key in this.queuedElements_; - }; - /** - * @param {T} element Element. - * @return {boolean} Is queued. - */ - PriorityQueue.prototype.isQueued = function (element) { - return this.isKeyQueued(this.keyFunction_(element)); - }; - /** - * @param {number} index The index of the node to move down. - * @private - */ - PriorityQueue.prototype.siftUp_ = function (index) { - var elements = this.elements_; - var priorities = this.priorities_; - var count = elements.length; - var element = elements[index]; - var priority = priorities[index]; - var startIndex = index; - while (index < count >> 1) { - var lIndex = this.getLeftChildIndex_(index); - var rIndex = this.getRightChildIndex_(index); - var smallerChildIndex = rIndex < count && priorities[rIndex] < priorities[lIndex] - ? rIndex - : lIndex; - elements[index] = elements[smallerChildIndex]; - priorities[index] = priorities[smallerChildIndex]; - index = smallerChildIndex; - } - elements[index] = element; - priorities[index] = priority; - this.siftDown_(startIndex, index); - }; - /** - * @param {number} startIndex The index of the root. - * @param {number} index The index of the node to move up. - * @private - */ - PriorityQueue.prototype.siftDown_ = function (startIndex, index) { - var elements = this.elements_; - var priorities = this.priorities_; - var element = elements[index]; - var priority = priorities[index]; - while (index > startIndex) { - var parentIndex = this.getParentIndex_(index); - if (priorities[parentIndex] > priority) { - elements[index] = elements[parentIndex]; - priorities[index] = priorities[parentIndex]; - index = parentIndex; - } - else { - break; - } - } - elements[index] = element; - priorities[index] = priority; - }; - /** - * FIXME empty description for jsdoc - */ - PriorityQueue.prototype.reprioritize = function () { - var priorityFunction = this.priorityFunction_; - var elements = this.elements_; - var priorities = this.priorities_; - var index = 0; - var n = elements.length; - var element, i, priority; - for (i = 0; i < n; ++i) { - element = elements[i]; - priority = priorityFunction(element); - if (priority == DROP) { - delete this.queuedElements_[this.keyFunction_(element)]; - } - else { - priorities[index] = priority; - elements[index++] = element; - } - } - elements.length = index; - priorities.length = index; - this.heapify_(); - }; - return PriorityQueue; -}()); - -/** - * @module ol/TileState - */ -/** - * @enum {number} - */ -var TileState = { - IDLE: 0, - LOADING: 1, - LOADED: 2, - /** - * Indicates that tile loading failed - * @type {number} - */ - ERROR: 3, - EMPTY: 4, -}; - -var __extends$m = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {function(import("./Tile.js").default, string, import("./coordinate.js").Coordinate, number): number} PriorityFunction - */ -var TileQueue = /** @class */ (function (_super) { - __extends$m(TileQueue, _super); - /** - * @param {PriorityFunction} tilePriorityFunction Tile priority function. - * @param {function(): ?} tileChangeCallback Function called on each tile change event. - */ - function TileQueue(tilePriorityFunction, tileChangeCallback) { - var _this = _super.call(this, - /** - * @param {Array} element Element. - * @return {number} Priority. - */ - function (element) { - return tilePriorityFunction.apply(null, element); - }, - /** - * @param {Array} element Element. - * @return {string} Key. - */ - function (element) { - return /** @type {import("./Tile.js").default} */ (element[0]).getKey(); - }) || this; - /** @private */ - _this.boundHandleTileChange_ = _this.handleTileChange.bind(_this); - /** - * @private - * @type {function(): ?} - */ - _this.tileChangeCallback_ = tileChangeCallback; - /** - * @private - * @type {number} - */ - _this.tilesLoading_ = 0; - /** - * @private - * @type {!Object} - */ - _this.tilesLoadingKeys_ = {}; - return _this; - } - /** - * @param {Array} element Element. - * @return {boolean} The element was added to the queue. - */ - TileQueue.prototype.enqueue = function (element) { - var added = _super.prototype.enqueue.call(this, element); - if (added) { - var tile = element[0]; - tile.addEventListener(EventType.CHANGE, this.boundHandleTileChange_); - } - return added; - }; - /** - * @return {number} Number of tiles loading. - */ - TileQueue.prototype.getTilesLoading = function () { - return this.tilesLoading_; - }; - /** - * @param {import("./events/Event.js").default} event Event. - * @protected - */ - TileQueue.prototype.handleTileChange = function (event) { - var tile = /** @type {import("./Tile.js").default} */ (event.target); - var state = tile.getState(); - if ((tile.hifi && state === TileState.LOADED) || - state === TileState.ERROR || - state === TileState.EMPTY) { - tile.removeEventListener(EventType.CHANGE, this.boundHandleTileChange_); - var tileKey = tile.getKey(); - if (tileKey in this.tilesLoadingKeys_) { - delete this.tilesLoadingKeys_[tileKey]; - --this.tilesLoading_; - } - this.tileChangeCallback_(); - } - }; - /** - * @param {number} maxTotalLoading Maximum number tiles to load simultaneously. - * @param {number} maxNewLoads Maximum number of new tiles to load. - */ - TileQueue.prototype.loadMoreTiles = function (maxTotalLoading, maxNewLoads) { - var newLoads = 0; - var state, tile, tileKey; - while (this.tilesLoading_ < maxTotalLoading && - newLoads < maxNewLoads && - this.getCount() > 0) { - tile = /** @type {import("./Tile.js").default} */ (this.dequeue()[0]); - tileKey = tile.getKey(); - state = tile.getState(); - if (state === TileState.IDLE && !(tileKey in this.tilesLoadingKeys_)) { - this.tilesLoadingKeys_[tileKey] = true; - ++this.tilesLoading_; - ++newLoads; - tile.load(); - } - } - }; - return TileQueue; -}(PriorityQueue)); -/** - * @param {import('./PluggableMap.js').FrameState} frameState Frame state. - * @param {import("./Tile.js").default} tile Tile. - * @param {string} tileSourceKey Tile source key. - * @param {import("./coordinate.js").Coordinate} tileCenter Tile center. - * @param {number} tileResolution Tile resolution. - * @return {number} Tile priority. - */ -function getTilePriority(frameState, tile, tileSourceKey, tileCenter, tileResolution) { - // Filter out tiles at higher zoom levels than the current zoom level, or that - // are outside the visible extent. - if (!frameState || !(tileSourceKey in frameState.wantedTiles)) { - return DROP; - } - if (!frameState.wantedTiles[tileSourceKey][tile.getKey()]) { - return DROP; - } - // Prioritize the highest zoom level tiles closest to the focus. - // Tiles at higher zoom levels are prioritized using Math.log(tileResolution). - // Within a zoom level, tiles are prioritized by the distance in pixels between - // the center of the tile and the center of the viewport. The factor of 65536 - // means that the prioritization should behave as desired for tiles up to - // 65536 * Math.log(2) = 45426 pixels from the focus. - var center = frameState.viewState.center; - var deltaX = tileCenter[0] - center[0]; - var deltaY = tileCenter[1] - center[1]; - return (65536 * Math.log(tileResolution) + - Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution); -} - -/** - * @module ol/size - */ -/** - * Determines if a size has a positive area. - * @param {Size} size The size to test. - * @return {boolean} The size has a positive area. - */ -function hasArea(size) { - return size[0] > 0 && size[1] > 0; -} -/** - * Returns a size scaled by a ratio. The result will be an array of integers. - * @param {Size} size Size. - * @param {number} ratio Ratio. - * @param {Size=} opt_size Optional reusable size array. - * @return {Size} The scaled size. - */ -function scale$2(size, ratio, opt_size) { - if (opt_size === undefined) { - opt_size = [0, 0]; - } - opt_size[0] = (size[0] * ratio + 0.5) | 0; - opt_size[1] = (size[1] * ratio + 0.5) | 0; - return opt_size; -} -/** - * Returns an `Size` array for the passed in number (meaning: square) or - * `Size` array. - * (meaning: non-square), - * @param {number|Size} size Width and height. - * @param {Size=} opt_size Optional reusable size array. - * @return {Size} Size. - * @api - */ -function toSize(size, opt_size) { - if (Array.isArray(size)) { - return size; - } - else { - if (opt_size === undefined) { - opt_size = [size, size]; - } - else { - opt_size[0] = size; - opt_size[1] = size; - } - return opt_size; - } -} - -var __extends$n = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * State of the current frame. Only `pixelRatio`, `time` and `viewState` should - * be used in applications. - * @typedef {Object} FrameState - * @property {number} pixelRatio The pixel ratio of the frame. - * @property {number} time The time when rendering of the frame was requested. - * @property {import("./View.js").State} viewState The state of the current view. - * @property {boolean} animate - * @property {import("./transform.js").Transform} coordinateToPixelTransform - * @property {import("rbush").default} declutterTree - * @property {null|import("./extent.js").Extent} extent - * @property {number} index - * @property {Array} layerStatesArray - * @property {number} layerIndex - * @property {import("./transform.js").Transform} pixelToCoordinateTransform - * @property {Array} postRenderFunctions - * @property {import("./size.js").Size} size - * @property {TileQueue} tileQueue - * @property {!Object>} usedTiles - * @property {Array} viewHints - * @property {!Object>} wantedTiles - */ -/** - * @typedef {function(PluggableMap, ?FrameState): any} PostRenderFunction - */ -/** - * @typedef {Object} AtPixelOptions - * @property {undefined|function(import("./layer/Layer.js").default): boolean} [layerFilter] Layer filter - * function. The filter function will receive one argument, the - * {@link module:ol/layer/Layer layer-candidate} and it should return a boolean value. - * Only layers which are visible and for which this function returns `true` - * will be tested for features. By default, all visible layers will be tested. - * @property {number} [hitTolerance=0] Hit-detection tolerance in css pixels. Pixels - * inside the radius around the given position will be checked for features. - * @property {boolean} [checkWrapped=true] Check-Wrapped Will check for for wrapped geometries inside the range of - * +/- 1 world width. Works only if a projection is used that can be wrapped. - */ -/** - * @typedef {Object} MapOptionsInternal - * @property {Collection} [controls] - * @property {Collection} [interactions] - * @property {HTMLElement|Document} keyboardEventTarget - * @property {Collection} overlays - * @property {Object} values - */ -/** - * Object literal with config options for the map. - * @typedef {Object} MapOptions - * @property {Collection|Array} [controls] - * Controls initially added to the map. If not specified, - * {@link module:ol/control~defaults} is used. - * @property {number} [pixelRatio=window.devicePixelRatio] The ratio between - * physical pixels and device-independent pixels (dips) on the device. - * @property {Collection|Array} [interactions] - * Interactions that are initially added to the map. If not specified, - * {@link module:ol/interaction~defaults} is used. - * @property {HTMLElement|Document|string} [keyboardEventTarget] The element to - * listen to keyboard events on. This determines when the `KeyboardPan` and - * `KeyboardZoom` interactions trigger. For example, if this option is set to - * `document` the keyboard interactions will always trigger. If this option is - * not specified, the element the library listens to keyboard events on is the - * map target (i.e. the user-provided div for the map). If this is not - * `document`, the target element needs to be focused for key events to be - * emitted, requiring that the target element has a `tabindex` attribute. - * @property {Array|Collection|LayerGroup} [layers] - * Layers. If this is not defined, a map with no layers will be rendered. Note - * that layers are rendered in the order supplied, so if you want, for example, - * a vector layer to appear on top of a tile layer, it must come after the tile - * layer. - * @property {number} [maxTilesLoading=16] Maximum number tiles to load - * simultaneously. - * @property {number} [moveTolerance=1] The minimum distance in pixels the - * cursor must move to be detected as a map move event instead of a click. - * Increasing this value can make it easier to click on the map. - * @property {Collection|Array} [overlays] - * Overlays initially added to the map. By default, no overlays are added. - * @property {HTMLElement|string} [target] The container for the map, either the - * element itself or the `id` of the element. If not specified at construction - * time, {@link module:ol/Map~Map#setTarget} must be called for the map to be - * rendered. If passed by element, the container can be in a secondary document. - * @property {View} [view] The map's view. No layer sources will be - * fetched unless this is specified at construction time or through - * {@link module:ol/Map~Map#setView}. - */ -/** - * @fires import("./MapBrowserEvent.js").MapBrowserEvent - * @fires import("./MapEvent.js").MapEvent - * @fires import("./render/Event.js").default#precompose - * @fires import("./render/Event.js").default#postcompose - * @fires import("./render/Event.js").default#rendercomplete - * @api - */ -var PluggableMap = /** @class */ (function (_super) { - __extends$n(PluggableMap, _super); - /** - * @param {MapOptions} options Map options. - */ - function PluggableMap(options) { - var _this = _super.call(this) || this; - var optionsInternal = createOptionsInternal(options); - /** @private */ - _this.boundHandleBrowserEvent_ = _this.handleBrowserEvent.bind(_this); - /** - * @type {number} - * @private - */ - _this.maxTilesLoading_ = - options.maxTilesLoading !== undefined ? options.maxTilesLoading : 16; - /** - * @private - * @type {number} - */ - _this.pixelRatio_ = - options.pixelRatio !== undefined - ? options.pixelRatio - : DEVICE_PIXEL_RATIO; - /** - * @private - * @type {*} - */ - _this.postRenderTimeoutHandle_; - /** - * @private - * @type {number|undefined} - */ - _this.animationDelayKey_; - /** - * @private - */ - _this.animationDelay_ = /** @this {PluggableMap} */ function () { - this.animationDelayKey_ = undefined; - this.renderFrame_(Date.now()); - }.bind(_this); - /** - * @private - * @type {import("./transform.js").Transform} - */ - _this.coordinateToPixelTransform_ = create(); - /** - * @private - * @type {import("./transform.js").Transform} - */ - _this.pixelToCoordinateTransform_ = create(); - /** - * @private - * @type {number} - */ - _this.frameIndex_ = 0; - /** - * @private - * @type {?FrameState} - */ - _this.frameState_ = null; - /** - * The extent at the previous 'moveend' event. - * @private - * @type {import("./extent.js").Extent} - */ - _this.previousExtent_ = null; - /** - * @private - * @type {?import("./events.js").EventsKey} - */ - _this.viewPropertyListenerKey_ = null; - /** - * @private - * @type {?import("./events.js").EventsKey} - */ - _this.viewChangeListenerKey_ = null; - /** - * @private - * @type {?Array} - */ - _this.layerGroupPropertyListenerKeys_ = null; - /** - * @private - * @type {!HTMLElement} - */ - _this.viewport_ = document.createElement('div'); - _this.viewport_.className = - 'ol-viewport' + ('ontouchstart' in window ? ' ol-touch' : ''); - _this.viewport_.style.position = 'relative'; - _this.viewport_.style.overflow = 'hidden'; - _this.viewport_.style.width = '100%'; - _this.viewport_.style.height = '100%'; - /** - * @private - * @type {!HTMLElement} - */ - _this.overlayContainer_ = document.createElement('div'); - _this.overlayContainer_.style.position = 'absolute'; - _this.overlayContainer_.style.zIndex = '0'; - _this.overlayContainer_.style.width = '100%'; - _this.overlayContainer_.style.height = '100%'; - _this.overlayContainer_.style.pointerEvents = 'none'; - _this.overlayContainer_.className = 'ol-overlaycontainer'; - _this.viewport_.appendChild(_this.overlayContainer_); - /** - * @private - * @type {!HTMLElement} - */ - _this.overlayContainerStopEvent_ = document.createElement('div'); - _this.overlayContainerStopEvent_.style.position = 'absolute'; - _this.overlayContainerStopEvent_.style.zIndex = '0'; - _this.overlayContainerStopEvent_.style.width = '100%'; - _this.overlayContainerStopEvent_.style.height = '100%'; - _this.overlayContainerStopEvent_.style.pointerEvents = 'none'; - _this.overlayContainerStopEvent_.className = 'ol-overlaycontainer-stopevent'; - _this.viewport_.appendChild(_this.overlayContainerStopEvent_); - /** - * @private - * @type {MapBrowserEventHandler} - */ - _this.mapBrowserEventHandler_ = null; - /** - * @private - * @type {number} - */ - _this.moveTolerance_ = options.moveTolerance; - /** - * @private - * @type {HTMLElement|Document} - */ - _this.keyboardEventTarget_ = optionsInternal.keyboardEventTarget; - /** - * @private - * @type {?Array} - */ - _this.keyHandlerKeys_ = null; - /** - * @type {Collection} - * @protected - */ - _this.controls = optionsInternal.controls || new Collection(); - /** - * @type {Collection} - * @protected - */ - _this.interactions = optionsInternal.interactions || new Collection(); - /** - * @type {Collection} - * @private - */ - _this.overlays_ = optionsInternal.overlays; - /** - * A lookup of overlays by id. - * @private - * @type {Object} - */ - _this.overlayIdIndex_ = {}; - /** - * @type {import("./renderer/Map.js").default} - * @private - */ - _this.renderer_ = null; - /** - * @type {undefined|function(Event): void} - * @private - */ - _this.handleResize_; - /** - * @private - * @type {!Array} - */ - _this.postRenderFunctions_ = []; - /** - * @private - * @type {TileQueue} - */ - _this.tileQueue_ = new TileQueue(_this.getTilePriority.bind(_this), _this.handleTileChange_.bind(_this)); - _this.addEventListener(getChangeEventType(MapProperty.LAYERGROUP), _this.handleLayerGroupChanged_); - _this.addEventListener(getChangeEventType(MapProperty.VIEW), _this.handleViewChanged_); - _this.addEventListener(getChangeEventType(MapProperty.SIZE), _this.handleSizeChanged_); - _this.addEventListener(getChangeEventType(MapProperty.TARGET), _this.handleTargetChanged_); - // setProperties will trigger the rendering of the map if the map - // is "defined" already. - _this.setProperties(optionsInternal.values); - _this.controls.forEach( - /** - * @param {import("./control/Control.js").default} control Control. - * @this {PluggableMap} - */ - function (control) { - control.setMap(this); - }.bind(_this)); - _this.controls.addEventListener(CollectionEventType.ADD, - /** - * @param {import("./Collection.js").CollectionEvent} event CollectionEvent. - */ - function (event) { - event.element.setMap(this); - }.bind(_this)); - _this.controls.addEventListener(CollectionEventType.REMOVE, - /** - * @param {import("./Collection.js").CollectionEvent} event CollectionEvent. - */ - function (event) { - event.element.setMap(null); - }.bind(_this)); - _this.interactions.forEach( - /** - * @param {import("./interaction/Interaction.js").default} interaction Interaction. - * @this {PluggableMap} - */ - function (interaction) { - interaction.setMap(this); - }.bind(_this)); - _this.interactions.addEventListener(CollectionEventType.ADD, - /** - * @param {import("./Collection.js").CollectionEvent} event CollectionEvent. - */ - function (event) { - event.element.setMap(this); - }.bind(_this)); - _this.interactions.addEventListener(CollectionEventType.REMOVE, - /** - * @param {import("./Collection.js").CollectionEvent} event CollectionEvent. - */ - function (event) { - event.element.setMap(null); - }.bind(_this)); - _this.overlays_.forEach(_this.addOverlayInternal_.bind(_this)); - _this.overlays_.addEventListener(CollectionEventType.ADD, - /** - * @param {import("./Collection.js").CollectionEvent} event CollectionEvent. - */ - function (event) { - this.addOverlayInternal_( - /** @type {import("./Overlay.js").default} */ (event.element)); - }.bind(_this)); - _this.overlays_.addEventListener(CollectionEventType.REMOVE, - /** - * @param {import("./Collection.js").CollectionEvent} event CollectionEvent. - */ - function (event) { - var overlay = /** @type {import("./Overlay.js").default} */ (event.element); - var id = overlay.getId(); - if (id !== undefined) { - delete this.overlayIdIndex_[id.toString()]; - } - event.element.setMap(null); - }.bind(_this)); - return _this; - } - /** - * @abstract - * @return {import("./renderer/Map.js").default} The map renderer - */ - PluggableMap.prototype.createRenderer = function () { - throw new Error('Use a map type that has a createRenderer method'); - }; - /** - * Add the given control to the map. - * @param {import("./control/Control.js").default} control Control. - * @api - */ - PluggableMap.prototype.addControl = function (control) { - this.getControls().push(control); - }; - /** - * Add the given interaction to the map. If you want to add an interaction - * at another point of the collection use `getInteraction()` and the methods - * available on {@link module:ol/Collection~Collection}. This can be used to - * stop the event propagation from the handleEvent function. The interactions - * get to handle the events in the reverse order of this collection. - * @param {import("./interaction/Interaction.js").default} interaction Interaction to add. - * @api - */ - PluggableMap.prototype.addInteraction = function (interaction) { - this.getInteractions().push(interaction); - }; - /** - * Adds the given layer to the top of this map. If you want to add a layer - * elsewhere in the stack, use `getLayers()` and the methods available on - * {@link module:ol/Collection~Collection}. - * @param {import("./layer/Base.js").default} layer Layer. - * @api - */ - PluggableMap.prototype.addLayer = function (layer) { - var layers = this.getLayerGroup().getLayers(); - layers.push(layer); - }; - /** - * Add the given overlay to the map. - * @param {import("./Overlay.js").default} overlay Overlay. - * @api - */ - PluggableMap.prototype.addOverlay = function (overlay) { - this.getOverlays().push(overlay); - }; - /** - * This deals with map's overlay collection changes. - * @param {import("./Overlay.js").default} overlay Overlay. - * @private - */ - PluggableMap.prototype.addOverlayInternal_ = function (overlay) { - var id = overlay.getId(); - if (id !== undefined) { - this.overlayIdIndex_[id.toString()] = overlay; - } - overlay.setMap(this); - }; - /** - * - * Clean up. - */ - PluggableMap.prototype.disposeInternal = function () { - this.setTarget(null); - _super.prototype.disposeInternal.call(this); - }; - /** - * Detect features that intersect a pixel on the viewport, and execute a - * callback with each intersecting feature. Layers included in the detection can - * be configured through the `layerFilter` option in `opt_options`. - * @param {import("./pixel.js").Pixel} pixel Pixel. - * @param {function(import("./Feature.js").FeatureLike, import("./layer/Layer.js").default, import("./geom/SimpleGeometry.js").default): T} callback Feature callback. The callback will be - * called with two arguments. The first argument is one - * {@link module:ol/Feature feature} or - * {@link module:ol/render/Feature render feature} at the pixel, the second is - * the {@link module:ol/layer/Layer layer} of the feature and will be null for - * unmanaged layers. To stop detection, callback functions can return a - * truthy value. - * @param {AtPixelOptions=} opt_options Optional options. - * @return {T|undefined} Callback result, i.e. the return value of last - * callback execution, or the first truthy callback return value. - * @template S,T - * @api - */ - PluggableMap.prototype.forEachFeatureAtPixel = function (pixel, callback, opt_options) { - if (!this.frameState_) { - return; - } - var coordinate = this.getCoordinateFromPixelInternal(pixel); - opt_options = opt_options !== undefined ? opt_options : {}; - var hitTolerance = opt_options.hitTolerance !== undefined ? opt_options.hitTolerance : 0; - var layerFilter = opt_options.layerFilter !== undefined ? opt_options.layerFilter : TRUE; - var checkWrapped = opt_options.checkWrapped !== false; - return this.renderer_.forEachFeatureAtCoordinate(coordinate, this.frameState_, hitTolerance, checkWrapped, callback, null, layerFilter, null); - }; - /** - * Get all features that intersect a pixel on the viewport. - * @param {import("./pixel.js").Pixel} pixel Pixel. - * @param {AtPixelOptions=} opt_options Optional options. - * @return {Array} The detected features or - * an empty array if none were found. - * @api - */ - PluggableMap.prototype.getFeaturesAtPixel = function (pixel, opt_options) { - var features = []; - this.forEachFeatureAtPixel(pixel, function (feature) { - features.push(feature); - }, opt_options); - return features; - }; - /** - * Detect layers that have a color value at a pixel on the viewport, and - * execute a callback with each matching layer. Layers included in the - * detection can be configured through `opt_layerFilter`. - * - * Note: this may give false positives unless the map layers have had different `className` - * properties assigned to them. - * - * @param {import("./pixel.js").Pixel} pixel Pixel. - * @param {function(this: S, import("./layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback - * Layer callback. This callback will receive two arguments: first is the - * {@link module:ol/layer/Layer layer}, second argument is an array representing - * [R, G, B, A] pixel values (0 - 255) and will be `null` for layer types - * that do not currently support this argument. To stop detection, callback - * functions can return a truthy value. - * @param {AtPixelOptions=} opt_options Configuration options. - * @return {T|undefined} Callback result, i.e. the return value of last - * callback execution, or the first truthy callback return value. - * @template S,T - * @api - */ - PluggableMap.prototype.forEachLayerAtPixel = function (pixel, callback, opt_options) { - if (!this.frameState_) { - return; - } - var options = opt_options || {}; - var hitTolerance = options.hitTolerance !== undefined ? options.hitTolerance : 0; - var layerFilter = options.layerFilter || TRUE; - return this.renderer_.forEachLayerAtPixel(pixel, this.frameState_, hitTolerance, callback, layerFilter); - }; - /** - * Detect if features intersect a pixel on the viewport. Layers included in the - * detection can be configured through `opt_layerFilter`. - * @param {import("./pixel.js").Pixel} pixel Pixel. - * @param {AtPixelOptions=} opt_options Optional options. - * @return {boolean} Is there a feature at the given pixel? - * @api - */ - PluggableMap.prototype.hasFeatureAtPixel = function (pixel, opt_options) { - if (!this.frameState_) { - return false; - } - var coordinate = this.getCoordinateFromPixelInternal(pixel); - opt_options = opt_options !== undefined ? opt_options : {}; - var layerFilter = opt_options.layerFilter !== undefined ? opt_options.layerFilter : TRUE; - var hitTolerance = opt_options.hitTolerance !== undefined ? opt_options.hitTolerance : 0; - var checkWrapped = opt_options.checkWrapped !== false; - return this.renderer_.hasFeatureAtCoordinate(coordinate, this.frameState_, hitTolerance, checkWrapped, layerFilter, null); - }; - /** - * Returns the coordinate in user projection for a browser event. - * @param {MouseEvent} event Event. - * @return {import("./coordinate.js").Coordinate} Coordinate. - * @api - */ - PluggableMap.prototype.getEventCoordinate = function (event) { - return this.getCoordinateFromPixel(this.getEventPixel(event)); - }; - /** - * Returns the coordinate in view projection for a browser event. - * @param {MouseEvent} event Event. - * @return {import("./coordinate.js").Coordinate} Coordinate. - */ - PluggableMap.prototype.getEventCoordinateInternal = function (event) { - return this.getCoordinateFromPixelInternal(this.getEventPixel(event)); - }; - /** - * Returns the map pixel position for a browser event relative to the viewport. - * @param {UIEvent} event Event. - * @return {import("./pixel.js").Pixel} Pixel. - * @api - */ - PluggableMap.prototype.getEventPixel = function (event) { - var viewportPosition = this.viewport_.getBoundingClientRect(); - var eventPosition = - //FIXME Are we really calling this with a TouchEvent anywhere? - 'changedTouches' in event - ? /** @type {TouchEvent} */ (event).changedTouches[0] - : /** @type {MouseEvent} */ (event); - return [ - eventPosition.clientX - viewportPosition.left, - eventPosition.clientY - viewportPosition.top, - ]; - }; - /** - * Get the target in which this map is rendered. - * Note that this returns what is entered as an option or in setTarget: - * if that was an element, it returns an element; if a string, it returns that. - * @return {HTMLElement|string|undefined} The Element or id of the Element that the - * map is rendered in. - * @observable - * @api - */ - PluggableMap.prototype.getTarget = function () { - return /** @type {HTMLElement|string|undefined} */ (this.get(MapProperty.TARGET)); - }; - /** - * Get the DOM element into which this map is rendered. In contrast to - * `getTarget` this method always return an `Element`, or `null` if the - * map has no target. - * @return {HTMLElement} The element that the map is rendered in. - * @api - */ - PluggableMap.prototype.getTargetElement = function () { - var target = this.getTarget(); - if (target !== undefined) { - return typeof target === 'string' - ? document.getElementById(target) - : target; - } - else { - return null; - } - }; - /** - * Get the coordinate for a given pixel. This returns a coordinate in the - * user projection. - * @param {import("./pixel.js").Pixel} pixel Pixel position in the map viewport. - * @return {import("./coordinate.js").Coordinate} The coordinate for the pixel position. - * @api - */ - PluggableMap.prototype.getCoordinateFromPixel = function (pixel) { - return toUserCoordinate(this.getCoordinateFromPixelInternal(pixel), this.getView().getProjection()); - }; - /** - * Get the coordinate for a given pixel. This returns a coordinate in the - * map view projection. - * @param {import("./pixel.js").Pixel} pixel Pixel position in the map viewport. - * @return {import("./coordinate.js").Coordinate} The coordinate for the pixel position. - */ - PluggableMap.prototype.getCoordinateFromPixelInternal = function (pixel) { - var frameState = this.frameState_; - if (!frameState) { - return null; - } - else { - return apply(frameState.pixelToCoordinateTransform, pixel.slice()); - } - }; - /** - * Get the map controls. Modifying this collection changes the controls - * associated with the map. - * @return {Collection} Controls. - * @api - */ - PluggableMap.prototype.getControls = function () { - return this.controls; - }; - /** - * Get the map overlays. Modifying this collection changes the overlays - * associated with the map. - * @return {Collection} Overlays. - * @api - */ - PluggableMap.prototype.getOverlays = function () { - return this.overlays_; - }; - /** - * Get an overlay by its identifier (the value returned by overlay.getId()). - * Note that the index treats string and numeric identifiers as the same. So - * `map.getOverlayById(2)` will return an overlay with id `'2'` or `2`. - * @param {string|number} id Overlay identifier. - * @return {import("./Overlay.js").default} Overlay. - * @api - */ - PluggableMap.prototype.getOverlayById = function (id) { - var overlay = this.overlayIdIndex_[id.toString()]; - return overlay !== undefined ? overlay : null; - }; - /** - * Get the map interactions. Modifying this collection changes the interactions - * associated with the map. - * - * Interactions are used for e.g. pan, zoom and rotate. - * @return {Collection} Interactions. - * @api - */ - PluggableMap.prototype.getInteractions = function () { - return this.interactions; - }; - /** - * Get the layergroup associated with this map. - * @return {LayerGroup} A layer group containing the layers in this map. - * @observable - * @api - */ - PluggableMap.prototype.getLayerGroup = function () { - return /** @type {LayerGroup} */ (this.get(MapProperty.LAYERGROUP)); - }; - /** - * Get the collection of layers associated with this map. - * @return {!Collection} Layers. - * @api - */ - PluggableMap.prototype.getLayers = function () { - var layers = this.getLayerGroup().getLayers(); - return layers; - }; - /** - * @return {boolean} Layers have sources that are still loading. - */ - PluggableMap.prototype.getLoading = function () { - var layerStatesArray = this.getLayerGroup().getLayerStatesArray(); - for (var i = 0, ii = layerStatesArray.length; i < ii; ++i) { - var layer = layerStatesArray[i].layer; - var source = /** @type {import("./layer/Layer.js").default} */ (layer).getSource(); - if (source && source.loading) { - return true; - } - } - return false; - }; - /** - * Get the pixel for a coordinate. This takes a coordinate in the user - * projection and returns the corresponding pixel. - * @param {import("./coordinate.js").Coordinate} coordinate A map coordinate. - * @return {import("./pixel.js").Pixel} A pixel position in the map viewport. - * @api - */ - PluggableMap.prototype.getPixelFromCoordinate = function (coordinate) { - var viewCoordinate = fromUserCoordinate(coordinate, this.getView().getProjection()); - return this.getPixelFromCoordinateInternal(viewCoordinate); - }; - /** - * Get the pixel for a coordinate. This takes a coordinate in the map view - * projection and returns the corresponding pixel. - * @param {import("./coordinate.js").Coordinate} coordinate A map coordinate. - * @return {import("./pixel.js").Pixel} A pixel position in the map viewport. - */ - PluggableMap.prototype.getPixelFromCoordinateInternal = function (coordinate) { - var frameState = this.frameState_; - if (!frameState) { - return null; - } - else { - return apply(frameState.coordinateToPixelTransform, coordinate.slice(0, 2)); - } - }; - /** - * Get the map renderer. - * @return {import("./renderer/Map.js").default} Renderer - */ - PluggableMap.prototype.getRenderer = function () { - return this.renderer_; - }; - /** - * Get the size of this map. - * @return {import("./size.js").Size|undefined} The size in pixels of the map in the DOM. - * @observable - * @api - */ - PluggableMap.prototype.getSize = function () { - return /** @type {import("./size.js").Size|undefined} */ (this.get(MapProperty.SIZE)); - }; - /** - * Get the view associated with this map. A view manages properties such as - * center and resolution. - * @return {View} The view that controls this map. - * @observable - * @api - */ - PluggableMap.prototype.getView = function () { - return /** @type {View} */ (this.get(MapProperty.VIEW)); - }; - /** - * Get the element that serves as the map viewport. - * @return {HTMLElement} Viewport. - * @api - */ - PluggableMap.prototype.getViewport = function () { - return this.viewport_; - }; - /** - * Get the element that serves as the container for overlays. Elements added to - * this container will let mousedown and touchstart events through to the map, - * so clicks and gestures on an overlay will trigger {@link module:ol/MapBrowserEvent~MapBrowserEvent} - * events. - * @return {!HTMLElement} The map's overlay container. - */ - PluggableMap.prototype.getOverlayContainer = function () { - return this.overlayContainer_; - }; - /** - * Get the element that serves as a container for overlays that don't allow - * event propagation. Elements added to this container won't let mousedown and - * touchstart events through to the map, so clicks and gestures on an overlay - * don't trigger any {@link module:ol/MapBrowserEvent~MapBrowserEvent}. - * @return {!HTMLElement} The map's overlay container that stops events. - */ - PluggableMap.prototype.getOverlayContainerStopEvent = function () { - return this.overlayContainerStopEvent_; - }; - /** - * @return {!Document} The document where the map is displayed. - */ - PluggableMap.prototype.getOwnerDocument = function () { - return this.getTargetElement() - ? this.getTargetElement().ownerDocument - : document; - }; - /** - * @param {import("./Tile.js").default} tile Tile. - * @param {string} tileSourceKey Tile source key. - * @param {import("./coordinate.js").Coordinate} tileCenter Tile center. - * @param {number} tileResolution Tile resolution. - * @return {number} Tile priority. - */ - PluggableMap.prototype.getTilePriority = function (tile, tileSourceKey, tileCenter, tileResolution) { - return getTilePriority(this.frameState_, tile, tileSourceKey, tileCenter, tileResolution); - }; - /** - * @param {UIEvent} browserEvent Browser event. - * @param {string=} opt_type Type. - */ - PluggableMap.prototype.handleBrowserEvent = function (browserEvent, opt_type) { - var type = opt_type || browserEvent.type; - var mapBrowserEvent = new MapBrowserEvent(type, this, browserEvent); - this.handleMapBrowserEvent(mapBrowserEvent); - }; - /** - * @param {MapBrowserEvent} mapBrowserEvent The event to handle. - */ - PluggableMap.prototype.handleMapBrowserEvent = function (mapBrowserEvent) { - if (!this.frameState_) { - // With no view defined, we cannot translate pixels into geographical - // coordinates so interactions cannot be used. - return; - } - var originalEvent = /** @type {PointerEvent} */ (mapBrowserEvent.originalEvent); - var eventType = originalEvent.type; - if (eventType === PointerEventType.POINTERDOWN || - eventType === EventType.WHEEL || - eventType === EventType.KEYDOWN) { - var doc = this.getOwnerDocument(); - var rootNode = this.viewport_.getRootNode - ? this.viewport_.getRootNode() - : doc; - var target = 'host' in rootNode // ShadowRoot - ? /** @type {ShadowRoot} */ (rootNode).elementFromPoint(originalEvent.clientX, originalEvent.clientY) - : /** @type {Node} */ (originalEvent.target); - if ( - // Abort if the target is a child of the container for elements whose events are not meant - // to be handled by map interactions. - this.overlayContainerStopEvent_.contains(target) || - // Abort if the event target is a child of the container that is no longer in the page. - // It's possible for the target to no longer be in the page if it has been removed in an - // event listener, this might happen in a Control that recreates it's content based on - // user interaction either manually or via a render in something like https://reactjs.org/ - !(rootNode === doc ? doc.documentElement : rootNode).contains(target)) { - return; - } - } - mapBrowserEvent.frameState = this.frameState_; - if (this.dispatchEvent(mapBrowserEvent) !== false) { - var interactionsArray = this.getInteractions().getArray().slice(); - for (var i = interactionsArray.length - 1; i >= 0; i--) { - var interaction = interactionsArray[i]; - if (interaction.getMap() !== this || - !interaction.getActive() || - !this.getTargetElement()) { - continue; - } - var cont = interaction.handleEvent(mapBrowserEvent); - if (!cont || mapBrowserEvent.propagationStopped) { - break; - } - } - } - }; - /** - * @protected - */ - PluggableMap.prototype.handlePostRender = function () { - var frameState = this.frameState_; - // Manage the tile queue - // Image loads are expensive and a limited resource, so try to use them - // efficiently: - // * When the view is static we allow a large number of parallel tile loads - // to complete the frame as quickly as possible. - // * When animating or interacting, image loads can cause janks, so we reduce - // the maximum number of loads per frame and limit the number of parallel - // tile loads to remain reactive to view changes and to reduce the chance of - // loading tiles that will quickly disappear from view. - var tileQueue = this.tileQueue_; - if (!tileQueue.isEmpty()) { - var maxTotalLoading = this.maxTilesLoading_; - var maxNewLoads = maxTotalLoading; - if (frameState) { - var hints = frameState.viewHints; - if (hints[ViewHint.ANIMATING] || hints[ViewHint.INTERACTING]) { - var lowOnFrameBudget = !IMAGE_DECODE && Date.now() - frameState.time > 8; - maxTotalLoading = lowOnFrameBudget ? 0 : 8; - maxNewLoads = lowOnFrameBudget ? 0 : 2; - } - } - if (tileQueue.getTilesLoading() < maxTotalLoading) { - tileQueue.reprioritize(); // FIXME only call if view has changed - tileQueue.loadMoreTiles(maxTotalLoading, maxNewLoads); - } - } - if (frameState && - this.hasListener(RenderEventType.RENDERCOMPLETE) && - !frameState.animate && - !this.tileQueue_.getTilesLoading() && - !this.getLoading()) { - this.renderer_.dispatchRenderEvent(RenderEventType.RENDERCOMPLETE, frameState); - } - var postRenderFunctions = this.postRenderFunctions_; - for (var i = 0, ii = postRenderFunctions.length; i < ii; ++i) { - postRenderFunctions[i](this, frameState); - } - postRenderFunctions.length = 0; - }; - /** - * @private - */ - PluggableMap.prototype.handleSizeChanged_ = function () { - if (this.getView() && !this.getView().getAnimating()) { - this.getView().resolveConstraints(0); - } - this.render(); - }; - /** - * @private - */ - PluggableMap.prototype.handleTargetChanged_ = function () { - // target may be undefined, null, a string or an Element. - // If it's a string we convert it to an Element before proceeding. - // If it's not now an Element we remove the viewport from the DOM. - // If it's an Element we append the viewport element to it. - var targetElement; - if (this.getTarget()) { - targetElement = this.getTargetElement(); - } - if (this.mapBrowserEventHandler_) { - for (var i = 0, ii = this.keyHandlerKeys_.length; i < ii; ++i) { - unlistenByKey(this.keyHandlerKeys_[i]); - } - this.keyHandlerKeys_ = null; - this.viewport_.removeEventListener(EventType.CONTEXTMENU, this.boundHandleBrowserEvent_); - this.viewport_.removeEventListener(EventType.WHEEL, this.boundHandleBrowserEvent_); - if (this.handleResize_ !== undefined) { - removeEventListener(EventType.RESIZE, this.handleResize_, false); - this.handleResize_ = undefined; - } - this.mapBrowserEventHandler_.dispose(); - this.mapBrowserEventHandler_ = null; - removeNode(this.viewport_); - } - if (!targetElement) { - if (this.renderer_) { - clearTimeout(this.postRenderTimeoutHandle_); - this.postRenderTimeoutHandle_ = undefined; - this.postRenderFunctions_.length = 0; - this.renderer_.dispose(); - this.renderer_ = null; - } - if (this.animationDelayKey_) { - cancelAnimationFrame(this.animationDelayKey_); - this.animationDelayKey_ = undefined; - } - } - else { - targetElement.appendChild(this.viewport_); - if (!this.renderer_) { - this.renderer_ = this.createRenderer(); - } - this.mapBrowserEventHandler_ = new MapBrowserEventHandler(this, this.moveTolerance_); - for (var key in MapBrowserEventType) { - this.mapBrowserEventHandler_.addEventListener(MapBrowserEventType[key], this.handleMapBrowserEvent.bind(this)); - } - this.viewport_.addEventListener(EventType.CONTEXTMENU, this.boundHandleBrowserEvent_, false); - this.viewport_.addEventListener(EventType.WHEEL, this.boundHandleBrowserEvent_, PASSIVE_EVENT_LISTENERS ? { passive: false } : false); - var keyboardEventTarget = !this.keyboardEventTarget_ - ? targetElement - : this.keyboardEventTarget_; - this.keyHandlerKeys_ = [ - listen(keyboardEventTarget, EventType.KEYDOWN, this.handleBrowserEvent, this), - listen(keyboardEventTarget, EventType.KEYPRESS, this.handleBrowserEvent, this), - ]; - if (!this.handleResize_) { - this.handleResize_ = this.updateSize.bind(this); - window.addEventListener(EventType.RESIZE, this.handleResize_, false); - } - } - this.updateSize(); - // updateSize calls setSize, so no need to call this.render - // ourselves here. - }; - /** - * @private - */ - PluggableMap.prototype.handleTileChange_ = function () { - this.render(); - }; - /** - * @private - */ - PluggableMap.prototype.handleViewPropertyChanged_ = function () { - this.render(); - }; - /** - * @private - */ - PluggableMap.prototype.handleViewChanged_ = function () { - if (this.viewPropertyListenerKey_) { - unlistenByKey(this.viewPropertyListenerKey_); - this.viewPropertyListenerKey_ = null; - } - if (this.viewChangeListenerKey_) { - unlistenByKey(this.viewChangeListenerKey_); - this.viewChangeListenerKey_ = null; - } - var view = this.getView(); - if (view) { - this.updateViewportSize_(); - this.viewPropertyListenerKey_ = listen(view, ObjectEventType.PROPERTYCHANGE, this.handleViewPropertyChanged_, this); - this.viewChangeListenerKey_ = listen(view, EventType.CHANGE, this.handleViewPropertyChanged_, this); - view.resolveConstraints(0); - } - this.render(); - }; - /** - * @private - */ - PluggableMap.prototype.handleLayerGroupChanged_ = function () { - if (this.layerGroupPropertyListenerKeys_) { - this.layerGroupPropertyListenerKeys_.forEach(unlistenByKey); - this.layerGroupPropertyListenerKeys_ = null; - } - var layerGroup = this.getLayerGroup(); - if (layerGroup) { - this.layerGroupPropertyListenerKeys_ = [ - listen(layerGroup, ObjectEventType.PROPERTYCHANGE, this.render, this), - listen(layerGroup, EventType.CHANGE, this.render, this), - ]; - } - this.render(); - }; - /** - * @return {boolean} Is rendered. - */ - PluggableMap.prototype.isRendered = function () { - return !!this.frameState_; - }; - /** - * Requests an immediate render in a synchronous manner. - * @api - */ - PluggableMap.prototype.renderSync = function () { - if (this.animationDelayKey_) { - cancelAnimationFrame(this.animationDelayKey_); - } - this.animationDelay_(); - }; - /** - * Redraws all text after new fonts have loaded - */ - PluggableMap.prototype.redrawText = function () { - var layerStates = this.getLayerGroup().getLayerStatesArray(); - for (var i = 0, ii = layerStates.length; i < ii; ++i) { - var layer = layerStates[i].layer; - if (layer.hasRenderer()) { - layer.getRenderer().handleFontsChanged(); - } - } - }; - /** - * Request a map rendering (at the next animation frame). - * @api - */ - PluggableMap.prototype.render = function () { - if (this.renderer_ && this.animationDelayKey_ === undefined) { - this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_); - } - }; - /** - * Remove the given control from the map. - * @param {import("./control/Control.js").default} control Control. - * @return {import("./control/Control.js").default|undefined} The removed control (or undefined - * if the control was not found). - * @api - */ - PluggableMap.prototype.removeControl = function (control) { - return this.getControls().remove(control); - }; - /** - * Remove the given interaction from the map. - * @param {import("./interaction/Interaction.js").default} interaction Interaction to remove. - * @return {import("./interaction/Interaction.js").default|undefined} The removed interaction (or - * undefined if the interaction was not found). - * @api - */ - PluggableMap.prototype.removeInteraction = function (interaction) { - return this.getInteractions().remove(interaction); - }; - /** - * Removes the given layer from the map. - * @param {import("./layer/Base.js").default} layer Layer. - * @return {import("./layer/Base.js").default|undefined} The removed layer (or undefined if the - * layer was not found). - * @api - */ - PluggableMap.prototype.removeLayer = function (layer) { - var layers = this.getLayerGroup().getLayers(); - return layers.remove(layer); - }; - /** - * Remove the given overlay from the map. - * @param {import("./Overlay.js").default} overlay Overlay. - * @return {import("./Overlay.js").default|undefined} The removed overlay (or undefined - * if the overlay was not found). - * @api - */ - PluggableMap.prototype.removeOverlay = function (overlay) { - return this.getOverlays().remove(overlay); - }; - /** - * @param {number} time Time. - * @private - */ - PluggableMap.prototype.renderFrame_ = function (time) { - var _this = this; - var size = this.getSize(); - var view = this.getView(); - var previousFrameState = this.frameState_; - /** @type {?FrameState} */ - var frameState = null; - if (size !== undefined && hasArea(size) && view && view.isDef()) { - var viewHints = view.getHints(this.frameState_ ? this.frameState_.viewHints : undefined); - var viewState = view.getState(); - frameState = { - animate: false, - coordinateToPixelTransform: this.coordinateToPixelTransform_, - declutterTree: null, - extent: getForViewAndSize(viewState.center, viewState.resolution, viewState.rotation, size), - index: this.frameIndex_++, - layerIndex: 0, - layerStatesArray: this.getLayerGroup().getLayerStatesArray(), - pixelRatio: this.pixelRatio_, - pixelToCoordinateTransform: this.pixelToCoordinateTransform_, - postRenderFunctions: [], - size: size, - tileQueue: this.tileQueue_, - time: time, - usedTiles: {}, - viewState: viewState, - viewHints: viewHints, - wantedTiles: {}, - }; - } - this.frameState_ = frameState; - this.renderer_.renderFrame(frameState); - if (frameState) { - if (frameState.animate) { - this.render(); - } - Array.prototype.push.apply(this.postRenderFunctions_, frameState.postRenderFunctions); - if (previousFrameState) { - var moveStart = !this.previousExtent_ || - (!isEmpty$1(this.previousExtent_) && - !equals$1(frameState.extent, this.previousExtent_)); - if (moveStart) { - this.dispatchEvent(new MapEvent(MapEventType.MOVESTART, this, previousFrameState)); - this.previousExtent_ = createOrUpdateEmpty(this.previousExtent_); - } - } - var idle = this.previousExtent_ && - !frameState.viewHints[ViewHint.ANIMATING] && - !frameState.viewHints[ViewHint.INTERACTING] && - !equals$1(frameState.extent, this.previousExtent_); - if (idle) { - this.dispatchEvent(new MapEvent(MapEventType.MOVEEND, this, frameState)); - clone(frameState.extent, this.previousExtent_); - } - } - this.dispatchEvent(new MapEvent(MapEventType.POSTRENDER, this, frameState)); - if (!this.postRenderTimeoutHandle_) { - this.postRenderTimeoutHandle_ = setTimeout(function () { - _this.postRenderTimeoutHandle_ = undefined; - _this.handlePostRender(); - }, 0); - } - }; - /** - * Sets the layergroup of this map. - * @param {LayerGroup} layerGroup A layer group containing the layers in this map. - * @observable - * @api - */ - PluggableMap.prototype.setLayerGroup = function (layerGroup) { - this.set(MapProperty.LAYERGROUP, layerGroup); - }; - /** - * Set the size of this map. - * @param {import("./size.js").Size|undefined} size The size in pixels of the map in the DOM. - * @observable - * @api - */ - PluggableMap.prototype.setSize = function (size) { - this.set(MapProperty.SIZE, size); - }; - /** - * Set the target element to render this map into. - * @param {HTMLElement|string|undefined} target The Element or id of the Element - * that the map is rendered in. - * @observable - * @api - */ - PluggableMap.prototype.setTarget = function (target) { - this.set(MapProperty.TARGET, target); - }; - /** - * Set the view for this map. - * @param {View} view The view that controls this map. - * @observable - * @api - */ - PluggableMap.prototype.setView = function (view) { - this.set(MapProperty.VIEW, view); - }; - /** - * Force a recalculation of the map viewport size. This should be called when - * third-party code changes the size of the map viewport. - * @api - */ - PluggableMap.prototype.updateSize = function () { - var targetElement = this.getTargetElement(); - if (!targetElement) { - this.setSize(undefined); - } - else { - var computedStyle = getComputedStyle(targetElement); - this.setSize([ - targetElement.offsetWidth - - parseFloat(computedStyle['borderLeftWidth']) - - parseFloat(computedStyle['paddingLeft']) - - parseFloat(computedStyle['paddingRight']) - - parseFloat(computedStyle['borderRightWidth']), - targetElement.offsetHeight - - parseFloat(computedStyle['borderTopWidth']) - - parseFloat(computedStyle['paddingTop']) - - parseFloat(computedStyle['paddingBottom']) - - parseFloat(computedStyle['borderBottomWidth']), - ]); - } - this.updateViewportSize_(); - }; - /** - * Recomputes the viewport size and save it on the view object (if any) - * @private - */ - PluggableMap.prototype.updateViewportSize_ = function () { - var view = this.getView(); - if (view) { - var size = undefined; - var computedStyle = getComputedStyle(this.viewport_); - if (computedStyle.width && computedStyle.height) { - size = [ - parseInt(computedStyle.width, 10), - parseInt(computedStyle.height, 10), - ]; - } - view.setViewportSize(size); - } - }; - return PluggableMap; -}(BaseObject)); -/** - * @param {MapOptions} options Map options. - * @return {MapOptionsInternal} Internal map options. - */ -function createOptionsInternal(options) { - /** - * @type {HTMLElement|Document} - */ - var keyboardEventTarget = null; - if (options.keyboardEventTarget !== undefined) { - keyboardEventTarget = - typeof options.keyboardEventTarget === 'string' - ? document.getElementById(options.keyboardEventTarget) - : options.keyboardEventTarget; - } - /** - * @type {Object} - */ - var values = {}; - var layerGroup = options.layers && - typeof ( /** @type {?} */(options.layers).getLayers) === 'function' - ? /** @type {LayerGroup} */ (options.layers) - : new LayerGroup({ layers: /** @type {Collection} */ (options.layers) }); - values[MapProperty.LAYERGROUP] = layerGroup; - values[MapProperty.TARGET] = options.target; - values[MapProperty.VIEW] = - options.view !== undefined ? options.view : new View(); - var controls; - if (options.controls !== undefined) { - if (Array.isArray(options.controls)) { - controls = new Collection(options.controls.slice()); - } - else { - assert(typeof ( /** @type {?} */(options.controls).getArray) === 'function', 47); // Expected `controls` to be an array or an `import("./Collection.js").Collection` - controls = /** @type {Collection} */ (options.controls); - } - } - var interactions; - if (options.interactions !== undefined) { - if (Array.isArray(options.interactions)) { - interactions = new Collection(options.interactions.slice()); - } - else { - assert(typeof ( /** @type {?} */(options.interactions).getArray) === - 'function', 48); // Expected `interactions` to be an array or an `import("./Collection.js").Collection` - interactions = /** @type {Collection} */ (options.interactions); - } - } - var overlays; - if (options.overlays !== undefined) { - if (Array.isArray(options.overlays)) { - overlays = new Collection(options.overlays.slice()); - } - else { - assert(typeof ( /** @type {?} */(options.overlays).getArray) === 'function', 49); // Expected `overlays` to be an array or an `import("./Collection.js").Collection` - overlays = options.overlays; - } - } - else { - overlays = new Collection(); - } - return { - controls: controls, - interactions: interactions, - keyboardEventTarget: keyboardEventTarget, - overlays: overlays, - values: values, - }; -} - -var __extends$o = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {Object} Options - * @property {HTMLElement} [element] The element is the control's - * container element. This only needs to be specified if you're developing - * a custom control. - * @property {function(import("../MapEvent.js").default):void} [render] Function called when - * the control should be re-rendered. This is called in a `requestAnimationFrame` - * callback. - * @property {HTMLElement|string} [target] Specify a target if you want - * the control to be rendered outside of the map's viewport. - */ -/** - * @classdesc - * A control is a visible widget with a DOM element in a fixed position on the - * screen. They can involve user input (buttons), or be informational only; - * the position is determined using CSS. By default these are placed in the - * container with CSS class name `ol-overlaycontainer-stopevent`, but can use - * any outside DOM element. - * - * This is the base class for controls. You can use it for simple custom - * controls by creating the element with listeners, creating an instance: - * ```js - * var myControl = new Control({element: myElement}); - * ``` - * and then adding this to the map. - * - * The main advantage of having this as a control rather than a simple separate - * DOM element is that preventing propagation is handled for you. Controls - * will also be objects in a {@link module:ol/Collection~Collection}, so you can use their methods. - * - * You can also extend this base for your own control class. See - * examples/custom-controls for an example of how to do this. - * - * @api - */ -var Control = /** @class */ (function (_super) { - __extends$o(Control, _super); - /** - * @param {Options} options Control options. - */ - function Control(options) { - var _this = _super.call(this) || this; - var element = options.element; - if (element && !options.target && !element.style.pointerEvents) { - element.style.pointerEvents = 'auto'; - } - /** - * @protected - * @type {HTMLElement} - */ - _this.element = element ? element : null; - /** - * @private - * @type {HTMLElement} - */ - _this.target_ = null; - /** - * @private - * @type {import("../PluggableMap.js").default} - */ - _this.map_ = null; - /** - * @protected - * @type {!Array} - */ - _this.listenerKeys = []; - if (options.render) { - _this.render = options.render; - } - if (options.target) { - _this.setTarget(options.target); - } - return _this; - } - /** - * Clean up. - */ - Control.prototype.disposeInternal = function () { - removeNode(this.element); - _super.prototype.disposeInternal.call(this); - }; - /** - * Get the map associated with this control. - * @return {import("../PluggableMap.js").default} Map. - * @api - */ - Control.prototype.getMap = function () { - return this.map_; - }; - /** - * Remove the control from its current map and attach it to the new map. - * Subclasses may set up event handlers to get notified about changes to - * the map here. - * @param {import("../PluggableMap.js").default} map Map. - * @api - */ - Control.prototype.setMap = function (map) { - if (this.map_) { - removeNode(this.element); - } - for (var i = 0, ii = this.listenerKeys.length; i < ii; ++i) { - unlistenByKey(this.listenerKeys[i]); - } - this.listenerKeys.length = 0; - this.map_ = map; - if (this.map_) { - var target = this.target_ - ? this.target_ - : map.getOverlayContainerStopEvent(); - target.appendChild(this.element); - if (this.render !== VOID) { - this.listenerKeys.push(listen(map, MapEventType.POSTRENDER, this.render, this)); - } - map.render(); - } - }; - /** - * Renders the control. - * @param {import("../MapEvent.js").default} mapEvent Map event. - * @api - */ - Control.prototype.render = function (mapEvent) { }; - /** - * This function is used to set a target element for the control. It has no - * effect if it is called after the control has been added to the map (i.e. - * after `setMap` is called on the control). If no `target` is set in the - * options passed to the control constructor and if `setTarget` is not called - * then the control is added to the map's overlay container. - * @param {HTMLElement|string} target Target. - * @api - */ - Control.prototype.setTarget = function (target) { - this.target_ = - typeof target === 'string' ? document.getElementById(target) : target; - }; - return Control; -}(BaseObject)); - -var __extends$p = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {Object} Options - * @property {string} [className='ol-attribution'] CSS class name. - * @property {HTMLElement|string} [target] Specify a target if you - * want the control to be rendered outside of the map's - * viewport. - * @property {boolean} [collapsible] Specify if attributions can - * be collapsed. If not specified, sources control this behavior with their - * `attributionsCollapsible` setting. - * @property {boolean} [collapsed=true] Specify if attributions should - * be collapsed at startup. - * @property {string} [tipLabel='Attributions'] Text label to use for the button tip. - * @property {string} [label='i'] Text label to use for the - * collapsed attributions button. - * Instead of text, also an element (e.g. a `span` element) can be used. - * @property {string} [expandClassName=className + '-expand'] CSS class name for the - * collapsed attributions button. - * @property {string|HTMLElement} [collapseLabel='»'] Text label to use - * for the expanded attributions button. - * Instead of text, also an element (e.g. a `span` element) can be used. - * @property {string} [collapseClassName=className + '-collapse'] CSS class name for the - * expanded attributions button. - * @property {function(import("../MapEvent.js").default):void} [render] Function called when - * the control should be re-rendered. This is called in a `requestAnimationFrame` - * callback. - */ -/** - * @classdesc - * Control to show all the attributions associated with the layer sources - * in the map. This control is one of the default controls included in maps. - * By default it will show in the bottom right portion of the map, but this can - * be changed by using a css selector for `.ol-attribution`. - * - * @api - */ -var Attribution = /** @class */ (function (_super) { - __extends$p(Attribution, _super); - /** - * @param {Options=} opt_options Attribution options. - */ - function Attribution(opt_options) { - var _this = this; - var options = opt_options ? opt_options : {}; - _this = _super.call(this, { - element: document.createElement('div'), - render: options.render, - target: options.target, - }) || this; - /** - * @private - * @type {HTMLElement} - */ - _this.ulElement_ = document.createElement('ul'); - /** - * @private - * @type {boolean} - */ - _this.collapsed_ = - options.collapsed !== undefined ? options.collapsed : true; - /** - * @private - * @type {boolean} - */ - _this.userCollapsed_ = _this.collapsed_; - /** - * @private - * @type {boolean} - */ - _this.overrideCollapsible_ = options.collapsible !== undefined; - /** - * @private - * @type {boolean} - */ - _this.collapsible_ = - options.collapsible !== undefined ? options.collapsible : true; - if (!_this.collapsible_) { - _this.collapsed_ = false; - } - var className = options.className !== undefined ? options.className : 'ol-attribution'; - var tipLabel = options.tipLabel !== undefined ? options.tipLabel : 'Attributions'; - var expandClassName = options.expandClassName !== undefined - ? options.expandClassName - : className + '-expand'; - var collapseLabel = options.collapseLabel !== undefined ? options.collapseLabel : '\u00BB'; - var collapseClassName = options.collapseClassName !== undefined - ? options.collapseClassName - : className + '-collpase'; - if (typeof collapseLabel === 'string') { - /** - * @private - * @type {HTMLElement} - */ - _this.collapseLabel_ = document.createElement('span'); - _this.collapseLabel_.textContent = collapseLabel; - _this.collapseLabel_.className = collapseClassName; - } - else { - _this.collapseLabel_ = collapseLabel; - } - var label = options.label !== undefined ? options.label : 'i'; - if (typeof label === 'string') { - /** - * @private - * @type {HTMLElement} - */ - _this.label_ = document.createElement('span'); - _this.label_.textContent = label; - _this.label_.className = expandClassName; - } - else { - _this.label_ = label; - } - var activeLabel = _this.collapsible_ && !_this.collapsed_ ? _this.collapseLabel_ : _this.label_; - var button = document.createElement('button'); - button.setAttribute('type', 'button'); - button.title = tipLabel; - button.appendChild(activeLabel); - button.addEventListener(EventType.CLICK, _this.handleClick_.bind(_this), false); - var cssClasses = className + - ' ' + - CLASS_UNSELECTABLE + - ' ' + - CLASS_CONTROL + - (_this.collapsed_ && _this.collapsible_ ? ' ' + CLASS_COLLAPSED : '') + - (_this.collapsible_ ? '' : ' ol-uncollapsible'); - var element = _this.element; - element.className = cssClasses; - element.appendChild(_this.ulElement_); - element.appendChild(button); - /** - * A list of currently rendered resolutions. - * @type {Array} - * @private - */ - _this.renderedAttributions_ = []; - /** - * @private - * @type {boolean} - */ - _this.renderedVisible_ = true; - return _this; - } - /** - * Collect a list of visible attributions and set the collapsible state. - * @param {import("../PluggableMap.js").FrameState} frameState Frame state. - * @return {Array} Attributions. - * @private - */ - Attribution.prototype.collectSourceAttributions_ = function (frameState) { - /** - * Used to determine if an attribution already exists. - * @type {!Object} - */ - var lookup = {}; - /** - * A list of visible attributions. - * @type {Array} - */ - var visibleAttributions = []; - var collapsible = true; - var layerStatesArray = frameState.layerStatesArray; - for (var i = 0, ii = layerStatesArray.length; i < ii; ++i) { - var layerState = layerStatesArray[i]; - if (!inView(layerState, frameState.viewState)) { - continue; - } - var source = /** @type {import("../layer/Layer.js").default} */ (layerState.layer).getSource(); - if (!source) { - continue; - } - var attributionGetter = source.getAttributions(); - if (!attributionGetter) { - continue; - } - var attributions = attributionGetter(frameState); - if (!attributions) { - continue; - } - collapsible = - collapsible && source.getAttributionsCollapsible() !== false; - if (Array.isArray(attributions)) { - for (var j = 0, jj = attributions.length; j < jj; ++j) { - if (!(attributions[j] in lookup)) { - visibleAttributions.push(attributions[j]); - lookup[attributions[j]] = true; - } - } - } - else { - if (!(attributions in lookup)) { - visibleAttributions.push(attributions); - lookup[attributions] = true; - } - } - } - if (!this.overrideCollapsible_) { - this.setCollapsible(collapsible); - } - return visibleAttributions; - }; - /** - * @private - * @param {?import("../PluggableMap.js").FrameState} frameState Frame state. - */ - Attribution.prototype.updateElement_ = function (frameState) { - if (!frameState) { - if (this.renderedVisible_) { - this.element.style.display = 'none'; - this.renderedVisible_ = false; - } - return; - } - var attributions = this.collectSourceAttributions_(frameState); - var visible = attributions.length > 0; - if (this.renderedVisible_ != visible) { - this.element.style.display = visible ? '' : 'none'; - this.renderedVisible_ = visible; - } - if (equals(attributions, this.renderedAttributions_)) { - return; - } - removeChildren(this.ulElement_); - // append the attributions - for (var i = 0, ii = attributions.length; i < ii; ++i) { - var element = document.createElement('li'); - element.innerHTML = attributions[i]; - this.ulElement_.appendChild(element); - } - this.renderedAttributions_ = attributions; - }; - /** - * @param {MouseEvent} event The event to handle - * @private - */ - Attribution.prototype.handleClick_ = function (event) { - event.preventDefault(); - this.handleToggle_(); - this.userCollapsed_ = this.collapsed_; - }; - /** - * @private - */ - Attribution.prototype.handleToggle_ = function () { - this.element.classList.toggle(CLASS_COLLAPSED); - if (this.collapsed_) { - replaceNode(this.collapseLabel_, this.label_); - } - else { - replaceNode(this.label_, this.collapseLabel_); - } - this.collapsed_ = !this.collapsed_; - }; - /** - * Return `true` if the attribution is collapsible, `false` otherwise. - * @return {boolean} True if the widget is collapsible. - * @api - */ - Attribution.prototype.getCollapsible = function () { - return this.collapsible_; - }; - /** - * Set whether the attribution should be collapsible. - * @param {boolean} collapsible True if the widget is collapsible. - * @api - */ - Attribution.prototype.setCollapsible = function (collapsible) { - if (this.collapsible_ === collapsible) { - return; - } - this.collapsible_ = collapsible; - this.element.classList.toggle('ol-uncollapsible'); - if (this.userCollapsed_) { - this.handleToggle_(); - } - }; - /** - * Collapse or expand the attribution according to the passed parameter. Will - * not do anything if the attribution isn't collapsible or if the current - * collapsed state is already the one requested. - * @param {boolean} collapsed True if the widget is collapsed. - * @api - */ - Attribution.prototype.setCollapsed = function (collapsed) { - this.userCollapsed_ = collapsed; - if (!this.collapsible_ || this.collapsed_ === collapsed) { - return; - } - this.handleToggle_(); - }; - /** - * Return `true` when the attribution is currently collapsed or `false` - * otherwise. - * @return {boolean} True if the widget is collapsed. - * @api - */ - Attribution.prototype.getCollapsed = function () { - return this.collapsed_; - }; - /** - * Update the attribution element. - * @param {import("../MapEvent.js").default} mapEvent Map event. - * @override - */ - Attribution.prototype.render = function (mapEvent) { - this.updateElement_(mapEvent.frameState); - }; - return Attribution; -}(Control)); - -var __extends$q = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {Object} Options - * @property {string} [className='ol-rotate'] CSS class name. - * @property {string|HTMLElement} [label='⇧'] Text label to use for the rotate button. - * Instead of text, also an element (e.g. a `span` element) can be used. - * @property {string} [tipLabel='Reset rotation'] Text label to use for the rotate tip. - * @property {string} [compassClassName='ol-compass'] CSS class name for the compass. - * @property {number} [duration=250] Animation duration in milliseconds. - * @property {boolean} [autoHide=true] Hide the control when rotation is 0. - * @property {function(import("../MapEvent.js").default):void} [render] Function called when the control should - * be re-rendered. This is called in a `requestAnimationFrame` callback. - * @property {function():void} [resetNorth] Function called when the control is clicked. - * This will override the default `resetNorth`. - * @property {HTMLElement|string} [target] Specify a target if you want the control to be - * rendered outside of the map's viewport. - */ -/** - * @classdesc - * A button control to reset rotation to 0. - * To style this control use css selector `.ol-rotate`. A `.ol-hidden` css - * selector is added to the button when the rotation is 0. - * - * @api - */ -var Rotate = /** @class */ (function (_super) { - __extends$q(Rotate, _super); - /** - * @param {Options=} opt_options Rotate options. - */ - function Rotate(opt_options) { - var _this = this; - var options = opt_options ? opt_options : {}; - _this = _super.call(this, { - element: document.createElement('div'), - render: options.render, - target: options.target, - }) || this; - var className = options.className !== undefined ? options.className : 'ol-rotate'; - var label = options.label !== undefined ? options.label : '\u21E7'; - var compassClassName = options.compassClassName !== undefined - ? options.compassClassName - : 'ol-compass'; - /** - * @type {HTMLElement} - * @private - */ - _this.label_ = null; - if (typeof label === 'string') { - _this.label_ = document.createElement('span'); - _this.label_.className = compassClassName; - _this.label_.textContent = label; - } - else { - _this.label_ = label; - _this.label_.classList.add(compassClassName); - } - var tipLabel = options.tipLabel ? options.tipLabel : 'Reset rotation'; - var button = document.createElement('button'); - button.className = className + '-reset'; - button.setAttribute('type', 'button'); - button.title = tipLabel; - button.appendChild(_this.label_); - button.addEventListener(EventType.CLICK, _this.handleClick_.bind(_this), false); - var cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL; - var element = _this.element; - element.className = cssClasses; - element.appendChild(button); - _this.callResetNorth_ = options.resetNorth ? options.resetNorth : undefined; - /** - * @type {number} - * @private - */ - _this.duration_ = options.duration !== undefined ? options.duration : 250; - /** - * @type {boolean} - * @private - */ - _this.autoHide_ = options.autoHide !== undefined ? options.autoHide : true; - /** - * @private - * @type {number|undefined} - */ - _this.rotation_ = undefined; - if (_this.autoHide_) { - _this.element.classList.add(CLASS_HIDDEN); - } - return _this; - } - /** - * @param {MouseEvent} event The event to handle - * @private - */ - Rotate.prototype.handleClick_ = function (event) { - event.preventDefault(); - if (this.callResetNorth_ !== undefined) { - this.callResetNorth_(); - } - else { - this.resetNorth_(); - } - }; - /** - * @private - */ - Rotate.prototype.resetNorth_ = function () { - var map = this.getMap(); - var view = map.getView(); - if (!view) { - // the map does not have a view, so we can't act - // upon it - return; - } - var rotation = view.getRotation(); - if (rotation !== undefined) { - if (this.duration_ > 0 && rotation % (2 * Math.PI) !== 0) { - view.animate({ - rotation: 0, - duration: this.duration_, - easing: easeOut, - }); - } - else { - view.setRotation(0); - } - } - }; - /** - * Update the rotate control element. - * @param {import("../MapEvent.js").default} mapEvent Map event. - * @override - */ - Rotate.prototype.render = function (mapEvent) { - var frameState = mapEvent.frameState; - if (!frameState) { - return; - } - var rotation = frameState.viewState.rotation; - if (rotation != this.rotation_) { - var transform = 'rotate(' + rotation + 'rad)'; - if (this.autoHide_) { - var contains = this.element.classList.contains(CLASS_HIDDEN); - if (!contains && rotation === 0) { - this.element.classList.add(CLASS_HIDDEN); - } - else if (contains && rotation !== 0) { - this.element.classList.remove(CLASS_HIDDEN); - } - } - this.label_.style.transform = transform; - } - this.rotation_ = rotation; - }; - return Rotate; -}(Control)); - -var __extends$r = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {Object} Options - * @property {number} [duration=250] Animation duration in milliseconds. - * @property {string} [className='ol-zoom'] CSS class name. - * @property {string} [zoomInClassName=className + '-in'] CSS class name for the zoom-in button. - * @property {string} [zoomOutClassName=className + '-out'] CSS class name for the zoom-out button. - * @property {string|HTMLElement} [zoomInLabel='+'] Text label to use for the zoom-in - * button. Instead of text, also an element (e.g. a `span` element) can be used. - * @property {string|HTMLElement} [zoomOutLabel='-'] Text label to use for the zoom-out button. - * Instead of text, also an element (e.g. a `span` element) can be used. - * @property {string} [zoomInTipLabel='Zoom in'] Text label to use for the button tip. - * @property {string} [zoomOutTipLabel='Zoom out'] Text label to use for the button tip. - * @property {number} [delta=1] The zoom delta applied on each click. - * @property {HTMLElement|string} [target] Specify a target if you want the control to be - * rendered outside of the map's viewport. - */ -/** - * @classdesc - * A control with 2 buttons, one for zoom in and one for zoom out. - * This control is one of the default controls of a map. To style this control - * use css selectors `.ol-zoom-in` and `.ol-zoom-out`. - * - * @api - */ -var Zoom = /** @class */ (function (_super) { - __extends$r(Zoom, _super); - /** - * @param {Options=} opt_options Zoom options. - */ - function Zoom(opt_options) { - var _this = this; - var options = opt_options ? opt_options : {}; - _this = _super.call(this, { - element: document.createElement('div'), - target: options.target, - }) || this; - var className = options.className !== undefined ? options.className : 'ol-zoom'; - var delta = options.delta !== undefined ? options.delta : 1; - var zoomInClassName = options.zoomInClassName !== undefined - ? options.zoomInClassName - : className + '-in'; - var zoomOutClassName = options.zoomOutClassName !== undefined - ? options.zoomOutClassName - : className + '-out'; - var zoomInLabel = options.zoomInLabel !== undefined ? options.zoomInLabel : '+'; - var zoomOutLabel = options.zoomOutLabel !== undefined ? options.zoomOutLabel : '\u2212'; - var zoomInTipLabel = options.zoomInTipLabel !== undefined ? options.zoomInTipLabel : 'Zoom in'; - var zoomOutTipLabel = options.zoomOutTipLabel !== undefined - ? options.zoomOutTipLabel - : 'Zoom out'; - var inElement = document.createElement('button'); - inElement.className = zoomInClassName; - inElement.setAttribute('type', 'button'); - inElement.title = zoomInTipLabel; - inElement.appendChild(typeof zoomInLabel === 'string' - ? document.createTextNode(zoomInLabel) - : zoomInLabel); - inElement.addEventListener(EventType.CLICK, _this.handleClick_.bind(_this, delta), false); - var outElement = document.createElement('button'); - outElement.className = zoomOutClassName; - outElement.setAttribute('type', 'button'); - outElement.title = zoomOutTipLabel; - outElement.appendChild(typeof zoomOutLabel === 'string' - ? document.createTextNode(zoomOutLabel) - : zoomOutLabel); - outElement.addEventListener(EventType.CLICK, _this.handleClick_.bind(_this, -delta), false); - var cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL; - var element = _this.element; - element.className = cssClasses; - element.appendChild(inElement); - element.appendChild(outElement); - /** - * @type {number} - * @private - */ - _this.duration_ = options.duration !== undefined ? options.duration : 250; - return _this; - } - /** - * @param {number} delta Zoom delta. - * @param {MouseEvent} event The event to handle - * @private - */ - Zoom.prototype.handleClick_ = function (delta, event) { - event.preventDefault(); - this.zoomByDelta_(delta); - }; - /** - * @param {number} delta Zoom delta. - * @private - */ - Zoom.prototype.zoomByDelta_ = function (delta) { - var map = this.getMap(); - var view = map.getView(); - if (!view) { - // the map does not have a view, so we can't act - // upon it - return; - } - var currentZoom = view.getZoom(); - if (currentZoom !== undefined) { - var newZoom = view.getConstrainedZoom(currentZoom + delta); - if (this.duration_ > 0) { - if (view.getAnimating()) { - view.cancelAnimations(); - } - view.animate({ - zoom: newZoom, - duration: this.duration_, - easing: easeOut, - }); - } - else { - view.setZoom(newZoom); - } - } - }; - return Zoom; -}(Control)); - -var __extends$s = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -var events = [ - 'fullscreenchange', - 'webkitfullscreenchange', - 'MSFullscreenChange', -]; -/** - * @enum {string} - */ -var FullScreenEventType = { - /** - * Triggered after the map entered fullscreen. - * @event FullScreenEventType#enterfullscreen - * @api - */ - ENTERFULLSCREEN: 'enterfullscreen', - /** - * Triggered after the map leave fullscreen. - * @event FullScreenEventType#leavefullscreen - * @api - */ - LEAVEFULLSCREEN: 'leavefullscreen', -}; -/** - * @typedef {Object} Options - * @property {string} [className='ol-full-screen'] CSS class name. - * @property {string|Text} [label='\u2922'] Text label to use for the button. - * Instead of text, also an element (e.g. a `span` element) can be used. - * @property {string|Text} [labelActive='\u00d7'] Text label to use for the - * button when full-screen is active. - * @property {string} [activeClassName=className + '-true'] CSS class name for the button - * when full-screen is active. - * @property {string} [inactiveClassName=className + '-false'] CSS class name for the button - * when full-screen is inactive. - * Instead of text, also an element (e.g. a `span` element) can be used. - * @property {string} [tipLabel='Toggle full-screen'] Text label to use for the button tip. - * @property {boolean} [keys=false] Full keyboard access. - * @property {HTMLElement|string} [target] Specify a target if you want the - * control to be rendered outside of the map's viewport. - * @property {HTMLElement|string} [source] The element to be displayed - * fullscreen. When not provided, the element containing the map viewport will - * be displayed fullscreen. - */ -/** - * @classdesc - * Provides a button that when clicked fills up the full screen with the map. - * The full screen source element is by default the element containing the map viewport unless - * overridden by providing the `source` option. In which case, the dom - * element introduced using this parameter will be displayed in full screen. - * - * When in full screen mode, a close button is shown to exit full screen mode. - * The [Fullscreen API](http://www.w3.org/TR/fullscreen/) is used to - * toggle the map in full screen mode. - * - * @fires FullScreenEventType#enterfullscreen - * @fires FullScreenEventType#leavefullscreen - * @api - */ -var FullScreen = /** @class */ (function (_super) { - __extends$s(FullScreen, _super); - /** - * @param {Options=} opt_options Options. - */ - function FullScreen(opt_options) { - var _this = this; - var options = opt_options ? opt_options : {}; - _this = _super.call(this, { - element: document.createElement('div'), - target: options.target, - }) || this; - /** - * @private - * @type {string} - */ - _this.cssClassName_ = - options.className !== undefined ? options.className : 'ol-full-screen'; - /** - * @private - * @type {Array} - */ - _this.activeClassName_ = - options.activeClassName !== undefined - ? options.activeClassName.split(' ') - : [_this.cssClassName_ + '-true']; - /** - * @private - * @type {Array} - */ - _this.inactiveClassName_ = - options.inactiveClassName !== undefined - ? options.inactiveClassName.split(' ') - : [_this.cssClassName_ + '-false']; - var label = options.label !== undefined ? options.label : '\u2922'; - /** - * @private - * @type {Text} - */ - _this.labelNode_ = - typeof label === 'string' ? document.createTextNode(label) : label; - var labelActive = options.labelActive !== undefined ? options.labelActive : '\u00d7'; - /** - * @private - * @type {Text} - */ - _this.labelActiveNode_ = - typeof labelActive === 'string' - ? document.createTextNode(labelActive) - : labelActive; - /** - * @private - * @type {HTMLElement} - */ - _this.button_ = document.createElement('button'); - var tipLabel = options.tipLabel ? options.tipLabel : 'Toggle full-screen'; - _this.setClassName_(_this.button_, isFullScreen()); - _this.button_.setAttribute('type', 'button'); - _this.button_.title = tipLabel; - _this.button_.appendChild(_this.labelNode_); - _this.button_.addEventListener(EventType.CLICK, _this.handleClick_.bind(_this), false); - var cssClasses = _this.cssClassName_ + - ' ' + - CLASS_UNSELECTABLE + - ' ' + - CLASS_CONTROL + - ' ' + - (!isFullScreenSupported() ? CLASS_UNSUPPORTED : ''); - var element = _this.element; - element.className = cssClasses; - element.appendChild(_this.button_); - /** - * @private - * @type {boolean} - */ - _this.keys_ = options.keys !== undefined ? options.keys : false; - /** - * @private - * @type {HTMLElement|string|undefined} - */ - _this.source_ = options.source; - return _this; - } - /** - * @param {MouseEvent} event The event to handle - * @private - */ - FullScreen.prototype.handleClick_ = function (event) { - event.preventDefault(); - this.handleFullScreen_(); - }; - /** - * @private - */ - FullScreen.prototype.handleFullScreen_ = function () { - if (!isFullScreenSupported()) { - return; - } - var map = this.getMap(); - if (!map) { - return; - } - if (isFullScreen()) { - exitFullScreen(); - } - else { - var element = void 0; - if (this.source_) { - element = - typeof this.source_ === 'string' - ? document.getElementById(this.source_) - : this.source_; - } - else { - element = map.getTargetElement(); - } - if (this.keys_) { - requestFullScreenWithKeys(element); - } - else { - requestFullScreen(element); - } - } - }; - /** - * @private - */ - FullScreen.prototype.handleFullScreenChange_ = function () { - var map = this.getMap(); - if (isFullScreen()) { - this.setClassName_(this.button_, true); - replaceNode(this.labelActiveNode_, this.labelNode_); - this.dispatchEvent(FullScreenEventType.ENTERFULLSCREEN); - } - else { - this.setClassName_(this.button_, false); - replaceNode(this.labelNode_, this.labelActiveNode_); - this.dispatchEvent(FullScreenEventType.LEAVEFULLSCREEN); - } - if (map) { - map.updateSize(); - } - }; - /** - * @param {HTMLElement} element Target element - * @param {boolean} fullscreen True if fullscreen class name should be active - * @private - */ - FullScreen.prototype.setClassName_ = function (element, fullscreen) { - var _a, _b, _c; - var activeClassName = this.activeClassName_; - var inactiveClassName = this.inactiveClassName_; - var nextClassName = fullscreen ? activeClassName : inactiveClassName; - (_a = element.classList).remove.apply(_a, activeClassName); - (_b = element.classList).remove.apply(_b, inactiveClassName); - (_c = element.classList).add.apply(_c, nextClassName); - }; - /** - * Remove the control from its current map and attach it to the new map. - * Subclasses may set up event handlers to get notified about changes to - * the map here. - * @param {import("../PluggableMap.js").default} map Map. - * @api - */ - FullScreen.prototype.setMap = function (map) { - _super.prototype.setMap.call(this, map); - if (map) { - for (var i = 0, ii = events.length; i < ii; ++i) { - this.listenerKeys.push(listen(document, events[i], this.handleFullScreenChange_, this)); - } - } - }; - return FullScreen; -}(Control)); -/** - * @return {boolean} Fullscreen is supported by the current platform. - */ -function isFullScreenSupported() { - var body = document.body; - return !!(body['webkitRequestFullscreen'] || - (body['msRequestFullscreen'] && document['msFullscreenEnabled']) || - (body.requestFullscreen && document.fullscreenEnabled)); -} -/** - * @return {boolean} Element is currently in fullscreen. - */ -function isFullScreen() { - return !!(document['webkitIsFullScreen'] || - document['msFullscreenElement'] || - document.fullscreenElement); -} -/** - * Request to fullscreen an element. - * @param {HTMLElement} element Element to request fullscreen - */ -function requestFullScreen(element) { - if (element.requestFullscreen) { - element.requestFullscreen(); - } - else if (element['msRequestFullscreen']) { - element['msRequestFullscreen'](); - } - else if (element['webkitRequestFullscreen']) { - element['webkitRequestFullscreen'](); - } -} -/** - * Request to fullscreen an element with keyboard input. - * @param {HTMLElement} element Element to request fullscreen - */ -function requestFullScreenWithKeys(element) { - if (element['webkitRequestFullscreen']) { - element['webkitRequestFullscreen'](); - } - else { - requestFullScreen(element); - } -} -/** - * Exit fullscreen. - */ -function exitFullScreen() { - if (document.exitFullscreen) { - document.exitFullscreen(); - } - else if (document['msExitFullscreen']) { - document['msExitFullscreen'](); - } - else if (document['webkitExitFullscreen']) { - document['webkitExitFullscreen'](); - } -} - -/** - * @module ol/OverlayPositioning - */ -/** - * Overlay position: `'bottom-left'`, `'bottom-center'`, `'bottom-right'`, - * `'center-left'`, `'center-center'`, `'center-right'`, `'top-left'`, - * `'top-center'`, `'top-right'` - * @enum {string} - */ -var OverlayPositioning = { - BOTTOM_LEFT: 'bottom-left', - BOTTOM_CENTER: 'bottom-center', - BOTTOM_RIGHT: 'bottom-right', - CENTER_LEFT: 'center-left', - CENTER_CENTER: 'center-center', - CENTER_RIGHT: 'center-right', - TOP_LEFT: 'top-left', - TOP_CENTER: 'top-center', - TOP_RIGHT: 'top-right', -}; - -var __extends$t = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {Object} Options - * @property {number|string} [id] Set the overlay id. The overlay id can be used - * with the {@link module:ol/Map~Map#getOverlayById} method. - * @property {HTMLElement} [element] The overlay element. - * @property {Array} [offset=[0, 0]] Offsets in pixels used when positioning - * the overlay. The first element in the - * array is the horizontal offset. A positive value shifts the overlay right. - * The second element in the array is the vertical offset. A positive value - * shifts the overlay down. - * @property {import("./coordinate.js").Coordinate} [position] The overlay position - * in map projection. - * @property {import("./OverlayPositioning.js").default} [positioning='top-left'] Defines how - * the overlay is actually positioned with respect to its `position` property. - * Possible values are `'bottom-left'`, `'bottom-center'`, `'bottom-right'`, - * `'center-left'`, `'center-center'`, `'center-right'`, `'top-left'`, - * `'top-center'`, and `'top-right'`. - * @property {boolean} [stopEvent=true] Whether event propagation to the map - * viewport should be stopped. If `true` the overlay is placed in the same - * container as that of the controls (CSS class name - * `ol-overlaycontainer-stopevent`); if `false` it is placed in the container - * with CSS class name specified by the `className` property. - * @property {boolean} [insertFirst=true] Whether the overlay is inserted first - * in the overlay container, or appended. If the overlay is placed in the same - * container as that of the controls (see the `stopEvent` option) you will - * probably set `insertFirst` to `true` so the overlay is displayed below the - * controls. - * @property {PanIntoViewOptions|boolean} [autoPan=false] Pan the map when calling - * `setPosition`, so that the overlay is entirely visible in the current viewport? - * If `true` (deprecated), then `autoPanAnimation` and `autoPanMargin` will be - * used to determine the panning parameters; if an object is supplied then other - * parameters are ignored. - * @property {PanOptions} [autoPanAnimation] The animation options used to pan - * the overlay into view. This animation is only used when `autoPan` is enabled. - * A `duration` and `easing` may be provided to customize the animation. - * Deprecated and ignored if `autoPan` is supplied as an object. - * @property {number} [autoPanMargin=20] The margin (in pixels) between the - * overlay and the borders of the map when autopanning. Deprecated and ignored - * if `autoPan` is supplied as an object. - * @property {PanIntoViewOptions} [autoPanOptions] The options to use for the - * autoPan. This is only used when `autoPan` is enabled and has preference over - * the individual `autoPanMargin` and `autoPanOptions`. - * @property {string} [className='ol-overlay-container ol-selectable'] CSS class - * name. - */ -/** - * @typedef {Object} PanOptions - * @property {number} [duration=1000] The duration of the animation in - * milliseconds. - * @property {function(number):number} [easing] The easing function to use. Can - * be one from {@link module:ol/easing} or a custom function. - * Default is {@link module:ol/easing~inAndOut}. - */ -/** - * @typedef {Object} PanIntoViewOptions - * @property {PanOptions} [animation={}] The animation parameters for the pan - * @property {number} [margin=20] The margin (in pixels) between the - * overlay and the borders of the map when panning into view. - */ -/** - * @enum {string} - * @protected - */ -var Property$2 = { - ELEMENT: 'element', - MAP: 'map', - OFFSET: 'offset', - POSITION: 'position', - POSITIONING: 'positioning', -}; -/** - * @classdesc - * An element to be displayed over the map and attached to a single map - * location. Like {@link module:ol/control/Control~Control}, Overlays are - * visible widgets. Unlike Controls, they are not in a fixed position on the - * screen, but are tied to a geographical coordinate, so panning the map will - * move an Overlay but not a Control. - * - * Example: - * - * import Overlay from 'ol/Overlay'; - * - * var popup = new Overlay({ - * element: document.getElementById('popup') - * }); - * popup.setPosition(coordinate); - * map.addOverlay(popup); - * - * @api - */ -var Overlay = /** @class */ (function (_super) { - __extends$t(Overlay, _super); - /** - * @param {Options} options Overlay options. - */ - function Overlay(options) { - var _this = _super.call(this) || this; - /** - * @protected - * @type {Options} - */ - _this.options = options; - /** - * @protected - * @type {number|string|undefined} - */ - _this.id = options.id; - /** - * @protected - * @type {boolean} - */ - _this.insertFirst = - options.insertFirst !== undefined ? options.insertFirst : true; - /** - * @protected - * @type {boolean} - */ - _this.stopEvent = options.stopEvent !== undefined ? options.stopEvent : true; - /** - * @protected - * @type {HTMLElement} - */ - _this.element = document.createElement('div'); - _this.element.className = - options.className !== undefined - ? options.className - : 'ol-overlay-container ' + CLASS_SELECTABLE; - _this.element.style.position = 'absolute'; - _this.element.style.pointerEvents = 'auto'; - var autoPan = options.autoPan; - if (autoPan && 'object' !== typeof autoPan) { - autoPan = { - animation: options.autoPanAnimation, - margin: options.autoPanMargin, - }; - } - /** - * @protected - * @type {PanIntoViewOptions|false} - */ - _this.autoPan = /** @type {PanIntoViewOptions} */ (autoPan) || false; - /** - * @protected - * @type {{transform_: string, - * visible: boolean}} - */ - _this.rendered = { - transform_: '', - visible: true, - }; - /** - * @protected - * @type {?import("./events.js").EventsKey} - */ - _this.mapPostrenderListenerKey = null; - _this.addEventListener(getChangeEventType(Property$2.ELEMENT), _this.handleElementChanged); - _this.addEventListener(getChangeEventType(Property$2.MAP), _this.handleMapChanged); - _this.addEventListener(getChangeEventType(Property$2.OFFSET), _this.handleOffsetChanged); - _this.addEventListener(getChangeEventType(Property$2.POSITION), _this.handlePositionChanged); - _this.addEventListener(getChangeEventType(Property$2.POSITIONING), _this.handlePositioningChanged); - if (options.element !== undefined) { - _this.setElement(options.element); - } - _this.setOffset(options.offset !== undefined ? options.offset : [0, 0]); - _this.setPositioning(options.positioning !== undefined - ? /** @type {import("./OverlayPositioning.js").default} */ (options.positioning) - : OverlayPositioning.TOP_LEFT); - if (options.position !== undefined) { - _this.setPosition(options.position); - } - return _this; - } - /** - * Get the DOM element of this overlay. - * @return {HTMLElement|undefined} The Element containing the overlay. - * @observable - * @api - */ - Overlay.prototype.getElement = function () { - return /** @type {HTMLElement|undefined} */ (this.get(Property$2.ELEMENT)); - }; - /** - * Get the overlay identifier which is set on constructor. - * @return {number|string|undefined} Id. - * @api - */ - Overlay.prototype.getId = function () { - return this.id; - }; - /** - * Get the map associated with this overlay. - * @return {import("./PluggableMap.js").default|undefined} The map that the - * overlay is part of. - * @observable - * @api - */ - Overlay.prototype.getMap = function () { - return /** @type {import("./PluggableMap.js").default|undefined} */ (this.get(Property$2.MAP)); - }; - /** - * Get the offset of this overlay. - * @return {Array} The offset. - * @observable - * @api - */ - Overlay.prototype.getOffset = function () { - return /** @type {Array} */ (this.get(Property$2.OFFSET)); - }; - /** - * Get the current position of this overlay. - * @return {import("./coordinate.js").Coordinate|undefined} The spatial point that the overlay is - * anchored at. - * @observable - * @api - */ - Overlay.prototype.getPosition = function () { - return /** @type {import("./coordinate.js").Coordinate|undefined} */ (this.get(Property$2.POSITION)); - }; - /** - * Get the current positioning of this overlay. - * @return {import("./OverlayPositioning.js").default} How the overlay is positioned - * relative to its point on the map. - * @observable - * @api - */ - Overlay.prototype.getPositioning = function () { - return /** @type {import("./OverlayPositioning.js").default} */ (this.get(Property$2.POSITIONING)); - }; - /** - * @protected - */ - Overlay.prototype.handleElementChanged = function () { - removeChildren(this.element); - var element = this.getElement(); - if (element) { - this.element.appendChild(element); - } - }; - /** - * @protected - */ - Overlay.prototype.handleMapChanged = function () { - if (this.mapPostrenderListenerKey) { - removeNode(this.element); - unlistenByKey(this.mapPostrenderListenerKey); - this.mapPostrenderListenerKey = null; - } - var map = this.getMap(); - if (map) { - this.mapPostrenderListenerKey = listen(map, MapEventType.POSTRENDER, this.render, this); - this.updatePixelPosition(); - var container = this.stopEvent - ? map.getOverlayContainerStopEvent() - : map.getOverlayContainer(); - if (this.insertFirst) { - container.insertBefore(this.element, container.childNodes[0] || null); - } - else { - container.appendChild(this.element); - } - this.performAutoPan(); - } - }; - /** - * @protected - */ - Overlay.prototype.render = function () { - this.updatePixelPosition(); - }; - /** - * @protected - */ - Overlay.prototype.handleOffsetChanged = function () { - this.updatePixelPosition(); - }; - /** - * @protected - */ - Overlay.prototype.handlePositionChanged = function () { - this.updatePixelPosition(); - this.performAutoPan(); - }; - /** - * @protected - */ - Overlay.prototype.handlePositioningChanged = function () { - this.updatePixelPosition(); - }; - /** - * Set the DOM element to be associated with this overlay. - * @param {HTMLElement|undefined} element The Element containing the overlay. - * @observable - * @api - */ - Overlay.prototype.setElement = function (element) { - this.set(Property$2.ELEMENT, element); - }; - /** - * Set the map to be associated with this overlay. - * @param {import("./PluggableMap.js").default|undefined} map The map that the - * overlay is part of. - * @observable - * @api - */ - Overlay.prototype.setMap = function (map) { - this.set(Property$2.MAP, map); - }; - /** - * Set the offset for this overlay. - * @param {Array} offset Offset. - * @observable - * @api - */ - Overlay.prototype.setOffset = function (offset) { - this.set(Property$2.OFFSET, offset); - }; - /** - * Set the position for this overlay. If the position is `undefined` the - * overlay is hidden. - * @param {import("./coordinate.js").Coordinate|undefined} position The spatial point that the overlay - * is anchored at. - * @observable - * @api - */ - Overlay.prototype.setPosition = function (position) { - this.set(Property$2.POSITION, position); - }; - /** - * Pan the map so that the overlay is entirely visisble in the current viewport - * (if necessary) using the configured autoPan parameters - * @protected - */ - Overlay.prototype.performAutoPan = function () { - if (this.autoPan) { - this.panIntoView(this.autoPan); - } - }; - /** - * Pan the map so that the overlay is entirely visible in the current viewport - * (if necessary). - * @param {PanIntoViewOptions=} opt_panIntoViewOptions Options for the pan action - * @api - */ - Overlay.prototype.panIntoView = function (opt_panIntoViewOptions) { - var map = this.getMap(); - if (!map || !map.getTargetElement() || !this.get(Property$2.POSITION)) { - return; - } - var mapRect = this.getRect(map.getTargetElement(), map.getSize()); - var element = this.getElement(); - var overlayRect = this.getRect(element, [ - outerWidth(element), - outerHeight(element), - ]); - var panIntoViewOptions = opt_panIntoViewOptions || {}; - var myMargin = panIntoViewOptions.margin === undefined ? 20 : panIntoViewOptions.margin; - if (!containsExtent(mapRect, overlayRect)) { - // the overlay is not completely inside the viewport, so pan the map - var offsetLeft = overlayRect[0] - mapRect[0]; - var offsetRight = mapRect[2] - overlayRect[2]; - var offsetTop = overlayRect[1] - mapRect[1]; - var offsetBottom = mapRect[3] - overlayRect[3]; - var delta = [0, 0]; - if (offsetLeft < 0) { - // move map to the left - delta[0] = offsetLeft - myMargin; - } - else if (offsetRight < 0) { - // move map to the right - delta[0] = Math.abs(offsetRight) + myMargin; - } - if (offsetTop < 0) { - // move map up - delta[1] = offsetTop - myMargin; - } - else if (offsetBottom < 0) { - // move map down - delta[1] = Math.abs(offsetBottom) + myMargin; - } - if (delta[0] !== 0 || delta[1] !== 0) { - var center = /** @type {import("./coordinate.js").Coordinate} */ (map - .getView() - .getCenterInternal()); - var centerPx = map.getPixelFromCoordinateInternal(center); - if (!centerPx) { - return; - } - var newCenterPx = [centerPx[0] + delta[0], centerPx[1] + delta[1]]; - var panOptions = panIntoViewOptions.animation || {}; - map.getView().animateInternal({ - center: map.getCoordinateFromPixelInternal(newCenterPx), - duration: panOptions.duration, - easing: panOptions.easing, - }); - } - } - }; - /** - * Get the extent of an element relative to the document - * @param {HTMLElement} element The element. - * @param {import("./size.js").Size} size The size of the element. - * @return {import("./extent.js").Extent} The extent. - * @protected - */ - Overlay.prototype.getRect = function (element, size) { - var box = element.getBoundingClientRect(); - var offsetX = box.left + window.pageXOffset; - var offsetY = box.top + window.pageYOffset; - return [offsetX, offsetY, offsetX + size[0], offsetY + size[1]]; - }; - /** - * Set the positioning for this overlay. - * @param {import("./OverlayPositioning.js").default} positioning how the overlay is - * positioned relative to its point on the map. - * @observable - * @api - */ - Overlay.prototype.setPositioning = function (positioning) { - this.set(Property$2.POSITIONING, positioning); - }; - /** - * Modify the visibility of the element. - * @param {boolean} visible Element visibility. - * @protected - */ - Overlay.prototype.setVisible = function (visible) { - if (this.rendered.visible !== visible) { - this.element.style.display = visible ? '' : 'none'; - this.rendered.visible = visible; - } - }; - /** - * Update pixel position. - * @protected - */ - Overlay.prototype.updatePixelPosition = function () { - var map = this.getMap(); - var position = this.getPosition(); - if (!map || !map.isRendered() || !position) { - this.setVisible(false); - return; - } - var pixel = map.getPixelFromCoordinate(position); - var mapSize = map.getSize(); - this.updateRenderedPosition(pixel, mapSize); - }; - /** - * @param {import("./pixel.js").Pixel} pixel The pixel location. - * @param {import("./size.js").Size|undefined} mapSize The map size. - * @protected - */ - Overlay.prototype.updateRenderedPosition = function (pixel, mapSize) { - var style = this.element.style; - var offset = this.getOffset(); - var positioning = this.getPositioning(); - this.setVisible(true); - var x = Math.round(pixel[0] + offset[0]) + 'px'; - var y = Math.round(pixel[1] + offset[1]) + 'px'; - var posX = '0%'; - var posY = '0%'; - if (positioning == OverlayPositioning.BOTTOM_RIGHT || - positioning == OverlayPositioning.CENTER_RIGHT || - positioning == OverlayPositioning.TOP_RIGHT) { - posX = '-100%'; - } - else if (positioning == OverlayPositioning.BOTTOM_CENTER || - positioning == OverlayPositioning.CENTER_CENTER || - positioning == OverlayPositioning.TOP_CENTER) { - posX = '-50%'; - } - if (positioning == OverlayPositioning.BOTTOM_LEFT || - positioning == OverlayPositioning.BOTTOM_CENTER || - positioning == OverlayPositioning.BOTTOM_RIGHT) { - posY = '-100%'; - } - else if (positioning == OverlayPositioning.CENTER_LEFT || - positioning == OverlayPositioning.CENTER_CENTER || - positioning == OverlayPositioning.CENTER_RIGHT) { - posY = '-50%'; - } - var transform = "translate(" + posX + ", " + posY + ") translate(" + x + ", " + y + ")"; - if (this.rendered.transform_ != transform) { - this.rendered.transform_ = transform; - style.transform = transform; - // @ts-ignore IE9 - style.msTransform = transform; - } - }; - /** - * returns the options this Overlay has been created with - * @return {Options} overlay options - */ - Overlay.prototype.getOptions = function () { - return this.options; - }; - return Overlay; -}(BaseObject)); - -/** - * @module ol/control - */ -/** - * @typedef {Object} DefaultsOptions - * @property {boolean} [attribution=true] Include - * {@link module:ol/control/Attribution~Attribution}. - * @property {import("./control/Attribution.js").Options} [attributionOptions] - * Options for {@link module:ol/control/Attribution~Attribution}. - * @property {boolean} [rotate=true] Include - * {@link module:ol/control/Rotate~Rotate}. - * @property {import("./control/Rotate.js").Options} [rotateOptions] Options - * for {@link module:ol/control/Rotate~Rotate}. - * @property {boolean} [zoom] Include {@link module:ol/control/Zoom~Zoom}. - * @property {import("./control/Zoom.js").Options} [zoomOptions] Options for - * {@link module:ol/control/Zoom~Zoom}. - * @api - */ -/** - * Set of controls included in maps by default. Unless configured otherwise, - * this returns a collection containing an instance of each of the following - * controls: - * * {@link module:ol/control/Zoom~Zoom} - * * {@link module:ol/control/Rotate~Rotate} - * * {@link module:ol/control/Attribution~Attribution} - * - * @param {DefaultsOptions=} opt_options - * Defaults options. - * @return {Collection} - * Controls. - * @api - */ -function defaults(opt_options) { - var options = opt_options ? opt_options : {}; - var controls = new Collection(); - var zoomControl = options.zoom !== undefined ? options.zoom : true; - if (zoomControl) { - controls.push(new Zoom(options.zoomOptions)); - } - var rotateControl = options.rotate !== undefined ? options.rotate : true; - if (rotateControl) { - controls.push(new Rotate(options.rotateOptions)); - } - var attributionControl = options.attribution !== undefined ? options.attribution : true; - if (attributionControl) { - controls.push(new Attribution(options.attributionOptions)); - } - return controls; -} - -/** - * @module ol/interaction/Property - */ -/** - * @enum {string} - */ -var InteractionProperty = { - ACTIVE: 'active', -}; - -var __extends$u = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * Object literal with config options for interactions. - * @typedef {Object} InteractionOptions - * @property {function(import("../MapBrowserEvent.js").default):boolean} handleEvent - * Method called by the map to notify the interaction that a browser event was - * dispatched to the map. If the function returns a falsy value, propagation of - * the event to other interactions in the map's interactions chain will be - * prevented (this includes functions with no explicit return). The interactions - * are traversed in reverse order of the interactions collection of the map. - */ -/** - * @classdesc - * Abstract base class; normally only used for creating subclasses and not - * instantiated in apps. - * User actions that change the state of the map. Some are similar to controls, - * but are not associated with a DOM element. - * For example, {@link module:ol/interaction/KeyboardZoom~KeyboardZoom} is - * functionally the same as {@link module:ol/control/Zoom~Zoom}, but triggered - * by a keyboard event not a button element event. - * Although interactions do not have a DOM element, some of them do render - * vectors and so are visible on the screen. - * @api - */ -var Interaction = /** @class */ (function (_super) { - __extends$u(Interaction, _super); - /** - * @param {InteractionOptions=} opt_options Options. - */ - function Interaction(opt_options) { - var _this = _super.call(this) || this; - if (opt_options && opt_options.handleEvent) { - _this.handleEvent = opt_options.handleEvent; - } - /** - * @private - * @type {import("../PluggableMap.js").default} - */ - _this.map_ = null; - _this.setActive(true); - return _this; - } - /** - * Return whether the interaction is currently active. - * @return {boolean} `true` if the interaction is active, `false` otherwise. - * @observable - * @api - */ - Interaction.prototype.getActive = function () { - return /** @type {boolean} */ (this.get(InteractionProperty.ACTIVE)); - }; - /** - * Get the map associated with this interaction. - * @return {import("../PluggableMap.js").default} Map. - * @api - */ - Interaction.prototype.getMap = function () { - return this.map_; - }; - /** - * Handles the {@link module:ol/MapBrowserEvent map browser event}. - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. - * @return {boolean} `false` to stop event propagation. - * @api - */ - Interaction.prototype.handleEvent = function (mapBrowserEvent) { - return true; - }; - /** - * Activate or deactivate the interaction. - * @param {boolean} active Active. - * @observable - * @api - */ - Interaction.prototype.setActive = function (active) { - this.set(InteractionProperty.ACTIVE, active); - }; - /** - * Remove the interaction from its current map and attach it to the new map. - * Subclasses may set up event handlers to get notified about changes to - * the map here. - * @param {import("../PluggableMap.js").default} map Map. - */ - Interaction.prototype.setMap = function (map) { - this.map_ = map; - }; - return Interaction; -}(BaseObject)); -/** - * @param {import("../View.js").default} view View. - * @param {import("../coordinate.js").Coordinate} delta Delta. - * @param {number=} opt_duration Duration. - */ -function pan(view, delta, opt_duration) { - var currentCenter = view.getCenterInternal(); - if (currentCenter) { - var center = [currentCenter[0] + delta[0], currentCenter[1] + delta[1]]; - view.animateInternal({ - duration: opt_duration !== undefined ? opt_duration : 250, - easing: linear, - center: view.getConstrainedCenter(center), - }); - } -} -/** - * @param {import("../View.js").default} view View. - * @param {number} delta Delta from previous zoom level. - * @param {import("../coordinate.js").Coordinate=} opt_anchor Anchor coordinate in the user projection. - * @param {number=} opt_duration Duration. - */ -function zoomByDelta(view, delta, opt_anchor, opt_duration) { - var currentZoom = view.getZoom(); - if (currentZoom === undefined) { - return; - } - var newZoom = view.getConstrainedZoom(currentZoom + delta); - var newResolution = view.getResolutionForZoom(newZoom); - if (view.getAnimating()) { - view.cancelAnimations(); - } - view.animate({ - resolution: newResolution, - anchor: opt_anchor, - duration: opt_duration !== undefined ? opt_duration : 250, - easing: easeOut, - }); -} - -var __extends$v = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {Object} Options - * @property {number} [duration=250] Animation duration in milliseconds. - * @property {number} [delta=1] The zoom delta applied on each double click. - */ -/** - * @classdesc - * Allows the user to zoom by double-clicking on the map. - * @api - */ -var DoubleClickZoom = /** @class */ (function (_super) { - __extends$v(DoubleClickZoom, _super); - /** - * @param {Options=} opt_options Options. - */ - function DoubleClickZoom(opt_options) { - var _this = _super.call(this) || this; - var options = opt_options ? opt_options : {}; - /** - * @private - * @type {number} - */ - _this.delta_ = options.delta ? options.delta : 1; - /** - * @private - * @type {number} - */ - _this.duration_ = options.duration !== undefined ? options.duration : 250; - return _this; - } - /** - * Handles the {@link module:ol/MapBrowserEvent map browser event} (if it was a - * doubleclick) and eventually zooms the map. - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. - * @return {boolean} `false` to stop event propagation. - */ - DoubleClickZoom.prototype.handleEvent = function (mapBrowserEvent) { - var stopEvent = false; - if (mapBrowserEvent.type == MapBrowserEventType.DBLCLICK) { - var browserEvent = /** @type {MouseEvent} */ (mapBrowserEvent.originalEvent); - var map = mapBrowserEvent.map; - var anchor = mapBrowserEvent.coordinate; - var delta = browserEvent.shiftKey ? -this.delta_ : this.delta_; - var view = map.getView(); - zoomByDelta(view, delta, anchor, this.duration_); - browserEvent.preventDefault(); - stopEvent = true; - } - return !stopEvent; - }; - return DoubleClickZoom; -}(Interaction)); - -var __extends$w = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -/** - * @typedef {Object} Options - * @property {function(import("../MapBrowserEvent.js").default):boolean} [handleDownEvent] - * Function handling "down" events. If the function returns `true` then a drag - * sequence is started. - * @property {function(import("../MapBrowserEvent.js").default):void} [handleDragEvent] - * Function handling "drag" events. This function is called on "move" events - * during a drag sequence. - * @property {function(import("../MapBrowserEvent.js").default):boolean} [handleEvent] - * Method called by the map to notify the interaction that a browser event was - * dispatched to the map. The function may return `false` to prevent the - * propagation of the event to other interactions in the map's interactions - * chain. - * @property {function(import("../MapBrowserEvent.js").default):void} [handleMoveEvent] - * Function handling "move" events. This function is called on "move" events. - * This functions is also called during a drag sequence, so during a drag - * sequence both the `handleDragEvent` function and this function are called. - * If `handleDownEvent` is defined and it returns true this function will not - * be called during a drag sequence. - * @property {function(import("../MapBrowserEvent.js").default):boolean} [handleUpEvent] - * Function handling "up" events. If the function returns `false` then the - * current drag sequence is stopped. - * @property {function(boolean):boolean} [stopDown] - * Should the down event be propagated to other interactions, or should be - * stopped? - */ -/** - * @classdesc - * Base class that calls user-defined functions on `down`, `move` and `up` - * events. This class also manages "drag sequences". - * - * When the `handleDownEvent` user function returns `true` a drag sequence is - * started. During a drag sequence the `handleDragEvent` user function is - * called on `move` events. The drag sequence ends when the `handleUpEvent` - * user function is called and returns `false`. - * @api - */ -var PointerInteraction = /** @class */ (function (_super) { - __extends$w(PointerInteraction, _super); - /** - * @param {Options=} opt_options Options. - */ - function PointerInteraction(opt_options) { - var _this = this; - var options = opt_options ? opt_options : {}; - _this = _super.call(this, - /** @type {import("./Interaction.js").InteractionOptions} */ (options)) || this; - if (options.handleDownEvent) { - _this.handleDownEvent = options.handleDownEvent; - } - if (options.handleDragEvent) { - _this.handleDragEvent = options.handleDragEvent; - } - if (options.handleMoveEvent) { - _this.handleMoveEvent = options.handleMoveEvent; - } - if (options.handleUpEvent) { - _this.handleUpEvent = options.handleUpEvent; - } - if (options.stopDown) { - _this.stopDown = options.stopDown; - } - /** - * @type {boolean} - * @protected - */ - _this.handlingDownUpSequence = false; - /** - * @type {!Object} - * @private - */ - _this.trackedPointers_ = {}; - /** - * @type {Array} - * @protected - */ - _this.targetPointers = []; - return _this; - } - /** - * Returns the current number of pointers involved in the interaction, - * e.g. `2` when two fingers are used. - * @return {number} The number of pointers. - * @api - */ - PointerInteraction.prototype.getPointerCount = function () { - return this.targetPointers.length; - }; - /** - * Handle pointer down events. - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. - * @return {boolean} If the event was consumed. - * @protected - */ - PointerInteraction.prototype.handleDownEvent = function (mapBrowserEvent) { - return false; - }; - /** - * Handle pointer drag events. - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. - * @protected - */ - PointerInteraction.prototype.handleDragEvent = function (mapBrowserEvent) { }; - /** - * Handles the {@link module:ol/MapBrowserEvent map browser event} and may call into - * other functions, if event sequences like e.g. 'drag' or 'down-up' etc. are - * detected. - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. - * @return {boolean} `false` to stop event propagation. - * @api - */ - PointerInteraction.prototype.handleEvent = function (mapBrowserEvent) { - if (!mapBrowserEvent.originalEvent) { - return true; - } - var stopEvent = false; - this.updateTrackedPointers_(mapBrowserEvent); - if (this.handlingDownUpSequence) { - if (mapBrowserEvent.type == MapBrowserEventType.POINTERDRAG) { - this.handleDragEvent(mapBrowserEvent); - // prevent page scrolling during dragging - mapBrowserEvent.originalEvent.preventDefault(); - } - else if (mapBrowserEvent.type == MapBrowserEventType.POINTERUP) { - var handledUp = this.handleUpEvent(mapBrowserEvent); - this.handlingDownUpSequence = - handledUp && this.targetPointers.length > 0; - } - } - else { - if (mapBrowserEvent.type == MapBrowserEventType.POINTERDOWN) { - var handled = this.handleDownEvent(mapBrowserEvent); - this.handlingDownUpSequence = handled; - stopEvent = this.stopDown(handled); - } - else if (mapBrowserEvent.type == MapBrowserEventType.POINTERMOVE) { - this.handleMoveEvent(mapBrowserEvent); - } - } - return !stopEvent; - }; - /** - * Handle pointer move events. - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. - * @protected - */ - PointerInteraction.prototype.handleMoveEvent = function (mapBrowserEvent) { }; - /** - * Handle pointer up events. - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. - * @return {boolean} If the event was consumed. - * @protected - */ - PointerInteraction.prototype.handleUpEvent = function (mapBrowserEvent) { - return false; - }; - /** - * This function is used to determine if "down" events should be propagated - * to other interactions or should be stopped. - * @param {boolean} handled Was the event handled by the interaction? - * @return {boolean} Should the `down` event be stopped? - */ - PointerInteraction.prototype.stopDown = function (handled) { - return handled; - }; - /** - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. - * @private - */ - PointerInteraction.prototype.updateTrackedPointers_ = function (mapBrowserEvent) { - if (isPointerDraggingEvent(mapBrowserEvent)) { - var event_1 = mapBrowserEvent.originalEvent; - var id = event_1.pointerId.toString(); - if (mapBrowserEvent.type == MapBrowserEventType.POINTERUP) { - delete this.trackedPointers_[id]; - } - else if (mapBrowserEvent.type == MapBrowserEventType.POINTERDOWN) { - this.trackedPointers_[id] = event_1; - } - else if (id in this.trackedPointers_) { - // update only when there was a pointerdown event for this pointer - this.trackedPointers_[id] = event_1; - } - this.targetPointers = getValues(this.trackedPointers_); - } - }; - return PointerInteraction; -}(Interaction)); -/** - * @param {Array} pointerEvents List of events. - * @return {import("../pixel.js").Pixel} Centroid pixel. - */ -function centroid(pointerEvents) { - var length = pointerEvents.length; - var clientX = 0; - var clientY = 0; - for (var i = 0; i < length; i++) { - clientX += pointerEvents[i].clientX; - clientY += pointerEvents[i].clientY; - } - return [clientX / length, clientY / length]; -} -/** - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event. - * @return {boolean} Whether the event is a pointerdown, pointerdrag - * or pointerup event. - */ -function isPointerDraggingEvent(mapBrowserEvent) { - var type = mapBrowserEvent.type; - return (type === MapBrowserEventType.POINTERDOWN || - type === MapBrowserEventType.POINTERDRAG || - type === MapBrowserEventType.POINTERUP); -} - -/** - * @module ol/events/condition - */ -/** - * A function that takes an {@link module:ol/MapBrowserEvent} and returns a - * `{boolean}`. If the condition is met, true should be returned. - * - * @typedef {function(this: ?, import("../MapBrowserEvent.js").default): boolean} Condition - */ -/** - * Creates a condition function that passes when all provided conditions pass. - * @param {...Condition} var_args Conditions to check. - * @return {Condition} Condition function. - */ -function all(var_args) { - var conditions = arguments; - /** - * @param {import("../MapBrowserEvent.js").default} event Event. - * @return {boolean} All conditions passed. - */ - return function (event) { - var pass = true; - for (var i = 0, ii = conditions.length; i < ii; ++i) { - pass = pass && conditions[i](event); - if (!pass) { - break; - } - } - return pass; - }; -} -/** - * Return `true` if only the alt-key and shift-key is pressed, `false` otherwise - * (e.g. when additionally the platform-modifier-key is pressed). - * - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. - * @return {boolean} True if only the alt and shift keys are pressed. - * @api - */ -var altShiftKeysOnly = function (mapBrowserEvent) { - var originalEvent = /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ (mapBrowserEvent.originalEvent); - return (originalEvent.altKey && - !(originalEvent.metaKey || originalEvent.ctrlKey) && - originalEvent.shiftKey); -}; -/** - * Return `true` if the map has the focus. This condition requires a map target - * element with a `tabindex` attribute, e.g. `
`. - * - * @param {import("../MapBrowserEvent.js").default} event Map browser event. - * @return {boolean} The map has the focus. - * @api - */ -var focus = function (event) { - return event.target.getTargetElement().contains(document.activeElement); -}; -/** - * Return `true` if the map has the focus or no 'tabindex' attribute set. - * - * @param {import("../MapBrowserEvent.js").default} event Map browser event. - * @return {boolean} The map container has the focus or no 'tabindex' attribute. - */ -var focusWithTabindex = function (event) { - return event.map.getTargetElement().hasAttribute('tabindex') - ? focus(event) - : true; -}; -/** - * Return always true. - * - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. - * @return {boolean} True. - * @api - */ -var always = TRUE; -/** - * Return `true` if the event has an "action"-producing mouse button. - * - * By definition, this includes left-click on windows/linux, and left-click - * without the ctrl key on Macs. - * - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. - * @return {boolean} The result. - */ -var mouseActionButton = function (mapBrowserEvent) { - var originalEvent = /** @type {MouseEvent} */ (mapBrowserEvent.originalEvent); - return originalEvent.button == 0 && !(WEBKIT && MAC && originalEvent.ctrlKey); -}; -/** - * Return `true` if no modifier key (alt-, shift- or platform-modifier-key) is - * pressed. - * - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. - * @return {boolean} True only if there no modifier keys are pressed. - * @api - */ -var noModifierKeys = function (mapBrowserEvent) { - var originalEvent = /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ (mapBrowserEvent.originalEvent); - return (!originalEvent.altKey && - !(originalEvent.metaKey || originalEvent.ctrlKey) && - !originalEvent.shiftKey); -}; -/** - * Return `true` if only the shift-key is pressed, `false` otherwise (e.g. when - * additionally the alt-key is pressed). - * - * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event. - * @return {boolean} True if only the shift key is pressed. - * @api - */ -var shiftKeyOnly = function (mapBrowserEvent) { - var originalEvent = /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ (mapBrowserEvent.originalEvent); - return (!originalEvent.altKey && - !(originalEvent.metaKey || originalEvent.ctrlKey) && - originalEvent.shiftKey); -}; -/** - * Return `true` if the target element is not editable, i.e. not a ``-, - * ` +
diff --git a/Services/Form/templates/default/tpl.prop_textinput.html b/Services/Form/templates/default/tpl.prop_textinput.html index 2a1deeb69cc6..50a9476d79d7 100644 --- a/Services/Form/templates/default/tpl.prop_textinput.html +++ b/Services/Form/templates/default/tpl.prop_textinput.html @@ -1,7 +1,7 @@
- onkeypress="return il.Util.submitOnEnter(event, this.form);" type="{PROP_INPUT_TYPE}" style="{CSS_STYLE}" id="{ID}" maxlength="{MAXLENGTH}" name="{POST_VAR}" value="{PROPERTY_VALUE}" {DISABLED} {AUTOCOMPLETE} {REQUIRED}/> {INPUT_SUFFIX} + aria-describedby="desc_{DESCRIBED_BY_FIELD_ID}" class="form-control" onkeypress="return il.Util.submitOnEnter(event, this.form);" type="{PROP_INPUT_TYPE}" style="{CSS_STYLE}" id="{ID}" maxlength="{MAXLENGTH}" name="{POST_VAR}" value="{PROPERTY_VALUE}" {DISABLED} {AUTOCOMPLETE} {REQUIRED}/> {INPUT_SUFFIX} {HIDDEN_INPUT} {MULTI_ICONS} diff --git a/Services/Form/templates/default/tpl.property_form.html b/Services/Form/templates/default/tpl.property_form.html index c97fa6e523e1..034cfc475778 100644 --- a/Services/Form/templates/default/tpl.property_form.html +++ b/Services/Form/templates/default/tpl.property_form.html @@ -82,7 +82,7 @@
-
{PROPERTY_DESCRIPTION}
+
{PROPERTY_DESCRIPTION}
{PROP_SUB_FORM}
From b00cdf1df421b734b0fce3c1c27433d2d0c3e632 Mon Sep 17 00:00:00 2001 From: Uwe Kohnle Date: Mon, 29 Jan 2024 18:54:46 +0000 Subject: [PATCH 385/497] check SCORM export file --- .../class.ilObjSAHSLearningModuleGUI.php | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php b/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php index ebdafe3ce2fc..21de8806e406 100755 --- a/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php +++ b/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php @@ -433,14 +433,21 @@ public function uploadObject(): void // $importFromXml = true; // } $mprops = $importer->moduleProperties; - $subType = (string) $mprops["SubType"]; - if ($subType === "scorm") { - $newObj = new ilObjSCORMLearningModule(); - } else { - $newObj = new ilObjSCORM2004LearningModule(); - // $newObj->setEditable($_POST["editable"]=='y'); - // $newObj->setImportSequencing($_POST["import_sequencing"]); - // $newObj->setSequencingExpertMode($_POST["import_sequencing"]); + try { + $subType = (string) $mprops["SubType"]; + if ($subType === "scorm") { + $newObj = new ilObjSCORMLearningModule(); + } else { + $newObj = new ilObjSCORM2004LearningModule(); + // $newObj->setEditable($_POST["editable"]=='y'); + // $newObj->setImportSequencing($_POST["import_sequencing"]); + // $newObj->setSequencingExpertMode($_POST["import_sequencing"]); + } + } catch (\Exception $e) { + ilFileUtils::delDir($lmTempDir, false); + $this->lng->loadLanguageModule("obj"); + $this->tpl->setOnScreenMessage('failure', $this->lng->txt("obj_import_file_error") . "
" . $e->getMessage(), true); + return; } } break; From 72177bf6be9a5ea898a193707db36c7ae0727c2e Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 29 Jan 2024 14:19:43 +0100 Subject: [PATCH 386/497] UIComponent/Tabs: Transform URL before template rendering See: https://mantis.ilias.de/view.php?id=40225 --- Services/UIComponent/Tabs/classes/class.ilTabsGUI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/UIComponent/Tabs/classes/class.ilTabsGUI.php b/Services/UIComponent/Tabs/classes/class.ilTabsGUI.php index 7be588435ecb..4b25df3b4e69 100755 --- a/Services/UIComponent/Tabs/classes/class.ilTabsGUI.php +++ b/Services/UIComponent/Tabs/classes/class.ilTabsGUI.php @@ -376,7 +376,7 @@ private function __getHTML( if ($this->back_2_title !== "") { $tpl->setCurrentBlock("back_2_tab"); $tpl->setVariable("BACK_2_ICON", ilGlyphGUI::get(ilGlyphGUI::PREVIOUS, ilGlyphGUI::NO_TEXT)); - $tpl->setVariable("BACK_2_TAB_LINK", $this->back_2_target); + $tpl->setVariable("BACK_2_TAB_LINK", ilUtil::secureUrl($this->back_2_target)); $tpl->setVariable("BACK_2_TAB_TEXT", $this->back_2_title); if ($this->back_2_frame !== "") { $tpl->setVariable("BACK_2_TAB_TARGET", ' target="' . $this->back_2_frame . '" '); @@ -389,7 +389,7 @@ private function __getHTML( if ($this->back_title !== "") { $tpl->setCurrentBlock("back_tab"); $tpl->setVariable("BACK_ICON", ilGlyphGUI::get(ilGlyphGUI::PREVIOUS, ilGlyphGUI::NO_TEXT)); - $tpl->setVariable("BACK_TAB_LINK", $this->back_target); + $tpl->setVariable("BACK_TAB_LINK", ilUtil::secureUrl($this->back_target)); $tpl->setVariable("BACK_TAB_TEXT", $this->back_title); if ($this->back_frame !== "") { $tpl->setVariable("BACK_TAB_TARGET", ' target="' . $this->back_frame . '" '); From 15ff8e18b0b17c5a42d6a3e565621a80c34f8eb0 Mon Sep 17 00:00:00 2001 From: Uwe Kohnle Date: Tue, 30 Jan 2024 09:16:39 +0000 Subject: [PATCH 387/497] check filename for TestTool --- Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php b/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php index 3e4fd94be592..081ffcb3f50b 100755 --- a/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php +++ b/Modules/Scorm2004/classes/class.ilSCORM13PlayerGUI.php @@ -1581,6 +1581,7 @@ public function openLog(): void { global $DIC; $filename = ilUtil::stripSlashes($DIC->http()->wrapper()->query()->retrieve('logFile', $DIC->refinery()->kindlyTo()->string())); + $filename = str_replace('/', '', $filename); //Header header('Content-Type: text/html; charset=UTF-8'); echo file_get_contents($this->logDirectory() . "/" . $filename); @@ -1842,6 +1843,7 @@ public function postLogEntry(): void //delete files if ($logdata->action === "DELETE") { $filename = $logdata->value; + $filename = str_replace('/', '', $filename); $path = $this->logDirectory() . "/" . $filename; unlink($path); return; From ebc179b39bdd138879bdaf4aa906e0d130f20f9e Mon Sep 17 00:00:00 2001 From: Fabian Helfer Date: Mon, 29 Jan 2024 13:54:36 +0100 Subject: [PATCH 388/497] Bugfix qpl title null error --- Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php b/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php index 66b7e380cbfd..13ff5e4ffecb 100644 --- a/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php +++ b/Modules/Test/classes/tables/class.ilTestQuestionsTableGUI.php @@ -227,7 +227,7 @@ public function fillRow(array $a_set): void $question_pool_title = $this->lng->txt('tst_question_not_from_pool_info'); - if (isset($a_set['orig_obj_fi'])) { + if (isset($a_set['orig_obj_fi']) && ilObject::_lookupTitle($a_set['orig_obj_fi']) !== null) { $question_pool_title = $this->buildPossiblyLinkedQuestonPoolTitle( $this->ctrl, $this->access, From 6841a96acb72cadb25bed546be53c1e7760677a9 Mon Sep 17 00:00:00 2001 From: Uwe Kohnle Date: Tue, 30 Jan 2024 11:33:50 +0000 Subject: [PATCH 389/497] privacy for cmix --- Modules/CmiXapi/PRIVACY.md | 75 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 Modules/CmiXapi/PRIVACY.md diff --git a/Modules/CmiXapi/PRIVACY.md b/Modules/CmiXapi/PRIVACY.md new file mode 100755 index 000000000000..9013a92c23ba --- /dev/null +++ b/Modules/CmiXapi/PRIVACY.md @@ -0,0 +1,75 @@ +# Module cmix Privacy + +Disclaimer: This documentation does not warrant completeness or correctness. Please report any missing or wrong information using the [ILIAS issue tracker](https://mantis.ilias.de) or contribute a fix via [Pull Request](docs/development/contributing.md#pull-request-to-the-repositories). + +## General Information + +This module cmix allows uploading an object or using an external object. An object is a Learning Record Provider (LRP), usually content or instructional activities. Personal data flow from an LRP to a Learning Record Store (LRS). +LRS and LRP are to store and manage states and statements on learning activities or learning progress of a person. +ILIAS only holds the identification of a person to connect Learning Progress or statements on learning activities to an ILIAS account. + +* The LRP communicates directly with the LRS: ILIAS queries Learning Progress or statements of learning activities from the LRS. To connect this to an account, ILIAS must identify a record with a user-ID. + * If the LRP is launched by ILIAS, ILIAS provides a User-ID. + * If the LRP is launched without ILIAS, a person provides their e-mail address used for the LRS. +* The LRP communicates directly with ILIAS: ILIAS behaves as an LRS for the LRP. ILIAS functions as a proxy between LRP and LRS. Thus ILIAS can filter statements of learning activities being sent to the LRS. + + +## Data being stored + +1. LRP / content generates and sends states like page last visited, number of page views, results of questions, number of times a question was viewed or answered, number of times a page was viewed, language or audio preference. ILIAS does not process this data. +2. LRP / content generates and sends statements on learning activities to the LRS. These statements follow a grammar subject-verb-object may comprise context data. However, the data is generated in the LRP / content and sent to the LRS. Statements are triggered by events and document what happened in a granular fashion i.e.: + * User x viewed the page z on date DD.MM.YYYY HH:MM:SS for duration d. + * User x wrote the comment r on that page z on date DD.MM.YYYY HH:MM:SS. + * User a launched the test q on date DD.MM.YYYY HH:MM:SS. + * User a answered the question l selected answer option u, gained 4 of 7 points on date DD.MM.YYYY HH:MM:SS. + * User b experienced PDF File p on date DD.MM.YYYY HH:MM:SS. + * User b completed test q with score t on date DD.MM.YYYY HH:MM:SS. +3. If cmi5 is used, then ILIAS generates and sends only the following fixed set of statements on learning activities to the LRS: + * "user x launched the activity y", + * "user q abandoned the activity p" and + * "user w satisfied the activity z". + +After a statement was sent, changing ILIAS settings i.e. learning progress, cannot change the statement. + +Typically enourmous amounts of behavioral data, often times personalized behavioral data, is generated and sent around. +In all these cases ILIAS stores some kind of user identification, i.e. User-ID, E-Mail address or hash value. +This "unregulated" scenario is not advisable to run. + +The unimpeded communication between LRP / content and LRS should be curbed by using configuration: +At Administration > Extending ILIAS > xAPI/cmi5 a person with "Edit Settings" permission can add an additional LRS-Type. +* Activating the "CronJob necessary for Learning Progress" prevents curbing the amount of data sent. +* In the option "User Identification" one can select which piece of information is transmitted to the flow of data to LRP and LRS. Selecting "Hash combined with a unique ILIAS platform id formatted as an E-Mail address" is advised. One and the same LRS can be shared between learning platforms. It MUST be ensured that User Identification data is hashed at least. +* In the option "User Name" one can select which piece of information is transmitted to the flow of data to LRP and LRS. Selecting "No one" is advised. +* The settings offer an option to reduce the amount of statements being send from the LRP / content to LRS, i.e. +* Activate "Save learning success data only" to retain only statements comprising specific and selected verbs. +* Activate "Blacken Data" to replace actual calendar dates or durations by fixed values. +* Activate "Do not store substatements" to discard subordinate statements. +* To force privacy settings on repository objects: "Configurations Options: Settings are not changeable for Objects". + +In the repository an object type "xAPI/cmi5" can be added, the LRS-Type MUST be selected in the ILIAS creation dialogue. +* If in Administration > Extending ILIAS > xAPI/cmi5 > Add LRS-Type > Configuration Options is set to "Default Settings, changeable for Objects", then a person can overrule the above mentioned options and create their own privacy policy. This option makes it impossible to specify a document for consent, since at any given time the privacy regime could be changed by a person with "Edit Settings" permission for an xAPI/cmi5-object. +* If in Administration > Extending ILIAS > xAPI/cmi5 > Add LRS-Type > Configuration Options is set to "Settings are not changeable for Objects", then the globally set privacy options cannot be changed in an xAPI/cmi5-object. To specify a document for consent, several LRS-Types should be set up to serve different educational practices i.e. exams require more personal data while some content can be quite restrictve privacy-wise. +* Creating an "xAPI/cmi5" object in the repositry allows selecting an LRS-Type. In Administration > Extending ILIAS > xAPI/cmi5 > Add LRS-Type the setting "Availability" determines if an LRS-Type is available in the creation dialogue. LRS-Types set to "Not available" do not receive new data. This prepares an orderly deletion of LRS data sets. + +The Module cmix employs the following services, please consult the respective privacy.mds: Metadata, AccessControl, Learning Progress. + + +## Data being presented + +* No xAPI related data is presented in the global administration. +* A person with "Edit Settings" permission for an xAPI/cmi5 object in the repository can activate statement viewer and ranking viewer in the tab Settings. + * If activated, the person with "Read" permission is presented with new tabs "Learning Experiences" and "Ranking". + * A table in "Learning Experiences" presents data sets comprising statements on the person him- or herself: On Date, User, Verb, Object. A modal dialogue can be opened to present the full statement which may comprise a lot more data like duration, selected answer option, success, context and so forth. The amount of data tracked depends on the LRP. + * In tab "Ranking", tables are presented according to options selected in the Settings-tab: Own rank of person, top ranking of other persons, both. Date, Percentage and duration might be presented. + * A Person with "View learning experiences of other users" is always is presented with tabs "Learning Experiences" and "Ranking". + * A table in "Learning Experiences" presents all data set on all the persons that have interacted with object: On Date, User, Verb, Object. This person can also view all full statements on all users. + * In "Ranking", tables are presented according to options selected in the Settings-tab: Own rank of person, top ranking of other persons, both. Date, Percentage and duration might be presented. +* The data stored in the LRS are always displayed only in relation to the LRP. + + +## Data being deleted + +The xAPI specification does not envisage any kind of deletion of data in the LRS at all. +When an object "xAPI/cmi5" in the repository is deleted, the personal data of the statements persists in the LRS. Once personal data is communicated to the LRS, ILIAS has no control over the deletion this personal data. +There is no way to delete data in the LRS from ILIAS. +Thus you MUST ensure that the data produced is properly pseudonymized as laid out in the section on storage. \ No newline at end of file From 2812dd4a4f437898aba17ebc18bfdea48d98b3db Mon Sep 17 00:00:00 2001 From: Stefan Meyer Date: Tue, 30 Jan 2024 14:15:35 +0100 Subject: [PATCH 390/497] Merge pull request #6959 from mjansenDatabay/hotfix/9/repo-search-result-table-query-transformation Search: Transform query value before output --- ...ilRepositoryObjectSearchResultTableGUI.php | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Services/Search/classes/class.ilRepositoryObjectSearchResultTableGUI.php b/Services/Search/classes/class.ilRepositoryObjectSearchResultTableGUI.php index 5a01d39ab1f8..c6017a1c124e 100644 --- a/Services/Search/classes/class.ilRepositoryObjectSearchResultTableGUI.php +++ b/Services/Search/classes/class.ilRepositoryObjectSearchResultTableGUI.php @@ -1,7 +1,23 @@ setLimit(0); $this->setTitle( - $this->lng->txt('search_results') . ' "' . str_replace(array('"'), '', $this->getSearchTerm()) . '"' + $this->lng->txt('search_results') . ' "' . str_replace(['"'], '', ilLegacyFormElementsUtil::prepareFormOutput($this->getSearchTerm())) . '"' ); } From 3a07675b8260841801374274b17731360748fede Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 30 Jan 2024 15:53:20 +0100 Subject: [PATCH 391/497] User: Fix request handling for role selection See: https://mantis.ilias.de/view.php?id=40273 --- .../User/classes/class.ilCronDeleteInactiveUserAccounts.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Services/User/classes/class.ilCronDeleteInactiveUserAccounts.php b/Services/User/classes/class.ilCronDeleteInactiveUserAccounts.php index 6406227395d7..d0c58ac54f7e 100644 --- a/Services/User/classes/class.ilCronDeleteInactiveUserAccounts.php +++ b/Services/User/classes/class.ilCronDeleteInactiveUserAccounts.php @@ -448,7 +448,10 @@ public function saveCustomSettings(ilPropertyFormGUI $a_form): bool if ($delete_period > 0) { $roles = implode(',', $this->http->wrapper()->post()->retrieve( 'cron_inactive_user_delete_include_roles', - $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->int()) + $this->refinery->byTrying([ + $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->int()), + $this->refinery->always([]) + ]) )); $this->settings->set('cron_inactive_user_delete_include_roles', $roles); From 34210bd91a10ae13b2db09bfe6f76f02a1bee417 Mon Sep 17 00:00:00 2001 From: mjansen Date: Tue, 30 Jan 2024 14:43:49 +0100 Subject: [PATCH 392/497] User: Fix request parameter handling for missing role selection See: https://mantis.ilias.de/view.php?id=40288 --- ...ss.ilCronDeleteInactivatedUserAccounts.php | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Services/User/classes/class.ilCronDeleteInactivatedUserAccounts.php b/Services/User/classes/class.ilCronDeleteInactivatedUserAccounts.php index 9e7c8b172e3b..a7b95112ae72 100644 --- a/Services/User/classes/class.ilCronDeleteInactivatedUserAccounts.php +++ b/Services/User/classes/class.ilCronDeleteInactivatedUserAccounts.php @@ -220,20 +220,22 @@ public function saveCustomSettings(ilPropertyFormGUI $a_form): bool { $roles = implode(',', $this->http->wrapper()->post()->retrieve( 'cron_inactivated_user_delete_include_roles', - $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->int()) + $this->refinery->byTrying([ + $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->int()), + $this->refinery->always([]) + ]) )); - $pertiod = null; - try { - $pertiod = $this->http->wrapper()->post()->retrieve( - 'cron_inactivated_user_delete_period', - $this->refinery->kindlyTo()->int() - ); - } catch (ConstraintViolationException $e) { - } + $period = $this->http->wrapper()->post()->retrieve( + 'cron_inactivated_user_delete_period', + $this->refinery->byTrying([ + $this->refinery->kindlyTo()->int(), + $this->refinery->always(null) + ]) + ); $this->settings->set('cron_inactivated_user_delete_include_roles', $roles); - $this->settings->set('cron_inactivated_user_delete_period', (string) ($pertiod ?? self::DEFAULT_INACTIVITY_PERIOD)); + $this->settings->set('cron_inactivated_user_delete_period', (string) ($period ?? self::DEFAULT_INACTIVITY_PERIOD)); return true; } From 036cfdb7e318f1d094ac3ce3840d449abfa309d7 Mon Sep 17 00:00:00 2001 From: mjansen Date: Tue, 30 Jan 2024 14:35:58 +0100 Subject: [PATCH 393/497] User: Fix overwriting user attributes in XML import See: https://mantis.ilias.de/view.php?id=40290 --- Services/User/classes/class.ilUserImportParser.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Services/User/classes/class.ilUserImportParser.php b/Services/User/classes/class.ilUserImportParser.php index e59c0f270675..ece09ceb1aba 100755 --- a/Services/User/classes/class.ilUserImportParser.php +++ b/Services/User/classes/class.ilUserImportParser.php @@ -429,6 +429,8 @@ public function importBeginTag( break; case "User": + $this->containedTags = []; + $this->acc_mail->reset(); $this->prefs = array(); $this->currentPrefKey = null; From 7dffda197f98a1cf655eafda14674eaaaa7fdce0 Mon Sep 17 00:00:00 2001 From: Uwe Kohnle Date: Tue, 30 Jan 2024 15:16:33 +0000 Subject: [PATCH 394/497] improvements for checking scorm import files --- .../classes/class.ilObjSAHSLearningModuleGUI.php | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php b/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php index 21de8806e406..ad619b999e9b 100755 --- a/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php +++ b/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php @@ -425,23 +425,19 @@ public function uploadObject(): void $zar->open($tempFile); $zar->extractTo($lmTempDir); $zar->close(); + ilFileUtils::renameExecutables($lmTempDir); $importer = new ilScormAiccImporter(); $import_dirname = $lmTempDir . '/' . substr($_FILES["scormfile"]["name"], 0, -4); - $importer->importXmlRepresentation("sahs", "", $import_dirname, null); - $importFromXml = true; - // if ($importer->importXmlRepresentation("sahs", "", $import_dirname, null) == true) { - // $importFromXml = true; - // } - $mprops = $importer->moduleProperties; try { + $importer->importXmlRepresentation("sahs", "", $import_dirname, null); + $importFromXml = true; + $mprops = $importer->moduleProperties; + $subType = (string) $mprops["SubType"]; if ($subType === "scorm") { $newObj = new ilObjSCORMLearningModule(); } else { $newObj = new ilObjSCORM2004LearningModule(); - // $newObj->setEditable($_POST["editable"]=='y'); - // $newObj->setImportSequencing($_POST["import_sequencing"]); - // $newObj->setSequencingExpertMode($_POST["import_sequencing"]); } } catch (\Exception $e) { ilFileUtils::delDir($lmTempDir, false); From 09d9c913bbb6ffe52351813a19762ef1f4d713ab Mon Sep 17 00:00:00 2001 From: Nadia Matuschek Date: Wed, 31 Jan 2024 09:10:53 +0100 Subject: [PATCH 395/497] #40301 Forum Bugfix: Missing user_noti_id for cloning notification settings (#6982) * Forum Bugfix: Missing user_noti_id for cloning notification settings * Forum Bugfix: Fixed unit test. Missing user_noti_id for cloning notification settings --- Modules/Forum/classes/Notification/class.ilForumNotification.php | 1 + Modules/Forum/test/ilForumNotificationTest.php | 1 + 2 files changed, 2 insertions(+) diff --git a/Modules/Forum/classes/Notification/class.ilForumNotification.php b/Modules/Forum/classes/Notification/class.ilForumNotification.php index c5f0f356ecae..1e166c3b43f9 100644 --- a/Modules/Forum/classes/Notification/class.ilForumNotification.php +++ b/Modules/Forum/classes/Notification/class.ilForumNotification.php @@ -408,6 +408,7 @@ public function read(): array $result[(int) $row['user_id']]['admin_force_noti'] = (int) $row['admin_force_noti']; $result[(int) $row['user_id']]['user_toggle_noti'] = (int) $row['user_toggle_noti']; $result[(int) $row['user_id']]['interested_events'] = (int) $row['interested_events']; + $result[(int) $row['user_id']]['user_id_noti'] = (int) $row['user_id_noti']; } return $result; diff --git a/Modules/Forum/test/ilForumNotificationTest.php b/Modules/Forum/test/ilForumNotificationTest.php index 0bc6a07448f4..b875f61702de 100644 --- a/Modules/Forum/test/ilForumNotificationTest.php +++ b/Modules/Forum/test/ilForumNotificationTest.php @@ -333,6 +333,7 @@ public function testRead(): void 'admin_force_noti' => 20, 'user_toggle_noti' => 90, 'interested_events' => 8, + 'user_id_noti' => 6, ]; $mockStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock(); $this->database->expects(self::exactly(2))->method('fetchAssoc')->willReturn( From b10d8a33b87cba491eb98c776abe207c1fcadd26 Mon Sep 17 00:00:00 2001 From: mjansen Date: Wed, 31 Jan 2024 09:16:11 +0100 Subject: [PATCH 396/497] Forum: Fix copyright header --- .../classes/Notification/class.ilForumNotification.php | 10 ++-------- Modules/Forum/test/ilForumNotificationTest.php | 4 ++-- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Modules/Forum/classes/Notification/class.ilForumNotification.php b/Modules/Forum/classes/Notification/class.ilForumNotification.php index 1e166c3b43f9..6cee36c1790e 100644 --- a/Modules/Forum/classes/Notification/class.ilForumNotification.php +++ b/Modules/Forum/classes/Notification/class.ilForumNotification.php @@ -1,7 +1,5 @@ - * @version $Id:$ - * @ingroup ModulesForum - */ +declare(strict_types=1); + class ilForumNotification { /** @var array[]> */ diff --git a/Modules/Forum/test/ilForumNotificationTest.php b/Modules/Forum/test/ilForumNotificationTest.php index b875f61702de..812d574373ad 100644 --- a/Modules/Forum/test/ilForumNotificationTest.php +++ b/Modules/Forum/test/ilForumNotificationTest.php @@ -1,7 +1,5 @@ Date: Wed, 31 Jan 2024 12:57:49 +0100 Subject: [PATCH 397/497] Test: Fix Indentation of JS See: https://mantis.ilias.de/view.php?id=40067 --- .../classes/class.ilTestPlayerAbstractGUI.php | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Modules/Test/classes/class.ilTestPlayerAbstractGUI.php b/Modules/Test/classes/class.ilTestPlayerAbstractGUI.php index 8fdb686fb8a5..f6d86430902a 100755 --- a/Modules/Test/classes/class.ilTestPlayerAbstractGUI.php +++ b/Modules/Test/classes/class.ilTestPlayerAbstractGUI.php @@ -1229,7 +1229,7 @@ protected function showQuestionEditable(assQuestionGUI $questionGui, $formAction $questionNavigationGUI->setDiscardSolutionButtonEnabled(true); // fau: testNav - set answere status in question header $questionGui->getQuestionHeaderBlockBuilder()->setQuestionAnswered(true); - // fau. + // fau. } elseif ($this->object->isPostponingEnabled()) { $questionNavigationGUI->setSkipQuestionLinkTarget( $this->ctrl->getLinkTarget($this, ilTestPlayerCommands::SKIP_QUESTION) @@ -1870,22 +1870,22 @@ protected function prepareSummaryPage() protected function initTestPageTemplate() { $onload_js = << { - if( event.key === 13 && event.target.tagName.toLowerCase() === "a" ) { - return; - } - if (event.key === 13 && - event.target.tagName.toLowerCase() !== "textarea" && - (event.target.tagName.toLowerCase() !== "input" || event.target.type.toLowerCase() !== "submit")) { - event.preventDefault(); - } - }; + let key_event = (event) => { + if( event.key === 13 && event.target.tagName.toLowerCase() === "a" ) { + return; + } + if (event.key === 13 && + event.target.tagName.toLowerCase() !== "textarea" && + (event.target.tagName.toLowerCase() !== "input" || event.target.type.toLowerCase() !== "submit")) { + event.preventDefault(); + } + }; - let form = document.getElementById('taForm'); - form.onkeyup = key_event; - form.onkeydown = key_event; - form.onkeypress = key_event; - JS; + let form = document.getElementById('taForm'); + form.onkeyup = key_event; + form.onkeydown = key_event; + form.onkeypress = key_event; +JS; $this->tpl->addOnLoadCode($onload_js); $this->tpl->addBlockFile( $this->getContentBlockName(), From 2c19f76eec92b36f490cf86b30e7ad4e0b3a8c49 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Wed, 31 Jan 2024 18:04:47 +0100 Subject: [PATCH 398/497] User: Fix Access to User When Org Units Enabled See: https://mantis.ilias.de/view.php?id=40261 --- Services/User/classes/class.ilObjUserGUI.php | 110 ++++++------------- 1 file changed, 34 insertions(+), 76 deletions(-) diff --git a/Services/User/classes/class.ilObjUserGUI.php b/Services/User/classes/class.ilObjUserGUI.php index a85942f6c04f..d3249dcc7b94 100755 --- a/Services/User/classes/class.ilObjUserGUI.php +++ b/Services/User/classes/class.ilObjUserGUI.php @@ -538,44 +538,7 @@ public function saveObject(): void */ public function editObject(): void { - /** @var ILIAS\DI\Container $DIC */ - global $DIC; - - $rbacsystem = $DIC->rbac()->system(); - $access = $DIC->access(); - - // User folder - // User folder && access granted by rbac or by org unit positions - if ($this->usrf_ref_id == USER_FOLDER_ID - && ( - !$rbacsystem->checkAccess('visible,read', $this->usrf_ref_id) - || !$rbacsystem->checkAccess('write', $this->usrf_ref_id) - && !$access->checkPositionAccess(\ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, $this->usrf_ref_id) - || $access->checkPositionAccess(\ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, $this->usrf_ref_id) - && !in_array( - $this->object->getId(), - $access->filterUserIdsByPositionOfCurrentUser( - \ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, - USER_FOLDER_ID, - [$this->object->getId()] - ) - ) - ) - ) { - $this->ilias->raiseError($this->lng->txt("msg_no_perm_modify_user"), $this->ilias->error_obj->MESSAGE); - } - - if ($this->usrf_ref_id == USER_FOLDER_ID and !$rbacsystem->checkAccess('visible,read', $this->usrf_ref_id)) { - $this->ilias->raiseError($this->lng->txt("msg_no_perm_modify_user"), $this->ilias->error_obj->MESSAGE); - } - // if called from local administration $this->usrf_ref_id is category id - // Todo: this has to be fixed. Do not mix user folder id and category id - if ($this->usrf_ref_id != USER_FOLDER_ID) { - // check if user is assigned to category - if (!$rbacsystem->checkAccess('cat_administrate_users', $this->object->getTimeLimitOwner())) { - $this->ilias->raiseError($this->lng->txt("msg_no_perm_modify_user"), $this->ilias->error_obj->MESSAGE); - } - } + $this->checkUserWriteRight(); if ($this->usrf_ref_id != USER_FOLDER_ID) { $this->tabs_gui->clearTargets(); @@ -782,44 +745,8 @@ protected function loadUserDefinedDataFromForm(?ilObjUser $user = null): void public function updateObject(): void { - global $DIC; - - $tpl = $DIC->ui()->mainTemplate(); - $rbacsystem = $DIC->rbac()->system(); - $ilUser = $DIC->user(); - $access = $DIC->access(); - - // User folder && access granted by rbac or by org unit positions - if ($this->usrf_ref_id == USER_FOLDER_ID && - ( - !$rbacsystem->checkAccess('visible,read', USER_FOLDER_ID) || - !$access->checkRbacOrPositionPermissionAccess( - 'write', - \ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, - USER_FOLDER_ID - ) || - !in_array( - $this->object->getId(), - $access->filterUserIdsByRbacOrPositionOfCurrentUser( - 'write', - \ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, - USER_FOLDER_ID, - [$this->object->getId()] - ) - ) - ) - ) { - $this->ilias->raiseError($this->lng->txt("msg_no_perm_modify_user"), $this->ilias->error_obj->MESSAGE); - } - // if called from local administration $this->usrf_ref_id is category id - // Todo: this has to be fixed. Do not mix user folder id and category id - if ($this->usrf_ref_id != USER_FOLDER_ID) { - // check if user is assigned to category - if (!$rbacsystem->checkAccess('cat_administrate_users', $this->object->getTimeLimitOwner())) { - $this->ilias->raiseError($this->lng->txt("msg_no_perm_modify_user"), $this->ilias->error_obj->MESSAGE); - } - } - $this->initForm("edit"); + $this->checkUserWriteRight(); + $this->initForm('edit'); // Manipulate form so ignore required fields are no more required. This has to be done before ilPropertyFormGUI::checkInput() is called. $profileMaybeIncomplete = false; @@ -2228,4 +2155,35 @@ protected function showAcceptedTermsOfService(): void $agreeDate->setValue($this->lng->txt('tos_not_accepted_yet')); } } + + private function checkUserWriteRight(): void + { + if ($this->usrf_ref_id == USER_FOLDER_ID + && ( + !$this->rbac_system->checkAccess('visible,read', $this->usrf_ref_id) + || !$this->rbac_system->checkAccess('write', $this->usrf_ref_id) + && ( + !$this->access->checkPositionAccess(\ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, $this->usrf_ref_id) + || $this->access->checkPositionAccess(\ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, $this->usrf_ref_id) + && !in_array( + $this->object->getId(), + $this->access->filterUserIdsByPositionOfCurrentUser( + \ilObjUserFolder::ORG_OP_EDIT_USER_ACCOUNTS, + USER_FOLDER_ID, + [$this->object->getId()] + ) + ) + ) + ) + ) { + $this->ilias->raiseError($this->lng->txt('msg_no_perm_modify_user'), $this->ilias->error_obj->MESSAGE); + } + + // if called from local administration $this->usrf_ref_id is category id + // Todo: this has to be fixed. Do not mix user folder id and category id + if ($this->usrf_ref_id != USER_FOLDER_ID + && !$this->rbac_system->checkAccess('cat_administrate_users', $this->object->getTimeLimitOwner())) { + $this->ilias->raiseError($this->lng->txt('msg_no_perm_modify_user'), $this->ilias->error_obj->MESSAGE); + } + } } From 47249e4988ca4c3d704dd6182c3e602a1a9eadb8 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Wed, 31 Jan 2024 18:26:53 +0100 Subject: [PATCH 399/497] RBAC: Fix Wrong OnScreenMessage-Type See: https://mantis.ilias.de/view.php?id=40321 --- Services/AccessControl/classes/class.ilObjRoleGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/AccessControl/classes/class.ilObjRoleGUI.php b/Services/AccessControl/classes/class.ilObjRoleGUI.php index 50ed4056a5f8..4a6245553acd 100755 --- a/Services/AccessControl/classes/class.ilObjRoleGUI.php +++ b/Services/AccessControl/classes/class.ilObjRoleGUI.php @@ -433,7 +433,7 @@ protected function permObject(bool $a_show_admin_permissions = false): void } if (!$this->checkAccess('write', 'edit_permission')) { - $this->tpl->setOnScreenMessage('msg_no_perm_write', $this->lng->txt('permission_denied'), true); + $this->tpl->setOnScreenMessage('failure', $this->lng->txt('msg_no_perm_write'), true); $this->ctrl->redirectByClass(ilRepositoryGUI::class); } From 14475e11c2c5291c52c5d252de14170f67c01633 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 31 Jan 2024 18:59:49 +0100 Subject: [PATCH 400/497] 40238: Course cannot be opened / content cannot be displayed --- Modules/ItemGroup/classes/class.ilItemGroupItems.php | 4 ++-- Services/Container/classes/class.ilContainer.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/ItemGroup/classes/class.ilItemGroupItems.php b/Modules/ItemGroup/classes/class.ilItemGroupItems.php index 9f6b4706bf2f..7a671d048671 100644 --- a/Modules/ItemGroup/classes/class.ilItemGroupItems.php +++ b/Modules/ItemGroup/classes/class.ilItemGroupItems.php @@ -155,11 +155,11 @@ public function getAssignableItems(): array // filter hidden files // see http://www.ilias.de/mantis/view.php?id=10269 if ($node['type'] == "file" && - ilObjFileAccess::_isFileHidden($node['title'])) { + ilObjFileAccess::_isFileHidden((string) $node['title'])) { continue; } - if ($objDefinition->isInactivePlugin($node['type'])) { + if ($objDefinition->isInactivePlugin((string) $node['type'])) { continue; } diff --git a/Services/Container/classes/class.ilContainer.php b/Services/Container/classes/class.ilContainer.php index 665fd49da7dd..2e956404595c 100755 --- a/Services/Container/classes/class.ilContainer.php +++ b/Services/Container/classes/class.ilContainer.php @@ -693,7 +693,7 @@ public function getSubItems( $object['type'], ['file', 'fold', 'cat'], true - ) && ilObjFileAccess::_isFileHidden($object['title'])) { + ) && ilObjFileAccess::_isFileHidden((string) $object['title'])) { $this->setHiddenFilesFound(true); if (!$a_admin_panel_enabled) { continue; @@ -703,7 +703,7 @@ public function getSubItems( // including event items! if (!self::$data_preloaded) { - $preloader->addItem($object["obj_id"], $object["type"], $object["child"]); + $preloader->addItem((int) $object["obj_id"], $object["type"], $object["child"]); } // filter side block items @@ -711,7 +711,7 @@ public function getSubItems( continue; } - $all_ref_ids[] = $object["child"]; + $all_ref_ids[] = (int) $object["child"]; } // data preloader From 47f922ae5f77d19676eb8504ac1646b1c4ebfae8 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Wed, 31 Jan 2024 20:34:45 +0100 Subject: [PATCH 401/497] Test: Fix No Input in Solution Needed See: https://mantis.ilias.de/view.php?id=37739 --- .../classes/class.assFormulaQuestion.php | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php b/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php index 579599facab7..ed25c92f0410 100755 --- a/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php +++ b/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php @@ -295,7 +295,8 @@ public function substituteVariables(array $userdata, bool $graphicalOutput = fal if (is_array($userdata) && isset($userdata[$result]) && isset($userdata[$result]["value"])) { - $input = $this->generateResultInputHtml($result, $userdata[$result]["value"]); + + $input = $this->generateResultInputHTML($result, $userdata[$result]["value"], $forsolution); } elseif ($forsolution) { $value = $resObj->calculateFormula($this->getVariables(), $this->getResults(), parent::getId()); $value = sprintf("%." . $resObj->getPrecision() . "f", $value); @@ -306,14 +307,11 @@ public function substituteVariables(array $userdata, bool $graphicalOutput = fal $frac_helper = $value[1]; $value = $value[0]; } - $value = ' value="' . $value . '"'; } - $input = '' . ilLegacyFormElementsUtil::prepareFormOutput( - $value - ) . ''; + $input = $this->generateResultInputHTML($result, $value, true); } else { - $input = $this->generateResultInputHTML($result, ''); + $input = $this->generateResultInputHTML($result, '', false); } $units = ""; @@ -354,7 +352,7 @@ public function substituteVariables(array $userdata, bool $graphicalOutput = fal $units .= ' ' . $this->lng->txt('expected_result_type') . ': ' . $this->lng->txt('result_dec'); break; case assFormulaQuestionResult::RESULT_FRAC: - if (strlen($frac_helper)) { + if ($frac_helper !== '') { $units .= ' ≈ ' . $frac_helper . ', '; } elseif (is_array($userdata) && array_key_exists($result, $userdata) && @@ -367,7 +365,7 @@ public function substituteVariables(array $userdata, bool $graphicalOutput = fal $units .= ' ' . $this->lng->txt('expected_result_type') . ': ' . $this->lng->txt('result_frac'); break; case assFormulaQuestionResult::RESULT_CO_FRAC: - if (strlen($frac_helper)) { + if ($frac_helper !== '') { $units .= ' ≈ ' . $frac_helper . ', '; } elseif (is_array($userdata) && isset($userdata[$result]) && isset($userdata[$result]["frac_helper"]) && $userdata[$result]["frac_helper"] !== '') { if (!preg_match('-/-', $value)) { @@ -454,8 +452,13 @@ public function substituteVariables(array $userdata, bool $graphicalOutput = fal return $text; } - protected function generateResultInputHTML(string $result_key, string $result_value): string + protected function generateResultInputHTML(string $result_key, string $result_value, bool $forsolution): string { + if ($forsolution) { + return '' + . ilLegacyFormElementsUtil::prepareFormOutput($result_value) + . ''; + } $input = ' Date: Thu, 1 Feb 2024 13:20:15 +0100 Subject: [PATCH 402/497] 8/UI fix focus outline for links across multiple lines 36738 (#6963) * UI/link focus multi-line fix 36738 * UI restored previous sub-tab focus behavior before link focus change --- templates/default/delos.css | 71 ++++++++++++++----- templates/default/delos.less | 8 ++- .../less/Services/UIComponent/Tabs/delos.less | 6 ++ .../default/less/bootstrap/focus-mixin.less | 15 ++++ templates/default/less/focus-mixin.css | 0 5 files changed, 80 insertions(+), 20 deletions(-) create mode 100644 templates/default/less/focus-mixin.css diff --git a/templates/default/delos.css b/templates/default/delos.css index 91872f5cedda..8f3305c4bda4 100644 --- a/templates/default/delos.css +++ b/templates/default/delos.css @@ -11191,7 +11191,7 @@ footer { grid-template-areas: "icon title close" "none description description" "none actions actions"; grid-template-columns: 20px 1fr 20px; grid-gap: 9px; - box-shadow: 3px 9px 9px 0 rgb(0 0 0); + box-shadow: 3px 9px 9px 0 rgba(0, 0, 0, 0.3); transform: translateX(150%); transition: all 0.25s ease-in-out; } @@ -12288,24 +12288,18 @@ a:hover { color: #3a4c65; text-decoration: underline; } -a:focus-visible { - position: relative; - outline: 2px solid #FFFFFF; - outline-offset: 4px; -} -a:focus-visible::after { - content: " "; - position: absolute; - top: -2px; - left: -2px; - right: -2px; - bottom: -2px; - border: 2px solid #FFFFFF; - outline: 3px solid #0078D7; +a:focus:focus-visible { + outline: none; } -a:active, -a.engaged { +a:focus-visible { outline: none; + border: 3px solid #0078D7; + box-shadow: inset 0px 0px 0px 2px #FFFFFF, 0px 0px 0px 2px #FFFFFF; + outline-offset: initial; +} +a::after, +a:focus:focus-visible::after { + content: none; } hr { margin-bottom: 0.8em; @@ -15119,6 +15113,25 @@ li.ilWikiBlockItem { font-size: 0.875rem; margin: 0; } +.nav-tabs > li > a:focus-visible { + position: relative; + outline: 2px solid #FFFFFF; + outline-offset: 4px; +} +.nav-tabs > li > a:focus-visible::after { + content: " "; + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + border: 2px solid #FFFFFF; + outline: 3px solid #0078D7; +} +.nav-tabs > li > a:active, +.nav-tabs > li > a.engaged { + outline: none; +} .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { @@ -15159,6 +15172,29 @@ li.ilWikiBlockItem { text-decoration: underline; background-color: transparent; } +#ilSubTab > li > a:focus-visible { + border: none; + box-shadow: none; +} +#ilSubTab > li > a:focus-visible { + position: relative; + outline: 2px solid #FFFFFF; + outline-offset: 4px; +} +#ilSubTab > li > a:focus-visible::after { + content: " "; + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + border: 2px solid #FFFFFF; + outline: 3px solid #0078D7; +} +#ilSubTab > li > a:active, +#ilSubTab > li > a.engaged { + outline: none; +} #ilSubTab > li.active > a, #ilSubTab > li.active > a:hover, #ilSubTab > li.active > a:focus { @@ -20001,3 +20037,4 @@ table.mceToolbar td { width: auto !important; } } +/*# sourceMappingURL=./delos.css.map */ \ No newline at end of file diff --git a/templates/default/delos.less b/templates/default/delos.less index f5369c36e66b..5eccda40c828 100644 --- a/templates/default/delos.less +++ b/templates/default/delos.less @@ -1,4 +1,4 @@ -//out: delos.css, sourcemap: true, compress: false +//out: delos.css, sourceMap: true, compress: false @import "less/font.less"; /* rtl-review is this font safe for RTL languages? */ @@ -491,8 +491,10 @@ a { color: @link-hover-color; text-decoration: underline; } - - .il-focus(); + &:focus:focus-visible { + outline: none; + } + .il-focus-border-only(); } hr { diff --git a/templates/default/less/Services/UIComponent/Tabs/delos.less b/templates/default/less/Services/UIComponent/Tabs/delos.less index 58005259fc11..2ef7f1853ee7 100644 --- a/templates/default/less/Services/UIComponent/Tabs/delos.less +++ b/templates/default/less/Services/UIComponent/Tabs/delos.less @@ -9,6 +9,7 @@ padding: @il-padding-large-vertical @il-padding-xlarge-horizontal @il-padding-base-vertical; font-size: @il-font-size-base; margin: 0; + .il-focus(); } &.active > a { &, @@ -64,6 +65,11 @@ text-decoration: underline; background-color: transparent; } + &:focus-visible { + border: none; + box-shadow: none; + } + .il-focus() } &.active > a { &, diff --git a/templates/default/less/bootstrap/focus-mixin.less b/templates/default/less/bootstrap/focus-mixin.less index 737e787661b8..3add34426840 100644 --- a/templates/default/less/bootstrap/focus-mixin.less +++ b/templates/default/less/bootstrap/focus-mixin.less @@ -28,6 +28,21 @@ } } +// ported from ILIAS 9 +.il-focus-border-only() { + &:focus-visible { + outline: none; + border: @il-focus-outline-inner; + box-shadow: inset 0px 0px 0px 2px @il-focus-protection-color, 0px 0px 0px 2px @il-focus-protection-color; + outline-offset: initial; + } + &::after, + &:focus:focus-visible::after { + content: none; + } +} + + .il-focus-after() { &::after { content: " "; diff --git a/templates/default/less/focus-mixin.css b/templates/default/less/focus-mixin.css new file mode 100644 index 000000000000..e69de29bb2d1 From 0fb87f6352ce4bb12e30b4e2d78e087d822f9d99 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 2 Feb 2024 06:38:23 +0100 Subject: [PATCH 403/497] 34295: Activ sub tab is not highlighted --- Services/COPage/classes/class.ilPCQuestionGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/COPage/classes/class.ilPCQuestionGUI.php b/Services/COPage/classes/class.ilPCQuestionGUI.php index ee703d29b9e9..a479d5525085 100755 --- a/Services/COPage/classes/class.ilPCQuestionGUI.php +++ b/Services/COPage/classes/class.ilPCQuestionGUI.php @@ -91,7 +91,7 @@ public function getSelfAssessmentMode(): bool return $this->selfassessmentmode; } - public function setInsertTabs(bool $a_active): void + public function setInsertTabs(string $a_active): void { $ilTabs = $this->tabs; $ilCtrl = $this->ctrl; From 9591d0fa6f069d1d818d959ff48050cdc0f504f6 Mon Sep 17 00:00:00 2001 From: mjansen Date: Wed, 31 Jan 2024 11:56:11 +0100 Subject: [PATCH 404/497] Cron: Fix timezone issues when determining due date This PR fixes timezone issues when comparing the "Last Run" datetime with the "Current" datetime. Furthermore, this PR removes infrastructure dependencies to `time()` by using the `ClockInterface` type instead. See: https://mantis.ilias.de/view.php?id=40302 Furthermore, this PR removes infrastructure dependencies See: https://mantis.ilias.de/view.php?id=40302 --- Services/Cron/classes/class.ilCronJob.php | 11 +-- .../classes/class.ilCronJobRepositoryImpl.php | 29 +++++--- .../Cron/classes/class.ilCronManagerImpl.php | 67 +++++++++++++------ .../interface.ilCronJobRepository.php | 9 +-- Services/Cron/test/CronJobManagerTest.php | 52 +++++++++++--- .../Init/classes/class.ilInitialisation.php | 3 +- 6 files changed, 122 insertions(+), 49 deletions(-) diff --git a/Services/Cron/classes/class.ilCronJob.php b/Services/Cron/classes/class.ilCronJob.php index 2d8d0b300c93..4df26b61f23b 100644 --- a/Services/Cron/classes/class.ilCronJob.php +++ b/Services/Cron/classes/class.ilCronJob.php @@ -1,7 +1,5 @@ date_time_provider !== null) { + if ($this->date_time_provider === null) { + $now = new DateTimeImmutable('@' . time(), new DateTimeZone(date_default_timezone_get())); + } else { $now = ($this->date_time_provider)(); } @@ -135,7 +136,7 @@ private function checkSchedule(?DateTimeImmutable $last_run, ?int $schedule_type } /** - * @param Closure|null $date_time_provider + * @param Closure():DateTimeInterface|null $date_time_provider */ public function setDateTimeProvider(?Closure $date_time_provider): void { diff --git a/Services/Cron/classes/class.ilCronJobRepositoryImpl.php b/Services/Cron/classes/class.ilCronJobRepositoryImpl.php index 10ea52a89bbf..969505fd8668 100644 --- a/Services/Cron/classes/class.ilCronJobRepositoryImpl.php +++ b/Services/Cron/classes/class.ilCronJobRepositoryImpl.php @@ -1,7 +1,5 @@ hasAutoActivation()) { - $this->activateJob($job); + $this->activateJob($job, new DateTimeImmutable('@' . time())); $job->activationWasToggled($this->db, $this->setting, true); } else { // to overwrite dependent settings @@ -314,6 +314,7 @@ public function resetJob(ilCronJob $job): void public function updateJobResult( ilCronJob $job, + DateTimeImmutable $when, ilObjUser $actor, ilCronJobResult $result, bool $wasManualExecution = false @@ -326,7 +327,7 @@ public function updateJobResult( ' , job_result_code = ' . $this->db->quote($result->getCode(), 'text') . ' , job_result_message = ' . $this->db->quote($result->getMessage(), 'text') . ' , job_result_type = ' . $this->db->quote((int) $wasManualExecution, 'integer') . - ' , job_result_ts = ' . $this->db->quote(time(), 'integer') . + ' , job_result_ts = ' . $this->db->quote($when->getTimestamp(), 'integer') . ' , job_result_dur = ' . $this->db->quote($result->getDuration() * 1000, 'integer') . ' WHERE job_id = ' . $this->db->quote($job->getId(), 'text'); $this->db->manipulate($query); @@ -354,8 +355,12 @@ public function updateJobSchedule(ilCronJob $job, ?int $scheduleType, ?int $sche } } - public function activateJob(ilCronJob $job, ?ilObjUser $actor = null, bool $wasManuallyExecuted = false): void - { + public function activateJob( + ilCronJob $job, + DateTimeImmutable $when, + ?ilObjUser $actor = null, + bool $wasManuallyExecuted = false + ): void { $usrId = 0; if ($wasManuallyExecuted && $actor instanceof ilObjUser) { $usrId = $actor->getId(); @@ -365,20 +370,24 @@ public function activateJob(ilCronJob $job, ?ilObjUser $actor = null, bool $wasM ' job_status = ' . $this->db->quote(1, 'integer') . ' , job_status_user_id = ' . $this->db->quote($usrId, 'integer') . ' , job_status_type = ' . $this->db->quote($wasManuallyExecuted, 'integer') . - ' , job_status_ts = ' . $this->db->quote(time(), 'integer') . + ' , job_status_ts = ' . $this->db->quote($when->getTimestamp(), 'integer') . ' WHERE job_id = ' . $this->db->quote($job->getId(), 'text'); $this->db->manipulate($query); } - public function deactivateJob(ilCronJob $job, ilObjUser $actor, bool $wasManuallyExecuted = false): void - { + public function deactivateJob( + ilCronJob $job, + DateTimeImmutable $when, + ilObjUser $actor, + bool $wasManuallyExecuted = false + ): void { $usrId = $wasManuallyExecuted ? $actor->getId() : 0; $query = 'UPDATE cron_job SET ' . ' job_status = ' . $this->db->quote(0, 'integer') . ' , job_status_user_id = ' . $this->db->quote($usrId, 'integer') . ' , job_status_type = ' . $this->db->quote($wasManuallyExecuted, 'integer') . - ' , job_status_ts = ' . $this->db->quote(time(), 'integer') . + ' , job_status_ts = ' . $this->db->quote($when->getTimestamp(), 'integer') . ' WHERE job_id = ' . $this->db->quote($job->getId(), 'text'); $this->db->manipulate($query); } diff --git a/Services/Cron/classes/class.ilCronManagerImpl.php b/Services/Cron/classes/class.ilCronManagerImpl.php index b89c57fe3caf..9809aeaab6dc 100644 --- a/Services/Cron/classes/class.ilCronManagerImpl.php +++ b/Services/Cron/classes/class.ilCronManagerImpl.php @@ -1,7 +1,5 @@ - * @ingroup ServicesCron - */ +declare(strict_types=1); + +use ILIAS\Data\Clock\ClockFactory; + class ilCronManagerImpl implements ilCronManager { private ilCronJobRepository $cronRepository; private ilDBInterface $db; private ilSetting $settings; private ilLogger $logger; + private ClockFactory $clock_factory; public function __construct( ilCronJobRepository $cronRepository, ilDBInterface $db, ilSetting $settings, - ilLogger $logger + ilLogger $logger, + ClockFactory $clock_factory ) { $this->cronRepository = $cronRepository; $this->db = $db; $this->settings = $settings; $this->logger = $logger; + $this->clock_factory = $clock_factory; } private function getMicrotime(): float { - [$usec, $sec] = explode(' ', microtime()); - return ((float) $usec + (float) $sec); + return ((int) $this->clock_factory->system()->now()->format('Uu')) / 1000000; } public function runActiveJobs(ilObjUser $actor): void { $this->logger->info('CRON - batch start'); - $ts = time(); + $ts = $this->clock_factory->system()->now()->getTimestamp(); $this->settings->set('last_cronjob_start_ts', (string) $ts); $useRelativeDates = ilDatePresentation::useRelativeDates(); @@ -133,6 +132,10 @@ private function runJob(ilCronJob $job, ilObjUser $actor, ?array $jobData = null $jobData = array_pop($jobsData); } + $job->setDateTimeProvider(function (): DateTimeImmutable { + return $this->clock_factory->system()->now(); + }); + // already running? if ($jobData['alive_ts']) { $this->logger->info('CRON - job ' . $jobData['job_id'] . ' still running'); @@ -140,7 +143,7 @@ private function runJob(ilCronJob $job, ilObjUser $actor, ?array $jobData = null $cut = 60 * 60 * 3; // is running (and has not pinged) for 3 hours straight, we assume it crashed - if (time() - ((int) $jobData['alive_ts']) > $cut) { + if ($this->clock_factory->system()->now()->getTimestamp() - ((int) $jobData['alive_ts']) > $cut) { $this->cronRepository->updateRunInformation($jobData['job_id'], 0, 0); $this->deactivateJob($job, $actor); // #13082 @@ -149,20 +152,32 @@ private function runJob(ilCronJob $job, ilObjUser $actor, ?array $jobData = null $result->setCode(ilCronJobResult::CODE_SUPPOSED_CRASH); $result->setMessage('Cron job deactivated because it has been inactive for 3 hours'); - $this->cronRepository->updateJobResult($job, $actor, $result, $isManualExecution); + $this->cronRepository->updateJobResult( + $job, + $this->clock_factory->system()->now(), + $actor, + $result, + $isManualExecution + ); $this->logger->info('CRON - job ' . $jobData['job_id'] . ' deactivated (assumed crash)'); } } // initiate run? elseif ($job->isDue( - $jobData['job_result_ts'] ? new DateTimeImmutable('@' . $jobData['job_result_ts']) : null, + $jobData['job_result_ts'] ? (new DateTimeImmutable( + '@' . $jobData['job_result_ts'] + ))->setTimezone($this->clock_factory->system()->now()->getTimezone()) : null, $jobData['schedule_type'] ? (int) $jobData['schedule_type'] : null, $jobData['schedule_value'] ? (int) $jobData['schedule_value'] : null, $isManualExecution )) { $this->logger->info('CRON - job ' . $jobData['job_id'] . ' started'); - $this->cronRepository->updateRunInformation($jobData['job_id'], time(), time()); + $this->cronRepository->updateRunInformation( + $jobData['job_id'], + $this->clock_factory->system()->now()->getTimestamp(), + $this->clock_factory->system()->now()->getTimestamp() + ); $ts_in = $this->getMicrotime(); try { @@ -190,7 +205,13 @@ private function runJob(ilCronJob $job, ilObjUser $actor, ?array $jobData = null $result->setDuration($ts_dur); - $this->cronRepository->updateJobResult($job, $actor, $result, $isManualExecution); + $this->cronRepository->updateJobResult( + $job, + $this->clock_factory->system()->now(), + $actor, + $result, + $isManualExecution + ); $this->cronRepository->updateRunInformation($jobData['job_id'], 0, 0); $this->logger->info('CRON - job ' . $jobData['job_id'] . ' finished'); @@ -208,7 +229,13 @@ public function resetJob(ilCronJob $job, ilObjUser $actor): void $result->setCode(ilCronJobResult::CODE_MANUAL_RESET); $result->setMessage('Cron job re-activated by admin'); - $this->cronRepository->updateJobResult($job, $actor, $result, true); + $this->cronRepository->updateJobResult( + $job, + $this->clock_factory->system()->now(), + $actor, + $result, + true + ); $this->cronRepository->resetJob($job); $this->activateJob($job, $actor, true); @@ -216,13 +243,13 @@ public function resetJob(ilCronJob $job, ilObjUser $actor): void public function activateJob(ilCronJob $job, ilObjUser $actor, bool $wasManuallyExecuted = false): void { - $this->cronRepository->activateJob($job, $actor, $wasManuallyExecuted); + $this->cronRepository->activateJob($job, $this->clock_factory->system()->now(), $actor, $wasManuallyExecuted); $job->activationWasToggled($this->db, $this->settings, true); } public function deactivateJob(ilCronJob $job, ilObjUser $actor, bool $wasManuallyExecuted = false): void { - $this->cronRepository->deactivateJob($job, $actor, $wasManuallyExecuted); + $this->cronRepository->deactivateJob($job, $this->clock_factory->system()->now(), $actor, $wasManuallyExecuted); $job->activationWasToggled($this->db, $this->settings, false); } @@ -245,7 +272,7 @@ public function ping(string $jobId): void $this->db->manipulateF( 'UPDATE cron_job SET alive_ts = %s WHERE job_id = %s', ['integer', 'text'], - [time(), $jobId] + [$this->clock_factory->system()->now()->getTimestamp(), $jobId] ); } } diff --git a/Services/Cron/interfaces/interface.ilCronJobRepository.php b/Services/Cron/interfaces/interface.ilCronJobRepository.php index 8ebe4d487b40..be6a2b8f990b 100644 --- a/Services/Cron/interfaces/interface.ilCronJobRepository.php +++ b/Services/Cron/interfaces/interface.ilCronJobRepository.php @@ -1,7 +1,5 @@ createMock(ILIAS\Data\Clock\ClockFactory::class); + $now = new DateTimeImmutable('@' . time()); + $clock_factory->method('system')->willReturn( + new class ($now) implements \ILIAS\Data\Clock\ClockInterface { + private DateTimeImmutable $now; + + public function __construct(DateTimeImmutable $now) + { + $this->now = $now; + } + + public function now(): DateTimeImmutable + { + return $this->now; + } + } + ); + + return $clock_factory; + } + public function testCronManagerActivatesJobWhenJobWasReset(): void { $db = $this->createMock(ilDBInterface::class); @@ -34,15 +57,19 @@ public function testCronManagerActivatesJobWhenJobWasReset(): void ->onlyMethods(['getId']) ->getMock(); + $clock_factory = $this->createClockFactoryMock(); + $cronManager = new ilCronManagerImpl( $repository, $db, $setting, - $logger + $logger, + $clock_factory ); $repository->expects($this->once())->method('updateJobResult')->with( $job, + $clock_factory->system()->now(), $user, $this->isInstanceOf(ilCronJobResult::class), true @@ -54,6 +81,7 @@ public function testCronManagerActivatesJobWhenJobWasReset(): void $repository->expects($this->once())->method('activateJob')->with( $job, + $clock_factory->system()->now(), $user, true ); @@ -79,16 +107,19 @@ public function testCronManagerNotifiesJobWhenJobGetsActivated(): void ->onlyMethods(['getId']) ->getMock(); + $clock_factory = $this->createClockFactoryMock(); + $cronManager = new ilCronManagerImpl( $repository, $db, $setting, - $logger + $logger, + $clock_factory ); $repository->expects($this->exactly(2))->method('activateJob')->withConsecutive( - [$job, $user, true], - [$job, $user, false] + [$job, $clock_factory->system()->now(), $user, true], + [$job, $clock_factory->system()->now(), $user, false] ); $job->expects($this->exactly(2))->method('activationWasToggled')->with( @@ -113,16 +144,19 @@ public function testCronManagerNotifiesJobWhenJobGetsDeactivated(): void ->onlyMethods(['getId']) ->getMock(); + $clock_factory = $this->createClockFactoryMock(); + $cronManager = new ilCronManagerImpl( $repository, $db, $setting, - $logger + $logger, + $clock_factory ); $repository->expects($this->exactly(2))->method('deactivateJob')->withConsecutive( - [$job, $user, true], - [$job, $user, false] + [$job, $clock_factory->system()->now(), $user, true], + [$job, $clock_factory->system()->now(), $user, false] ); $job->expects($this->exactly(2))->method('activationWasToggled')->with( diff --git a/Services/Init/classes/class.ilInitialisation.php b/Services/Init/classes/class.ilInitialisation.php index c08db2c1e513..b519e3c0896e 100644 --- a/Services/Init/classes/class.ilInitialisation.php +++ b/Services/Init/classes/class.ilInitialisation.php @@ -707,7 +707,8 @@ protected static function initCron(\ILIAS\DI\Container $c): void $c['cron.repository'], $c->database(), $c->settings(), - $c->logger()->cron() + $c->logger()->cron(), + (new \ILIAS\Data\Factory())->clock() ); }; } From fcb600fdee19c605bcbe0f445bcf9bb4df571483 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Fri, 2 Feb 2024 10:20:31 +0100 Subject: [PATCH 405/497] Test: Fix Adding Original Id to Long Menu Question See: https://mantis.ilias.de/view.php?id=40252 --- Modules/TestQuestionPool/classes/class.assLongMenu.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assLongMenu.php b/Modules/TestQuestionPool/classes/class.assLongMenu.php index 3d70f5bc0f0f..85fe35ea3178 100644 --- a/Modules/TestQuestionPool/classes/class.assLongMenu.php +++ b/Modules/TestQuestionPool/classes/class.assLongMenu.php @@ -178,9 +178,9 @@ public function isComplete(): bool return false; } - public function saveToDb(): void + public function saveToDb(int $original_id = -1): void { - $this->saveQuestionDataToDb(-1); + $this->saveQuestionDataToDb($original_id); $this->saveAdditionalQuestionDataToDb(); $this->saveAnswerSpecificDataToDb(); parent::saveToDb(); From 2ee1961870b5b0540b272d92c2438e3430205466 Mon Sep 17 00:00:00 2001 From: mjansen Date: Fri, 2 Feb 2024 11:54:19 +0100 Subject: [PATCH 406/497] Cron: Clear results for deactivation --- Services/Cron/classes/class.ilCronJobRepositoryImpl.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Services/Cron/classes/class.ilCronJobRepositoryImpl.php b/Services/Cron/classes/class.ilCronJobRepositoryImpl.php index 969505fd8668..770006633cc7 100644 --- a/Services/Cron/classes/class.ilCronJobRepositoryImpl.php +++ b/Services/Cron/classes/class.ilCronJobRepositoryImpl.php @@ -385,6 +385,10 @@ public function deactivateJob( $query = 'UPDATE cron_job SET ' . ' job_status = ' . $this->db->quote(0, 'integer') . + ' , job_result_status = ' . $this->db->quote(null, 'text') . + ' , job_result_message = ' . $this->db->quote(null, 'text') . + ' , job_result_type = ' . $this->db->quote(null, 'text') . + ' , job_result_code = ' . $this->db->quote(null, 'text') . ' , job_status_user_id = ' . $this->db->quote($usrId, 'integer') . ' , job_status_type = ' . $this->db->quote($wasManuallyExecuted, 'integer') . ' , job_status_ts = ' . $this->db->quote($when->getTimestamp(), 'integer') . From 7bb245c57cad9c64022fce77af66428e5ed67ba9 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Fri, 2 Feb 2024 13:50:43 +0100 Subject: [PATCH 407/497] Test: Fix Presentation in Corrections See: https://mantis.ilias.de/view.php?id=40244 --- .../classes/class.assErrorTextGUI.php | 2 +- .../class.ilAnswerFrequencyStatisticTableGUI.php | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assErrorTextGUI.php b/Modules/TestQuestionPool/classes/class.assErrorTextGUI.php index 8bf515dd61f6..4af063698a3e 100644 --- a/Modules/TestQuestionPool/classes/class.assErrorTextGUI.php +++ b/Modules/TestQuestionPool/classes/class.assErrorTextGUI.php @@ -509,7 +509,7 @@ public function getAnswersFrequency($relevant_answers, $question_index): array $answers = []; foreach ($answers_by_active_and_pass as $answer) { - $error_text = $this->object->assembleErrorTextOutput($answer); + $error_text = '
' . $this->object->assembleErrorTextOutput($answer) . '
'; $error_text_hashed = md5($error_text); if (!isset($answers[$error_text_hashed])) { diff --git a/Modules/TestQuestionPool/classes/tables/class.ilAnswerFrequencyStatisticTableGUI.php b/Modules/TestQuestionPool/classes/tables/class.ilAnswerFrequencyStatisticTableGUI.php index 014efdacaf50..ba487b58f6e8 100644 --- a/Modules/TestQuestionPool/classes/tables/class.ilAnswerFrequencyStatisticTableGUI.php +++ b/Modules/TestQuestionPool/classes/tables/class.ilAnswerFrequencyStatisticTableGUI.php @@ -141,7 +141,7 @@ public function initColumns(): void public function fillRow(array $a_set): void { $this->tpl->setCurrentBlock('answer'); - $this->tpl->setVariable('ANSWER', ilLegacyFormElementsUtil::prepareFormOutput($a_set['answer'])); + $this->tpl->setVariable('ANSWER', ilHtmlPurifierFactory::getInstanceByType('qpl_usersolution')->purify($a_set['answer'])); $this->tpl->parseCurrentBlock(); $this->tpl->setCurrentBlock('frequency'); @@ -183,4 +183,18 @@ protected function buildAddAnswerAction($data): string return $ui_renderer->render($show_modal_button); } + + protected function purifyAndPrepareTextAreaOutput(string $content): string + { + $purified_content = $this->getHtmlQuestionContentPurifier()->purify($content); + if ($this->isAdditionalContentEditingModePageObject() + || !(new ilSetting('advanced_editing'))->get('advanced_editing_javascript_editor') === 'tinymce') { + $purified_content = nl2br($purified_content); + } + return ilLegacyFormElementsUtil::prepareTextareaOutput( + $purified_content, + true, + true + ); + } } From 80c05c31bf6dc8a1d90733a9adcdf2347976123a Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Fri, 2 Feb 2024 14:54:33 +0100 Subject: [PATCH 408/497] [FIX] 0039630: ILIAS inaccassible after activating memcached --- .../Cache/class.arObjectCache.php | 40 +++++-------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/Services/ActiveRecord/Cache/class.arObjectCache.php b/Services/ActiveRecord/Cache/class.arObjectCache.php index 400d837569aa..a747d19e650f 100644 --- a/Services/ActiveRecord/Cache/class.arObjectCache.php +++ b/Services/ActiveRecord/Cache/class.arObjectCache.php @@ -1,18 +1,21 @@ getCacheIdentifier() !== '') { - if ($instance->getCache()->exists($instance->getCacheIdentifier())) { - return true; - } - } - if (!isset(self::$cache[$class])) { return false; } @@ -47,11 +43,6 @@ public static function isCached($class, $id): bool public static function store(ActiveRecord $object): void { - if ($object instanceof CachedActiveRecord && $object->getCacheIdentifier() !== '') { - if ($object->getCache()->set($object->getCacheIdentifier(), $object, $object->getTTL())) { - return; - } - } if (!isset($object->is_new)) { self::$cache[get_class($object)][$object->getPrimaryFieldValue()] = $object; } @@ -75,11 +66,6 @@ public static function printStats(): void public static function get($class, $id): \ActiveRecord { $instance = new $class(); - if ($instance instanceof CachedActiveRecord && $instance->getCacheIdentifier() !== '') { - if ($instance->getCache()->exists($instance->getCacheIdentifier())) { - return $instance->getCache()->get($instance->getCacheIdentifier()); - } - } if (!self::isCached($class, $id)) { throw new arException(arException::GET_UNCACHED_OBJECT, $class . ': ' . $id); } @@ -89,9 +75,6 @@ public static function get($class, $id): \ActiveRecord public static function purge(ActiveRecord $object): void { - if ($object instanceof CachedActiveRecord && $object->getCacheIdentifier() !== '') { - $object->getCache()->delete($object->getCacheIdentifier()); - } unset(self::$cache[get_class($object)][$object->getPrimaryFieldValue()]); } @@ -100,11 +83,6 @@ public static function purge(ActiveRecord $object): void */ public static function flush($class_name): void { - $instance = new $class_name(); - if ($instance instanceof CachedActiveRecord && $instance->getCacheIdentifier() !== '') { - $instance->getCache()->flush(); - } - if ($class_name instanceof ActiveRecord) { $class_name = get_class($class_name); } From 1578acfc99873a369761cdb3ebbeb2563a3d6183 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Fri, 2 Feb 2024 15:19:20 +0100 Subject: [PATCH 409/497] Test: Fix Formula Question See: https://mantis.ilias.de/view.php?id=39490 --- .../TestQuestionPool/classes/class.assFormulaQuestion.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php b/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php index ed25c92f0410..08dd8ae6449d 100755 --- a/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php +++ b/Modules/TestQuestionPool/classes/class.assFormulaQuestion.php @@ -298,8 +298,11 @@ public function substituteVariables(array $userdata, bool $graphicalOutput = fal $input = $this->generateResultInputHTML($result, $userdata[$result]["value"], $forsolution); } elseif ($forsolution) { - $value = $resObj->calculateFormula($this->getVariables(), $this->getResults(), parent::getId()); - $value = sprintf("%." . $resObj->getPrecision() . "f", $value); + $value = ''; + if (!is_array($userdata)) { + $value = $resObj->calculateFormula($this->getVariables(), $this->getResults(), parent::getId()); + $value = sprintf("%." . $resObj->getPrecision() . "f", $value); + } if ($is_frac) { $value = assFormulaQuestionResult::convertDecimalToCoprimeFraction($value); From 308042bc0d4a3ca1ca5dee399ebd2915d6292c59 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Tue, 16 Jan 2024 14:42:30 +0100 Subject: [PATCH 410/497] Object: handle reloading table in creation via copy better (33815) --- .../Object/classes/class.ilObjectCopyGUI.php | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Services/Object/classes/class.ilObjectCopyGUI.php b/Services/Object/classes/class.ilObjectCopyGUI.php index e730d04dd14f..28a6be6edd43 100644 --- a/Services/Object/classes/class.ilObjectCopyGUI.php +++ b/Services/Object/classes/class.ilObjectCopyGUI.php @@ -594,19 +594,20 @@ protected function searchSource(): void ilSession::set('source_query', $this->post_wrapper->retrieve("tit", $this->refinery->kindlyTo()->string())); } - $this->initFormSearch(); - $this->form->setValuesByPost(); + $tit = ilSession::get('source_query', ''); + if ($tit === "") { + $this->initFormSearch(); + $this->form->setValuesByPost(); - if (!$this->form->checkInput()) { - $this->tpl->setOnScreenMessage('failure', $this->lng->txt('msg_no_search_string'), true); - $this->ctrl->returnToParent($this); - return; - } + if (!$this->form->checkInput()) { + $this->tpl->setOnScreenMessage('failure', $this->lng->txt('msg_no_search_string'), true); + $this->ctrl->returnToParent($this); + return; + } - $tit = $this->form->getInput('tit'); - if ($tit === "") { - $tit = ilSession::get('source_query', ''); + $tit = $this->form->getInput('tit'); } + $query_parser = new ilQueryParser($tit); $query_parser->setMinWordLength(1); $query_parser->setCombination(ilQueryParser::QP_COMBINATION_AND); From e988f5b5b85143e9c86cd5c5aef989cc835aa651 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 2 Feb 2024 17:02:07 +0100 Subject: [PATCH 411/497] 34446: Start before Enddate --- .../class.SectionCommandActionHandler.php | 17 ++++++++++++++- .../page/ui/page-ui-action-handler.js | 10 +++++++-- .../COPage/classes/class.ilPCSectionGUI.php | 21 +++++++++++++++++++ lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 5 files changed, 47 insertions(+), 3 deletions(-) diff --git a/Services/COPage/Editor/Components/Section/class.SectionCommandActionHandler.php b/Services/COPage/Editor/Components/Section/class.SectionCommandActionHandler.php index 6e36ee708563..2041ce534b11 100644 --- a/Services/COPage/Editor/Components/Section/class.SectionCommandActionHandler.php +++ b/Services/COPage/Editor/Components/Section/class.SectionCommandActionHandler.php @@ -26,6 +26,7 @@ */ class SectionCommandActionHandler implements Server\CommandActionHandler { + protected \ilCtrlInterface $ctrl; protected \ILIAS\DI\UIServices $ui; protected \ilLanguage $lng; protected \ilPageObjectGUI $page_gui; @@ -38,6 +39,7 @@ public function __construct(\ilPageObjectGUI $page_gui) $this->ui = $DIC->ui(); $this->lng = $DIC->language(); + $this->ctrl = $DIC->ctrl(); $this->page_gui = $page_gui; $this->user = $DIC->user(); @@ -95,15 +97,28 @@ protected function updateCommand(array $body): Server\Response $hier_id = $page->getHierIdForPcId($body["pcid"]); $sec = $page->getContentObjectForPcId($body["pcid"]); $sec_gui = new \ilPCSectionGUI($page, $sec, $hier_id, $body["pcid"]); + $sec_gui->setStyleId($this->page_gui->getStyleId()); $sec_gui->setPageConfig($page->getPageConfig()); $form = $sec_gui->initForm(false); // note: we have everyting in _POST here, form works the usual way $updated = true; - if ($form->checkInput()) { + if ($sec_gui->checkInput($form)) { $sec_gui->setValuesFromForm($form); $updated = $page->update(); + } else { + $html = $this->ctrl->getHTML( + $sec_gui, + [ + "form" => true, + "ui_wrapper" => $this->ui_wrapper, + "update_fail" => true, + "buttons" => [["Page", "component.update", $this->lng->txt("save")], + ["Page", "component.cancel", $this->lng->txt("cancel")]] + ] + ); + return $this->ui_wrapper->sendFormError($html); } return $this->ui_wrapper->sendPage($this->page_gui, $updated); diff --git a/Services/COPage/Editor/js/src/components/page/ui/page-ui-action-handler.js b/Services/COPage/Editor/js/src/components/page/ui/page-ui-action-handler.js index 3dc122bf72df..34408f19c789 100644 --- a/Services/COPage/Editor/js/src/components/page/ui/page-ui-action-handler.js +++ b/Services/COPage/Editor/js/src/components/page/ui/page-ui-action-handler.js @@ -428,8 +428,14 @@ export default class PageUIActionHandler { ); this.client.sendCommand(update_action).then(result => { - this.ui.handlePageReloadResponse(result); - dispatch.dispatch(af.page().editor().enablePageEditing()); + const p = result.payload; + if (p.formError) { + //document.querySelector(".copg-new-content-placeholder img").outerHTML = this.ui.uiModel.components[model.getCurrentPCName()].icon; + this.ui.showFormAfterError(p.form); + } else { + this.ui.handlePageReloadResponse(result); + dispatch.dispatch(af.page().editor().enablePageEditing()); + } }); } diff --git a/Services/COPage/classes/class.ilPCSectionGUI.php b/Services/COPage/classes/class.ilPCSectionGUI.php index 2f7e9dcfc4e7..e7c00112798f 100755 --- a/Services/COPage/classes/class.ilPCSectionGUI.php +++ b/Services/COPage/classes/class.ilPCSectionGUI.php @@ -75,6 +75,11 @@ public function getHTML(array $params): string $onload_code = array_merge($onload_code, $rep_sel->getOnloadCode()); } + if (($params["update_fail"] ?? false) === true) { + $this->checkInput($form); + $form->setValuesByPost(); + } + $html = $params["ui_wrapper"]->getRenderedForm( $form, $params["buttons"] @@ -89,6 +94,22 @@ public function getHTML(array $params): string return ""; } + public function checkInput(ilPropertyFormGUI $form) : bool + { + $ret = $form->checkInput(); + if ($ret) { + $from = $form->getItemByPostVar("active_from")->getDate(); + $to = $form->getItemByPostVar("active_to")->getDate(); + if ($from && $to && $from->get(IL_CAL_UNIX) > $to->get(IL_CAL_UNIX)) { + $form->getItemByPostVar("active_to")->setAlert( + $this->lng->txt("copg_active_to_small") + ); + $ret = false; + } + } + return $ret; + } + public static function _getStandardCharacteristics(): array { global $DIC; diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 9b672e422b48..70be70e31eac 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -7246,6 +7246,7 @@ copa#:#copa_prop_reading_time#:#Lesezeit copa#:#copa_value_reading_time_f_p#:#%s Minuten copa#:#copa_value_reading_time_f_s#:#%s Minute copa#:#obj_copa_duplicate#:#Inhaltsseite duplizieren +copg#:#copg_active_to_small#:#Dieses Datum muss größer als das "Aktiv ab" Datum sein. copg#:#copg_allow_html#:#HTML/Javascript erlauben copg#:#copg_allow_html_info#:#Benutzer 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 Benutzern verwendet werden. Die Möglichkeit, HTML in dieser Art einzubinden, wird möglicherweise in einer zukünftigen Version komplett entfallen. copg#:#copg_an_error_occured#:#Es ist leider ein Problem aufgetreten. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index d9820d3371f1..c8bf63b89dd7 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -7246,6 +7246,7 @@ copa#:#copa_prop_reading_time#:#Reading Time copa#:#copa_value_reading_time_f_p#:#%s Minutes copa#:#copa_value_reading_time_f_s#:#%s Minute copa#:#obj_copa_duplicate#:#Duplicate Content Page +copg#:#copg_active_to_small#:#This date must be higher than the starting date. copg#:#copg_allow_html#:#Enable HTML/Javascript copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version. copg#:#copg_an_error_occured#:#An error occured. From f5cfb7c37e1946037ef7a5e6e643e8b612679896 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Fri, 2 Feb 2024 17:14:12 +0100 Subject: [PATCH 412/497] Test: Fix Learning Progress Settings See: https://mantis.ilias.de/view.php?id=40149 --- Modules/Test/classes/class.ilObjTest.php | 1 + ...ass.ilObjTestSettingsScoringResultsGUI.php | 2 +- Modules/Test/classes/class.ilTestLP.php | 46 +++++++++-------- .../status/class.ilLPStatusTestFinished.php | 4 -- .../status/class.ilLPStatusTestPassed.php | 49 ++++++++----------- lang/ilias_de.lang | 2 + lang/ilias_en.lang | 2 + 7 files changed, 52 insertions(+), 54 deletions(-) diff --git a/Modules/Test/classes/class.ilObjTest.php b/Modules/Test/classes/class.ilObjTest.php index 437fc29412f4..e21ef59643c8 100755 --- a/Modules/Test/classes/class.ilObjTest.php +++ b/Modules/Test/classes/class.ilObjTest.php @@ -10556,6 +10556,7 @@ public function recalculateScores($preserve_manscoring = false) $scoring = new ilTestScoring($this); $scoring->setPreserveManualScores($preserve_manscoring); $scoring->recalculateSolutions(); + ilLPStatusWrapper::_updateStatus($this->getId(), $this->user->getId()); } public static function getTestObjIdsWithActiveForUserId($userId): array diff --git a/Modules/Test/classes/class.ilObjTestSettingsScoringResultsGUI.php b/Modules/Test/classes/class.ilObjTestSettingsScoringResultsGUI.php index b3893242b90d..fb44499da0bd 100644 --- a/Modules/Test/classes/class.ilObjTestSettingsScoringResultsGUI.php +++ b/Modules/Test/classes/class.ilObjTestSettingsScoringResultsGUI.php @@ -159,7 +159,7 @@ public function executeCommand() ->getData(); $this->storeScoreSettings($settings); $this->testOBJ->recalculateScores(true); - $this->tpl->setOnScreenMessage('success', $this->lng->txt("msg_obj_modified_and_recalc"), true); + $this->tpl->setOnScreenMessage('success', $this->lng->txt("msg_score_settings_modified_and_recalc"), true); $this->ctrl->redirect($this, self::CMD_SHOW_FORM); break; case self::CMD_CANCEL_RECALC: diff --git a/Modules/Test/classes/class.ilTestLP.php b/Modules/Test/classes/class.ilTestLP.php index 84ca3d4c5a58..cfd1fe444eca 100644 --- a/Modules/Test/classes/class.ilTestLP.php +++ b/Modules/Test/classes/class.ilTestLP.php @@ -76,7 +76,7 @@ public function setTestObject(\ilObjTest $test) $this->testObj = $test; } - protected function resetCustomLPDataForUserIds(array $a_user_ids, bool $a_recursive = true): void + protected function resetCustomLPDataForUserIds(array $user_ids, bool $recursive = true): void { /* @var ilObjTest $testOBJ */ if ($this->testObj) { @@ -85,32 +85,36 @@ protected function resetCustomLPDataForUserIds(array $a_user_ids, bool $a_recurs } else { $testOBJ = ilObjectFactory::getInstanceByObjId($this->obj_id); } - $testOBJ->removeTestResultsByUserIds($a_user_ids); + $testOBJ->removeTestResultsByUserIds($user_ids); // :TODO: there has to be a better way - $test_ref_id = (int) $this->request->raw("ref_id"); + $test_ref_id = $this->request->int('ref_id'); if ($this->testObj && $this->testObj->getRefId()) { $test_ref_id = $this->testObj->getRefId(); } - if ($test_ref_id) { - $course_obj_id = ilLOTestAssignments::lookupContainerForTest($test_ref_id); - if ($course_obj_id) { - // remove objective results data - $lo_assignments = ilLOTestAssignments::getInstance($course_obj_id); - ilLOUserResults::deleteResultsFromLP( - $course_obj_id, - $a_user_ids, - $lo_assignments->getTypeByTest($test_ref_id) === ilLOSettings::TYPE_TEST_INITIAL, - $lo_assignments->getTypeByTest($test_ref_id) === ilLOSettings::TYPE_TEST_QUALIFIED, - ilLOTestAssignments::lookupObjectivesForTest($test_ref_id) - ); - $lp_status = ilLPStatusFactory::_getInstance($course_obj_id); - if (strtolower(get_class($lp_status)) != "illpstatus") { - foreach ($a_user_ids as $user_id) { - $lp_status->_updateStatus($course_obj_id, $user_id); - } - } + if ($test_ref_id === 0) { + return; + } + + $course_obj_id = ilLOTestAssignments::lookupContainerForTest($test_ref_id); + if ($course_obj_id === 0) { + return; + } + + // remove objective results data + $lo_assignments = ilLOTestAssignments::getInstance($course_obj_id); + ilLOUserResults::deleteResultsFromLP( + $course_obj_id, + $user_ids, + $lo_assignments->getTypeByTest($test_ref_id) === ilLOSettings::TYPE_TEST_INITIAL, + $lo_assignments->getTypeByTest($test_ref_id) === ilLOSettings::TYPE_TEST_QUALIFIED, + ilLOTestAssignments::lookupObjectivesForTest($test_ref_id) + ); + $lp_status = ilLPStatusFactory::_getInstance($course_obj_id); + if (strtolower(get_class($lp_status)) !== 'illpstatus') { + foreach ($user_ids as $user_id) { + $lp_status->_updateStatus($course_obj_id, $user_id); } } } diff --git a/Services/Tracking/classes/status/class.ilLPStatusTestFinished.php b/Services/Tracking/classes/status/class.ilLPStatusTestFinished.php index 5ca4571ab1fe..7b65f7238dec 100644 --- a/Services/Tracking/classes/status/class.ilLPStatusTestFinished.php +++ b/Services/Tracking/classes/status/class.ilLPStatusTestFinished.php @@ -115,10 +115,6 @@ public function determineStatus( int $a_usr_id, object $a_obj = null ): int { - global $DIC; - - $ilDB = $DIC['ilDB']; - $res = $this->db->query( " SELECT active_id, user_fi, tries, COUNT(tst_sequence.active_fi) sequences diff --git a/Services/Tracking/classes/status/class.ilLPStatusTestPassed.php b/Services/Tracking/classes/status/class.ilLPStatusTestPassed.php index a2fdc2125e41..04a47d3195e2 100644 --- a/Services/Tracking/classes/status/class.ilLPStatusTestPassed.php +++ b/Services/Tracking/classes/status/class.ilLPStatusTestPassed.php @@ -77,10 +77,6 @@ public function determineStatus( int $a_usr_id, object $a_obj = null ): int { - global $DIC; - - $ilDB = $DIC['ilDB']; - $old_status = ilLPStatus::_lookupStatus($a_obj_id, $a_usr_id, false); $status = self::LP_STATUS_NOT_ATTEMPTED_NUM; @@ -105,26 +101,27 @@ public function determineStatus( " ); - if ($rec = $this->db->fetchAssoc($res)) { - if ($rec['sequences'] > 0) { - $test_obj = new ilObjTest($a_obj_id, false); - $is_passed = ilObjTestAccess::_isPassed($a_usr_id, $a_obj_id); - - if ($test_obj->getPassScoring() == SCORE_LAST_PASS) { - $is_finished = false; - if ($rec['last_finished_pass'] != null && $rec['sequences'] - 1 == $rec['last_finished_pass']) { - $is_finished = true; - } - $status = $this->determineStatusForScoreLastPassTests( - $is_finished, - $is_passed - ); - } elseif ($test_obj->getPassScoring() == SCORE_BEST_PASS) { - $status = self::LP_STATUS_IN_PROGRESS_NUM; - - if ($rec['last_finished_pass'] != null) { - $status = $this->determineLpStatus($is_passed); - } + if ( + ($rec = $this->db->fetchAssoc($res)) + && $rec['sequences'] > 0 + ) { + $test_obj = new ilObjTest($a_obj_id, false); + $is_passed = ilObjTestAccess::_isPassed($a_usr_id, $a_obj_id); + + if ($test_obj->getPassScoring() === SCORE_LAST_PASS) { + $is_finished = false; + if ($rec['last_finished_pass'] !== null && $rec['sequences'] - 1 === $rec['last_finished_pass']) { + $is_finished = true; + } + $status = $this->determineStatusForScoreLastPassTests( + $is_finished, + $is_passed + ); + } elseif ($test_obj->getPassScoring() === SCORE_BEST_PASS) { + $status = self::LP_STATUS_IN_PROGRESS_NUM; + + if ($rec['last_finished_pass'] !== null) { + $status = $this->determineLpStatus($is_passed); } } } @@ -167,10 +164,6 @@ public function determinePercentage( int $a_usr_id, ?object $a_obj = null ): int { - global $DIC; - - $ilDB = $DIC['ilDB']; - $set = $this->db->query( "SELECT tst_result_cache.*, tst_active.user_fi FROM " . "tst_result_cache JOIN tst_active ON (tst_active.active_id = tst_result_cache.active_fi)" . diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 70be70e31eac..04ad361357ab 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -926,6 +926,8 @@ assessment#:#msg_number_of_terms_too_low#:#Die Anzahl der Terme muss größer od assessment#:#msg_poly_added#:#Polygon hinzugefügt assessment#:#msg_questions_moved#:#Fragen verschoben assessment#:#msg_rect_added#:#Rechteck hinzugefügt +assessment#:#msg_score_settings_modified_and_recalc#:#Die Einstellungen wurden gespeichert und die Resultate neu berechnet. +assessment#:#msg_score_settings_not_modified#:#Die Einstellungen wurden nicht gespeichert. assessment#:#msg_selected_for_move#:#Fragen zum Verschieben ausgewählt assessment#:#new_category#:#Neue Einheiten-Kategorie assessment#:#new_unit#:#Neue Einheit diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index c8bf63b89dd7..42b028da68e6 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -926,6 +926,8 @@ assessment#:#msg_number_of_terms_too_low#:#The number of terms must be greater o assessment#:#msg_poly_added#:#Polygon added assessment#:#msg_questions_moved#:#Question(s) moved assessment#:#msg_rect_added#:#Rectangle added +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly. +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved. assessment#:#msg_selected_for_move#:#Question(s) selected for moving assessment#:#new_category#:#New Unit Category assessment#:#new_unit#:#New Unit From 63adbb0d991c3e48f611806073d9f0dbbeabf11f Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Fri, 2 Feb 2024 17:41:21 +0100 Subject: [PATCH 413/497] Test: Fix too strict comparison --- Services/Tracking/classes/status/class.ilLPStatusTestPassed.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Tracking/classes/status/class.ilLPStatusTestPassed.php b/Services/Tracking/classes/status/class.ilLPStatusTestPassed.php index 04a47d3195e2..7ffed00126aa 100644 --- a/Services/Tracking/classes/status/class.ilLPStatusTestPassed.php +++ b/Services/Tracking/classes/status/class.ilLPStatusTestPassed.php @@ -110,7 +110,7 @@ public function determineStatus( if ($test_obj->getPassScoring() === SCORE_LAST_PASS) { $is_finished = false; - if ($rec['last_finished_pass'] !== null && $rec['sequences'] - 1 === $rec['last_finished_pass']) { + if ($rec['last_finished_pass'] !== null && $rec['sequences'] - 1 == $rec['last_finished_pass']) { $is_finished = true; } $status = $this->determineStatusForScoreLastPassTests( From 726da023ab58823c2fdbc84ebb9e2fc3cd422c0d Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 2 Feb 2024 17:50:56 +0100 Subject: [PATCH 414/497] 34446: Start before Enddate --- .../Section/class.SectionCommandActionHandler.php | 15 ++++++++++++++- .../Section/class.ilPCSectionEditorGUI.php | 1 + Services/COPage/classes/class.ilPCSectionGUI.php | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Services/COPage/Editor/Components/Section/class.SectionCommandActionHandler.php b/Services/COPage/Editor/Components/Section/class.SectionCommandActionHandler.php index 2041ce534b11..2f080586e714 100644 --- a/Services/COPage/Editor/Components/Section/class.SectionCommandActionHandler.php +++ b/Services/COPage/Editor/Components/Section/class.SectionCommandActionHandler.php @@ -82,9 +82,22 @@ protected function insertCommand(array $body): Server\Response // note: we have everyting in _POST here, form works the usual way $updated = true; - if ($form->checkInput()) { + if ($sec_gui->checkInput($form)) { $sec_gui->setValuesFromForm($form); $updated = $page->update(); + } else { + $html = $this->ctrl->getHTML( + $sec_gui, + [ + "form" => true, + "ui_wrapper" => $this->ui_wrapper, + "update_fail" => true, + "insert" => true, + "buttons" => [["Page", "component.save", $this->lng->txt("insert")], + ["Page", "component.cancel", $this->lng->txt("cancel")]] + ] + ); + return $this->ui_wrapper->sendFormError($html); } return $this->ui_wrapper->sendPage($this->page_gui, $updated); diff --git a/Services/COPage/Editor/Components/Section/class.ilPCSectionEditorGUI.php b/Services/COPage/Editor/Components/Section/class.ilPCSectionEditorGUI.php index 35ba043d544c..f44a8dc6d7ae 100644 --- a/Services/COPage/Editor/Components/Section/class.ilPCSectionEditorGUI.php +++ b/Services/COPage/Editor/Components/Section/class.ilPCSectionEditorGUI.php @@ -64,6 +64,7 @@ protected function getCreationForm( [ "form" => true, "ui_wrapper" => $ui_wrapper, + "insert" => true, "buttons" => [["Page", "component.save", $lng->txt("insert")], ["Page", "component.cancel", $lng->txt("cancel")]] ] diff --git a/Services/COPage/classes/class.ilPCSectionGUI.php b/Services/COPage/classes/class.ilPCSectionGUI.php index e7c00112798f..da295eeffdf2 100755 --- a/Services/COPage/classes/class.ilPCSectionGUI.php +++ b/Services/COPage/classes/class.ilPCSectionGUI.php @@ -44,7 +44,7 @@ public function getHTML(array $params): string $this->getCharacteristicsOfCurrentStyle(["section"]); if ($params["form"] == true) { - $insert = !($this->content_obj); + $insert = $params["insert"] ?? false; $form = $this->initForm($insert); $form->setShowTopButtons(false); From d4cebdab439c465e5b7ac07799a88969f1229158 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Mon, 5 Feb 2024 10:25:35 +0100 Subject: [PATCH 415/497] MetaData: fix row selection, ordering of cp usage table (36683) --- .../class.ilMDCopyrightUsageTableGUI.php | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Services/MetaData/classes/class.ilMDCopyrightUsageTableGUI.php b/Services/MetaData/classes/class.ilMDCopyrightUsageTableGUI.php index 9bf2ed1ea765..3a9582a92524 100644 --- a/Services/MetaData/classes/class.ilMDCopyrightUsageTableGUI.php +++ b/Services/MetaData/classes/class.ilMDCopyrightUsageTableGUI.php @@ -41,16 +41,16 @@ public function __construct(ilMDCopyrightUsageGUI $a_parent_obj, string $a_paren { global $DIC; + $this->copyright_id = $a_parent_obj->getEntryId(); + $this->setId("mdcopusage" . $this->copyright_id); + parent::__construct($a_parent_obj, $a_parent_cmd); $this->ui_factory = $DIC->ui()->factory(); $this->ui_renderer = $DIC->ui()->renderer(); $this->db = $DIC->database(); - $this->copyright_id = $a_parent_obj->getEntryId(); $this->lng = $DIC->language(); $this->lng->loadLanguageModule('meta'); - - $this->setId("mdcopusage" . $this->copyright_id); } public function init(): void @@ -58,10 +58,10 @@ public function init(): void $md_entry = new ilMDCopyrightSelectionEntry($this->copyright_id); $this->setTitle($md_entry->getTitle()); - $this->addColumn($this->lng->txt('object'), 'object'); - $this->addColumn($this->lng->txt('meta_references'), 'references'); - $this->addColumn($this->lng->txt('meta_copyright_sub_items'), 'subitems'); - $this->addColumn($this->lng->txt('owner'), 'owner'); + $this->addColumn($this->lng->txt('object'), 'title'); + $this->addColumn($this->lng->txt('meta_references')); + $this->addColumn($this->lng->txt('meta_copyright_sub_items'), 'sub_items'); + $this->addColumn($this->lng->txt('owner'), 'owner_name'); $this->setRowTemplate("tpl.show_copyright_usages_row.html", "Services/MetaData"); $this->setFormAction($this->ctrl->getFormAction( @@ -99,6 +99,14 @@ public function initFilter(): void $this->filter["object"] = $item->getValue(); } + public function numericOrdering(string $a_field): bool + { + if ($a_field === 'sub_items') { + return true; + } + return false; + } + /** * @return string[] */ From a77175fea5e2771a55f151d238d54309d22277f9 Mon Sep 17 00:00:00 2001 From: Luka Stocker <67695434+lukastocker@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:44:27 +0100 Subject: [PATCH 416/497] CSS: remove margin-top from radio button to make sure the label and radio button are in line. (#27295) (#7005) https://mantis.ilias.de/view.php?id=27295 --- src/UI/templates/default/Input/input.less | 6 ++++++ templates/default/delos.css | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/UI/templates/default/Input/input.less b/src/UI/templates/default/Input/input.less index 7c7430623e9b..8abba463fddd 100644 --- a/src/UI/templates/default/Input/input.less +++ b/src/UI/templates/default/Input/input.less @@ -228,6 +228,12 @@ select.form-control { min-width: 16px; } } + +.radio input[type="radio"], +.radio-inline input[type="radio"] { + margin-top: 0px; +} + .radio input[type="radio"], .radio-inline input[type="radio"] { vertical-align: top; diff --git a/templates/default/delos.css b/templates/default/delos.css index 8f3305c4bda4..4b9377a07af2 100644 --- a/templates/default/delos.css +++ b/templates/default/delos.css @@ -8374,6 +8374,10 @@ select.form-control { } } .radio input[type="radio"], +.radio-inline input[type="radio"] { + margin-top: 0px; +} +.radio input[type="radio"], .radio-inline input[type="radio"] { vertical-align: top; } @@ -20037,4 +20041,3 @@ table.mceToolbar td { width: auto !important; } } -/*# sourceMappingURL=./delos.css.map */ \ No newline at end of file From 2a0ef684dcaf165ea602fa6149fc58d3c5282247 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 5 Feb 2024 12:11:52 +0100 Subject: [PATCH 417/497] Search: Transform search query before rendering See: https://mantis.ilias.de/view.php?id=40066 --- .../classes/Lucene/class.ilLuceneSearchGUI.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Services/Search/classes/Lucene/class.ilLuceneSearchGUI.php b/Services/Search/classes/Lucene/class.ilLuceneSearchGUI.php index 10494ff44697..9b9011889cbe 100644 --- a/Services/Search/classes/Lucene/class.ilLuceneSearchGUI.php +++ b/Services/Search/classes/Lucene/class.ilLuceneSearchGUI.php @@ -197,7 +197,13 @@ protected function showSavedResults(): bool if ($presentation->render()) { $this->tpl->setVariable('SEARCH_RESULTS', $presentation->getHTML()); } elseif (strlen($this->search_cache->getQuery())) { - $this->tpl->setOnScreenMessage('info', sprintf($this->lng->txt('search_no_match_hint'), $qp->getQuery())); + $this->tpl->setOnScreenMessage( + 'info', + sprintf( + $this->lng->txt('search_no_match_hint'), + ilLegacyFormElementsUtil::prepareFormOutput($qp->getQuery()) + ) + ); } return true; } @@ -299,7 +305,13 @@ protected function performSearch(): void if ($presentation->render()) { $this->tpl->setVariable('SEARCH_RESULTS', $presentation->getHTML()); } else { - $this->tpl->setOnScreenMessage('info', sprintf($this->lng->txt('search_no_match_hint'), $this->search_cache->getQuery())); + $this->tpl->setOnScreenMessage( + 'info', + sprintf( + $this->lng->txt('search_no_match_hint'), + ilLegacyFormElementsUtil::prepareFormOutput($qp->getQuery()) + ) + ); } } From 0de5882769db37b4102a56e0b1ed3620adf282e8 Mon Sep 17 00:00:00 2001 From: Timon Amstutz Date: Mon, 5 Feb 2024 17:36:51 +0100 Subject: [PATCH 418/497] Fix of #33993 --- templates/default/images/icon_pg_d_sc.svg | 38 ++++++++++++--------- templates/default/images/icon_pg_del_sc.svg | 31 ++++++++--------- templates/default/images/icon_pg_sc.svg | 29 ++++++++-------- 3 files changed, 50 insertions(+), 48 deletions(-) diff --git a/templates/default/images/icon_pg_d_sc.svg b/templates/default/images/icon_pg_d_sc.svg index b612c66f2470..198979d45e77 100644 --- a/templates/default/images/icon_pg_d_sc.svg +++ b/templates/default/images/icon_pg_d_sc.svg @@ -1,24 +1,30 @@ - + - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/templates/default/images/icon_pg_del_sc.svg b/templates/default/images/icon_pg_del_sc.svg index cfaf6ed84e9d..fbaa720ff6ad 100644 --- a/templates/default/images/icon_pg_del_sc.svg +++ b/templates/default/images/icon_pg_del_sc.svg @@ -1,25 +1,22 @@ - + - - - - - - - - - - + + + + + + + diff --git a/templates/default/images/icon_pg_sc.svg b/templates/default/images/icon_pg_sc.svg index dc10d9e52387..26375234c1b9 100644 --- a/templates/default/images/icon_pg_sc.svg +++ b/templates/default/images/icon_pg_sc.svg @@ -1,23 +1,22 @@ - + - - - - - - - - - + + + + + + + From e020ce176e1667214e9a78cca102b416d98a6ea5 Mon Sep 17 00:00:00 2001 From: Timon Amstutz Date: Tue, 6 Feb 2024 10:49:44 +0100 Subject: [PATCH 419/497] Less, fix of #40405 --- templates/default/less/variables.less | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/default/less/variables.less b/templates/default/less/variables.less index 7b66d6af828b..8d83eb8371ec 100644 --- a/templates/default/less/variables.less +++ b/templates/default/less/variables.less @@ -828,7 +828,6 @@ with the il- variable set here. //== Card // //## -@il-card-border: 1px solid @il-main-border-color; @il-card-background: @il-main-bg; @il-card-highlight-bg: @il-warning-color; @il-card-highlight-height: @il-padding-large-vertical; From dcca9b69bb9657b07cb1c64d0cbd149f2f0a0882 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 6 Feb 2024 15:14:10 +0100 Subject: [PATCH 420/497] 38058: Permission Add News not working --- Services/News/classes/class.NewsAccess.php | 96 +++++++++++++++++++ .../class.ilNewsForContextBlockGUI.php | 6 +- .../class.ilNewsForContextTableGUI.php | 15 ++- Services/News/classes/class.ilNewsItemGUI.php | 35 ++++--- .../tpl.table_row_news_for_context.html | 2 +- 5 files changed, 136 insertions(+), 18 deletions(-) create mode 100644 Services/News/classes/class.NewsAccess.php diff --git a/Services/News/classes/class.NewsAccess.php b/Services/News/classes/class.NewsAccess.php new file mode 100644 index 000000000000..423fe3f7b2b1 --- /dev/null +++ b/Services/News/classes/class.NewsAccess.php @@ -0,0 +1,96 @@ +current_user_id = $DIC->user()->getId(); + $this->ref_id = $ref_id; + $this->access = $DIC->access(); + } + + protected function getUserId(int $user_id = 0): int + { + return ($user_id > 0) + ? $user_id + : $this->current_user_id; + } + + public function canAdd($user_id = 0): bool + { + return $this->access->checkAccessOfUser( + $this->getUserId($user_id), + "news_add_news", + "", + $this->ref_id + ) + || $this->canEditAll($user_id); + } + + /** + * List of news of the news block + */ + public function canAccessManageOverview($user_id = 0): bool + { + return $this->canAdd($user_id); + } + + public function canEditSettings($user_id = 0): bool + { + return $this->access->checkAccessOfUser( + $this->getUserId($user_id), + 'write', + '', + $this->ref_id + ); + } + + public function canEditAll($user_id = 0): bool + { + return $this->access->checkAccessOfUser( + $this->getUserId($user_id), + 'write', + '', + $this->ref_id + ); + } + + public function canEdit(\ilNewsItem $i, $user_id = 0): bool + { + return ( + $i->getPriority() === 1 && + ($i->getUserId() === $this->getUserId($user_id) || $this->canEditAll($user_id)) + ); + } + + public function canDelete(\ilNewsItem $i, $user_id = 0): bool + { + return $this->canEdit($i, $user_id); + } +} diff --git a/Services/News/classes/class.ilNewsForContextBlockGUI.php b/Services/News/classes/class.ilNewsForContextBlockGUI.php index 7c35163fd32e..bdab5f2984c7 100755 --- a/Services/News/classes/class.ilNewsForContextBlockGUI.php +++ b/Services/News/classes/class.ilNewsForContextBlockGUI.php @@ -17,6 +17,7 @@ *********************************************************************/ use ILIAS\News\StandardGUIRequest; +use ILIAS\News\Access\NewsAccess; /** * BlockGUI class for block NewsForContext @@ -31,6 +32,7 @@ class ilNewsForContextBlockGUI extends ilBlockGUI * object type names with settings->news settings subtab */ public const OBJECTS_WITH_NEWS_SUBTAB = ["category", "course", "group", "forum"]; + protected NewsAccess $news_access; protected bool $cache_hit = false; protected bool $dynamic = false; protected ilNewsCache $acache; @@ -66,6 +68,8 @@ public function __construct() $DIC->refinery() ); + $this->news_access = new NewsAccess($this->std_request->getRefId()); + $ilCtrl = $DIC->ctrl(); $lng = $DIC->language(); $ilUser = $DIC->user(); @@ -259,7 +263,7 @@ public function getHTML(): string } // add edit commands - if ($this->getEnableEdit()) { + if ($this->news_access->canAdd()) { $this->addBlockCommand( $ilCtrl->getLinkTargetByClass("ilnewsitemgui", "editNews"), $lng->txt("edit") diff --git a/Services/News/classes/class.ilNewsForContextTableGUI.php b/Services/News/classes/class.ilNewsForContextTableGUI.php index 56202b651ba9..ebdc874749ec 100755 --- a/Services/News/classes/class.ilNewsForContextTableGUI.php +++ b/Services/News/classes/class.ilNewsForContextTableGUI.php @@ -16,6 +16,8 @@ * *********************************************************************/ +use ILIAS\News\Access\NewsAccess; + /** * TableGUI class for table NewsForContext * @@ -23,6 +25,7 @@ */ class ilNewsForContextTableGUI extends ilTable2GUI { + protected NewsAccess $news_access; protected int $perm_ref_id = 0; protected ilAccessHandler $access; @@ -42,6 +45,7 @@ public function __construct( parent::__construct($a_parent_obj, $a_parent_cmd); $this->perm_ref_id = $a_perm_ref_id; + $this->news_access = new NewsAccess($this->perm_ref_id); $this->addColumn("", "f", "1"); $this->addColumn($lng->txt("news_news_item_content")); @@ -134,7 +138,8 @@ protected function fillRow(array $a_set): void ? $this->perm_ref_id : $a_set["ref_id"]; - if ($ilAccess->checkAccess("write", "", $perm_ref_id)) { + $news_item = new ilNewsItem($a_set["id"]); + if ($this->news_access->canEdit($news_item)) { $this->tpl->setCurrentBlock("edit"); $this->tpl->setVariable("TXT_EDIT", $lng->txt("edit")); $ilCtrl->setParameterByClass("ilnewsitemgui", "news_item_id", $a_set["id"]); @@ -145,13 +150,17 @@ protected function fillRow(array $a_set): void $this->tpl->parseCurrentBlock(); } + if ($this->news_access->canDelete($news_item)) { + $this->tpl->setCurrentBlock("cb"); + $this->tpl->setVariable("VAL_ID", $a_set["id"]); + $this->tpl->parseCurrentBlock(); + } + // context $this->tpl->setVariable( "CONTEXT", $lng->txt("obj_" . $a_set["context_obj_type"]) . ":
" . ilObject::_lookupTitle($a_set["context_obj_id"]) ); - - $this->tpl->setVariable("VAL_ID", $a_set["id"]); } } diff --git a/Services/News/classes/class.ilNewsItemGUI.php b/Services/News/classes/class.ilNewsItemGUI.php index 0aa5c6aeb377..bcfef17b9003 100755 --- a/Services/News/classes/class.ilNewsItemGUI.php +++ b/Services/News/classes/class.ilNewsItemGUI.php @@ -17,6 +17,7 @@ *********************************************************************/ use ILIAS\News\StandardGUIRequest; +use ILIAS\News\Access\NewsAccess; /** * User Interface for NewsItem entities. @@ -29,6 +30,7 @@ class ilNewsItemGUI public const FORM_CREATE = 1; public const FORM_RE_EDIT = 2; public const FORM_RE_CREATE = 2; + protected NewsAccess $news_access; protected ?ilNewsItem $news_item; protected ilCtrl $ctrl; @@ -67,6 +69,7 @@ public function __construct() $this->requested_ref_id = (int) ($params["ref_id"] ?? 0); $this->requested_news_item_id = (int) ($params["news_item_id"] ?? 0); $this->add_mode = (string) ($params["add_mode"] ?? ""); + $this->news_access = new NewsAccess($this->requested_ref_id); $this->std_request = new StandardGUIRequest( $DIC->http(), @@ -289,7 +292,7 @@ public function saveNewsItem(): string { $ilUser = $this->user; - if (!$this->getEnableEdit()) { + if (!$this->news_access->canAdd()) { return ""; } @@ -348,7 +351,7 @@ public function updateNewsItem(): string { $ilUser = $this->user; - if (!$this->getEnableEdit()) { + if (!$this->news_access->canEdit($this->news_item)) { return ""; } @@ -427,15 +430,17 @@ public function editNews(): string $ilCtrl = $this->ctrl; $this->setTabs(); - - $ilToolbar->addButton( - $lng->txt("news_add_news"), - $ilCtrl->getLinkTarget($this, "createNewsItem") - ); - - if (!$this->getEnableEdit()) { + if (!$this->news_access->canAccessManageOverview()) { return ""; } + + if ($this->news_access->canAdd()) { + $ilToolbar->addButton( + $lng->txt("news_add_news"), + $ilCtrl->getLinkTarget($this, "createNewsItem") + ); + } + return $this->getNewsForContextTable(); } @@ -450,7 +455,7 @@ public function confirmDeletionNewsItems(): string $lng = $this->lng; $ilTabs = $this->tabs; - if (!$this->getEnableEdit()) { + if (!$this->news_access->canAccessManageOverview()) { return ""; } @@ -473,7 +478,9 @@ public function confirmDeletionNewsItems(): string // add items to delete foreach ($this->std_request->getNewsIds() as $news_id) { $news = new ilNewsItem($news_id); - $c_gui->addItem("news_id[]", $news_id, $news->getTitle()); + if ($this->news_access->canDelete($news)) { + $c_gui->addItem("news_id[]", $news_id, $news->getTitle()); + } } return $c_gui->getHTML(); @@ -481,13 +488,15 @@ public function confirmDeletionNewsItems(): string public function deleteNewsItems(): string { - if (!$this->getEnableEdit()) { + if (!$this->news_access->canAccessManageOverview()) { return ""; } // delete all selected news items foreach ($this->std_request->getNewsIds() as $news_id) { $news = new ilNewsItem($news_id); - $news->delete(); + if ($this->news_access->canDelete($news)) { + $news->delete(); + } } return $this->editNews(); diff --git a/Services/News/templates/default/tpl.table_row_news_for_context.html b/Services/News/templates/default/tpl.table_row_news_for_context.html index d6cf7581671f..20f277597514 100755 --- a/Services/News/templates/default/tpl.table_row_news_for_context.html +++ b/Services/News/templates/default/tpl.table_row_news_for_context.html @@ -1,6 +1,6 @@ - + {VAL_TITLE} From 1fc9c57307957c09cbbd285cf75ef22fcf89887b Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 6 Feb 2024 16:23:52 +0100 Subject: [PATCH 421/497] 37718: Suggested changes to placeholder option in 'Seperate E-Mail for Each Finished Survey' --- Modules/Survey/Settings/class.SettingsFormGUI.php | 4 ++-- lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/Survey/Settings/class.SettingsFormGUI.php b/Modules/Survey/Settings/class.SettingsFormGUI.php index 7fdb99135cbb..4639f29ec056 100644 --- a/Modules/Survey/Settings/class.SettingsFormGUI.php +++ b/Modules/Survey/Settings/class.SettingsFormGUI.php @@ -495,8 +495,8 @@ public function withAfterEnd( $txt[] = "[" . strtoupper($placeholder) . "]: " . $lng->txt($caption); } $txt = implode("
", $txt); - $participantdatainfo = new \ilNonEditableValueGUI($lng->txt("mailparticipantdata_placeholder"), "", true); - $participantdatainfo->setValue($txt); + $participantdatainfo = new \ilNonEditableValueGUI($lng->txt("svy_placeholders_label"), "", true); + $participantdatainfo->setValue($lng->txt("mailparticipantdata_placeholder") . "
" . $txt); $mailnotification->addSubItem($mailaddresses); $mailnotification->addSubItem($participantdata); diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 04ad361357ab..38a49db38185 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -16167,6 +16167,7 @@ svy#:#svy_finish_survey#:#Umfrage "%1" bearbeiten svy#:#svy_invite_participants#:#Teilnehmer einladen svy#:#svy_link_to_svy#:#Link zur Umfrage svy#:#svy_part_overview#:#Übersicht +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter svy#:#svy_print_selection#:#Auswahl Druckansicht svy#:#svy_remove_all_participants#:#Alle Teilnehmerdaten löschen svy#:#svy_remove_participants#:#Teilnehmer entfernen diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 42b028da68e6..67328ad0e260 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -16167,6 +16167,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1' svy#:#svy_invite_participants#:#Invite Participants svy#:#svy_link_to_svy#:#Link to Survey svy#:#svy_part_overview#:#Overview +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter svy#:#svy_print_selection#:#Print View Selection svy#:#svy_remove_all_participants#:#Delete all Participant Data svy#:#svy_remove_participants#:#Remove Participants From 3840465f148d781e21f52786f457c4606833a2cf Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 6 Feb 2024 16:59:40 +0100 Subject: [PATCH 422/497] 40422: Link breaks (Customize) Page - Page becomes unrecoverable --- Services/MediaObjects/classes/class.ilObjMediaObject.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/MediaObjects/classes/class.ilObjMediaObject.php b/Services/MediaObjects/classes/class.ilObjMediaObject.php index 712f61610082..e2aa4ee5beb9 100755 --- a/Services/MediaObjects/classes/class.ilObjMediaObject.php +++ b/Services/MediaObjects/classes/class.ilObjMediaObject.php @@ -533,7 +533,7 @@ public function getXML( // Parameter $parameters = $item->getParameters(); foreach ($parameters as $name => $value) { - $xml .= ""; + $xml .= "escapeProperty($value) . "\"/>"; } $xml .= $item->getMapAreasXML(); $xml .= ""; @@ -602,7 +602,7 @@ public function getXML( // Parameter $parameters = $item->getParameters(); foreach ($parameters as $name => $value) { - $xml .= ""; + $xml .= "escapeProperty($value) . "\"/>"; } $xml .= $item->getMapAreasXML(); From 1ef9b079e53b51ea754f89ee1d59c043be9d87ce Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 6 Feb 2024 17:45:09 +0100 Subject: [PATCH 423/497] 36689: Einstellungen des Neuigkeiten-Blocks auf dem Dashboard werden nicht gespeichert --- Services/News/classes/class.StandardGUIRequest.php | 2 +- Services/News/classes/class.ilPDNewsBlockGUI.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Services/News/classes/class.StandardGUIRequest.php b/Services/News/classes/class.StandardGUIRequest.php index c6ae66040462..965d075888e9 100644 --- a/Services/News/classes/class.StandardGUIRequest.php +++ b/Services/News/classes/class.StandardGUIRequest.php @@ -94,7 +94,7 @@ public function getCmd(): string public function getDashboardPeriod(): string { - return $this->str("news_pd_periods"); + return $this->str("news_pd_period"); } public function getNewsPer(): string diff --git a/Services/News/classes/class.ilPDNewsBlockGUI.php b/Services/News/classes/class.ilPDNewsBlockGUI.php index a1be78ebf3ca..fde32b59320e 100755 --- a/Services/News/classes/class.ilPDNewsBlockGUI.php +++ b/Services/News/classes/class.ilPDNewsBlockGUI.php @@ -370,7 +370,7 @@ public function saveSettings(): string "news_pd_period", $this->std_request->getDashboardPeriod(), $ilUser->getId(), - (int) $this->block_id + 0 ); $cache = new ilNewsCache(); From 6a9f694c3d2b27e798c8c0a5bd46a805d502fc14 Mon Sep 17 00:00:00 2001 From: Thibeau Fuhrer Date: Wed, 7 Feb 2024 11:46:05 +0100 Subject: [PATCH 424/497] [FIX] Dependencies: update @babel/core npm package. --- node_modules/.bin/errno | 1 - node_modules/.bin/image-size | 1 - node_modules/.bin/mime | 1 - node_modules/.bin/needle | 1 - ...owserslist-lint => update-browserslist-db} | 0 node_modules/.package-lock.json | 421 +- node_modules/@babel/code-frame/lib/index.js | 4 +- .../@babel/code-frame/lib/index.js.map | 2 +- node_modules/@babel/code-frame/package.json | 6 +- node_modules/@babel/compat-data/README.md | 2 +- .../@babel/compat-data/corejs2-built-ins.js | 1 + .../compat-data/corejs3-shipped-proposals.js | 1 + .../compat-data/data/corejs2-built-ins.json | 146 + .../data/corejs3-shipped-proposals.json | 4 +- .../compat-data/data/native-modules.json | 2 +- .../compat-data/data/overlapping-plugins.json | 6 + .../compat-data/data/plugin-bugfixes.json | 25 +- .../@babel/compat-data/data/plugins.json | 110 +- node_modules/@babel/compat-data/package.json | 8 +- node_modules/@babel/core/README.md | 2 +- node_modules/@babel/core/cjs-proxy.cjs | 34 +- .../core/lib/config/cache-contexts.js.map | 2 +- .../@babel/core/lib/config/caching.js | 7 +- .../@babel/core/lib/config/caching.js.map | 2 +- .../@babel/core/lib/config/config-chain.js | 59 +- .../core/lib/config/config-chain.js.map | 2 +- .../core/lib/config/config-descriptors.js | 32 +- .../core/lib/config/config-descriptors.js.map | 2 +- .../core/lib/config/files/configuration.js | 116 +- .../lib/config/files/configuration.js.map | 2 +- .../lib/config/files/import-meta-resolve.js | 35 - .../config/files/import-meta-resolve.js.map | 1 - .../@babel/core/lib/config/files/import.cjs | 2 - .../core/lib/config/files/import.cjs.map | 2 +- .../core/lib/config/files/index-browser.js | 30 +- .../lib/config/files/index-browser.js.map | 2 +- .../@babel/core/lib/config/files/index.js | 34 +- .../@babel/core/lib/config/files/index.js.map | 2 +- .../core/lib/config/files/module-types.js | 154 +- .../core/lib/config/files/module-types.js.map | 2 +- .../@babel/core/lib/config/files/package.js | 5 +- .../core/lib/config/files/package.js.map | 2 +- .../@babel/core/lib/config/files/plugins.js | 195 +- .../core/lib/config/files/plugins.js.map | 2 +- .../@babel/core/lib/config/files/types.js.map | 2 +- .../@babel/core/lib/config/files/utils.js | 4 +- .../@babel/core/lib/config/files/utils.js.map | 2 +- node_modules/@babel/core/lib/config/full.js | 39 +- .../@babel/core/lib/config/full.js.map | 2 +- .../core/lib/config/helpers/config-api.js | 15 +- .../core/lib/config/helpers/config-api.js.map | 2 +- .../core/lib/config/helpers/deep-array.js | 1 - .../core/lib/config/helpers/deep-array.js.map | 2 +- .../lib/config/helpers/environment.js.map | 2 +- node_modules/@babel/core/lib/config/index.js | 97 +- .../@babel/core/lib/config/index.js.map | 2 +- node_modules/@babel/core/lib/config/item.js | 5 +- .../@babel/core/lib/config/item.js.map | 2 +- .../@babel/core/lib/config/partial.js | 41 +- .../@babel/core/lib/config/partial.js.map | 2 +- .../core/lib/config/pattern-to-regex.js | 5 - .../core/lib/config/pattern-to-regex.js.map | 2 +- node_modules/@babel/core/lib/config/plugin.js | 2 +- .../@babel/core/lib/config/plugin.js.map | 2 +- .../@babel/core/lib/config/printer.js | 3 +- .../@babel/core/lib/config/printer.js.map | 2 +- .../lib/config/resolve-targets-browser.js | 7 +- .../lib/config/resolve-targets-browser.js.map | 2 +- .../core/lib/config/resolve-targets.js.map | 2 +- .../@babel/core/lib/config/util.js.map | 2 +- .../config/validation/option-assertions.js | 9 +- .../validation/option-assertions.js.map | 2 +- .../core/lib/config/validation/options.js | 11 +- .../core/lib/config/validation/options.js.map | 2 +- .../core/lib/config/validation/plugins.js | 9 +- .../core/lib/config/validation/plugins.js.map | 2 +- .../core/lib/config/validation/removed.js | 3 +- .../core/lib/config/validation/removed.js.map | 2 +- .../@babel/core/lib/errors/config-error.js | 4 +- .../core/lib/errors/config-error.js.map | 2 +- .../core/lib/errors/rewrite-stack-trace.js | 21 +- .../lib/errors/rewrite-stack-trace.js.map | 2 +- .../@babel/core/lib/gensync-utils/async.js | 14 +- .../core/lib/gensync-utils/async.js.map | 2 +- .../@babel/core/lib/gensync-utils/fs.js | 6 +- .../@babel/core/lib/gensync-utils/fs.js.map | 2 +- .../core/lib/gensync-utils/functional.js | 59 +- .../core/lib/gensync-utils/functional.js.map | 2 +- node_modules/@babel/core/lib/index.js | 69 +- node_modules/@babel/core/lib/index.js.map | 2 +- node_modules/@babel/core/lib/parse.js | 15 +- node_modules/@babel/core/lib/parse.js.map | 2 +- node_modules/@babel/core/lib/parser/index.js | 3 +- .../@babel/core/lib/parser/index.js.map | 2 +- .../lib/parser/util/missing-plugin-helper.js | 311 +- .../parser/util/missing-plugin-helper.js.map | 2 +- .../core/lib/tools/build-external-helpers.js | 5 +- .../lib/tools/build-external-helpers.js.map | 2 +- node_modules/@babel/core/lib/transform-ast.js | 13 +- .../@babel/core/lib/transform-ast.js.map | 2 +- .../@babel/core/lib/transform-file-browser.js | 4 +- .../core/lib/transform-file-browser.js.map | 2 +- .../@babel/core/lib/transform-file.js | 13 +- .../@babel/core/lib/transform-file.js.map | 2 +- node_modules/@babel/core/lib/transform.js | 13 +- node_modules/@babel/core/lib/transform.js.map | 2 +- .../lib/transformation/block-hoist-plugin.js | 8 +- .../transformation/block-hoist-plugin.js.map | 2 +- .../core/lib/transformation/file/file.js | 4 - .../core/lib/transformation/file/file.js.map | 2 +- .../core/lib/transformation/file/generate.js | 18 +- .../lib/transformation/file/generate.js.map | 2 +- .../core/lib/transformation/file/merge-map.js | 2 - .../lib/transformation/file/merge-map.js.map | 2 +- .../@babel/core/lib/transformation/index.js | 19 +- .../core/lib/transformation/index.js.map | 2 +- .../core/lib/transformation/normalize-file.js | 25 +- .../lib/transformation/normalize-file.js.map | 2 +- .../lib/transformation/normalize-opts.js.map | 2 +- .../core/lib/transformation/plugin-pass.js | 7 +- .../lib/transformation/plugin-pass.js.map | 2 +- .../lib/transformation/util/clone-deep.js | 3 +- .../lib/transformation/util/clone-deep.js.map | 2 +- .../core/lib/vendor/import-meta-resolve.js | 3226 +++------------ .../lib/vendor/import-meta-resolve.js.map | 2 +- .../core/node_modules/semver/CHANGELOG.md | 70 - .../core/node_modules/semver/package.json | 28 +- .../@babel/core/node_modules/semver/semver.js | 95 +- node_modules/@babel/core/package.json | 46 +- .../core/src/config/files/index-browser.ts | 4 +- .../@babel/core/src/config/files/index.ts | 21 +- .../src/config/resolve-targets-browser.ts | 2 +- .../@babel/core/src/config/resolve-targets.ts | 4 +- .../@babel/core/src/transform-file.ts | 14 +- node_modules/@babel/generator/lib/buffer.js | 26 +- .../@babel/generator/lib/buffer.js.map | 2 +- .../generator/lib/generators/statements.js | 6 +- .../lib/generators/statements.js.map | 2 +- .../@babel/generator/lib/generators/types.js | 11 +- .../generator/lib/generators/types.js.map | 2 +- .../generator/lib/generators/typescript.js | 9 +- .../lib/generators/typescript.js.map | 2 +- node_modules/@babel/generator/lib/index.js | 45 +- .../@babel/generator/lib/index.js.map | 2 +- .../@babel/generator/lib/node/index.js | 24 +- .../@babel/generator/lib/node/index.js.map | 2 +- .../@babel/generator/lib/node/parentheses.js | 196 +- .../generator/lib/node/parentheses.js.map | 2 +- .../@babel/generator/lib/node/whitespace.js | 3 +- .../generator/lib/node/whitespace.js.map | 2 +- node_modules/@babel/generator/lib/printer.js | 79 +- .../@babel/generator/lib/printer.js.map | 2 +- node_modules/@babel/generator/package.json | 8 +- .../helper-compilation-targets/README.md | 2 +- .../helper-compilation-targets/lib/debug.js | 11 +- .../lib/debug.js.map | 2 +- .../lib/filter-items.js | 29 +- .../lib/filter-items.js.map | 2 +- .../helper-compilation-targets/lib/index.js | 84 +- .../lib/index.js.map | 2 +- .../helper-compilation-targets/lib/options.js | 6 +- .../lib/options.js.map | 2 +- .../helper-compilation-targets/lib/pretty.js | 23 +- .../lib/pretty.js.map | 2 +- .../helper-compilation-targets/lib/targets.js | 8 +- .../lib/targets.js.map | 2 +- .../helper-compilation-targets/lib/utils.js | 30 +- .../lib/utils.js.map | 2 +- .../node_modules/lru-cache}/LICENSE | 2 +- .../node_modules/lru-cache/README.md | 166 + .../node_modules/lru-cache/index.js | 334 ++ .../node_modules/lru-cache/package.json | 32 + .../node_modules/semver/CHANGELOG.md | 70 - .../node_modules/semver/package.json | 28 +- .../node_modules/semver/semver.js | 95 +- .../node_modules/yallist/LICENSE | 15 + .../node_modules/yallist/README.md | 204 + .../node_modules/yallist/iterator.js | 8 + .../node_modules/yallist/package.json | 29 + .../node_modules/yallist/yallist.js | 426 ++ .../helper-compilation-targets/package.json | 18 +- .../@babel/helper-module-imports/README.md | 2 +- .../lib/import-builder.js | 46 +- .../lib/import-builder.js.map | 1 + .../lib/import-injector.js | 48 +- .../lib/import-injector.js.map | 1 + .../@babel/helper-module-imports/lib/index.js | 14 +- .../helper-module-imports/lib/index.js.map | 1 + .../helper-module-imports/lib/is-module.js | 13 +- .../lib/is-module.js.map | 1 + .../@babel/helper-module-imports/package.json | 8 +- .../@babel/helper-module-transforms/README.md | 2 +- .../lib/dynamic-import.js | 47 +- .../lib/dynamic-import.js.map | 2 +- .../lib/get-module-name.js | 7 +- .../lib/get-module-name.js.map | 2 +- .../helper-module-transforms/lib/index.js | 116 +- .../helper-module-transforms/lib/index.js.map | 2 +- .../lib/lazy-modules.js | 31 + .../lib/lazy-modules.js.map | 1 + .../lib/normalize-and-load-metadata.js | 74 +- .../lib/normalize-and-load-metadata.js.map | 2 +- .../lib/rewrite-live-references.js | 91 +- .../lib/rewrite-live-references.js.map | 2 +- .../lib/rewrite-this.js | 9 +- .../lib/rewrite-this.js.map | 2 +- .../helper-module-transforms/package.json | 22 +- .../@babel/helper-simple-access/lib/index.js | 88 +- .../helper-simple-access/lib/index.js.map | 2 +- .../@babel/helper-simple-access/package.json | 8 +- .../@babel/helper-string-parser/README.md | 2 +- .../helper-string-parser/lib/index.js.map | 2 +- .../@babel/helper-string-parser/package.json | 2 +- .../@babel/helper-validator-option/README.md | 2 +- .../lib/find-suggestion.js | 20 +- .../lib/find-suggestion.js.map | 1 + .../helper-validator-option/lib/index.js | 6 +- .../helper-validator-option/lib/index.js.map | 1 + .../helper-validator-option/lib/validator.js | 16 +- .../lib/validator.js.map | 1 + .../helper-validator-option/package.json | 2 +- node_modules/@babel/helpers/README.md | 2 +- .../@babel/helpers/lib/helpers-generated.js | 49 +- .../helpers/lib/helpers-generated.js.map | 2 +- node_modules/@babel/helpers/lib/helpers.js | 269 +- .../@babel/helpers/lib/helpers.js.map | 2 +- .../helpers/lib/helpers/AsyncGenerator.js | 2 - .../helpers/lib/helpers/AsyncGenerator.js.map | 2 +- .../helpers/lib/helpers/OverloadYield.js | 1 - .../helpers/lib/helpers/OverloadYield.js.map | 2 +- .../@babel/helpers/lib/helpers/applyDecs.js | 18 +- .../helpers/lib/helpers/applyDecs.js.map | 2 +- .../helpers/lib/helpers/applyDecs2203.js | 600 +-- .../helpers/lib/helpers/applyDecs2203.js.map | 2 +- .../helpers/lib/helpers/applyDecs2203R.js | 376 ++ .../helpers/lib/helpers/applyDecs2203R.js.map | 1 + .../helpers/lib/helpers/applyDecs2301.js | 421 ++ .../helpers/lib/helpers/applyDecs2301.js.map | 1 + .../helpers/lib/helpers/applyDecs2305.js | 235 ++ .../helpers/lib/helpers/applyDecs2305.js.map | 1 + .../lib/helpers/asyncGeneratorDelegate.js | 1 - .../lib/helpers/asyncGeneratorDelegate.js.map | 2 +- .../helpers/lib/helpers/asyncIterator.js | 1 - .../helpers/lib/helpers/asyncIterator.js.map | 2 +- .../lib/helpers/awaitAsyncGenerator.js | 1 - .../lib/helpers/awaitAsyncGenerator.js.map | 2 +- .../@babel/helpers/lib/helpers/callSuper.js | 15 + .../helpers/lib/helpers/callSuper.js.map | 1 + .../@babel/helpers/lib/helpers/checkInRHS.js | 1 - .../helpers/lib/helpers/checkInRHS.js.map | 2 +- .../@babel/helpers/lib/helpers/construct.js | 20 + .../helpers/lib/helpers/construct.js.map | 1 + .../helpers/lib/helpers/defineAccessor.js | 16 + .../helpers/lib/helpers/defineAccessor.js.map | 1 + .../@babel/helpers/lib/helpers/dispose.js | 47 + .../@babel/helpers/lib/helpers/dispose.js.map | 1 + .../helpers/lib/helpers/importDeferProxy.js | 35 + .../lib/helpers/importDeferProxy.js.map | 1 + .../lib/helpers/interopRequireWildcard.js | 49 + .../lib/helpers/interopRequireWildcard.js.map | 1 + .../lib/helpers/isNativeReflectConstruct.js | 16 + .../helpers/isNativeReflectConstruct.js.map | 1 + .../lib/helpers/iterableToArrayLimit.js | 2 - .../lib/helpers/iterableToArrayLimit.js.map | 2 +- .../lib/helpers/iterableToArrayLimitLoose.js | 1 - .../helpers/iterableToArrayLimitLoose.js.map | 2 +- .../@babel/helpers/lib/helpers/jsx.js | 4 +- .../@babel/helpers/lib/helpers/jsx.js.map | 2 +- .../helpers/lib/helpers/objectSpread2.js | 1 - .../helpers/lib/helpers/objectSpread2.js.map | 2 +- .../helpers/lib/helpers/regeneratorRuntime.js | 37 +- .../lib/helpers/regeneratorRuntime.js.map | 2 +- .../helpers/lib/helpers/setFunctionName.js | 21 + .../lib/helpers/setFunctionName.js.map | 1 + .../@babel/helpers/lib/helpers/toPrimitive.js | 18 + .../helpers/lib/helpers/toPrimitive.js.map | 1 + .../helpers/lib/helpers/toPropertyKey.js | 13 + .../helpers/lib/helpers/toPropertyKey.js.map | 1 + .../@babel/helpers/lib/helpers/typeof.js | 1 - .../@babel/helpers/lib/helpers/typeof.js.map | 2 +- .../@babel/helpers/lib/helpers/using.js | 29 + .../@babel/helpers/lib/helpers/using.js.map | 1 + .../@babel/helpers/lib/helpers/usingCtx.js | 68 + .../helpers/lib/helpers/usingCtx.js.map | 1 + .../@babel/helpers/lib/helpers/wrapRegExp.js | 2 - .../helpers/lib/helpers/wrapRegExp.js.map | 2 +- node_modules/@babel/helpers/lib/index.js | 18 +- node_modules/@babel/helpers/lib/index.js.map | 2 +- node_modules/@babel/helpers/package.json | 17 +- .../helpers/scripts/generate-helpers.js | 75 +- .../scripts/generate-regenerator-runtime.js | 15 +- node_modules/@babel/highlight/lib/index.js | 4 +- .../@babel/highlight/lib/index.js.map | 2 +- node_modules/@babel/highlight/package.json | 2 +- node_modules/@babel/parser/lib/index.js | 1633 +++----- node_modules/@babel/parser/lib/index.js.map | 2 +- node_modules/@babel/parser/package.json | 8 +- .../@babel/parser/typings/babel-parser.d.ts | 3 +- .../@babel/template/lib/formatters.js | 15 +- .../@babel/template/lib/formatters.js.map | 2 +- node_modules/@babel/template/lib/index.js | 18 +- node_modules/@babel/template/lib/index.js.map | 2 +- node_modules/@babel/template/package.json | 8 +- node_modules/@babel/traverse/lib/cache.js | 6 +- node_modules/@babel/traverse/lib/cache.js.map | 2 +- node_modules/@babel/traverse/lib/index.js | 3 +- node_modules/@babel/traverse/lib/index.js.map | 2 +- .../@babel/traverse/lib/path/comments.js | 8 +- .../@babel/traverse/lib/path/comments.js.map | 2 +- .../@babel/traverse/lib/path/context.js | 2 +- .../@babel/traverse/lib/path/context.js.map | 2 +- .../@babel/traverse/lib/path/family.js.map | 2 +- .../@babel/traverse/lib/path/index.js | 12 +- .../@babel/traverse/lib/path/index.js.map | 2 +- .../path/inference/inferer-reference.js.map | 2 +- .../traverse/lib/path/inference/util.js | 4 +- .../traverse/lib/path/inference/util.js.map | 2 +- .../@babel/traverse/lib/path/introspection.js | 3 +- .../traverse/lib/path/introspection.js.map | 2 +- .../traverse/lib/path/lib/removal-hooks.js | 3 +- .../lib/path/lib/removal-hooks.js.map | 2 +- .../path/lib/virtual-types-validator.js.map | 2 +- .../traverse/lib/path/lib/virtual-types.js | 54 +- .../lib/path/lib/virtual-types.js.map | 2 +- .../@babel/traverse/lib/path/removal.js | 12 +- .../@babel/traverse/lib/path/removal.js.map | 2 +- .../@babel/traverse/lib/path/replacement.js | 71 +- .../traverse/lib/path/replacement.js.map | 2 +- .../@babel/traverse/lib/scope/index.js | 8 +- .../@babel/traverse/lib/scope/index.js.map | 2 +- node_modules/@babel/traverse/lib/visitors.js | 5 +- .../@babel/traverse/lib/visitors.js.map | 2 +- node_modules/@babel/traverse/package.json | 14 +- .../lib/ast-types/generated/index.js.map | 2 +- .../flow/createTypeAnnotationBasedOnTypeof.js | 3 +- .../createTypeAnnotationBasedOnTypeof.js.map | 2 +- .../types/lib/builders/generated/index.js | 6 +- .../types/lib/builders/generated/index.js.map | 2 +- .../types/lib/constants/generated/index.js | 150 +- .../lib/constants/generated/index.js.map | 2 +- .../@babel/types/lib/constants/index.js | 60 +- .../@babel/types/lib/constants/index.js.map | 2 +- .../converters/gatherSequenceExpressions.js | 1 + .../gatherSequenceExpressions.js.map | 2 +- .../types/lib/converters/toExpression.js | 3 +- .../types/lib/converters/toExpression.js.map | 2 +- .../lib/converters/toSequenceExpression.js | 1 + .../converters/toSequenceExpression.js.map | 2 +- .../types/lib/converters/toStatement.js | 3 +- .../types/lib/converters/toStatement.js.map | 2 +- .../types/lib/converters/valueToNode.js | 3 +- .../types/lib/converters/valueToNode.js.map | 2 +- .../@babel/types/lib/definitions/core.js | 5 +- .../@babel/types/lib/definitions/core.js.map | 2 +- .../lib/definitions/deprecated-aliases.js | 3 +- .../lib/definitions/deprecated-aliases.js.map | 2 +- .../@babel/types/lib/definitions/index.js | 3 +- .../@babel/types/lib/definitions/index.js.map | 2 +- .../types/lib/definitions/placeholders.js | 9 +- .../types/lib/definitions/placeholders.js.map | 2 +- .../types/lib/definitions/typescript.js | 3 +- .../types/lib/definitions/typescript.js.map | 2 +- .../@babel/types/lib/definitions/utils.js | 21 +- .../@babel/types/lib/definitions/utils.js.map | 2 +- .../@babel/types/lib/index-legacy.d.ts | 4 +- node_modules/@babel/types/lib/index.d.ts | 3656 ++++++++--------- node_modules/@babel/types/lib/index.js | 14 +- node_modules/@babel/types/lib/index.js.flow | 4 +- node_modules/@babel/types/lib/index.js.map | 2 +- .../lib/retrievers/getBindingIdentifiers.js | 5 +- .../retrievers/getBindingIdentifiers.js.map | 2 +- .../retrievers/getOuterBindingIdentifiers.js | 3 +- .../getOuterBindingIdentifiers.js.map | 2 +- .../lib/validators/generated/index.js.map | 2 +- .../lib/validators/react/isReactComponent.js | 3 +- .../validators/react/isReactComponent.js.map | 2 +- node_modules/@babel/types/package.json | 8 +- node_modules/browserslist/README.md | 16 +- node_modules/browserslist/browser.js | 4 +- node_modules/browserslist/cli.js | 7 +- node_modules/browserslist/index.d.ts | 4 +- node_modules/browserslist/index.js | 129 +- node_modules/browserslist/node.js | 13 +- node_modules/browserslist/package.json | 14 +- node_modules/caniuse-lite/README.md | 90 +- node_modules/caniuse-lite/data/agents.js | 2 +- .../caniuse-lite/data/browserVersions.js | 2 +- node_modules/caniuse-lite/data/features.js | 2 +- .../caniuse-lite/data/features/aac.js | 2 +- .../data/features/abortcontroller.js | 2 +- .../caniuse-lite/data/features/ac3-ec3.js | 2 +- .../data/features/accelerometer.js | 2 +- .../data/features/addeventlistener.js | 2 +- .../data/features/alternate-stylesheet.js | 2 +- .../data/features/ambient-light.js | 2 +- .../caniuse-lite/data/features/apng.js | 2 +- .../data/features/array-find-index.js | 2 +- .../caniuse-lite/data/features/array-find.js | 2 +- .../caniuse-lite/data/features/array-flat.js | 2 +- .../data/features/array-includes.js | 2 +- .../data/features/arrow-functions.js | 2 +- .../caniuse-lite/data/features/asmjs.js | 2 +- .../data/features/async-clipboard.js | 2 +- .../data/features/async-functions.js | 2 +- .../caniuse-lite/data/features/atob-btoa.js | 2 +- .../caniuse-lite/data/features/audio-api.js | 2 +- .../caniuse-lite/data/features/audio.js | 2 +- .../caniuse-lite/data/features/audiotracks.js | 2 +- .../caniuse-lite/data/features/autofocus.js | 2 +- .../caniuse-lite/data/features/auxclick.js | 2 +- .../caniuse-lite/data/features/av1.js | 2 +- .../caniuse-lite/data/features/avif.js | 2 +- .../data/features/background-attachment.js | 2 +- .../data/features/background-clip-text.js | 2 +- .../data/features/background-img-opts.js | 2 +- .../data/features/background-position-x-y.js | 2 +- .../features/background-repeat-round-space.js | 2 +- .../data/features/background-sync.js | 2 +- .../data/features/battery-status.js | 2 +- .../caniuse-lite/data/features/beacon.js | 2 +- .../data/features/beforeafterprint.js | 2 +- .../caniuse-lite/data/features/bigint.js | 2 +- .../caniuse-lite/data/features/blobbuilder.js | 2 +- .../caniuse-lite/data/features/bloburls.js | 2 +- .../data/features/border-image.js | 2 +- .../data/features/border-radius.js | 2 +- .../data/features/broadcastchannel.js | 2 +- .../caniuse-lite/data/features/brotli.js | 2 +- .../caniuse-lite/data/features/calc.js | 2 +- .../data/features/canvas-blending.js | 2 +- .../caniuse-lite/data/features/canvas-text.js | 2 +- .../caniuse-lite/data/features/canvas.js | 2 +- .../caniuse-lite/data/features/ch-unit.js | 2 +- .../data/features/chacha20-poly1305.js | 2 +- .../data/features/channel-messaging.js | 2 +- .../data/features/childnode-remove.js | 2 +- .../caniuse-lite/data/features/classlist.js | 2 +- .../client-hints-dpr-width-viewport.js | 2 +- .../caniuse-lite/data/features/clipboard.js | 2 +- .../caniuse-lite/data/features/colr-v1.js | 2 +- .../caniuse-lite/data/features/colr.js | 2 +- .../data/features/comparedocumentposition.js | 2 +- .../data/features/console-basic.js | 2 +- .../data/features/console-time.js | 2 +- .../caniuse-lite/data/features/const.js | 2 +- .../data/features/constraint-validation.js | 2 +- .../data/features/contenteditable.js | 2 +- .../data/features/contentsecuritypolicy.js | 2 +- .../data/features/contentsecuritypolicy2.js | 2 +- .../data/features/cookie-store-api.js | 2 +- .../caniuse-lite/data/features/cors.js | 2 +- .../data/features/createimagebitmap.js | 2 +- .../data/features/credential-management.js | 2 +- .../data/features/cryptography.js | 2 +- .../caniuse-lite/data/features/css-all.js | 2 +- .../data/features/css-anchor-positioning.js | 1 + .../data/features/css-animation.js | 2 +- .../data/features/css-any-link.js | 2 +- .../data/features/css-appearance.js | 2 +- .../data/features/css-at-counter-style.js | 2 +- .../data/features/css-autofill.js | 2 +- .../data/features/css-backdrop-filter.js | 2 +- .../data/features/css-background-offsets.js | 2 +- .../data/features/css-backgroundblendmode.js | 2 +- .../data/features/css-boxdecorationbreak.js | 2 +- .../data/features/css-boxshadow.js | 2 +- .../caniuse-lite/data/features/css-canvas.js | 2 +- .../data/features/css-caret-color.js | 2 +- .../data/features/css-cascade-layers.js | 2 +- .../data/features/css-cascade-scope.js | 1 + .../data/features/css-case-insensitive.js | 2 +- .../data/features/css-clip-path.js | 2 +- .../data/features/css-color-adjust.js | 2 +- .../data/features/css-color-function.js | 2 +- .../data/features/css-conic-gradients.js | 2 +- .../features/css-container-queries-style.js | 1 + .../data/features/css-container-queries.js | 2 +- .../features/css-container-query-units.js | 2 +- .../data/features/css-containment.js | 2 +- .../data/features/css-content-visibility.js | 2 +- .../data/features/css-counters.js | 2 +- .../data/features/css-crisp-edges.js | 2 +- .../data/features/css-cross-fade.js | 2 +- .../data/features/css-default-pseudo.js | 2 +- .../data/features/css-descendant-gtgt.js | 2 +- .../data/features/css-deviceadaptation.js | 2 +- .../data/features/css-dir-pseudo.js | 2 +- .../data/features/css-display-contents.js | 2 +- .../data/features/css-element-function.js | 2 +- .../data/features/css-env-function.js | 2 +- .../data/features/css-exclusions.js | 2 +- .../data/features/css-featurequeries.js | 2 +- .../data/features/css-file-selector-button.js | 2 +- .../data/features/css-filter-function.js | 2 +- .../caniuse-lite/data/features/css-filters.js | 2 +- .../data/features/css-first-letter.js | 2 +- .../data/features/css-first-line.js | 2 +- .../caniuse-lite/data/features/css-fixed.js | 2 +- .../data/features/css-focus-visible.js | 2 +- .../data/features/css-focus-within.js | 2 +- .../data/features/css-font-palette.js | 2 +- .../features/css-font-rendering-controls.js | 2 +- .../data/features/css-font-stretch.js | 2 +- .../data/features/css-gencontent.js | 2 +- .../data/features/css-gradients.js | 2 +- .../data/features/css-grid-animation.js | 2 +- .../caniuse-lite/data/features/css-grid.js | 2 +- .../data/features/css-hanging-punctuation.js | 2 +- .../caniuse-lite/data/features/css-has.js | 2 +- .../caniuse-lite/data/features/css-hyphens.js | 2 +- .../data/features/css-image-orientation.js | 2 +- .../data/features/css-image-set.js | 2 +- .../data/features/css-in-out-of-range.js | 2 +- .../data/features/css-indeterminate-pseudo.js | 2 +- .../data/features/css-initial-letter.js | 2 +- .../data/features/css-initial-value.js | 2 +- .../caniuse-lite/data/features/css-lch-lab.js | 2 +- .../data/features/css-letter-spacing.js | 2 +- .../data/features/css-line-clamp.js | 2 +- .../data/features/css-logical-props.js | 2 +- .../data/features/css-marker-pseudo.js | 2 +- .../caniuse-lite/data/features/css-masks.js | 2 +- .../data/features/css-matches-pseudo.js | 2 +- .../data/features/css-math-functions.js | 2 +- .../data/features/css-media-interaction.js | 2 +- .../data/features/css-media-range-syntax.js | 2 +- .../data/features/css-media-resolution.js | 2 +- .../data/features/css-media-scripting.js | 2 +- .../data/features/css-mediaqueries.js | 2 +- .../data/features/css-mixblendmode.js | 2 +- .../data/features/css-motion-paths.js | 2 +- .../data/features/css-namespaces.js | 2 +- .../caniuse-lite/data/features/css-nesting.js | 2 +- .../data/features/css-not-sel-list.js | 2 +- .../data/features/css-nth-child-of.js | 2 +- .../caniuse-lite/data/features/css-opacity.js | 2 +- .../data/features/css-optional-pseudo.js | 2 +- .../data/features/css-overflow-anchor.js | 2 +- .../data/features/css-overflow-overlay.js | 2 +- .../data/features/css-overflow.js | 2 +- .../data/features/css-overscroll-behavior.js | 2 +- .../data/features/css-page-break.js | 2 +- .../data/features/css-paged-media.js | 2 +- .../data/features/css-paint-api.js | 2 +- .../data/features/css-placeholder-shown.js | 2 +- .../data/features/css-placeholder.js | 2 +- .../data/features/css-print-color-adjust.js | 2 +- .../data/features/css-read-only-write.js | 2 +- .../data/features/css-rebeccapurple.js | 2 +- .../data/features/css-reflections.js | 2 +- .../caniuse-lite/data/features/css-regions.js | 2 +- .../data/features/css-relative-colors.js | 1 + .../data/features/css-repeating-gradients.js | 2 +- .../caniuse-lite/data/features/css-resize.js | 2 +- .../data/features/css-revert-value.js | 2 +- .../data/features/css-rrggbbaa.js | 2 +- .../data/features/css-scroll-behavior.js | 2 +- .../data/features/css-scroll-timeline.js | 2 +- .../data/features/css-scrollbar.js | 2 +- .../caniuse-lite/data/features/css-sel2.js | 2 +- .../caniuse-lite/data/features/css-sel3.js | 2 +- .../data/features/css-selection.js | 2 +- .../caniuse-lite/data/features/css-shapes.js | 2 +- .../data/features/css-snappoints.js | 2 +- .../caniuse-lite/data/features/css-sticky.js | 2 +- .../caniuse-lite/data/features/css-subgrid.js | 2 +- .../data/features/css-supports-api.js | 2 +- .../caniuse-lite/data/features/css-table.js | 2 +- .../data/features/css-text-align-last.js | 2 +- .../data/features/css-text-box-trim.js | 1 + .../data/features/css-text-indent.js | 2 +- .../data/features/css-text-justify.js | 2 +- .../data/features/css-text-orientation.js | 2 +- .../data/features/css-text-spacing.js | 2 +- .../data/features/css-text-wrap-balance.js | 1 + .../data/features/css-textshadow.js | 2 +- .../data/features/css-touch-action.js | 2 +- .../data/features/css-transitions.js | 2 +- .../data/features/css-unicode-bidi.js | 2 +- .../data/features/css-unset-value.js | 2 +- .../data/features/css-variables.js | 2 +- .../data/features/css-when-else.js | 2 +- .../data/features/css-widows-orphans.js | 2 +- .../data/features/css-width-stretch.js | 2 +- .../data/features/css-writing-mode.js | 2 +- .../caniuse-lite/data/features/css-zoom.js | 2 +- .../caniuse-lite/data/features/css3-attr.js | 2 +- .../data/features/css3-boxsizing.js | 2 +- .../caniuse-lite/data/features/css3-colors.js | 2 +- .../data/features/css3-cursors-grab.js | 2 +- .../data/features/css3-cursors-newer.js | 2 +- .../data/features/css3-cursors.js | 2 +- .../data/features/css3-tabsize.js | 2 +- .../data/features/currentcolor.js | 2 +- .../data/features/custom-elements.js | 2 +- .../data/features/custom-elementsv1.js | 2 +- .../caniuse-lite/data/features/customevent.js | 2 +- .../caniuse-lite/data/features/datalist.js | 2 +- .../caniuse-lite/data/features/dataset.js | 2 +- .../caniuse-lite/data/features/datauri.js | 2 +- .../data/features/date-tolocaledatestring.js | 2 +- .../data/features/declarative-shadow-dom.js | 2 +- .../caniuse-lite/data/features/decorators.js | 2 +- .../caniuse-lite/data/features/details.js | 2 +- .../data/features/deviceorientation.js | 2 +- .../data/features/devicepixelratio.js | 2 +- .../caniuse-lite/data/features/dialog.js | 2 +- .../data/features/dispatchevent.js | 2 +- .../caniuse-lite/data/features/dnssec.js | 2 +- .../data/features/do-not-track.js | 2 +- .../data/features/document-currentscript.js | 2 +- .../data/features/document-evaluate-xpath.js | 2 +- .../data/features/document-execcommand.js | 2 +- .../data/features/document-policy.js | 2 +- .../features/document-scrollingelement.js | 2 +- .../data/features/documenthead.js | 2 +- .../data/features/dom-manip-convenience.js | 2 +- .../caniuse-lite/data/features/dom-range.js | 2 +- .../data/features/domcontentloaded.js | 2 +- .../caniuse-lite/data/features/dommatrix.js | 2 +- .../caniuse-lite/data/features/download.js | 2 +- .../caniuse-lite/data/features/dragndrop.js | 2 +- .../data/features/element-closest.js | 2 +- .../data/features/element-from-point.js | 2 +- .../data/features/element-scroll-methods.js | 2 +- .../caniuse-lite/data/features/eme.js | 2 +- .../caniuse-lite/data/features/eot.js | 2 +- .../caniuse-lite/data/features/es5.js | 2 +- .../caniuse-lite/data/features/es6-class.js | 2 +- .../data/features/es6-generators.js | 2 +- .../features/es6-module-dynamic-import.js | 2 +- .../caniuse-lite/data/features/es6-module.js | 2 +- .../caniuse-lite/data/features/es6-number.js | 2 +- .../data/features/es6-string-includes.js | 2 +- .../caniuse-lite/data/features/es6.js | 2 +- .../caniuse-lite/data/features/eventsource.js | 2 +- .../data/features/extended-system-fonts.js | 2 +- .../data/features/feature-policy.js | 2 +- .../caniuse-lite/data/features/fetch.js | 2 +- .../data/features/fieldset-disabled.js | 2 +- .../caniuse-lite/data/features/fileapi.js | 2 +- .../caniuse-lite/data/features/filereader.js | 2 +- .../data/features/filereadersync.js | 2 +- .../caniuse-lite/data/features/filesystem.js | 2 +- .../caniuse-lite/data/features/flac.js | 2 +- .../caniuse-lite/data/features/flexbox-gap.js | 2 +- .../caniuse-lite/data/features/flexbox.js | 2 +- .../caniuse-lite/data/features/flow-root.js | 2 +- .../data/features/focusin-focusout-events.js | 2 +- .../data/features/font-family-system-ui.js | 2 +- .../data/features/font-feature.js | 2 +- .../data/features/font-kerning.js | 2 +- .../data/features/font-loading.js | 2 +- .../data/features/font-size-adjust.js | 2 +- .../caniuse-lite/data/features/font-smooth.js | 2 +- .../data/features/font-unicode-range.js | 2 +- .../data/features/font-variant-alternates.js | 2 +- .../data/features/font-variant-numeric.js | 2 +- .../caniuse-lite/data/features/fontface.js | 2 +- .../data/features/form-attribute.js | 2 +- .../data/features/form-submit-attributes.js | 2 +- .../data/features/form-validation.js | 2 +- .../caniuse-lite/data/features/forms.js | 2 +- .../caniuse-lite/data/features/fullscreen.js | 2 +- .../caniuse-lite/data/features/gamepad.js | 2 +- .../caniuse-lite/data/features/geolocation.js | 2 +- .../data/features/getboundingclientrect.js | 2 +- .../data/features/getcomputedstyle.js | 2 +- .../data/features/getelementsbyclassname.js | 2 +- .../data/features/getrandomvalues.js | 2 +- .../caniuse-lite/data/features/gyroscope.js | 2 +- .../data/features/hardwareconcurrency.js | 2 +- .../caniuse-lite/data/features/hashchange.js | 2 +- .../caniuse-lite/data/features/heif.js | 2 +- .../caniuse-lite/data/features/hevc.js | 2 +- .../caniuse-lite/data/features/hidden.js | 2 +- .../data/features/high-resolution-time.js | 2 +- .../caniuse-lite/data/features/history.js | 2 +- .../data/features/html-media-capture.js | 2 +- .../data/features/html5semantic.js | 2 +- .../data/features/http-live-streaming.js | 2 +- .../caniuse-lite/data/features/http2.js | 2 +- .../caniuse-lite/data/features/http3.js | 2 +- .../data/features/iframe-sandbox.js | 2 +- .../data/features/iframe-seamless.js | 2 +- .../data/features/iframe-srcdoc.js | 2 +- .../data/features/imagecapture.js | 2 +- .../caniuse-lite/data/features/ime.js | 2 +- .../img-naturalwidth-naturalheight.js | 2 +- .../caniuse-lite/data/features/import-maps.js | 2 +- .../caniuse-lite/data/features/imports.js | 2 +- .../data/features/indeterminate-checkbox.js | 2 +- .../caniuse-lite/data/features/indexeddb.js | 2 +- .../caniuse-lite/data/features/indexeddb2.js | 2 +- .../data/features/inline-block.js | 2 +- .../caniuse-lite/data/features/innertext.js | 2 +- .../data/features/input-autocomplete-onoff.js | 2 +- .../caniuse-lite/data/features/input-color.js | 2 +- .../data/features/input-datetime.js | 2 +- .../data/features/input-email-tel-url.js | 2 +- .../caniuse-lite/data/features/input-event.js | 2 +- .../data/features/input-file-accept.js | 2 +- .../data/features/input-file-directory.js | 2 +- .../data/features/input-file-multiple.js | 2 +- .../data/features/input-inputmode.js | 2 +- .../data/features/input-minlength.js | 2 +- .../data/features/input-number.js | 2 +- .../data/features/input-pattern.js | 2 +- .../data/features/input-placeholder.js | 2 +- .../caniuse-lite/data/features/input-range.js | 2 +- .../data/features/input-search.js | 2 +- .../data/features/input-selection.js | 2 +- .../data/features/insert-adjacent.js | 2 +- .../data/features/insertadjacenthtml.js | 2 +- .../data/features/internationalization.js | 2 +- .../data/features/intersectionobserver-v2.js | 2 +- .../data/features/intersectionobserver.js | 2 +- .../data/features/intl-pluralrules.js | 2 +- .../data/features/intrinsic-width.js | 2 +- .../caniuse-lite/data/features/jpeg2000.js | 2 +- .../caniuse-lite/data/features/jpegxl.js | 2 +- .../caniuse-lite/data/features/jpegxr.js | 2 +- .../data/features/js-regexp-lookbehind.js | 2 +- .../caniuse-lite/data/features/json.js | 2 +- .../features/justify-content-space-evenly.js | 2 +- .../data/features/kerning-pairs-ligatures.js | 2 +- .../data/features/keyboardevent-charcode.js | 2 +- .../data/features/keyboardevent-code.js | 2 +- .../keyboardevent-getmodifierstate.js | 2 +- .../data/features/keyboardevent-key.js | 2 +- .../data/features/keyboardevent-location.js | 2 +- .../data/features/keyboardevent-which.js | 2 +- .../caniuse-lite/data/features/lazyload.js | 2 +- .../caniuse-lite/data/features/let.js | 2 +- .../data/features/link-icon-png.js | 2 +- .../data/features/link-icon-svg.js | 2 +- .../data/features/link-rel-dns-prefetch.js | 2 +- .../data/features/link-rel-modulepreload.js | 2 +- .../data/features/link-rel-preconnect.js | 2 +- .../data/features/link-rel-prefetch.js | 2 +- .../data/features/link-rel-preload.js | 2 +- .../data/features/link-rel-prerender.js | 2 +- .../data/features/loading-lazy-attr.js | 2 +- .../data/features/localecompare.js | 2 +- .../data/features/magnetometer.js | 2 +- .../data/features/matchesselector.js | 2 +- .../caniuse-lite/data/features/matchmedia.js | 2 +- .../caniuse-lite/data/features/mathml.js | 2 +- .../caniuse-lite/data/features/maxlength.js | 2 +- .../mdn-css-backdrop-pseudo-element.js | 1 + .../mdn-css-unicode-bidi-isolate-override.js | 2 +- .../features/mdn-css-unicode-bidi-isolate.js | 2 +- .../mdn-css-unicode-bidi-plaintext.js | 2 +- .../features/mdn-text-decoration-color.js | 2 +- .../data/features/mdn-text-decoration-line.js | 2 +- .../features/mdn-text-decoration-shorthand.js | 2 +- .../features/mdn-text-decoration-style.js | 2 +- .../data/features/media-fragments.js | 2 +- .../data/features/mediacapture-fromelement.js | 2 +- .../data/features/mediarecorder.js | 2 +- .../caniuse-lite/data/features/mediasource.js | 2 +- .../caniuse-lite/data/features/menu.js | 2 +- .../data/features/meta-theme-color.js | 2 +- .../caniuse-lite/data/features/meter.js | 2 +- .../caniuse-lite/data/features/midi.js | 2 +- .../caniuse-lite/data/features/minmaxwh.js | 2 +- .../caniuse-lite/data/features/mp3.js | 2 +- .../caniuse-lite/data/features/mpeg-dash.js | 2 +- .../caniuse-lite/data/features/mpeg4.js | 2 +- .../data/features/multibackgrounds.js | 2 +- .../caniuse-lite/data/features/multicolumn.js | 2 +- .../data/features/mutation-events.js | 2 +- .../data/features/mutationobserver.js | 2 +- .../data/features/namevalue-storage.js | 2 +- .../data/features/native-filesystem-api.js | 2 +- .../caniuse-lite/data/features/nav-timing.js | 2 +- .../caniuse-lite/data/features/netinfo.js | 2 +- .../data/features/notifications.js | 2 +- .../data/features/object-entries.js | 2 +- .../caniuse-lite/data/features/object-fit.js | 2 +- .../data/features/object-observe.js | 2 +- .../data/features/object-values.js | 2 +- .../caniuse-lite/data/features/objectrtc.js | 2 +- .../data/features/offline-apps.js | 2 +- .../data/features/offscreencanvas.js | 2 +- .../caniuse-lite/data/features/ogg-vorbis.js | 2 +- .../caniuse-lite/data/features/ogv.js | 2 +- .../caniuse-lite/data/features/ol-reversed.js | 2 +- .../data/features/once-event-listener.js | 2 +- .../data/features/online-status.js | 2 +- .../caniuse-lite/data/features/opus.js | 2 +- .../data/features/orientation-sensor.js | 2 +- .../caniuse-lite/data/features/outline.js | 2 +- .../data/features/pad-start-end.js | 2 +- .../data/features/page-transition-events.js | 2 +- .../data/features/pagevisibility.js | 2 +- .../data/features/passive-event-listener.js | 2 +- .../caniuse-lite/data/features/passkeys.js | 1 + .../data/features/passwordrules.js | 2 +- .../caniuse-lite/data/features/path2d.js | 2 +- .../data/features/payment-request.js | 2 +- .../caniuse-lite/data/features/pdf-viewer.js | 2 +- .../data/features/permissions-api.js | 2 +- .../data/features/permissions-policy.js | 2 +- .../data/features/picture-in-picture.js | 2 +- .../caniuse-lite/data/features/picture.js | 2 +- .../caniuse-lite/data/features/ping.js | 2 +- .../caniuse-lite/data/features/png-alpha.js | 2 +- .../data/features/pointer-events.js | 2 +- .../caniuse-lite/data/features/pointer.js | 2 +- .../caniuse-lite/data/features/pointerlock.js | 2 +- .../caniuse-lite/data/features/portals.js | 2 +- .../data/features/prefers-color-scheme.js | 2 +- .../data/features/prefers-reduced-motion.js | 2 +- .../caniuse-lite/data/features/progress.js | 2 +- .../data/features/promise-finally.js | 2 +- .../caniuse-lite/data/features/promises.js | 2 +- .../caniuse-lite/data/features/proximity.js | 2 +- .../caniuse-lite/data/features/proxy.js | 2 +- .../data/features/publickeypinning.js | 2 +- .../caniuse-lite/data/features/push-api.js | 2 +- .../data/features/queryselector.js | 2 +- .../data/features/readonly-attr.js | 2 +- .../data/features/referrer-policy.js | 2 +- .../data/features/registerprotocolhandler.js | 2 +- .../data/features/rel-noopener.js | 2 +- .../data/features/rel-noreferrer.js | 2 +- .../caniuse-lite/data/features/rellist.js | 2 +- .../caniuse-lite/data/features/rem.js | 2 +- .../data/features/requestanimationframe.js | 2 +- .../data/features/requestidlecallback.js | 2 +- .../data/features/resizeobserver.js | 2 +- .../data/features/resource-timing.js | 2 +- .../data/features/rest-parameters.js | 2 +- .../data/features/rtcpeerconnection.js | 2 +- .../caniuse-lite/data/features/ruby.js | 2 +- .../caniuse-lite/data/features/run-in.js | 2 +- .../features/same-site-cookie-attribute.js | 2 +- .../data/features/screen-orientation.js | 2 +- .../data/features/script-async.js | 2 +- .../data/features/script-defer.js | 2 +- .../data/features/scrollintoview.js | 2 +- .../data/features/scrollintoviewifneeded.js | 2 +- .../caniuse-lite/data/features/sdch.js | 2 +- .../data/features/selection-api.js | 2 +- .../caniuse-lite/data/features/selectlist.js | 1 + .../data/features/server-timing.js | 2 +- .../data/features/serviceworkers.js | 2 +- .../data/features/setimmediate.js | 2 +- .../caniuse-lite/data/features/shadowdom.js | 2 +- .../caniuse-lite/data/features/shadowdomv1.js | 2 +- .../data/features/sharedarraybuffer.js | 2 +- .../data/features/sharedworkers.js | 2 +- .../caniuse-lite/data/features/sni.js | 2 +- .../caniuse-lite/data/features/spdy.js | 2 +- .../data/features/speech-recognition.js | 2 +- .../data/features/speech-synthesis.js | 2 +- .../data/features/spellcheck-attribute.js | 2 +- .../caniuse-lite/data/features/sql-storage.js | 2 +- .../caniuse-lite/data/features/srcset.js | 2 +- .../caniuse-lite/data/features/stream.js | 2 +- .../caniuse-lite/data/features/streams.js | 2 +- .../data/features/stricttransportsecurity.js | 2 +- .../data/features/style-scoped.js | 2 +- .../data/features/subresource-bundling.js | 2 +- .../data/features/subresource-integrity.js | 2 +- .../caniuse-lite/data/features/svg-css.js | 2 +- .../caniuse-lite/data/features/svg-filters.js | 2 +- .../caniuse-lite/data/features/svg-fonts.js | 2 +- .../data/features/svg-fragment.js | 2 +- .../caniuse-lite/data/features/svg-html.js | 2 +- .../caniuse-lite/data/features/svg-html5.js | 2 +- .../caniuse-lite/data/features/svg-img.js | 2 +- .../caniuse-lite/data/features/svg-smil.js | 2 +- .../caniuse-lite/data/features/svg.js | 2 +- .../caniuse-lite/data/features/sxg.js | 2 +- .../data/features/tabindex-attr.js | 2 +- .../data/features/template-literals.js | 2 +- .../caniuse-lite/data/features/template.js | 2 +- .../caniuse-lite/data/features/temporal.js | 2 +- .../caniuse-lite/data/features/testfeat.js | 2 +- .../data/features/text-decoration.js | 2 +- .../data/features/text-emphasis.js | 2 +- .../data/features/text-overflow.js | 2 +- .../data/features/text-size-adjust.js | 2 +- .../caniuse-lite/data/features/text-stroke.js | 2 +- .../caniuse-lite/data/features/textcontent.js | 2 +- .../caniuse-lite/data/features/textencoder.js | 2 +- .../caniuse-lite/data/features/tls1-1.js | 2 +- .../caniuse-lite/data/features/tls1-2.js | 2 +- .../caniuse-lite/data/features/tls1-3.js | 2 +- .../caniuse-lite/data/features/touch.js | 2 +- .../data/features/transforms2d.js | 2 +- .../data/features/transforms3d.js | 2 +- .../data/features/trusted-types.js | 2 +- .../caniuse-lite/data/features/ttf.js | 2 +- .../caniuse-lite/data/features/typedarrays.js | 2 +- .../caniuse-lite/data/features/u2f.js | 2 +- .../data/features/unhandledrejection.js | 2 +- .../data/features/upgradeinsecurerequests.js | 2 +- .../features/url-scroll-to-text-fragment.js | 2 +- .../caniuse-lite/data/features/url.js | 2 +- .../data/features/urlsearchparams.js | 2 +- .../caniuse-lite/data/features/use-strict.js | 2 +- .../data/features/user-select-none.js | 2 +- .../caniuse-lite/data/features/user-timing.js | 2 +- .../data/features/variable-fonts.js | 2 +- .../data/features/vector-effect.js | 2 +- .../caniuse-lite/data/features/vibration.js | 2 +- .../caniuse-lite/data/features/video.js | 2 +- .../caniuse-lite/data/features/videotracks.js | 2 +- .../data/features/view-transitions.js | 1 + .../data/features/viewport-unit-variants.js | 2 +- .../data/features/viewport-units.js | 2 +- .../caniuse-lite/data/features/wai-aria.js | 2 +- .../caniuse-lite/data/features/wake-lock.js | 2 +- .../caniuse-lite/data/features/wasm.js | 2 +- .../caniuse-lite/data/features/wav.js | 2 +- .../caniuse-lite/data/features/wbr-element.js | 2 +- .../data/features/web-animation.js | 2 +- .../data/features/web-app-manifest.js | 2 +- .../data/features/web-bluetooth.js | 2 +- .../caniuse-lite/data/features/web-serial.js | 2 +- .../caniuse-lite/data/features/web-share.js | 2 +- .../caniuse-lite/data/features/webauthn.js | 2 +- .../caniuse-lite/data/features/webcodecs.js | 2 +- .../caniuse-lite/data/features/webgl.js | 2 +- .../caniuse-lite/data/features/webgl2.js | 2 +- .../caniuse-lite/data/features/webgpu.js | 2 +- .../caniuse-lite/data/features/webhid.js | 2 +- .../data/features/webkit-user-drag.js | 2 +- .../caniuse-lite/data/features/webm.js | 2 +- .../caniuse-lite/data/features/webnfc.js | 2 +- .../caniuse-lite/data/features/webp.js | 2 +- .../caniuse-lite/data/features/websockets.js | 2 +- .../data/features/webtransport.js | 2 +- .../caniuse-lite/data/features/webusb.js | 2 +- .../caniuse-lite/data/features/webvr.js | 2 +- .../caniuse-lite/data/features/webvtt.js | 2 +- .../caniuse-lite/data/features/webworkers.js | 2 +- .../caniuse-lite/data/features/webxr.js | 2 +- .../caniuse-lite/data/features/will-change.js | 2 +- .../caniuse-lite/data/features/woff.js | 2 +- .../caniuse-lite/data/features/woff2.js | 2 +- .../caniuse-lite/data/features/word-break.js | 2 +- .../caniuse-lite/data/features/wordwrap.js | 2 +- .../data/features/x-doc-messaging.js | 2 +- .../data/features/x-frame-options.js | 2 +- .../caniuse-lite/data/features/xhr2.js | 2 +- .../caniuse-lite/data/features/xhtml.js | 2 +- .../caniuse-lite/data/features/xhtmlsmil.js | 2 +- .../data/features/xml-serializer.js | 2 +- .../caniuse-lite/data/features/zstd.js | 1 + node_modules/caniuse-lite/data/regions/AD.js | 2 +- node_modules/caniuse-lite/data/regions/AE.js | 2 +- node_modules/caniuse-lite/data/regions/AF.js | 2 +- node_modules/caniuse-lite/data/regions/AG.js | 2 +- node_modules/caniuse-lite/data/regions/AI.js | 2 +- node_modules/caniuse-lite/data/regions/AL.js | 2 +- node_modules/caniuse-lite/data/regions/AM.js | 2 +- node_modules/caniuse-lite/data/regions/AO.js | 2 +- node_modules/caniuse-lite/data/regions/AR.js | 2 +- node_modules/caniuse-lite/data/regions/AS.js | 2 +- node_modules/caniuse-lite/data/regions/AT.js | 2 +- node_modules/caniuse-lite/data/regions/AU.js | 2 +- node_modules/caniuse-lite/data/regions/AW.js | 2 +- node_modules/caniuse-lite/data/regions/AX.js | 2 +- node_modules/caniuse-lite/data/regions/AZ.js | 2 +- node_modules/caniuse-lite/data/regions/BA.js | 2 +- node_modules/caniuse-lite/data/regions/BB.js | 2 +- node_modules/caniuse-lite/data/regions/BD.js | 2 +- node_modules/caniuse-lite/data/regions/BE.js | 2 +- node_modules/caniuse-lite/data/regions/BF.js | 2 +- node_modules/caniuse-lite/data/regions/BG.js | 2 +- node_modules/caniuse-lite/data/regions/BH.js | 2 +- node_modules/caniuse-lite/data/regions/BI.js | 2 +- node_modules/caniuse-lite/data/regions/BJ.js | 2 +- node_modules/caniuse-lite/data/regions/BM.js | 2 +- node_modules/caniuse-lite/data/regions/BN.js | 2 +- node_modules/caniuse-lite/data/regions/BO.js | 2 +- node_modules/caniuse-lite/data/regions/BR.js | 2 +- node_modules/caniuse-lite/data/regions/BS.js | 2 +- node_modules/caniuse-lite/data/regions/BT.js | 2 +- node_modules/caniuse-lite/data/regions/BW.js | 2 +- node_modules/caniuse-lite/data/regions/BY.js | 2 +- node_modules/caniuse-lite/data/regions/BZ.js | 2 +- node_modules/caniuse-lite/data/regions/CA.js | 2 +- node_modules/caniuse-lite/data/regions/CD.js | 2 +- node_modules/caniuse-lite/data/regions/CF.js | 2 +- node_modules/caniuse-lite/data/regions/CG.js | 2 +- node_modules/caniuse-lite/data/regions/CH.js | 2 +- node_modules/caniuse-lite/data/regions/CI.js | 2 +- node_modules/caniuse-lite/data/regions/CK.js | 2 +- node_modules/caniuse-lite/data/regions/CL.js | 2 +- node_modules/caniuse-lite/data/regions/CM.js | 2 +- node_modules/caniuse-lite/data/regions/CN.js | 2 +- node_modules/caniuse-lite/data/regions/CO.js | 2 +- node_modules/caniuse-lite/data/regions/CR.js | 2 +- node_modules/caniuse-lite/data/regions/CU.js | 2 +- node_modules/caniuse-lite/data/regions/CV.js | 2 +- node_modules/caniuse-lite/data/regions/CX.js | 2 +- node_modules/caniuse-lite/data/regions/CY.js | 2 +- node_modules/caniuse-lite/data/regions/CZ.js | 2 +- node_modules/caniuse-lite/data/regions/DE.js | 2 +- node_modules/caniuse-lite/data/regions/DJ.js | 2 +- node_modules/caniuse-lite/data/regions/DK.js | 2 +- node_modules/caniuse-lite/data/regions/DM.js | 2 +- node_modules/caniuse-lite/data/regions/DO.js | 2 +- node_modules/caniuse-lite/data/regions/DZ.js | 2 +- node_modules/caniuse-lite/data/regions/EC.js | 2 +- node_modules/caniuse-lite/data/regions/EE.js | 2 +- node_modules/caniuse-lite/data/regions/EG.js | 2 +- node_modules/caniuse-lite/data/regions/ER.js | 2 +- node_modules/caniuse-lite/data/regions/ES.js | 2 +- node_modules/caniuse-lite/data/regions/ET.js | 2 +- node_modules/caniuse-lite/data/regions/FI.js | 2 +- node_modules/caniuse-lite/data/regions/FJ.js | 2 +- node_modules/caniuse-lite/data/regions/FK.js | 2 +- node_modules/caniuse-lite/data/regions/FM.js | 2 +- node_modules/caniuse-lite/data/regions/FO.js | 2 +- node_modules/caniuse-lite/data/regions/FR.js | 2 +- node_modules/caniuse-lite/data/regions/GA.js | 2 +- node_modules/caniuse-lite/data/regions/GB.js | 2 +- node_modules/caniuse-lite/data/regions/GD.js | 2 +- node_modules/caniuse-lite/data/regions/GE.js | 2 +- node_modules/caniuse-lite/data/regions/GF.js | 2 +- node_modules/caniuse-lite/data/regions/GG.js | 2 +- node_modules/caniuse-lite/data/regions/GH.js | 2 +- node_modules/caniuse-lite/data/regions/GI.js | 2 +- node_modules/caniuse-lite/data/regions/GL.js | 2 +- node_modules/caniuse-lite/data/regions/GM.js | 2 +- node_modules/caniuse-lite/data/regions/GN.js | 2 +- node_modules/caniuse-lite/data/regions/GP.js | 2 +- node_modules/caniuse-lite/data/regions/GQ.js | 2 +- node_modules/caniuse-lite/data/regions/GR.js | 2 +- node_modules/caniuse-lite/data/regions/GT.js | 2 +- node_modules/caniuse-lite/data/regions/GU.js | 2 +- node_modules/caniuse-lite/data/regions/GW.js | 2 +- node_modules/caniuse-lite/data/regions/GY.js | 2 +- node_modules/caniuse-lite/data/regions/HK.js | 2 +- node_modules/caniuse-lite/data/regions/HN.js | 2 +- node_modules/caniuse-lite/data/regions/HR.js | 2 +- node_modules/caniuse-lite/data/regions/HT.js | 2 +- node_modules/caniuse-lite/data/regions/HU.js | 2 +- node_modules/caniuse-lite/data/regions/ID.js | 2 +- node_modules/caniuse-lite/data/regions/IE.js | 2 +- node_modules/caniuse-lite/data/regions/IL.js | 2 +- node_modules/caniuse-lite/data/regions/IM.js | 2 +- node_modules/caniuse-lite/data/regions/IN.js | 2 +- node_modules/caniuse-lite/data/regions/IQ.js | 2 +- node_modules/caniuse-lite/data/regions/IR.js | 2 +- node_modules/caniuse-lite/data/regions/IS.js | 2 +- node_modules/caniuse-lite/data/regions/IT.js | 2 +- node_modules/caniuse-lite/data/regions/JE.js | 2 +- node_modules/caniuse-lite/data/regions/JM.js | 2 +- node_modules/caniuse-lite/data/regions/JO.js | 2 +- node_modules/caniuse-lite/data/regions/JP.js | 2 +- node_modules/caniuse-lite/data/regions/KE.js | 2 +- node_modules/caniuse-lite/data/regions/KG.js | 2 +- node_modules/caniuse-lite/data/regions/KH.js | 2 +- node_modules/caniuse-lite/data/regions/KI.js | 2 +- node_modules/caniuse-lite/data/regions/KM.js | 2 +- node_modules/caniuse-lite/data/regions/KN.js | 2 +- node_modules/caniuse-lite/data/regions/KP.js | 2 +- node_modules/caniuse-lite/data/regions/KR.js | 2 +- node_modules/caniuse-lite/data/regions/KW.js | 2 +- node_modules/caniuse-lite/data/regions/KY.js | 2 +- node_modules/caniuse-lite/data/regions/KZ.js | 2 +- node_modules/caniuse-lite/data/regions/LA.js | 2 +- node_modules/caniuse-lite/data/regions/LB.js | 2 +- node_modules/caniuse-lite/data/regions/LC.js | 2 +- node_modules/caniuse-lite/data/regions/LI.js | 2 +- node_modules/caniuse-lite/data/regions/LK.js | 2 +- node_modules/caniuse-lite/data/regions/LR.js | 2 +- node_modules/caniuse-lite/data/regions/LS.js | 2 +- node_modules/caniuse-lite/data/regions/LT.js | 2 +- node_modules/caniuse-lite/data/regions/LU.js | 2 +- node_modules/caniuse-lite/data/regions/LV.js | 2 +- node_modules/caniuse-lite/data/regions/LY.js | 2 +- node_modules/caniuse-lite/data/regions/MA.js | 2 +- node_modules/caniuse-lite/data/regions/MC.js | 2 +- node_modules/caniuse-lite/data/regions/MD.js | 2 +- node_modules/caniuse-lite/data/regions/ME.js | 2 +- node_modules/caniuse-lite/data/regions/MG.js | 2 +- node_modules/caniuse-lite/data/regions/MH.js | 2 +- node_modules/caniuse-lite/data/regions/MK.js | 2 +- node_modules/caniuse-lite/data/regions/ML.js | 2 +- node_modules/caniuse-lite/data/regions/MM.js | 2 +- node_modules/caniuse-lite/data/regions/MN.js | 2 +- node_modules/caniuse-lite/data/regions/MO.js | 2 +- node_modules/caniuse-lite/data/regions/MP.js | 2 +- node_modules/caniuse-lite/data/regions/MQ.js | 2 +- node_modules/caniuse-lite/data/regions/MR.js | 2 +- node_modules/caniuse-lite/data/regions/MS.js | 2 +- node_modules/caniuse-lite/data/regions/MT.js | 2 +- node_modules/caniuse-lite/data/regions/MU.js | 2 +- node_modules/caniuse-lite/data/regions/MV.js | 2 +- node_modules/caniuse-lite/data/regions/MW.js | 2 +- node_modules/caniuse-lite/data/regions/MX.js | 2 +- node_modules/caniuse-lite/data/regions/MY.js | 2 +- node_modules/caniuse-lite/data/regions/MZ.js | 2 +- node_modules/caniuse-lite/data/regions/NA.js | 2 +- node_modules/caniuse-lite/data/regions/NC.js | 2 +- node_modules/caniuse-lite/data/regions/NE.js | 2 +- node_modules/caniuse-lite/data/regions/NF.js | 2 +- node_modules/caniuse-lite/data/regions/NG.js | 2 +- node_modules/caniuse-lite/data/regions/NI.js | 2 +- node_modules/caniuse-lite/data/regions/NL.js | 2 +- node_modules/caniuse-lite/data/regions/NO.js | 2 +- node_modules/caniuse-lite/data/regions/NP.js | 2 +- node_modules/caniuse-lite/data/regions/NR.js | 2 +- node_modules/caniuse-lite/data/regions/NU.js | 2 +- node_modules/caniuse-lite/data/regions/NZ.js | 2 +- node_modules/caniuse-lite/data/regions/OM.js | 2 +- node_modules/caniuse-lite/data/regions/PA.js | 2 +- node_modules/caniuse-lite/data/regions/PE.js | 2 +- node_modules/caniuse-lite/data/regions/PF.js | 2 +- node_modules/caniuse-lite/data/regions/PG.js | 2 +- node_modules/caniuse-lite/data/regions/PH.js | 2 +- node_modules/caniuse-lite/data/regions/PK.js | 2 +- node_modules/caniuse-lite/data/regions/PL.js | 2 +- node_modules/caniuse-lite/data/regions/PM.js | 2 +- node_modules/caniuse-lite/data/regions/PN.js | 2 +- node_modules/caniuse-lite/data/regions/PR.js | 2 +- node_modules/caniuse-lite/data/regions/PS.js | 2 +- node_modules/caniuse-lite/data/regions/PT.js | 2 +- node_modules/caniuse-lite/data/regions/PW.js | 2 +- node_modules/caniuse-lite/data/regions/PY.js | 2 +- node_modules/caniuse-lite/data/regions/QA.js | 2 +- node_modules/caniuse-lite/data/regions/RE.js | 2 +- node_modules/caniuse-lite/data/regions/RO.js | 2 +- node_modules/caniuse-lite/data/regions/RS.js | 2 +- node_modules/caniuse-lite/data/regions/RU.js | 2 +- node_modules/caniuse-lite/data/regions/RW.js | 2 +- node_modules/caniuse-lite/data/regions/SA.js | 2 +- node_modules/caniuse-lite/data/regions/SB.js | 2 +- node_modules/caniuse-lite/data/regions/SC.js | 2 +- node_modules/caniuse-lite/data/regions/SD.js | 2 +- node_modules/caniuse-lite/data/regions/SE.js | 2 +- node_modules/caniuse-lite/data/regions/SG.js | 2 +- node_modules/caniuse-lite/data/regions/SH.js | 2 +- node_modules/caniuse-lite/data/regions/SI.js | 2 +- node_modules/caniuse-lite/data/regions/SK.js | 2 +- node_modules/caniuse-lite/data/regions/SL.js | 2 +- node_modules/caniuse-lite/data/regions/SM.js | 2 +- node_modules/caniuse-lite/data/regions/SN.js | 2 +- node_modules/caniuse-lite/data/regions/SO.js | 2 +- node_modules/caniuse-lite/data/regions/SR.js | 2 +- node_modules/caniuse-lite/data/regions/ST.js | 2 +- node_modules/caniuse-lite/data/regions/SV.js | 2 +- node_modules/caniuse-lite/data/regions/SY.js | 2 +- node_modules/caniuse-lite/data/regions/SZ.js | 2 +- node_modules/caniuse-lite/data/regions/TC.js | 2 +- node_modules/caniuse-lite/data/regions/TD.js | 2 +- node_modules/caniuse-lite/data/regions/TG.js | 2 +- node_modules/caniuse-lite/data/regions/TH.js | 2 +- node_modules/caniuse-lite/data/regions/TJ.js | 2 +- node_modules/caniuse-lite/data/regions/TK.js | 2 +- node_modules/caniuse-lite/data/regions/TL.js | 2 +- node_modules/caniuse-lite/data/regions/TM.js | 2 +- node_modules/caniuse-lite/data/regions/TN.js | 2 +- node_modules/caniuse-lite/data/regions/TO.js | 2 +- node_modules/caniuse-lite/data/regions/TR.js | 2 +- node_modules/caniuse-lite/data/regions/TT.js | 2 +- node_modules/caniuse-lite/data/regions/TV.js | 2 +- node_modules/caniuse-lite/data/regions/TW.js | 2 +- node_modules/caniuse-lite/data/regions/TZ.js | 2 +- node_modules/caniuse-lite/data/regions/UA.js | 2 +- node_modules/caniuse-lite/data/regions/UG.js | 2 +- node_modules/caniuse-lite/data/regions/US.js | 2 +- node_modules/caniuse-lite/data/regions/UY.js | 2 +- node_modules/caniuse-lite/data/regions/UZ.js | 2 +- node_modules/caniuse-lite/data/regions/VA.js | 2 +- node_modules/caniuse-lite/data/regions/VC.js | 2 +- node_modules/caniuse-lite/data/regions/VE.js | 2 +- node_modules/caniuse-lite/data/regions/VG.js | 2 +- node_modules/caniuse-lite/data/regions/VI.js | 2 +- node_modules/caniuse-lite/data/regions/VN.js | 2 +- node_modules/caniuse-lite/data/regions/VU.js | 2 +- node_modules/caniuse-lite/data/regions/WF.js | 2 +- node_modules/caniuse-lite/data/regions/WS.js | 2 +- node_modules/caniuse-lite/data/regions/YE.js | 2 +- node_modules/caniuse-lite/data/regions/YT.js | 2 +- node_modules/caniuse-lite/data/regions/ZA.js | 2 +- node_modules/caniuse-lite/data/regions/ZM.js | 2 +- node_modules/caniuse-lite/data/regions/ZW.js | 2 +- .../caniuse-lite/data/regions/alt-af.js | 2 +- .../caniuse-lite/data/regions/alt-an.js | 2 +- .../caniuse-lite/data/regions/alt-as.js | 2 +- .../caniuse-lite/data/regions/alt-eu.js | 2 +- .../caniuse-lite/data/regions/alt-na.js | 2 +- .../caniuse-lite/data/regions/alt-oc.js | 2 +- .../caniuse-lite/data/regions/alt-sa.js | 2 +- .../caniuse-lite/data/regions/alt-ww.js | 2 +- .../caniuse-lite/dist/unpacker/feature.js | 6 +- node_modules/caniuse-lite/package.json | 12 +- .../chokidar/node_modules/fsevents/LICENSE | 22 - .../chokidar/node_modules/fsevents/README.md | 83 - .../node_modules/fsevents/fsevents.d.ts | 46 - .../node_modules/fsevents/fsevents.js | 82 - .../node_modules/fsevents/fsevents.node | Bin 147128 -> 0 bytes .../node_modules/fsevents/package.json | 62 - node_modules/convert-source-map/README.md | 103 +- node_modules/convert-source-map/index.js | 104 +- node_modules/convert-source-map/package.json | 9 +- node_modules/debug/CHANGELOG.md | 395 -- node_modules/debug/LICENSE | 19 - node_modules/debug/README.md | 437 -- node_modules/debug/dist/debug.js | 886 ---- node_modules/debug/node.js | 1 - node_modules/debug/package.json | 51 - node_modules/debug/src/browser.js | 180 - node_modules/debug/src/common.js | 249 -- node_modules/debug/src/index.js | 12 - node_modules/debug/src/node.js | 174 - .../electron-to-chromium/chromium-versions.js | 12 +- .../chromium-versions.json | 2 +- .../full-chromium-versions.js | 892 +++- .../full-chromium-versions.json | 2 +- .../electron-to-chromium/full-versions.js | 624 ++- .../electron-to-chromium/full-versions.json | 2 +- .../electron-to-chromium/package.json | 16 +- node_modules/electron-to-chromium/versions.js | 46 +- .../electron-to-chromium/versions.json | 2 +- node_modules/errno/.jshintrc | 59 - node_modules/errno/.travis.yml | 11 - node_modules/errno/README.md | 145 - node_modules/errno/build.js | 43 - node_modules/errno/cli.js | 22 - node_modules/errno/custom.js | 57 - node_modules/errno/errno.js | 313 -- node_modules/errno/package.json | 33 - node_modules/errno/test.js | 88 - node_modules/esm/LICENSE | 23 - node_modules/esm/README.md | 137 - node_modules/esm/esm.js | 1 - node_modules/esm/esm/loader.js | 1 - node_modules/esm/index.js | 1 - node_modules/esm/package.json | 27 - node_modules/fsevents/LICENSE | 22 - node_modules/fsevents/README.md | 77 - node_modules/fsevents/fsevents.d.ts | 55 - node_modules/fsevents/fsevents.js | 77 - node_modules/fsevents/fsevents.node | Bin 36204 -> 0 bytes node_modules/fsevents/package.json | 62 - node_modules/graceful-fs/README.md | 133 - node_modules/graceful-fs/clone.js | 23 - node_modules/graceful-fs/graceful-fs.js | 373 -- node_modules/graceful-fs/legacy-streams.js | 118 - node_modules/graceful-fs/package.json | 50 - node_modules/graceful-fs/polyfills.js | 346 -- node_modules/iconv-lite/Changelog.md | 162 - node_modules/iconv-lite/LICENSE | 21 - node_modules/iconv-lite/README.md | 156 - .../iconv-lite/encodings/dbcs-codec.js | 555 --- .../iconv-lite/encodings/dbcs-data.js | 176 - node_modules/iconv-lite/encodings/index.js | 22 - node_modules/iconv-lite/encodings/internal.js | 188 - .../iconv-lite/encodings/sbcs-codec.js | 72 - .../encodings/sbcs-data-generated.js | 451 -- .../iconv-lite/encodings/sbcs-data.js | 174 - .../encodings/tables/big5-added.json | 122 - .../iconv-lite/encodings/tables/cp936.json | 264 -- .../iconv-lite/encodings/tables/cp949.json | 273 -- .../iconv-lite/encodings/tables/cp950.json | 177 - .../iconv-lite/encodings/tables/eucjp.json | 182 - .../encodings/tables/gb18030-ranges.json | 1 - .../encodings/tables/gbk-added.json | 55 - .../iconv-lite/encodings/tables/shiftjis.json | 125 - node_modules/iconv-lite/encodings/utf16.js | 177 - node_modules/iconv-lite/encodings/utf7.js | 290 -- node_modules/iconv-lite/lib/bom-handling.js | 52 - node_modules/iconv-lite/lib/extend-node.js | 217 - node_modules/iconv-lite/lib/index.d.ts | 24 - node_modules/iconv-lite/lib/index.js | 153 - node_modules/iconv-lite/lib/streams.js | 121 - node_modules/iconv-lite/package.json | 46 - node_modules/image-size/LICENSE | 9 - node_modules/image-size/Readme.md | 88 - node_modules/image-size/bin/image-size.js | 36 - node_modules/image-size/lib/detector.js | 19 - node_modules/image-size/lib/index.js | 105 - node_modules/image-size/lib/readUInt.js | 11 - node_modules/image-size/lib/types.js | 13 - node_modules/image-size/lib/types/bmp.js | 17 - node_modules/image-size/lib/types/dds.js | 18 - node_modules/image-size/lib/types/gif.js | 19 - node_modules/image-size/lib/types/jpg.js | 62 - node_modules/image-size/lib/types/png.js | 36 - node_modules/image-size/lib/types/psd.js | 17 - node_modules/image-size/lib/types/svg.js | 78 - node_modules/image-size/lib/types/tiff.js | 118 - node_modules/image-size/lib/types/webp.js | 69 - node_modules/image-size/package.json | 49 - node_modules/json5/README.md | 88 +- node_modules/json5/dist/index.js | 41 +- node_modules/json5/dist/index.min.js | 2 +- node_modules/json5/dist/index.min.mjs | 2 +- node_modules/json5/dist/index.mjs | 41 +- node_modules/json5/lib/parse.js | 41 +- node_modules/json5/package.json | 11 +- node_modules/mime/.npmignore | 0 node_modules/mime/CHANGELOG.md | 164 - node_modules/mime/LICENSE | 21 - node_modules/mime/README.md | 90 - node_modules/mime/cli.js | 8 - node_modules/mime/mime.js | 108 - node_modules/mime/package.json | 44 - node_modules/mime/src/build.js | 53 - node_modules/mime/src/test.js | 60 - node_modules/mime/types.json | 1 - .../needle/.github/workflows/nodejs.yml | 27 - node_modules/needle/README.md | 612 --- node_modules/needle/bin/needle | 40 - .../needle/examples/deflated-stream.js | 22 - node_modules/needle/examples/digest-auth.js | 16 - .../needle/examples/download-to-file.js | 18 - .../needle/examples/multipart-stream.js | 25 - node_modules/needle/examples/parsed-stream.js | 23 - .../needle/examples/parsed-stream2.js | 21 - node_modules/needle/examples/stream-events.js | 23 - .../needle/examples/stream-to-file.js | 14 - node_modules/needle/examples/upload-image.js | 51 - node_modules/needle/lib/auth.js | 112 - node_modules/needle/lib/cookies.js | 79 - node_modules/needle/lib/decoder.js | 53 - node_modules/needle/lib/multipart.js | 98 - node_modules/needle/lib/needle.js | 829 ---- node_modules/needle/lib/parsers.js | 120 - node_modules/needle/lib/querystring.js | 49 - node_modules/needle/license.txt | 19 - node_modules/needle/package.json | 70 - node_modules/needle/test/auth_digest_spec.js | 192 - node_modules/needle/test/basic_auth_spec.js | 196 - node_modules/needle/test/compression_spec.js | 112 - node_modules/needle/test/cookies_spec.js | 396 -- node_modules/needle/test/decoder_spec.js | 121 - node_modules/needle/test/errors_spec.js | 286 -- node_modules/needle/test/headers_spec.js | 203 - node_modules/needle/test/helpers.js | 72 - node_modules/needle/test/long_string_spec.js | 34 - node_modules/needle/test/output_spec.js | 254 -- node_modules/needle/test/parsing_spec.js | 494 --- node_modules/needle/test/post_data_spec.js | 1021 ----- node_modules/needle/test/proxy_spec.js | 202 - node_modules/needle/test/querystring_spec.js | 128 - node_modules/needle/test/redirect_spec.js | 394 -- .../needle/test/redirect_with_timeout.js | 45 - .../needle/test/request_stream_spec.js | 236 -- .../needle/test/response_stream_spec.js | 138 - node_modules/needle/test/socket_pool_spec.js | 67 - node_modules/needle/test/uri_modifier_spec.js | 46 - node_modules/needle/test/url_spec.js | 155 - node_modules/needle/test/utils/formidable.js | 17 - node_modules/needle/test/utils/proxy.js | 62 - node_modules/needle/test/utils/test.js | 104 - node_modules/node-releases/README.md | 25 +- .../node-releases/data/processed/envs.json | 2 +- .../release-schedule/release-schedule.json | 2 +- node_modules/node-releases/package.json | 3 +- node_modules/prr/.jshintrc | 61 - node_modules/prr/.npmignore | 1 - node_modules/prr/.travis.yml | 10 - node_modules/prr/LICENSE.md | 11 - node_modules/prr/README.md | 47 - node_modules/prr/package.json | 26 - node_modules/prr/prr.js | 63 - node_modules/prr/test.js | 169 - node_modules/sax/LICENSE | 41 - node_modules/sax/README.md | 225 - node_modules/sax/lib/sax.js | 1565 ------- node_modules/sax/package.json | 25 - node_modules/tiny-worker/LICENSE | 28 - node_modules/tiny-worker/README.md | 146 - node_modules/tiny-worker/lib/index.js | 137 - node_modules/tiny-worker/lib/noop.js | 5 - node_modules/tiny-worker/lib/worker.js | 84 - node_modules/tiny-worker/package.json | 38 - node_modules/update-browserslist-db/README.md | 3 +- .../check-npm-version.js | 2 +- node_modules/update-browserslist-db/index.js | 86 +- .../update-browserslist-db/package.json | 10 +- package-lock.json | 526 +-- 1383 files changed, 11762 insertions(+), 30591 deletions(-) delete mode 120000 node_modules/.bin/errno delete mode 120000 node_modules/.bin/image-size delete mode 120000 node_modules/.bin/mime delete mode 120000 node_modules/.bin/needle rename node_modules/.bin/{browserslist-lint => update-browserslist-db} (100%) delete mode 100644 node_modules/@babel/core/lib/config/files/import-meta-resolve.js delete mode 100644 node_modules/@babel/core/lib/config/files/import-meta-resolve.js.map delete mode 100644 node_modules/@babel/core/node_modules/semver/CHANGELOG.md rename node_modules/{graceful-fs => @babel/helper-compilation-targets/node_modules/lru-cache}/LICENSE (91%) create mode 100644 node_modules/@babel/helper-compilation-targets/node_modules/lru-cache/README.md create mode 100644 node_modules/@babel/helper-compilation-targets/node_modules/lru-cache/index.js create mode 100644 node_modules/@babel/helper-compilation-targets/node_modules/lru-cache/package.json delete mode 100644 node_modules/@babel/helper-compilation-targets/node_modules/semver/CHANGELOG.md create mode 100644 node_modules/@babel/helper-compilation-targets/node_modules/yallist/LICENSE create mode 100644 node_modules/@babel/helper-compilation-targets/node_modules/yallist/README.md create mode 100644 node_modules/@babel/helper-compilation-targets/node_modules/yallist/iterator.js create mode 100644 node_modules/@babel/helper-compilation-targets/node_modules/yallist/package.json create mode 100644 node_modules/@babel/helper-compilation-targets/node_modules/yallist/yallist.js create mode 100644 node_modules/@babel/helper-module-imports/lib/import-builder.js.map create mode 100644 node_modules/@babel/helper-module-imports/lib/import-injector.js.map create mode 100644 node_modules/@babel/helper-module-imports/lib/index.js.map create mode 100644 node_modules/@babel/helper-module-imports/lib/is-module.js.map create mode 100644 node_modules/@babel/helper-module-transforms/lib/lazy-modules.js create mode 100644 node_modules/@babel/helper-module-transforms/lib/lazy-modules.js.map create mode 100644 node_modules/@babel/helper-validator-option/lib/find-suggestion.js.map create mode 100644 node_modules/@babel/helper-validator-option/lib/index.js.map create mode 100644 node_modules/@babel/helper-validator-option/lib/validator.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/applyDecs2203R.js create mode 100644 node_modules/@babel/helpers/lib/helpers/applyDecs2203R.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/applyDecs2301.js create mode 100644 node_modules/@babel/helpers/lib/helpers/applyDecs2301.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/applyDecs2305.js create mode 100644 node_modules/@babel/helpers/lib/helpers/applyDecs2305.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/callSuper.js create mode 100644 node_modules/@babel/helpers/lib/helpers/callSuper.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/construct.js create mode 100644 node_modules/@babel/helpers/lib/helpers/construct.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/defineAccessor.js create mode 100644 node_modules/@babel/helpers/lib/helpers/defineAccessor.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/dispose.js create mode 100644 node_modules/@babel/helpers/lib/helpers/dispose.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/importDeferProxy.js create mode 100644 node_modules/@babel/helpers/lib/helpers/importDeferProxy.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/interopRequireWildcard.js create mode 100644 node_modules/@babel/helpers/lib/helpers/interopRequireWildcard.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/isNativeReflectConstruct.js create mode 100644 node_modules/@babel/helpers/lib/helpers/isNativeReflectConstruct.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/setFunctionName.js create mode 100644 node_modules/@babel/helpers/lib/helpers/setFunctionName.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/toPrimitive.js create mode 100644 node_modules/@babel/helpers/lib/helpers/toPrimitive.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/toPropertyKey.js create mode 100644 node_modules/@babel/helpers/lib/helpers/toPropertyKey.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/using.js create mode 100644 node_modules/@babel/helpers/lib/helpers/using.js.map create mode 100644 node_modules/@babel/helpers/lib/helpers/usingCtx.js create mode 100644 node_modules/@babel/helpers/lib/helpers/usingCtx.js.map create mode 100644 node_modules/caniuse-lite/data/features/css-anchor-positioning.js create mode 100644 node_modules/caniuse-lite/data/features/css-cascade-scope.js create mode 100644 node_modules/caniuse-lite/data/features/css-container-queries-style.js create mode 100644 node_modules/caniuse-lite/data/features/css-relative-colors.js create mode 100644 node_modules/caniuse-lite/data/features/css-text-box-trim.js create mode 100644 node_modules/caniuse-lite/data/features/css-text-wrap-balance.js create mode 100644 node_modules/caniuse-lite/data/features/mdn-css-backdrop-pseudo-element.js create mode 100644 node_modules/caniuse-lite/data/features/passkeys.js create mode 100644 node_modules/caniuse-lite/data/features/selectlist.js create mode 100644 node_modules/caniuse-lite/data/features/view-transitions.js create mode 100644 node_modules/caniuse-lite/data/features/zstd.js delete mode 100644 node_modules/chokidar/node_modules/fsevents/LICENSE delete mode 100644 node_modules/chokidar/node_modules/fsevents/README.md delete mode 100644 node_modules/chokidar/node_modules/fsevents/fsevents.d.ts delete mode 100644 node_modules/chokidar/node_modules/fsevents/fsevents.js delete mode 100755 node_modules/chokidar/node_modules/fsevents/fsevents.node delete mode 100644 node_modules/chokidar/node_modules/fsevents/package.json delete mode 100644 node_modules/debug/CHANGELOG.md delete mode 100644 node_modules/debug/LICENSE delete mode 100644 node_modules/debug/README.md delete mode 100644 node_modules/debug/dist/debug.js delete mode 100644 node_modules/debug/node.js delete mode 100644 node_modules/debug/package.json delete mode 100644 node_modules/debug/src/browser.js delete mode 100644 node_modules/debug/src/common.js delete mode 100644 node_modules/debug/src/index.js delete mode 100644 node_modules/debug/src/node.js delete mode 100644 node_modules/errno/.jshintrc delete mode 100644 node_modules/errno/.travis.yml delete mode 100644 node_modules/errno/README.md delete mode 100755 node_modules/errno/build.js delete mode 100755 node_modules/errno/cli.js delete mode 100644 node_modules/errno/custom.js delete mode 100644 node_modules/errno/errno.js delete mode 100644 node_modules/errno/package.json delete mode 100644 node_modules/errno/test.js delete mode 100644 node_modules/esm/LICENSE delete mode 100644 node_modules/esm/README.md delete mode 100644 node_modules/esm/esm.js delete mode 100644 node_modules/esm/esm/loader.js delete mode 100644 node_modules/esm/index.js delete mode 100644 node_modules/esm/package.json delete mode 100644 node_modules/fsevents/LICENSE delete mode 100644 node_modules/fsevents/README.md delete mode 100644 node_modules/fsevents/fsevents.d.ts delete mode 100644 node_modules/fsevents/fsevents.js delete mode 100755 node_modules/fsevents/fsevents.node delete mode 100644 node_modules/fsevents/package.json delete mode 100644 node_modules/graceful-fs/README.md delete mode 100644 node_modules/graceful-fs/clone.js delete mode 100644 node_modules/graceful-fs/graceful-fs.js delete mode 100644 node_modules/graceful-fs/legacy-streams.js delete mode 100644 node_modules/graceful-fs/package.json delete mode 100644 node_modules/graceful-fs/polyfills.js delete mode 100644 node_modules/iconv-lite/Changelog.md delete mode 100644 node_modules/iconv-lite/LICENSE delete mode 100644 node_modules/iconv-lite/README.md delete mode 100644 node_modules/iconv-lite/encodings/dbcs-codec.js delete mode 100644 node_modules/iconv-lite/encodings/dbcs-data.js delete mode 100644 node_modules/iconv-lite/encodings/index.js delete mode 100644 node_modules/iconv-lite/encodings/internal.js delete mode 100644 node_modules/iconv-lite/encodings/sbcs-codec.js delete mode 100644 node_modules/iconv-lite/encodings/sbcs-data-generated.js delete mode 100644 node_modules/iconv-lite/encodings/sbcs-data.js delete mode 100644 node_modules/iconv-lite/encodings/tables/big5-added.json delete mode 100644 node_modules/iconv-lite/encodings/tables/cp936.json delete mode 100644 node_modules/iconv-lite/encodings/tables/cp949.json delete mode 100644 node_modules/iconv-lite/encodings/tables/cp950.json delete mode 100644 node_modules/iconv-lite/encodings/tables/eucjp.json delete mode 100644 node_modules/iconv-lite/encodings/tables/gb18030-ranges.json delete mode 100644 node_modules/iconv-lite/encodings/tables/gbk-added.json delete mode 100644 node_modules/iconv-lite/encodings/tables/shiftjis.json delete mode 100644 node_modules/iconv-lite/encodings/utf16.js delete mode 100644 node_modules/iconv-lite/encodings/utf7.js delete mode 100644 node_modules/iconv-lite/lib/bom-handling.js delete mode 100644 node_modules/iconv-lite/lib/extend-node.js delete mode 100644 node_modules/iconv-lite/lib/index.d.ts delete mode 100644 node_modules/iconv-lite/lib/index.js delete mode 100644 node_modules/iconv-lite/lib/streams.js delete mode 100644 node_modules/iconv-lite/package.json delete mode 100644 node_modules/image-size/LICENSE delete mode 100644 node_modules/image-size/Readme.md delete mode 100755 node_modules/image-size/bin/image-size.js delete mode 100644 node_modules/image-size/lib/detector.js delete mode 100644 node_modules/image-size/lib/index.js delete mode 100644 node_modules/image-size/lib/readUInt.js delete mode 100644 node_modules/image-size/lib/types.js delete mode 100644 node_modules/image-size/lib/types/bmp.js delete mode 100644 node_modules/image-size/lib/types/dds.js delete mode 100644 node_modules/image-size/lib/types/gif.js delete mode 100644 node_modules/image-size/lib/types/jpg.js delete mode 100644 node_modules/image-size/lib/types/png.js delete mode 100644 node_modules/image-size/lib/types/psd.js delete mode 100644 node_modules/image-size/lib/types/svg.js delete mode 100644 node_modules/image-size/lib/types/tiff.js delete mode 100644 node_modules/image-size/lib/types/webp.js delete mode 100644 node_modules/image-size/package.json delete mode 100644 node_modules/mime/.npmignore delete mode 100644 node_modules/mime/CHANGELOG.md delete mode 100644 node_modules/mime/LICENSE delete mode 100644 node_modules/mime/README.md delete mode 100755 node_modules/mime/cli.js delete mode 100644 node_modules/mime/mime.js delete mode 100644 node_modules/mime/package.json delete mode 100755 node_modules/mime/src/build.js delete mode 100644 node_modules/mime/src/test.js delete mode 100644 node_modules/mime/types.json delete mode 100644 node_modules/needle/.github/workflows/nodejs.yml delete mode 100644 node_modules/needle/README.md delete mode 100755 node_modules/needle/bin/needle delete mode 100644 node_modules/needle/examples/deflated-stream.js delete mode 100644 node_modules/needle/examples/digest-auth.js delete mode 100644 node_modules/needle/examples/download-to-file.js delete mode 100644 node_modules/needle/examples/multipart-stream.js delete mode 100644 node_modules/needle/examples/parsed-stream.js delete mode 100644 node_modules/needle/examples/parsed-stream2.js delete mode 100644 node_modules/needle/examples/stream-events.js delete mode 100644 node_modules/needle/examples/stream-to-file.js delete mode 100644 node_modules/needle/examples/upload-image.js delete mode 100644 node_modules/needle/lib/auth.js delete mode 100644 node_modules/needle/lib/cookies.js delete mode 100644 node_modules/needle/lib/decoder.js delete mode 100644 node_modules/needle/lib/multipart.js delete mode 100644 node_modules/needle/lib/needle.js delete mode 100644 node_modules/needle/lib/parsers.js delete mode 100644 node_modules/needle/lib/querystring.js delete mode 100644 node_modules/needle/license.txt delete mode 100644 node_modules/needle/package.json delete mode 100644 node_modules/needle/test/auth_digest_spec.js delete mode 100644 node_modules/needle/test/basic_auth_spec.js delete mode 100644 node_modules/needle/test/compression_spec.js delete mode 100644 node_modules/needle/test/cookies_spec.js delete mode 100644 node_modules/needle/test/decoder_spec.js delete mode 100644 node_modules/needle/test/errors_spec.js delete mode 100644 node_modules/needle/test/headers_spec.js delete mode 100644 node_modules/needle/test/helpers.js delete mode 100644 node_modules/needle/test/long_string_spec.js delete mode 100644 node_modules/needle/test/output_spec.js delete mode 100644 node_modules/needle/test/parsing_spec.js delete mode 100644 node_modules/needle/test/post_data_spec.js delete mode 100644 node_modules/needle/test/proxy_spec.js delete mode 100644 node_modules/needle/test/querystring_spec.js delete mode 100644 node_modules/needle/test/redirect_spec.js delete mode 100644 node_modules/needle/test/redirect_with_timeout.js delete mode 100644 node_modules/needle/test/request_stream_spec.js delete mode 100644 node_modules/needle/test/response_stream_spec.js delete mode 100644 node_modules/needle/test/socket_pool_spec.js delete mode 100644 node_modules/needle/test/uri_modifier_spec.js delete mode 100644 node_modules/needle/test/url_spec.js delete mode 100644 node_modules/needle/test/utils/formidable.js delete mode 100644 node_modules/needle/test/utils/proxy.js delete mode 100644 node_modules/needle/test/utils/test.js delete mode 100644 node_modules/prr/.jshintrc delete mode 100644 node_modules/prr/.npmignore delete mode 100644 node_modules/prr/.travis.yml delete mode 100644 node_modules/prr/LICENSE.md delete mode 100644 node_modules/prr/README.md delete mode 100644 node_modules/prr/package.json delete mode 100644 node_modules/prr/prr.js delete mode 100644 node_modules/prr/test.js delete mode 100644 node_modules/sax/LICENSE delete mode 100644 node_modules/sax/README.md delete mode 100644 node_modules/sax/lib/sax.js delete mode 100644 node_modules/sax/package.json delete mode 100644 node_modules/tiny-worker/LICENSE delete mode 100644 node_modules/tiny-worker/README.md delete mode 100644 node_modules/tiny-worker/lib/index.js delete mode 100644 node_modules/tiny-worker/lib/noop.js delete mode 100644 node_modules/tiny-worker/lib/worker.js delete mode 100644 node_modules/tiny-worker/package.json diff --git a/node_modules/.bin/errno b/node_modules/.bin/errno deleted file mode 120000 index 5a98e539c7a9..000000000000 --- a/node_modules/.bin/errno +++ /dev/null @@ -1 +0,0 @@ -../errno/cli.js \ No newline at end of file diff --git a/node_modules/.bin/image-size b/node_modules/.bin/image-size deleted file mode 120000 index f575317fa381..000000000000 --- a/node_modules/.bin/image-size +++ /dev/null @@ -1 +0,0 @@ -../image-size/bin/image-size.js \ No newline at end of file diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime deleted file mode 120000 index fbb7ee0eed8d..000000000000 --- a/node_modules/.bin/mime +++ /dev/null @@ -1 +0,0 @@ -../mime/cli.js \ No newline at end of file diff --git a/node_modules/.bin/needle b/node_modules/.bin/needle deleted file mode 120000 index 828096942e97..000000000000 --- a/node_modules/.bin/needle +++ /dev/null @@ -1 +0,0 @@ -../needle/bin/needle \ No newline at end of file diff --git a/node_modules/.bin/browserslist-lint b/node_modules/.bin/update-browserslist-db similarity index 100% rename from node_modules/.bin/browserslist-lint rename to node_modules/.bin/update-browserslist-db diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index f403ee0c487c..d02fb7dead54 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -27,12 +27,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -40,36 +40,36 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", - "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, "peer": true, "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.5", - "@babel/parser": "^7.20.5", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5", - "convert-source-map": "^1.7.0", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -98,9 +98,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "peer": true, "bin": { @@ -108,12 +108,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -162,32 +162,45 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz", @@ -327,34 +340,34 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { @@ -413,12 +426,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -449,9 +462,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -467,9 +480,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -491,24 +504,24 @@ } }, "node_modules/@babel/helpers": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", - "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "peer": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -520,9 +533,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1656,34 +1669,34 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -1708,12 +1721,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -2156,9 +2169,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "dev": true, "funding": [ { @@ -2168,13 +2181,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2219,9 +2236,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001439", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", - "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", + "version": "1.0.30001585", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", + "integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==", "dev": true, "funding": [ { @@ -2231,6 +2248,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -2306,20 +2327,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -2435,9 +2442,9 @@ "dev": true }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "peer": true }, @@ -2519,17 +2526,6 @@ "node": ">=12" } }, - "node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", @@ -2630,9 +2626,9 @@ "integrity": "sha512-Azk8kD/2/nJIuVPK+zQ9sjKMRIpRvNyqn9XwbBHNq+iNuSccbJS6hwm1Woy0pMST0erSo0u4j+KJaodndDk4vA==" }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.659", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.659.tgz", + "integrity": "sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==", "dev": true }, "node_modules/emoji-regex": { @@ -2658,19 +2654,6 @@ "moment-timezone": "^0.4.0" } }, - "node_modules/errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2711,15 +2694,6 @@ "source-map": "~0.6.1" } }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -2843,20 +2817,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2953,13 +2913,6 @@ "node": ">=4" } }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true, - "optional": true - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -3051,37 +3004,11 @@ } } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/imagesloaded": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/imagesloaded/-/imagesloaded-4.1.4.tgz", @@ -3385,9 +3312,9 @@ "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "peer": true, "bin": { @@ -3647,19 +3574,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -3880,24 +3794,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/needle": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", - "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, "node_modules/nestable2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/nestable2/-/nestable2-1.6.0.tgz", @@ -3907,9 +3803,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz", - "integrity": "sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/normalize-path": { @@ -4251,13 +4147,6 @@ "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true, - "optional": true - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -4527,13 +4416,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, "node_modules/saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -4728,15 +4610,6 @@ } } }, - "node_modules/tiny-worker": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", - "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", - "optional": true, - "dependencies": { - "esm": "^3.2.25" - } - }, "node_modules/tinymce": { "version": "5.6.2", "resolved": "git+ssh://git@github.com/ILIAS-eLearning/tinymce-dist.git#4c6f5c918e94c35803deca9c0e774cc10878ba8a", @@ -4867,9 +4740,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -4879,6 +4752,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -4886,7 +4763,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" diff --git a/node_modules/@babel/code-frame/lib/index.js b/node_modules/@babel/code-frame/lib/index.js index 74495b0d852b..2f900ebacdc6 100644 --- a/node_modules/@babel/code-frame/lib/index.js +++ b/node_modules/@babel/code-frame/lib/index.js @@ -7,8 +7,8 @@ exports.codeFrameColumns = codeFrameColumns; exports.default = _default; var _highlight = require("@babel/highlight"); var _chalk = _interopRequireWildcard(require("chalk"), true); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } let chalkWithForcedColor = undefined; function getChalk(forceColor) { if (forceColor) { diff --git a/node_modules/@babel/code-frame/lib/index.js.map b/node_modules/@babel/code-frame/lib/index.js.map index 5e9a09d3861f..0882e00ac9c8 100644 --- a/node_modules/@babel/code-frame/lib/index.js.map +++ b/node_modules/@babel/code-frame/lib/index.js.map @@ -1 +1 @@ -{"version":3,"names":["_highlight","require","_chalk","_interopRequireWildcard","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","chalkWithForcedColor","undefined","getChalk","forceColor","_chalkWithForcedColor","chalk","constructor","enabled","level","deprecationWarningShown","getDefs","gutter","grey","marker","red","bold","message","NEWLINE","getMarkerLines","loc","source","opts","startLoc","assign","column","line","start","endLoc","end","linesAbove","linesBelow","startLine","startColumn","endLine","endColumn","Math","max","min","length","lineDiff","markerLines","i","lineNumber","sourceLength","codeFrameColumns","rawLines","highlighted","highlightCode","shouldHighlight","defs","maybeHighlight","chalkFn","string","lines","split","hasColumns","numberMaxWidth","String","highlightedLines","highlight","frame","slice","map","index","number","paddedNumber","hasMarker","lastMarkerLine","markerLine","Array","isArray","markerSpacing","replace","numberOfMarkers","repeat","join","reset","_default","colNumber","process","emitWarning","deprecationError","Error","name","console","warn","location"],"sources":["../src/index.ts"],"sourcesContent":["import highlight, { shouldHighlight } from \"@babel/highlight\";\n\nimport chalk, { Chalk as ChalkClass, type ChalkInstance as Chalk } from \"chalk\";\n\nlet chalkWithForcedColor: Chalk = undefined;\nfunction getChalk(forceColor: boolean) {\n if (forceColor) {\n chalkWithForcedColor ??= process.env.BABEL_8_BREAKING\n ? new ChalkClass({ level: 1 })\n : // @ts-expect-error .Instance was .constructor in chalk 2\n new chalk.constructor({ enabled: true, level: 1 });\n return chalkWithForcedColor;\n }\n return chalk;\n}\n\nlet deprecationWarningShown = false;\n\ntype Location = {\n column: number;\n line: number;\n};\n\ntype NodeLocation = {\n end?: Location;\n start: Location;\n};\n\nexport interface Options {\n /** Syntax highlight the code as JavaScript for terminals. default: false */\n highlightCode?: boolean;\n /** The number of lines to show above the error. default: 2 */\n linesAbove?: number;\n /** The number of lines to show below the error. default: 3 */\n linesBelow?: number;\n /**\n * Forcibly syntax highlight the code as JavaScript (for non-terminals);\n * overrides highlightCode.\n * default: false\n */\n forceColor?: boolean;\n /**\n * Pass in a string to be displayed inline (if possible) next to the\n * highlighted location in the code. If it can't be positioned inline,\n * it will be placed above the code frame.\n * default: nothing\n */\n message?: string;\n}\n\n/**\n * Chalk styles for code frame token types.\n */\nfunction getDefs(chalk: Chalk) {\n return {\n gutter: chalk.grey,\n marker: chalk.red.bold,\n message: chalk.red.bold,\n };\n}\n\n/**\n * RegExp to test for newlines in terminal.\n */\n\nconst NEWLINE = /\\r\\n|[\\n\\r\\u2028\\u2029]/;\n\n/**\n * Extract what lines should be marked and highlighted.\n */\n\ntype MarkerLines = Record;\n\nfunction getMarkerLines(\n loc: NodeLocation,\n source: Array,\n opts: Options,\n): {\n start: number;\n end: number;\n markerLines: MarkerLines;\n} {\n const startLoc: Location = {\n column: 0,\n line: -1,\n ...loc.start,\n };\n const endLoc: Location = {\n ...startLoc,\n ...loc.end,\n };\n const { linesAbove = 2, linesBelow = 3 } = opts || {};\n const startLine = startLoc.line;\n const startColumn = startLoc.column;\n const endLine = endLoc.line;\n const endColumn = endLoc.column;\n\n let start = Math.max(startLine - (linesAbove + 1), 0);\n let end = Math.min(source.length, endLine + linesBelow);\n\n if (startLine === -1) {\n start = 0;\n }\n\n if (endLine === -1) {\n end = source.length;\n }\n\n const lineDiff = endLine - startLine;\n const markerLines: MarkerLines = {};\n\n if (lineDiff) {\n for (let i = 0; i <= lineDiff; i++) {\n const lineNumber = i + startLine;\n\n if (!startColumn) {\n markerLines[lineNumber] = true;\n } else if (i === 0) {\n const sourceLength = source[lineNumber - 1].length;\n\n markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1];\n } else if (i === lineDiff) {\n markerLines[lineNumber] = [0, endColumn];\n } else {\n const sourceLength = source[lineNumber - i].length;\n\n markerLines[lineNumber] = [0, sourceLength];\n }\n }\n } else {\n if (startColumn === endColumn) {\n if (startColumn) {\n markerLines[startLine] = [startColumn, 0];\n } else {\n markerLines[startLine] = true;\n }\n } else {\n markerLines[startLine] = [startColumn, endColumn - startColumn];\n }\n }\n\n return { start, end, markerLines };\n}\n\nexport function codeFrameColumns(\n rawLines: string,\n loc: NodeLocation,\n opts: Options = {},\n): string {\n const highlighted =\n (opts.highlightCode || opts.forceColor) && shouldHighlight(opts);\n const chalk = getChalk(opts.forceColor);\n const defs = getDefs(chalk);\n const maybeHighlight = (chalkFn: Chalk, string: string) => {\n return highlighted ? chalkFn(string) : string;\n };\n const lines = rawLines.split(NEWLINE);\n const { start, end, markerLines } = getMarkerLines(loc, lines, opts);\n const hasColumns = loc.start && typeof loc.start.column === \"number\";\n\n const numberMaxWidth = String(end).length;\n\n const highlightedLines = highlighted ? highlight(rawLines, opts) : rawLines;\n\n let frame = highlightedLines\n .split(NEWLINE, end)\n .slice(start, end)\n .map((line, index) => {\n const number = start + 1 + index;\n const paddedNumber = ` ${number}`.slice(-numberMaxWidth);\n const gutter = ` ${paddedNumber} |`;\n const hasMarker = markerLines[number];\n const lastMarkerLine = !markerLines[number + 1];\n if (hasMarker) {\n let markerLine = \"\";\n if (Array.isArray(hasMarker)) {\n const markerSpacing = line\n .slice(0, Math.max(hasMarker[0] - 1, 0))\n .replace(/[^\\t]/g, \" \");\n const numberOfMarkers = hasMarker[1] || 1;\n\n markerLine = [\n \"\\n \",\n maybeHighlight(defs.gutter, gutter.replace(/\\d/g, \" \")),\n \" \",\n markerSpacing,\n maybeHighlight(defs.marker, \"^\").repeat(numberOfMarkers),\n ].join(\"\");\n\n if (lastMarkerLine && opts.message) {\n markerLine += \" \" + maybeHighlight(defs.message, opts.message);\n }\n }\n return [\n maybeHighlight(defs.marker, \">\"),\n maybeHighlight(defs.gutter, gutter),\n line.length > 0 ? ` ${line}` : \"\",\n markerLine,\n ].join(\"\");\n } else {\n return ` ${maybeHighlight(defs.gutter, gutter)}${\n line.length > 0 ? ` ${line}` : \"\"\n }`;\n }\n })\n .join(\"\\n\");\n\n if (opts.message && !hasColumns) {\n frame = `${\" \".repeat(numberMaxWidth + 1)}${opts.message}\\n${frame}`;\n }\n\n if (highlighted) {\n return chalk.reset(frame);\n } else {\n return frame;\n }\n}\n\n/**\n * Create a code frame, adding line numbers, code highlighting, and pointing to a given position.\n */\n\nexport default function (\n rawLines: string,\n lineNumber: number,\n colNumber?: number | null,\n opts: Options = {},\n): string {\n if (!deprecationWarningShown) {\n deprecationWarningShown = true;\n\n const message =\n \"Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`.\";\n\n if (process.emitWarning) {\n // A string is directly supplied to emitWarning, because when supplying an\n // Error object node throws in the tests because of different contexts\n process.emitWarning(message, \"DeprecationWarning\");\n } else {\n const deprecationError = new Error(message);\n deprecationError.name = \"DeprecationWarning\";\n console.warn(new Error(message));\n }\n }\n\n colNumber = Math.max(colNumber, 0);\n\n const location: NodeLocation = {\n start: { column: colNumber, line: lineNumber },\n };\n\n return codeFrameColumns(rawLines, location, opts);\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_highlight","require","_chalk","_interopRequireWildcard","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","chalkWithForcedColor","undefined","getChalk","forceColor","_chalkWithForcedColor","chalk","constructor","enabled","level","deprecationWarningShown","getDefs","gutter","grey","marker","red","bold","message","NEWLINE","getMarkerLines","loc","source","opts","startLoc","assign","column","line","start","endLoc","end","linesAbove","linesBelow","startLine","startColumn","endLine","endColumn","Math","max","min","length","lineDiff","markerLines","lineNumber","sourceLength","codeFrameColumns","rawLines","highlighted","highlightCode","shouldHighlight","defs","maybeHighlight","chalkFn","string","lines","split","hasColumns","numberMaxWidth","String","highlightedLines","highlight","frame","slice","map","index","number","paddedNumber","hasMarker","lastMarkerLine","markerLine","Array","isArray","markerSpacing","replace","numberOfMarkers","repeat","join","reset","_default","colNumber","process","emitWarning","deprecationError","Error","name","console","warn","location"],"sources":["../src/index.ts"],"sourcesContent":["import highlight, { shouldHighlight } from \"@babel/highlight\";\n\nimport chalk, { Chalk as ChalkClass, type ChalkInstance as Chalk } from \"chalk\";\n\nlet chalkWithForcedColor: Chalk = undefined;\nfunction getChalk(forceColor: boolean) {\n if (forceColor) {\n chalkWithForcedColor ??= process.env.BABEL_8_BREAKING\n ? new ChalkClass({ level: 1 })\n : // @ts-expect-error .Instance was .constructor in chalk 2\n new chalk.constructor({ enabled: true, level: 1 });\n return chalkWithForcedColor;\n }\n return chalk;\n}\n\nlet deprecationWarningShown = false;\n\ntype Location = {\n column: number;\n line: number;\n};\n\ntype NodeLocation = {\n end?: Location;\n start: Location;\n};\n\nexport interface Options {\n /** Syntax highlight the code as JavaScript for terminals. default: false */\n highlightCode?: boolean;\n /** The number of lines to show above the error. default: 2 */\n linesAbove?: number;\n /** The number of lines to show below the error. default: 3 */\n linesBelow?: number;\n /**\n * Forcibly syntax highlight the code as JavaScript (for non-terminals);\n * overrides highlightCode.\n * default: false\n */\n forceColor?: boolean;\n /**\n * Pass in a string to be displayed inline (if possible) next to the\n * highlighted location in the code. If it can't be positioned inline,\n * it will be placed above the code frame.\n * default: nothing\n */\n message?: string;\n}\n\n/**\n * Chalk styles for code frame token types.\n */\nfunction getDefs(chalk: Chalk) {\n return {\n gutter: chalk.grey,\n marker: chalk.red.bold,\n message: chalk.red.bold,\n };\n}\n\n/**\n * RegExp to test for newlines in terminal.\n */\n\nconst NEWLINE = /\\r\\n|[\\n\\r\\u2028\\u2029]/;\n\n/**\n * Extract what lines should be marked and highlighted.\n */\n\ntype MarkerLines = Record;\n\nfunction getMarkerLines(\n loc: NodeLocation,\n source: Array,\n opts: Options,\n): {\n start: number;\n end: number;\n markerLines: MarkerLines;\n} {\n const startLoc: Location = {\n column: 0,\n line: -1,\n ...loc.start,\n };\n const endLoc: Location = {\n ...startLoc,\n ...loc.end,\n };\n const { linesAbove = 2, linesBelow = 3 } = opts || {};\n const startLine = startLoc.line;\n const startColumn = startLoc.column;\n const endLine = endLoc.line;\n const endColumn = endLoc.column;\n\n let start = Math.max(startLine - (linesAbove + 1), 0);\n let end = Math.min(source.length, endLine + linesBelow);\n\n if (startLine === -1) {\n start = 0;\n }\n\n if (endLine === -1) {\n end = source.length;\n }\n\n const lineDiff = endLine - startLine;\n const markerLines: MarkerLines = {};\n\n if (lineDiff) {\n for (let i = 0; i <= lineDiff; i++) {\n const lineNumber = i + startLine;\n\n if (!startColumn) {\n markerLines[lineNumber] = true;\n } else if (i === 0) {\n const sourceLength = source[lineNumber - 1].length;\n\n markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1];\n } else if (i === lineDiff) {\n markerLines[lineNumber] = [0, endColumn];\n } else {\n const sourceLength = source[lineNumber - i].length;\n\n markerLines[lineNumber] = [0, sourceLength];\n }\n }\n } else {\n if (startColumn === endColumn) {\n if (startColumn) {\n markerLines[startLine] = [startColumn, 0];\n } else {\n markerLines[startLine] = true;\n }\n } else {\n markerLines[startLine] = [startColumn, endColumn - startColumn];\n }\n }\n\n return { start, end, markerLines };\n}\n\nexport function codeFrameColumns(\n rawLines: string,\n loc: NodeLocation,\n opts: Options = {},\n): string {\n const highlighted =\n (opts.highlightCode || opts.forceColor) && shouldHighlight(opts);\n const chalk = getChalk(opts.forceColor);\n const defs = getDefs(chalk);\n const maybeHighlight = (chalkFn: Chalk, string: string) => {\n return highlighted ? chalkFn(string) : string;\n };\n const lines = rawLines.split(NEWLINE);\n const { start, end, markerLines } = getMarkerLines(loc, lines, opts);\n const hasColumns = loc.start && typeof loc.start.column === \"number\";\n\n const numberMaxWidth = String(end).length;\n\n const highlightedLines = highlighted ? highlight(rawLines, opts) : rawLines;\n\n let frame = highlightedLines\n .split(NEWLINE, end)\n .slice(start, end)\n .map((line, index) => {\n const number = start + 1 + index;\n const paddedNumber = ` ${number}`.slice(-numberMaxWidth);\n const gutter = ` ${paddedNumber} |`;\n const hasMarker = markerLines[number];\n const lastMarkerLine = !markerLines[number + 1];\n if (hasMarker) {\n let markerLine = \"\";\n if (Array.isArray(hasMarker)) {\n const markerSpacing = line\n .slice(0, Math.max(hasMarker[0] - 1, 0))\n .replace(/[^\\t]/g, \" \");\n const numberOfMarkers = hasMarker[1] || 1;\n\n markerLine = [\n \"\\n \",\n maybeHighlight(defs.gutter, gutter.replace(/\\d/g, \" \")),\n \" \",\n markerSpacing,\n maybeHighlight(defs.marker, \"^\").repeat(numberOfMarkers),\n ].join(\"\");\n\n if (lastMarkerLine && opts.message) {\n markerLine += \" \" + maybeHighlight(defs.message, opts.message);\n }\n }\n return [\n maybeHighlight(defs.marker, \">\"),\n maybeHighlight(defs.gutter, gutter),\n line.length > 0 ? ` ${line}` : \"\",\n markerLine,\n ].join(\"\");\n } else {\n return ` ${maybeHighlight(defs.gutter, gutter)}${\n line.length > 0 ? ` ${line}` : \"\"\n }`;\n }\n })\n .join(\"\\n\");\n\n if (opts.message && !hasColumns) {\n frame = `${\" \".repeat(numberMaxWidth + 1)}${opts.message}\\n${frame}`;\n }\n\n if (highlighted) {\n return chalk.reset(frame);\n } else {\n return frame;\n }\n}\n\n/**\n * Create a code frame, adding line numbers, code highlighting, and pointing to a given position.\n */\n\nexport default function (\n rawLines: string,\n lineNumber: number,\n colNumber?: number | null,\n opts: Options = {},\n): string {\n if (!deprecationWarningShown) {\n deprecationWarningShown = true;\n\n const message =\n \"Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`.\";\n\n if (process.emitWarning) {\n // A string is directly supplied to emitWarning, because when supplying an\n // Error object node throws in the tests because of different contexts\n process.emitWarning(message, \"DeprecationWarning\");\n } else {\n const deprecationError = new Error(message);\n deprecationError.name = \"DeprecationWarning\";\n console.warn(new Error(message));\n }\n }\n\n colNumber = Math.max(colNumber, 0);\n\n const location: NodeLocation = {\n start: { column: colNumber, line: lineNumber },\n };\n\n return codeFrameColumns(rawLines, location, opts);\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/code-frame/package.json b/node_modules/@babel/code-frame/package.json index c3afdc155767..46a9ba9db12f 100644 --- a/node_modules/@babel/code-frame/package.json +++ b/node_modules/@babel/code-frame/package.json @@ -1,6 +1,6 @@ { "name": "@babel/code-frame", - "version": "7.22.13", + "version": "7.23.5", "description": "Generate errors that contain a code frame that point to source locations.", "author": "The Babel Team (https://babel.dev/team)", "homepage": "https://babel.dev/docs/en/next/babel-code-frame", @@ -16,11 +16,11 @@ }, "main": "./lib/index.js", "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "devDependencies": { - "import-meta-resolve": "^3.0.0", + "import-meta-resolve": "^4.0.0", "strip-ansi": "^4.0.0" }, "engines": { diff --git a/node_modules/@babel/compat-data/README.md b/node_modules/@babel/compat-data/README.md index 9f3abdece56a..381f3deb4ee0 100644 --- a/node_modules/@babel/compat-data/README.md +++ b/node_modules/@babel/compat-data/README.md @@ -2,7 +2,7 @@ > -See our website [@babel/compat-data](https://babeljs.io/docs/en/babel-compat-data) for more information. +See our website [@babel/compat-data](https://babeljs.io/docs/babel-compat-data) for more information. ## Install diff --git a/node_modules/@babel/compat-data/corejs2-built-ins.js b/node_modules/@babel/compat-data/corejs2-built-ins.js index 68ce97ff8358..ed19e0b8a4ff 100644 --- a/node_modules/@babel/compat-data/corejs2-built-ins.js +++ b/node_modules/@babel/compat-data/corejs2-built-ins.js @@ -1 +1,2 @@ +// Todo (Babel 8): remove this file as Babel 8 drop support of core-js 2 module.exports = require("./data/corejs2-built-ins.json"); diff --git a/node_modules/@babel/compat-data/corejs3-shipped-proposals.js b/node_modules/@babel/compat-data/corejs3-shipped-proposals.js index 6a85b4d974ac..7909b8c46d37 100644 --- a/node_modules/@babel/compat-data/corejs3-shipped-proposals.js +++ b/node_modules/@babel/compat-data/corejs3-shipped-proposals.js @@ -1 +1,2 @@ +// Todo (Babel 8): remove this file now that it is included in babel-plugin-polyfill-corejs3 module.exports = require("./data/corejs3-shipped-proposals.json"); diff --git a/node_modules/@babel/compat-data/data/corejs2-built-ins.json b/node_modules/@babel/compat-data/data/corejs2-built-ins.json index bf3be88e46d8..60b9c9074bab 100644 --- a/node_modules/@babel/compat-data/data/corejs2-built-ins.json +++ b/node_modules/@babel/compat-data/data/corejs2-built-ins.json @@ -10,6 +10,7 @@ "ios": "9", "samsung": "5", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.31" }, "es6.array.every": { @@ -26,6 +27,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.array.fill": { @@ -39,6 +41,7 @@ "ios": "8", "samsung": "5", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.31" }, "es6.array.filter": { @@ -51,6 +54,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.array.find": { @@ -64,6 +68,7 @@ "ios": "8", "samsung": "5", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.31" }, "es6.array.find-index": { @@ -77,6 +82,7 @@ "ios": "8", "samsung": "5", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.31" }, "es7.array.flat-map": { @@ -89,6 +95,7 @@ "deno": "1", "ios": "12", "samsung": "10", + "opera_mobile": "48", "electron": "4.0" }, "es6.array.for-each": { @@ -105,6 +112,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.array.from": { @@ -117,6 +125,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es7.array.includes": { @@ -129,6 +138,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "34", "electron": "0.36" }, "es6.array.index-of": { @@ -145,6 +155,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.array.is-array": { @@ -161,6 +172,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.array.iterator": { @@ -174,6 +186,7 @@ "ios": "9", "samsung": "9", "rhino": "1.7.13", + "opera_mobile": "47", "electron": "3.0" }, "es6.array.last-index-of": { @@ -190,6 +203,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.array.map": { @@ -202,6 +216,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.array.of": { @@ -215,6 +230,7 @@ "ios": "9", "samsung": "5", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.31" }, "es6.array.reduce": { @@ -231,6 +247,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.array.reduce-right": { @@ -247,6 +264,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.array.slice": { @@ -259,6 +277,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.array.some": { @@ -275,6 +294,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.array.sort": { @@ -289,6 +309,7 @@ "ios": "12", "samsung": "8", "rhino": "1.7.13", + "opera_mobile": "46", "electron": "3.0" }, "es6.array.species": { @@ -301,6 +322,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.date.now": { @@ -317,6 +339,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.date.to-iso-string": { @@ -333,6 +356,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.date.to-json": { @@ -348,6 +372,7 @@ "ios": "10", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "12.1", "electron": "0.20" }, "es6.date.to-primitive": { @@ -360,6 +385,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "34", "electron": "0.36" }, "es6.date.to-string": { @@ -376,6 +402,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.function.bind": { @@ -392,6 +419,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "12", "electron": "0.20" }, "es6.function.has-instance": { @@ -404,6 +432,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.function.name": { @@ -419,6 +448,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es6.map": { @@ -431,6 +461,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.math.acosh": { @@ -444,6 +475,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.asinh": { @@ -457,6 +489,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.atanh": { @@ -470,6 +503,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.cbrt": { @@ -483,6 +517,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.clz32": { @@ -496,6 +531,7 @@ "ios": "9", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.cosh": { @@ -509,6 +545,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.expm1": { @@ -522,6 +559,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.fround": { @@ -535,6 +573,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.hypot": { @@ -548,6 +587,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.imul": { @@ -562,6 +602,7 @@ "ios": "7", "samsung": "2", "rhino": "1.7.13", + "opera_mobile": "18", "electron": "0.20" }, "es6.math.log1p": { @@ -575,6 +616,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.log10": { @@ -588,6 +630,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.log2": { @@ -601,6 +644,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.sign": { @@ -614,6 +658,7 @@ "ios": "9", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.sinh": { @@ -627,6 +672,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.tanh": { @@ -640,6 +686,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.math.trunc": { @@ -653,6 +700,7 @@ "ios": "8", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.number.constructor": { @@ -666,6 +714,7 @@ "ios": "9", "samsung": "3.4", "rhino": "1.7.13", + "opera_mobile": "28", "electron": "0.21" }, "es6.number.epsilon": { @@ -679,6 +728,7 @@ "ios": "9", "samsung": "2", "rhino": "1.7.14", + "opera_mobile": "21", "electron": "0.20" }, "es6.number.is-finite": { @@ -693,6 +743,7 @@ "ios": "9", "samsung": "1.5", "rhino": "1.7.13", + "opera_mobile": "14", "electron": "0.20" }, "es6.number.is-integer": { @@ -706,6 +757,7 @@ "ios": "9", "samsung": "2", "rhino": "1.7.13", + "opera_mobile": "21", "electron": "0.20" }, "es6.number.is-nan": { @@ -720,6 +772,7 @@ "ios": "9", "samsung": "1.5", "rhino": "1.7.13", + "opera_mobile": "14", "electron": "0.20" }, "es6.number.is-safe-integer": { @@ -733,6 +786,7 @@ "ios": "9", "samsung": "2", "rhino": "1.7.13", + "opera_mobile": "21", "electron": "0.20" }, "es6.number.max-safe-integer": { @@ -746,6 +800,7 @@ "ios": "9", "samsung": "2", "rhino": "1.7.13", + "opera_mobile": "21", "electron": "0.20" }, "es6.number.min-safe-integer": { @@ -759,6 +814,7 @@ "ios": "9", "samsung": "2", "rhino": "1.7.13", + "opera_mobile": "21", "electron": "0.20" }, "es6.number.parse-float": { @@ -772,6 +828,7 @@ "ios": "9", "samsung": "2", "rhino": "1.7.14", + "opera_mobile": "21", "electron": "0.20" }, "es6.number.parse-int": { @@ -785,6 +842,7 @@ "ios": "9", "samsung": "2", "rhino": "1.7.14", + "opera_mobile": "21", "electron": "0.20" }, "es6.object.assign": { @@ -797,6 +855,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.object.create": { @@ -813,6 +872,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "12", "electron": "0.20" }, "es7.object.define-getter": { @@ -825,6 +885,7 @@ "deno": "1", "ios": "9", "samsung": "8", + "opera_mobile": "46", "electron": "3.0" }, "es7.object.define-setter": { @@ -837,6 +898,7 @@ "deno": "1", "ios": "9", "samsung": "8", + "opera_mobile": "46", "electron": "3.0" }, "es6.object.define-property": { @@ -853,6 +915,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "12", "electron": "0.20" }, "es6.object.define-properties": { @@ -869,6 +932,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "12", "electron": "0.20" }, "es7.object.entries": { @@ -882,6 +946,7 @@ "ios": "10.3", "samsung": "6", "rhino": "1.7.14", + "opera_mobile": "41", "electron": "1.4" }, "es6.object.freeze": { @@ -895,6 +960,7 @@ "ios": "9", "samsung": "4", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.30" }, "es6.object.get-own-property-descriptor": { @@ -908,6 +974,7 @@ "ios": "9", "samsung": "4", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.30" }, "es7.object.get-own-property-descriptors": { @@ -920,6 +987,7 @@ "deno": "1", "ios": "10.3", "samsung": "6", + "opera_mobile": "41", "electron": "1.4" }, "es6.object.get-own-property-names": { @@ -933,6 +1001,7 @@ "ios": "9", "samsung": "3.4", "rhino": "1.7.13", + "opera_mobile": "27", "electron": "0.21" }, "es6.object.get-prototype-of": { @@ -946,6 +1015,7 @@ "ios": "9", "samsung": "4", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.30" }, "es7.object.lookup-getter": { @@ -958,6 +1028,7 @@ "deno": "1", "ios": "9", "samsung": "8", + "opera_mobile": "46", "electron": "3.0" }, "es7.object.lookup-setter": { @@ -970,6 +1041,7 @@ "deno": "1", "ios": "9", "samsung": "8", + "opera_mobile": "46", "electron": "3.0" }, "es6.object.prevent-extensions": { @@ -983,6 +1055,7 @@ "ios": "9", "samsung": "4", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.30" }, "es6.object.to-string": { @@ -995,6 +1068,7 @@ "deno": "1", "ios": "10", "samsung": "7", + "opera_mobile": "43", "electron": "1.7" }, "es6.object.is": { @@ -1009,6 +1083,7 @@ "ios": "9", "samsung": "1.5", "rhino": "1.7.13", + "opera_mobile": "14", "electron": "0.20" }, "es6.object.is-frozen": { @@ -1022,6 +1097,7 @@ "ios": "9", "samsung": "4", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.30" }, "es6.object.is-sealed": { @@ -1035,6 +1111,7 @@ "ios": "9", "samsung": "4", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.30" }, "es6.object.is-extensible": { @@ -1048,6 +1125,7 @@ "ios": "9", "samsung": "4", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.30" }, "es6.object.keys": { @@ -1061,6 +1139,7 @@ "ios": "9", "samsung": "3.4", "rhino": "1.7.13", + "opera_mobile": "27", "electron": "0.21" }, "es6.object.seal": { @@ -1074,6 +1153,7 @@ "ios": "9", "samsung": "4", "rhino": "1.7.13", + "opera_mobile": "32", "electron": "0.30" }, "es6.object.set-prototype-of": { @@ -1088,6 +1168,7 @@ "ios": "9", "samsung": "2", "rhino": "1.7.13", + "opera_mobile": "21", "electron": "0.20" }, "es7.object.values": { @@ -1101,6 +1182,7 @@ "ios": "10.3", "samsung": "6", "rhino": "1.7.14", + "opera_mobile": "41", "electron": "1.4" }, "es6.promise": { @@ -1113,6 +1195,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es7.promise.finally": { @@ -1125,6 +1208,7 @@ "deno": "1", "ios": "11.3", "samsung": "8", + "opera_mobile": "46", "electron": "3.0" }, "es6.reflect.apply": { @@ -1137,6 +1221,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.construct": { @@ -1149,6 +1234,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.define-property": { @@ -1161,6 +1247,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.delete-property": { @@ -1173,6 +1260,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.get": { @@ -1185,6 +1273,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.get-own-property-descriptor": { @@ -1197,6 +1286,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.get-prototype-of": { @@ -1209,6 +1299,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.has": { @@ -1221,6 +1312,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.is-extensible": { @@ -1233,6 +1325,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.own-keys": { @@ -1245,6 +1338,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.prevent-extensions": { @@ -1257,6 +1351,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.set": { @@ -1269,6 +1364,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.reflect.set-prototype-of": { @@ -1281,6 +1377,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.regexp.constructor": { @@ -1293,6 +1390,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "37", "electron": "1.1" }, "es6.regexp.flags": { @@ -1305,6 +1403,7 @@ "deno": "1", "ios": "9", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "es6.regexp.match": { @@ -1318,6 +1417,7 @@ "ios": "10", "samsung": "5", "rhino": "1.7.13", + "opera_mobile": "37", "electron": "1.1" }, "es6.regexp.replace": { @@ -1330,6 +1430,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "37", "electron": "1.1" }, "es6.regexp.split": { @@ -1342,6 +1443,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "37", "electron": "1.1" }, "es6.regexp.search": { @@ -1355,6 +1457,7 @@ "ios": "10", "samsung": "5", "rhino": "1.7.13", + "opera_mobile": "37", "electron": "1.1" }, "es6.regexp.to-string": { @@ -1367,6 +1470,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "37", "electron": "1.1" }, "es6.set": { @@ -1379,6 +1483,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.symbol": { @@ -1391,6 +1496,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es7.symbol.async-iterator": { @@ -1403,6 +1509,7 @@ "deno": "1", "ios": "12", "samsung": "8", + "opera_mobile": "46", "electron": "3.0" }, "es6.string.anchor": { @@ -1418,6 +1525,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.big": { @@ -1433,6 +1541,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.blink": { @@ -1448,6 +1557,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.bold": { @@ -1463,6 +1573,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.code-point-at": { @@ -1476,6 +1587,7 @@ "ios": "9", "samsung": "3.4", "rhino": "1.7.13", + "opera_mobile": "28", "electron": "0.21" }, "es6.string.ends-with": { @@ -1489,6 +1601,7 @@ "ios": "9", "samsung": "3.4", "rhino": "1.7.13", + "opera_mobile": "28", "electron": "0.21" }, "es6.string.fixed": { @@ -1504,6 +1617,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.fontcolor": { @@ -1519,6 +1633,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.fontsize": { @@ -1534,6 +1649,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.from-code-point": { @@ -1547,6 +1663,7 @@ "ios": "9", "samsung": "3.4", "rhino": "1.7.13", + "opera_mobile": "28", "electron": "0.21" }, "es6.string.includes": { @@ -1560,6 +1677,7 @@ "ios": "9", "samsung": "3.4", "rhino": "1.7.13", + "opera_mobile": "28", "electron": "0.21" }, "es6.string.italics": { @@ -1575,6 +1693,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.iterator": { @@ -1588,6 +1707,7 @@ "ios": "9", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "es6.string.link": { @@ -1603,6 +1723,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es7.string.pad-start": { @@ -1616,6 +1737,7 @@ "ios": "10", "samsung": "7", "rhino": "1.7.13", + "opera_mobile": "43", "electron": "1.7" }, "es7.string.pad-end": { @@ -1629,6 +1751,7 @@ "ios": "10", "samsung": "7", "rhino": "1.7.13", + "opera_mobile": "43", "electron": "1.7" }, "es6.string.raw": { @@ -1642,6 +1765,7 @@ "ios": "9", "samsung": "3.4", "rhino": "1.7.14", + "opera_mobile": "28", "electron": "0.21" }, "es6.string.repeat": { @@ -1655,6 +1779,7 @@ "ios": "9", "samsung": "3.4", "rhino": "1.7.13", + "opera_mobile": "28", "electron": "0.21" }, "es6.string.small": { @@ -1670,6 +1795,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.starts-with": { @@ -1683,6 +1809,7 @@ "ios": "9", "samsung": "3.4", "rhino": "1.7.13", + "opera_mobile": "28", "electron": "0.21" }, "es6.string.strike": { @@ -1698,6 +1825,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.sub": { @@ -1713,6 +1841,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.sup": { @@ -1728,6 +1857,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.14", + "opera_mobile": "14", "electron": "0.20" }, "es6.string.trim": { @@ -1744,6 +1874,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "es7.string.trim-left": { @@ -1757,6 +1888,7 @@ "ios": "12", "samsung": "9", "rhino": "1.7.13", + "opera_mobile": "47", "electron": "3.0" }, "es7.string.trim-right": { @@ -1770,6 +1902,7 @@ "ios": "12", "samsung": "9", "rhino": "1.7.13", + "opera_mobile": "47", "electron": "3.0" }, "es6.typed.array-buffer": { @@ -1782,6 +1915,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.typed.data-view": { @@ -1798,6 +1932,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "12", "electron": "0.20" }, "es6.typed.int8-array": { @@ -1810,6 +1945,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.typed.uint8-array": { @@ -1822,6 +1958,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.typed.uint8-clamped-array": { @@ -1834,6 +1971,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.typed.int16-array": { @@ -1846,6 +1984,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.typed.uint16-array": { @@ -1858,6 +1997,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.typed.int32-array": { @@ -1870,6 +2010,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.typed.uint32-array": { @@ -1882,6 +2023,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.typed.float32-array": { @@ -1894,6 +2036,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.typed.float64-array": { @@ -1906,6 +2049,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.weak-map": { @@ -1918,6 +2062,7 @@ "deno": "1", "ios": "9", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "es6.weak-set": { @@ -1930,6 +2075,7 @@ "deno": "1", "ios": "9", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" } } diff --git a/node_modules/@babel/compat-data/data/corejs3-shipped-proposals.json b/node_modules/@babel/compat-data/data/corejs3-shipped-proposals.json index 7ce01ed93444..d03b698ff0c1 100644 --- a/node_modules/@babel/compat-data/data/corejs3-shipped-proposals.json +++ b/node_modules/@babel/compat-data/data/corejs3-shipped-proposals.json @@ -1,5 +1,5 @@ [ - "esnext.global-this", "esnext.promise.all-settled", - "esnext.string.match-all" + "esnext.string.match-all", + "esnext.global-this" ] diff --git a/node_modules/@babel/compat-data/data/native-modules.json b/node_modules/@babel/compat-data/data/native-modules.json index bf634997ee96..2328d2138bd5 100644 --- a/node_modules/@babel/compat-data/data/native-modules.json +++ b/node_modules/@babel/compat-data/data/native-modules.json @@ -7,7 +7,7 @@ "and_ff": "60", "node": "13.2.0", "opera": "48", - "op_mob": "48", + "op_mob": "45", "safari": "10.1", "ios": "10.3", "samsung": "8.2", diff --git a/node_modules/@babel/compat-data/data/overlapping-plugins.json b/node_modules/@babel/compat-data/data/overlapping-plugins.json index 94fda05db6b8..8b34821145db 100644 --- a/node_modules/@babel/compat-data/data/overlapping-plugins.json +++ b/node_modules/@babel/compat-data/data/overlapping-plugins.json @@ -21,5 +21,11 @@ ], "proposal-optional-chaining": [ "bugfix/transform-v8-spread-parameters-in-optional-chaining" + ], + "transform-class-properties": [ + "bugfix/transform-v8-static-class-fields-redefine-readonly" + ], + "proposal-class-properties": [ + "bugfix/transform-v8-static-class-fields-redefine-readonly" ] } diff --git a/node_modules/@babel/compat-data/data/plugin-bugfixes.json b/node_modules/@babel/compat-data/data/plugin-bugfixes.json index 57ab95d8b473..2f55547d384d 100644 --- a/node_modules/@babel/compat-data/data/plugin-bugfixes.json +++ b/node_modules/@babel/compat-data/data/plugin-bugfixes.json @@ -9,6 +9,7 @@ "deno": "1", "ios": "11", "samsung": "6", + "opera_mobile": "42", "electron": "1.6" }, "bugfix/transform-edge-default-parameters": { @@ -21,6 +22,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "bugfix/transform-edge-function-name": { @@ -33,6 +35,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "bugfix/transform-safari-block-shadowing": { @@ -46,6 +49,7 @@ "ie": "11", "ios": "11", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "bugfix/transform-safari-for-shadowing": { @@ -60,6 +64,7 @@ "ios": "11", "samsung": "5", "rhino": "1.7.13", + "opera_mobile": "36", "electron": "0.37" }, "bugfix/transform-safari-id-destructuring-collision-in-function-expression": { @@ -67,9 +72,12 @@ "opera": "36", "edge": "14", "firefox": "2", + "safari": "16.3", "node": "6", "deno": "1", + "ios": "16.3", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "bugfix/transform-tagged-template-caching": { @@ -83,6 +91,7 @@ "ios": "13", "samsung": "3.4", "rhino": "1.7.14", + "opera_mobile": "28", "electron": "0.21" }, "bugfix/transform-v8-spread-parameters-in-optional-chaining": { @@ -95,6 +104,7 @@ "deno": "1.9", "ios": "13.4", "samsung": "16", + "opera_mobile": "64", "electron": "13.0" }, "transform-optional-chaining": { @@ -107,6 +117,7 @@ "deno": "1", "ios": "13.4", "samsung": "13", + "opera_mobile": "57", "electron": "8.0" }, "proposal-optional-chaining": { @@ -119,6 +130,7 @@ "deno": "1", "ios": "13.4", "samsung": "13", + "opera_mobile": "57", "electron": "8.0" }, "transform-parameters": { @@ -131,6 +143,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "transform-async-to-generator": { @@ -143,6 +156,7 @@ "deno": "1", "ios": "10.3", "samsung": "6", + "opera_mobile": "42", "electron": "1.6" }, "transform-template-literals": { @@ -155,6 +169,7 @@ "deno": "1", "ios": "9", "samsung": "3.4", + "opera_mobile": "28", "electron": "0.21" }, "transform-function-name": { @@ -167,18 +182,20 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "transform-block-scoping": { - "chrome": "49", - "opera": "36", + "chrome": "50", + "opera": "37", "edge": "14", - "firefox": "51", + "firefox": "53", "safari": "10", "node": "6", "deno": "1", "ios": "10", "samsung": "5", - "electron": "0.37" + "opera_mobile": "37", + "electron": "1.1" } } diff --git a/node_modules/@babel/compat-data/data/plugins.json b/node_modules/@babel/compat-data/data/plugins.json index 6d69c79844dd..dcf37fdf9447 100644 --- a/node_modules/@babel/compat-data/data/plugins.json +++ b/node_modules/@babel/compat-data/data/plugins.json @@ -1,12 +1,39 @@ { + "transform-unicode-sets-regex": { + "chrome": "112", + "opera": "98", + "edge": "112", + "firefox": "116", + "safari": "tp", + "node": "20", + "deno": "1.32", + "opera_mobile": "75", + "electron": "24.0" + }, + "bugfix/transform-v8-static-class-fields-redefine-readonly": { + "chrome": "98", + "opera": "84", + "edge": "98", + "firefox": "95", + "safari": "15", + "node": "12", + "deno": "1.18", + "ios": "15", + "samsung": "11", + "opera_mobile": "52", + "electron": "17.0" + }, "transform-class-static-block": { "chrome": "94", "opera": "80", "edge": "94", "firefox": "93", + "safari": "16.4", "node": "16.11", "deno": "1.14", + "ios": "16.4", "samsung": "17", + "opera_mobile": "66", "electron": "15.0" }, "proposal-class-static-block": { @@ -14,9 +41,12 @@ "opera": "80", "edge": "94", "firefox": "93", + "safari": "16.4", "node": "16.11", "deno": "1.14", + "ios": "16.4", "samsung": "17", + "opera_mobile": "66", "electron": "15.0" }, "transform-private-property-in-object": { @@ -29,6 +59,7 @@ "deno": "1.9", "ios": "15", "samsung": "16", + "opera_mobile": "64", "electron": "13.0" }, "proposal-private-property-in-object": { @@ -41,6 +72,7 @@ "deno": "1.9", "ios": "15", "samsung": "16", + "opera_mobile": "64", "electron": "13.0" }, "transform-class-properties": { @@ -51,8 +83,9 @@ "safari": "14.1", "node": "12", "deno": "1", - "ios": "15", + "ios": "14.5", "samsung": "11", + "opera_mobile": "53", "electron": "6.0" }, "proposal-class-properties": { @@ -63,8 +96,9 @@ "safari": "14.1", "node": "12", "deno": "1", - "ios": "15", + "ios": "14.5", "samsung": "11", + "opera_mobile": "53", "electron": "6.0" }, "transform-private-methods": { @@ -77,6 +111,7 @@ "deno": "1", "ios": "15", "samsung": "14", + "opera_mobile": "60", "electron": "10.0" }, "proposal-private-methods": { @@ -89,6 +124,7 @@ "deno": "1", "ios": "15", "samsung": "14", + "opera_mobile": "60", "electron": "10.0" }, "transform-numeric-separator": { @@ -102,6 +138,7 @@ "ios": "13", "samsung": "11", "rhino": "1.7.14", + "opera_mobile": "54", "electron": "6.0" }, "proposal-numeric-separator": { @@ -115,6 +152,7 @@ "ios": "13", "samsung": "11", "rhino": "1.7.14", + "opera_mobile": "54", "electron": "6.0" }, "transform-logical-assignment-operators": { @@ -127,6 +165,7 @@ "deno": "1.2", "ios": "14", "samsung": "14", + "opera_mobile": "60", "electron": "10.0" }, "proposal-logical-assignment-operators": { @@ -139,6 +178,7 @@ "deno": "1.2", "ios": "14", "samsung": "14", + "opera_mobile": "60", "electron": "10.0" }, "transform-nullish-coalescing-operator": { @@ -151,6 +191,7 @@ "deno": "1", "ios": "13.4", "samsung": "13", + "opera_mobile": "57", "electron": "8.0" }, "proposal-nullish-coalescing-operator": { @@ -163,6 +204,7 @@ "deno": "1", "ios": "13.4", "samsung": "13", + "opera_mobile": "57", "electron": "8.0" }, "transform-optional-chaining": { @@ -175,6 +217,7 @@ "deno": "1.9", "ios": "13.4", "samsung": "16", + "opera_mobile": "64", "electron": "13.0" }, "proposal-optional-chaining": { @@ -187,6 +230,7 @@ "deno": "1.9", "ios": "13.4", "samsung": "16", + "opera_mobile": "64", "electron": "13.0" }, "transform-json-strings": { @@ -200,6 +244,7 @@ "ios": "12", "samsung": "9", "rhino": "1.7.14", + "opera_mobile": "47", "electron": "3.0" }, "proposal-json-strings": { @@ -213,6 +258,7 @@ "ios": "12", "samsung": "9", "rhino": "1.7.14", + "opera_mobile": "47", "electron": "3.0" }, "transform-optional-catch-binding": { @@ -225,6 +271,7 @@ "deno": "1", "ios": "11.3", "samsung": "9", + "opera_mobile": "47", "electron": "3.0" }, "proposal-optional-catch-binding": { @@ -237,6 +284,7 @@ "deno": "1", "ios": "11.3", "samsung": "9", + "opera_mobile": "47", "electron": "3.0" }, "transform-parameters": { @@ -244,9 +292,12 @@ "opera": "36", "edge": "18", "firefox": "53", + "safari": "16.3", "node": "6", "deno": "1", + "ios": "16.3", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "transform-async-generator-functions": { @@ -259,6 +310,7 @@ "deno": "1", "ios": "12", "samsung": "8", + "opera_mobile": "46", "electron": "3.0" }, "proposal-async-generator-functions": { @@ -271,6 +323,7 @@ "deno": "1", "ios": "12", "samsung": "8", + "opera_mobile": "46", "electron": "3.0" }, "transform-object-rest-spread": { @@ -283,6 +336,7 @@ "deno": "1", "ios": "11.3", "samsung": "8", + "opera_mobile": "44", "electron": "2.0" }, "proposal-object-rest-spread": { @@ -295,6 +349,7 @@ "deno": "1", "ios": "11.3", "samsung": "8", + "opera_mobile": "44", "electron": "2.0" }, "transform-dotall-regex": { @@ -307,6 +362,7 @@ "deno": "1", "ios": "11.3", "samsung": "8", + "opera_mobile": "46", "electron": "3.0" }, "transform-unicode-property-regex": { @@ -319,6 +375,7 @@ "deno": "1", "ios": "11.3", "samsung": "9", + "opera_mobile": "47", "electron": "3.0" }, "proposal-unicode-property-regex": { @@ -331,6 +388,7 @@ "deno": "1", "ios": "11.3", "samsung": "9", + "opera_mobile": "47", "electron": "3.0" }, "transform-named-capturing-groups-regex": { @@ -343,6 +401,7 @@ "deno": "1", "ios": "11.3", "samsung": "9", + "opera_mobile": "47", "electron": "3.0" }, "transform-async-to-generator": { @@ -355,6 +414,7 @@ "deno": "1", "ios": "11", "samsung": "6", + "opera_mobile": "42", "electron": "1.6" }, "transform-exponentiation-operator": { @@ -368,6 +428,7 @@ "ios": "10.3", "samsung": "6", "rhino": "1.7.14", + "opera_mobile": "41", "electron": "1.3" }, "transform-template-literals": { @@ -380,6 +441,7 @@ "deno": "1", "ios": "13", "samsung": "3.4", + "opera_mobile": "28", "electron": "0.21" }, "transform-literals": { @@ -392,6 +454,7 @@ "deno": "1", "ios": "9", "samsung": "4", + "opera_mobile": "32", "electron": "0.30" }, "transform-function-name": { @@ -404,6 +467,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "transform-arrow-functions": { @@ -417,6 +481,7 @@ "ios": "10", "samsung": "5", "rhino": "1.7.13", + "opera_mobile": "34", "electron": "0.36" }, "transform-block-scoped-functions": { @@ -430,6 +495,7 @@ "ie": "11", "ios": "10", "samsung": "3.4", + "opera_mobile": "28", "electron": "0.21" }, "transform-classes": { @@ -442,6 +508,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "33", "electron": "0.36" }, "transform-object-super": { @@ -454,6 +521,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "33", "electron": "0.36" }, "transform-shorthand-properties": { @@ -467,6 +535,7 @@ "ios": "9", "samsung": "4", "rhino": "1.7.14", + "opera_mobile": "30", "electron": "0.27" }, "transform-duplicate-keys": { @@ -479,6 +548,7 @@ "deno": "1", "ios": "9", "samsung": "3.4", + "opera_mobile": "29", "electron": "0.25" }, "transform-computed-properties": { @@ -491,6 +561,7 @@ "deno": "1", "ios": "8", "samsung": "4", + "opera_mobile": "32", "electron": "0.30" }, "transform-for-of": { @@ -503,6 +574,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "transform-sticky-regex": { @@ -515,6 +587,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "36", "electron": "0.37" }, "transform-unicode-escapes": { @@ -527,6 +600,7 @@ "deno": "1", "ios": "9", "samsung": "4", + "opera_mobile": "32", "electron": "0.30" }, "transform-unicode-regex": { @@ -539,6 +613,7 @@ "deno": "1", "ios": "12", "samsung": "5", + "opera_mobile": "37", "electron": "1.1" }, "transform-spread": { @@ -551,6 +626,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "33", "electron": "0.36" }, "transform-destructuring": { @@ -563,19 +639,21 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "41", "electron": "1.2" }, "transform-block-scoping": { - "chrome": "49", - "opera": "36", + "chrome": "50", + "opera": "37", "edge": "14", - "firefox": "51", + "firefox": "53", "safari": "11", "node": "6", "deno": "1", "ios": "11", "samsung": "5", - "electron": "0.37" + "opera_mobile": "37", + "electron": "1.1" }, "transform-typeof-symbol": { "chrome": "38", @@ -588,6 +666,7 @@ "ios": "9", "samsung": "3", "rhino": "1.7.13", + "opera_mobile": "25", "electron": "0.20" }, "transform-new-target": { @@ -600,6 +679,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "33", "electron": "0.36" }, "transform-regenerator": { @@ -612,6 +692,7 @@ "deno": "1", "ios": "10", "samsung": "5", + "opera_mobile": "37", "electron": "1.1" }, "transform-member-expression-literals": { @@ -628,6 +709,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "12", "electron": "0.20" }, "transform-property-literals": { @@ -644,6 +726,7 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "12", "electron": "0.20" }, "transform-reserved-words": { @@ -660,30 +743,33 @@ "phantom": "1.9", "samsung": "1", "rhino": "1.7.13", + "opera_mobile": "10.1", "electron": "0.20" }, "transform-export-namespace-from": { "chrome": "72", - "and_chr": "72", + "deno": "1.0", "edge": "79", "firefox": "80", - "and_ff": "80", "node": "13.2", "opera": "60", - "op_mob": "51", + "opera_mobile": "51", + "safari": "14.1", + "ios": "14.5", "samsung": "11.0", "android": "72", "electron": "5.0" }, "proposal-export-namespace-from": { "chrome": "72", - "and_chr": "72", + "deno": "1.0", "edge": "79", "firefox": "80", - "and_ff": "80", "node": "13.2", "opera": "60", - "op_mob": "51", + "opera_mobile": "51", + "safari": "14.1", + "ios": "14.5", "samsung": "11.0", "android": "72", "electron": "5.0" diff --git a/node_modules/@babel/compat-data/package.json b/node_modules/@babel/compat-data/package.json index dfbbd8af1a24..a3d3f20c9270 100644 --- a/node_modules/@babel/compat-data/package.json +++ b/node_modules/@babel/compat-data/package.json @@ -1,6 +1,6 @@ { "name": "@babel/compat-data", - "version": "7.20.5", + "version": "7.23.5", "author": "The Babel Team (https://babel.dev/team)", "license": "MIT", "description": "", @@ -29,9 +29,9 @@ "compat-data" ], "devDependencies": { - "@mdn/browser-compat-data": "^4.0.10", - "core-js-compat": "^3.25.1", - "electron-to-chromium": "^1.4.248" + "@mdn/browser-compat-data": "^5.3.0", + "core-js-compat": "^3.31.0", + "electron-to-chromium": "^1.4.441" }, "engines": { "node": ">=6.9.0" diff --git a/node_modules/@babel/core/README.md b/node_modules/@babel/core/README.md index 9b3a9503360c..290354346969 100644 --- a/node_modules/@babel/core/README.md +++ b/node_modules/@babel/core/README.md @@ -2,7 +2,7 @@ > Babel compiler core. -See our website [@babel/core](https://babeljs.io/docs/en/babel-core) for more information or the [issues](https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A%20core%22+is%3Aopen) associated with this package. +See our website [@babel/core](https://babeljs.io/docs/babel-core) for more information or the [issues](https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A%20core%22+is%3Aopen) associated with this package. ## Install diff --git a/node_modules/@babel/core/cjs-proxy.cjs b/node_modules/@babel/core/cjs-proxy.cjs index 4bf8b5cb9ced..7ca4f321b5f0 100644 --- a/node_modules/@babel/core/cjs-proxy.cjs +++ b/node_modules/@babel/core/cjs-proxy.cjs @@ -1,6 +1,14 @@ "use strict"; const babelP = import("./lib/index.js"); +let babel = null; +Object.defineProperty(exports, "__ initialize @babel/core cjs proxy __", { + set(val) { + babel = val; + }, +}); + +exports.version = require("./package.json").version; const functionNames = [ "createConfigItem", @@ -11,13 +19,9 @@ const functionNames = [ "transformFromAst", "parse", ]; +const propertyNames = ["types", "tokTypes", "traverse", "template"]; for (const name of functionNames) { - exports[`${name}Sync`] = function () { - throw new Error( - `"${name}Sync" is not supported when loading @babel/core using require()` - ); - }; exports[name] = function (...args) { babelP.then(babel => { babel[name](...args); @@ -26,4 +30,24 @@ for (const name of functionNames) { exports[`${name}Async`] = function (...args) { return babelP.then(babel => babel[`${name}Async`](...args)); }; + exports[`${name}Sync`] = function (...args) { + if (!babel) throw notLoadedError(`${name}Sync`, "callable"); + return babel[`${name}Sync`](...args); + }; +} + +for (const name of propertyNames) { + Object.defineProperty(exports, name, { + get() { + if (!babel) throw notLoadedError(name, "accessible"); + return babel[name]; + }, + }); +} + +function notLoadedError(name, keyword) { + return new Error( + `The \`${name}\` export of @babel/core is only ${keyword}` + + ` from the CommonJS version after that the ESM version is loaded.` + ); } diff --git a/node_modules/@babel/core/lib/config/cache-contexts.js.map b/node_modules/@babel/core/lib/config/cache-contexts.js.map index 37fb689e2c0d..1e2dfd7eb844 100644 --- a/node_modules/@babel/core/lib/config/cache-contexts.js.map +++ b/node_modules/@babel/core/lib/config/cache-contexts.js.map @@ -1 +1 @@ -{"version":3,"names":[],"sources":["../../src/config/cache-contexts.ts"],"sourcesContent":["import type { Targets } from \"@babel/helper-compilation-targets\";\n\nimport type { ConfigContext } from \"./config-chain\";\nimport type { CallerMetadata } from \"./validation/options\";\n\nexport type { ConfigContext as FullConfig };\n\nexport type FullPreset = {\n targets: Targets;\n} & ConfigContext;\nexport type FullPlugin = {\n assumptions: { [name: string]: boolean };\n} & FullPreset;\n\n// Context not including filename since it is used in places that cannot\n// process 'ignore'/'only' and other filename-based logic.\nexport type SimpleConfig = {\n envName: string;\n caller: CallerMetadata | undefined;\n};\nexport type SimplePreset = {\n targets: Targets;\n} & SimpleConfig;\nexport type SimplePlugin = {\n assumptions: {\n [name: string]: boolean;\n };\n} & SimplePreset;\n"],"mappings":""} \ No newline at end of file +{"version":3,"names":[],"sources":["../../src/config/cache-contexts.ts"],"sourcesContent":["import type { Targets } from \"@babel/helper-compilation-targets\";\n\nimport type { ConfigContext } from \"./config-chain.ts\";\nimport type { CallerMetadata } from \"./validation/options.ts\";\n\nexport type { ConfigContext as FullConfig };\n\nexport type FullPreset = {\n targets: Targets;\n} & ConfigContext;\nexport type FullPlugin = {\n assumptions: { [name: string]: boolean };\n} & FullPreset;\n\n// Context not including filename since it is used in places that cannot\n// process 'ignore'/'only' and other filename-based logic.\nexport type SimpleConfig = {\n envName: string;\n caller: CallerMetadata | undefined;\n};\nexport type SimplePreset = {\n targets: Targets;\n} & SimpleConfig;\nexport type SimplePlugin = {\n assumptions: {\n [name: string]: boolean;\n };\n} & SimplePreset;\n"],"mappings":""} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/caching.js b/node_modules/@babel/core/lib/config/caching.js index 6362db3ce29b..344c8390e3d0 100644 --- a/node_modules/@babel/core/lib/config/caching.js +++ b/node_modules/@babel/core/lib/config/caching.js @@ -15,12 +15,11 @@ function _gensync() { }; return data; } -var _async = require("../gensync-utils/async"); -var _util = require("./util"); +var _async = require("../gensync-utils/async.js"); +var _util = require("./util.js"); const synchronize = gen => { return _gensync()(gen).sync; }; - function* genTrue() { return true; } @@ -36,7 +35,6 @@ function makeStrongCache(handler) { function makeStrongCacheSync(handler) { return synchronize(makeStrongCache(handler)); } - function makeCachedFunction(CallCache, handler) { const callCacheSync = new CallCache(); const callCacheAsync = new CallCache(); @@ -235,7 +233,6 @@ function makeSimpleConfigurator(cache) { cacheFn.invalidate = cb => cache.invalidate(() => assertSimpleType(cb())); return cacheFn; } - function assertSimpleType(value) { if ((0, _async.isThenable)(value)) { throw new Error(`You appear to be using an async cache handler, ` + `which your current version of Babel does not support. ` + `We may add support for this in the future, ` + `but if you're on the most recent version of @babel/core and still ` + `seeing this error, then you'll need to synchronously handle your caching logic.`); diff --git a/node_modules/@babel/core/lib/config/caching.js.map b/node_modules/@babel/core/lib/config/caching.js.map index a2ac90cb01dd..0dbcac6ba6ac 100644 --- a/node_modules/@babel/core/lib/config/caching.js.map +++ b/node_modules/@babel/core/lib/config/caching.js.map @@ -1 +1 @@ -{"version":3,"names":["synchronize","gen","gensync","sync","genTrue","makeWeakCache","handler","makeCachedFunction","WeakMap","makeWeakCacheSync","makeStrongCache","Map","makeStrongCacheSync","CallCache","callCacheSync","callCacheAsync","futureCache","cachedFunction","arg","data","asyncContext","isAsync","callCache","cached","getCachedValueOrWait","valid","value","cache","CacheConfigurator","handlerResult","finishLock","isIterableIterator","onFirstPause","setupAsyncLocks","updateFunctionCache","delete","release","getCachedValue","cachedValue","get","waitFor","promise","config","Lock","configured","forever","deactivate","mode","set","validator","push","constructor","_active","_never","_forever","_invalidate","_configured","_pairs","_data","simple","makeSimpleConfigurator","Error","never","using","key","fn","maybeAsync","isThenable","then","invalidate","pairs","cacheFn","val","assertSimpleType","cb","released","_resolve","Promise","resolve"],"sources":["../../src/config/caching.ts"],"sourcesContent":["import gensync from \"gensync\";\nimport type { Handler } from \"gensync\";\nimport {\n maybeAsync,\n isAsync,\n onFirstPause,\n waitFor,\n isThenable,\n} from \"../gensync-utils/async\";\nimport { isIterableIterator } from \"./util\";\n\nexport type { CacheConfigurator };\n\nexport type SimpleCacheConfigurator = {\n (forever: boolean): void;\n (handler: () => T): T;\n\n forever: () => void;\n never: () => void;\n using: (handler: () => T) => T;\n invalidate: (handler: () => T) => T;\n};\n\nexport type CacheEntry = Array<{\n value: ResultT;\n valid: (channel: SideChannel) => Handler;\n}>;\n\nconst synchronize = (\n gen: (...args: ArgsT) => Handler,\n): ((...args: ArgsT) => ResultT) => {\n return gensync(gen).sync;\n};\n\n// eslint-disable-next-line require-yield\nfunction* genTrue() {\n return true;\n}\n\nexport function makeWeakCache(\n handler: (\n arg: ArgT,\n cache: CacheConfigurator,\n ) => Handler | ResultT,\n): (arg: ArgT, data: SideChannel) => Handler {\n return makeCachedFunction(WeakMap, handler);\n}\n\nexport function makeWeakCacheSync(\n handler: (arg: ArgT, cache?: CacheConfigurator) => ResultT,\n): (arg: ArgT, data?: SideChannel) => ResultT {\n return synchronize<[ArgT, SideChannel], ResultT>(\n makeWeakCache(handler),\n );\n}\n\nexport function makeStrongCache(\n handler: (\n arg: ArgT,\n cache: CacheConfigurator,\n ) => Handler | ResultT,\n): (arg: ArgT, data: SideChannel) => Handler {\n return makeCachedFunction(Map, handler);\n}\n\nexport function makeStrongCacheSync(\n handler: (arg: ArgT, cache?: CacheConfigurator) => ResultT,\n): (arg: ArgT, data?: SideChannel) => ResultT {\n return synchronize<[ArgT, SideChannel], ResultT>(\n makeStrongCache(handler),\n );\n}\n\n/* NOTE: Part of the logic explained in this comment is explained in the\n * getCachedValueOrWait and setupAsyncLocks functions.\n *\n * > There are only two hard things in Computer Science: cache invalidation and naming things.\n * > -- Phil Karlton\n *\n * I don't know if Phil was also thinking about handling a cache whose invalidation function is\n * defined asynchronously is considered, but it is REALLY hard to do correctly.\n *\n * The implemented logic (only when gensync is run asynchronously) is the following:\n * 1. If there is a valid cache associated to the current \"arg\" parameter,\n * a. RETURN the cached value\n * 3. If there is a FinishLock associated to the current \"arg\" parameter representing a valid cache,\n * a. Wait for that lock to be released\n * b. RETURN the value associated with that lock\n * 5. Start executing the function to be cached\n * a. If it pauses on a promise, then\n * i. Let FinishLock be a new lock\n * ii. Store FinishLock as associated to the current \"arg\" parameter\n * iii. Wait for the function to finish executing\n * iv. Release FinishLock\n * v. Send the function result to anyone waiting on FinishLock\n * 6. Store the result in the cache\n * 7. RETURN the result\n */\nfunction makeCachedFunction(\n CallCache: new () => CacheMap,\n handler: (\n arg: ArgT,\n cache: CacheConfigurator,\n ) => Handler | ResultT,\n): (arg: ArgT, data: SideChannel) => Handler {\n const callCacheSync = new CallCache();\n const callCacheAsync = new CallCache();\n const futureCache = new CallCache>();\n\n return function* cachedFunction(arg: ArgT, data: SideChannel) {\n const asyncContext = yield* isAsync();\n const callCache = asyncContext ? callCacheAsync : callCacheSync;\n\n const cached = yield* getCachedValueOrWait(\n asyncContext,\n callCache,\n futureCache,\n arg,\n data,\n );\n if (cached.valid) return cached.value;\n\n const cache = new CacheConfigurator(data);\n\n const handlerResult: Handler | ResultT = handler(arg, cache);\n\n let finishLock: Lock;\n let value: ResultT;\n\n if (isIterableIterator(handlerResult)) {\n value = yield* onFirstPause(handlerResult, () => {\n finishLock = setupAsyncLocks(cache, futureCache, arg);\n });\n } else {\n value = handlerResult;\n }\n\n updateFunctionCache(callCache, cache, arg, value);\n\n if (finishLock) {\n futureCache.delete(arg);\n finishLock.release(value);\n }\n\n return value;\n };\n}\n\ntype CacheMap =\n | Map>\n // @ts-expect-error todo(flow->ts): add `extends object` constraint to ArgT\n | WeakMap>;\n\nfunction* getCachedValue(\n cache: CacheMap,\n arg: ArgT,\n data: SideChannel,\n): Handler<{ valid: true; value: ResultT } | { valid: false; value: null }> {\n const cachedValue: CacheEntry | void = cache.get(arg);\n\n if (cachedValue) {\n for (const { value, valid } of cachedValue) {\n if (yield* valid(data)) return { valid: true, value };\n }\n }\n\n return { valid: false, value: null };\n}\n\nfunction* getCachedValueOrWait(\n asyncContext: boolean,\n callCache: CacheMap,\n futureCache: CacheMap, SideChannel>,\n arg: ArgT,\n data: SideChannel,\n): Handler<{ valid: true; value: ResultT } | { valid: false; value: null }> {\n const cached = yield* getCachedValue(callCache, arg, data);\n if (cached.valid) {\n return cached;\n }\n\n if (asyncContext) {\n const cached = yield* getCachedValue(futureCache, arg, data);\n if (cached.valid) {\n const value = yield* waitFor(cached.value.promise);\n return { valid: true, value };\n }\n }\n\n return { valid: false, value: null };\n}\n\nfunction setupAsyncLocks(\n config: CacheConfigurator,\n futureCache: CacheMap, SideChannel>,\n arg: ArgT,\n): Lock {\n const finishLock = new Lock();\n\n updateFunctionCache(futureCache, config, arg, finishLock);\n\n return finishLock;\n}\n\nfunction updateFunctionCache<\n ArgT,\n ResultT,\n SideChannel,\n Cache extends CacheMap,\n>(\n cache: Cache,\n config: CacheConfigurator,\n arg: ArgT,\n value: ResultT,\n) {\n if (!config.configured()) config.forever();\n\n let cachedValue: CacheEntry | void = cache.get(arg);\n\n config.deactivate();\n\n switch (config.mode()) {\n case \"forever\":\n cachedValue = [{ value, valid: genTrue }];\n cache.set(arg, cachedValue);\n break;\n case \"invalidate\":\n cachedValue = [{ value, valid: config.validator() }];\n cache.set(arg, cachedValue);\n break;\n case \"valid\":\n if (cachedValue) {\n cachedValue.push({ value, valid: config.validator() });\n } else {\n cachedValue = [{ value, valid: config.validator() }];\n cache.set(arg, cachedValue);\n }\n }\n}\n\nclass CacheConfigurator {\n _active: boolean = true;\n _never: boolean = false;\n _forever: boolean = false;\n _invalidate: boolean = false;\n\n _configured: boolean = false;\n\n _pairs: Array<\n [cachedValue: unknown, handler: (data: SideChannel) => Handler]\n > = [];\n\n _data: SideChannel;\n\n constructor(data: SideChannel) {\n this._data = data;\n }\n\n simple() {\n return makeSimpleConfigurator(this);\n }\n\n mode() {\n if (this._never) return \"never\";\n if (this._forever) return \"forever\";\n if (this._invalidate) return \"invalidate\";\n return \"valid\";\n }\n\n forever() {\n if (!this._active) {\n throw new Error(\"Cannot change caching after evaluation has completed.\");\n }\n if (this._never) {\n throw new Error(\"Caching has already been configured with .never()\");\n }\n this._forever = true;\n this._configured = true;\n }\n\n never() {\n if (!this._active) {\n throw new Error(\"Cannot change caching after evaluation has completed.\");\n }\n if (this._forever) {\n throw new Error(\"Caching has already been configured with .forever()\");\n }\n this._never = true;\n this._configured = true;\n }\n\n using(handler: (data: SideChannel) => T): T {\n if (!this._active) {\n throw new Error(\"Cannot change caching after evaluation has completed.\");\n }\n if (this._never || this._forever) {\n throw new Error(\n \"Caching has already been configured with .never or .forever()\",\n );\n }\n this._configured = true;\n\n const key = handler(this._data);\n\n const fn = maybeAsync(\n handler,\n `You appear to be using an async cache handler, but Babel has been called synchronously`,\n );\n\n if (isThenable(key)) {\n // @ts-expect-error todo(flow->ts): improve function return type annotation\n return key.then((key: unknown) => {\n this._pairs.push([key, fn]);\n return key;\n });\n }\n\n this._pairs.push([key, fn]);\n return key;\n }\n\n invalidate(handler: (data: SideChannel) => T): T {\n this._invalidate = true;\n return this.using(handler);\n }\n\n validator(): (data: SideChannel) => Handler {\n const pairs = this._pairs;\n return function* (data: SideChannel) {\n for (const [key, fn] of pairs) {\n if (key !== (yield* fn(data))) return false;\n }\n return true;\n };\n }\n\n deactivate() {\n this._active = false;\n }\n\n configured() {\n return this._configured;\n }\n}\n\nfunction makeSimpleConfigurator(\n cache: CacheConfigurator,\n): SimpleCacheConfigurator {\n function cacheFn(val: any) {\n if (typeof val === \"boolean\") {\n if (val) cache.forever();\n else cache.never();\n return;\n }\n\n return cache.using(() => assertSimpleType(val()));\n }\n cacheFn.forever = () => cache.forever();\n cacheFn.never = () => cache.never();\n cacheFn.using = (cb: { (): SimpleType }) =>\n cache.using(() => assertSimpleType(cb()));\n cacheFn.invalidate = (cb: { (): SimpleType }) =>\n cache.invalidate(() => assertSimpleType(cb()));\n\n return cacheFn as any;\n}\n\n// Types are limited here so that in the future these values can be used\n// as part of Babel's caching logic.\nexport type SimpleType =\n | string\n | boolean\n | number\n | null\n | void\n | Promise;\nexport function assertSimpleType(value: unknown): SimpleType {\n if (isThenable(value)) {\n throw new Error(\n `You appear to be using an async cache handler, ` +\n `which your current version of Babel does not support. ` +\n `We may add support for this in the future, ` +\n `but if you're on the most recent version of @babel/core and still ` +\n `seeing this error, then you'll need to synchronously handle your caching logic.`,\n );\n }\n\n if (\n value != null &&\n typeof value !== \"string\" &&\n typeof value !== \"boolean\" &&\n typeof value !== \"number\"\n ) {\n throw new Error(\n \"Cache keys must be either string, boolean, number, null, or undefined.\",\n );\n }\n // @ts-expect-error Type 'unknown' is not assignable to type 'SimpleType'. This can be removed\n // when strictNullCheck is enabled\n return value;\n}\n\nclass Lock {\n released: boolean = false;\n promise: Promise;\n _resolve: (value: T) => void;\n\n constructor() {\n this.promise = new Promise(resolve => {\n this._resolve = resolve;\n });\n }\n\n release(value: T) {\n this.released = true;\n this._resolve(value);\n }\n}\n"],"mappings":";;;;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;AAOA;AAmBA,MAAMA,WAAW,GACfC,GAAyC,IACP;EAClC,OAAOC,UAAO,CAACD,GAAG,CAAC,CAACE,IAAI;AAC1B,CAAC;;AAGD,UAAUC,OAAO,GAAG;EAClB,OAAO,IAAI;AACb;AAEO,SAASC,aAAa,CAC3BC,OAG+B,EACqB;EACpD,OAAOC,kBAAkB,CAA6BC,OAAO,EAAEF,OAAO,CAAC;AACzE;AAEO,SAASG,iBAAiB,CAC/BH,OAAuE,EAC3B;EAC5C,OAAON,WAAW,CAChBK,aAAa,CAA6BC,OAAO,CAAC,CACnD;AACH;AAEO,SAASI,eAAe,CAC7BJ,OAG+B,EACqB;EACpD,OAAOC,kBAAkB,CAA6BI,GAAG,EAAEL,OAAO,CAAC;AACrE;AAEO,SAASM,mBAAmB,CACjCN,OAAuE,EAC3B;EAC5C,OAAON,WAAW,CAChBU,eAAe,CAA6BJ,OAAO,CAAC,CACrD;AACH;;AA2BA,SAASC,kBAAkB,CACzBM,SAAgE,EAChEP,OAG+B,EACqB;EACpD,MAAMQ,aAAa,GAAG,IAAID,SAAS,EAAW;EAC9C,MAAME,cAAc,GAAG,IAAIF,SAAS,EAAW;EAC/C,MAAMG,WAAW,GAAG,IAAIH,SAAS,EAAiB;EAElD,OAAO,UAAUI,cAAc,CAACC,GAAS,EAAEC,IAAiB,EAAE;IAC5D,MAAMC,YAAY,GAAG,OAAO,IAAAC,cAAO,GAAE;IACrC,MAAMC,SAAS,GAAGF,YAAY,GAAGL,cAAc,GAAGD,aAAa;IAE/D,MAAMS,MAAM,GAAG,OAAOC,oBAAoB,CACxCJ,YAAY,EACZE,SAAS,EACTN,WAAW,EACXE,GAAG,EACHC,IAAI,CACL;IACD,IAAII,MAAM,CAACE,KAAK,EAAE,OAAOF,MAAM,CAACG,KAAK;IAErC,MAAMC,KAAK,GAAG,IAAIC,iBAAiB,CAACT,IAAI,CAAC;IAEzC,MAAMU,aAAyC,GAAGvB,OAAO,CAACY,GAAG,EAAES,KAAK,CAAC;IAErE,IAAIG,UAAyB;IAC7B,IAAIJ,KAAc;IAElB,IAAI,IAAAK,wBAAkB,EAACF,aAAa,CAAC,EAAE;MACrCH,KAAK,GAAG,OAAO,IAAAM,mBAAY,EAACH,aAAa,EAAE,MAAM;QAC/CC,UAAU,GAAGG,eAAe,CAACN,KAAK,EAAEX,WAAW,EAAEE,GAAG,CAAC;MACvD,CAAC,CAAC;IACJ,CAAC,MAAM;MACLQ,KAAK,GAAGG,aAAa;IACvB;IAEAK,mBAAmB,CAACZ,SAAS,EAAEK,KAAK,EAAET,GAAG,EAAEQ,KAAK,CAAC;IAEjD,IAAII,UAAU,EAAE;MACdd,WAAW,CAACmB,MAAM,CAACjB,GAAG,CAAC;MACvBY,UAAU,CAACM,OAAO,CAACV,KAAK,CAAC;IAC3B;IAEA,OAAOA,KAAK;EACd,CAAC;AACH;AAOA,UAAUW,cAAc,CACtBV,KAA2C,EAC3CT,GAAS,EACTC,IAAiB,EACyD;EAC1E,MAAMmB,WAAoD,GAAGX,KAAK,CAACY,GAAG,CAACrB,GAAG,CAAC;EAE3E,IAAIoB,WAAW,EAAE;IACf,KAAK,MAAM;MAAEZ,KAAK;MAAED;IAAM,CAAC,IAAIa,WAAW,EAAE;MAC1C,IAAI,OAAOb,KAAK,CAACN,IAAI,CAAC,EAAE,OAAO;QAAEM,KAAK,EAAE,IAAI;QAAEC;MAAM,CAAC;IACvD;EACF;EAEA,OAAO;IAAED,KAAK,EAAE,KAAK;IAAEC,KAAK,EAAE;EAAK,CAAC;AACtC;AAEA,UAAUF,oBAAoB,CAC5BJ,YAAqB,EACrBE,SAA+C,EAC/CN,WAAuD,EACvDE,GAAS,EACTC,IAAiB,EACyD;EAC1E,MAAMI,MAAM,GAAG,OAAOc,cAAc,CAACf,SAAS,EAAEJ,GAAG,EAAEC,IAAI,CAAC;EAC1D,IAAII,MAAM,CAACE,KAAK,EAAE;IAChB,OAAOF,MAAM;EACf;EAEA,IAAIH,YAAY,EAAE;IAChB,MAAMG,MAAM,GAAG,OAAOc,cAAc,CAACrB,WAAW,EAAEE,GAAG,EAAEC,IAAI,CAAC;IAC5D,IAAII,MAAM,CAACE,KAAK,EAAE;MAChB,MAAMC,KAAK,GAAG,OAAO,IAAAc,cAAO,EAAUjB,MAAM,CAACG,KAAK,CAACe,OAAO,CAAC;MAC3D,OAAO;QAAEhB,KAAK,EAAE,IAAI;QAAEC;MAAM,CAAC;IAC/B;EACF;EAEA,OAAO;IAAED,KAAK,EAAE,KAAK;IAAEC,KAAK,EAAE;EAAK,CAAC;AACtC;AAEA,SAASO,eAAe,CACtBS,MAAsC,EACtC1B,WAAuD,EACvDE,GAAS,EACM;EACf,MAAMY,UAAU,GAAG,IAAIa,IAAI,EAAW;EAEtCT,mBAAmB,CAAClB,WAAW,EAAE0B,MAAM,EAAExB,GAAG,EAAEY,UAAU,CAAC;EAEzD,OAAOA,UAAU;AACnB;AAEA,SAASI,mBAAmB,CAM1BP,KAAY,EACZe,MAAsC,EACtCxB,GAAS,EACTQ,KAAc,EACd;EACA,IAAI,CAACgB,MAAM,CAACE,UAAU,EAAE,EAAEF,MAAM,CAACG,OAAO,EAAE;EAE1C,IAAIP,WAAoD,GAAGX,KAAK,CAACY,GAAG,CAACrB,GAAG,CAAC;EAEzEwB,MAAM,CAACI,UAAU,EAAE;EAEnB,QAAQJ,MAAM,CAACK,IAAI,EAAE;IACnB,KAAK,SAAS;MACZT,WAAW,GAAG,CAAC;QAAEZ,KAAK;QAAED,KAAK,EAAErB;MAAQ,CAAC,CAAC;MACzCuB,KAAK,CAACqB,GAAG,CAAC9B,GAAG,EAAEoB,WAAW,CAAC;MAC3B;IACF,KAAK,YAAY;MACfA,WAAW,GAAG,CAAC;QAAEZ,KAAK;QAAED,KAAK,EAAEiB,MAAM,CAACO,SAAS;MAAG,CAAC,CAAC;MACpDtB,KAAK,CAACqB,GAAG,CAAC9B,GAAG,EAAEoB,WAAW,CAAC;MAC3B;IACF,KAAK,OAAO;MACV,IAAIA,WAAW,EAAE;QACfA,WAAW,CAACY,IAAI,CAAC;UAAExB,KAAK;UAAED,KAAK,EAAEiB,MAAM,CAACO,SAAS;QAAG,CAAC,CAAC;MACxD,CAAC,MAAM;QACLX,WAAW,GAAG,CAAC;UAAEZ,KAAK;UAAED,KAAK,EAAEiB,MAAM,CAACO,SAAS;QAAG,CAAC,CAAC;QACpDtB,KAAK,CAACqB,GAAG,CAAC9B,GAAG,EAAEoB,WAAW,CAAC;MAC7B;EAAC;AAEP;AAEA,MAAMV,iBAAiB,CAAqB;EAc1CuB,WAAW,CAAChC,IAAiB,EAAE;IAAA,KAb/BiC,OAAO,GAAY,IAAI;IAAA,KACvBC,MAAM,GAAY,KAAK;IAAA,KACvBC,QAAQ,GAAY,KAAK;IAAA,KACzBC,WAAW,GAAY,KAAK;IAAA,KAE5BC,WAAW,GAAY,KAAK;IAAA,KAE5BC,MAAM,GAEF,EAAE;IAAA,KAENC,KAAK;IAGH,IAAI,CAACA,KAAK,GAAGvC,IAAI;EACnB;EAEAwC,MAAM,GAAG;IACP,OAAOC,sBAAsB,CAAC,IAAI,CAAC;EACrC;EAEAb,IAAI,GAAG;IACL,IAAI,IAAI,CAACM,MAAM,EAAE,OAAO,OAAO;IAC/B,IAAI,IAAI,CAACC,QAAQ,EAAE,OAAO,SAAS;IACnC,IAAI,IAAI,CAACC,WAAW,EAAE,OAAO,YAAY;IACzC,OAAO,OAAO;EAChB;EAEAV,OAAO,GAAG;IACR,IAAI,CAAC,IAAI,CAACO,OAAO,EAAE;MACjB,MAAM,IAAIS,KAAK,CAAC,uDAAuD,CAAC;IAC1E;IACA,IAAI,IAAI,CAACR,MAAM,EAAE;MACf,MAAM,IAAIQ,KAAK,CAAC,mDAAmD,CAAC;IACtE;IACA,IAAI,CAACP,QAAQ,GAAG,IAAI;IACpB,IAAI,CAACE,WAAW,GAAG,IAAI;EACzB;EAEAM,KAAK,GAAG;IACN,IAAI,CAAC,IAAI,CAACV,OAAO,EAAE;MACjB,MAAM,IAAIS,KAAK,CAAC,uDAAuD,CAAC;IAC1E;IACA,IAAI,IAAI,CAACP,QAAQ,EAAE;MACjB,MAAM,IAAIO,KAAK,CAAC,qDAAqD,CAAC;IACxE;IACA,IAAI,CAACR,MAAM,GAAG,IAAI;IAClB,IAAI,CAACG,WAAW,GAAG,IAAI;EACzB;EAEAO,KAAK,CAAIzD,OAAiC,EAAK;IAC7C,IAAI,CAAC,IAAI,CAAC8C,OAAO,EAAE;MACjB,MAAM,IAAIS,KAAK,CAAC,uDAAuD,CAAC;IAC1E;IACA,IAAI,IAAI,CAACR,MAAM,IAAI,IAAI,CAACC,QAAQ,EAAE;MAChC,MAAM,IAAIO,KAAK,CACb,+DAA+D,CAChE;IACH;IACA,IAAI,CAACL,WAAW,GAAG,IAAI;IAEvB,MAAMQ,GAAG,GAAG1D,OAAO,CAAC,IAAI,CAACoD,KAAK,CAAC;IAE/B,MAAMO,EAAE,GAAG,IAAAC,iBAAU,EACnB5D,OAAO,EACN,wFAAuF,CACzF;IAED,IAAI,IAAA6D,iBAAU,EAACH,GAAG,CAAC,EAAE;MAEnB,OAAOA,GAAG,CAACI,IAAI,CAAEJ,GAAY,IAAK;QAChC,IAAI,CAACP,MAAM,CAACP,IAAI,CAAC,CAACc,GAAG,EAAEC,EAAE,CAAC,CAAC;QAC3B,OAAOD,GAAG;MACZ,CAAC,CAAC;IACJ;IAEA,IAAI,CAACP,MAAM,CAACP,IAAI,CAAC,CAACc,GAAG,EAAEC,EAAE,CAAC,CAAC;IAC3B,OAAOD,GAAG;EACZ;EAEAK,UAAU,CAAI/D,OAAiC,EAAK;IAClD,IAAI,CAACiD,WAAW,GAAG,IAAI;IACvB,OAAO,IAAI,CAACQ,KAAK,CAACzD,OAAO,CAAC;EAC5B;EAEA2C,SAAS,GAA4C;IACnD,MAAMqB,KAAK,GAAG,IAAI,CAACb,MAAM;IACzB,OAAO,WAAWtC,IAAiB,EAAE;MACnC,KAAK,MAAM,CAAC6C,GAAG,EAAEC,EAAE,CAAC,IAAIK,KAAK,EAAE;QAC7B,IAAIN,GAAG,MAAM,OAAOC,EAAE,CAAC9C,IAAI,CAAC,CAAC,EAAE,OAAO,KAAK;MAC7C;MACA,OAAO,IAAI;IACb,CAAC;EACH;EAEA2B,UAAU,GAAG;IACX,IAAI,CAACM,OAAO,GAAG,KAAK;EACtB;EAEAR,UAAU,GAAG;IACX,OAAO,IAAI,CAACY,WAAW;EACzB;AACF;AAEA,SAASI,sBAAsB,CAC7BjC,KAA6B,EACJ;EACzB,SAAS4C,OAAO,CAACC,GAAQ,EAAE;IACzB,IAAI,OAAOA,GAAG,KAAK,SAAS,EAAE;MAC5B,IAAIA,GAAG,EAAE7C,KAAK,CAACkB,OAAO,EAAE,CAAC,KACpBlB,KAAK,CAACmC,KAAK,EAAE;MAClB;IACF;IAEA,OAAOnC,KAAK,CAACoC,KAAK,CAAC,MAAMU,gBAAgB,CAACD,GAAG,EAAE,CAAC,CAAC;EACnD;EACAD,OAAO,CAAC1B,OAAO,GAAG,MAAMlB,KAAK,CAACkB,OAAO,EAAE;EACvC0B,OAAO,CAACT,KAAK,GAAG,MAAMnC,KAAK,CAACmC,KAAK,EAAE;EACnCS,OAAO,CAACR,KAAK,GAAIW,EAAsB,IACrC/C,KAAK,CAACoC,KAAK,CAAC,MAAMU,gBAAgB,CAACC,EAAE,EAAE,CAAC,CAAC;EAC3CH,OAAO,CAACF,UAAU,GAAIK,EAAsB,IAC1C/C,KAAK,CAAC0C,UAAU,CAAC,MAAMI,gBAAgB,CAACC,EAAE,EAAE,CAAC,CAAC;EAEhD,OAAOH,OAAO;AAChB;;AAWO,SAASE,gBAAgB,CAAC/C,KAAc,EAAc;EAC3D,IAAI,IAAAyC,iBAAU,EAACzC,KAAK,CAAC,EAAE;IACrB,MAAM,IAAImC,KAAK,CACZ,iDAAgD,GAC9C,wDAAuD,GACvD,6CAA4C,GAC5C,oEAAmE,GACnE,iFAAgF,CACpF;EACH;EAEA,IACEnC,KAAK,IAAI,IAAI,IACb,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,SAAS,IAC1B,OAAOA,KAAK,KAAK,QAAQ,EACzB;IACA,MAAM,IAAImC,KAAK,CACb,wEAAwE,CACzE;EACH;EAGA,OAAOnC,KAAK;AACd;AAEA,MAAMiB,IAAI,CAAI;EAKZQ,WAAW,GAAG;IAAA,KAJdwB,QAAQ,GAAY,KAAK;IAAA,KACzBlC,OAAO;IAAA,KACPmC,QAAQ;IAGN,IAAI,CAACnC,OAAO,GAAG,IAAIoC,OAAO,CAACC,OAAO,IAAI;MACpC,IAAI,CAACF,QAAQ,GAAGE,OAAO;IACzB,CAAC,CAAC;EACJ;EAEA1C,OAAO,CAACV,KAAQ,EAAE;IAChB,IAAI,CAACiD,QAAQ,GAAG,IAAI;IACpB,IAAI,CAACC,QAAQ,CAAClD,KAAK,CAAC;EACtB;AACF;AAAC"} \ No newline at end of file +{"version":3,"names":["_gensync","data","require","_async","_util","synchronize","gen","gensync","sync","genTrue","makeWeakCache","handler","makeCachedFunction","WeakMap","makeWeakCacheSync","makeStrongCache","Map","makeStrongCacheSync","CallCache","callCacheSync","callCacheAsync","futureCache","cachedFunction","arg","asyncContext","isAsync","callCache","cached","getCachedValueOrWait","valid","value","cache","CacheConfigurator","handlerResult","finishLock","isIterableIterator","onFirstPause","setupAsyncLocks","updateFunctionCache","delete","release","getCachedValue","cachedValue","get","waitFor","promise","config","Lock","configured","forever","deactivate","mode","set","validator","push","constructor","_active","_never","_forever","_invalidate","_configured","_pairs","_data","simple","makeSimpleConfigurator","Error","never","using","key","fn","maybeAsync","isThenable","then","invalidate","pairs","cacheFn","val","assertSimpleType","cb","released","_resolve","Promise","resolve"],"sources":["../../src/config/caching.ts"],"sourcesContent":["import gensync from \"gensync\";\nimport type { Handler } from \"gensync\";\nimport {\n maybeAsync,\n isAsync,\n onFirstPause,\n waitFor,\n isThenable,\n} from \"../gensync-utils/async.ts\";\nimport { isIterableIterator } from \"./util.ts\";\n\nexport type { CacheConfigurator };\n\nexport type SimpleCacheConfigurator = {\n (forever: boolean): void;\n (handler: () => T): T;\n\n forever: () => void;\n never: () => void;\n using: (handler: () => T) => T;\n invalidate: (handler: () => T) => T;\n};\n\nexport type CacheEntry = Array<{\n value: ResultT;\n valid: (channel: SideChannel) => Handler;\n}>;\n\nconst synchronize = (\n gen: (...args: ArgsT) => Handler,\n): ((...args: ArgsT) => ResultT) => {\n return gensync(gen).sync;\n};\n\n// eslint-disable-next-line require-yield\nfunction* genTrue() {\n return true;\n}\n\nexport function makeWeakCache(\n handler: (\n arg: ArgT,\n cache: CacheConfigurator,\n ) => Handler | ResultT,\n): (arg: ArgT, data: SideChannel) => Handler {\n return makeCachedFunction(WeakMap, handler);\n}\n\nexport function makeWeakCacheSync(\n handler: (arg: ArgT, cache?: CacheConfigurator) => ResultT,\n): (arg: ArgT, data?: SideChannel) => ResultT {\n return synchronize<[ArgT, SideChannel], ResultT>(\n makeWeakCache(handler),\n );\n}\n\nexport function makeStrongCache(\n handler: (\n arg: ArgT,\n cache: CacheConfigurator,\n ) => Handler | ResultT,\n): (arg: ArgT, data: SideChannel) => Handler {\n return makeCachedFunction(Map, handler);\n}\n\nexport function makeStrongCacheSync(\n handler: (arg: ArgT, cache?: CacheConfigurator) => ResultT,\n): (arg: ArgT, data?: SideChannel) => ResultT {\n return synchronize<[ArgT, SideChannel], ResultT>(\n makeStrongCache(handler),\n );\n}\n\n/* NOTE: Part of the logic explained in this comment is explained in the\n * getCachedValueOrWait and setupAsyncLocks functions.\n *\n * > There are only two hard things in Computer Science: cache invalidation and naming things.\n * > -- Phil Karlton\n *\n * I don't know if Phil was also thinking about handling a cache whose invalidation function is\n * defined asynchronously is considered, but it is REALLY hard to do correctly.\n *\n * The implemented logic (only when gensync is run asynchronously) is the following:\n * 1. If there is a valid cache associated to the current \"arg\" parameter,\n * a. RETURN the cached value\n * 3. If there is a FinishLock associated to the current \"arg\" parameter representing a valid cache,\n * a. Wait for that lock to be released\n * b. RETURN the value associated with that lock\n * 5. Start executing the function to be cached\n * a. If it pauses on a promise, then\n * i. Let FinishLock be a new lock\n * ii. Store FinishLock as associated to the current \"arg\" parameter\n * iii. Wait for the function to finish executing\n * iv. Release FinishLock\n * v. Send the function result to anyone waiting on FinishLock\n * 6. Store the result in the cache\n * 7. RETURN the result\n */\nfunction makeCachedFunction(\n CallCache: new () => CacheMap,\n handler: (\n arg: ArgT,\n cache: CacheConfigurator,\n ) => Handler | ResultT,\n): (arg: ArgT, data: SideChannel) => Handler {\n const callCacheSync = new CallCache();\n const callCacheAsync = new CallCache();\n const futureCache = new CallCache>();\n\n return function* cachedFunction(arg: ArgT, data: SideChannel) {\n const asyncContext = yield* isAsync();\n const callCache = asyncContext ? callCacheAsync : callCacheSync;\n\n const cached = yield* getCachedValueOrWait(\n asyncContext,\n callCache,\n futureCache,\n arg,\n data,\n );\n if (cached.valid) return cached.value;\n\n const cache = new CacheConfigurator(data);\n\n const handlerResult: Handler | ResultT = handler(arg, cache);\n\n let finishLock: Lock;\n let value: ResultT;\n\n if (isIterableIterator(handlerResult)) {\n value = yield* onFirstPause(handlerResult, () => {\n finishLock = setupAsyncLocks(cache, futureCache, arg);\n });\n } else {\n value = handlerResult;\n }\n\n updateFunctionCache(callCache, cache, arg, value);\n\n if (finishLock) {\n futureCache.delete(arg);\n finishLock.release(value);\n }\n\n return value;\n };\n}\n\ntype CacheMap =\n | Map>\n // @ts-expect-error todo(flow->ts): add `extends object` constraint to ArgT\n | WeakMap>;\n\nfunction* getCachedValue(\n cache: CacheMap,\n arg: ArgT,\n data: SideChannel,\n): Handler<{ valid: true; value: ResultT } | { valid: false; value: null }> {\n const cachedValue: CacheEntry | void = cache.get(arg);\n\n if (cachedValue) {\n for (const { value, valid } of cachedValue) {\n if (yield* valid(data)) return { valid: true, value };\n }\n }\n\n return { valid: false, value: null };\n}\n\nfunction* getCachedValueOrWait(\n asyncContext: boolean,\n callCache: CacheMap,\n futureCache: CacheMap, SideChannel>,\n arg: ArgT,\n data: SideChannel,\n): Handler<{ valid: true; value: ResultT } | { valid: false; value: null }> {\n const cached = yield* getCachedValue(callCache, arg, data);\n if (cached.valid) {\n return cached;\n }\n\n if (asyncContext) {\n const cached = yield* getCachedValue(futureCache, arg, data);\n if (cached.valid) {\n const value = yield* waitFor(cached.value.promise);\n return { valid: true, value };\n }\n }\n\n return { valid: false, value: null };\n}\n\nfunction setupAsyncLocks(\n config: CacheConfigurator,\n futureCache: CacheMap, SideChannel>,\n arg: ArgT,\n): Lock {\n const finishLock = new Lock();\n\n updateFunctionCache(futureCache, config, arg, finishLock);\n\n return finishLock;\n}\n\nfunction updateFunctionCache<\n ArgT,\n ResultT,\n SideChannel,\n Cache extends CacheMap,\n>(\n cache: Cache,\n config: CacheConfigurator,\n arg: ArgT,\n value: ResultT,\n) {\n if (!config.configured()) config.forever();\n\n let cachedValue: CacheEntry | void = cache.get(arg);\n\n config.deactivate();\n\n switch (config.mode()) {\n case \"forever\":\n cachedValue = [{ value, valid: genTrue }];\n cache.set(arg, cachedValue);\n break;\n case \"invalidate\":\n cachedValue = [{ value, valid: config.validator() }];\n cache.set(arg, cachedValue);\n break;\n case \"valid\":\n if (cachedValue) {\n cachedValue.push({ value, valid: config.validator() });\n } else {\n cachedValue = [{ value, valid: config.validator() }];\n cache.set(arg, cachedValue);\n }\n }\n}\n\nclass CacheConfigurator {\n _active: boolean = true;\n _never: boolean = false;\n _forever: boolean = false;\n _invalidate: boolean = false;\n\n _configured: boolean = false;\n\n _pairs: Array<\n [cachedValue: unknown, handler: (data: SideChannel) => Handler]\n > = [];\n\n _data: SideChannel;\n\n constructor(data: SideChannel) {\n this._data = data;\n }\n\n simple() {\n return makeSimpleConfigurator(this);\n }\n\n mode() {\n if (this._never) return \"never\";\n if (this._forever) return \"forever\";\n if (this._invalidate) return \"invalidate\";\n return \"valid\";\n }\n\n forever() {\n if (!this._active) {\n throw new Error(\"Cannot change caching after evaluation has completed.\");\n }\n if (this._never) {\n throw new Error(\"Caching has already been configured with .never()\");\n }\n this._forever = true;\n this._configured = true;\n }\n\n never() {\n if (!this._active) {\n throw new Error(\"Cannot change caching after evaluation has completed.\");\n }\n if (this._forever) {\n throw new Error(\"Caching has already been configured with .forever()\");\n }\n this._never = true;\n this._configured = true;\n }\n\n using(handler: (data: SideChannel) => T): T {\n if (!this._active) {\n throw new Error(\"Cannot change caching after evaluation has completed.\");\n }\n if (this._never || this._forever) {\n throw new Error(\n \"Caching has already been configured with .never or .forever()\",\n );\n }\n this._configured = true;\n\n const key = handler(this._data);\n\n const fn = maybeAsync(\n handler,\n `You appear to be using an async cache handler, but Babel has been called synchronously`,\n );\n\n if (isThenable(key)) {\n // @ts-expect-error todo(flow->ts): improve function return type annotation\n return key.then((key: unknown) => {\n this._pairs.push([key, fn]);\n return key;\n });\n }\n\n this._pairs.push([key, fn]);\n return key;\n }\n\n invalidate(handler: (data: SideChannel) => T): T {\n this._invalidate = true;\n return this.using(handler);\n }\n\n validator(): (data: SideChannel) => Handler {\n const pairs = this._pairs;\n return function* (data: SideChannel) {\n for (const [key, fn] of pairs) {\n if (key !== (yield* fn(data))) return false;\n }\n return true;\n };\n }\n\n deactivate() {\n this._active = false;\n }\n\n configured() {\n return this._configured;\n }\n}\n\nfunction makeSimpleConfigurator(\n cache: CacheConfigurator,\n): SimpleCacheConfigurator {\n function cacheFn(val: any) {\n if (typeof val === \"boolean\") {\n if (val) cache.forever();\n else cache.never();\n return;\n }\n\n return cache.using(() => assertSimpleType(val()));\n }\n cacheFn.forever = () => cache.forever();\n cacheFn.never = () => cache.never();\n cacheFn.using = (cb: { (): SimpleType }) =>\n cache.using(() => assertSimpleType(cb()));\n cacheFn.invalidate = (cb: { (): SimpleType }) =>\n cache.invalidate(() => assertSimpleType(cb()));\n\n return cacheFn as any;\n}\n\n// Types are limited here so that in the future these values can be used\n// as part of Babel's caching logic.\nexport type SimpleType =\n | string\n | boolean\n | number\n | null\n | void\n | Promise;\nexport function assertSimpleType(value: unknown): SimpleType {\n if (isThenable(value)) {\n throw new Error(\n `You appear to be using an async cache handler, ` +\n `which your current version of Babel does not support. ` +\n `We may add support for this in the future, ` +\n `but if you're on the most recent version of @babel/core and still ` +\n `seeing this error, then you'll need to synchronously handle your caching logic.`,\n );\n }\n\n if (\n value != null &&\n typeof value !== \"string\" &&\n typeof value !== \"boolean\" &&\n typeof value !== \"number\"\n ) {\n throw new Error(\n \"Cache keys must be either string, boolean, number, null, or undefined.\",\n );\n }\n // @ts-expect-error Type 'unknown' is not assignable to type 'SimpleType'. This can be removed\n // when strictNullCheck is enabled\n return value;\n}\n\nclass Lock {\n released: boolean = false;\n promise: Promise;\n _resolve: (value: T) => void;\n\n constructor() {\n this.promise = new Promise(resolve => {\n this._resolve = resolve;\n });\n }\n\n release(value: T) {\n this.released = true;\n this._resolve(value);\n }\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/config-chain.js b/node_modules/@babel/core/lib/config/config-chain.js index ab3ab47c23d7..59292a7ee441 100644 --- a/node_modules/@babel/core/lib/config/config-chain.js +++ b/node_modules/@babel/core/lib/config/config-chain.js @@ -20,15 +20,14 @@ function _debug() { }; return data; } -var _options = require("./validation/options"); -var _patternToRegex = require("./pattern-to-regex"); -var _printer = require("./printer"); -var _rewriteStackTrace = require("../errors/rewrite-stack-trace"); -var _configError = require("../errors/config-error"); -var _files = require("./files"); -var _caching = require("./caching"); -var _configDescriptors = require("./config-descriptors"); - +var _options = require("./validation/options.js"); +var _patternToRegex = require("./pattern-to-regex.js"); +var _printer = require("./printer.js"); +var _rewriteStackTrace = require("../errors/rewrite-stack-trace.js"); +var _configError = require("../errors/config-error.js"); +var _index = require("./files/index.js"); +var _caching = require("./caching.js"); +var _configDescriptors = require("./config-descriptors.js"); const debug = _debug()("babel:config:config-chain"); function* buildPresetChain(arg, context) { const chain = yield* buildPresetChainWalker(arg, context); @@ -40,14 +39,13 @@ function* buildPresetChain(arg, context) { files: new Set() }; } -const buildPresetChainWalker = makeChainWalker({ +const buildPresetChainWalker = exports.buildPresetChainWalker = makeChainWalker({ root: preset => loadPresetDescriptors(preset), env: (preset, envName) => loadPresetEnvDescriptors(preset)(envName), overrides: (preset, index) => loadPresetOverridesDescriptors(preset)(index), overridesEnv: (preset, index, envName) => loadPresetOverridesEnvDescriptors(preset)(index)(envName), createLogger: () => () => {} }); -exports.buildPresetChainWalker = buildPresetChainWalker; const loadPresetDescriptors = (0, _caching.makeWeakCacheSync)(preset => buildRootDescriptors(preset, preset.alias, _configDescriptors.createUncachedDescriptors)); const loadPresetEnvDescriptors = (0, _caching.makeWeakCacheSync)(preset => (0, _caching.makeStrongCacheSync)(envName => buildEnvDescriptors(preset, preset.alias, _configDescriptors.createUncachedDescriptors, envName))); const loadPresetOverridesDescriptors = (0, _caching.makeWeakCacheSync)(preset => (0, _caching.makeStrongCacheSync)(index => buildOverrideDescriptors(preset, preset.alias, _configDescriptors.createUncachedDescriptors, index))); @@ -63,9 +61,9 @@ function* buildRootChain(opts, context) { const programmaticReport = yield* programmaticLogger.output(); let configFile; if (typeof opts.configFile === "string") { - configFile = yield* (0, _files.loadConfig)(opts.configFile, context.cwd, context.envName, context.caller); + configFile = yield* (0, _index.loadConfig)(opts.configFile, context.cwd, context.envName, context.caller); } else if (opts.configFile !== false) { - configFile = yield* (0, _files.findRootConfig)(context.root, context.envName, context.caller); + configFile = yield* (0, _index.findRootConfig)(context.root, context.envName, context.caller); } let { babelrc, @@ -79,7 +77,6 @@ function* buildRootChain(opts, context) { const result = yield* loadFileChain(validatedFile, context, undefined, configFileLogger); if (!result) return null; configReport = yield* configFileLogger.output(); - if (babelrc === undefined) { babelrc = validatedFile.options.babelrc; } @@ -93,12 +90,12 @@ function* buildRootChain(opts, context) { let isIgnored = false; const fileChain = emptyChain(); if ((babelrc === true || babelrc === undefined) && typeof context.filename === "string") { - const pkgData = yield* (0, _files.findPackageData)(context.filename); + const pkgData = yield* (0, _index.findPackageData)(context.filename); if (pkgData && babelrcLoadEnabled(context, pkgData, babelrcRoots, babelrcRootsDirectory)) { ({ ignore: ignoreFile, config: babelrcFile - } = yield* (0, _files.findRelativeConfig)(pkgData, context.envName, context.caller)); + } = yield* (0, _index.findRelativeConfig)(pkgData, context.envName, context.caller)); if (ignoreFile) { fileChain.files.add(ignoreFile.filepath); } @@ -122,8 +119,7 @@ function* buildRootChain(opts, context) { } } if (context.showConfig) { - console.log(`Babel configs on "${context.filename}" (ascending priority):\n` + - [configReport, babelRcReport, programmaticReport].filter(x => !!x).join("\n\n") + "\n-----End Babel configs-----"); + console.log(`Babel configs on "${context.filename}" (ascending priority):\n` + [configReport, babelRcReport, programmaticReport].filter(x => !!x).join("\n\n") + "\n-----End Babel configs-----"); } const chain = mergeChain(mergeChain(mergeChain(emptyChain(), configFileChain), fileChain), programmaticChain); return { @@ -140,7 +136,6 @@ function* buildRootChain(opts, context) { function babelrcLoadEnabled(context, pkgData, babelrcRoots, babelrcRootsDirectory) { if (typeof babelrcRoots === "boolean") return babelrcRoots; const absoluteRoot = context.root; - if (babelrcRoots === undefined) { return pkgData.directories.indexOf(absoluteRoot) !== -1; } @@ -151,7 +146,6 @@ function babelrcLoadEnabled(context, pkgData, babelrcRoots, babelrcRootsDirector babelrcPatterns = babelrcPatterns.map(pat => { return typeof pat === "string" ? _path().resolve(babelrcRootsDirectory, pat) : pat; }); - if (babelrcPatterns.length === 1 && babelrcPatterns[0] === absoluteRoot) { return pkgData.directories.indexOf(absoluteRoot) !== -1; } @@ -179,7 +173,6 @@ const validateExtendFile = (0, _caching.makeWeakCacheSync)(file => ({ dirname: file.dirname, options: (0, _options.validate)("extendsfile", file.options, file.filepath) })); - const loadProgrammaticChain = makeChainWalker({ root: input => buildRootDescriptors(input, "base", _configDescriptors.createCachedDescriptors), env: (input, envName) => buildEnvDescriptors(input, "base", _configDescriptors.createCachedDescriptors, envName), @@ -187,7 +180,6 @@ const loadProgrammaticChain = makeChainWalker({ overridesEnv: (input, index, envName) => buildOverrideEnvDescriptors(input, "base", _configDescriptors.createCachedDescriptors, index, envName), createLogger: (input, context, baseLogger) => buildProgrammaticLogger(input, context, baseLogger) }); - const loadFileChainWalker = makeChainWalker({ root: file => loadFileDescriptors(file), env: (file, envName) => loadFileEnvDescriptors(file)(envName), @@ -197,9 +189,7 @@ const loadFileChainWalker = makeChainWalker({ }); function* loadFileChain(input, context, files, baseLogger) { const chain = yield* loadFileChainWalker(input, context, files, baseLogger); - if (chain) { - chain.files.add(input.filepath); - } + chain == null || chain.files.add(input.filepath); return chain; } const loadFileDescriptors = (0, _caching.makeWeakCacheSync)(file => buildRootDescriptors(file, file.filepath, _configDescriptors.createUncachedDescriptors)); @@ -233,14 +223,16 @@ function buildEnvDescriptors({ dirname, options }, alias, descriptors, envName) { - const opts = options.env && options.env[envName]; + var _options$env; + const opts = (_options$env = options.env) == null ? void 0 : _options$env[envName]; return opts ? descriptors(dirname, opts, `${alias}.env["${envName}"]`) : null; } function buildOverrideDescriptors({ dirname, options }, alias, descriptors, index) { - const opts = options.overrides && options.overrides[index]; + var _options$overrides; + const opts = (_options$overrides = options.overrides) == null ? void 0 : _options$overrides[index]; if (!opts) throw new Error("Assertion failure - missing override"); return descriptors(dirname, opts, `${alias}.overrides[${index}]`); } @@ -248,9 +240,10 @@ function buildOverrideEnvDescriptors({ dirname, options }, alias, descriptors, index, envName) { - const override = options.overrides && options.overrides[index]; + var _options$overrides2, _override$env; + const override = (_options$overrides2 = options.overrides) == null ? void 0 : _options$overrides2[index]; if (!override) throw new Error("Assertion failure - missing override"); - const opts = override.env && override.env[envName]; + const opts = (_override$env = override.env) == null ? void 0 : _override$env[envName]; return opts ? descriptors(dirname, opts, `${alias}.overrides[${index}].env["${envName}"]`) : null; } function makeChainWalker({ @@ -299,7 +292,6 @@ function makeChainWalker({ } }); } - if (flattenedConfigs.some(({ config: { options: { @@ -328,7 +320,7 @@ function makeChainWalker({ } function* mergeExtendsChain(chain, opts, dirname, context, files, baseLogger) { if (opts.extends === undefined) return true; - const file = yield* (0, _files.loadConfig)(opts.extends, dirname, context.envName, context.caller); + const file = yield* (0, _index.loadConfig)(opts.extends, dirname, context.envName, context.caller); if (files.has(file)) { throw new Error(`Configuration cycle detected loading ${file.filepath}.\n` + `File already loaded following the config chain:\n` + Array.from(files, file => ` - ${file.filepath}`).join("\n")); } @@ -379,7 +371,6 @@ function normalizeOptions(opts) { delete options.test; delete options.include; delete options.exclude; - if (Object.prototype.hasOwnProperty.call(options, "sourceMap")) { options.sourceMaps = options.sourceMap; delete options.sourceMap; @@ -403,7 +394,6 @@ function dedupDescriptors(items) { value: item }; descriptors.push(desc); - if (!item.ownPass) nameMap.set(item.name, desc); } else { desc.value = item; @@ -428,14 +418,12 @@ function configFieldIsApplicable(context, test, dirname, configName) { const patterns = Array.isArray(test) ? test : [test]; return matchesPatterns(context, patterns, dirname, configName); } - function ignoreListReplacer(_key, value) { if (value instanceof RegExp) { return String(value); } return value; } - function shouldIgnore(context, ignore, only, dirname) { if (ignore && matchesPatterns(context, ignore, dirname)) { var _context$filename; @@ -457,7 +445,6 @@ function shouldIgnore(context, ignore, only, dirname) { } return false; } - function matchesPatterns(context, patterns, dirname, configName) { return patterns.some(pattern => matchPattern(pattern, dirname, context.filename, context, configName)); } diff --git a/node_modules/@babel/core/lib/config/config-chain.js.map b/node_modules/@babel/core/lib/config/config-chain.js.map index 52a17cf291c6..42951ff8e708 100644 --- a/node_modules/@babel/core/lib/config/config-chain.js.map +++ b/node_modules/@babel/core/lib/config/config-chain.js.map @@ -1 +1 @@ -{"version":3,"names":["debug","buildDebug","buildPresetChain","arg","context","chain","buildPresetChainWalker","plugins","dedupDescriptors","presets","options","map","o","normalizeOptions","files","Set","makeChainWalker","root","preset","loadPresetDescriptors","env","envName","loadPresetEnvDescriptors","overrides","index","loadPresetOverridesDescriptors","overridesEnv","loadPresetOverridesEnvDescriptors","createLogger","makeWeakCacheSync","buildRootDescriptors","alias","createUncachedDescriptors","makeStrongCacheSync","buildEnvDescriptors","buildOverrideDescriptors","buildOverrideEnvDescriptors","buildRootChain","opts","configReport","babelRcReport","programmaticLogger","ConfigPrinter","programmaticChain","loadProgrammaticChain","dirname","cwd","undefined","programmaticReport","output","configFile","loadConfig","caller","findRootConfig","babelrc","babelrcRoots","babelrcRootsDirectory","configFileChain","emptyChain","configFileLogger","validatedFile","validateConfigFile","result","loadFileChain","mergeChain","ignoreFile","babelrcFile","isIgnored","fileChain","filename","pkgData","findPackageData","babelrcLoadEnabled","ignore","config","findRelativeConfig","add","filepath","shouldIgnore","validateBabelrcFile","babelrcLogger","showConfig","console","log","filter","x","join","fileHandling","absoluteRoot","directories","indexOf","babelrcPatterns","Array","isArray","pat","path","resolve","length","some","pathPatternToRegex","directory","matchPattern","file","validate","validateExtendFile","input","createCachedDescriptors","baseLogger","buildProgrammaticLogger","loadFileChainWalker","loadFileDescriptors","loadFileEnvDescriptors","loadFileOverridesDescriptors","loadFileOverridesEnvDescriptors","buildFileLogger","configure","ChainFormatter","Config","descriptors","_","Programmatic","callerName","name","Error","override","chainWalker","flattenedConfigs","rootOpts","configIsApplicable","push","envOpts","forEach","overrideOps","overrideEnvOpts","only","logger","mergeExtendsChain","mergeChainOpts","extends","has","from","delete","target","source","passPerPreset","test","include","exclude","Object","prototype","hasOwnProperty","call","sourceMaps","sourceMap","items","Map","item","value","fnKey","nameMap","get","set","desc","ownPass","reduce","acc","configName","configFieldIsApplicable","patterns","matchesPatterns","ignoreListReplacer","_key","RegExp","String","message","JSON","stringify","pattern","pathToTest","endHiddenCallStack","ConfigError"],"sources":["../../src/config/config-chain.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\n\nimport path from \"path\";\nimport buildDebug from \"debug\";\nimport type { Handler } from \"gensync\";\nimport { validate } from \"./validation/options\";\nimport type {\n ValidatedOptions,\n IgnoreList,\n ConfigApplicableTest,\n BabelrcSearch,\n CallerMetadata,\n IgnoreItem,\n} from \"./validation/options\";\nimport pathPatternToRegex from \"./pattern-to-regex\";\nimport { ConfigPrinter, ChainFormatter } from \"./printer\";\nimport type { ReadonlyDeepArray } from \"./helpers/deep-array\";\n\nimport { endHiddenCallStack } from \"../errors/rewrite-stack-trace\";\nimport ConfigError from \"../errors/config-error\";\n\nconst debug = buildDebug(\"babel:config:config-chain\");\n\nimport {\n findPackageData,\n findRelativeConfig,\n findRootConfig,\n loadConfig,\n} from \"./files\";\nimport type { ConfigFile, IgnoreFile, FilePackageData } from \"./files\";\n\nimport { makeWeakCacheSync, makeStrongCacheSync } from \"./caching\";\n\nimport {\n createCachedDescriptors,\n createUncachedDescriptors,\n} from \"./config-descriptors\";\nimport type {\n UnloadedDescriptor,\n OptionsAndDescriptors,\n ValidatedFile,\n} from \"./config-descriptors\";\n\nexport type ConfigChain = {\n plugins: Array;\n presets: Array;\n options: Array;\n files: Set;\n};\n\nexport type PresetInstance = {\n options: ValidatedOptions;\n alias: string;\n dirname: string;\n externalDependencies: ReadonlyDeepArray;\n};\n\nexport type ConfigContext = {\n filename: string | undefined;\n cwd: string;\n root: string;\n envName: string;\n caller: CallerMetadata | undefined;\n showConfig: boolean;\n};\n\n/**\n * Build a config chain for a given preset.\n */\nexport function* buildPresetChain(\n arg: PresetInstance,\n context: any,\n): Handler {\n const chain = yield* buildPresetChainWalker(arg, context);\n if (!chain) return null;\n\n return {\n plugins: dedupDescriptors(chain.plugins),\n presets: dedupDescriptors(chain.presets),\n options: chain.options.map(o => normalizeOptions(o)),\n files: new Set(),\n };\n}\n\nexport const buildPresetChainWalker = makeChainWalker({\n root: preset => loadPresetDescriptors(preset),\n env: (preset, envName) => loadPresetEnvDescriptors(preset)(envName),\n overrides: (preset, index) => loadPresetOverridesDescriptors(preset)(index),\n overridesEnv: (preset, index, envName) =>\n loadPresetOverridesEnvDescriptors(preset)(index)(envName),\n createLogger: () => () => {}, // Currently we don't support logging how preset is expanded\n});\nconst loadPresetDescriptors = makeWeakCacheSync((preset: PresetInstance) =>\n buildRootDescriptors(preset, preset.alias, createUncachedDescriptors),\n);\nconst loadPresetEnvDescriptors = makeWeakCacheSync((preset: PresetInstance) =>\n makeStrongCacheSync((envName: string) =>\n buildEnvDescriptors(\n preset,\n preset.alias,\n createUncachedDescriptors,\n envName,\n ),\n ),\n);\nconst loadPresetOverridesDescriptors = makeWeakCacheSync(\n (preset: PresetInstance) =>\n makeStrongCacheSync((index: number) =>\n buildOverrideDescriptors(\n preset,\n preset.alias,\n createUncachedDescriptors,\n index,\n ),\n ),\n);\nconst loadPresetOverridesEnvDescriptors = makeWeakCacheSync(\n (preset: PresetInstance) =>\n makeStrongCacheSync((index: number) =>\n makeStrongCacheSync((envName: string) =>\n buildOverrideEnvDescriptors(\n preset,\n preset.alias,\n createUncachedDescriptors,\n index,\n envName,\n ),\n ),\n ),\n);\n\nexport type FileHandling = \"transpile\" | \"ignored\" | \"unsupported\";\nexport type RootConfigChain = ConfigChain & {\n babelrc: ConfigFile | void;\n config: ConfigFile | void;\n ignore: IgnoreFile | void;\n fileHandling: FileHandling;\n files: Set;\n};\n\n/**\n * Build a config chain for Babel's full root configuration.\n */\nexport function* buildRootChain(\n opts: ValidatedOptions,\n context: ConfigContext,\n): Handler {\n let configReport, babelRcReport;\n const programmaticLogger = new ConfigPrinter();\n const programmaticChain = yield* loadProgrammaticChain(\n {\n options: opts,\n dirname: context.cwd,\n },\n context,\n undefined,\n programmaticLogger,\n );\n if (!programmaticChain) return null;\n const programmaticReport = yield* programmaticLogger.output();\n\n let configFile;\n if (typeof opts.configFile === \"string\") {\n configFile = yield* loadConfig(\n opts.configFile,\n context.cwd,\n context.envName,\n context.caller,\n );\n } else if (opts.configFile !== false) {\n configFile = yield* findRootConfig(\n context.root,\n context.envName,\n context.caller,\n );\n }\n\n let { babelrc, babelrcRoots } = opts;\n let babelrcRootsDirectory = context.cwd;\n\n const configFileChain = emptyChain();\n const configFileLogger = new ConfigPrinter();\n if (configFile) {\n const validatedFile = validateConfigFile(configFile);\n const result = yield* loadFileChain(\n validatedFile,\n context,\n undefined,\n configFileLogger,\n );\n if (!result) return null;\n configReport = yield* configFileLogger.output();\n\n // Allow config files to toggle `.babelrc` resolution on and off and\n // specify where the roots are.\n if (babelrc === undefined) {\n babelrc = validatedFile.options.babelrc;\n }\n if (babelrcRoots === undefined) {\n babelrcRootsDirectory = validatedFile.dirname;\n babelrcRoots = validatedFile.options.babelrcRoots;\n }\n\n mergeChain(configFileChain, result);\n }\n\n let ignoreFile, babelrcFile;\n let isIgnored = false;\n const fileChain = emptyChain();\n // resolve all .babelrc files\n if (\n (babelrc === true || babelrc === undefined) &&\n typeof context.filename === \"string\"\n ) {\n const pkgData = yield* findPackageData(context.filename);\n\n if (\n pkgData &&\n babelrcLoadEnabled(context, pkgData, babelrcRoots, babelrcRootsDirectory)\n ) {\n ({ ignore: ignoreFile, config: babelrcFile } = yield* findRelativeConfig(\n pkgData,\n context.envName,\n context.caller,\n ));\n\n if (ignoreFile) {\n fileChain.files.add(ignoreFile.filepath);\n }\n\n if (\n ignoreFile &&\n shouldIgnore(context, ignoreFile.ignore, null, ignoreFile.dirname)\n ) {\n isIgnored = true;\n }\n\n if (babelrcFile && !isIgnored) {\n const validatedFile = validateBabelrcFile(babelrcFile);\n const babelrcLogger = new ConfigPrinter();\n const result = yield* loadFileChain(\n validatedFile,\n context,\n undefined,\n babelrcLogger,\n );\n if (!result) {\n isIgnored = true;\n } else {\n babelRcReport = yield* babelrcLogger.output();\n mergeChain(fileChain, result);\n }\n }\n\n if (babelrcFile && isIgnored) {\n fileChain.files.add(babelrcFile.filepath);\n }\n }\n }\n\n if (context.showConfig) {\n console.log(\n `Babel configs on \"${context.filename}\" (ascending priority):\\n` +\n // print config by the order of ascending priority\n [configReport, babelRcReport, programmaticReport]\n .filter(x => !!x)\n .join(\"\\n\\n\") +\n \"\\n-----End Babel configs-----\",\n );\n }\n // Insert file chain in front so programmatic options have priority\n // over configuration file chain items.\n const chain = mergeChain(\n mergeChain(mergeChain(emptyChain(), configFileChain), fileChain),\n programmaticChain,\n );\n\n return {\n plugins: isIgnored ? [] : dedupDescriptors(chain.plugins),\n presets: isIgnored ? [] : dedupDescriptors(chain.presets),\n options: isIgnored ? [] : chain.options.map(o => normalizeOptions(o)),\n fileHandling: isIgnored ? \"ignored\" : \"transpile\",\n ignore: ignoreFile || undefined,\n babelrc: babelrcFile || undefined,\n config: configFile || undefined,\n files: chain.files,\n };\n}\n\nfunction babelrcLoadEnabled(\n context: ConfigContext,\n pkgData: FilePackageData,\n babelrcRoots: BabelrcSearch | undefined,\n babelrcRootsDirectory: string,\n): boolean {\n if (typeof babelrcRoots === \"boolean\") return babelrcRoots;\n\n const absoluteRoot = context.root;\n\n // Fast path to avoid having to match patterns if the babelrc is just\n // loading in the standard root directory.\n if (babelrcRoots === undefined) {\n return pkgData.directories.indexOf(absoluteRoot) !== -1;\n }\n\n let babelrcPatterns = babelrcRoots;\n if (!Array.isArray(babelrcPatterns)) {\n babelrcPatterns = [babelrcPatterns as IgnoreItem];\n }\n babelrcPatterns = babelrcPatterns.map(pat => {\n return typeof pat === \"string\"\n ? path.resolve(babelrcRootsDirectory, pat)\n : pat;\n });\n\n // Fast path to avoid having to match patterns if the babelrc is just\n // loading in the standard root directory.\n if (babelrcPatterns.length === 1 && babelrcPatterns[0] === absoluteRoot) {\n return pkgData.directories.indexOf(absoluteRoot) !== -1;\n }\n\n return babelrcPatterns.some(pat => {\n if (typeof pat === \"string\") {\n pat = pathPatternToRegex(pat, babelrcRootsDirectory);\n }\n\n return pkgData.directories.some(directory => {\n return matchPattern(pat, babelrcRootsDirectory, directory, context);\n });\n });\n}\n\nconst validateConfigFile = makeWeakCacheSync(\n (file: ConfigFile): ValidatedFile => ({\n filepath: file.filepath,\n dirname: file.dirname,\n options: validate(\"configfile\", file.options, file.filepath),\n }),\n);\n\nconst validateBabelrcFile = makeWeakCacheSync(\n (file: ConfigFile): ValidatedFile => ({\n filepath: file.filepath,\n dirname: file.dirname,\n options: validate(\"babelrcfile\", file.options, file.filepath),\n }),\n);\n\nconst validateExtendFile = makeWeakCacheSync(\n (file: ConfigFile): ValidatedFile => ({\n filepath: file.filepath,\n dirname: file.dirname,\n options: validate(\"extendsfile\", file.options, file.filepath),\n }),\n);\n\n/**\n * Build a config chain for just the programmatic options passed into Babel.\n */\nconst loadProgrammaticChain = makeChainWalker({\n root: input => buildRootDescriptors(input, \"base\", createCachedDescriptors),\n env: (input, envName) =>\n buildEnvDescriptors(input, \"base\", createCachedDescriptors, envName),\n overrides: (input, index) =>\n buildOverrideDescriptors(input, \"base\", createCachedDescriptors, index),\n overridesEnv: (input, index, envName) =>\n buildOverrideEnvDescriptors(\n input,\n \"base\",\n createCachedDescriptors,\n index,\n envName,\n ),\n createLogger: (input, context, baseLogger) =>\n buildProgrammaticLogger(input, context, baseLogger),\n});\n\n/**\n * Build a config chain for a given file.\n */\nconst loadFileChainWalker = makeChainWalker({\n root: file => loadFileDescriptors(file),\n env: (file, envName) => loadFileEnvDescriptors(file)(envName),\n overrides: (file, index) => loadFileOverridesDescriptors(file)(index),\n overridesEnv: (file, index, envName) =>\n loadFileOverridesEnvDescriptors(file)(index)(envName),\n createLogger: (file, context, baseLogger) =>\n buildFileLogger(file.filepath, context, baseLogger),\n});\n\nfunction* loadFileChain(\n input: ValidatedFile,\n context: ConfigContext,\n files: Set,\n baseLogger: ConfigPrinter,\n) {\n const chain = yield* loadFileChainWalker(input, context, files, baseLogger);\n if (chain) {\n chain.files.add(input.filepath);\n }\n\n return chain;\n}\n\nconst loadFileDescriptors = makeWeakCacheSync((file: ValidatedFile) =>\n buildRootDescriptors(file, file.filepath, createUncachedDescriptors),\n);\nconst loadFileEnvDescriptors = makeWeakCacheSync((file: ValidatedFile) =>\n makeStrongCacheSync((envName: string) =>\n buildEnvDescriptors(\n file,\n file.filepath,\n createUncachedDescriptors,\n envName,\n ),\n ),\n);\nconst loadFileOverridesDescriptors = makeWeakCacheSync((file: ValidatedFile) =>\n makeStrongCacheSync((index: number) =>\n buildOverrideDescriptors(\n file,\n file.filepath,\n createUncachedDescriptors,\n index,\n ),\n ),\n);\nconst loadFileOverridesEnvDescriptors = makeWeakCacheSync(\n (file: ValidatedFile) =>\n makeStrongCacheSync((index: number) =>\n makeStrongCacheSync((envName: string) =>\n buildOverrideEnvDescriptors(\n file,\n file.filepath,\n createUncachedDescriptors,\n index,\n envName,\n ),\n ),\n ),\n);\n\nfunction buildFileLogger(\n filepath: string,\n context: ConfigContext,\n baseLogger: ConfigPrinter | void,\n) {\n if (!baseLogger) {\n return () => {};\n }\n return baseLogger.configure(context.showConfig, ChainFormatter.Config, {\n filepath,\n });\n}\n\nfunction buildRootDescriptors(\n { dirname, options }: Partial,\n alias: string,\n descriptors: (\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n ) => OptionsAndDescriptors,\n) {\n return descriptors(dirname, options, alias);\n}\n\nfunction buildProgrammaticLogger(\n _: unknown,\n context: ConfigContext,\n baseLogger: ConfigPrinter | void,\n) {\n if (!baseLogger) {\n return () => {};\n }\n return baseLogger.configure(context.showConfig, ChainFormatter.Programmatic, {\n callerName: context.caller?.name,\n });\n}\n\nfunction buildEnvDescriptors(\n { dirname, options }: Partial,\n alias: string,\n descriptors: (\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n ) => OptionsAndDescriptors,\n envName: string,\n) {\n const opts = options.env && options.env[envName];\n return opts ? descriptors(dirname, opts, `${alias}.env[\"${envName}\"]`) : null;\n}\n\nfunction buildOverrideDescriptors(\n { dirname, options }: Partial,\n alias: string,\n descriptors: (\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n ) => OptionsAndDescriptors,\n index: number,\n) {\n const opts = options.overrides && options.overrides[index];\n if (!opts) throw new Error(\"Assertion failure - missing override\");\n\n return descriptors(dirname, opts, `${alias}.overrides[${index}]`);\n}\n\nfunction buildOverrideEnvDescriptors(\n { dirname, options }: Partial,\n alias: string,\n descriptors: (\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n ) => OptionsAndDescriptors,\n index: number,\n envName: string,\n) {\n const override = options.overrides && options.overrides[index];\n if (!override) throw new Error(\"Assertion failure - missing override\");\n\n const opts = override.env && override.env[envName];\n return opts\n ? descriptors(\n dirname,\n opts,\n `${alias}.overrides[${index}].env[\"${envName}\"]`,\n )\n : null;\n}\n\nfunction makeChainWalker<\n ArgT extends {\n options: ValidatedOptions;\n dirname: string;\n filepath?: string;\n },\n>({\n root,\n env,\n overrides,\n overridesEnv,\n createLogger,\n}: {\n root: (configEntry: ArgT) => OptionsAndDescriptors;\n env: (configEntry: ArgT, env: string) => OptionsAndDescriptors | null;\n overrides: (configEntry: ArgT, index: number) => OptionsAndDescriptors;\n overridesEnv: (\n configEntry: ArgT,\n index: number,\n env: string,\n ) => OptionsAndDescriptors | null;\n createLogger: (\n configEntry: ArgT,\n context: ConfigContext,\n printer: ConfigPrinter | void,\n ) => (\n opts: OptionsAndDescriptors,\n index?: number | null,\n env?: string | null,\n ) => void;\n}): (\n configEntry: ArgT,\n context: ConfigContext,\n files?: Set,\n baseLogger?: ConfigPrinter,\n) => Handler {\n return function* chainWalker(input, context, files = new Set(), baseLogger) {\n const { dirname } = input;\n\n const flattenedConfigs: Array<{\n config: OptionsAndDescriptors;\n index: number | undefined | null;\n envName: string | undefined | null;\n }> = [];\n\n const rootOpts = root(input);\n if (configIsApplicable(rootOpts, dirname, context, input.filepath)) {\n flattenedConfigs.push({\n config: rootOpts,\n envName: undefined,\n index: undefined,\n });\n\n const envOpts = env(input, context.envName);\n if (\n envOpts &&\n configIsApplicable(envOpts, dirname, context, input.filepath)\n ) {\n flattenedConfigs.push({\n config: envOpts,\n envName: context.envName,\n index: undefined,\n });\n }\n\n (rootOpts.options.overrides || []).forEach((_, index) => {\n const overrideOps = overrides(input, index);\n if (configIsApplicable(overrideOps, dirname, context, input.filepath)) {\n flattenedConfigs.push({\n config: overrideOps,\n index,\n envName: undefined,\n });\n\n const overrideEnvOpts = overridesEnv(input, index, context.envName);\n if (\n overrideEnvOpts &&\n configIsApplicable(\n overrideEnvOpts,\n dirname,\n context,\n input.filepath,\n )\n ) {\n flattenedConfigs.push({\n config: overrideEnvOpts,\n index,\n envName: context.envName,\n });\n }\n }\n });\n }\n\n // Process 'ignore' and 'only' before 'extends' items are processed so\n // that we don't do extra work loading extended configs if a file is\n // ignored.\n if (\n flattenedConfigs.some(\n ({\n config: {\n options: { ignore, only },\n },\n }) => shouldIgnore(context, ignore, only, dirname),\n )\n ) {\n return null;\n }\n\n const chain = emptyChain();\n const logger = createLogger(input, context, baseLogger);\n\n for (const { config, index, envName } of flattenedConfigs) {\n if (\n !(yield* mergeExtendsChain(\n chain,\n config.options,\n dirname,\n context,\n files,\n baseLogger,\n ))\n ) {\n return null;\n }\n\n logger(config, index, envName);\n yield* mergeChainOpts(chain, config);\n }\n return chain;\n };\n}\n\nfunction* mergeExtendsChain(\n chain: ConfigChain,\n opts: ValidatedOptions,\n dirname: string,\n context: ConfigContext,\n files: Set,\n baseLogger?: ConfigPrinter,\n): Handler {\n if (opts.extends === undefined) return true;\n\n const file = yield* loadConfig(\n opts.extends,\n dirname,\n context.envName,\n context.caller,\n );\n\n if (files.has(file)) {\n throw new Error(\n `Configuration cycle detected loading ${file.filepath}.\\n` +\n `File already loaded following the config chain:\\n` +\n Array.from(files, file => ` - ${file.filepath}`).join(\"\\n\"),\n );\n }\n\n files.add(file);\n const fileChain = yield* loadFileChain(\n validateExtendFile(file),\n context,\n files,\n baseLogger,\n );\n files.delete(file);\n\n if (!fileChain) return false;\n\n mergeChain(chain, fileChain);\n\n return true;\n}\n\nfunction mergeChain(target: ConfigChain, source: ConfigChain): ConfigChain {\n target.options.push(...source.options);\n target.plugins.push(...source.plugins);\n target.presets.push(...source.presets);\n for (const file of source.files) {\n target.files.add(file);\n }\n\n return target;\n}\n\nfunction* mergeChainOpts(\n target: ConfigChain,\n { options, plugins, presets }: OptionsAndDescriptors,\n): Handler {\n target.options.push(options);\n target.plugins.push(...(yield* plugins()));\n target.presets.push(...(yield* presets()));\n\n return target;\n}\n\nfunction emptyChain(): ConfigChain {\n return {\n options: [],\n presets: [],\n plugins: [],\n files: new Set(),\n };\n}\n\nfunction normalizeOptions(opts: ValidatedOptions): ValidatedOptions {\n const options = {\n ...opts,\n };\n delete options.extends;\n delete options.env;\n delete options.overrides;\n delete options.plugins;\n delete options.presets;\n delete options.passPerPreset;\n delete options.ignore;\n delete options.only;\n delete options.test;\n delete options.include;\n delete options.exclude;\n\n // \"sourceMap\" is just aliased to sourceMap, so copy it over as\n // we merge the options together.\n if (Object.prototype.hasOwnProperty.call(options, \"sourceMap\")) {\n options.sourceMaps = options.sourceMap;\n delete options.sourceMap;\n }\n return options;\n}\n\nfunction dedupDescriptors(\n items: Array,\n): Array {\n const map: Map<\n Function,\n Map\n > = new Map();\n\n const descriptors = [];\n\n for (const item of items) {\n if (typeof item.value === \"function\") {\n const fnKey = item.value;\n let nameMap = map.get(fnKey);\n if (!nameMap) {\n nameMap = new Map();\n map.set(fnKey, nameMap);\n }\n let desc = nameMap.get(item.name);\n if (!desc) {\n desc = { value: item };\n descriptors.push(desc);\n\n // Treat passPerPreset presets as unique, skipping them\n // in the merge processing steps.\n if (!item.ownPass) nameMap.set(item.name, desc);\n } else {\n desc.value = item;\n }\n } else {\n descriptors.push({ value: item });\n }\n }\n\n return descriptors.reduce((acc, desc) => {\n acc.push(desc.value);\n return acc;\n }, []);\n}\n\nfunction configIsApplicable(\n { options }: OptionsAndDescriptors,\n dirname: string,\n context: ConfigContext,\n configName: string,\n): boolean {\n return (\n (options.test === undefined ||\n configFieldIsApplicable(context, options.test, dirname, configName)) &&\n (options.include === undefined ||\n configFieldIsApplicable(context, options.include, dirname, configName)) &&\n (options.exclude === undefined ||\n !configFieldIsApplicable(context, options.exclude, dirname, configName))\n );\n}\n\nfunction configFieldIsApplicable(\n context: ConfigContext,\n test: ConfigApplicableTest,\n dirname: string,\n configName: string,\n): boolean {\n const patterns = Array.isArray(test) ? test : [test];\n\n return matchesPatterns(context, patterns, dirname, configName);\n}\n\n/**\n * Print the ignoreList-values in a more helpful way than the default.\n */\nfunction ignoreListReplacer(\n _key: string,\n value: IgnoreList | IgnoreItem,\n): IgnoreList | IgnoreItem | string {\n if (value instanceof RegExp) {\n return String(value);\n }\n\n return value;\n}\n\n/**\n * Tests if a filename should be ignored based on \"ignore\" and \"only\" options.\n */\nfunction shouldIgnore(\n context: ConfigContext,\n ignore: IgnoreList | undefined | null,\n only: IgnoreList | undefined | null,\n dirname: string,\n): boolean {\n if (ignore && matchesPatterns(context, ignore, dirname)) {\n const message = `No config is applied to \"${\n context.filename ?? \"(unknown)\"\n }\" because it matches one of \\`ignore: ${JSON.stringify(\n ignore,\n ignoreListReplacer,\n )}\\` from \"${dirname}\"`;\n debug(message);\n if (context.showConfig) {\n console.log(message);\n }\n return true;\n }\n\n if (only && !matchesPatterns(context, only, dirname)) {\n const message = `No config is applied to \"${\n context.filename ?? \"(unknown)\"\n }\" because it fails to match one of \\`only: ${JSON.stringify(\n only,\n ignoreListReplacer,\n )}\\` from \"${dirname}\"`;\n debug(message);\n if (context.showConfig) {\n console.log(message);\n }\n return true;\n }\n\n return false;\n}\n\n/**\n * Returns result of calling function with filename if pattern is a function.\n * Otherwise returns result of matching pattern Regex with filename.\n */\nfunction matchesPatterns(\n context: ConfigContext,\n patterns: IgnoreList,\n dirname: string,\n configName?: string,\n): boolean {\n return patterns.some(pattern =>\n matchPattern(pattern, dirname, context.filename, context, configName),\n );\n}\n\nfunction matchPattern(\n pattern: IgnoreItem,\n dirname: string,\n pathToTest: string | undefined,\n context: ConfigContext,\n configName?: string,\n): boolean {\n if (typeof pattern === \"function\") {\n return !!endHiddenCallStack(pattern)(pathToTest, {\n dirname,\n envName: context.envName,\n caller: context.caller,\n });\n }\n\n if (typeof pathToTest !== \"string\") {\n throw new ConfigError(\n `Configuration contains string/RegExp pattern, but no filename was passed to Babel`,\n configName,\n );\n }\n\n if (typeof pattern === \"string\") {\n pattern = pathPatternToRegex(pattern, dirname);\n }\n return pattern.test(pathToTest);\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_path","data","require","_debug","_options","_patternToRegex","_printer","_rewriteStackTrace","_configError","_index","_caching","_configDescriptors","debug","buildDebug","buildPresetChain","arg","context","chain","buildPresetChainWalker","plugins","dedupDescriptors","presets","options","map","o","normalizeOptions","files","Set","exports","makeChainWalker","root","preset","loadPresetDescriptors","env","envName","loadPresetEnvDescriptors","overrides","index","loadPresetOverridesDescriptors","overridesEnv","loadPresetOverridesEnvDescriptors","createLogger","makeWeakCacheSync","buildRootDescriptors","alias","createUncachedDescriptors","makeStrongCacheSync","buildEnvDescriptors","buildOverrideDescriptors","buildOverrideEnvDescriptors","buildRootChain","opts","configReport","babelRcReport","programmaticLogger","ConfigPrinter","programmaticChain","loadProgrammaticChain","dirname","cwd","undefined","programmaticReport","output","configFile","loadConfig","caller","findRootConfig","babelrc","babelrcRoots","babelrcRootsDirectory","configFileChain","emptyChain","configFileLogger","validatedFile","validateConfigFile","result","loadFileChain","mergeChain","ignoreFile","babelrcFile","isIgnored","fileChain","filename","pkgData","findPackageData","babelrcLoadEnabled","ignore","config","findRelativeConfig","add","filepath","shouldIgnore","validateBabelrcFile","babelrcLogger","showConfig","console","log","filter","x","join","fileHandling","absoluteRoot","directories","indexOf","babelrcPatterns","Array","isArray","pat","path","resolve","length","some","pathPatternToRegex","directory","matchPattern","file","validate","validateExtendFile","input","createCachedDescriptors","baseLogger","buildProgrammaticLogger","loadFileChainWalker","loadFileDescriptors","loadFileEnvDescriptors","loadFileOverridesDescriptors","loadFileOverridesEnvDescriptors","buildFileLogger","configure","ChainFormatter","Config","descriptors","_","_context$caller","Programmatic","callerName","name","_options$env","_options$overrides","Error","_options$overrides2","_override$env","override","chainWalker","flattenedConfigs","rootOpts","configIsApplicable","push","envOpts","forEach","overrideOps","overrideEnvOpts","only","logger","mergeExtendsChain","mergeChainOpts","extends","has","from","delete","target","source","Object","assign","passPerPreset","test","include","exclude","prototype","hasOwnProperty","call","sourceMaps","sourceMap","items","Map","item","value","fnKey","nameMap","get","set","desc","ownPass","reduce","acc","configName","configFieldIsApplicable","patterns","matchesPatterns","ignoreListReplacer","_key","RegExp","String","_context$filename","message","JSON","stringify","_context$filename2","pattern","pathToTest","endHiddenCallStack","ConfigError"],"sources":["../../src/config/config-chain.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\n\nimport path from \"path\";\nimport buildDebug from \"debug\";\nimport type { Handler } from \"gensync\";\nimport { validate } from \"./validation/options.ts\";\nimport type {\n ValidatedOptions,\n IgnoreList,\n ConfigApplicableTest,\n BabelrcSearch,\n CallerMetadata,\n IgnoreItem,\n} from \"./validation/options.ts\";\nimport pathPatternToRegex from \"./pattern-to-regex.ts\";\nimport { ConfigPrinter, ChainFormatter } from \"./printer.ts\";\nimport type { ReadonlyDeepArray } from \"./helpers/deep-array.ts\";\n\nimport { endHiddenCallStack } from \"../errors/rewrite-stack-trace.ts\";\nimport ConfigError from \"../errors/config-error.ts\";\nimport type { PluginAPI, PresetAPI } from \"./helpers/config-api.ts\";\n\nconst debug = buildDebug(\"babel:config:config-chain\");\n\nimport {\n findPackageData,\n findRelativeConfig,\n findRootConfig,\n loadConfig,\n} from \"./files/index.ts\";\nimport type { ConfigFile, IgnoreFile, FilePackageData } from \"./files/index.ts\";\n\nimport { makeWeakCacheSync, makeStrongCacheSync } from \"./caching.ts\";\n\nimport {\n createCachedDescriptors,\n createUncachedDescriptors,\n} from \"./config-descriptors.ts\";\nimport type {\n UnloadedDescriptor,\n OptionsAndDescriptors,\n ValidatedFile,\n} from \"./config-descriptors.ts\";\n\nexport type ConfigChain = {\n plugins: Array>;\n presets: Array>;\n options: Array;\n files: Set;\n};\n\nexport type PresetInstance = {\n options: ValidatedOptions;\n alias: string;\n dirname: string;\n externalDependencies: ReadonlyDeepArray;\n};\n\nexport type ConfigContext = {\n filename: string | undefined;\n cwd: string;\n root: string;\n envName: string;\n caller: CallerMetadata | undefined;\n showConfig: boolean;\n};\n\n/**\n * Build a config chain for a given preset.\n */\nexport function* buildPresetChain(\n arg: PresetInstance,\n context: any,\n): Handler {\n const chain = yield* buildPresetChainWalker(arg, context);\n if (!chain) return null;\n\n return {\n plugins: dedupDescriptors(chain.plugins),\n presets: dedupDescriptors(chain.presets),\n options: chain.options.map(o => normalizeOptions(o)),\n files: new Set(),\n };\n}\n\nexport const buildPresetChainWalker = makeChainWalker({\n root: preset => loadPresetDescriptors(preset),\n env: (preset, envName) => loadPresetEnvDescriptors(preset)(envName),\n overrides: (preset, index) => loadPresetOverridesDescriptors(preset)(index),\n overridesEnv: (preset, index, envName) =>\n loadPresetOverridesEnvDescriptors(preset)(index)(envName),\n createLogger: () => () => {}, // Currently we don't support logging how preset is expanded\n});\nconst loadPresetDescriptors = makeWeakCacheSync((preset: PresetInstance) =>\n buildRootDescriptors(preset, preset.alias, createUncachedDescriptors),\n);\nconst loadPresetEnvDescriptors = makeWeakCacheSync((preset: PresetInstance) =>\n makeStrongCacheSync((envName: string) =>\n buildEnvDescriptors(\n preset,\n preset.alias,\n createUncachedDescriptors,\n envName,\n ),\n ),\n);\nconst loadPresetOverridesDescriptors = makeWeakCacheSync(\n (preset: PresetInstance) =>\n makeStrongCacheSync((index: number) =>\n buildOverrideDescriptors(\n preset,\n preset.alias,\n createUncachedDescriptors,\n index,\n ),\n ),\n);\nconst loadPresetOverridesEnvDescriptors = makeWeakCacheSync(\n (preset: PresetInstance) =>\n makeStrongCacheSync((index: number) =>\n makeStrongCacheSync((envName: string) =>\n buildOverrideEnvDescriptors(\n preset,\n preset.alias,\n createUncachedDescriptors,\n index,\n envName,\n ),\n ),\n ),\n);\n\nexport type FileHandling = \"transpile\" | \"ignored\" | \"unsupported\";\nexport type RootConfigChain = ConfigChain & {\n babelrc: ConfigFile | void;\n config: ConfigFile | void;\n ignore: IgnoreFile | void;\n fileHandling: FileHandling;\n files: Set;\n};\n\n/**\n * Build a config chain for Babel's full root configuration.\n */\nexport function* buildRootChain(\n opts: ValidatedOptions,\n context: ConfigContext,\n): Handler {\n let configReport, babelRcReport;\n const programmaticLogger = new ConfigPrinter();\n const programmaticChain = yield* loadProgrammaticChain(\n {\n options: opts,\n dirname: context.cwd,\n },\n context,\n undefined,\n programmaticLogger,\n );\n if (!programmaticChain) return null;\n const programmaticReport = yield* programmaticLogger.output();\n\n let configFile;\n if (typeof opts.configFile === \"string\") {\n configFile = yield* loadConfig(\n opts.configFile,\n context.cwd,\n context.envName,\n context.caller,\n );\n } else if (opts.configFile !== false) {\n configFile = yield* findRootConfig(\n context.root,\n context.envName,\n context.caller,\n );\n }\n\n let { babelrc, babelrcRoots } = opts;\n let babelrcRootsDirectory = context.cwd;\n\n const configFileChain = emptyChain();\n const configFileLogger = new ConfigPrinter();\n if (configFile) {\n const validatedFile = validateConfigFile(configFile);\n const result = yield* loadFileChain(\n validatedFile,\n context,\n undefined,\n configFileLogger,\n );\n if (!result) return null;\n configReport = yield* configFileLogger.output();\n\n // Allow config files to toggle `.babelrc` resolution on and off and\n // specify where the roots are.\n if (babelrc === undefined) {\n babelrc = validatedFile.options.babelrc;\n }\n if (babelrcRoots === undefined) {\n babelrcRootsDirectory = validatedFile.dirname;\n babelrcRoots = validatedFile.options.babelrcRoots;\n }\n\n mergeChain(configFileChain, result);\n }\n\n let ignoreFile, babelrcFile;\n let isIgnored = false;\n const fileChain = emptyChain();\n // resolve all .babelrc files\n if (\n (babelrc === true || babelrc === undefined) &&\n typeof context.filename === \"string\"\n ) {\n const pkgData = yield* findPackageData(context.filename);\n\n if (\n pkgData &&\n babelrcLoadEnabled(context, pkgData, babelrcRoots, babelrcRootsDirectory)\n ) {\n ({ ignore: ignoreFile, config: babelrcFile } = yield* findRelativeConfig(\n pkgData,\n context.envName,\n context.caller,\n ));\n\n if (ignoreFile) {\n fileChain.files.add(ignoreFile.filepath);\n }\n\n if (\n ignoreFile &&\n shouldIgnore(context, ignoreFile.ignore, null, ignoreFile.dirname)\n ) {\n isIgnored = true;\n }\n\n if (babelrcFile && !isIgnored) {\n const validatedFile = validateBabelrcFile(babelrcFile);\n const babelrcLogger = new ConfigPrinter();\n const result = yield* loadFileChain(\n validatedFile,\n context,\n undefined,\n babelrcLogger,\n );\n if (!result) {\n isIgnored = true;\n } else {\n babelRcReport = yield* babelrcLogger.output();\n mergeChain(fileChain, result);\n }\n }\n\n if (babelrcFile && isIgnored) {\n fileChain.files.add(babelrcFile.filepath);\n }\n }\n }\n\n if (context.showConfig) {\n console.log(\n `Babel configs on \"${context.filename}\" (ascending priority):\\n` +\n // print config by the order of ascending priority\n [configReport, babelRcReport, programmaticReport]\n .filter(x => !!x)\n .join(\"\\n\\n\") +\n \"\\n-----End Babel configs-----\",\n );\n }\n // Insert file chain in front so programmatic options have priority\n // over configuration file chain items.\n const chain = mergeChain(\n mergeChain(mergeChain(emptyChain(), configFileChain), fileChain),\n programmaticChain,\n );\n\n return {\n plugins: isIgnored ? [] : dedupDescriptors(chain.plugins),\n presets: isIgnored ? [] : dedupDescriptors(chain.presets),\n options: isIgnored ? [] : chain.options.map(o => normalizeOptions(o)),\n fileHandling: isIgnored ? \"ignored\" : \"transpile\",\n ignore: ignoreFile || undefined,\n babelrc: babelrcFile || undefined,\n config: configFile || undefined,\n files: chain.files,\n };\n}\n\nfunction babelrcLoadEnabled(\n context: ConfigContext,\n pkgData: FilePackageData,\n babelrcRoots: BabelrcSearch | undefined,\n babelrcRootsDirectory: string,\n): boolean {\n if (typeof babelrcRoots === \"boolean\") return babelrcRoots;\n\n const absoluteRoot = context.root;\n\n // Fast path to avoid having to match patterns if the babelrc is just\n // loading in the standard root directory.\n if (babelrcRoots === undefined) {\n return pkgData.directories.indexOf(absoluteRoot) !== -1;\n }\n\n let babelrcPatterns = babelrcRoots;\n if (!Array.isArray(babelrcPatterns)) {\n babelrcPatterns = [babelrcPatterns as IgnoreItem];\n }\n babelrcPatterns = babelrcPatterns.map(pat => {\n return typeof pat === \"string\"\n ? path.resolve(babelrcRootsDirectory, pat)\n : pat;\n });\n\n // Fast path to avoid having to match patterns if the babelrc is just\n // loading in the standard root directory.\n if (babelrcPatterns.length === 1 && babelrcPatterns[0] === absoluteRoot) {\n return pkgData.directories.indexOf(absoluteRoot) !== -1;\n }\n\n return babelrcPatterns.some(pat => {\n if (typeof pat === \"string\") {\n pat = pathPatternToRegex(pat, babelrcRootsDirectory);\n }\n\n return pkgData.directories.some(directory => {\n return matchPattern(pat, babelrcRootsDirectory, directory, context);\n });\n });\n}\n\nconst validateConfigFile = makeWeakCacheSync(\n (file: ConfigFile): ValidatedFile => ({\n filepath: file.filepath,\n dirname: file.dirname,\n options: validate(\"configfile\", file.options, file.filepath),\n }),\n);\n\nconst validateBabelrcFile = makeWeakCacheSync(\n (file: ConfigFile): ValidatedFile => ({\n filepath: file.filepath,\n dirname: file.dirname,\n options: validate(\"babelrcfile\", file.options, file.filepath),\n }),\n);\n\nconst validateExtendFile = makeWeakCacheSync(\n (file: ConfigFile): ValidatedFile => ({\n filepath: file.filepath,\n dirname: file.dirname,\n options: validate(\"extendsfile\", file.options, file.filepath),\n }),\n);\n\n/**\n * Build a config chain for just the programmatic options passed into Babel.\n */\nconst loadProgrammaticChain = makeChainWalker({\n root: input => buildRootDescriptors(input, \"base\", createCachedDescriptors),\n env: (input, envName) =>\n buildEnvDescriptors(input, \"base\", createCachedDescriptors, envName),\n overrides: (input, index) =>\n buildOverrideDescriptors(input, \"base\", createCachedDescriptors, index),\n overridesEnv: (input, index, envName) =>\n buildOverrideEnvDescriptors(\n input,\n \"base\",\n createCachedDescriptors,\n index,\n envName,\n ),\n createLogger: (input, context, baseLogger) =>\n buildProgrammaticLogger(input, context, baseLogger),\n});\n\n/**\n * Build a config chain for a given file.\n */\nconst loadFileChainWalker = makeChainWalker({\n root: file => loadFileDescriptors(file),\n env: (file, envName) => loadFileEnvDescriptors(file)(envName),\n overrides: (file, index) => loadFileOverridesDescriptors(file)(index),\n overridesEnv: (file, index, envName) =>\n loadFileOverridesEnvDescriptors(file)(index)(envName),\n createLogger: (file, context, baseLogger) =>\n buildFileLogger(file.filepath, context, baseLogger),\n});\n\nfunction* loadFileChain(\n input: ValidatedFile,\n context: ConfigContext,\n files: Set,\n baseLogger: ConfigPrinter,\n) {\n const chain = yield* loadFileChainWalker(input, context, files, baseLogger);\n chain?.files.add(input.filepath);\n\n return chain;\n}\n\nconst loadFileDescriptors = makeWeakCacheSync((file: ValidatedFile) =>\n buildRootDescriptors(file, file.filepath, createUncachedDescriptors),\n);\nconst loadFileEnvDescriptors = makeWeakCacheSync((file: ValidatedFile) =>\n makeStrongCacheSync((envName: string) =>\n buildEnvDescriptors(\n file,\n file.filepath,\n createUncachedDescriptors,\n envName,\n ),\n ),\n);\nconst loadFileOverridesDescriptors = makeWeakCacheSync((file: ValidatedFile) =>\n makeStrongCacheSync((index: number) =>\n buildOverrideDescriptors(\n file,\n file.filepath,\n createUncachedDescriptors,\n index,\n ),\n ),\n);\nconst loadFileOverridesEnvDescriptors = makeWeakCacheSync(\n (file: ValidatedFile) =>\n makeStrongCacheSync((index: number) =>\n makeStrongCacheSync((envName: string) =>\n buildOverrideEnvDescriptors(\n file,\n file.filepath,\n createUncachedDescriptors,\n index,\n envName,\n ),\n ),\n ),\n);\n\nfunction buildFileLogger(\n filepath: string,\n context: ConfigContext,\n baseLogger: ConfigPrinter | void,\n) {\n if (!baseLogger) {\n return () => {};\n }\n return baseLogger.configure(context.showConfig, ChainFormatter.Config, {\n filepath,\n });\n}\n\nfunction buildRootDescriptors(\n { dirname, options }: Partial,\n alias: string,\n descriptors: (\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n ) => OptionsAndDescriptors,\n) {\n return descriptors(dirname, options, alias);\n}\n\nfunction buildProgrammaticLogger(\n _: unknown,\n context: ConfigContext,\n baseLogger: ConfigPrinter | void,\n) {\n if (!baseLogger) {\n return () => {};\n }\n return baseLogger.configure(context.showConfig, ChainFormatter.Programmatic, {\n callerName: context.caller?.name,\n });\n}\n\nfunction buildEnvDescriptors(\n { dirname, options }: Partial,\n alias: string,\n descriptors: (\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n ) => OptionsAndDescriptors,\n envName: string,\n) {\n const opts = options.env?.[envName];\n return opts ? descriptors(dirname, opts, `${alias}.env[\"${envName}\"]`) : null;\n}\n\nfunction buildOverrideDescriptors(\n { dirname, options }: Partial,\n alias: string,\n descriptors: (\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n ) => OptionsAndDescriptors,\n index: number,\n) {\n const opts = options.overrides?.[index];\n if (!opts) throw new Error(\"Assertion failure - missing override\");\n\n return descriptors(dirname, opts, `${alias}.overrides[${index}]`);\n}\n\nfunction buildOverrideEnvDescriptors(\n { dirname, options }: Partial,\n alias: string,\n descriptors: (\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n ) => OptionsAndDescriptors,\n index: number,\n envName: string,\n) {\n const override = options.overrides?.[index];\n if (!override) throw new Error(\"Assertion failure - missing override\");\n\n const opts = override.env?.[envName];\n return opts\n ? descriptors(\n dirname,\n opts,\n `${alias}.overrides[${index}].env[\"${envName}\"]`,\n )\n : null;\n}\n\nfunction makeChainWalker<\n ArgT extends {\n options: ValidatedOptions;\n dirname: string;\n filepath?: string;\n },\n>({\n root,\n env,\n overrides,\n overridesEnv,\n createLogger,\n}: {\n root: (configEntry: ArgT) => OptionsAndDescriptors;\n env: (configEntry: ArgT, env: string) => OptionsAndDescriptors | null;\n overrides: (configEntry: ArgT, index: number) => OptionsAndDescriptors;\n overridesEnv: (\n configEntry: ArgT,\n index: number,\n env: string,\n ) => OptionsAndDescriptors | null;\n createLogger: (\n configEntry: ArgT,\n context: ConfigContext,\n printer: ConfigPrinter | void,\n ) => (\n opts: OptionsAndDescriptors,\n index?: number | null,\n env?: string | null,\n ) => void;\n}): (\n configEntry: ArgT,\n context: ConfigContext,\n files?: Set,\n baseLogger?: ConfigPrinter,\n) => Handler {\n return function* chainWalker(input, context, files = new Set(), baseLogger) {\n const { dirname } = input;\n\n const flattenedConfigs: Array<{\n config: OptionsAndDescriptors;\n index: number | undefined | null;\n envName: string | undefined | null;\n }> = [];\n\n const rootOpts = root(input);\n if (configIsApplicable(rootOpts, dirname, context, input.filepath)) {\n flattenedConfigs.push({\n config: rootOpts,\n envName: undefined,\n index: undefined,\n });\n\n const envOpts = env(input, context.envName);\n if (\n envOpts &&\n configIsApplicable(envOpts, dirname, context, input.filepath)\n ) {\n flattenedConfigs.push({\n config: envOpts,\n envName: context.envName,\n index: undefined,\n });\n }\n\n (rootOpts.options.overrides || []).forEach((_, index) => {\n const overrideOps = overrides(input, index);\n if (configIsApplicable(overrideOps, dirname, context, input.filepath)) {\n flattenedConfigs.push({\n config: overrideOps,\n index,\n envName: undefined,\n });\n\n const overrideEnvOpts = overridesEnv(input, index, context.envName);\n if (\n overrideEnvOpts &&\n configIsApplicable(\n overrideEnvOpts,\n dirname,\n context,\n input.filepath,\n )\n ) {\n flattenedConfigs.push({\n config: overrideEnvOpts,\n index,\n envName: context.envName,\n });\n }\n }\n });\n }\n\n // Process 'ignore' and 'only' before 'extends' items are processed so\n // that we don't do extra work loading extended configs if a file is\n // ignored.\n if (\n flattenedConfigs.some(\n ({\n config: {\n options: { ignore, only },\n },\n }) => shouldIgnore(context, ignore, only, dirname),\n )\n ) {\n return null;\n }\n\n const chain = emptyChain();\n const logger = createLogger(input, context, baseLogger);\n\n for (const { config, index, envName } of flattenedConfigs) {\n if (\n !(yield* mergeExtendsChain(\n chain,\n config.options,\n dirname,\n context,\n files,\n baseLogger,\n ))\n ) {\n return null;\n }\n\n logger(config, index, envName);\n yield* mergeChainOpts(chain, config);\n }\n return chain;\n };\n}\n\nfunction* mergeExtendsChain(\n chain: ConfigChain,\n opts: ValidatedOptions,\n dirname: string,\n context: ConfigContext,\n files: Set,\n baseLogger?: ConfigPrinter,\n): Handler {\n if (opts.extends === undefined) return true;\n\n const file = yield* loadConfig(\n opts.extends,\n dirname,\n context.envName,\n context.caller,\n );\n\n if (files.has(file)) {\n throw new Error(\n `Configuration cycle detected loading ${file.filepath}.\\n` +\n `File already loaded following the config chain:\\n` +\n Array.from(files, file => ` - ${file.filepath}`).join(\"\\n\"),\n );\n }\n\n files.add(file);\n const fileChain = yield* loadFileChain(\n validateExtendFile(file),\n context,\n files,\n baseLogger,\n );\n files.delete(file);\n\n if (!fileChain) return false;\n\n mergeChain(chain, fileChain);\n\n return true;\n}\n\nfunction mergeChain(target: ConfigChain, source: ConfigChain): ConfigChain {\n target.options.push(...source.options);\n target.plugins.push(...source.plugins);\n target.presets.push(...source.presets);\n for (const file of source.files) {\n target.files.add(file);\n }\n\n return target;\n}\n\nfunction* mergeChainOpts(\n target: ConfigChain,\n { options, plugins, presets }: OptionsAndDescriptors,\n): Handler {\n target.options.push(options);\n target.plugins.push(...(yield* plugins()));\n target.presets.push(...(yield* presets()));\n\n return target;\n}\n\nfunction emptyChain(): ConfigChain {\n return {\n options: [],\n presets: [],\n plugins: [],\n files: new Set(),\n };\n}\n\nfunction normalizeOptions(opts: ValidatedOptions): ValidatedOptions {\n const options = {\n ...opts,\n };\n delete options.extends;\n delete options.env;\n delete options.overrides;\n delete options.plugins;\n delete options.presets;\n delete options.passPerPreset;\n delete options.ignore;\n delete options.only;\n delete options.test;\n delete options.include;\n delete options.exclude;\n\n // \"sourceMap\" is just aliased to sourceMap, so copy it over as\n // we merge the options together.\n if (Object.prototype.hasOwnProperty.call(options, \"sourceMap\")) {\n options.sourceMaps = options.sourceMap;\n delete options.sourceMap;\n }\n return options;\n}\n\nfunction dedupDescriptors(\n items: Array>,\n): Array> {\n const map: Map<\n Function,\n Map }>\n > = new Map();\n\n const descriptors = [];\n\n for (const item of items) {\n if (typeof item.value === \"function\") {\n const fnKey = item.value;\n let nameMap = map.get(fnKey);\n if (!nameMap) {\n nameMap = new Map();\n map.set(fnKey, nameMap);\n }\n let desc = nameMap.get(item.name);\n if (!desc) {\n desc = { value: item };\n descriptors.push(desc);\n\n // Treat passPerPreset presets as unique, skipping them\n // in the merge processing steps.\n if (!item.ownPass) nameMap.set(item.name, desc);\n } else {\n desc.value = item;\n }\n } else {\n descriptors.push({ value: item });\n }\n }\n\n return descriptors.reduce((acc, desc) => {\n acc.push(desc.value);\n return acc;\n }, []);\n}\n\nfunction configIsApplicable(\n { options }: OptionsAndDescriptors,\n dirname: string,\n context: ConfigContext,\n configName: string,\n): boolean {\n return (\n (options.test === undefined ||\n configFieldIsApplicable(context, options.test, dirname, configName)) &&\n (options.include === undefined ||\n configFieldIsApplicable(context, options.include, dirname, configName)) &&\n (options.exclude === undefined ||\n !configFieldIsApplicable(context, options.exclude, dirname, configName))\n );\n}\n\nfunction configFieldIsApplicable(\n context: ConfigContext,\n test: ConfigApplicableTest,\n dirname: string,\n configName: string,\n): boolean {\n const patterns = Array.isArray(test) ? test : [test];\n\n return matchesPatterns(context, patterns, dirname, configName);\n}\n\n/**\n * Print the ignoreList-values in a more helpful way than the default.\n */\nfunction ignoreListReplacer(\n _key: string,\n value: IgnoreList | IgnoreItem,\n): IgnoreList | IgnoreItem | string {\n if (value instanceof RegExp) {\n return String(value);\n }\n\n return value;\n}\n\n/**\n * Tests if a filename should be ignored based on \"ignore\" and \"only\" options.\n */\nfunction shouldIgnore(\n context: ConfigContext,\n ignore: IgnoreList | undefined | null,\n only: IgnoreList | undefined | null,\n dirname: string,\n): boolean {\n if (ignore && matchesPatterns(context, ignore, dirname)) {\n const message = `No config is applied to \"${\n context.filename ?? \"(unknown)\"\n }\" because it matches one of \\`ignore: ${JSON.stringify(\n ignore,\n ignoreListReplacer,\n )}\\` from \"${dirname}\"`;\n debug(message);\n if (context.showConfig) {\n console.log(message);\n }\n return true;\n }\n\n if (only && !matchesPatterns(context, only, dirname)) {\n const message = `No config is applied to \"${\n context.filename ?? \"(unknown)\"\n }\" because it fails to match one of \\`only: ${JSON.stringify(\n only,\n ignoreListReplacer,\n )}\\` from \"${dirname}\"`;\n debug(message);\n if (context.showConfig) {\n console.log(message);\n }\n return true;\n }\n\n return false;\n}\n\n/**\n * Returns result of calling function with filename if pattern is a function.\n * Otherwise returns result of matching pattern Regex with filename.\n */\nfunction matchesPatterns(\n context: ConfigContext,\n patterns: IgnoreList,\n dirname: string,\n configName?: string,\n): boolean {\n return patterns.some(pattern =>\n matchPattern(pattern, dirname, context.filename, context, configName),\n );\n}\n\nfunction matchPattern(\n pattern: IgnoreItem,\n dirname: string,\n pathToTest: string | undefined,\n context: ConfigContext,\n configName?: string,\n): boolean {\n if (typeof pattern === \"function\") {\n return !!endHiddenCallStack(pattern)(pathToTest, {\n dirname,\n envName: context.envName,\n caller: context.caller,\n });\n }\n\n if (typeof pathToTest !== \"string\") {\n throw new ConfigError(\n `Configuration contains string/RegExp pattern, but no filename was passed to Babel`,\n configName,\n );\n }\n\n if (typeof pattern === \"string\") {\n pattern = pathPatternToRegex(pattern, dirname);\n }\n return pattern.test(pathToTest);\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/config-descriptors.js b/node_modules/@babel/core/lib/config/config-descriptors.js index 83f34ec06e63..36d633c35a57 100644 --- a/node_modules/@babel/core/lib/config/config-descriptors.js +++ b/node_modules/@babel/core/lib/config/config-descriptors.js @@ -13,13 +13,14 @@ function _gensync() { }; return data; } -var _functional = require("../gensync-utils/functional"); -var _files = require("./files"); -var _item = require("./item"); -var _caching = require("./caching"); -var _resolveTargets = require("./resolve-targets"); +var _functional = require("../gensync-utils/functional.js"); +var _index = require("./files/index.js"); +var _item = require("./item.js"); +var _caching = require("./caching.js"); +var _resolveTargets = require("./resolve-targets.js"); function isEqualDescriptor(a, b) { - return a.name === b.name && a.value === b.value && a.options === b.options && a.dirname === b.dirname && a.alias === b.alias && a.ownPass === b.ownPass && (a.file && a.file.request) === (b.file && b.file.request) && (a.file && a.file.resolved) === (b.file && b.file.resolved); + var _a$file, _b$file, _a$file2, _b$file2; + return a.name === b.name && a.value === b.value && a.options === b.options && a.dirname === b.dirname && a.alias === b.alias && a.ownPass === b.ownPass && ((_a$file = a.file) == null ? void 0 : _a$file.request) === ((_b$file = b.file) == null ? void 0 : _b$file.request) && ((_a$file2 = a.file) == null ? void 0 : _a$file2.resolved) === ((_b$file2 = b.file) == null ? void 0 : _b$file2.resolved); } function* handlerOf(value) { return value; @@ -30,7 +31,6 @@ function optionsWithResolvedBrowserslistConfigFile(options, dirname) { } return options; } - function createCachedDescriptors(dirname, options, alias) { const { plugins, @@ -39,13 +39,10 @@ function createCachedDescriptors(dirname, options, alias) { } = options; return { options: optionsWithResolvedBrowserslistConfigFile(options, dirname), - plugins: plugins ? () => - createCachedPluginDescriptors(plugins, dirname)(alias) : () => handlerOf([]), - presets: presets ? () => - createCachedPresetDescriptors(presets, dirname)(alias)(!!passPerPreset) : () => handlerOf([]) + plugins: plugins ? () => createCachedPluginDescriptors(plugins, dirname)(alias) : () => handlerOf([]), + presets: presets ? () => createCachedPresetDescriptors(presets, dirname)(alias)(!!passPerPreset) : () => handlerOf([]) }; } - function createUncachedDescriptors(dirname, options, alias) { return { options: optionsWithResolvedBrowserslistConfigFile(options, dirname), @@ -58,8 +55,7 @@ const createCachedPresetDescriptors = (0, _caching.makeWeakCacheSync)((items, ca const dirname = cache.using(dir => dir); return (0, _caching.makeStrongCacheSync)(alias => (0, _caching.makeStrongCache)(function* (passPerPreset) { const descriptors = yield* createPresetDescriptors(items, dirname, alias, passPerPreset); - return descriptors.map( - desc => loadCachedDescriptor(PRESET_DESCRIPTOR_CACHE, desc)); + return descriptors.map(desc => loadCachedDescriptor(PRESET_DESCRIPTOR_CACHE, desc)); })); }); const PLUGIN_DESCRIPTOR_CACHE = new WeakMap(); @@ -67,13 +63,10 @@ const createCachedPluginDescriptors = (0, _caching.makeWeakCacheSync)((items, ca const dirname = cache.using(dir => dir); return (0, _caching.makeStrongCache)(function* (alias) { const descriptors = yield* createPluginDescriptors(items, dirname, alias); - return descriptors.map( - desc => loadCachedDescriptor(PLUGIN_DESCRIPTOR_CACHE, desc)); + return descriptors.map(desc => loadCachedDescriptor(PLUGIN_DESCRIPTOR_CACHE, desc)); }); }); - const DEFAULT_OPTIONS = {}; - function loadCachedDescriptor(cache, desc) { const { value, @@ -114,7 +107,6 @@ function* createDescriptors(type, items, dirname, alias, ownPass) { assertNoDuplicates(descriptors); return descriptors; } - function* createDescriptor(pair, dirname, { type, alias, @@ -140,7 +132,7 @@ function* createDescriptor(pair, dirname, { if (typeof type !== "string") { throw new Error("To resolve a string-based item, the type of item must be given"); } - const resolver = type === "plugin" ? _files.loadPlugin : _files.loadPreset; + const resolver = type === "plugin" ? _index.loadPlugin : _index.loadPreset; const request = value; ({ filepath, diff --git a/node_modules/@babel/core/lib/config/config-descriptors.js.map b/node_modules/@babel/core/lib/config/config-descriptors.js.map index 152ce0d4ccd2..258cb104a544 100644 --- a/node_modules/@babel/core/lib/config/config-descriptors.js.map +++ b/node_modules/@babel/core/lib/config/config-descriptors.js.map @@ -1 +1 @@ -{"version":3,"names":["isEqualDescriptor","a","b","name","value","options","dirname","alias","ownPass","file","request","resolved","handlerOf","optionsWithResolvedBrowserslistConfigFile","browserslistConfigFile","resolveBrowserslistConfigFile","createCachedDescriptors","plugins","presets","passPerPreset","createCachedPluginDescriptors","createCachedPresetDescriptors","createUncachedDescriptors","once","createPluginDescriptors","createPresetDescriptors","PRESET_DESCRIPTOR_CACHE","WeakMap","makeWeakCacheSync","items","cache","using","dir","makeStrongCacheSync","makeStrongCache","descriptors","map","desc","loadCachedDescriptor","PLUGIN_DESCRIPTOR_CACHE","DEFAULT_OPTIONS","cacheByOptions","get","set","possibilities","indexOf","matches","filter","possibility","length","push","createDescriptors","type","gensync","all","item","index","createDescriptor","assertNoDuplicates","pair","getItemDescriptor","Array","isArray","undefined","filepath","Error","resolver","loadPlugin","loadPreset","String","__esModule","default","Map","nameMap","Set","has","conflicts","i","JSON","stringify","join","add"],"sources":["../../src/config/config-descriptors.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\nimport { once } from \"../gensync-utils/functional\";\n\nimport { loadPlugin, loadPreset } from \"./files\";\n\nimport { getItemDescriptor } from \"./item\";\n\nimport {\n makeWeakCacheSync,\n makeStrongCacheSync,\n makeStrongCache,\n} from \"./caching\";\nimport type { CacheConfigurator } from \"./caching\";\n\nimport type {\n ValidatedOptions,\n PluginList,\n PluginItem,\n} from \"./validation/options\";\n\nimport { resolveBrowserslistConfigFile } from \"./resolve-targets\";\n\n// Represents a config object and functions to lazily load the descriptors\n// for the plugins and presets so we don't load the plugins/presets unless\n// the options object actually ends up being applicable.\nexport type OptionsAndDescriptors = {\n options: ValidatedOptions;\n plugins: () => Handler>;\n presets: () => Handler>;\n};\n\n// Represents a plugin or presets at a given location in a config object.\n// At this point these have been resolved to a specific object or function,\n// but have not yet been executed to call functions with options.\nexport type UnloadedDescriptor = {\n name: string | undefined;\n value: any | Function;\n options: {} | undefined | false;\n dirname: string;\n alias: string;\n ownPass?: boolean;\n file?: {\n request: string;\n resolved: string;\n };\n};\n\nfunction isEqualDescriptor(\n a: UnloadedDescriptor,\n b: UnloadedDescriptor,\n): boolean {\n return (\n a.name === b.name &&\n a.value === b.value &&\n a.options === b.options &&\n a.dirname === b.dirname &&\n a.alias === b.alias &&\n a.ownPass === b.ownPass &&\n (a.file && a.file.request) === (b.file && b.file.request) &&\n (a.file && a.file.resolved) === (b.file && b.file.resolved)\n );\n}\n\nexport type ValidatedFile = {\n filepath: string;\n dirname: string;\n options: ValidatedOptions;\n};\n\n// eslint-disable-next-line require-yield\nfunction* handlerOf(value: T): Handler {\n return value;\n}\n\nfunction optionsWithResolvedBrowserslistConfigFile(\n options: ValidatedOptions,\n dirname: string,\n): ValidatedOptions {\n if (typeof options.browserslistConfigFile === \"string\") {\n options.browserslistConfigFile = resolveBrowserslistConfigFile(\n options.browserslistConfigFile,\n dirname,\n );\n }\n return options;\n}\n\n/**\n * Create a set of descriptors from a given options object, preserving\n * descriptor identity based on the identity of the plugin/preset arrays\n * themselves, and potentially on the identity of the plugins/presets + options.\n */\nexport function createCachedDescriptors(\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n): OptionsAndDescriptors {\n const { plugins, presets, passPerPreset } = options;\n return {\n options: optionsWithResolvedBrowserslistConfigFile(options, dirname),\n plugins: plugins\n ? () =>\n // @ts-expect-error todo(flow->ts) ts complains about incorrect arguments\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n createCachedPluginDescriptors(plugins, dirname)(alias)\n : () => handlerOf([]),\n presets: presets\n ? () =>\n // @ts-expect-error todo(flow->ts) ts complains about incorrect arguments\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n createCachedPresetDescriptors(presets, dirname)(alias)(\n !!passPerPreset,\n )\n : () => handlerOf([]),\n };\n}\n\n/**\n * Create a set of descriptors from a given options object, with consistent\n * identity for the descriptors, but not caching based on any specific identity.\n */\nexport function createUncachedDescriptors(\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n): OptionsAndDescriptors {\n return {\n options: optionsWithResolvedBrowserslistConfigFile(options, dirname),\n // The returned result here is cached to represent a config object in\n // memory, so we build and memoize the descriptors to ensure the same\n // values are returned consistently.\n plugins: once(() =>\n createPluginDescriptors(options.plugins || [], dirname, alias),\n ),\n presets: once(() =>\n createPresetDescriptors(\n options.presets || [],\n dirname,\n alias,\n !!options.passPerPreset,\n ),\n ),\n };\n}\n\nconst PRESET_DESCRIPTOR_CACHE = new WeakMap();\nconst createCachedPresetDescriptors = makeWeakCacheSync(\n (items: PluginList, cache: CacheConfigurator) => {\n const dirname = cache.using(dir => dir);\n return makeStrongCacheSync((alias: string) =>\n makeStrongCache(function* (\n passPerPreset: boolean,\n ): Handler> {\n const descriptors = yield* createPresetDescriptors(\n items,\n dirname,\n alias,\n passPerPreset,\n );\n return descriptors.map(\n // Items are cached using the overall preset array identity when\n // possibly, but individual descriptors are also cached if a match\n // can be found in the previously-used descriptor lists.\n desc => loadCachedDescriptor(PRESET_DESCRIPTOR_CACHE, desc),\n );\n }),\n );\n },\n);\n\nconst PLUGIN_DESCRIPTOR_CACHE = new WeakMap();\nconst createCachedPluginDescriptors = makeWeakCacheSync(\n (items: PluginList, cache: CacheConfigurator) => {\n const dirname = cache.using(dir => dir);\n return makeStrongCache(function* (\n alias: string,\n ): Handler> {\n const descriptors = yield* createPluginDescriptors(items, dirname, alias);\n return descriptors.map(\n // Items are cached using the overall plugin array identity when\n // possibly, but individual descriptors are also cached if a match\n // can be found in the previously-used descriptor lists.\n desc => loadCachedDescriptor(PLUGIN_DESCRIPTOR_CACHE, desc),\n );\n });\n },\n);\n\n/**\n * When no options object is given in a descriptor, this object is used\n * as a WeakMap key in order to have consistent identity.\n */\nconst DEFAULT_OPTIONS = {};\n\n/**\n * Given the cache and a descriptor, returns a matching descriptor from the\n * cache, or else returns the input descriptor and adds it to the cache for\n * next time.\n */\nfunction loadCachedDescriptor(\n cache: WeakMap<{} | Function, WeakMap<{}, Array>>,\n desc: UnloadedDescriptor,\n) {\n const { value, options = DEFAULT_OPTIONS } = desc;\n if (options === false) return desc;\n\n let cacheByOptions = cache.get(value);\n if (!cacheByOptions) {\n cacheByOptions = new WeakMap();\n cache.set(value, cacheByOptions);\n }\n\n let possibilities = cacheByOptions.get(options);\n if (!possibilities) {\n possibilities = [];\n cacheByOptions.set(options, possibilities);\n }\n\n if (possibilities.indexOf(desc) === -1) {\n const matches = possibilities.filter(possibility =>\n isEqualDescriptor(possibility, desc),\n );\n if (matches.length > 0) {\n return matches[0];\n }\n\n possibilities.push(desc);\n }\n\n return desc;\n}\n\nfunction* createPresetDescriptors(\n items: PluginList,\n dirname: string,\n alias: string,\n passPerPreset: boolean,\n): Handler> {\n return yield* createDescriptors(\n \"preset\",\n items,\n dirname,\n alias,\n passPerPreset,\n );\n}\n\nfunction* createPluginDescriptors(\n items: PluginList,\n dirname: string,\n alias: string,\n): Handler> {\n return yield* createDescriptors(\"plugin\", items, dirname, alias);\n}\n\nfunction* createDescriptors(\n type: \"plugin\" | \"preset\",\n items: PluginList,\n dirname: string,\n alias: string,\n ownPass?: boolean,\n): Handler> {\n const descriptors = yield* gensync.all(\n items.map((item, index) =>\n createDescriptor(item, dirname, {\n type,\n alias: `${alias}$${index}`,\n ownPass: !!ownPass,\n }),\n ),\n );\n\n assertNoDuplicates(descriptors);\n\n return descriptors;\n}\n\n/**\n * Given a plugin/preset item, resolve it into a standard format.\n */\nexport function* createDescriptor(\n pair: PluginItem,\n dirname: string,\n {\n type,\n alias,\n ownPass,\n }: {\n type?: \"plugin\" | \"preset\";\n alias: string;\n ownPass?: boolean;\n },\n): Handler {\n const desc = getItemDescriptor(pair);\n if (desc) {\n return desc;\n }\n\n let name;\n let options;\n // todo(flow->ts) better type annotation\n let value: any = pair;\n if (Array.isArray(value)) {\n if (value.length === 3) {\n [value, options, name] = value;\n } else {\n [value, options] = value;\n }\n }\n\n let file = undefined;\n let filepath = null;\n if (typeof value === \"string\") {\n if (typeof type !== \"string\") {\n throw new Error(\n \"To resolve a string-based item, the type of item must be given\",\n );\n }\n const resolver = type === \"plugin\" ? loadPlugin : loadPreset;\n const request = value;\n\n ({ filepath, value } = yield* resolver(value, dirname));\n\n file = {\n request,\n resolved: filepath,\n };\n }\n\n if (!value) {\n throw new Error(`Unexpected falsy value: ${String(value)}`);\n }\n\n if (typeof value === \"object\" && value.__esModule) {\n if (value.default) {\n value = value.default;\n } else {\n throw new Error(\"Must export a default export when using ES6 modules.\");\n }\n }\n\n if (typeof value !== \"object\" && typeof value !== \"function\") {\n throw new Error(\n `Unsupported format: ${typeof value}. Expected an object or a function.`,\n );\n }\n\n if (filepath !== null && typeof value === \"object\" && value) {\n // We allow object values for plugins/presets nested directly within a\n // config object, because it can be useful to define them in nested\n // configuration contexts.\n throw new Error(\n `Plugin/Preset files are not allowed to export objects, only functions. In ${filepath}`,\n );\n }\n\n return {\n name,\n alias: filepath || alias,\n value,\n options,\n dirname,\n ownPass,\n file,\n };\n}\n\nfunction assertNoDuplicates(items: Array): void {\n const map = new Map();\n\n for (const item of items) {\n if (typeof item.value !== \"function\") continue;\n\n let nameMap = map.get(item.value);\n if (!nameMap) {\n nameMap = new Set();\n map.set(item.value, nameMap);\n }\n\n if (nameMap.has(item.name)) {\n const conflicts = items.filter(i => i.value === item.value);\n throw new Error(\n [\n `Duplicate plugin/preset detected.`,\n `If you'd like to use two separate instances of a plugin,`,\n `they need separate names, e.g.`,\n ``,\n ` plugins: [`,\n ` ['some-plugin', {}],`,\n ` ['some-plugin', {}, 'some unique name'],`,\n ` ]`,\n ``,\n `Duplicates detected are:`,\n `${JSON.stringify(conflicts, null, 2)}`,\n ].join(\"\\n\"),\n );\n }\n\n nameMap.add(item.name);\n }\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_gensync","data","require","_functional","_index","_item","_caching","_resolveTargets","isEqualDescriptor","a","b","_a$file","_b$file","_a$file2","_b$file2","name","value","options","dirname","alias","ownPass","file","request","resolved","handlerOf","optionsWithResolvedBrowserslistConfigFile","browserslistConfigFile","resolveBrowserslistConfigFile","createCachedDescriptors","plugins","presets","passPerPreset","createCachedPluginDescriptors","createCachedPresetDescriptors","createUncachedDescriptors","once","createPluginDescriptors","createPresetDescriptors","PRESET_DESCRIPTOR_CACHE","WeakMap","makeWeakCacheSync","items","cache","using","dir","makeStrongCacheSync","makeStrongCache","descriptors","map","desc","loadCachedDescriptor","PLUGIN_DESCRIPTOR_CACHE","DEFAULT_OPTIONS","cacheByOptions","get","set","possibilities","indexOf","matches","filter","possibility","length","push","createDescriptors","type","gensync","all","item","index","createDescriptor","assertNoDuplicates","pair","getItemDescriptor","Array","isArray","undefined","filepath","Error","resolver","loadPlugin","loadPreset","String","__esModule","default","Map","nameMap","Set","has","conflicts","i","JSON","stringify","join","add"],"sources":["../../src/config/config-descriptors.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\nimport { once } from \"../gensync-utils/functional.ts\";\n\nimport { loadPlugin, loadPreset } from \"./files/index.ts\";\n\nimport { getItemDescriptor } from \"./item.ts\";\n\nimport {\n makeWeakCacheSync,\n makeStrongCacheSync,\n makeStrongCache,\n} from \"./caching.ts\";\nimport type { CacheConfigurator } from \"./caching.ts\";\n\nimport type {\n ValidatedOptions,\n PluginList,\n PluginItem,\n} from \"./validation/options.ts\";\n\nimport { resolveBrowserslistConfigFile } from \"./resolve-targets.ts\";\nimport type { PluginAPI, PresetAPI } from \"./helpers/config-api.ts\";\n\n// Represents a config object and functions to lazily load the descriptors\n// for the plugins and presets so we don't load the plugins/presets unless\n// the options object actually ends up being applicable.\nexport type OptionsAndDescriptors = {\n options: ValidatedOptions;\n plugins: () => Handler>>;\n presets: () => Handler>>;\n};\n\n// Represents a plugin or presets at a given location in a config object.\n// At this point these have been resolved to a specific object or function,\n// but have not yet been executed to call functions with options.\nexport interface UnloadedDescriptor {\n name: string | undefined;\n value: object | ((api: API, options: Options, dirname: string) => unknown);\n options: Options;\n dirname: string;\n alias: string;\n ownPass?: boolean;\n file?: {\n request: string;\n resolved: string;\n };\n}\n\nfunction isEqualDescriptor(\n a: UnloadedDescriptor,\n b: UnloadedDescriptor,\n): boolean {\n return (\n a.name === b.name &&\n a.value === b.value &&\n a.options === b.options &&\n a.dirname === b.dirname &&\n a.alias === b.alias &&\n a.ownPass === b.ownPass &&\n a.file?.request === b.file?.request &&\n a.file?.resolved === b.file?.resolved\n );\n}\n\nexport type ValidatedFile = {\n filepath: string;\n dirname: string;\n options: ValidatedOptions;\n};\n\n// eslint-disable-next-line require-yield\nfunction* handlerOf(value: T): Handler {\n return value;\n}\n\nfunction optionsWithResolvedBrowserslistConfigFile(\n options: ValidatedOptions,\n dirname: string,\n): ValidatedOptions {\n if (typeof options.browserslistConfigFile === \"string\") {\n options.browserslistConfigFile = resolveBrowserslistConfigFile(\n options.browserslistConfigFile,\n dirname,\n );\n }\n return options;\n}\n\n/**\n * Create a set of descriptors from a given options object, preserving\n * descriptor identity based on the identity of the plugin/preset arrays\n * themselves, and potentially on the identity of the plugins/presets + options.\n */\nexport function createCachedDescriptors(\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n): OptionsAndDescriptors {\n const { plugins, presets, passPerPreset } = options;\n return {\n options: optionsWithResolvedBrowserslistConfigFile(options, dirname),\n plugins: plugins\n ? () =>\n // @ts-expect-error todo(flow->ts) ts complains about incorrect arguments\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n createCachedPluginDescriptors(plugins, dirname)(alias)\n : () => handlerOf([]),\n presets: presets\n ? () =>\n // @ts-expect-error todo(flow->ts) ts complains about incorrect arguments\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n createCachedPresetDescriptors(presets, dirname)(alias)(\n !!passPerPreset,\n )\n : () => handlerOf([]),\n };\n}\n\n/**\n * Create a set of descriptors from a given options object, with consistent\n * identity for the descriptors, but not caching based on any specific identity.\n */\nexport function createUncachedDescriptors(\n dirname: string,\n options: ValidatedOptions,\n alias: string,\n): OptionsAndDescriptors {\n return {\n options: optionsWithResolvedBrowserslistConfigFile(options, dirname),\n // The returned result here is cached to represent a config object in\n // memory, so we build and memoize the descriptors to ensure the same\n // values are returned consistently.\n plugins: once(() =>\n createPluginDescriptors(options.plugins || [], dirname, alias),\n ),\n presets: once(() =>\n createPresetDescriptors(\n options.presets || [],\n dirname,\n alias,\n !!options.passPerPreset,\n ),\n ),\n };\n}\n\nconst PRESET_DESCRIPTOR_CACHE = new WeakMap();\nconst createCachedPresetDescriptors = makeWeakCacheSync(\n (items: PluginList, cache: CacheConfigurator) => {\n const dirname = cache.using(dir => dir);\n return makeStrongCacheSync((alias: string) =>\n makeStrongCache(function* (\n passPerPreset: boolean,\n ): Handler>> {\n const descriptors = yield* createPresetDescriptors(\n items,\n dirname,\n alias,\n passPerPreset,\n );\n return descriptors.map(\n // Items are cached using the overall preset array identity when\n // possibly, but individual descriptors are also cached if a match\n // can be found in the previously-used descriptor lists.\n desc => loadCachedDescriptor(PRESET_DESCRIPTOR_CACHE, desc),\n );\n }),\n );\n },\n);\n\nconst PLUGIN_DESCRIPTOR_CACHE = new WeakMap();\nconst createCachedPluginDescriptors = makeWeakCacheSync(\n (items: PluginList, cache: CacheConfigurator) => {\n const dirname = cache.using(dir => dir);\n return makeStrongCache(function* (\n alias: string,\n ): Handler>> {\n const descriptors = yield* createPluginDescriptors(items, dirname, alias);\n return descriptors.map(\n // Items are cached using the overall plugin array identity when\n // possibly, but individual descriptors are also cached if a match\n // can be found in the previously-used descriptor lists.\n desc => loadCachedDescriptor(PLUGIN_DESCRIPTOR_CACHE, desc),\n );\n });\n },\n);\n\n/**\n * When no options object is given in a descriptor, this object is used\n * as a WeakMap key in order to have consistent identity.\n */\nconst DEFAULT_OPTIONS = {};\n\n/**\n * Given the cache and a descriptor, returns a matching descriptor from the\n * cache, or else returns the input descriptor and adds it to the cache for\n * next time.\n */\nfunction loadCachedDescriptor(\n cache: WeakMap<{} | Function, WeakMap<{}, Array>>>,\n desc: UnloadedDescriptor,\n) {\n const { value, options = DEFAULT_OPTIONS } = desc;\n if (options === false) return desc;\n\n let cacheByOptions = cache.get(value);\n if (!cacheByOptions) {\n cacheByOptions = new WeakMap();\n cache.set(value, cacheByOptions);\n }\n\n let possibilities = cacheByOptions.get(options);\n if (!possibilities) {\n possibilities = [];\n cacheByOptions.set(options, possibilities);\n }\n\n if (possibilities.indexOf(desc) === -1) {\n const matches = possibilities.filter(possibility =>\n isEqualDescriptor(possibility, desc),\n );\n if (matches.length > 0) {\n return matches[0];\n }\n\n possibilities.push(desc);\n }\n\n return desc;\n}\n\nfunction* createPresetDescriptors(\n items: PluginList,\n dirname: string,\n alias: string,\n passPerPreset: boolean,\n): Handler>> {\n return yield* createDescriptors(\n \"preset\",\n items,\n dirname,\n alias,\n passPerPreset,\n );\n}\n\nfunction* createPluginDescriptors(\n items: PluginList,\n dirname: string,\n alias: string,\n): Handler>> {\n return yield* createDescriptors(\"plugin\", items, dirname, alias);\n}\n\nfunction* createDescriptors(\n type: \"plugin\" | \"preset\",\n items: PluginList,\n dirname: string,\n alias: string,\n ownPass?: boolean,\n): Handler>> {\n const descriptors = yield* gensync.all(\n items.map((item, index) =>\n createDescriptor(item, dirname, {\n type,\n alias: `${alias}$${index}`,\n ownPass: !!ownPass,\n }),\n ),\n );\n\n assertNoDuplicates(descriptors);\n\n return descriptors;\n}\n\n/**\n * Given a plugin/preset item, resolve it into a standard format.\n */\nexport function* createDescriptor(\n pair: PluginItem,\n dirname: string,\n {\n type,\n alias,\n ownPass,\n }: {\n type?: \"plugin\" | \"preset\";\n alias: string;\n ownPass?: boolean;\n },\n): Handler> {\n const desc = getItemDescriptor(pair);\n if (desc) {\n return desc;\n }\n\n let name;\n let options;\n // todo(flow->ts) better type annotation\n let value: any = pair;\n if (Array.isArray(value)) {\n if (value.length === 3) {\n [value, options, name] = value;\n } else {\n [value, options] = value;\n }\n }\n\n let file = undefined;\n let filepath = null;\n if (typeof value === \"string\") {\n if (typeof type !== \"string\") {\n throw new Error(\n \"To resolve a string-based item, the type of item must be given\",\n );\n }\n const resolver = type === \"plugin\" ? loadPlugin : loadPreset;\n const request = value;\n\n ({ filepath, value } = yield* resolver(value, dirname));\n\n file = {\n request,\n resolved: filepath,\n };\n }\n\n if (!value) {\n throw new Error(`Unexpected falsy value: ${String(value)}`);\n }\n\n if (typeof value === \"object\" && value.__esModule) {\n if (value.default) {\n value = value.default;\n } else {\n throw new Error(\"Must export a default export when using ES6 modules.\");\n }\n }\n\n if (typeof value !== \"object\" && typeof value !== \"function\") {\n throw new Error(\n `Unsupported format: ${typeof value}. Expected an object or a function.`,\n );\n }\n\n if (filepath !== null && typeof value === \"object\" && value) {\n // We allow object values for plugins/presets nested directly within a\n // config object, because it can be useful to define them in nested\n // configuration contexts.\n throw new Error(\n `Plugin/Preset files are not allowed to export objects, only functions. In ${filepath}`,\n );\n }\n\n return {\n name,\n alias: filepath || alias,\n value,\n options,\n dirname,\n ownPass,\n file,\n };\n}\n\nfunction assertNoDuplicates(items: Array>): void {\n const map = new Map();\n\n for (const item of items) {\n if (typeof item.value !== \"function\") continue;\n\n let nameMap = map.get(item.value);\n if (!nameMap) {\n nameMap = new Set();\n map.set(item.value, nameMap);\n }\n\n if (nameMap.has(item.name)) {\n const conflicts = items.filter(i => i.value === item.value);\n throw new Error(\n [\n `Duplicate plugin/preset detected.`,\n `If you'd like to use two separate instances of a plugin,`,\n `they need separate names, e.g.`,\n ``,\n ` plugins: [`,\n ` ['some-plugin', {}],`,\n ` ['some-plugin', {}, 'some unique name'],`,\n ` ]`,\n ``,\n `Duplicates detected are:`,\n `${JSON.stringify(conflicts, null, 2)}`,\n ].join(\"\\n\"),\n );\n }\n\n nameMap.add(item.name);\n }\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/files/configuration.js b/node_modules/@babel/core/lib/config/files/configuration.js index d5494d551026..50adfd86dea6 100644 --- a/node_modules/@babel/core/lib/config/files/configuration.js +++ b/node_modules/@babel/core/lib/config/files/configuration.js @@ -44,69 +44,62 @@ function _gensync() { }; return data; } -var _caching = require("../caching"); -var _configApi = require("../helpers/config-api"); -var _utils = require("./utils"); -var _moduleTypes = require("./module-types"); -var _patternToRegex = require("../pattern-to-regex"); -var _configError = require("../../errors/config-error"); -var fs = require("../../gensync-utils/fs"); -function _module() { - const data = require("module"); - _module = function () { - return data; - }; - return data; -} -var _rewriteStackTrace = require("../../errors/rewrite-stack-trace"); +var _caching = require("../caching.js"); +var _configApi = require("../helpers/config-api.js"); +var _utils = require("./utils.js"); +var _moduleTypes = require("./module-types.js"); +var _patternToRegex = require("../pattern-to-regex.js"); +var _configError = require("../../errors/config-error.js"); +var fs = require("../../gensync-utils/fs.js"); +var _rewriteStackTrace = require("../../errors/rewrite-stack-trace.js"); const debug = _debug()("babel:config:loading:files:configuration"); -const ROOT_CONFIG_FILENAMES = ["babel.config.js", "babel.config.cjs", "babel.config.mjs", "babel.config.json"]; -exports.ROOT_CONFIG_FILENAMES = ROOT_CONFIG_FILENAMES; -const RELATIVE_CONFIG_FILENAMES = [".babelrc", ".babelrc.js", ".babelrc.cjs", ".babelrc.mjs", ".babelrc.json"]; +const ROOT_CONFIG_FILENAMES = exports.ROOT_CONFIG_FILENAMES = ["babel.config.js", "babel.config.cjs", "babel.config.mjs", "babel.config.json", "babel.config.cts"]; +const RELATIVE_CONFIG_FILENAMES = [".babelrc", ".babelrc.js", ".babelrc.cjs", ".babelrc.mjs", ".babelrc.json", ".babelrc.cts"]; const BABELIGNORE_FILENAME = ".babelignore"; -const LOADING_CONFIGS = new Set(); -const readConfigJS = (0, _caching.makeStrongCache)(function* readConfigJS(filepath, cache) { - if (!_fs().existsSync(filepath)) { - cache.never(); - return null; - } - - if (LOADING_CONFIGS.has(filepath)) { - cache.never(); - debug("Auto-ignoring usage of config %o.", filepath); - return { - filepath, - dirname: _path().dirname(filepath), - options: {} - }; - } - let options; - try { - LOADING_CONFIGS.add(filepath); - options = yield* (0, _moduleTypes.default)(filepath, "You appear to be using a native ECMAScript module configuration " + "file, which is only supported when running Babel asynchronously."); - } finally { - LOADING_CONFIGS.delete(filepath); - } - let assertCache = false; +const runConfig = (0, _caching.makeWeakCache)(function* runConfig(options, cache) { + yield* []; + return { + options: (0, _rewriteStackTrace.endHiddenCallStack)(options)((0, _configApi.makeConfigAPI)(cache)), + cacheNeedsConfiguration: !cache.configured() + }; +}); +function* readConfigCode(filepath, data) { + if (!_fs().existsSync(filepath)) return null; + let options = yield* (0, _moduleTypes.default)(filepath, "You appear to be using a native ECMAScript module configuration " + "file, which is only supported when running Babel asynchronously."); + let cacheNeedsConfiguration = false; if (typeof options === "function") { - yield* []; - options = (0, _rewriteStackTrace.endHiddenCallStack)(options)((0, _configApi.makeConfigAPI)(cache)); - assertCache = true; + ({ + options, + cacheNeedsConfiguration + } = yield* runConfig(options, data)); } if (!options || typeof options !== "object" || Array.isArray(options)) { throw new _configError.default(`Configuration should be an exported JavaScript object.`, filepath); } - if (typeof options.then === "function") { + options.catch == null || options.catch(() => {}); throw new _configError.default(`You appear to be using an async configuration, ` + `which your current version of Babel does not support. ` + `We may add support for this in the future, ` + `but if you're on the most recent version of @babel/core and still ` + `seeing this error, then you'll need to synchronously return your config.`, filepath); } - if (assertCache && !cache.configured()) throwConfigError(filepath); - return { - filepath, - dirname: _path().dirname(filepath), - options - }; -}); + if (cacheNeedsConfiguration) throwConfigError(filepath); + return buildConfigFileObject(options, filepath); +} +const cfboaf = new WeakMap(); +function buildConfigFileObject(options, filepath) { + let configFilesByFilepath = cfboaf.get(options); + if (!configFilesByFilepath) { + cfboaf.set(options, configFilesByFilepath = new Map()); + } + let configFile = configFilesByFilepath.get(filepath); + if (!configFile) { + configFile = { + filepath, + dirname: _path().dirname(filepath), + options + }; + configFilesByFilepath.set(filepath, configFile); + } + return configFile; +} const packageToBabelConfig = (0, _caching.makeWeakCacheSync)(file => { const babel = file.options["babel"]; if (typeof babel === "undefined") return null; @@ -225,13 +218,20 @@ function* loadConfig(name, dirname, envName, caller) { debug("Loaded config %o from %o.", name, dirname); return conf; } - function readConfig(filepath, envName, caller) { const ext = _path().extname(filepath); - return ext === ".js" || ext === ".cjs" || ext === ".mjs" ? readConfigJS(filepath, { - envName, - caller - }) : readConfigJSON5(filepath); + switch (ext) { + case ".js": + case ".cjs": + case ".mjs": + case ".cts": + return readConfigCode(filepath, { + envName, + caller + }); + default: + return readConfigJSON5(filepath); + } } function* resolveShowConfigPath(dirname) { const targetPath = process.env.BABEL_SHOW_CONFIG_FOR; diff --git a/node_modules/@babel/core/lib/config/files/configuration.js.map b/node_modules/@babel/core/lib/config/files/configuration.js.map index fc29920cdefc..4be4ed4a2e3d 100644 --- a/node_modules/@babel/core/lib/config/files/configuration.js.map +++ b/node_modules/@babel/core/lib/config/files/configuration.js.map @@ -1 +1 @@ -{"version":3,"names":["debug","buildDebug","ROOT_CONFIG_FILENAMES","RELATIVE_CONFIG_FILENAMES","BABELIGNORE_FILENAME","LOADING_CONFIGS","Set","readConfigJS","makeStrongCache","filepath","cache","nodeFs","existsSync","never","has","dirname","path","options","add","loadCjsOrMjsDefault","delete","assertCache","endHiddenCallStack","makeConfigAPI","Array","isArray","ConfigError","then","configured","throwConfigError","packageToBabelConfig","makeWeakCacheSync","file","babel","readConfigJSON5","makeStaticFileCache","content","json5","parse","err","message","readIgnoreConfig","ignoreDir","ignorePatterns","split","map","line","replace","trim","filter","pattern","ignore","pathPatternToRegex","findConfigUpwards","rootDir","filename","join","nextDir","findRelativeConfig","packageData","envName","caller","config","loc","directories","loadOneConfig","pkg","ignoreLoc","findRootConfig","names","previousConfig","configs","gensync","all","readConfig","reduce","basename","loadConfig","name","paths","conf","ext","extname","resolveShowConfigPath","targetPath","process","env","BABEL_SHOW_CONFIG_FOR","absolutePath","resolve","stats","fs","stat","isFile","Error"],"sources":["../../../src/config/files/configuration.ts"],"sourcesContent":["import buildDebug from \"debug\";\nimport nodeFs from \"fs\";\nimport path from \"path\";\nimport json5 from \"json5\";\nimport gensync from \"gensync\";\nimport type { Handler } from \"gensync\";\nimport { makeStrongCache, makeWeakCacheSync } from \"../caching\";\nimport type { CacheConfigurator } from \"../caching\";\nimport { makeConfigAPI } from \"../helpers/config-api\";\nimport type { ConfigAPI } from \"../helpers/config-api\";\nimport { makeStaticFileCache } from \"./utils\";\nimport loadCjsOrMjsDefault from \"./module-types\";\nimport pathPatternToRegex from \"../pattern-to-regex\";\nimport type { FilePackageData, RelativeConfig, ConfigFile } from \"./types\";\nimport type { CallerMetadata } from \"../validation/options\";\nimport ConfigError from \"../../errors/config-error\";\n\nimport * as fs from \"../../gensync-utils/fs\";\n\nimport { createRequire } from \"module\";\nimport { endHiddenCallStack } from \"../../errors/rewrite-stack-trace\";\nconst require = createRequire(import.meta.url);\n\nconst debug = buildDebug(\"babel:config:loading:files:configuration\");\n\nexport const ROOT_CONFIG_FILENAMES = [\n \"babel.config.js\",\n \"babel.config.cjs\",\n \"babel.config.mjs\",\n \"babel.config.json\",\n];\nconst RELATIVE_CONFIG_FILENAMES = [\n \".babelrc\",\n \".babelrc.js\",\n \".babelrc.cjs\",\n \".babelrc.mjs\",\n \".babelrc.json\",\n];\n\nconst BABELIGNORE_FILENAME = \".babelignore\";\n\nconst LOADING_CONFIGS = new Set();\n\nconst readConfigJS = makeStrongCache(function* readConfigJS(\n filepath: string,\n cache: CacheConfigurator<{\n envName: string;\n caller: CallerMetadata | undefined;\n }>,\n): Handler {\n if (!nodeFs.existsSync(filepath)) {\n cache.never();\n return null;\n }\n\n // The `require()` call below can make this code reentrant if a require hook like @babel/register has been\n // loaded into the system. That would cause Babel to attempt to compile the `.babelrc.js` file as it loads\n // below. To cover this case, we auto-ignore re-entrant config processing.\n if (LOADING_CONFIGS.has(filepath)) {\n cache.never();\n\n debug(\"Auto-ignoring usage of config %o.\", filepath);\n return {\n filepath,\n dirname: path.dirname(filepath),\n options: {},\n };\n }\n\n let options: unknown;\n try {\n LOADING_CONFIGS.add(filepath);\n options = yield* loadCjsOrMjsDefault(\n filepath,\n \"You appear to be using a native ECMAScript module configuration \" +\n \"file, which is only supported when running Babel asynchronously.\",\n );\n } finally {\n LOADING_CONFIGS.delete(filepath);\n }\n\n let assertCache = false;\n if (typeof options === \"function\") {\n // @ts-expect-error - if we want to make it possible to use async configs\n yield* [];\n\n options = endHiddenCallStack(options as any as (api: ConfigAPI) => {})(\n makeConfigAPI(cache),\n );\n\n assertCache = true;\n }\n\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new ConfigError(\n `Configuration should be an exported JavaScript object.`,\n filepath,\n );\n }\n\n // @ts-expect-error todo(flow->ts)\n if (typeof options.then === \"function\") {\n throw new ConfigError(\n `You appear to be using an async configuration, ` +\n `which your current version of Babel does not support. ` +\n `We may add support for this in the future, ` +\n `but if you're on the most recent version of @babel/core and still ` +\n `seeing this error, then you'll need to synchronously return your config.`,\n filepath,\n );\n }\n\n if (assertCache && !cache.configured()) throwConfigError(filepath);\n\n return {\n filepath,\n dirname: path.dirname(filepath),\n options,\n };\n});\n\nconst packageToBabelConfig = makeWeakCacheSync(\n (file: ConfigFile): ConfigFile | null => {\n const babel: unknown = file.options[\"babel\"];\n\n if (typeof babel === \"undefined\") return null;\n\n if (typeof babel !== \"object\" || Array.isArray(babel) || babel === null) {\n throw new ConfigError(`.babel property must be an object`, file.filepath);\n }\n\n return {\n filepath: file.filepath,\n dirname: file.dirname,\n options: babel,\n };\n },\n);\n\nconst readConfigJSON5 = makeStaticFileCache((filepath, content): ConfigFile => {\n let options;\n try {\n options = json5.parse(content);\n } catch (err) {\n throw new ConfigError(\n `Error while parsing config - ${err.message}`,\n filepath,\n );\n }\n\n if (!options) throw new ConfigError(`No config detected`, filepath);\n\n if (typeof options !== \"object\") {\n throw new ConfigError(`Config returned typeof ${typeof options}`, filepath);\n }\n if (Array.isArray(options)) {\n throw new ConfigError(`Expected config object but found array`, filepath);\n }\n\n delete options[\"$schema\"];\n\n return {\n filepath,\n dirname: path.dirname(filepath),\n options,\n };\n});\n\nconst readIgnoreConfig = makeStaticFileCache((filepath, content) => {\n const ignoreDir = path.dirname(filepath);\n const ignorePatterns = content\n .split(\"\\n\")\n .map(line => line.replace(/#(.*?)$/, \"\").trim())\n .filter(line => !!line);\n\n for (const pattern of ignorePatterns) {\n if (pattern[0] === \"!\") {\n throw new ConfigError(\n `Negation of file paths is not supported.`,\n filepath,\n );\n }\n }\n\n return {\n filepath,\n dirname: path.dirname(filepath),\n ignore: ignorePatterns.map(pattern =>\n pathPatternToRegex(pattern, ignoreDir),\n ),\n };\n});\n\nexport function findConfigUpwards(rootDir: string): string | null {\n let dirname = rootDir;\n for (;;) {\n for (const filename of ROOT_CONFIG_FILENAMES) {\n if (nodeFs.existsSync(path.join(dirname, filename))) {\n return dirname;\n }\n }\n\n const nextDir = path.dirname(dirname);\n if (dirname === nextDir) break;\n dirname = nextDir;\n }\n\n return null;\n}\n\nexport function* findRelativeConfig(\n packageData: FilePackageData,\n envName: string,\n caller: CallerMetadata | undefined,\n): Handler {\n let config = null;\n let ignore = null;\n\n const dirname = path.dirname(packageData.filepath);\n\n for (const loc of packageData.directories) {\n if (!config) {\n config = yield* loadOneConfig(\n RELATIVE_CONFIG_FILENAMES,\n loc,\n envName,\n caller,\n packageData.pkg?.dirname === loc\n ? packageToBabelConfig(packageData.pkg as ConfigFile)\n : null,\n );\n }\n\n if (!ignore) {\n const ignoreLoc = path.join(loc, BABELIGNORE_FILENAME);\n ignore = yield* readIgnoreConfig(ignoreLoc);\n\n if (ignore) {\n debug(\"Found ignore %o from %o.\", ignore.filepath, dirname);\n }\n }\n }\n\n return { config, ignore };\n}\n\nexport function findRootConfig(\n dirname: string,\n envName: string,\n caller: CallerMetadata | undefined,\n): Handler {\n return loadOneConfig(ROOT_CONFIG_FILENAMES, dirname, envName, caller);\n}\n\nfunction* loadOneConfig(\n names: string[],\n dirname: string,\n envName: string,\n caller: CallerMetadata | undefined,\n previousConfig: ConfigFile | null = null,\n): Handler {\n const configs = yield* gensync.all(\n names.map(filename =>\n readConfig(path.join(dirname, filename), envName, caller),\n ),\n );\n const config = configs.reduce((previousConfig: ConfigFile | null, config) => {\n if (config && previousConfig) {\n throw new ConfigError(\n `Multiple configuration files found. Please remove one:\\n` +\n ` - ${path.basename(previousConfig.filepath)}\\n` +\n ` - ${config.filepath}\\n` +\n `from ${dirname}`,\n );\n }\n\n return config || previousConfig;\n }, previousConfig);\n\n if (config) {\n debug(\"Found configuration %o from %o.\", config.filepath, dirname);\n }\n return config;\n}\n\nexport function* loadConfig(\n name: string,\n dirname: string,\n envName: string,\n caller: CallerMetadata | undefined,\n): Handler {\n const filepath = require.resolve(name, { paths: [dirname] });\n\n const conf = yield* readConfig(filepath, envName, caller);\n if (!conf) {\n throw new ConfigError(\n `Config file contains no configuration data`,\n filepath,\n );\n }\n\n debug(\"Loaded config %o from %o.\", name, dirname);\n return conf;\n}\n\n/**\n * Read the given config file, returning the result. Returns null if no config was found, but will\n * throw if there are parsing errors while loading a config.\n */\nfunction readConfig(\n filepath: string,\n envName: string,\n caller: CallerMetadata | undefined,\n): Handler {\n const ext = path.extname(filepath);\n return ext === \".js\" || ext === \".cjs\" || ext === \".mjs\"\n ? readConfigJS(filepath, { envName, caller })\n : readConfigJSON5(filepath);\n}\n\nexport function* resolveShowConfigPath(\n dirname: string,\n): Handler {\n const targetPath = process.env.BABEL_SHOW_CONFIG_FOR;\n if (targetPath != null) {\n const absolutePath = path.resolve(dirname, targetPath);\n const stats = yield* fs.stat(absolutePath);\n if (!stats.isFile()) {\n throw new Error(\n `${absolutePath}: BABEL_SHOW_CONFIG_FOR must refer to a regular file, directories are not supported.`,\n );\n }\n return absolutePath;\n }\n return null;\n}\n\nfunction throwConfigError(filepath: string): never {\n throw new ConfigError(\n `\\\nCaching was left unconfigured. Babel's plugins, presets, and .babelrc.js files can be configured\nfor various types of caching, using the first param of their handler functions:\n\nmodule.exports = function(api) {\n // The API exposes the following:\n\n // Cache the returned value forever and don't call this function again.\n api.cache(true);\n\n // Don't cache at all. Not recommended because it will be very slow.\n api.cache(false);\n\n // Cached based on the value of some function. If this function returns a value different from\n // a previously-encountered value, the plugins will re-evaluate.\n var env = api.cache(() => process.env.NODE_ENV);\n\n // If testing for a specific env, we recommend specifics to avoid instantiating a plugin for\n // any possible NODE_ENV value that might come up during plugin execution.\n var isProd = api.cache(() => process.env.NODE_ENV === \"production\");\n\n // .cache(fn) will perform a linear search though instances to find the matching plugin based\n // based on previous instantiated plugins. If you want to recreate the plugin and discard the\n // previous instance whenever something changes, you may use:\n var isProd = api.cache.invalidate(() => process.env.NODE_ENV === \"production\");\n\n // Note, we also expose the following more-verbose versions of the above examples:\n api.cache.forever(); // api.cache(true)\n api.cache.never(); // api.cache(false)\n api.cache.using(fn); // api.cache(fn)\n\n // Return the value that will be cached.\n return { };\n};`,\n filepath,\n );\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_debug","data","require","_fs","_path","_json","_gensync","_caching","_configApi","_utils","_moduleTypes","_patternToRegex","_configError","fs","_rewriteStackTrace","debug","buildDebug","ROOT_CONFIG_FILENAMES","exports","RELATIVE_CONFIG_FILENAMES","BABELIGNORE_FILENAME","runConfig","makeWeakCache","options","cache","endHiddenCallStack","makeConfigAPI","cacheNeedsConfiguration","configured","readConfigCode","filepath","nodeFs","existsSync","loadCodeDefault","Array","isArray","ConfigError","then","catch","throwConfigError","buildConfigFileObject","cfboaf","WeakMap","configFilesByFilepath","get","set","Map","configFile","dirname","path","packageToBabelConfig","makeWeakCacheSync","file","babel","readConfigJSON5","makeStaticFileCache","content","json5","parse","err","message","readIgnoreConfig","ignoreDir","ignorePatterns","split","map","line","replace","trim","filter","pattern","ignore","pathPatternToRegex","findConfigUpwards","rootDir","filename","join","nextDir","findRelativeConfig","packageData","envName","caller","config","loc","directories","_packageData$pkg","loadOneConfig","pkg","ignoreLoc","findRootConfig","names","previousConfig","configs","gensync","all","readConfig","reduce","basename","loadConfig","name","v","w","process","versions","node","resolve","r","paths","b","M","f","_findPath","_nodeModulePaths","concat","Error","code","conf","ext","extname","resolveShowConfigPath","targetPath","env","BABEL_SHOW_CONFIG_FOR","absolutePath","stats","stat","isFile"],"sources":["../../../src/config/files/configuration.ts"],"sourcesContent":["import buildDebug from \"debug\";\nimport nodeFs from \"fs\";\nimport path from \"path\";\nimport json5 from \"json5\";\nimport gensync from \"gensync\";\nimport type { Handler } from \"gensync\";\nimport { makeWeakCache, makeWeakCacheSync } from \"../caching.ts\";\nimport type { CacheConfigurator } from \"../caching.ts\";\nimport { makeConfigAPI } from \"../helpers/config-api.ts\";\nimport type { ConfigAPI } from \"../helpers/config-api.ts\";\nimport { makeStaticFileCache } from \"./utils.ts\";\nimport loadCodeDefault from \"./module-types.ts\";\nimport pathPatternToRegex from \"../pattern-to-regex.ts\";\nimport type { FilePackageData, RelativeConfig, ConfigFile } from \"./types.ts\";\nimport type { CallerMetadata, InputOptions } from \"../validation/options.ts\";\nimport ConfigError from \"../../errors/config-error.ts\";\n\nimport * as fs from \"../../gensync-utils/fs.ts\";\n\nimport { createRequire } from \"module\";\nimport { endHiddenCallStack } from \"../../errors/rewrite-stack-trace.ts\";\nconst require = createRequire(import.meta.url);\n\nconst debug = buildDebug(\"babel:config:loading:files:configuration\");\n\nexport const ROOT_CONFIG_FILENAMES = [\n \"babel.config.js\",\n \"babel.config.cjs\",\n \"babel.config.mjs\",\n \"babel.config.json\",\n \"babel.config.cts\",\n];\nconst RELATIVE_CONFIG_FILENAMES = [\n \".babelrc\",\n \".babelrc.js\",\n \".babelrc.cjs\",\n \".babelrc.mjs\",\n \".babelrc.json\",\n \".babelrc.cts\",\n];\n\nconst BABELIGNORE_FILENAME = \".babelignore\";\n\ntype ConfigCacheData = {\n envName: string;\n caller: CallerMetadata | undefined;\n};\n\nconst runConfig = makeWeakCache(function* runConfig(\n options: Function,\n cache: CacheConfigurator,\n): Handler<{\n options: InputOptions | null;\n cacheNeedsConfiguration: boolean;\n}> {\n // @ts-expect-error - if we want to make it possible to use async configs\n yield* [];\n\n return {\n options: endHiddenCallStack(options as any as (api: ConfigAPI) => {})(\n makeConfigAPI(cache),\n ),\n cacheNeedsConfiguration: !cache.configured(),\n };\n});\n\nfunction* readConfigCode(\n filepath: string,\n data: ConfigCacheData,\n): Handler {\n if (!nodeFs.existsSync(filepath)) return null;\n\n let options = yield* loadCodeDefault(\n filepath,\n \"You appear to be using a native ECMAScript module configuration \" +\n \"file, which is only supported when running Babel asynchronously.\",\n );\n\n let cacheNeedsConfiguration = false;\n if (typeof options === \"function\") {\n ({ options, cacheNeedsConfiguration } = yield* runConfig(options, data));\n }\n\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new ConfigError(\n `Configuration should be an exported JavaScript object.`,\n filepath,\n );\n }\n\n // @ts-expect-error todo(flow->ts)\n if (typeof options.then === \"function\") {\n // @ts-expect-error We use ?. in case options is a thenable\n // but not a promise\n options.catch?.(() => {});\n\n throw new ConfigError(\n `You appear to be using an async configuration, ` +\n `which your current version of Babel does not support. ` +\n `We may add support for this in the future, ` +\n `but if you're on the most recent version of @babel/core and still ` +\n `seeing this error, then you'll need to synchronously return your config.`,\n filepath,\n );\n }\n\n if (cacheNeedsConfiguration) throwConfigError(filepath);\n\n return buildConfigFileObject(options, filepath);\n}\n\n// We cache the generated ConfigFile object rather than creating a new one\n// every time, so that it can be used as a cache key in other functions.\nconst cfboaf /* configFilesByOptionsAndFilepath */ = new WeakMap<\n InputOptions,\n Map\n>();\nfunction buildConfigFileObject(\n options: InputOptions,\n filepath: string,\n): ConfigFile {\n let configFilesByFilepath = cfboaf.get(options);\n if (!configFilesByFilepath) {\n cfboaf.set(options, (configFilesByFilepath = new Map()));\n }\n\n let configFile = configFilesByFilepath.get(filepath);\n if (!configFile) {\n configFile = {\n filepath,\n dirname: path.dirname(filepath),\n options,\n };\n configFilesByFilepath.set(filepath, configFile);\n }\n\n return configFile;\n}\n\nconst packageToBabelConfig = makeWeakCacheSync(\n (file: ConfigFile): ConfigFile | null => {\n const babel: unknown = file.options[\"babel\"];\n\n if (typeof babel === \"undefined\") return null;\n\n if (typeof babel !== \"object\" || Array.isArray(babel) || babel === null) {\n throw new ConfigError(`.babel property must be an object`, file.filepath);\n }\n\n return {\n filepath: file.filepath,\n dirname: file.dirname,\n options: babel,\n };\n },\n);\n\nconst readConfigJSON5 = makeStaticFileCache((filepath, content): ConfigFile => {\n let options;\n try {\n options = json5.parse(content);\n } catch (err) {\n throw new ConfigError(\n `Error while parsing config - ${err.message}`,\n filepath,\n );\n }\n\n if (!options) throw new ConfigError(`No config detected`, filepath);\n\n if (typeof options !== \"object\") {\n throw new ConfigError(`Config returned typeof ${typeof options}`, filepath);\n }\n if (Array.isArray(options)) {\n throw new ConfigError(`Expected config object but found array`, filepath);\n }\n\n delete options[\"$schema\"];\n\n return {\n filepath,\n dirname: path.dirname(filepath),\n options,\n };\n});\n\nconst readIgnoreConfig = makeStaticFileCache((filepath, content) => {\n const ignoreDir = path.dirname(filepath);\n const ignorePatterns = content\n .split(\"\\n\")\n .map(line => line.replace(/#(.*?)$/, \"\").trim())\n .filter(line => !!line);\n\n for (const pattern of ignorePatterns) {\n if (pattern[0] === \"!\") {\n throw new ConfigError(\n `Negation of file paths is not supported.`,\n filepath,\n );\n }\n }\n\n return {\n filepath,\n dirname: path.dirname(filepath),\n ignore: ignorePatterns.map(pattern =>\n pathPatternToRegex(pattern, ignoreDir),\n ),\n };\n});\n\nexport function findConfigUpwards(rootDir: string): string | null {\n let dirname = rootDir;\n for (;;) {\n for (const filename of ROOT_CONFIG_FILENAMES) {\n if (nodeFs.existsSync(path.join(dirname, filename))) {\n return dirname;\n }\n }\n\n const nextDir = path.dirname(dirname);\n if (dirname === nextDir) break;\n dirname = nextDir;\n }\n\n return null;\n}\n\nexport function* findRelativeConfig(\n packageData: FilePackageData,\n envName: string,\n caller: CallerMetadata | undefined,\n): Handler {\n let config = null;\n let ignore = null;\n\n const dirname = path.dirname(packageData.filepath);\n\n for (const loc of packageData.directories) {\n if (!config) {\n config = yield* loadOneConfig(\n RELATIVE_CONFIG_FILENAMES,\n loc,\n envName,\n caller,\n packageData.pkg?.dirname === loc\n ? packageToBabelConfig(packageData.pkg)\n : null,\n );\n }\n\n if (!ignore) {\n const ignoreLoc = path.join(loc, BABELIGNORE_FILENAME);\n ignore = yield* readIgnoreConfig(ignoreLoc);\n\n if (ignore) {\n debug(\"Found ignore %o from %o.\", ignore.filepath, dirname);\n }\n }\n }\n\n return { config, ignore };\n}\n\nexport function findRootConfig(\n dirname: string,\n envName: string,\n caller: CallerMetadata | undefined,\n): Handler {\n return loadOneConfig(ROOT_CONFIG_FILENAMES, dirname, envName, caller);\n}\n\nfunction* loadOneConfig(\n names: string[],\n dirname: string,\n envName: string,\n caller: CallerMetadata | undefined,\n previousConfig: ConfigFile | null = null,\n): Handler {\n const configs = yield* gensync.all(\n names.map(filename =>\n readConfig(path.join(dirname, filename), envName, caller),\n ),\n );\n const config = configs.reduce((previousConfig: ConfigFile | null, config) => {\n if (config && previousConfig) {\n throw new ConfigError(\n `Multiple configuration files found. Please remove one:\\n` +\n ` - ${path.basename(previousConfig.filepath)}\\n` +\n ` - ${config.filepath}\\n` +\n `from ${dirname}`,\n );\n }\n\n return config || previousConfig;\n }, previousConfig);\n\n if (config) {\n debug(\"Found configuration %o from %o.\", config.filepath, dirname);\n }\n return config;\n}\n\nexport function* loadConfig(\n name: string,\n dirname: string,\n envName: string,\n caller: CallerMetadata | undefined,\n): Handler {\n const filepath = require.resolve(name, { paths: [dirname] });\n\n const conf = yield* readConfig(filepath, envName, caller);\n if (!conf) {\n throw new ConfigError(\n `Config file contains no configuration data`,\n filepath,\n );\n }\n\n debug(\"Loaded config %o from %o.\", name, dirname);\n return conf;\n}\n\n/**\n * Read the given config file, returning the result. Returns null if no config was found, but will\n * throw if there are parsing errors while loading a config.\n */\nfunction readConfig(\n filepath: string,\n envName: string,\n caller: CallerMetadata | undefined,\n): Handler {\n const ext = path.extname(filepath);\n switch (ext) {\n case \".js\":\n case \".cjs\":\n case \".mjs\":\n case \".cts\":\n return readConfigCode(filepath, { envName, caller });\n default:\n return readConfigJSON5(filepath);\n }\n}\n\nexport function* resolveShowConfigPath(\n dirname: string,\n): Handler {\n const targetPath = process.env.BABEL_SHOW_CONFIG_FOR;\n if (targetPath != null) {\n const absolutePath = path.resolve(dirname, targetPath);\n const stats = yield* fs.stat(absolutePath);\n if (!stats.isFile()) {\n throw new Error(\n `${absolutePath}: BABEL_SHOW_CONFIG_FOR must refer to a regular file, directories are not supported.`,\n );\n }\n return absolutePath;\n }\n return null;\n}\n\nfunction throwConfigError(filepath: string): never {\n throw new ConfigError(\n `\\\nCaching was left unconfigured. Babel's plugins, presets, and .babelrc.js files can be configured\nfor various types of caching, using the first param of their handler functions:\n\nmodule.exports = function(api) {\n // The API exposes the following:\n\n // Cache the returned value forever and don't call this function again.\n api.cache(true);\n\n // Don't cache at all. Not recommended because it will be very slow.\n api.cache(false);\n\n // Cached based on the value of some function. If this function returns a value different from\n // a previously-encountered value, the plugins will re-evaluate.\n var env = api.cache(() => process.env.NODE_ENV);\n\n // If testing for a specific env, we recommend specifics to avoid instantiating a plugin for\n // any possible NODE_ENV value that might come up during plugin execution.\n var isProd = api.cache(() => process.env.NODE_ENV === \"production\");\n\n // .cache(fn) will perform a linear search though instances to find the matching plugin based\n // based on previous instantiated plugins. If you want to recreate the plugin and discard the\n // previous instance whenever something changes, you may use:\n var isProd = api.cache.invalidate(() => process.env.NODE_ENV === \"production\");\n\n // Note, we also expose the following more-verbose versions of the above examples:\n api.cache.forever(); // api.cache(true)\n api.cache.never(); // api.cache(false)\n api.cache.using(fn); // api.cache(fn)\n\n // Return the value that will be cached.\n return { };\n};`,\n filepath,\n );\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/files/import-meta-resolve.js b/node_modules/@babel/core/lib/config/files/import-meta-resolve.js deleted file mode 100644 index a003681d6472..000000000000 --- a/node_modules/@babel/core/lib/config/files/import-meta-resolve.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = resolve; -function _module() { - const data = require("module"); - _module = function () { - return data; - }; - return data; -} -var _importMetaResolve = require("../../vendor/import-meta-resolve"); -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } -let import_; -try { - import_ = require("./import.cjs"); -} catch (_unused) {} - -const importMetaResolveP = import_ && -process.execArgv.includes("--experimental-import-meta-resolve") ? import_("data:text/javascript,export default import.meta.resolve").then(m => m.default || _importMetaResolve.resolve, () => _importMetaResolve.resolve) : Promise.resolve(_importMetaResolve.resolve); -function resolve(_x, _x2) { - return _resolve.apply(this, arguments); -} -function _resolve() { - _resolve = _asyncToGenerator(function* (specifier, parent) { - return (yield importMetaResolveP)(specifier, parent); - }); - return _resolve.apply(this, arguments); -} -0 && 0; - -//# sourceMappingURL=import-meta-resolve.js.map diff --git a/node_modules/@babel/core/lib/config/files/import-meta-resolve.js.map b/node_modules/@babel/core/lib/config/files/import-meta-resolve.js.map deleted file mode 100644 index 5f005ab468cb..000000000000 --- a/node_modules/@babel/core/lib/config/files/import-meta-resolve.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"names":["import_","require","importMetaResolveP","process","execArgv","includes","then","m","default","polyfill","Promise","resolve","specifier","parent"],"sources":["../../../src/config/files/import-meta-resolve.ts"],"sourcesContent":["import { createRequire } from \"module\";\nimport { resolve as polyfill } from \"../../vendor/import-meta-resolve\";\n\nconst require = createRequire(import.meta.url);\n\nlet import_;\ntry {\n // Node < 13.3 doesn't support import() syntax.\n import_ = require(\"./import.cjs\");\n} catch {}\n\n// import.meta.resolve is only available in ESM, but this file is compiled to CJS.\n// We can extract it using dynamic import.\nconst importMetaResolveP: Promise =\n import_ &&\n // Due to a Node.js/V8 bug (https://github.com/nodejs/node/issues/35889), we cannot\n // use always dynamic import because it segfaults when running in a Node.js `vm` context,\n // which is used by the default Jest environment and by webpack-cli.\n //\n // However, import.meta.resolve is experimental and only enabled when Node.js is run\n // with the `--experimental-import-meta-resolve` flag: we can avoid calling import()\n // when that flag is not enabled, so that the default behavior never segfaults.\n //\n // Hopefully, before Node.js unflags import.meta.resolve, either:\n // - we will move to ESM, so that we have direct access to import.meta.resolve, or\n // - the V8 bug will be fixed so that we can safely use dynamic import by default.\n //\n // I (@nicolo-ribaudo) am really anoyed by this bug, because there is no known\n // work-around other than \"don't use dynamic import if you are running in a `vm` context\",\n // but there is no reliable way to detect it (you cannot try/catch segfaults).\n //\n // This is the only place where we *need* to use dynamic import because we need to access\n // an ES module. All the other places will first try using require() and *then*, if\n // it throws because it's a module, will fallback to import().\n process.execArgv.includes(\"--experimental-import-meta-resolve\")\n ? import_(\"data:text/javascript,export default import.meta.resolve\").then(\n (m: { default: ImportMeta[\"resolve\"] | undefined }) =>\n m.default || polyfill,\n () => polyfill,\n )\n : Promise.resolve(polyfill);\n\nexport default async function resolve(\n specifier: Parameters[0],\n parent?: Parameters[1],\n): ReturnType {\n return (await importMetaResolveP)(specifier, parent);\n}\n"],"mappings":";;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;AAAuE;AAAA;AAIvE,IAAIA,OAAO;AACX,IAAI;EAEFA,OAAO,GAAGC,OAAO,CAAC,cAAc,CAAC;AACnC,CAAC,CAAC,gBAAM,CAAC;;AAIT,MAAMC,kBAAkD,GACtDF,OAAO;AAoBPG,OAAO,CAACC,QAAQ,CAACC,QAAQ,CAAC,oCAAoC,CAAC,GAC3DL,OAAO,CAAC,yDAAyD,CAAC,CAACM,IAAI,CACpEC,CAAiD,IAChDA,CAAC,CAACC,OAAO,IAAIC,0BAAQ,EACvB,MAAMA,0BAAQ,CACf,GACDC,OAAO,CAACC,OAAO,CAACF,0BAAQ,CAAC;AAAC,SAEFE,OAAO;EAAA;AAAA;AAAA;EAAA,6BAAtB,WACbC,SAA+C,EAC/CC,MAA6C,EACV;IACnC,OAAO,OAAOX,kBAAkB,EAAEU,SAAS,EAAEC,MAAM,CAAC;EACtD,CAAC;EAAA;AAAA;AAAA"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/files/import.cjs b/node_modules/@babel/core/lib/config/files/import.cjs index a298b0acaff0..46fa5d5cfc41 100644 --- a/node_modules/@babel/core/lib/config/files/import.cjs +++ b/node_modules/@babel/core/lib/config/files/import.cjs @@ -1,5 +1,3 @@ - - module.exports = function import_(filepath) { return import(filepath); }; diff --git a/node_modules/@babel/core/lib/config/files/import.cjs.map b/node_modules/@babel/core/lib/config/files/import.cjs.map index fcb50bd3b7a8..1b6ff69124ae 100644 --- a/node_modules/@babel/core/lib/config/files/import.cjs.map +++ b/node_modules/@babel/core/lib/config/files/import.cjs.map @@ -1 +1 @@ -{"version":3,"names":["module","exports","import_","filepath"],"sources":["../../../src/config/files/import.cjs"],"sourcesContent":["// We keep this in a separate file so that in older node versions, where\n// import() isn't supported, we can try/catch around the require() call\n// when loading this file.\n\nmodule.exports = function import_(filepath) {\n return import(filepath);\n};\n"],"mappings":";;AAIAA,MAAM,CAACC,OAAO,GAAG,SAASC,OAAO,CAACC,QAAQ,EAAE;EAC1C,OAAO,MAAM,CAACA,QAAQ,CAAC;AACzB,CAAC;AAAC"} \ No newline at end of file +{"version":3,"names":["module","exports","import_","filepath"],"sources":["../../../src/config/files/import.cjs"],"sourcesContent":["// We keep this in a separate file so that in older node versions, where\n// import() isn't supported, we can try/catch around the require() call\n// when loading this file.\n\nmodule.exports = function import_(filepath) {\n return import(filepath);\n};\n"],"mappings":"AAIAA,MAAM,CAACC,OAAO,GAAG,SAASC,OAAOA,CAACC,QAAQ,EAAE;EAC1C,OAAO,OAAOA,QAAQ,CAAC;AACzB,CAAC;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/files/index-browser.js b/node_modules/@babel/core/lib/config/files/index-browser.js index fd5b7109b0d4..d8ba7dbc8d7e 100644 --- a/node_modules/@babel/core/lib/config/files/index-browser.js +++ b/node_modules/@babel/core/lib/config/files/index-browser.js @@ -14,11 +14,9 @@ exports.loadPreset = loadPreset; exports.resolvePlugin = resolvePlugin; exports.resolvePreset = resolvePreset; exports.resolveShowConfigPath = resolveShowConfigPath; -function findConfigUpwards( -rootDir) { +function findConfigUpwards(rootDir) { return null; } - function* findPackageData(filepath) { return { filepath, @@ -27,41 +25,25 @@ function* findPackageData(filepath) { isPackage: false }; } - -function* findRelativeConfig( -pkgData, -envName, -caller) { +function* findRelativeConfig(pkgData, envName, caller) { return { config: null, ignore: null }; } - -function* findRootConfig( -dirname, -envName, -caller) { +function* findRootConfig(dirname, envName, caller) { return null; } - -function* loadConfig(name, dirname, -envName, -caller) { +function* loadConfig(name, dirname, envName, caller) { throw new Error(`Cannot load ${name} relative to ${dirname} in a browser`); } - -function* resolveShowConfigPath( -dirname) { +function* resolveShowConfigPath(dirname) { return null; } -const ROOT_CONFIG_FILENAMES = []; - -exports.ROOT_CONFIG_FILENAMES = ROOT_CONFIG_FILENAMES; +const ROOT_CONFIG_FILENAMES = exports.ROOT_CONFIG_FILENAMES = []; function resolvePlugin(name, dirname) { return null; } - function resolvePreset(name, dirname) { return null; } diff --git a/node_modules/@babel/core/lib/config/files/index-browser.js.map b/node_modules/@babel/core/lib/config/files/index-browser.js.map index bd7e21315049..90fbcc8a49cb 100644 --- a/node_modules/@babel/core/lib/config/files/index-browser.js.map +++ b/node_modules/@babel/core/lib/config/files/index-browser.js.map @@ -1 +1 @@ -{"version":3,"names":["findConfigUpwards","rootDir","findPackageData","filepath","directories","pkg","isPackage","findRelativeConfig","pkgData","envName","caller","config","ignore","findRootConfig","dirname","loadConfig","name","Error","resolveShowConfigPath","ROOT_CONFIG_FILENAMES","resolvePlugin","resolvePreset","loadPlugin","loadPreset"],"sources":["../../../src/config/files/index-browser.ts"],"sourcesContent":["import type { Handler } from \"gensync\";\n\nimport type {\n ConfigFile,\n IgnoreFile,\n RelativeConfig,\n FilePackageData,\n} from \"./types\";\n\nimport type { CallerMetadata } from \"../validation/options\";\n\nexport type { ConfigFile, IgnoreFile, RelativeConfig, FilePackageData };\n\nexport function findConfigUpwards(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n rootDir: string,\n): string | null {\n return null;\n}\n\n// eslint-disable-next-line require-yield\nexport function* findPackageData(filepath: string): Handler {\n return {\n filepath,\n directories: [],\n pkg: null,\n isPackage: false,\n };\n}\n\n// eslint-disable-next-line require-yield\nexport function* findRelativeConfig(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n pkgData: FilePackageData,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n envName: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n caller: CallerMetadata | undefined,\n): Handler {\n return { config: null, ignore: null };\n}\n\n// eslint-disable-next-line require-yield\nexport function* findRootConfig(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n dirname: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n envName: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n caller: CallerMetadata | undefined,\n): Handler {\n return null;\n}\n\n// eslint-disable-next-line require-yield\nexport function* loadConfig(\n name: string,\n dirname: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n envName: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n caller: CallerMetadata | undefined,\n): Handler {\n throw new Error(`Cannot load ${name} relative to ${dirname} in a browser`);\n}\n\n// eslint-disable-next-line require-yield\nexport function* resolveShowConfigPath(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n dirname: string,\n): Handler {\n return null;\n}\n\nexport const ROOT_CONFIG_FILENAMES: string[] = [];\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function resolvePlugin(name: string, dirname: string): string | null {\n return null;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function resolvePreset(name: string, dirname: string): string | null {\n return null;\n}\n\nexport function loadPlugin(\n name: string,\n dirname: string,\n): Handler<{\n filepath: string;\n value: unknown;\n}> {\n throw new Error(\n `Cannot load plugin ${name} relative to ${dirname} in a browser`,\n );\n}\n\nexport function loadPreset(\n name: string,\n dirname: string,\n): Handler<{\n filepath: string;\n value: unknown;\n}> {\n throw new Error(\n `Cannot load preset ${name} relative to ${dirname} in a browser`,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAaO,SAASA,iBAAiB;AAE/BC,OAAe,EACA;EACf,OAAO,IAAI;AACb;;AAGO,UAAUC,eAAe,CAACC,QAAgB,EAA4B;EAC3E,OAAO;IACLA,QAAQ;IACRC,WAAW,EAAE,EAAE;IACfC,GAAG,EAAE,IAAI;IACTC,SAAS,EAAE;EACb,CAAC;AACH;;AAGO,UAAUC,kBAAkB;AAEjCC,OAAwB;AAExBC,OAAe;AAEfC,MAAkC,EACT;EACzB,OAAO;IAAEC,MAAM,EAAE,IAAI;IAAEC,MAAM,EAAE;EAAK,CAAC;AACvC;;AAGO,UAAUC,cAAc;AAE7BC,OAAe;AAEfL,OAAe;AAEfC,MAAkC,EACN;EAC5B,OAAO,IAAI;AACb;;AAGO,UAAUK,UAAU,CACzBC,IAAY,EACZF,OAAe;AAEfL,OAAe;AAEfC,MAAkC,EACb;EACrB,MAAM,IAAIO,KAAK,CAAE,eAAcD,IAAK,gBAAeF,OAAQ,eAAc,CAAC;AAC5E;;AAGO,UAAUI,qBAAqB;AAEpCJ,OAAe,EACS;EACxB,OAAO,IAAI;AACb;AAEO,MAAMK,qBAA+B,GAAG,EAAE;;AAAC;AAG3C,SAASC,aAAa,CAACJ,IAAY,EAAEF,OAAe,EAAiB;EAC1E,OAAO,IAAI;AACb;;AAGO,SAASO,aAAa,CAACL,IAAY,EAAEF,OAAe,EAAiB;EAC1E,OAAO,IAAI;AACb;AAEO,SAASQ,UAAU,CACxBN,IAAY,EACZF,OAAe,EAId;EACD,MAAM,IAAIG,KAAK,CACZ,sBAAqBD,IAAK,gBAAeF,OAAQ,eAAc,CACjE;AACH;AAEO,SAASS,UAAU,CACxBP,IAAY,EACZF,OAAe,EAId;EACD,MAAM,IAAIG,KAAK,CACZ,sBAAqBD,IAAK,gBAAeF,OAAQ,eAAc,CACjE;AACH;AAAC"} \ No newline at end of file +{"version":3,"names":["findConfigUpwards","rootDir","findPackageData","filepath","directories","pkg","isPackage","findRelativeConfig","pkgData","envName","caller","config","ignore","findRootConfig","dirname","loadConfig","name","Error","resolveShowConfigPath","ROOT_CONFIG_FILENAMES","exports","resolvePlugin","resolvePreset","loadPlugin","loadPreset"],"sources":["../../../src/config/files/index-browser.ts"],"sourcesContent":["import type { Handler } from \"gensync\";\n\nimport type {\n ConfigFile,\n IgnoreFile,\n RelativeConfig,\n FilePackageData,\n} from \"./types.ts\";\n\nimport type { CallerMetadata } from \"../validation/options.ts\";\n\nexport type { ConfigFile, IgnoreFile, RelativeConfig, FilePackageData };\n\nexport function findConfigUpwards(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n rootDir: string,\n): string | null {\n return null;\n}\n\n// eslint-disable-next-line require-yield\nexport function* findPackageData(filepath: string): Handler {\n return {\n filepath,\n directories: [],\n pkg: null,\n isPackage: false,\n };\n}\n\n// eslint-disable-next-line require-yield\nexport function* findRelativeConfig(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n pkgData: FilePackageData,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n envName: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n caller: CallerMetadata | undefined,\n): Handler {\n return { config: null, ignore: null };\n}\n\n// eslint-disable-next-line require-yield\nexport function* findRootConfig(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n dirname: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n envName: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n caller: CallerMetadata | undefined,\n): Handler {\n return null;\n}\n\n// eslint-disable-next-line require-yield\nexport function* loadConfig(\n name: string,\n dirname: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n envName: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n caller: CallerMetadata | undefined,\n): Handler {\n throw new Error(`Cannot load ${name} relative to ${dirname} in a browser`);\n}\n\n// eslint-disable-next-line require-yield\nexport function* resolveShowConfigPath(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n dirname: string,\n): Handler {\n return null;\n}\n\nexport const ROOT_CONFIG_FILENAMES: string[] = [];\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function resolvePlugin(name: string, dirname: string): string | null {\n return null;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function resolvePreset(name: string, dirname: string): string | null {\n return null;\n}\n\nexport function loadPlugin(\n name: string,\n dirname: string,\n): Handler<{\n filepath: string;\n value: unknown;\n}> {\n throw new Error(\n `Cannot load plugin ${name} relative to ${dirname} in a browser`,\n );\n}\n\nexport function loadPreset(\n name: string,\n dirname: string,\n): Handler<{\n filepath: string;\n value: unknown;\n}> {\n throw new Error(\n `Cannot load preset ${name} relative to ${dirname} in a browser`,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAaO,SAASA,iBAAiBA,CAE/BC,OAAe,EACA;EACf,OAAO,IAAI;AACb;AAGO,UAAUC,eAAeA,CAACC,QAAgB,EAA4B;EAC3E,OAAO;IACLA,QAAQ;IACRC,WAAW,EAAE,EAAE;IACfC,GAAG,EAAE,IAAI;IACTC,SAAS,EAAE;EACb,CAAC;AACH;AAGO,UAAUC,kBAAkBA,CAEjCC,OAAwB,EAExBC,OAAe,EAEfC,MAAkC,EACT;EACzB,OAAO;IAAEC,MAAM,EAAE,IAAI;IAAEC,MAAM,EAAE;EAAK,CAAC;AACvC;AAGO,UAAUC,cAAcA,CAE7BC,OAAe,EAEfL,OAAe,EAEfC,MAAkC,EACN;EAC5B,OAAO,IAAI;AACb;AAGO,UAAUK,UAAUA,CACzBC,IAAY,EACZF,OAAe,EAEfL,OAAe,EAEfC,MAAkC,EACb;EACrB,MAAM,IAAIO,KAAK,CAAE,eAAcD,IAAK,gBAAeF,OAAQ,eAAc,CAAC;AAC5E;AAGO,UAAUI,qBAAqBA,CAEpCJ,OAAe,EACS;EACxB,OAAO,IAAI;AACb;AAEO,MAAMK,qBAA+B,GAAAC,OAAA,CAAAD,qBAAA,GAAG,EAAE;AAG1C,SAASE,aAAaA,CAACL,IAAY,EAAEF,OAAe,EAAiB;EAC1E,OAAO,IAAI;AACb;AAGO,SAASQ,aAAaA,CAACN,IAAY,EAAEF,OAAe,EAAiB;EAC1E,OAAO,IAAI;AACb;AAEO,SAASS,UAAUA,CACxBP,IAAY,EACZF,OAAe,EAId;EACD,MAAM,IAAIG,KAAK,CACZ,sBAAqBD,IAAK,gBAAeF,OAAQ,eACpD,CAAC;AACH;AAEO,SAASU,UAAUA,CACxBR,IAAY,EACZF,OAAe,EAId;EACD,MAAM,IAAIG,KAAK,CACZ,sBAAqBD,IAAK,gBAAeF,OAAQ,eACpD,CAAC;AACH;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/files/index.js b/node_modules/@babel/core/lib/config/files/index.js index f93e6b22ba1d..8750f40a9c80 100644 --- a/node_modules/@babel/core/lib/config/files/index.js +++ b/node_modules/@babel/core/lib/config/files/index.js @@ -42,37 +42,37 @@ Object.defineProperty(exports, "loadConfig", { Object.defineProperty(exports, "loadPlugin", { enumerable: true, get: function () { - return plugins.loadPlugin; + return _plugins.loadPlugin; } }); Object.defineProperty(exports, "loadPreset", { enumerable: true, get: function () { - return plugins.loadPreset; + return _plugins.loadPreset; + } +}); +Object.defineProperty(exports, "resolvePlugin", { + enumerable: true, + get: function () { + return _plugins.resolvePlugin; + } +}); +Object.defineProperty(exports, "resolvePreset", { + enumerable: true, + get: function () { + return _plugins.resolvePreset; } }); -exports.resolvePreset = exports.resolvePlugin = void 0; Object.defineProperty(exports, "resolveShowConfigPath", { enumerable: true, get: function () { return _configuration.resolveShowConfigPath; } }); -var _package = require("./package"); -var _configuration = require("./configuration"); -var plugins = require("./plugins"); -function _gensync() { - const data = require("gensync"); - _gensync = function () { - return data; - }; - return data; -} +var _package = require("./package.js"); +var _configuration = require("./configuration.js"); +var _plugins = require("./plugins.js"); ({}); -const resolvePlugin = _gensync()(plugins.resolvePlugin).sync; -exports.resolvePlugin = resolvePlugin; -const resolvePreset = _gensync()(plugins.resolvePreset).sync; -exports.resolvePreset = resolvePreset; 0 && 0; //# sourceMappingURL=index.js.map diff --git a/node_modules/@babel/core/lib/config/files/index.js.map b/node_modules/@babel/core/lib/config/files/index.js.map index 1add0a6d3699..24110f75a1b9 100644 --- a/node_modules/@babel/core/lib/config/files/index.js.map +++ b/node_modules/@babel/core/lib/config/files/index.js.map @@ -1 +1 @@ -{"version":3,"names":["resolvePlugin","gensync","plugins","sync","resolvePreset"],"sources":["../../../src/config/files/index.ts"],"sourcesContent":["type indexBrowserType = typeof import(\"./index-browser\");\ntype indexType = typeof import(\"./index\");\n\n// Kind of gross, but essentially asserting that the exports of this module are the same as the\n// exports of index-browser, since this file may be replaced at bundle time with index-browser.\n({} as any as indexBrowserType as indexType);\n\nexport { findPackageData } from \"./package\";\n\nexport {\n findConfigUpwards,\n findRelativeConfig,\n findRootConfig,\n loadConfig,\n resolveShowConfigPath,\n ROOT_CONFIG_FILENAMES,\n} from \"./configuration\";\nexport type {\n ConfigFile,\n IgnoreFile,\n RelativeConfig,\n FilePackageData,\n} from \"./types\";\nexport { loadPlugin, loadPreset } from \"./plugins\";\n\nimport gensync from \"gensync\";\nimport * as plugins from \"./plugins\";\n\nexport const resolvePlugin = gensync(plugins.resolvePlugin).sync;\nexport const resolvePreset = gensync(plugins.resolvePreset).sync;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA;AAEA;AAcA;AAEA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AApBA,CAAC,CAAC,CAAC;AAuBI,MAAMA,aAAa,GAAGC,UAAO,CAACC,OAAO,CAACF,aAAa,CAAC,CAACG,IAAI;AAAC;AAC1D,MAAMC,aAAa,GAAGH,UAAO,CAACC,OAAO,CAACE,aAAa,CAAC,CAACD,IAAI;AAAC;AAAA"} \ No newline at end of file +{"version":3,"names":["_package","require","_configuration","_plugins"],"sources":["../../../src/config/files/index.ts"],"sourcesContent":["type indexBrowserType = typeof import(\"./index-browser\");\ntype indexType = typeof import(\"./index\");\n\n// Kind of gross, but essentially asserting that the exports of this module are the same as the\n// exports of index-browser, since this file may be replaced at bundle time with index-browser.\n({}) as any as indexBrowserType as indexType;\n\nexport { findPackageData } from \"./package.ts\";\n\nexport {\n findConfigUpwards,\n findRelativeConfig,\n findRootConfig,\n loadConfig,\n resolveShowConfigPath,\n ROOT_CONFIG_FILENAMES,\n} from \"./configuration.ts\";\nexport type {\n ConfigFile,\n IgnoreFile,\n RelativeConfig,\n FilePackageData,\n} from \"./types.ts\";\nexport {\n loadPlugin,\n loadPreset,\n resolvePlugin,\n resolvePreset,\n} from \"./plugins.ts\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,IAAAA,QAAA,GAAAC,OAAA;AAEA,IAAAC,cAAA,GAAAD,OAAA;AAcA,IAAAE,QAAA,GAAAF,OAAA;AAlBA,CAAC,CAAC,CAAC;AAA0C"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/files/module-types.js b/node_modules/@babel/core/lib/config/files/module-types.js index eefe3ea05edf..e27f442923be 100644 --- a/node_modules/@babel/core/lib/config/files/module-types.js +++ b/node_modules/@babel/core/lib/config/files/module-types.js @@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = loadCjsOrMjsDefault; +exports.default = loadCodeDefault; exports.supportsESM = void 0; -var _async = require("../../gensync-utils/async"); +var _async = require("../../gensync-utils/async.js"); function _path() { const data = require("path"); _path = function () { @@ -20,63 +20,119 @@ function _url() { }; return data; } -function _module() { - const data = require("module"); - _module = function () { +function _semver() { + const data = require("semver"); + _semver = function () { return data; }; return data; } -function _semver() { - const data = require("semver"); - _semver = function () { +function _debug() { + const data = require("debug"); + _debug = function () { return data; }; return data; } -var _rewriteStackTrace = require("../../errors/rewrite-stack-trace"); -var _configError = require("../../errors/config-error"); +var _rewriteStackTrace = require("../../errors/rewrite-stack-trace.js"); +var _configError = require("../../errors/config-error.js"); +var _transformFile = require("../../transform-file.js"); function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +const debug = _debug()("babel:config:loading:files:module-types"); let import_; try { import_ = require("./import.cjs"); } catch (_unused) {} -const supportsESM = _semver().satisfies(process.versions.node, -"^12.17 || >=13.2"); -exports.supportsESM = supportsESM; -function* loadCjsOrMjsDefault(filepath, asyncError, -fallbackToTranspiledModule = false) { - switch (guessJSModuleType(filepath)) { - case "cjs": - return loadCjsDefault(filepath, fallbackToTranspiledModule); - case "unknown": +const supportsESM = exports.supportsESM = _semver().satisfies(process.versions.node, "^12.17 || >=13.2"); +function* loadCodeDefault(filepath, asyncError) { + switch (_path().extname(filepath)) { + case ".cjs": + { + return loadCjsDefault(filepath, arguments[2]); + } + case ".mjs": + break; + case ".cts": + return loadCtsDefault(filepath); + default: try { - return loadCjsDefault(filepath, fallbackToTranspiledModule); + { + return loadCjsDefault(filepath, arguments[2]); + } } catch (e) { if (e.code !== "ERR_REQUIRE_ESM") throw e; } - case "mjs": - if (yield* (0, _async.isAsync)()) { - return yield* (0, _async.waitFor)(loadMjsDefault(filepath)); - } - throw new _configError.default(asyncError, filepath); } + if (yield* (0, _async.isAsync)()) { + return yield* (0, _async.waitFor)(loadMjsDefault(filepath)); + } + throw new _configError.default(asyncError, filepath); } -function guessJSModuleType(filename) { - switch (_path().extname(filename)) { - case ".cjs": - return "cjs"; - case ".mjs": - return "mjs"; - default: - return "unknown"; +function loadCtsDefault(filepath) { + const ext = ".cts"; + const hasTsSupport = !!(require.extensions[".ts"] || require.extensions[".cts"] || require.extensions[".mts"]); + let handler; + if (!hasTsSupport) { + const opts = { + babelrc: false, + configFile: false, + sourceType: "unambiguous", + sourceMaps: "inline", + sourceFileName: _path().basename(filepath), + presets: [[getTSPreset(filepath), Object.assign({ + onlyRemoveTypeImports: true, + optimizeConstEnums: true + }, { + allowDeclareFields: true + })]] + }; + handler = function (m, filename) { + if (handler && filename.endsWith(ext)) { + try { + return m._compile((0, _transformFile.transformFileSync)(filename, Object.assign({}, opts, { + filename + })).code, filename); + } catch (error) { + if (!hasTsSupport) { + const packageJson = require("@babel/preset-typescript/package.json"); + if (_semver().lt(packageJson.version, "7.21.4")) { + console.error("`.cts` configuration file failed to load, please try to update `@babel/preset-typescript`."); + } + } + throw error; + } + } + return require.extensions[".js"](m, filename); + }; + require.extensions[ext] = handler; + } + try { + return loadCjsDefault(filepath); + } finally { + if (!hasTsSupport) { + if (require.extensions[ext] === handler) delete require.extensions[ext]; + handler = undefined; + } } } -function loadCjsDefault(filepath, fallbackToTranspiledModule) { - const module = (0, _rewriteStackTrace.endHiddenCallStack)(require)(filepath); - return module != null && module.__esModule ? - module.default || (fallbackToTranspiledModule ? module : undefined) : module; +const LOADING_CJS_FILES = new Set(); +function loadCjsDefault(filepath) { + if (LOADING_CJS_FILES.has(filepath)) { + debug("Auto-ignoring usage of config %o.", filepath); + return {}; + } + let module; + try { + LOADING_CJS_FILES.add(filepath); + module = (0, _rewriteStackTrace.endHiddenCallStack)(require)(filepath); + } finally { + LOADING_CJS_FILES.delete(filepath); + } + { + var _module; + return (_module = module) != null && _module.__esModule ? module.default || (arguments[1] ? module : undefined) : module; + } } function loadMjsDefault(_x) { return _loadMjsDefault.apply(this, arguments); @@ -84,14 +140,34 @@ function loadMjsDefault(_x) { function _loadMjsDefault() { _loadMjsDefault = _asyncToGenerator(function* (filepath) { if (!import_) { - throw new _configError.default("Internal error: Native ECMAScript modules aren't supported" + " by this platform.\n", filepath); + throw new _configError.default("Internal error: Native ECMAScript modules aren't supported by this platform.\n", filepath); } - const module = yield (0, _rewriteStackTrace.endHiddenCallStack)(import_)((0, _url().pathToFileURL)(filepath)); return module.default; }); return _loadMjsDefault.apply(this, arguments); } +function getTSPreset(filepath) { + try { + return require("@babel/preset-typescript"); + } catch (error) { + if (error.code !== "MODULE_NOT_FOUND") throw error; + let message = "You appear to be using a .cts file as Babel configuration, but the `@babel/preset-typescript` package was not found: please install it!"; + { + if (process.versions.pnp) { + message += ` +If you are using Yarn Plug'n'Play, you may also need to add the following configuration to your .yarnrc.yml file: + +packageExtensions: +\t"@babel/core@*": +\t\tpeerDependencies: +\t\t\t"@babel/preset-typescript": "*" +`; + } + } + throw new _configError.default(message, filepath); + } +} 0 && 0; //# sourceMappingURL=module-types.js.map diff --git a/node_modules/@babel/core/lib/config/files/module-types.js.map b/node_modules/@babel/core/lib/config/files/module-types.js.map index 0cd944b74948..2fd6367b2422 100644 --- a/node_modules/@babel/core/lib/config/files/module-types.js.map +++ b/node_modules/@babel/core/lib/config/files/module-types.js.map @@ -1 +1 @@ -{"version":3,"names":["import_","require","supportsESM","semver","satisfies","process","versions","node","loadCjsOrMjsDefault","filepath","asyncError","fallbackToTranspiledModule","guessJSModuleType","loadCjsDefault","e","code","isAsync","waitFor","loadMjsDefault","ConfigError","filename","path","extname","module","endHiddenCallStack","__esModule","default","undefined","pathToFileURL"],"sources":["../../../src/config/files/module-types.ts"],"sourcesContent":["import { isAsync, waitFor } from \"../../gensync-utils/async\";\nimport type { Handler } from \"gensync\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport { createRequire } from \"module\";\nimport semver from \"semver\";\n\nimport { endHiddenCallStack } from \"../../errors/rewrite-stack-trace\";\nimport ConfigError from \"../../errors/config-error\";\n\nconst require = createRequire(import.meta.url);\n\nlet import_: ((specifier: string | URL) => any) | undefined;\ntry {\n // Old Node.js versions don't support import() syntax.\n import_ = require(\"./import.cjs\");\n} catch {}\n\nexport const supportsESM = semver.satisfies(\n process.versions.node,\n // older versions, starting from 10, support the dynamic\n // import syntax but always return a rejected promise.\n \"^12.17 || >=13.2\",\n);\n\nexport default function* loadCjsOrMjsDefault(\n filepath: string,\n asyncError: string,\n // TODO(Babel 8): Remove this\n fallbackToTranspiledModule: boolean = false,\n): Handler {\n switch (guessJSModuleType(filepath)) {\n case \"cjs\":\n return loadCjsDefault(filepath, fallbackToTranspiledModule);\n case \"unknown\":\n try {\n return loadCjsDefault(filepath, fallbackToTranspiledModule);\n } catch (e) {\n if (e.code !== \"ERR_REQUIRE_ESM\") throw e;\n }\n // fall through\n case \"mjs\":\n if (yield* isAsync()) {\n return yield* waitFor(loadMjsDefault(filepath));\n }\n throw new ConfigError(asyncError, filepath);\n }\n}\n\nfunction guessJSModuleType(filename: string): \"cjs\" | \"mjs\" | \"unknown\" {\n switch (path.extname(filename)) {\n case \".cjs\":\n return \"cjs\";\n case \".mjs\":\n return \"mjs\";\n default:\n return \"unknown\";\n }\n}\n\nfunction loadCjsDefault(filepath: string, fallbackToTranspiledModule: boolean) {\n const module = endHiddenCallStack(require)(filepath) as any;\n return module?.__esModule\n ? // TODO (Babel 8): Remove \"module\" and \"undefined\" fallback\n module.default || (fallbackToTranspiledModule ? module : undefined)\n : module;\n}\n\nasync function loadMjsDefault(filepath: string) {\n if (!import_) {\n throw new ConfigError(\n \"Internal error: Native ECMAScript modules aren't supported\" +\n \" by this platform.\\n\",\n filepath,\n );\n }\n\n // import() expects URLs, not file paths.\n // https://github.com/nodejs/node/issues/31710\n const module = await endHiddenCallStack(import_)(pathToFileURL(filepath));\n return module.default;\n}\n"],"mappings":";;;;;;;AAAA;AAEA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;AACA;AAAoD;AAAA;AAIpD,IAAIA,OAAuD;AAC3D,IAAI;EAEFA,OAAO,GAAGC,OAAO,CAAC,cAAc,CAAC;AACnC,CAAC,CAAC,gBAAM,CAAC;AAEF,MAAMC,WAAW,GAAGC,SAAM,CAACC,SAAS,CACzCC,OAAO,CAACC,QAAQ,CAACC,IAAI;AAGrB,kBAAkB,CACnB;AAAC;AAEa,UAAUC,mBAAmB,CAC1CC,QAAgB,EAChBC,UAAkB;AAElBC,0BAAmC,GAAG,KAAK,EACzB;EAClB,QAAQC,iBAAiB,CAACH,QAAQ,CAAC;IACjC,KAAK,KAAK;MACR,OAAOI,cAAc,CAACJ,QAAQ,EAAEE,0BAA0B,CAAC;IAC7D,KAAK,SAAS;MACZ,IAAI;QACF,OAAOE,cAAc,CAACJ,QAAQ,EAAEE,0BAA0B,CAAC;MAC7D,CAAC,CAAC,OAAOG,CAAC,EAAE;QACV,IAAIA,CAAC,CAACC,IAAI,KAAK,iBAAiB,EAAE,MAAMD,CAAC;MAC3C;IAEF,KAAK,KAAK;MACR,IAAI,OAAO,IAAAE,cAAO,GAAE,EAAE;QACpB,OAAO,OAAO,IAAAC,cAAO,EAACC,cAAc,CAACT,QAAQ,CAAC,CAAC;MACjD;MACA,MAAM,IAAIU,oBAAW,CAACT,UAAU,EAAED,QAAQ,CAAC;EAAC;AAElD;AAEA,SAASG,iBAAiB,CAACQ,QAAgB,EAA6B;EACtE,QAAQC,OAAI,CAACC,OAAO,CAACF,QAAQ,CAAC;IAC5B,KAAK,MAAM;MACT,OAAO,KAAK;IACd,KAAK,MAAM;MACT,OAAO,KAAK;IACd;MACE,OAAO,SAAS;EAAC;AAEvB;AAEA,SAASP,cAAc,CAACJ,QAAgB,EAAEE,0BAAmC,EAAE;EAC7E,MAAMY,MAAM,GAAG,IAAAC,qCAAkB,EAACvB,OAAO,CAAC,CAACQ,QAAQ,CAAQ;EAC3D,OAAOc,MAAM,YAANA,MAAM,CAAEE,UAAU;EAErBF,MAAM,CAACG,OAAO,KAAKf,0BAA0B,GAAGY,MAAM,GAAGI,SAAS,CAAC,GACnEJ,MAAM;AACZ;AAAC,SAEcL,cAAc;EAAA;AAAA;AAAA;EAAA,oCAA7B,WAA8BT,QAAgB,EAAE;IAC9C,IAAI,CAACT,OAAO,EAAE;MACZ,MAAM,IAAImB,oBAAW,CACnB,4DAA4D,GAC1D,sBAAsB,EACxBV,QAAQ,CACT;IACH;;IAIA,MAAMc,MAAM,SAAS,IAAAC,qCAAkB,EAACxB,OAAO,CAAC,CAAC,IAAA4B,oBAAa,EAACnB,QAAQ,CAAC,CAAC;IACzE,OAAOc,MAAM,CAACG,OAAO;EACvB,CAAC;EAAA;AAAA;AAAA"} \ No newline at end of file +{"version":3,"names":["_async","require","_path","data","_url","_semver","_debug","_rewriteStackTrace","_configError","_transformFile","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","debug","buildDebug","import_","_unused","supportsESM","exports","semver","satisfies","process","versions","node","loadCodeDefault","filepath","asyncError","path","extname","loadCjsDefault","loadCtsDefault","e","code","isAsync","waitFor","loadMjsDefault","ConfigError","ext","hasTsSupport","extensions","handler","opts","babelrc","configFile","sourceType","sourceMaps","sourceFileName","basename","presets","getTSPreset","Object","assign","onlyRemoveTypeImports","optimizeConstEnums","allowDeclareFields","m","filename","endsWith","_compile","transformFileSync","packageJson","lt","version","console","LOADING_CJS_FILES","Set","has","module","add","endHiddenCallStack","delete","_module","__esModule","default","_x","_loadMjsDefault","pathToFileURL","message","pnp"],"sources":["../../../src/config/files/module-types.ts"],"sourcesContent":["import { isAsync, waitFor } from \"../../gensync-utils/async.ts\";\nimport type { Handler } from \"gensync\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport { createRequire } from \"module\";\nimport semver from \"semver\";\nimport buildDebug from \"debug\";\n\nimport { endHiddenCallStack } from \"../../errors/rewrite-stack-trace.ts\";\nimport ConfigError from \"../../errors/config-error.ts\";\n\nimport type { InputOptions } from \"../index.ts\";\nimport { transformFileSync } from \"../../transform-file.ts\";\n\nconst debug = buildDebug(\"babel:config:loading:files:module-types\");\n\nconst require = createRequire(import.meta.url);\n\nlet import_: ((specifier: string | URL) => any) | undefined;\ntry {\n // Old Node.js versions don't support import() syntax.\n import_ = require(\"./import.cjs\");\n} catch {}\n\nexport const supportsESM = semver.satisfies(\n process.versions.node,\n // older versions, starting from 10, support the dynamic\n // import syntax but always return a rejected promise.\n \"^12.17 || >=13.2\",\n);\n\nexport default function* loadCodeDefault(\n filepath: string,\n asyncError: string,\n): Handler {\n switch (path.extname(filepath)) {\n case \".cjs\":\n if (process.env.BABEL_8_BREAKING) {\n return loadCjsDefault(filepath);\n } else {\n return loadCjsDefault(\n filepath,\n // @ts-ignore(Babel 7 vs Babel 8) Removed in Babel 8\n /* fallbackToTranspiledModule */ arguments[2],\n );\n }\n case \".mjs\":\n break;\n case \".cts\":\n return loadCtsDefault(filepath);\n default:\n try {\n if (process.env.BABEL_8_BREAKING) {\n return loadCjsDefault(filepath);\n } else {\n return loadCjsDefault(\n filepath,\n // @ts-ignore(Babel 7 vs Babel 8) Removed in Babel 8\n /* fallbackToTranspiledModule */ arguments[2],\n );\n }\n } catch (e) {\n if (e.code !== \"ERR_REQUIRE_ESM\") throw e;\n }\n }\n if (yield* isAsync()) {\n return yield* waitFor(loadMjsDefault(filepath));\n }\n throw new ConfigError(asyncError, filepath);\n}\n\nfunction loadCtsDefault(filepath: string) {\n const ext = \".cts\";\n const hasTsSupport = !!(\n require.extensions[\".ts\"] ||\n require.extensions[\".cts\"] ||\n require.extensions[\".mts\"]\n );\n\n let handler: NodeJS.RequireExtensions[\"\"];\n\n if (!hasTsSupport) {\n const opts: InputOptions = {\n babelrc: false,\n configFile: false,\n sourceType: \"unambiguous\",\n sourceMaps: \"inline\",\n sourceFileName: path.basename(filepath),\n presets: [\n [\n getTSPreset(filepath),\n {\n onlyRemoveTypeImports: true,\n optimizeConstEnums: true,\n ...(process.env.BABEL_8_BREAKING\n ? {}\n : { allowDeclareFields: true }),\n },\n ],\n ],\n };\n\n handler = function (m, filename) {\n // If we want to support `.ts`, `.d.ts` must be handled specially.\n if (handler && filename.endsWith(ext)) {\n try {\n // @ts-expect-error Undocumented API\n return m._compile(\n transformFileSync(filename, {\n ...opts,\n filename,\n }).code,\n filename,\n );\n } catch (error) {\n if (!hasTsSupport) {\n const packageJson = require(\"@babel/preset-typescript/package.json\");\n if (semver.lt(packageJson.version, \"7.21.4\")) {\n console.error(\n \"`.cts` configuration file failed to load, please try to update `@babel/preset-typescript`.\",\n );\n }\n }\n throw error;\n }\n }\n return require.extensions[\".js\"](m, filename);\n };\n require.extensions[ext] = handler;\n }\n try {\n return loadCjsDefault(filepath);\n } finally {\n if (!hasTsSupport) {\n if (require.extensions[ext] === handler) delete require.extensions[ext];\n handler = undefined;\n }\n }\n}\n\nconst LOADING_CJS_FILES = new Set();\n\nfunction loadCjsDefault(filepath: string) {\n // The `require()` call below can make this code reentrant if a require hook\n // like @babel/register has been loaded into the system. That would cause\n // Babel to attempt to compile the `.babelrc.js` file as it loads below. To\n // cover this case, we auto-ignore re-entrant config processing. ESM loaders\n // do not have this problem, because loaders do not apply to themselves.\n if (LOADING_CJS_FILES.has(filepath)) {\n debug(\"Auto-ignoring usage of config %o.\", filepath);\n return {};\n }\n\n let module;\n try {\n LOADING_CJS_FILES.add(filepath);\n module = endHiddenCallStack(require)(filepath);\n } finally {\n LOADING_CJS_FILES.delete(filepath);\n }\n\n if (process.env.BABEL_8_BREAKING) {\n return module?.__esModule ? module.default : module;\n } else {\n return module?.__esModule\n ? module.default ||\n /* fallbackToTranspiledModule */ (arguments[1] ? module : undefined)\n : module;\n }\n}\n\nasync function loadMjsDefault(filepath: string) {\n if (!import_) {\n throw new ConfigError(\n \"Internal error: Native ECMAScript modules aren't supported by this platform.\\n\",\n filepath,\n );\n }\n\n // import() expects URLs, not file paths.\n // https://github.com/nodejs/node/issues/31710\n const module = await endHiddenCallStack(import_)(pathToFileURL(filepath));\n return module.default;\n}\n\nfunction getTSPreset(filepath: string) {\n try {\n // eslint-disable-next-line import/no-extraneous-dependencies\n return require(\"@babel/preset-typescript\");\n } catch (error) {\n if (error.code !== \"MODULE_NOT_FOUND\") throw error;\n\n let message =\n \"You appear to be using a .cts file as Babel configuration, but the `@babel/preset-typescript` package was not found: please install it!\";\n\n if (!process.env.BABEL_8_BREAKING) {\n if (process.versions.pnp) {\n // Using Yarn PnP, which doesn't allow requiring packages that are not\n // explicitly specified as dependencies.\n message += `\nIf you are using Yarn Plug'n'Play, you may also need to add the following configuration to your .yarnrc.yml file:\n\npackageExtensions:\n\\t\"@babel/core@*\":\n\\t\\tpeerDependencies:\n\\t\\t\\t\"@babel/preset-typescript\": \"*\"\n`;\n }\n }\n\n throw new ConfigError(message, filepath);\n }\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/files/package.js b/node_modules/@babel/core/lib/config/files/package.js index b30c907e9ec0..eed8ab82fac6 100644 --- a/node_modules/@babel/core/lib/config/files/package.js +++ b/node_modules/@babel/core/lib/config/files/package.js @@ -11,8 +11,8 @@ function _path() { }; return data; } -var _utils = require("./utils"); -var _configError = require("../../errors/config-error"); +var _utils = require("./utils.js"); +var _configError = require("../../errors/config-error.js"); const PACKAGE_FILENAME = "package.json"; const readConfigPackage = (0, _utils.makeStaticFileCache)((filepath, content) => { let options; @@ -34,7 +34,6 @@ const readConfigPackage = (0, _utils.makeStaticFileCache)((filepath, content) => options }; }); - function* findPackageData(filepath) { let pkg = null; const directories = []; diff --git a/node_modules/@babel/core/lib/config/files/package.js.map b/node_modules/@babel/core/lib/config/files/package.js.map index 773da3e48933..0d28371ef525 100644 --- a/node_modules/@babel/core/lib/config/files/package.js.map +++ b/node_modules/@babel/core/lib/config/files/package.js.map @@ -1 +1 @@ -{"version":3,"names":["PACKAGE_FILENAME","readConfigPackage","makeStaticFileCache","filepath","content","options","JSON","parse","err","ConfigError","message","Error","Array","isArray","dirname","path","findPackageData","pkg","directories","isPackage","basename","push","join","nextLoc"],"sources":["../../../src/config/files/package.ts"],"sourcesContent":["import path from \"path\";\nimport type { Handler } from \"gensync\";\nimport { makeStaticFileCache } from \"./utils\";\n\nimport type { ConfigFile, FilePackageData } from \"./types\";\n\nimport ConfigError from \"../../errors/config-error\";\n\nconst PACKAGE_FILENAME = \"package.json\";\n\nconst readConfigPackage = makeStaticFileCache(\n (filepath, content): ConfigFile => {\n let options;\n try {\n options = JSON.parse(content) as unknown;\n } catch (err) {\n throw new ConfigError(\n `Error while parsing JSON - ${err.message}`,\n filepath,\n );\n }\n\n if (!options) throw new Error(`${filepath}: No config detected`);\n\n if (typeof options !== \"object\") {\n throw new ConfigError(\n `Config returned typeof ${typeof options}`,\n filepath,\n );\n }\n if (Array.isArray(options)) {\n throw new ConfigError(`Expected config object but found array`, filepath);\n }\n\n return {\n filepath,\n dirname: path.dirname(filepath),\n options,\n };\n },\n);\n\n/**\n * Find metadata about the package that this file is inside of. Resolution\n * of Babel's config requires general package information to decide when to\n * search for .babelrc files\n */\nexport function* findPackageData(filepath: string): Handler {\n let pkg = null;\n const directories = [];\n let isPackage = true;\n\n let dirname = path.dirname(filepath);\n while (!pkg && path.basename(dirname) !== \"node_modules\") {\n directories.push(dirname);\n\n pkg = yield* readConfigPackage(path.join(dirname, PACKAGE_FILENAME));\n\n const nextLoc = path.dirname(dirname);\n if (dirname === nextLoc) {\n isPackage = false;\n break;\n }\n dirname = nextLoc;\n }\n\n return { filepath, directories, pkg, isPackage };\n}\n"],"mappings":";;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;AAIA;AAEA,MAAMA,gBAAgB,GAAG,cAAc;AAEvC,MAAMC,iBAAiB,GAAG,IAAAC,0BAAmB,EAC3C,CAACC,QAAQ,EAAEC,OAAO,KAAiB;EACjC,IAAIC,OAAO;EACX,IAAI;IACFA,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,OAAO,CAAY;EAC1C,CAAC,CAAC,OAAOI,GAAG,EAAE;IACZ,MAAM,IAAIC,oBAAW,CAClB,8BAA6BD,GAAG,CAACE,OAAQ,EAAC,EAC3CP,QAAQ,CACT;EACH;EAEA,IAAI,CAACE,OAAO,EAAE,MAAM,IAAIM,KAAK,CAAE,GAAER,QAAS,sBAAqB,CAAC;EAEhE,IAAI,OAAOE,OAAO,KAAK,QAAQ,EAAE;IAC/B,MAAM,IAAII,oBAAW,CAClB,0BAAyB,OAAOJ,OAAQ,EAAC,EAC1CF,QAAQ,CACT;EACH;EACA,IAAIS,KAAK,CAACC,OAAO,CAACR,OAAO,CAAC,EAAE;IAC1B,MAAM,IAAII,oBAAW,CAAE,wCAAuC,EAAEN,QAAQ,CAAC;EAC3E;EAEA,OAAO;IACLA,QAAQ;IACRW,OAAO,EAAEC,OAAI,CAACD,OAAO,CAACX,QAAQ,CAAC;IAC/BE;EACF,CAAC;AACH,CAAC,CACF;;AAOM,UAAUW,eAAe,CAACb,QAAgB,EAA4B;EAC3E,IAAIc,GAAG,GAAG,IAAI;EACd,MAAMC,WAAW,GAAG,EAAE;EACtB,IAAIC,SAAS,GAAG,IAAI;EAEpB,IAAIL,OAAO,GAAGC,OAAI,CAACD,OAAO,CAACX,QAAQ,CAAC;EACpC,OAAO,CAACc,GAAG,IAAIF,OAAI,CAACK,QAAQ,CAACN,OAAO,CAAC,KAAK,cAAc,EAAE;IACxDI,WAAW,CAACG,IAAI,CAACP,OAAO,CAAC;IAEzBG,GAAG,GAAG,OAAOhB,iBAAiB,CAACc,OAAI,CAACO,IAAI,CAACR,OAAO,EAAEd,gBAAgB,CAAC,CAAC;IAEpE,MAAMuB,OAAO,GAAGR,OAAI,CAACD,OAAO,CAACA,OAAO,CAAC;IACrC,IAAIA,OAAO,KAAKS,OAAO,EAAE;MACvBJ,SAAS,GAAG,KAAK;MACjB;IACF;IACAL,OAAO,GAAGS,OAAO;EACnB;EAEA,OAAO;IAAEpB,QAAQ;IAAEe,WAAW;IAAED,GAAG;IAAEE;EAAU,CAAC;AAClD;AAAC"} \ No newline at end of file +{"version":3,"names":["_path","data","require","_utils","_configError","PACKAGE_FILENAME","readConfigPackage","makeStaticFileCache","filepath","content","options","JSON","parse","err","ConfigError","message","Error","Array","isArray","dirname","path","findPackageData","pkg","directories","isPackage","basename","push","join","nextLoc"],"sources":["../../../src/config/files/package.ts"],"sourcesContent":["import path from \"path\";\nimport type { Handler } from \"gensync\";\nimport { makeStaticFileCache } from \"./utils.ts\";\n\nimport type { ConfigFile, FilePackageData } from \"./types.ts\";\n\nimport ConfigError from \"../../errors/config-error.ts\";\n\nconst PACKAGE_FILENAME = \"package.json\";\n\nconst readConfigPackage = makeStaticFileCache(\n (filepath, content): ConfigFile => {\n let options;\n try {\n options = JSON.parse(content) as unknown;\n } catch (err) {\n throw new ConfigError(\n `Error while parsing JSON - ${err.message}`,\n filepath,\n );\n }\n\n if (!options) throw new Error(`${filepath}: No config detected`);\n\n if (typeof options !== \"object\") {\n throw new ConfigError(\n `Config returned typeof ${typeof options}`,\n filepath,\n );\n }\n if (Array.isArray(options)) {\n throw new ConfigError(`Expected config object but found array`, filepath);\n }\n\n return {\n filepath,\n dirname: path.dirname(filepath),\n options,\n };\n },\n);\n\n/**\n * Find metadata about the package that this file is inside of. Resolution\n * of Babel's config requires general package information to decide when to\n * search for .babelrc files\n */\nexport function* findPackageData(filepath: string): Handler {\n let pkg = null;\n const directories = [];\n let isPackage = true;\n\n let dirname = path.dirname(filepath);\n while (!pkg && path.basename(dirname) !== \"node_modules\") {\n directories.push(dirname);\n\n pkg = yield* readConfigPackage(path.join(dirname, PACKAGE_FILENAME));\n\n const nextLoc = path.dirname(dirname);\n if (dirname === nextLoc) {\n isPackage = false;\n break;\n }\n dirname = nextLoc;\n }\n\n return { filepath, directories, pkg, isPackage };\n}\n"],"mappings":";;;;;;AAAA,SAAAA,MAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,KAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,IAAAE,MAAA,GAAAD,OAAA;AAIA,IAAAE,YAAA,GAAAF,OAAA;AAEA,MAAMG,gBAAgB,GAAG,cAAc;AAEvC,MAAMC,iBAAiB,GAAG,IAAAC,0BAAmB,EAC3C,CAACC,QAAQ,EAAEC,OAAO,KAAiB;EACjC,IAAIC,OAAO;EACX,IAAI;IACFA,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,OAAO,CAAY;EAC1C,CAAC,CAAC,OAAOI,GAAG,EAAE;IACZ,MAAM,IAAIC,oBAAW,CAClB,8BAA6BD,GAAG,CAACE,OAAQ,EAAC,EAC3CP,QACF,CAAC;EACH;EAEA,IAAI,CAACE,OAAO,EAAE,MAAM,IAAIM,KAAK,CAAE,GAAER,QAAS,sBAAqB,CAAC;EAEhE,IAAI,OAAOE,OAAO,KAAK,QAAQ,EAAE;IAC/B,MAAM,IAAII,oBAAW,CAClB,0BAAyB,OAAOJ,OAAQ,EAAC,EAC1CF,QACF,CAAC;EACH;EACA,IAAIS,KAAK,CAACC,OAAO,CAACR,OAAO,CAAC,EAAE;IAC1B,MAAM,IAAII,oBAAW,CAAE,wCAAuC,EAAEN,QAAQ,CAAC;EAC3E;EAEA,OAAO;IACLA,QAAQ;IACRW,OAAO,EAAEC,MAAGA,CAAC,CAACD,OAAO,CAACX,QAAQ,CAAC;IAC/BE;EACF,CAAC;AACH,CACF,CAAC;AAOM,UAAUW,eAAeA,CAACb,QAAgB,EAA4B;EAC3E,IAAIc,GAAG,GAAG,IAAI;EACd,MAAMC,WAAW,GAAG,EAAE;EACtB,IAAIC,SAAS,GAAG,IAAI;EAEpB,IAAIL,OAAO,GAAGC,MAAGA,CAAC,CAACD,OAAO,CAACX,QAAQ,CAAC;EACpC,OAAO,CAACc,GAAG,IAAIF,MAAGA,CAAC,CAACK,QAAQ,CAACN,OAAO,CAAC,KAAK,cAAc,EAAE;IACxDI,WAAW,CAACG,IAAI,CAACP,OAAO,CAAC;IAEzBG,GAAG,GAAG,OAAOhB,iBAAiB,CAACc,MAAGA,CAAC,CAACO,IAAI,CAACR,OAAO,EAAEd,gBAAgB,CAAC,CAAC;IAEpE,MAAMuB,OAAO,GAAGR,MAAGA,CAAC,CAACD,OAAO,CAACA,OAAO,CAAC;IACrC,IAAIA,OAAO,KAAKS,OAAO,EAAE;MACvBJ,SAAS,GAAG,KAAK;MACjB;IACF;IACAL,OAAO,GAAGS,OAAO;EACnB;EAEA,OAAO;IAAEpB,QAAQ;IAAEe,WAAW;IAAED,GAAG;IAAEE;EAAU,CAAC;AAClD;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/files/plugins.js b/node_modules/@babel/core/lib/config/files/plugins.js index 4c98e49a8154..25435ae424af 100644 --- a/node_modules/@babel/core/lib/config/files/plugins.js +++ b/node_modules/@babel/core/lib/config/files/plugins.js @@ -5,8 +5,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.loadPlugin = loadPlugin; exports.loadPreset = loadPreset; -exports.resolvePlugin = resolvePlugin; -exports.resolvePreset = resolvePreset; +exports.resolvePreset = exports.resolvePlugin = void 0; function _debug() { const data = require("debug"); _debug = function () { @@ -21,15 +20,8 @@ function _path() { }; return data; } -function _gensync() { - const data = require("gensync"); - _gensync = function () { - return data; - }; - return data; -} -var _async = require("../../gensync-utils/async"); -var _moduleTypes = require("./module-types"); +var _async = require("../../gensync-utils/async.js"); +var _moduleTypes = require("./module-types.js"); function _url() { const data = require("url"); _url = function () { @@ -37,16 +29,14 @@ function _url() { }; return data; } -var _importMetaResolve = require("./import-meta-resolve"); -function _module() { - const data = require("module"); - _module = function () { +var _importMetaResolve = require("../../vendor/import-meta-resolve.js"); +function _fs() { + const data = require("fs"); + _fs = function () { return data; }; return data; } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } const debug = _debug()("babel:config:loading:files:plugins"); const EXACT_RE = /^module:/; const BABEL_PLUGIN_PREFIX_RE = /^(?!@|module:|[^/]+\/|babel-plugin-)/; @@ -56,14 +46,10 @@ const BABEL_PRESET_ORG_RE = /^(@babel\/)(?!preset-|[^/]+\/)/; const OTHER_PLUGIN_ORG_RE = /^(@(?!babel\/)[^/]+\/)(?![^/]*babel-plugin(?:-|\/|$)|[^/]+\/)/; const OTHER_PRESET_ORG_RE = /^(@(?!babel\/)[^/]+\/)(?![^/]*babel-preset(?:-|\/|$)|[^/]+\/)/; const OTHER_ORG_DEFAULT_RE = /^(@(?!babel$)[^/]+)$/; -function* resolvePlugin(name, dirname) { - return yield* resolveStandardizedName("plugin", name, dirname); -} -function* resolvePreset(name, dirname) { - return yield* resolveStandardizedName("preset", name, dirname); -} +const resolvePlugin = exports.resolvePlugin = resolveStandardizedName.bind(null, "plugin"); +const resolvePreset = exports.resolvePreset = resolveStandardizedName.bind(null, "preset"); function* loadPlugin(name, dirname) { - const filepath = yield* resolvePlugin(name, dirname); + const filepath = resolvePlugin(name, dirname, yield* (0, _async.isAsync)()); const value = yield* requireModule("plugin", filepath); debug("Loaded plugin %o from %o.", name, dirname); return { @@ -72,7 +58,7 @@ function* loadPlugin(name, dirname) { }; } function* loadPreset(name, dirname) { - const filepath = yield* resolvePreset(name, dirname); + const filepath = resolvePreset(name, dirname, yield* (0, _async.isAsync)()); const value = yield* requireModule("preset", filepath); debug("Loaded preset %o from %o.", name, dirname); return { @@ -83,12 +69,7 @@ function* loadPreset(name, dirname) { function standardizeName(type, name) { if (_path().isAbsolute(name)) return name; const isPreset = type === "preset"; - return name - .replace(isPreset ? BABEL_PRESET_PREFIX_RE : BABEL_PLUGIN_PREFIX_RE, `babel-${type}-`) - .replace(isPreset ? BABEL_PRESET_ORG_RE : BABEL_PLUGIN_ORG_RE, `$1${type}-`) - .replace(isPreset ? OTHER_PRESET_ORG_RE : OTHER_PLUGIN_ORG_RE, `$1babel-${type}-`) - .replace(OTHER_ORG_DEFAULT_RE, `$1/babel-${type}`) - .replace(EXACT_RE, ""); + return name.replace(isPreset ? BABEL_PRESET_PREFIX_RE : BABEL_PLUGIN_PREFIX_RE, `babel-${type}-`).replace(isPreset ? BABEL_PRESET_ORG_RE : BABEL_PLUGIN_ORG_RE, `$1${type}-`).replace(isPreset ? OTHER_PRESET_ORG_RE : OTHER_PLUGIN_ORG_RE, `$1babel-${type}-`).replace(OTHER_ORG_DEFAULT_RE, `$1/babel-${type}`).replace(EXACT_RE, ""); } function* resolveAlternativesHelper(type, name) { const standardizedName = standardizeName(type, name); @@ -97,7 +78,6 @@ function* resolveAlternativesHelper(type, name) { value } = yield standardizedName; if (!error) return value; - if (error.code !== "MODULE_NOT_FOUND") throw error; if (standardizedName !== name && !(yield name).error) { error.message += `\n- If you want to resolve "${name}", use "module:${name}"`; @@ -109,25 +89,57 @@ function* resolveAlternativesHelper(type, name) { if (!(yield standardizeName(oppositeType, name)).error) { error.message += `\n- Did you accidentally pass a ${oppositeType} as a ${type}?`; } + if (type === "plugin") { + const transformName = standardizedName.replace("-proposal-", "-transform-"); + if (transformName !== standardizedName && !(yield transformName).error) { + error.message += `\n- Did you mean "${transformName}"?`; + } + } + error.message += `\n +Make sure that all the Babel plugins and presets you are using +are defined as dependencies or devDependencies in your package.json +file. It's possible that the missing plugin is loaded by a preset +you are using that forgot to add the plugin to its dependencies: you +can workaround this problem by explicitly adding the missing package +to your top-level package.json. +`; throw error; } -function tryRequireResolve(id, { - paths: [dirname] -}) { +function tryRequireResolve(id, dirname) { + try { + if (dirname) { + return { + error: null, + value: (((v, w) => (v = v.split("."), w = w.split("."), +v[0] > +w[0] || v[0] == w[0] && +v[1] >= +w[1]))(process.versions.node, "8.9") ? require.resolve : (r, { + paths: [b] + }, M = require("module")) => { + let f = M._findPath(r, M._nodeModulePaths(b).concat(b)); + if (f) return f; + f = new Error(`Cannot resolve module '${r}'`); + f.code = "MODULE_NOT_FOUND"; + throw f; + })(id, { + paths: [dirname] + }) + }; + } else { + return { + error: null, + value: require.resolve(id) + }; + } + } catch (error) { + return { + error, + value: null + }; + } +} +function tryImportMetaResolve(id, options) { try { return { error: null, - value: (((v, w) => (v = v.split("."), w = w.split("."), +v[0] > +w[0] || v[0] == w[0] && +v[1] >= +w[1]))(process.versions.node, "8.9") ? require.resolve : (r, { - paths: [b] - }, M = require("module")) => { - let f = M._findPath(r, M._nodeModulePaths(b).concat(b)); - if (f) return f; - f = new Error(`Cannot resolve module '${r}'`); - f.code = "MODULE_NOT_FOUND"; - throw f; - })(id, { - paths: [dirname] - }) + value: (0, _importMetaResolve.resolve)(id, options) }; } catch (error) { return { @@ -136,73 +148,45 @@ function tryRequireResolve(id, { }; } } -function tryImportMetaResolve(_x, _x2) { - return _tryImportMetaResolve.apply(this, arguments); -} -function _tryImportMetaResolve() { - _tryImportMetaResolve = _asyncToGenerator(function* (id, options) { - try { - return { - error: null, - value: yield (0, _importMetaResolve.default)(id, options) - }; - } catch (error) { - return { - error, - value: null - }; - } - }); - return _tryImportMetaResolve.apply(this, arguments); -} function resolveStandardizedNameForRequire(type, name, dirname) { const it = resolveAlternativesHelper(type, name); let res = it.next(); while (!res.done) { - res = it.next(tryRequireResolve(res.value, { - paths: [dirname] - })); + res = it.next(tryRequireResolve(res.value, dirname)); } return res.value; } -function resolveStandardizedNameForImport(_x3, _x4, _x5) { - return _resolveStandardizedNameForImport.apply(this, arguments); -} -function _resolveStandardizedNameForImport() { - _resolveStandardizedNameForImport = _asyncToGenerator(function* (type, name, dirname) { - const parentUrl = (0, _url().pathToFileURL)(_path().join(dirname, "./babel-virtual-resolve-base.js")).href; - const it = resolveAlternativesHelper(type, name); - let res = it.next(); - while (!res.done) { - res = it.next(yield tryImportMetaResolve(res.value, parentUrl)); - } - return (0, _url().fileURLToPath)(res.value); - }); - return _resolveStandardizedNameForImport.apply(this, arguments); +function resolveStandardizedNameForImport(type, name, dirname) { + const parentUrl = (0, _url().pathToFileURL)(_path().join(dirname, "./babel-virtual-resolve-base.js")).href; + const it = resolveAlternativesHelper(type, name); + let res = it.next(); + while (!res.done) { + res = it.next(tryImportMetaResolve(res.value, parentUrl)); + } + return (0, _url().fileURLToPath)(res.value); } -const resolveStandardizedName = _gensync()({ - sync(type, name, dirname = process.cwd()) { +function resolveStandardizedName(type, name, dirname, resolveESM) { + if (!_moduleTypes.supportsESM || !resolveESM) { return resolveStandardizedNameForRequire(type, name, dirname); - }, - async(type, name, dirname = process.cwd()) { - return _asyncToGenerator(function* () { - if (!_moduleTypes.supportsESM) { - return resolveStandardizedNameForRequire(type, name, dirname); - } - try { - return yield resolveStandardizedNameForImport(type, name, dirname); - } catch (e) { - try { - return resolveStandardizedNameForRequire(type, name, dirname); - } catch (e2) { - if (e.type === "MODULE_NOT_FOUND") throw e; - if (e2.type === "MODULE_NOT_FOUND") throw e2; - throw e; - } - } - })(); } -}); + try { + const resolved = resolveStandardizedNameForImport(type, name, dirname); + if (!(0, _fs().existsSync)(resolved)) { + throw Object.assign(new Error(`Could not resolve "${name}" in file ${dirname}.`), { + type: "MODULE_NOT_FOUND" + }); + } + return resolved; + } catch (e) { + try { + return resolveStandardizedNameForRequire(type, name, dirname); + } catch (e2) { + if (e.type === "MODULE_NOT_FOUND") throw e; + if (e2.type === "MODULE_NOT_FOUND") throw e2; + throw e; + } + } +} { var LOADING_MODULES = new Set(); } @@ -216,8 +200,9 @@ function* requireModule(type, name) { { LOADING_MODULES.add(name); } - return yield* (0, _moduleTypes.default)(name, `You appear to be using a native ECMAScript module ${type}, ` + "which is only supported when running Babel asynchronously.", - true); + { + return yield* (0, _moduleTypes.default)(name, `You appear to be using a native ECMAScript module ${type}, ` + "which is only supported when running Babel asynchronously.", true); + } } catch (err) { err.message = `[BABEL]: ${err.message} (While processing: ${name})`; throw err; diff --git a/node_modules/@babel/core/lib/config/files/plugins.js.map b/node_modules/@babel/core/lib/config/files/plugins.js.map index eb6c19bfee24..3dcef9f4d87d 100644 --- a/node_modules/@babel/core/lib/config/files/plugins.js.map +++ b/node_modules/@babel/core/lib/config/files/plugins.js.map @@ -1 +1 @@ -{"version":3,"names":["debug","buildDebug","EXACT_RE","BABEL_PLUGIN_PREFIX_RE","BABEL_PRESET_PREFIX_RE","BABEL_PLUGIN_ORG_RE","BABEL_PRESET_ORG_RE","OTHER_PLUGIN_ORG_RE","OTHER_PRESET_ORG_RE","OTHER_ORG_DEFAULT_RE","resolvePlugin","name","dirname","resolveStandardizedName","resolvePreset","loadPlugin","filepath","value","requireModule","loadPreset","standardizeName","type","path","isAbsolute","isPreset","replace","resolveAlternativesHelper","standardizedName","error","code","message","oppositeType","tryRequireResolve","id","paths","tryImportMetaResolve","options","importMetaResolve","resolveStandardizedNameForRequire","it","res","next","done","resolveStandardizedNameForImport","parentUrl","pathToFileURL","join","href","fileURLToPath","gensync","sync","process","cwd","async","supportsESM","e","e2","LOADING_MODULES","Set","isAsync","has","Error","add","loadCjsOrMjsDefault","err","delete"],"sources":["../../../src/config/files/plugins.ts"],"sourcesContent":["/**\n * This file handles all logic for converting string-based configuration references into loaded objects.\n */\n\nimport buildDebug from \"debug\";\nimport path from \"path\";\nimport gensync, { type Handler } from \"gensync\";\nimport { isAsync } from \"../../gensync-utils/async\";\nimport loadCjsOrMjsDefault, { supportsESM } from \"./module-types\";\nimport { fileURLToPath, pathToFileURL } from \"url\";\n\nimport importMetaResolve from \"./import-meta-resolve\";\n\nimport { createRequire } from \"module\";\nconst require = createRequire(import.meta.url);\n\nconst debug = buildDebug(\"babel:config:loading:files:plugins\");\n\nconst EXACT_RE = /^module:/;\nconst BABEL_PLUGIN_PREFIX_RE = /^(?!@|module:|[^/]+\\/|babel-plugin-)/;\nconst BABEL_PRESET_PREFIX_RE = /^(?!@|module:|[^/]+\\/|babel-preset-)/;\nconst BABEL_PLUGIN_ORG_RE = /^(@babel\\/)(?!plugin-|[^/]+\\/)/;\nconst BABEL_PRESET_ORG_RE = /^(@babel\\/)(?!preset-|[^/]+\\/)/;\nconst OTHER_PLUGIN_ORG_RE =\n /^(@(?!babel\\/)[^/]+\\/)(?![^/]*babel-plugin(?:-|\\/|$)|[^/]+\\/)/;\nconst OTHER_PRESET_ORG_RE =\n /^(@(?!babel\\/)[^/]+\\/)(?![^/]*babel-preset(?:-|\\/|$)|[^/]+\\/)/;\nconst OTHER_ORG_DEFAULT_RE = /^(@(?!babel$)[^/]+)$/;\n\nexport function* resolvePlugin(name: string, dirname: string): Handler {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return yield* resolveStandardizedName(\"plugin\", name, dirname);\n}\n\nexport function* resolvePreset(name: string, dirname: string): Handler {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return yield* resolveStandardizedName(\"preset\", name, dirname);\n}\n\nexport function* loadPlugin(\n name: string,\n dirname: string,\n): Handler<{ filepath: string; value: unknown }> {\n const filepath = yield* resolvePlugin(name, dirname);\n\n const value = yield* requireModule(\"plugin\", filepath);\n debug(\"Loaded plugin %o from %o.\", name, dirname);\n\n return { filepath, value };\n}\n\nexport function* loadPreset(\n name: string,\n dirname: string,\n): Handler<{ filepath: string; value: unknown }> {\n const filepath = yield* resolvePreset(name, dirname);\n\n const value = yield* requireModule(\"preset\", filepath);\n\n debug(\"Loaded preset %o from %o.\", name, dirname);\n\n return { filepath, value };\n}\n\nfunction standardizeName(type: \"plugin\" | \"preset\", name: string) {\n // Let absolute and relative paths through.\n if (path.isAbsolute(name)) return name;\n\n const isPreset = type === \"preset\";\n\n return (\n name\n // foo -> babel-preset-foo\n .replace(\n isPreset ? BABEL_PRESET_PREFIX_RE : BABEL_PLUGIN_PREFIX_RE,\n `babel-${type}-`,\n )\n // @babel/es2015 -> @babel/preset-es2015\n .replace(\n isPreset ? BABEL_PRESET_ORG_RE : BABEL_PLUGIN_ORG_RE,\n `$1${type}-`,\n )\n // @foo/mypreset -> @foo/babel-preset-mypreset\n .replace(\n isPreset ? OTHER_PRESET_ORG_RE : OTHER_PLUGIN_ORG_RE,\n `$1babel-${type}-`,\n )\n // @foo -> @foo/babel-preset\n .replace(OTHER_ORG_DEFAULT_RE, `$1/babel-${type}`)\n // module:mypreset -> mypreset\n .replace(EXACT_RE, \"\")\n );\n}\n\ntype Result = { error: Error; value: null } | { error: null; value: T };\n\nfunction* resolveAlternativesHelper(\n type: \"plugin\" | \"preset\",\n name: string,\n): Iterator> {\n const standardizedName = standardizeName(type, name);\n const { error, value } = yield standardizedName;\n if (!error) return value;\n\n // @ts-expect-error code may not index error\n if (error.code !== \"MODULE_NOT_FOUND\") throw error;\n\n if (standardizedName !== name && !(yield name).error) {\n error.message += `\\n- If you want to resolve \"${name}\", use \"module:${name}\"`;\n }\n\n if (!(yield standardizeName(type, \"@babel/\" + name)).error) {\n error.message += `\\n- Did you mean \"@babel/${name}\"?`;\n }\n\n const oppositeType = type === \"preset\" ? \"plugin\" : \"preset\";\n if (!(yield standardizeName(oppositeType, name)).error) {\n error.message += `\\n- Did you accidentally pass a ${oppositeType} as a ${type}?`;\n }\n\n throw error;\n}\n\nfunction tryRequireResolve(\n id: Parameters[0],\n { paths: [dirname] }: Parameters[1],\n): Result {\n try {\n return { error: null, value: require.resolve(id, { paths: [dirname] }) };\n } catch (error) {\n return { error, value: null };\n }\n}\n\nasync function tryImportMetaResolve(\n id: Parameters[0],\n options: Parameters[1],\n): Promise> {\n try {\n return { error: null, value: await importMetaResolve(id, options) };\n } catch (error) {\n return { error, value: null };\n }\n}\n\nfunction resolveStandardizedNameForRequire(\n type: \"plugin\" | \"preset\",\n name: string,\n dirname: string,\n) {\n const it = resolveAlternativesHelper(type, name);\n let res = it.next();\n while (!res.done) {\n res = it.next(tryRequireResolve(res.value, { paths: [dirname] }));\n }\n return res.value;\n}\nasync function resolveStandardizedNameForImport(\n type: \"plugin\" | \"preset\",\n name: string,\n dirname: string,\n) {\n const parentUrl = pathToFileURL(\n path.join(dirname, \"./babel-virtual-resolve-base.js\"),\n ).href;\n\n const it = resolveAlternativesHelper(type, name);\n let res = it.next();\n while (!res.done) {\n res = it.next(await tryImportMetaResolve(res.value, parentUrl));\n }\n return fileURLToPath(res.value);\n}\n\nconst resolveStandardizedName = gensync<\n [type: \"plugin\" | \"preset\", name: string, dirname?: string],\n string\n>({\n sync(type, name, dirname = process.cwd()) {\n return resolveStandardizedNameForRequire(type, name, dirname);\n },\n async async(type, name, dirname = process.cwd()) {\n if (!supportsESM) {\n return resolveStandardizedNameForRequire(type, name, dirname);\n }\n\n try {\n return await resolveStandardizedNameForImport(type, name, dirname);\n } catch (e) {\n try {\n return resolveStandardizedNameForRequire(type, name, dirname);\n } catch (e2) {\n if (e.type === \"MODULE_NOT_FOUND\") throw e;\n if (e2.type === \"MODULE_NOT_FOUND\") throw e2;\n throw e;\n }\n }\n },\n});\n\nif (!process.env.BABEL_8_BREAKING) {\n // eslint-disable-next-line no-var\n var LOADING_MODULES = new Set();\n}\nfunction* requireModule(type: string, name: string): Handler {\n if (!process.env.BABEL_8_BREAKING) {\n if (!(yield* isAsync()) && LOADING_MODULES.has(name)) {\n throw new Error(\n `Reentrant ${type} detected trying to load \"${name}\". This module is not ignored ` +\n \"and is trying to load itself while compiling itself, leading to a dependency cycle. \" +\n 'We recommend adding it to your \"ignore\" list in your babelrc, or to a .babelignore.',\n );\n }\n }\n\n try {\n if (!process.env.BABEL_8_BREAKING) {\n LOADING_MODULES.add(name);\n }\n return yield* loadCjsOrMjsDefault(\n name,\n `You appear to be using a native ECMAScript module ${type}, ` +\n \"which is only supported when running Babel asynchronously.\",\n // For backward compatibility, we need to support malformed presets\n // defined as separate named exports rather than a single default\n // export.\n // See packages/babel-core/test/fixtures/option-manager/presets/es2015_named.js\n true,\n );\n } catch (err) {\n err.message = `[BABEL]: ${err.message} (While processing: ${name})`;\n throw err;\n } finally {\n if (!process.env.BABEL_8_BREAKING) {\n LOADING_MODULES.delete(name);\n }\n }\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_debug","data","require","_path","_async","_moduleTypes","_url","_importMetaResolve","_fs","debug","buildDebug","EXACT_RE","BABEL_PLUGIN_PREFIX_RE","BABEL_PRESET_PREFIX_RE","BABEL_PLUGIN_ORG_RE","BABEL_PRESET_ORG_RE","OTHER_PLUGIN_ORG_RE","OTHER_PRESET_ORG_RE","OTHER_ORG_DEFAULT_RE","resolvePlugin","exports","resolveStandardizedName","bind","resolvePreset","loadPlugin","name","dirname","filepath","isAsync","value","requireModule","loadPreset","standardizeName","type","path","isAbsolute","isPreset","replace","resolveAlternativesHelper","standardizedName","error","code","message","oppositeType","transformName","tryRequireResolve","id","v","w","split","process","versions","node","resolve","r","paths","b","M","f","_findPath","_nodeModulePaths","concat","Error","tryImportMetaResolve","options","importMetaResolve","resolveStandardizedNameForRequire","it","res","next","done","resolveStandardizedNameForImport","parentUrl","pathToFileURL","join","href","fileURLToPath","resolveESM","supportsESM","resolved","existsSync","Object","assign","e","e2","LOADING_MODULES","Set","has","add","loadCodeDefault","err","delete"],"sources":["../../../src/config/files/plugins.ts"],"sourcesContent":["/**\n * This file handles all logic for converting string-based configuration references into loaded objects.\n */\n\nimport buildDebug from \"debug\";\nimport path from \"path\";\nimport type { Handler } from \"gensync\";\nimport { isAsync } from \"../../gensync-utils/async.ts\";\nimport loadCodeDefault, { supportsESM } from \"./module-types.ts\";\nimport { fileURLToPath, pathToFileURL } from \"url\";\n\nimport { resolve as importMetaResolve } from \"../../vendor/import-meta-resolve.js\";\n\nimport { createRequire } from \"module\";\nimport { existsSync } from \"fs\";\nconst require = createRequire(import.meta.url);\n\nconst debug = buildDebug(\"babel:config:loading:files:plugins\");\n\nconst EXACT_RE = /^module:/;\nconst BABEL_PLUGIN_PREFIX_RE = /^(?!@|module:|[^/]+\\/|babel-plugin-)/;\nconst BABEL_PRESET_PREFIX_RE = /^(?!@|module:|[^/]+\\/|babel-preset-)/;\nconst BABEL_PLUGIN_ORG_RE = /^(@babel\\/)(?!plugin-|[^/]+\\/)/;\nconst BABEL_PRESET_ORG_RE = /^(@babel\\/)(?!preset-|[^/]+\\/)/;\nconst OTHER_PLUGIN_ORG_RE =\n /^(@(?!babel\\/)[^/]+\\/)(?![^/]*babel-plugin(?:-|\\/|$)|[^/]+\\/)/;\nconst OTHER_PRESET_ORG_RE =\n /^(@(?!babel\\/)[^/]+\\/)(?![^/]*babel-preset(?:-|\\/|$)|[^/]+\\/)/;\nconst OTHER_ORG_DEFAULT_RE = /^(@(?!babel$)[^/]+)$/;\n\nexport const resolvePlugin = resolveStandardizedName.bind(null, \"plugin\");\nexport const resolvePreset = resolveStandardizedName.bind(null, \"preset\");\n\nexport function* loadPlugin(\n name: string,\n dirname: string,\n): Handler<{ filepath: string; value: unknown }> {\n const filepath = resolvePlugin(name, dirname, yield* isAsync());\n\n const value = yield* requireModule(\"plugin\", filepath);\n debug(\"Loaded plugin %o from %o.\", name, dirname);\n\n return { filepath, value };\n}\n\nexport function* loadPreset(\n name: string,\n dirname: string,\n): Handler<{ filepath: string; value: unknown }> {\n const filepath = resolvePreset(name, dirname, yield* isAsync());\n\n const value = yield* requireModule(\"preset\", filepath);\n\n debug(\"Loaded preset %o from %o.\", name, dirname);\n\n return { filepath, value };\n}\n\nfunction standardizeName(type: \"plugin\" | \"preset\", name: string) {\n // Let absolute and relative paths through.\n if (path.isAbsolute(name)) return name;\n\n const isPreset = type === \"preset\";\n\n return (\n name\n // foo -> babel-preset-foo\n .replace(\n isPreset ? BABEL_PRESET_PREFIX_RE : BABEL_PLUGIN_PREFIX_RE,\n `babel-${type}-`,\n )\n // @babel/es2015 -> @babel/preset-es2015\n .replace(\n isPreset ? BABEL_PRESET_ORG_RE : BABEL_PLUGIN_ORG_RE,\n `$1${type}-`,\n )\n // @foo/mypreset -> @foo/babel-preset-mypreset\n .replace(\n isPreset ? OTHER_PRESET_ORG_RE : OTHER_PLUGIN_ORG_RE,\n `$1babel-${type}-`,\n )\n // @foo -> @foo/babel-preset\n .replace(OTHER_ORG_DEFAULT_RE, `$1/babel-${type}`)\n // module:mypreset -> mypreset\n .replace(EXACT_RE, \"\")\n );\n}\n\ntype Result = { error: Error; value: null } | { error: null; value: T };\n\nfunction* resolveAlternativesHelper(\n type: \"plugin\" | \"preset\",\n name: string,\n): Iterator> {\n const standardizedName = standardizeName(type, name);\n const { error, value } = yield standardizedName;\n if (!error) return value;\n\n // @ts-expect-error code may not index error\n if (error.code !== \"MODULE_NOT_FOUND\") throw error;\n\n if (standardizedName !== name && !(yield name).error) {\n error.message += `\\n- If you want to resolve \"${name}\", use \"module:${name}\"`;\n }\n\n if (!(yield standardizeName(type, \"@babel/\" + name)).error) {\n error.message += `\\n- Did you mean \"@babel/${name}\"?`;\n }\n\n const oppositeType = type === \"preset\" ? \"plugin\" : \"preset\";\n if (!(yield standardizeName(oppositeType, name)).error) {\n error.message += `\\n- Did you accidentally pass a ${oppositeType} as a ${type}?`;\n }\n\n if (type === \"plugin\") {\n const transformName = standardizedName.replace(\"-proposal-\", \"-transform-\");\n if (transformName !== standardizedName && !(yield transformName).error) {\n error.message += `\\n- Did you mean \"${transformName}\"?`;\n }\n }\n\n error.message += `\\n\nMake sure that all the Babel plugins and presets you are using\nare defined as dependencies or devDependencies in your package.json\nfile. It's possible that the missing plugin is loaded by a preset\nyou are using that forgot to add the plugin to its dependencies: you\ncan workaround this problem by explicitly adding the missing package\nto your top-level package.json.\n`;\n\n throw error;\n}\n\nfunction tryRequireResolve(\n id: string,\n dirname: string | undefined,\n): Result {\n try {\n if (dirname) {\n return { error: null, value: require.resolve(id, { paths: [dirname] }) };\n } else {\n return { error: null, value: require.resolve(id) };\n }\n } catch (error) {\n return { error, value: null };\n }\n}\n\nfunction tryImportMetaResolve(\n id: Parameters[0],\n options: Parameters[1],\n): Result {\n try {\n return { error: null, value: importMetaResolve(id, options) };\n } catch (error) {\n return { error, value: null };\n }\n}\n\nfunction resolveStandardizedNameForRequire(\n type: \"plugin\" | \"preset\",\n name: string,\n dirname: string,\n) {\n const it = resolveAlternativesHelper(type, name);\n let res = it.next();\n while (!res.done) {\n res = it.next(tryRequireResolve(res.value, dirname));\n }\n return res.value;\n}\nfunction resolveStandardizedNameForImport(\n type: \"plugin\" | \"preset\",\n name: string,\n dirname: string,\n) {\n const parentUrl = pathToFileURL(\n path.join(dirname, \"./babel-virtual-resolve-base.js\"),\n ).href;\n\n const it = resolveAlternativesHelper(type, name);\n let res = it.next();\n while (!res.done) {\n res = it.next(tryImportMetaResolve(res.value, parentUrl));\n }\n return fileURLToPath(res.value);\n}\n\nfunction resolveStandardizedName(\n type: \"plugin\" | \"preset\",\n name: string,\n dirname: string,\n resolveESM: boolean,\n) {\n if (!supportsESM || !resolveESM) {\n return resolveStandardizedNameForRequire(type, name, dirname);\n }\n\n try {\n const resolved = resolveStandardizedNameForImport(type, name, dirname);\n // import-meta-resolve 4.0 does not throw if the module is not found.\n if (!existsSync(resolved)) {\n throw Object.assign(\n new Error(`Could not resolve \"${name}\" in file ${dirname}.`),\n { type: \"MODULE_NOT_FOUND\" },\n );\n }\n return resolved;\n } catch (e) {\n try {\n return resolveStandardizedNameForRequire(type, name, dirname);\n } catch (e2) {\n if (e.type === \"MODULE_NOT_FOUND\") throw e;\n if (e2.type === \"MODULE_NOT_FOUND\") throw e2;\n throw e;\n }\n }\n}\n\nif (!process.env.BABEL_8_BREAKING) {\n // eslint-disable-next-line no-var\n var LOADING_MODULES = new Set();\n}\nfunction* requireModule(type: string, name: string): Handler {\n if (!process.env.BABEL_8_BREAKING) {\n if (!(yield* isAsync()) && LOADING_MODULES.has(name)) {\n throw new Error(\n `Reentrant ${type} detected trying to load \"${name}\". This module is not ignored ` +\n \"and is trying to load itself while compiling itself, leading to a dependency cycle. \" +\n 'We recommend adding it to your \"ignore\" list in your babelrc, or to a .babelignore.',\n );\n }\n }\n\n try {\n if (!process.env.BABEL_8_BREAKING) {\n LOADING_MODULES.add(name);\n }\n\n if (process.env.BABEL_8_BREAKING) {\n return yield* loadCodeDefault(\n name,\n `You appear to be using a native ECMAScript module ${type}, ` +\n \"which is only supported when running Babel asynchronously.\",\n );\n } else {\n return yield* loadCodeDefault(\n name,\n `You appear to be using a native ECMAScript module ${type}, ` +\n \"which is only supported when running Babel asynchronously.\",\n // For backward compatibility, we need to support malformed presets\n // defined as separate named exports rather than a single default\n // export.\n // See packages/babel-core/test/fixtures/option-manager/presets/es2015_named.js\n // @ts-ignore(Babel 7 vs Babel 8) This param has been removed\n true,\n );\n }\n } catch (err) {\n err.message = `[BABEL]: ${err.message} (While processing: ${name})`;\n throw err;\n } finally {\n if (!process.env.BABEL_8_BREAKING) {\n LOADING_MODULES.delete(name);\n }\n }\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/files/types.js.map b/node_modules/@babel/core/lib/config/files/types.js.map index 107e58ce7c2a..26fe6fc1aff8 100644 --- a/node_modules/@babel/core/lib/config/files/types.js.map +++ b/node_modules/@babel/core/lib/config/files/types.js.map @@ -1 +1 @@ -{"version":3,"names":[],"sources":["../../../src/config/files/types.ts"],"sourcesContent":["import type { InputOptions } from \"..\";\n\nexport type ConfigFile = {\n filepath: string;\n dirname: string;\n options: InputOptions & { babel?: unknown };\n};\n\nexport type IgnoreFile = {\n filepath: string;\n dirname: string;\n ignore: Array;\n};\n\nexport type RelativeConfig = {\n // The actual config, either from package.json#babel, .babelrc, or\n // .babelrc.js, if there was one.\n config: ConfigFile | null;\n // The .babelignore, if there was one.\n ignore: IgnoreFile | null;\n};\n\nexport type FilePackageData = {\n // The file in the package.\n filepath: string;\n // Any ancestor directories of the file that are within the package.\n directories: Array;\n // The contents of the package.json. May not be found if the package just\n // terminated at a node_modules folder without finding one.\n pkg: ConfigFile | null;\n // True if a package.json or node_modules folder was found while traversing\n // the directory structure.\n isPackage: boolean;\n};\n"],"mappings":""} \ No newline at end of file +{"version":3,"names":[],"sources":["../../../src/config/files/types.ts"],"sourcesContent":["import type { InputOptions } from \"../index.ts\";\n\nexport type ConfigFile = {\n filepath: string;\n dirname: string;\n options: InputOptions & { babel?: unknown };\n};\n\nexport type IgnoreFile = {\n filepath: string;\n dirname: string;\n ignore: Array;\n};\n\nexport type RelativeConfig = {\n // The actual config, either from package.json#babel, .babelrc, or\n // .babelrc.js, if there was one.\n config: ConfigFile | null;\n // The .babelignore, if there was one.\n ignore: IgnoreFile | null;\n};\n\nexport type FilePackageData = {\n // The file in the package.\n filepath: string;\n // Any ancestor directories of the file that are within the package.\n directories: Array;\n // The contents of the package.json. May not be found if the package just\n // terminated at a node_modules folder without finding one.\n pkg: ConfigFile | null;\n // True if a package.json or node_modules folder was found while traversing\n // the directory structure.\n isPackage: boolean;\n};\n"],"mappings":""} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/files/utils.js b/node_modules/@babel/core/lib/config/files/utils.js index 1c4ccbf0d478..406aab9fc08a 100644 --- a/node_modules/@babel/core/lib/config/files/utils.js +++ b/node_modules/@babel/core/lib/config/files/utils.js @@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.makeStaticFileCache = makeStaticFileCache; -var _caching = require("../caching"); -var fs = require("../../gensync-utils/fs"); +var _caching = require("../caching.js"); +var fs = require("../../gensync-utils/fs.js"); function _fs2() { const data = require("fs"); _fs2 = function () { diff --git a/node_modules/@babel/core/lib/config/files/utils.js.map b/node_modules/@babel/core/lib/config/files/utils.js.map index 03629e1c0151..f3260da9d3af 100644 --- a/node_modules/@babel/core/lib/config/files/utils.js.map +++ b/node_modules/@babel/core/lib/config/files/utils.js.map @@ -1 +1 @@ -{"version":3,"names":["makeStaticFileCache","fn","makeStrongCache","filepath","cache","cached","invalidate","fileMtime","fs","readFile","nodeFs","existsSync","statSync","mtime","e","code"],"sources":["../../../src/config/files/utils.ts"],"sourcesContent":["import type { Handler } from \"gensync\";\n\nimport { makeStrongCache } from \"../caching\";\nimport type { CacheConfigurator } from \"../caching\";\nimport * as fs from \"../../gensync-utils/fs\";\nimport nodeFs from \"fs\";\n\nexport function makeStaticFileCache(\n fn: (filepath: string, contents: string) => T,\n) {\n return makeStrongCache(function* (\n filepath: string,\n cache: CacheConfigurator,\n ): Handler {\n const cached = cache.invalidate(() => fileMtime(filepath));\n\n if (cached === null) {\n return null;\n }\n\n return fn(filepath, yield* fs.readFile(filepath, \"utf8\"));\n });\n}\n\nfunction fileMtime(filepath: string): number | null {\n if (!nodeFs.existsSync(filepath)) return null;\n\n try {\n return +nodeFs.statSync(filepath).mtime;\n } catch (e) {\n if (e.code !== \"ENOENT\" && e.code !== \"ENOTDIR\") throw e;\n }\n\n return null;\n}\n"],"mappings":";;;;;;AAEA;AAEA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEO,SAASA,mBAAmB,CACjCC,EAA6C,EAC7C;EACA,OAAO,IAAAC,wBAAe,EAAC,WACrBC,QAAgB,EAChBC,KAA8B,EACX;IACnB,MAAMC,MAAM,GAAGD,KAAK,CAACE,UAAU,CAAC,MAAMC,SAAS,CAACJ,QAAQ,CAAC,CAAC;IAE1D,IAAIE,MAAM,KAAK,IAAI,EAAE;MACnB,OAAO,IAAI;IACb;IAEA,OAAOJ,EAAE,CAACE,QAAQ,EAAE,OAAOK,EAAE,CAACC,QAAQ,CAACN,QAAQ,EAAE,MAAM,CAAC,CAAC;EAC3D,CAAC,CAAC;AACJ;AAEA,SAASI,SAAS,CAACJ,QAAgB,EAAiB;EAClD,IAAI,CAACO,MAAM,CAACC,UAAU,CAACR,QAAQ,CAAC,EAAE,OAAO,IAAI;EAE7C,IAAI;IACF,OAAO,CAACO,MAAM,CAACE,QAAQ,CAACT,QAAQ,CAAC,CAACU,KAAK;EACzC,CAAC,CAAC,OAAOC,CAAC,EAAE;IACV,IAAIA,CAAC,CAACC,IAAI,KAAK,QAAQ,IAAID,CAAC,CAACC,IAAI,KAAK,SAAS,EAAE,MAAMD,CAAC;EAC1D;EAEA,OAAO,IAAI;AACb;AAAC"} \ No newline at end of file +{"version":3,"names":["_caching","require","fs","_fs2","data","makeStaticFileCache","fn","makeStrongCache","filepath","cache","cached","invalidate","fileMtime","readFile","nodeFs","existsSync","statSync","mtime","e","code"],"sources":["../../../src/config/files/utils.ts"],"sourcesContent":["import type { Handler } from \"gensync\";\n\nimport { makeStrongCache } from \"../caching.ts\";\nimport type { CacheConfigurator } from \"../caching.ts\";\nimport * as fs from \"../../gensync-utils/fs.ts\";\nimport nodeFs from \"fs\";\n\nexport function makeStaticFileCache(\n fn: (filepath: string, contents: string) => T,\n) {\n return makeStrongCache(function* (\n filepath: string,\n cache: CacheConfigurator,\n ): Handler {\n const cached = cache.invalidate(() => fileMtime(filepath));\n\n if (cached === null) {\n return null;\n }\n\n return fn(filepath, yield* fs.readFile(filepath, \"utf8\"));\n });\n}\n\nfunction fileMtime(filepath: string): number | null {\n if (!nodeFs.existsSync(filepath)) return null;\n\n try {\n return +nodeFs.statSync(filepath).mtime;\n } catch (e) {\n if (e.code !== \"ENOENT\" && e.code !== \"ENOTDIR\") throw e;\n }\n\n return null;\n}\n"],"mappings":";;;;;;AAEA,IAAAA,QAAA,GAAAC,OAAA;AAEA,IAAAC,EAAA,GAAAD,OAAA;AACA,SAAAE,KAAA;EAAA,MAAAC,IAAA,GAAAH,OAAA;EAAAE,IAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEO,SAASC,mBAAmBA,CACjCC,EAA6C,EAC7C;EACA,OAAO,IAAAC,wBAAe,EAAC,WACrBC,QAAgB,EAChBC,KAA8B,EACX;IACnB,MAAMC,MAAM,GAAGD,KAAK,CAACE,UAAU,CAAC,MAAMC,SAAS,CAACJ,QAAQ,CAAC,CAAC;IAE1D,IAAIE,MAAM,KAAK,IAAI,EAAE;MACnB,OAAO,IAAI;IACb;IAEA,OAAOJ,EAAE,CAACE,QAAQ,EAAE,OAAON,EAAE,CAACW,QAAQ,CAACL,QAAQ,EAAE,MAAM,CAAC,CAAC;EAC3D,CAAC,CAAC;AACJ;AAEA,SAASI,SAASA,CAACJ,QAAgB,EAAiB;EAClD,IAAI,CAACM,KAAKA,CAAC,CAACC,UAAU,CAACP,QAAQ,CAAC,EAAE,OAAO,IAAI;EAE7C,IAAI;IACF,OAAO,CAACM,KAAKA,CAAC,CAACE,QAAQ,CAACR,QAAQ,CAAC,CAACS,KAAK;EACzC,CAAC,CAAC,OAAOC,CAAC,EAAE;IACV,IAAIA,CAAC,CAACC,IAAI,KAAK,QAAQ,IAAID,CAAC,CAACC,IAAI,KAAK,SAAS,EAAE,MAAMD,CAAC;EAC1D;EAEA,OAAO,IAAI;AACb;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/full.js b/node_modules/@babel/core/lib/config/full.js index 172992f59636..6b8c2959dea1 100644 --- a/node_modules/@babel/core/lib/config/full.js +++ b/node_modules/@babel/core/lib/config/full.js @@ -11,13 +11,13 @@ function _gensync() { }; return data; } -var _async = require("../gensync-utils/async"); -var _util = require("./util"); -var context = require("../index"); -var _plugin = require("./plugin"); -var _item = require("./item"); -var _configChain = require("./config-chain"); -var _deepArray = require("./helpers/deep-array"); +var _async = require("../gensync-utils/async.js"); +var _util = require("./util.js"); +var context = require("../index.js"); +var _plugin = require("./plugin.js"); +var _item = require("./item.js"); +var _configChain = require("./config-chain.js"); +var _deepArray = require("./helpers/deep-array.js"); function _traverse() { const data = require("@babel/traverse"); _traverse = function () { @@ -25,13 +25,13 @@ function _traverse() { }; return data; } -var _caching = require("./caching"); -var _options = require("./validation/options"); -var _plugins = require("./validation/plugins"); -var _configApi = require("./helpers/config-api"); -var _partial = require("./partial"); -var _configError = require("../errors/config-error"); -var _default = _gensync()(function* loadFullConfig(inputOpts) { +var _caching = require("./caching.js"); +var _options = require("./validation/options.js"); +var _plugins = require("./validation/plugins.js"); +var _configApi = require("./helpers/config-api.js"); +var _partial = require("./partial.js"); +var _configError = require("../errors/config-error.js"); +var _default = exports.default = _gensync()(function* loadFullConfig(inputOpts) { var _opts$assumptions; const result = yield* (0, _partial.default)(inputOpts); if (!result) { @@ -82,7 +82,6 @@ var _default = _gensync()(function* loadFullConfig(inputOpts) { throw e; } externalDependencies.push(preset.externalDependencies); - if (descriptor.ownPass) { presets.push({ preset: preset.chain, @@ -96,7 +95,6 @@ var _default = _gensync()(function* loadFullConfig(inputOpts) { } } } - if (presets.length > 0) { pluginDescriptorsByPass.splice(1, 0, ...presets.map(o => o.pass).filter(p => p !== pluginDescriptorsPass)); for (const { @@ -152,7 +150,6 @@ var _default = _gensync()(function* loadFullConfig(inputOpts) { externalDependencies: (0, _deepArray.finalize)(externalDependencies) }; }); -exports.default = _default; function enhanceError(context, fn) { return function* (arg1, arg2) { try { @@ -166,7 +163,6 @@ function enhanceError(context, fn) { } }; } - const makeDescriptorLoader = apiFactory => (0, _caching.makeWeakCache)(function* ({ value, options, @@ -253,7 +249,6 @@ const instantiatePlugin = (0, _caching.makeWeakCache)(function* ({ } return new _plugin.default(plugin, options, alias, externalDependencies); }); - function* loadPluginDescriptor(descriptor, context) { if (descriptor.value instanceof _plugin.default) { if (descriptor.options) { @@ -272,13 +267,12 @@ const validateIfOptionNeedsFilename = (options, descriptor) => { }; const validatePreset = (preset, context, descriptor) => { if (!context.filename) { + var _options$overrides; const { options } = preset; validateIfOptionNeedsFilename(options, descriptor); - if (options.overrides) { - options.overrides.forEach(overrideOptions => validateIfOptionNeedsFilename(overrideOptions, descriptor)); - } + (_options$overrides = options.overrides) == null || _options$overrides.forEach(overrideOptions => validateIfOptionNeedsFilename(overrideOptions, descriptor)); } }; const instantiatePreset = (0, _caching.makeWeakCacheSync)(({ @@ -294,7 +288,6 @@ const instantiatePreset = (0, _caching.makeWeakCacheSync)(({ externalDependencies }; }); - function* loadPresetDescriptor(descriptor, context) { const preset = instantiatePreset(yield* presetDescriptorLoader(descriptor, context)); validatePreset(preset, context, descriptor); diff --git a/node_modules/@babel/core/lib/config/full.js.map b/node_modules/@babel/core/lib/config/full.js.map index b51016df567d..b4458b9044e8 100644 --- a/node_modules/@babel/core/lib/config/full.js.map +++ b/node_modules/@babel/core/lib/config/full.js.map @@ -1 +1 @@ -{"version":3,"names":["gensync","loadFullConfig","inputOpts","result","loadPrivatePartialConfig","options","context","fileHandling","optionDefaults","plugins","presets","Error","presetContext","targets","toDescriptor","item","desc","getItemDescriptor","presetsDescriptors","map","initialPluginsDescriptors","pluginDescriptorsByPass","passes","externalDependencies","ignored","enhanceError","recursePresetDescriptors","rawPresets","pluginDescriptorsPass","i","length","descriptor","preset","loadPresetDescriptor","e","code","checkNoUnwrappedItemOptionPairs","push","ownPass","chain","pass","unshift","splice","o","filter","p","forEach","opts","mergeOptions","pluginContext","assumptions","loadPluginDescriptors","descs","plugin","loadPluginDescriptor","slice","passPerPreset","freezeDeepArray","fn","arg1","arg2","test","message","filename","makeDescriptorLoader","apiFactory","makeWeakCache","value","dirname","alias","cache","factory","maybeAsync","api","JSON","stringify","isThenable","configured","mode","error","pluginDescriptorLoader","makePluginAPI","presetDescriptorLoader","makePresetAPI","instantiatePlugin","pluginObj","validatePluginObject","visitor","traverse","explode","inherits","inheritsDescriptor","name","undefined","forwardAsync","run","invalidate","data","pre","post","manipulateOptions","visitors","merge","Plugin","needsFilename","val","validateIfOptionNeedsFilename","include","exclude","formattedPresetName","ConfigError","join","validatePreset","overrides","overrideOptions","instantiatePreset","makeWeakCacheSync","validate","buildPresetChain","a","b","fns","Boolean","args","apply"],"sources":["../../src/config/full.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\nimport { forwardAsync, maybeAsync, isThenable } from \"../gensync-utils/async\";\n\nimport { mergeOptions } from \"./util\";\nimport * as context from \"../index\";\nimport Plugin from \"./plugin\";\nimport { getItemDescriptor } from \"./item\";\nimport { buildPresetChain } from \"./config-chain\";\nimport { finalize as freezeDeepArray } from \"./helpers/deep-array\";\nimport type { DeepArray, ReadonlyDeepArray } from \"./helpers/deep-array\";\nimport type {\n ConfigContext,\n ConfigChain,\n PresetInstance,\n} from \"./config-chain\";\nimport type { UnloadedDescriptor } from \"./config-descriptors\";\nimport traverse from \"@babel/traverse\";\nimport { makeWeakCache, makeWeakCacheSync } from \"./caching\";\nimport type { CacheConfigurator } from \"./caching\";\nimport {\n validate,\n checkNoUnwrappedItemOptionPairs,\n} from \"./validation/options\";\nimport type { PluginItem } from \"./validation/options\";\nimport { validatePluginObject } from \"./validation/plugins\";\nimport { makePluginAPI, makePresetAPI } from \"./helpers/config-api\";\nimport type { PluginAPI, PresetAPI } from \"./helpers/config-api\";\n\nimport loadPrivatePartialConfig from \"./partial\";\nimport type { ValidatedOptions } from \"./validation/options\";\n\nimport type * as Context from \"./cache-contexts\";\nimport ConfigError from \"../errors/config-error\";\n\ntype LoadedDescriptor = {\n value: {};\n options: {};\n dirname: string;\n alias: string;\n externalDependencies: ReadonlyDeepArray;\n};\n\nexport type { InputOptions } from \"./validation/options\";\n\nexport type ResolvedConfig = {\n options: any;\n passes: PluginPasses;\n externalDependencies: ReadonlyDeepArray;\n};\n\nexport type { Plugin };\nexport type PluginPassList = Array;\nexport type PluginPasses = Array;\n\nexport default gensync(function* loadFullConfig(\n inputOpts: unknown,\n): Handler {\n const result = yield* loadPrivatePartialConfig(inputOpts);\n if (!result) {\n return null;\n }\n const { options, context, fileHandling } = result;\n\n if (fileHandling === \"ignored\") {\n return null;\n }\n\n const optionDefaults = {};\n\n const { plugins, presets } = options;\n\n if (!plugins || !presets) {\n throw new Error(\"Assertion failure - plugins and presets exist\");\n }\n\n const presetContext: Context.FullPreset = {\n ...context,\n targets: options.targets,\n };\n\n const toDescriptor = (item: PluginItem) => {\n const desc = getItemDescriptor(item);\n if (!desc) {\n throw new Error(\"Assertion failure - must be config item\");\n }\n\n return desc;\n };\n\n const presetsDescriptors = presets.map(toDescriptor);\n const initialPluginsDescriptors = plugins.map(toDescriptor);\n const pluginDescriptorsByPass: Array> = [[]];\n const passes: Array> = [];\n\n const externalDependencies: DeepArray = [];\n\n const ignored = yield* enhanceError(\n context,\n function* recursePresetDescriptors(\n rawPresets: Array,\n pluginDescriptorsPass: Array,\n ): Handler {\n const presets: Array<{\n preset: ConfigChain | null;\n pass: Array;\n }> = [];\n\n for (let i = 0; i < rawPresets.length; i++) {\n const descriptor = rawPresets[i];\n if (descriptor.options !== false) {\n try {\n // eslint-disable-next-line no-var\n var preset = yield* loadPresetDescriptor(descriptor, presetContext);\n } catch (e) {\n if (e.code === \"BABEL_UNKNOWN_OPTION\") {\n checkNoUnwrappedItemOptionPairs(rawPresets, i, \"preset\", e);\n }\n throw e;\n }\n\n externalDependencies.push(preset.externalDependencies);\n\n // Presets normally run in reverse order, but if they\n // have their own pass they run after the presets\n // in the previous pass.\n if (descriptor.ownPass) {\n presets.push({ preset: preset.chain, pass: [] });\n } else {\n presets.unshift({\n preset: preset.chain,\n pass: pluginDescriptorsPass,\n });\n }\n }\n }\n\n // resolve presets\n if (presets.length > 0) {\n // The passes are created in the same order as the preset list, but are inserted before any\n // existing additional passes.\n pluginDescriptorsByPass.splice(\n 1,\n 0,\n ...presets.map(o => o.pass).filter(p => p !== pluginDescriptorsPass),\n );\n\n for (const { preset, pass } of presets) {\n if (!preset) return true;\n\n pass.push(...preset.plugins);\n\n const ignored = yield* recursePresetDescriptors(preset.presets, pass);\n if (ignored) return true;\n\n preset.options.forEach(opts => {\n mergeOptions(optionDefaults, opts);\n });\n }\n }\n },\n )(presetsDescriptors, pluginDescriptorsByPass[0]);\n\n if (ignored) return null;\n\n const opts: any = optionDefaults;\n mergeOptions(opts, options);\n\n const pluginContext: Context.FullPlugin = {\n ...presetContext,\n assumptions: opts.assumptions ?? {},\n };\n\n yield* enhanceError(context, function* loadPluginDescriptors() {\n pluginDescriptorsByPass[0].unshift(...initialPluginsDescriptors);\n\n for (const descs of pluginDescriptorsByPass) {\n const pass: Plugin[] = [];\n passes.push(pass);\n\n for (let i = 0; i < descs.length; i++) {\n const descriptor: UnloadedDescriptor = descs[i];\n if (descriptor.options !== false) {\n try {\n // eslint-disable-next-line no-var\n var plugin = yield* loadPluginDescriptor(descriptor, pluginContext);\n } catch (e) {\n if (e.code === \"BABEL_UNKNOWN_PLUGIN_PROPERTY\") {\n // print special message for `plugins: [\"@babel/foo\", { foo: \"option\" }]`\n checkNoUnwrappedItemOptionPairs(descs, i, \"plugin\", e);\n }\n throw e;\n }\n pass.push(plugin);\n\n externalDependencies.push(plugin.externalDependencies);\n }\n }\n }\n })();\n\n opts.plugins = passes[0];\n opts.presets = passes\n .slice(1)\n .filter(plugins => plugins.length > 0)\n .map(plugins => ({ plugins }));\n opts.passPerPreset = opts.presets.length > 0;\n\n return {\n options: opts,\n passes: passes,\n externalDependencies: freezeDeepArray(externalDependencies),\n };\n});\n\nfunction enhanceError(context: ConfigContext, fn: T): T {\n return function* (arg1: unknown, arg2: unknown) {\n try {\n return yield* fn(arg1, arg2);\n } catch (e) {\n // There are a few case where thrown errors will try to annotate themselves multiple times, so\n // to keep things simple we just bail out if re-wrapping the message.\n if (!/^\\[BABEL\\]/.test(e.message)) {\n e.message = `[BABEL] ${context.filename ?? \"unknown file\"}: ${\n e.message\n }`;\n }\n\n throw e;\n }\n } as any;\n}\n\n/**\n * Load a generic plugin/preset from the given descriptor loaded from the config object.\n */\nconst makeDescriptorLoader = (\n apiFactory: (\n cache: CacheConfigurator,\n externalDependencies: Array,\n ) => API,\n) =>\n makeWeakCache(function* (\n { value, options, dirname, alias }: UnloadedDescriptor,\n cache: CacheConfigurator,\n ): Handler {\n // Disabled presets should already have been filtered out\n if (options === false) throw new Error(\"Assertion failure\");\n\n options = options || {};\n\n const externalDependencies: Array = [];\n\n let item = value;\n if (typeof value === \"function\") {\n const factory = maybeAsync(\n value,\n `You appear to be using an async plugin/preset, but Babel has been called synchronously`,\n );\n\n const api = {\n ...context,\n ...apiFactory(cache, externalDependencies),\n };\n try {\n item = yield* factory(api, options, dirname);\n } catch (e) {\n if (alias) {\n e.message += ` (While processing: ${JSON.stringify(alias)})`;\n }\n throw e;\n }\n }\n\n if (!item || typeof item !== \"object\") {\n throw new Error(\"Plugin/Preset did not return an object.\");\n }\n\n if (isThenable(item)) {\n // @ts-expect-error - if we want to support async plugins\n yield* [];\n\n throw new Error(\n `You appear to be using a promise as a plugin, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, ` +\n `you may need to upgrade your @babel/core version. ` +\n `As an alternative, you can prefix the promise with \"await\". ` +\n `(While processing: ${JSON.stringify(alias)})`,\n );\n }\n\n if (\n externalDependencies.length > 0 &&\n (!cache.configured() || cache.mode() === \"forever\")\n ) {\n let error =\n `A plugin/preset has external untracked dependencies ` +\n `(${externalDependencies[0]}), but the cache `;\n if (!cache.configured()) {\n error += `has not been configured to be invalidated when the external dependencies change. `;\n } else {\n error += ` has been configured to never be invalidated. `;\n }\n error +=\n `Plugins/presets should configure their cache to be invalidated when the external ` +\n `dependencies change, for example using \\`api.cache.invalidate(() => ` +\n `statSync(filepath).mtimeMs)\\` or \\`api.cache.never()\\`\\n` +\n `(While processing: ${JSON.stringify(alias)})`;\n\n throw new Error(error);\n }\n\n return {\n value: item,\n options,\n dirname,\n alias,\n externalDependencies: freezeDeepArray(externalDependencies),\n };\n });\n\nconst pluginDescriptorLoader = makeDescriptorLoader<\n Context.SimplePlugin,\n PluginAPI\n>(makePluginAPI);\nconst presetDescriptorLoader = makeDescriptorLoader<\n Context.SimplePreset,\n PresetAPI\n>(makePresetAPI);\n\nconst instantiatePlugin = makeWeakCache(function* (\n { value, options, dirname, alias, externalDependencies }: LoadedDescriptor,\n cache: CacheConfigurator,\n): Handler {\n const pluginObj = validatePluginObject(value);\n\n const plugin = {\n ...pluginObj,\n };\n if (plugin.visitor) {\n plugin.visitor = traverse.explode({\n ...plugin.visitor,\n });\n }\n\n if (plugin.inherits) {\n const inheritsDescriptor: UnloadedDescriptor = {\n name: undefined,\n alias: `${alias}$inherits`,\n value: plugin.inherits,\n options,\n dirname,\n };\n\n const inherits = yield* forwardAsync(loadPluginDescriptor, run => {\n // If the inherited plugin changes, reinstantiate this plugin.\n return cache.invalidate(data => run(inheritsDescriptor, data));\n });\n\n plugin.pre = chain(inherits.pre, plugin.pre);\n plugin.post = chain(inherits.post, plugin.post);\n plugin.manipulateOptions = chain(\n inherits.manipulateOptions,\n plugin.manipulateOptions,\n );\n plugin.visitor = traverse.visitors.merge([\n inherits.visitor || {},\n plugin.visitor || {},\n ]);\n\n if (inherits.externalDependencies.length > 0) {\n if (externalDependencies.length === 0) {\n externalDependencies = inherits.externalDependencies;\n } else {\n externalDependencies = freezeDeepArray([\n externalDependencies,\n inherits.externalDependencies,\n ]);\n }\n }\n }\n\n return new Plugin(plugin, options, alias, externalDependencies);\n});\n\n/**\n * Instantiate a plugin for the given descriptor, returning the plugin/options pair.\n */\nfunction* loadPluginDescriptor(\n descriptor: UnloadedDescriptor,\n context: Context.SimplePlugin,\n): Handler {\n if (descriptor.value instanceof Plugin) {\n if (descriptor.options) {\n throw new Error(\n \"Passed options to an existing Plugin instance will not work.\",\n );\n }\n\n return descriptor.value;\n }\n\n return yield* instantiatePlugin(\n yield* pluginDescriptorLoader(descriptor, context),\n context,\n );\n}\n\nconst needsFilename = (val: unknown) => val && typeof val !== \"function\";\n\nconst validateIfOptionNeedsFilename = (\n options: ValidatedOptions,\n descriptor: UnloadedDescriptor,\n): void => {\n if (\n needsFilename(options.test) ||\n needsFilename(options.include) ||\n needsFilename(options.exclude)\n ) {\n const formattedPresetName = descriptor.name\n ? `\"${descriptor.name}\"`\n : \"/* your preset */\";\n throw new ConfigError(\n [\n `Preset ${formattedPresetName} requires a filename to be set when babel is called directly,`,\n `\\`\\`\\``,\n `babel.transformSync(code, { filename: 'file.ts', presets: [${formattedPresetName}] });`,\n `\\`\\`\\``,\n `See https://babeljs.io/docs/en/options#filename for more information.`,\n ].join(\"\\n\"),\n );\n }\n};\n\nconst validatePreset = (\n preset: PresetInstance,\n context: ConfigContext,\n descriptor: UnloadedDescriptor,\n): void => {\n if (!context.filename) {\n const { options } = preset;\n validateIfOptionNeedsFilename(options, descriptor);\n if (options.overrides) {\n options.overrides.forEach(overrideOptions =>\n validateIfOptionNeedsFilename(overrideOptions, descriptor),\n );\n }\n }\n};\n\nconst instantiatePreset = makeWeakCacheSync(\n ({\n value,\n dirname,\n alias,\n externalDependencies,\n }: LoadedDescriptor): PresetInstance => {\n return {\n options: validate(\"preset\", value),\n alias,\n dirname,\n externalDependencies,\n };\n },\n);\n\n/**\n * Generate a config object that will act as the root of a new nested config.\n */\nfunction* loadPresetDescriptor(\n descriptor: UnloadedDescriptor,\n context: Context.FullPreset,\n): Handler<{\n chain: ConfigChain | null;\n externalDependencies: ReadonlyDeepArray;\n}> {\n const preset = instantiatePreset(\n yield* presetDescriptorLoader(descriptor, context),\n );\n validatePreset(preset, context, descriptor);\n return {\n chain: yield* buildPresetChain(preset, context),\n externalDependencies: preset.externalDependencies,\n };\n}\n\nfunction chain(\n a: undefined | ((...args: Args) => void),\n b: undefined | ((...args: Args) => void),\n) {\n const fns = [a, b].filter(Boolean);\n if (fns.length <= 1) return fns[0];\n\n return function (this: unknown, ...args: unknown[]) {\n for (const fn of fns) {\n fn.apply(this, args);\n }\n };\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_gensync","data","require","_async","_util","context","_plugin","_item","_configChain","_deepArray","_traverse","_caching","_options","_plugins","_configApi","_partial","_configError","_default","exports","default","gensync","loadFullConfig","inputOpts","_opts$assumptions","result","loadPrivatePartialConfig","options","fileHandling","optionDefaults","plugins","presets","Error","presetContext","Object","assign","targets","toDescriptor","item","desc","getItemDescriptor","presetsDescriptors","map","initialPluginsDescriptors","pluginDescriptorsByPass","passes","externalDependencies","ignored","enhanceError","recursePresetDescriptors","rawPresets","pluginDescriptorsPass","i","length","descriptor","preset","loadPresetDescriptor","e","code","checkNoUnwrappedItemOptionPairs","push","ownPass","chain","pass","unshift","splice","o","filter","p","forEach","opts","mergeOptions","pluginContext","assumptions","loadPluginDescriptors","descs","plugin","loadPluginDescriptor","slice","passPerPreset","freezeDeepArray","fn","arg1","arg2","test","message","_context$filename","filename","makeDescriptorLoader","apiFactory","makeWeakCache","value","dirname","alias","cache","factory","maybeAsync","api","JSON","stringify","isThenable","configured","mode","error","pluginDescriptorLoader","makePluginAPI","presetDescriptorLoader","makePresetAPI","instantiatePlugin","pluginObj","validatePluginObject","visitor","traverse","explode","inherits","inheritsDescriptor","name","undefined","forwardAsync","run","invalidate","pre","post","manipulateOptions","visitors","merge","Plugin","needsFilename","val","validateIfOptionNeedsFilename","include","exclude","formattedPresetName","ConfigError","join","validatePreset","_options$overrides","overrides","overrideOptions","instantiatePreset","makeWeakCacheSync","validate","buildPresetChain","a","b","fns","Boolean","args","apply"],"sources":["../../src/config/full.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\nimport {\n forwardAsync,\n maybeAsync,\n isThenable,\n} from \"../gensync-utils/async.ts\";\n\nimport { mergeOptions } from \"./util.ts\";\nimport * as context from \"../index.ts\";\nimport Plugin from \"./plugin.ts\";\nimport { getItemDescriptor } from \"./item.ts\";\nimport { buildPresetChain } from \"./config-chain.ts\";\nimport { finalize as freezeDeepArray } from \"./helpers/deep-array.ts\";\nimport type { DeepArray, ReadonlyDeepArray } from \"./helpers/deep-array.ts\";\nimport type {\n ConfigContext,\n ConfigChain,\n PresetInstance,\n} from \"./config-chain.ts\";\nimport type { UnloadedDescriptor } from \"./config-descriptors.ts\";\nimport traverse from \"@babel/traverse\";\nimport { makeWeakCache, makeWeakCacheSync } from \"./caching.ts\";\nimport type { CacheConfigurator } from \"./caching.ts\";\nimport {\n validate,\n checkNoUnwrappedItemOptionPairs,\n} from \"./validation/options.ts\";\nimport type { PluginItem } from \"./validation/options.ts\";\nimport { validatePluginObject } from \"./validation/plugins.ts\";\nimport { makePluginAPI, makePresetAPI } from \"./helpers/config-api.ts\";\nimport type { PluginAPI, PresetAPI } from \"./helpers/config-api.ts\";\n\nimport loadPrivatePartialConfig from \"./partial.ts\";\nimport type { ValidatedOptions } from \"./validation/options.ts\";\n\nimport type * as Context from \"./cache-contexts.ts\";\nimport ConfigError from \"../errors/config-error.ts\";\n\ntype LoadedDescriptor = {\n value: {};\n options: {};\n dirname: string;\n alias: string;\n externalDependencies: ReadonlyDeepArray;\n};\n\nexport type { InputOptions } from \"./validation/options.ts\";\n\nexport type ResolvedConfig = {\n options: any;\n passes: PluginPasses;\n externalDependencies: ReadonlyDeepArray;\n};\n\nexport type { Plugin };\nexport type PluginPassList = Array;\nexport type PluginPasses = Array;\n\nexport default gensync(function* loadFullConfig(\n inputOpts: unknown,\n): Handler {\n const result = yield* loadPrivatePartialConfig(inputOpts);\n if (!result) {\n return null;\n }\n const { options, context, fileHandling } = result;\n\n if (fileHandling === \"ignored\") {\n return null;\n }\n\n const optionDefaults = {};\n\n const { plugins, presets } = options;\n\n if (!plugins || !presets) {\n throw new Error(\"Assertion failure - plugins and presets exist\");\n }\n\n const presetContext: Context.FullPreset = {\n ...context,\n targets: options.targets,\n };\n\n const toDescriptor = (item: PluginItem) => {\n const desc = getItemDescriptor(item);\n if (!desc) {\n throw new Error(\"Assertion failure - must be config item\");\n }\n\n return desc;\n };\n\n const presetsDescriptors = presets.map(toDescriptor);\n const initialPluginsDescriptors = plugins.map(toDescriptor);\n const pluginDescriptorsByPass: Array>> = [\n [],\n ];\n const passes: Array> = [];\n\n const externalDependencies: DeepArray = [];\n\n const ignored = yield* enhanceError(\n context,\n function* recursePresetDescriptors(\n rawPresets: Array>,\n pluginDescriptorsPass: Array>,\n ): Handler {\n const presets: Array<{\n preset: ConfigChain | null;\n pass: Array>;\n }> = [];\n\n for (let i = 0; i < rawPresets.length; i++) {\n const descriptor = rawPresets[i];\n if (descriptor.options !== false) {\n try {\n // eslint-disable-next-line no-var\n var preset = yield* loadPresetDescriptor(descriptor, presetContext);\n } catch (e) {\n if (e.code === \"BABEL_UNKNOWN_OPTION\") {\n checkNoUnwrappedItemOptionPairs(rawPresets, i, \"preset\", e);\n }\n throw e;\n }\n\n externalDependencies.push(preset.externalDependencies);\n\n // Presets normally run in reverse order, but if they\n // have their own pass they run after the presets\n // in the previous pass.\n if (descriptor.ownPass) {\n presets.push({ preset: preset.chain, pass: [] });\n } else {\n presets.unshift({\n preset: preset.chain,\n pass: pluginDescriptorsPass,\n });\n }\n }\n }\n\n // resolve presets\n if (presets.length > 0) {\n // The passes are created in the same order as the preset list, but are inserted before any\n // existing additional passes.\n pluginDescriptorsByPass.splice(\n 1,\n 0,\n ...presets.map(o => o.pass).filter(p => p !== pluginDescriptorsPass),\n );\n\n for (const { preset, pass } of presets) {\n if (!preset) return true;\n\n pass.push(...preset.plugins);\n\n const ignored = yield* recursePresetDescriptors(preset.presets, pass);\n if (ignored) return true;\n\n preset.options.forEach(opts => {\n mergeOptions(optionDefaults, opts);\n });\n }\n }\n },\n )(presetsDescriptors, pluginDescriptorsByPass[0]);\n\n if (ignored) return null;\n\n const opts: any = optionDefaults;\n mergeOptions(opts, options);\n\n const pluginContext: Context.FullPlugin = {\n ...presetContext,\n assumptions: opts.assumptions ?? {},\n };\n\n yield* enhanceError(context, function* loadPluginDescriptors() {\n pluginDescriptorsByPass[0].unshift(...initialPluginsDescriptors);\n\n for (const descs of pluginDescriptorsByPass) {\n const pass: Plugin[] = [];\n passes.push(pass);\n\n for (let i = 0; i < descs.length; i++) {\n const descriptor = descs[i];\n if (descriptor.options !== false) {\n try {\n // eslint-disable-next-line no-var\n var plugin = yield* loadPluginDescriptor(descriptor, pluginContext);\n } catch (e) {\n if (e.code === \"BABEL_UNKNOWN_PLUGIN_PROPERTY\") {\n // print special message for `plugins: [\"@babel/foo\", { foo: \"option\" }]`\n checkNoUnwrappedItemOptionPairs(descs, i, \"plugin\", e);\n }\n throw e;\n }\n pass.push(plugin);\n\n externalDependencies.push(plugin.externalDependencies);\n }\n }\n }\n })();\n\n opts.plugins = passes[0];\n opts.presets = passes\n .slice(1)\n .filter(plugins => plugins.length > 0)\n .map(plugins => ({ plugins }));\n opts.passPerPreset = opts.presets.length > 0;\n\n return {\n options: opts,\n passes: passes,\n externalDependencies: freezeDeepArray(externalDependencies),\n };\n});\n\nfunction enhanceError(context: ConfigContext, fn: T): T {\n return function* (arg1: unknown, arg2: unknown) {\n try {\n return yield* fn(arg1, arg2);\n } catch (e) {\n // There are a few case where thrown errors will try to annotate themselves multiple times, so\n // to keep things simple we just bail out if re-wrapping the message.\n if (!/^\\[BABEL\\]/.test(e.message)) {\n e.message = `[BABEL] ${context.filename ?? \"unknown file\"}: ${\n e.message\n }`;\n }\n\n throw e;\n }\n } as any;\n}\n\n/**\n * Load a generic plugin/preset from the given descriptor loaded from the config object.\n */\nconst makeDescriptorLoader = (\n apiFactory: (\n cache: CacheConfigurator,\n externalDependencies: Array,\n ) => API,\n) =>\n makeWeakCache(function* (\n { value, options, dirname, alias }: UnloadedDescriptor,\n cache: CacheConfigurator,\n ): Handler {\n // Disabled presets should already have been filtered out\n if (options === false) throw new Error(\"Assertion failure\");\n\n options = options || {};\n\n const externalDependencies: Array = [];\n\n let item: unknown = value;\n if (typeof value === \"function\") {\n const factory = maybeAsync(\n value as (api: API, options: {}, dirname: string) => unknown,\n `You appear to be using an async plugin/preset, but Babel has been called synchronously`,\n );\n\n const api = {\n ...context,\n ...apiFactory(cache, externalDependencies),\n };\n try {\n item = yield* factory(api, options, dirname);\n } catch (e) {\n if (alias) {\n e.message += ` (While processing: ${JSON.stringify(alias)})`;\n }\n throw e;\n }\n }\n\n if (!item || typeof item !== \"object\") {\n throw new Error(\"Plugin/Preset did not return an object.\");\n }\n\n if (isThenable(item)) {\n // @ts-expect-error - if we want to support async plugins\n yield* [];\n\n throw new Error(\n `You appear to be using a promise as a plugin, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, ` +\n `you may need to upgrade your @babel/core version. ` +\n `As an alternative, you can prefix the promise with \"await\". ` +\n `(While processing: ${JSON.stringify(alias)})`,\n );\n }\n\n if (\n externalDependencies.length > 0 &&\n (!cache.configured() || cache.mode() === \"forever\")\n ) {\n let error =\n `A plugin/preset has external untracked dependencies ` +\n `(${externalDependencies[0]}), but the cache `;\n if (!cache.configured()) {\n error += `has not been configured to be invalidated when the external dependencies change. `;\n } else {\n error += ` has been configured to never be invalidated. `;\n }\n error +=\n `Plugins/presets should configure their cache to be invalidated when the external ` +\n `dependencies change, for example using \\`api.cache.invalidate(() => ` +\n `statSync(filepath).mtimeMs)\\` or \\`api.cache.never()\\`\\n` +\n `(While processing: ${JSON.stringify(alias)})`;\n\n throw new Error(error);\n }\n\n return {\n value: item,\n options,\n dirname,\n alias,\n externalDependencies: freezeDeepArray(externalDependencies),\n };\n });\n\nconst pluginDescriptorLoader = makeDescriptorLoader<\n Context.SimplePlugin,\n PluginAPI\n>(makePluginAPI);\nconst presetDescriptorLoader = makeDescriptorLoader<\n Context.SimplePreset,\n PresetAPI\n>(makePresetAPI);\n\nconst instantiatePlugin = makeWeakCache(function* (\n { value, options, dirname, alias, externalDependencies }: LoadedDescriptor,\n cache: CacheConfigurator,\n): Handler {\n const pluginObj = validatePluginObject(value);\n\n const plugin = {\n ...pluginObj,\n };\n if (plugin.visitor) {\n plugin.visitor = traverse.explode({\n ...plugin.visitor,\n });\n }\n\n if (plugin.inherits) {\n const inheritsDescriptor: UnloadedDescriptor = {\n name: undefined,\n alias: `${alias}$inherits`,\n value: plugin.inherits,\n options,\n dirname,\n };\n\n const inherits = yield* forwardAsync(loadPluginDescriptor, run => {\n // If the inherited plugin changes, reinstantiate this plugin.\n return cache.invalidate(data => run(inheritsDescriptor, data));\n });\n\n plugin.pre = chain(inherits.pre, plugin.pre);\n plugin.post = chain(inherits.post, plugin.post);\n plugin.manipulateOptions = chain(\n inherits.manipulateOptions,\n plugin.manipulateOptions,\n );\n plugin.visitor = traverse.visitors.merge([\n inherits.visitor || {},\n plugin.visitor || {},\n ]);\n\n if (inherits.externalDependencies.length > 0) {\n if (externalDependencies.length === 0) {\n externalDependencies = inherits.externalDependencies;\n } else {\n externalDependencies = freezeDeepArray([\n externalDependencies,\n inherits.externalDependencies,\n ]);\n }\n }\n }\n\n return new Plugin(plugin, options, alias, externalDependencies);\n});\n\n/**\n * Instantiate a plugin for the given descriptor, returning the plugin/options pair.\n */\nfunction* loadPluginDescriptor(\n descriptor: UnloadedDescriptor,\n context: Context.SimplePlugin,\n): Handler {\n if (descriptor.value instanceof Plugin) {\n if (descriptor.options) {\n throw new Error(\n \"Passed options to an existing Plugin instance will not work.\",\n );\n }\n\n return descriptor.value;\n }\n\n return yield* instantiatePlugin(\n yield* pluginDescriptorLoader(descriptor, context),\n context,\n );\n}\n\nconst needsFilename = (val: unknown) => val && typeof val !== \"function\";\n\nconst validateIfOptionNeedsFilename = (\n options: ValidatedOptions,\n descriptor: UnloadedDescriptor,\n): void => {\n if (\n needsFilename(options.test) ||\n needsFilename(options.include) ||\n needsFilename(options.exclude)\n ) {\n const formattedPresetName = descriptor.name\n ? `\"${descriptor.name}\"`\n : \"/* your preset */\";\n throw new ConfigError(\n [\n `Preset ${formattedPresetName} requires a filename to be set when babel is called directly,`,\n `\\`\\`\\``,\n `babel.transformSync(code, { filename: 'file.ts', presets: [${formattedPresetName}] });`,\n `\\`\\`\\``,\n `See https://babeljs.io/docs/en/options#filename for more information.`,\n ].join(\"\\n\"),\n );\n }\n};\n\nconst validatePreset = (\n preset: PresetInstance,\n context: ConfigContext,\n descriptor: UnloadedDescriptor,\n): void => {\n if (!context.filename) {\n const { options } = preset;\n validateIfOptionNeedsFilename(options, descriptor);\n options.overrides?.forEach(overrideOptions =>\n validateIfOptionNeedsFilename(overrideOptions, descriptor),\n );\n }\n};\n\nconst instantiatePreset = makeWeakCacheSync(\n ({\n value,\n dirname,\n alias,\n externalDependencies,\n }: LoadedDescriptor): PresetInstance => {\n return {\n options: validate(\"preset\", value),\n alias,\n dirname,\n externalDependencies,\n };\n },\n);\n\n/**\n * Generate a config object that will act as the root of a new nested config.\n */\nfunction* loadPresetDescriptor(\n descriptor: UnloadedDescriptor,\n context: Context.FullPreset,\n): Handler<{\n chain: ConfigChain | null;\n externalDependencies: ReadonlyDeepArray;\n}> {\n const preset = instantiatePreset(\n yield* presetDescriptorLoader(descriptor, context),\n );\n validatePreset(preset, context, descriptor);\n return {\n chain: yield* buildPresetChain(preset, context),\n externalDependencies: preset.externalDependencies,\n };\n}\n\nfunction chain(\n a: undefined | ((...args: Args) => void),\n b: undefined | ((...args: Args) => void),\n) {\n const fns = [a, b].filter(Boolean);\n if (fns.length <= 1) return fns[0];\n\n return function (this: unknown, ...args: unknown[]) {\n for (const fn of fns) {\n fn.apply(this, args);\n }\n };\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/helpers/config-api.js b/node_modules/@babel/core/lib/config/helpers/config-api.js index 1ca96778cd90..c3d55ceabefb 100644 --- a/node_modules/@babel/core/lib/config/helpers/config-api.js +++ b/node_modules/@babel/core/lib/config/helpers/config-api.js @@ -13,8 +13,8 @@ function _semver() { }; return data; } -var _ = require("../../"); -var _caching = require("../caching"); +var _index = require("../../index.js"); +var _caching = require("../caching.js"); function makeConfigAPI(cache) { const env = value => cache.using(data => { if (typeof value === "undefined") return data.envName; @@ -30,7 +30,7 @@ function makeConfigAPI(cache) { }); const caller = cb => cache.using(data => (0, _caching.assertSimpleType)(cb(data.caller))); return { - version: _.version, + version: _index.version, cache: cache.simple(), env, async: () => false, @@ -39,8 +39,7 @@ function makeConfigAPI(cache) { }; } function makePresetAPI(cache, externalDependencies) { - const targets = () => - JSON.parse(cache.using(data => JSON.stringify(data.targets))); + const targets = () => JSON.parse(cache.using(data => JSON.stringify(data.targets))); const addExternalDependency = ref => { externalDependencies.push(ref); }; @@ -65,18 +64,18 @@ function assertVersion(range) { if (typeof range !== "string") { throw new Error("Expected string or integer value."); } - if (_semver().satisfies(_.version, range)) return; + if (_semver().satisfies(_index.version, range)) return; const limit = Error.stackTraceLimit; if (typeof limit === "number" && limit < 25) { Error.stackTraceLimit = 25; } - const err = new Error(`Requires Babel "${range}", but was loaded with "${_.version}". ` + `If you are sure you have a compatible version of @babel/core, ` + `it is likely that something in your build process is loading the ` + `wrong version. Inspect the stack trace of this error to look for ` + `the first entry that doesn't mention "@babel/core" or "babel-core" ` + `to see what is calling Babel.`); + const err = new Error(`Requires Babel "${range}", but was loaded with "${_index.version}". ` + `If you are sure you have a compatible version of @babel/core, ` + `it is likely that something in your build process is loading the ` + `wrong version. Inspect the stack trace of this error to look for ` + `the first entry that doesn't mention "@babel/core" or "babel-core" ` + `to see what is calling Babel.`); if (typeof limit === "number") { Error.stackTraceLimit = limit; } throw Object.assign(err, { code: "BABEL_VERSION_UNSUPPORTED", - version: _.version, + version: _index.version, range }); } diff --git a/node_modules/@babel/core/lib/config/helpers/config-api.js.map b/node_modules/@babel/core/lib/config/helpers/config-api.js.map index 9698d1fe6b4b..48c6c1112e32 100644 --- a/node_modules/@babel/core/lib/config/helpers/config-api.js.map +++ b/node_modules/@babel/core/lib/config/helpers/config-api.js.map @@ -1 +1 @@ -{"version":3,"names":["makeConfigAPI","cache","env","value","using","data","envName","assertSimpleType","Array","isArray","some","entry","Error","caller","cb","version","coreVersion","simple","async","assertVersion","makePresetAPI","externalDependencies","targets","JSON","parse","stringify","addExternalDependency","ref","push","makePluginAPI","assumption","name","assumptions","range","Number","isInteger","semver","satisfies","limit","stackTraceLimit","err","Object","assign","code"],"sources":["../../../src/config/helpers/config-api.ts"],"sourcesContent":["import semver from \"semver\";\nimport type { Targets } from \"@babel/helper-compilation-targets\";\n\nimport { version as coreVersion } from \"../../\";\nimport { assertSimpleType } from \"../caching\";\nimport type {\n CacheConfigurator,\n SimpleCacheConfigurator,\n SimpleType,\n} from \"../caching\";\n\nimport type { AssumptionName, CallerMetadata } from \"../validation/options\";\n\nimport type * as Context from \"../cache-contexts\";\n\ntype EnvFunction = {\n (): string;\n (extractor: (babelEnv: string) => T): T;\n (envVar: string): boolean;\n (envVars: Array): boolean;\n};\n\ntype CallerFactory = (\n extractor: (callerMetadata: CallerMetadata | undefined) => unknown,\n) => SimpleType;\ntype TargetsFunction = () => Targets;\ntype AssumptionFunction = (name: AssumptionName) => boolean | undefined;\n\nexport type ConfigAPI = {\n version: string;\n cache: SimpleCacheConfigurator;\n env: EnvFunction;\n async: () => boolean;\n assertVersion: typeof assertVersion;\n caller?: CallerFactory;\n};\n\nexport type PresetAPI = {\n targets: TargetsFunction;\n addExternalDependency: (ref: string) => void;\n} & ConfigAPI;\n\nexport type PluginAPI = {\n assumption: AssumptionFunction;\n} & PresetAPI;\n\nexport function makeConfigAPI(\n cache: CacheConfigurator,\n): ConfigAPI {\n // TODO(@nicolo-ribaudo): If we remove the explicit type from `value`\n // and the `as any` type cast, TypeScript crashes in an infinite\n // recursion. After upgrading to TS4.7 and finishing the noImplicitAny\n // PR, we should check if it still crashes and report it to the TS team.\n const env: EnvFunction = ((\n value: string | string[] | ((babelEnv: string) => T),\n ) =>\n cache.using(data => {\n if (typeof value === \"undefined\") return data.envName;\n if (typeof value === \"function\") {\n return assertSimpleType(value(data.envName));\n }\n return (Array.isArray(value) ? value : [value]).some(entry => {\n if (typeof entry !== \"string\") {\n throw new Error(\"Unexpected non-string value\");\n }\n return entry === data.envName;\n });\n })) as any;\n\n const caller = (cb: {\n (CallerMetadata: CallerMetadata | undefined): SimpleType;\n }) => cache.using(data => assertSimpleType(cb(data.caller)));\n\n return {\n version: coreVersion,\n cache: cache.simple(),\n // Expose \".env()\" so people can easily get the same env that we expose using the \"env\" key.\n env,\n async: () => false,\n caller,\n assertVersion,\n };\n}\n\nexport function makePresetAPI(\n cache: CacheConfigurator,\n externalDependencies: Array,\n): PresetAPI {\n const targets = () =>\n // We are using JSON.parse/JSON.stringify because it's only possible to cache\n // primitive values. We can safely stringify the targets object because it\n // only contains strings as its properties.\n // Please make the Record and Tuple proposal happen!\n JSON.parse(cache.using(data => JSON.stringify(data.targets)));\n\n const addExternalDependency = (ref: string) => {\n externalDependencies.push(ref);\n };\n\n return { ...makeConfigAPI(cache), targets, addExternalDependency };\n}\n\nexport function makePluginAPI(\n cache: CacheConfigurator,\n externalDependencies: Array,\n): PluginAPI {\n const assumption = (name: string) =>\n cache.using(data => data.assumptions[name]);\n\n return { ...makePresetAPI(cache, externalDependencies), assumption };\n}\n\nfunction assertVersion(range: string | number): void {\n if (typeof range === \"number\") {\n if (!Number.isInteger(range)) {\n throw new Error(\"Expected string or integer value.\");\n }\n range = `^${range}.0.0-0`;\n }\n if (typeof range !== \"string\") {\n throw new Error(\"Expected string or integer value.\");\n }\n\n if (semver.satisfies(coreVersion, range)) return;\n\n const limit = Error.stackTraceLimit;\n\n if (typeof limit === \"number\" && limit < 25) {\n // Bump up the limit if needed so that users are more likely\n // to be able to see what is calling Babel.\n Error.stackTraceLimit = 25;\n }\n\n const err = new Error(\n `Requires Babel \"${range}\", but was loaded with \"${coreVersion}\". ` +\n `If you are sure you have a compatible version of @babel/core, ` +\n `it is likely that something in your build process is loading the ` +\n `wrong version. Inspect the stack trace of this error to look for ` +\n `the first entry that doesn't mention \"@babel/core\" or \"babel-core\" ` +\n `to see what is calling Babel.`,\n );\n\n if (typeof limit === \"number\") {\n Error.stackTraceLimit = limit;\n }\n\n throw Object.assign(err, {\n code: \"BABEL_VERSION_UNSUPPORTED\",\n version: coreVersion,\n range,\n });\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_semver","data","require","_index","_caching","makeConfigAPI","cache","env","value","using","envName","assertSimpleType","Array","isArray","some","entry","Error","caller","cb","version","coreVersion","simple","async","assertVersion","makePresetAPI","externalDependencies","targets","JSON","parse","stringify","addExternalDependency","ref","push","Object","assign","makePluginAPI","assumption","name","assumptions","range","Number","isInteger","semver","satisfies","limit","stackTraceLimit","err","code"],"sources":["../../../src/config/helpers/config-api.ts"],"sourcesContent":["import semver from \"semver\";\nimport type { Targets } from \"@babel/helper-compilation-targets\";\n\nimport { version as coreVersion } from \"../../index.ts\";\nimport { assertSimpleType } from \"../caching.ts\";\nimport type {\n CacheConfigurator,\n SimpleCacheConfigurator,\n SimpleType,\n} from \"../caching.ts\";\n\nimport type { AssumptionName, CallerMetadata } from \"../validation/options.ts\";\n\nimport type * as Context from \"../cache-contexts\";\n\ntype EnvFunction = {\n (): string;\n (extractor: (babelEnv: string) => T): T;\n (envVar: string): boolean;\n (envVars: Array): boolean;\n};\n\ntype CallerFactory = {\n (\n extractor: (callerMetadata: CallerMetadata | undefined) => T,\n ): T;\n (\n extractor: (callerMetadata: CallerMetadata | undefined) => unknown,\n ): SimpleType;\n};\ntype TargetsFunction = () => Targets;\ntype AssumptionFunction = (name: AssumptionName) => boolean | undefined;\n\nexport type ConfigAPI = {\n version: string;\n cache: SimpleCacheConfigurator;\n env: EnvFunction;\n async: () => boolean;\n assertVersion: typeof assertVersion;\n caller?: CallerFactory;\n};\n\nexport type PresetAPI = {\n targets: TargetsFunction;\n addExternalDependency: (ref: string) => void;\n} & ConfigAPI;\n\nexport type PluginAPI = {\n assumption: AssumptionFunction;\n} & PresetAPI;\n\nexport function makeConfigAPI(\n cache: CacheConfigurator,\n): ConfigAPI {\n // TODO(@nicolo-ribaudo): If we remove the explicit type from `value`\n // and the `as any` type cast, TypeScript crashes in an infinite\n // recursion. After upgrading to TS4.7 and finishing the noImplicitAny\n // PR, we should check if it still crashes and report it to the TS team.\n const env: EnvFunction = ((\n value: string | string[] | ((babelEnv: string) => T),\n ) =>\n cache.using(data => {\n if (typeof value === \"undefined\") return data.envName;\n if (typeof value === \"function\") {\n return assertSimpleType(value(data.envName));\n }\n return (Array.isArray(value) ? value : [value]).some(entry => {\n if (typeof entry !== \"string\") {\n throw new Error(\"Unexpected non-string value\");\n }\n return entry === data.envName;\n });\n })) as any;\n\n const caller = (cb: {\n (CallerMetadata: CallerMetadata | undefined): SimpleType;\n }) => cache.using(data => assertSimpleType(cb(data.caller)));\n\n return {\n version: coreVersion,\n cache: cache.simple(),\n // Expose \".env()\" so people can easily get the same env that we expose using the \"env\" key.\n env,\n async: () => false,\n caller,\n assertVersion,\n };\n}\n\nexport function makePresetAPI(\n cache: CacheConfigurator,\n externalDependencies: Array,\n): PresetAPI {\n const targets = () =>\n // We are using JSON.parse/JSON.stringify because it's only possible to cache\n // primitive values. We can safely stringify the targets object because it\n // only contains strings as its properties.\n // Please make the Record and Tuple proposal happen!\n JSON.parse(cache.using(data => JSON.stringify(data.targets)));\n\n const addExternalDependency = (ref: string) => {\n externalDependencies.push(ref);\n };\n\n return { ...makeConfigAPI(cache), targets, addExternalDependency };\n}\n\nexport function makePluginAPI(\n cache: CacheConfigurator,\n externalDependencies: Array,\n): PluginAPI {\n const assumption = (name: string) =>\n cache.using(data => data.assumptions[name]);\n\n return { ...makePresetAPI(cache, externalDependencies), assumption };\n}\n\nfunction assertVersion(range: string | number): void {\n if (typeof range === \"number\") {\n if (!Number.isInteger(range)) {\n throw new Error(\"Expected string or integer value.\");\n }\n range = `^${range}.0.0-0`;\n }\n if (typeof range !== \"string\") {\n throw new Error(\"Expected string or integer value.\");\n }\n\n if (semver.satisfies(coreVersion, range)) return;\n\n const limit = Error.stackTraceLimit;\n\n if (typeof limit === \"number\" && limit < 25) {\n // Bump up the limit if needed so that users are more likely\n // to be able to see what is calling Babel.\n Error.stackTraceLimit = 25;\n }\n\n const err = new Error(\n `Requires Babel \"${range}\", but was loaded with \"${coreVersion}\". ` +\n `If you are sure you have a compatible version of @babel/core, ` +\n `it is likely that something in your build process is loading the ` +\n `wrong version. Inspect the stack trace of this error to look for ` +\n `the first entry that doesn't mention \"@babel/core\" or \"babel-core\" ` +\n `to see what is calling Babel.`,\n );\n\n if (typeof limit === \"number\") {\n Error.stackTraceLimit = limit;\n }\n\n throw Object.assign(err, {\n code: \"BABEL_VERSION_UNSUPPORTED\",\n version: coreVersion,\n range,\n });\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/helpers/deep-array.js b/node_modules/@babel/core/lib/config/helpers/deep-array.js index cca42bff15e3..c611db20ed59 100644 --- a/node_modules/@babel/core/lib/config/helpers/deep-array.js +++ b/node_modules/@babel/core/lib/config/helpers/deep-array.js @@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", { }); exports.finalize = finalize; exports.flattenToSet = flattenToSet; - function finalize(deepArr) { return Object.freeze(deepArr); } diff --git a/node_modules/@babel/core/lib/config/helpers/deep-array.js.map b/node_modules/@babel/core/lib/config/helpers/deep-array.js.map index 1a5b30459f1c..6dc9bea4dc27 100644 --- a/node_modules/@babel/core/lib/config/helpers/deep-array.js.map +++ b/node_modules/@babel/core/lib/config/helpers/deep-array.js.map @@ -1 +1 @@ -{"version":3,"names":["finalize","deepArr","Object","freeze","flattenToSet","arr","result","Set","stack","length","el","pop","Array","isArray","push","add"],"sources":["../../../src/config/helpers/deep-array.ts"],"sourcesContent":["export type DeepArray = Array>;\n\n// Just to make sure that DeepArray is not assignable to ReadonlyDeepArray\ndeclare const __marker: unique symbol;\nexport type ReadonlyDeepArray = ReadonlyArray> & {\n [__marker]: true;\n};\n\nexport function finalize(deepArr: DeepArray): ReadonlyDeepArray {\n return Object.freeze(deepArr) as ReadonlyDeepArray;\n}\n\nexport function flattenToSet(\n arr: ReadonlyDeepArray,\n): Set {\n const result = new Set();\n const stack = [arr];\n while (stack.length > 0) {\n for (const el of stack.pop()) {\n if (Array.isArray(el)) stack.push(el as ReadonlyDeepArray);\n else result.add(el as T);\n }\n }\n return result;\n}\n"],"mappings":";;;;;;;;AAQO,SAASA,QAAQ,CAAIC,OAAqB,EAAwB;EACvE,OAAOC,MAAM,CAACC,MAAM,CAACF,OAAO,CAAC;AAC/B;AAEO,SAASG,YAAY,CAC1BC,GAAyB,EACjB;EACR,MAAMC,MAAM,GAAG,IAAIC,GAAG,EAAK;EAC3B,MAAMC,KAAK,GAAG,CAACH,GAAG,CAAC;EACnB,OAAOG,KAAK,CAACC,MAAM,GAAG,CAAC,EAAE;IACvB,KAAK,MAAMC,EAAE,IAAIF,KAAK,CAACG,GAAG,EAAE,EAAE;MAC5B,IAAIC,KAAK,CAACC,OAAO,CAACH,EAAE,CAAC,EAAEF,KAAK,CAACM,IAAI,CAACJ,EAAE,CAAyB,CAAC,KACzDJ,MAAM,CAACS,GAAG,CAACL,EAAE,CAAM;IAC1B;EACF;EACA,OAAOJ,MAAM;AACf;AAAC"} \ No newline at end of file +{"version":3,"names":["finalize","deepArr","Object","freeze","flattenToSet","arr","result","Set","stack","length","el","pop","Array","isArray","push","add"],"sources":["../../../src/config/helpers/deep-array.ts"],"sourcesContent":["export type DeepArray = Array>;\n\n// Just to make sure that DeepArray is not assignable to ReadonlyDeepArray\ndeclare const __marker: unique symbol;\nexport type ReadonlyDeepArray = ReadonlyArray> & {\n [__marker]: true;\n};\n\nexport function finalize(deepArr: DeepArray): ReadonlyDeepArray {\n return Object.freeze(deepArr) as ReadonlyDeepArray;\n}\n\nexport function flattenToSet(\n arr: ReadonlyDeepArray,\n): Set {\n const result = new Set();\n const stack = [arr];\n while (stack.length > 0) {\n for (const el of stack.pop()) {\n if (Array.isArray(el)) stack.push(el as ReadonlyDeepArray);\n else result.add(el as T);\n }\n }\n return result;\n}\n"],"mappings":";;;;;;;AAQO,SAASA,QAAQA,CAAIC,OAAqB,EAAwB;EACvE,OAAOC,MAAM,CAACC,MAAM,CAACF,OAAO,CAAC;AAC/B;AAEO,SAASG,YAAYA,CAC1BC,GAAyB,EACjB;EACR,MAAMC,MAAM,GAAG,IAAIC,GAAG,CAAI,CAAC;EAC3B,MAAMC,KAAK,GAAG,CAACH,GAAG,CAAC;EACnB,OAAOG,KAAK,CAACC,MAAM,GAAG,CAAC,EAAE;IACvB,KAAK,MAAMC,EAAE,IAAIF,KAAK,CAACG,GAAG,CAAC,CAAC,EAAE;MAC5B,IAAIC,KAAK,CAACC,OAAO,CAACH,EAAE,CAAC,EAAEF,KAAK,CAACM,IAAI,CAACJ,EAA0B,CAAC,CAAC,KACzDJ,MAAM,CAACS,GAAG,CAACL,EAAO,CAAC;IAC1B;EACF;EACA,OAAOJ,MAAM;AACf;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/helpers/environment.js.map b/node_modules/@babel/core/lib/config/helpers/environment.js.map index 5992a64b9eb7..e71555c9a204 100644 --- a/node_modules/@babel/core/lib/config/helpers/environment.js.map +++ b/node_modules/@babel/core/lib/config/helpers/environment.js.map @@ -1 +1 @@ -{"version":3,"names":["getEnv","defaultValue","process","env","BABEL_ENV","NODE_ENV"],"sources":["../../../src/config/helpers/environment.ts"],"sourcesContent":["export function getEnv(defaultValue: string = \"development\"): string {\n return process.env.BABEL_ENV || process.env.NODE_ENV || defaultValue;\n}\n"],"mappings":";;;;;;AAAO,SAASA,MAAM,CAACC,YAAoB,GAAG,aAAa,EAAU;EACnE,OAAOC,OAAO,CAACC,GAAG,CAACC,SAAS,IAAIF,OAAO,CAACC,GAAG,CAACE,QAAQ,IAAIJ,YAAY;AACtE;AAAC"} \ No newline at end of file +{"version":3,"names":["getEnv","defaultValue","process","env","BABEL_ENV","NODE_ENV"],"sources":["../../../src/config/helpers/environment.ts"],"sourcesContent":["export function getEnv(defaultValue: string = \"development\"): string {\n return process.env.BABEL_ENV || process.env.NODE_ENV || defaultValue;\n}\n"],"mappings":";;;;;;AAAO,SAASA,MAAMA,CAACC,YAAoB,GAAG,aAAa,EAAU;EACnE,OAAOC,OAAO,CAACC,GAAG,CAACC,SAAS,IAAIF,OAAO,CAACC,GAAG,CAACE,QAAQ,IAAIJ,YAAY;AACtE;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/index.js b/node_modules/@babel/core/lib/config/index.js index f58755f21413..b2262b27571a 100644 --- a/node_modules/@babel/core/lib/config/index.js +++ b/node_modules/@babel/core/lib/config/index.js @@ -4,14 +4,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.createConfigItem = createConfigItem; -exports.createConfigItemSync = exports.createConfigItemAsync = void 0; +exports.createConfigItemAsync = createConfigItemAsync; +exports.createConfigItemSync = createConfigItemSync; Object.defineProperty(exports, "default", { enumerable: true, get: function () { return _full.default; } }); -exports.loadPartialConfigSync = exports.loadPartialConfigAsync = exports.loadPartialConfig = exports.loadOptionsSync = exports.loadOptionsAsync = exports.loadOptions = void 0; +exports.loadOptions = loadOptions; +exports.loadOptionsAsync = loadOptionsAsync; +exports.loadOptionsSync = loadOptionsSync; +exports.loadPartialConfig = loadPartialConfig; +exports.loadPartialConfigAsync = loadPartialConfigAsync; +exports.loadPartialConfigSync = loadPartialConfigSync; function _gensync() { const data = require("gensync"); _gensync = function () { @@ -19,50 +25,67 @@ function _gensync() { }; return data; } -var _full = require("./full"); -var _partial = require("./partial"); -var _item = require("./item"); -const loadOptionsRunner = _gensync()(function* (opts) { +var _full = require("./full.js"); +var _partial = require("./partial.js"); +var _item = require("./item.js"); +var _rewriteStackTrace = require("../errors/rewrite-stack-trace.js"); +const loadPartialConfigRunner = _gensync()(_partial.loadPartialConfig); +function loadPartialConfigAsync(...args) { + return (0, _rewriteStackTrace.beginHiddenCallStack)(loadPartialConfigRunner.async)(...args); +} +function loadPartialConfigSync(...args) { + return (0, _rewriteStackTrace.beginHiddenCallStack)(loadPartialConfigRunner.sync)(...args); +} +function loadPartialConfig(opts, callback) { + if (callback !== undefined) { + (0, _rewriteStackTrace.beginHiddenCallStack)(loadPartialConfigRunner.errback)(opts, callback); + } else if (typeof opts === "function") { + (0, _rewriteStackTrace.beginHiddenCallStack)(loadPartialConfigRunner.errback)(undefined, opts); + } else { + { + return loadPartialConfigSync(opts); + } + } +} +function* loadOptionsImpl(opts) { var _config$options; const config = yield* (0, _full.default)(opts); return (_config$options = config == null ? void 0 : config.options) != null ? _config$options : null; -}); -const createConfigItemRunner = _gensync()(_item.createConfigItem); -const maybeErrback = runner => (argOrCallback, maybeCallback) => { - let arg; - let callback; - if (maybeCallback === undefined && typeof argOrCallback === "function") { - callback = argOrCallback; - arg = undefined; +} +const loadOptionsRunner = _gensync()(loadOptionsImpl); +function loadOptionsAsync(...args) { + return (0, _rewriteStackTrace.beginHiddenCallStack)(loadOptionsRunner.async)(...args); +} +function loadOptionsSync(...args) { + return (0, _rewriteStackTrace.beginHiddenCallStack)(loadOptionsRunner.sync)(...args); +} +function loadOptions(opts, callback) { + if (callback !== undefined) { + (0, _rewriteStackTrace.beginHiddenCallStack)(loadOptionsRunner.errback)(opts, callback); + } else if (typeof opts === "function") { + (0, _rewriteStackTrace.beginHiddenCallStack)(loadOptionsRunner.errback)(undefined, opts); } else { - callback = maybeCallback; - arg = argOrCallback; + { + return loadOptionsSync(opts); + } } - return callback ? runner.errback(arg, callback) : runner.sync(arg); -}; -const loadPartialConfig = maybeErrback(_partial.loadPartialConfig); -exports.loadPartialConfig = loadPartialConfig; -const loadPartialConfigSync = _partial.loadPartialConfig.sync; -exports.loadPartialConfigSync = loadPartialConfigSync; -const loadPartialConfigAsync = _partial.loadPartialConfig.async; -exports.loadPartialConfigAsync = loadPartialConfigAsync; -const loadOptions = maybeErrback(loadOptionsRunner); -exports.loadOptions = loadOptions; -const loadOptionsSync = loadOptionsRunner.sync; -exports.loadOptionsSync = loadOptionsSync; -const loadOptionsAsync = loadOptionsRunner.async; -exports.loadOptionsAsync = loadOptionsAsync; -const createConfigItemSync = createConfigItemRunner.sync; -exports.createConfigItemSync = createConfigItemSync; -const createConfigItemAsync = createConfigItemRunner.async; -exports.createConfigItemAsync = createConfigItemAsync; +} +const createConfigItemRunner = _gensync()(_item.createConfigItem); +function createConfigItemAsync(...args) { + return (0, _rewriteStackTrace.beginHiddenCallStack)(createConfigItemRunner.async)(...args); +} +function createConfigItemSync(...args) { + return (0, _rewriteStackTrace.beginHiddenCallStack)(createConfigItemRunner.sync)(...args); +} function createConfigItem(target, options, callback) { if (callback !== undefined) { - return createConfigItemRunner.errback(target, options, callback); + (0, _rewriteStackTrace.beginHiddenCallStack)(createConfigItemRunner.errback)(target, options, callback); } else if (typeof options === "function") { - return createConfigItemRunner.errback(target, undefined, callback); + (0, _rewriteStackTrace.beginHiddenCallStack)(createConfigItemRunner.errback)(target, undefined, callback); } else { - return createConfigItemRunner.sync(target, options); + { + return createConfigItemSync(target, options); + } } } 0 && 0; diff --git a/node_modules/@babel/core/lib/config/index.js.map b/node_modules/@babel/core/lib/config/index.js.map index c390caeb8f1e..7a410f5b13ea 100644 --- a/node_modules/@babel/core/lib/config/index.js.map +++ b/node_modules/@babel/core/lib/config/index.js.map @@ -1 +1 @@ -{"version":3,"names":["loadOptionsRunner","gensync","opts","config","loadFullConfig","options","createConfigItemRunner","createConfigItemImpl","maybeErrback","runner","argOrCallback","maybeCallback","arg","callback","undefined","errback","sync","loadPartialConfig","loadPartialConfigRunner","loadPartialConfigSync","loadPartialConfigAsync","async","loadOptions","loadOptionsSync","loadOptionsAsync","createConfigItemSync","createConfigItemAsync","createConfigItem","target"],"sources":["../../src/config/index.ts"],"sourcesContent":["import gensync, { type Handler, type Callback } from \"gensync\";\n\nexport type {\n ResolvedConfig,\n InputOptions,\n PluginPasses,\n Plugin,\n} from \"./full\";\n\nimport type { PluginTarget } from \"./validation/options\";\n\nimport type {\n PluginAPI as basePluginAPI,\n PresetAPI as basePresetAPI,\n} from \"./helpers/config-api\";\nexport type { PluginObject } from \"./validation/plugins\";\ntype PluginAPI = basePluginAPI & typeof import(\"..\");\ntype PresetAPI = basePresetAPI & typeof import(\"..\");\nexport type { PluginAPI, PresetAPI };\n// todo: may need to refine PresetObject to be a subset of ValidatedOptions\nexport type {\n CallerMetadata,\n ValidatedOptions as PresetObject,\n} from \"./validation/options\";\n\nimport loadFullConfig, { type ResolvedConfig } from \"./full\";\nimport { loadPartialConfig as loadPartialConfigRunner } from \"./partial\";\n\nexport { loadFullConfig as default };\nexport type { PartialConfig } from \"./partial\";\n\nimport { createConfigItem as createConfigItemImpl } from \"./item\";\nimport type { ConfigItem } from \"./item\";\n\nconst loadOptionsRunner = gensync(function* (\n opts: unknown,\n): Handler {\n const config = yield* loadFullConfig(opts);\n // NOTE: We want to return \"null\" explicitly, while ?. alone returns undefined\n return config?.options ?? null;\n});\n\nconst createConfigItemRunner = gensync(createConfigItemImpl);\n\nconst maybeErrback =\n (runner: gensync.Gensync<[Arg], Return>) =>\n (argOrCallback: Arg | Callback, maybeCallback?: Callback) => {\n let arg: Arg | undefined;\n let callback: Callback;\n if (maybeCallback === undefined && typeof argOrCallback === \"function\") {\n callback = argOrCallback as Callback;\n arg = undefined;\n } else {\n callback = maybeCallback;\n arg = argOrCallback as Arg;\n }\n return callback ? runner.errback(arg, callback) : runner.sync(arg);\n };\n\nexport const loadPartialConfig = maybeErrback(loadPartialConfigRunner);\nexport const loadPartialConfigSync = loadPartialConfigRunner.sync;\nexport const loadPartialConfigAsync = loadPartialConfigRunner.async;\n\nexport const loadOptions = maybeErrback(loadOptionsRunner);\nexport const loadOptionsSync = loadOptionsRunner.sync;\nexport const loadOptionsAsync = loadOptionsRunner.async;\n\nexport const createConfigItemSync = createConfigItemRunner.sync;\nexport const createConfigItemAsync = createConfigItemRunner.async;\nexport function createConfigItem(\n target: PluginTarget,\n options: Parameters[1],\n callback?: (err: Error, val: ConfigItem | null) => void,\n) {\n if (callback !== undefined) {\n return createConfigItemRunner.errback(target, options, callback);\n } else if (typeof options === \"function\") {\n return createConfigItemRunner.errback(target, undefined, callback);\n } else {\n return createConfigItemRunner.sync(target, options);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAyBA;AACA;AAKA;AAGA,MAAMA,iBAAiB,GAAGC,UAAO,CAAC,WAChCC,IAAa,EACmB;EAAA;EAChC,MAAMC,MAAM,GAAG,OAAO,IAAAC,aAAc,EAACF,IAAI,CAAC;EAE1C,0BAAOC,MAAM,oBAANA,MAAM,CAAEE,OAAO,8BAAI,IAAI;AAChC,CAAC,CAAC;AAEF,MAAMC,sBAAsB,GAAGL,UAAO,CAACM,sBAAoB,CAAC;AAE5D,MAAMC,YAAY,GACFC,MAAsC,IACpD,CAACC,aAAqC,EAAEC,aAAgC,KAAK;EAC3E,IAAIC,GAAoB;EACxB,IAAIC,QAA0B;EAC9B,IAAIF,aAAa,KAAKG,SAAS,IAAI,OAAOJ,aAAa,KAAK,UAAU,EAAE;IACtEG,QAAQ,GAAGH,aAAiC;IAC5CE,GAAG,GAAGE,SAAS;EACjB,CAAC,MAAM;IACLD,QAAQ,GAAGF,aAAa;IACxBC,GAAG,GAAGF,aAAoB;EAC5B;EACA,OAAOG,QAAQ,GAAGJ,MAAM,CAACM,OAAO,CAACH,GAAG,EAAEC,QAAQ,CAAC,GAAGJ,MAAM,CAACO,IAAI,CAACJ,GAAG,CAAC;AACpE,CAAC;AAEI,MAAMK,iBAAiB,GAAGT,YAAY,CAACU,0BAAuB,CAAC;AAAC;AAChE,MAAMC,qBAAqB,GAAGD,0BAAuB,CAACF,IAAI;AAAC;AAC3D,MAAMI,sBAAsB,GAAGF,0BAAuB,CAACG,KAAK;AAAC;AAE7D,MAAMC,WAAW,GAAGd,YAAY,CAACR,iBAAiB,CAAC;AAAC;AACpD,MAAMuB,eAAe,GAAGvB,iBAAiB,CAACgB,IAAI;AAAC;AAC/C,MAAMQ,gBAAgB,GAAGxB,iBAAiB,CAACqB,KAAK;AAAC;AAEjD,MAAMI,oBAAoB,GAAGnB,sBAAsB,CAACU,IAAI;AAAC;AACzD,MAAMU,qBAAqB,GAAGpB,sBAAsB,CAACe,KAAK;AAAC;AAC3D,SAASM,gBAAgB,CAC9BC,MAAoB,EACpBvB,OAAmD,EACnDQ,QAAuD,EACvD;EACA,IAAIA,QAAQ,KAAKC,SAAS,EAAE;IAC1B,OAAOR,sBAAsB,CAACS,OAAO,CAACa,MAAM,EAAEvB,OAAO,EAAEQ,QAAQ,CAAC;EAClE,CAAC,MAAM,IAAI,OAAOR,OAAO,KAAK,UAAU,EAAE;IACxC,OAAOC,sBAAsB,CAACS,OAAO,CAACa,MAAM,EAAEd,SAAS,EAAED,QAAQ,CAAC;EACpE,CAAC,MAAM;IACL,OAAOP,sBAAsB,CAACU,IAAI,CAACY,MAAM,EAAEvB,OAAO,CAAC;EACrD;AACF;AAAC"} \ No newline at end of file +{"version":3,"names":["_gensync","data","require","_full","_partial","_item","_rewriteStackTrace","loadPartialConfigRunner","gensync","loadPartialConfigImpl","loadPartialConfigAsync","args","beginHiddenCallStack","async","loadPartialConfigSync","sync","loadPartialConfig","opts","callback","undefined","errback","loadOptionsImpl","_config$options","config","loadFullConfig","options","loadOptionsRunner","loadOptionsAsync","loadOptionsSync","loadOptions","createConfigItemRunner","createConfigItemImpl","createConfigItemAsync","createConfigItemSync","createConfigItem","target"],"sources":["../../src/config/index.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\n\nexport type {\n ResolvedConfig,\n InputOptions,\n PluginPasses,\n Plugin,\n} from \"./full.ts\";\n\nimport type { PluginTarget } from \"./validation/options.ts\";\n\nimport type {\n PluginAPI as basePluginAPI,\n PresetAPI as basePresetAPI,\n} from \"./helpers/config-api.ts\";\nexport type { PluginObject } from \"./validation/plugins.ts\";\ntype PluginAPI = basePluginAPI & typeof import(\"..\");\ntype PresetAPI = basePresetAPI & typeof import(\"..\");\nexport type { PluginAPI, PresetAPI };\n// todo: may need to refine PresetObject to be a subset of ValidatedOptions\nexport type {\n CallerMetadata,\n ValidatedOptions as PresetObject,\n} from \"./validation/options.ts\";\n\nimport loadFullConfig, { type ResolvedConfig } from \"./full.ts\";\nimport {\n type PartialConfig,\n loadPartialConfig as loadPartialConfigImpl,\n} from \"./partial.ts\";\n\nexport { loadFullConfig as default };\nexport type { PartialConfig } from \"./partial.ts\";\n\nimport { createConfigItem as createConfigItemImpl } from \"./item.ts\";\nimport type { ConfigItem } from \"./item.ts\";\nexport type { ConfigItem };\n\nimport { beginHiddenCallStack } from \"../errors/rewrite-stack-trace.ts\";\n\nconst loadPartialConfigRunner = gensync(loadPartialConfigImpl);\nexport function loadPartialConfigAsync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(loadPartialConfigRunner.async)(...args);\n}\nexport function loadPartialConfigSync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(loadPartialConfigRunner.sync)(...args);\n}\nexport function loadPartialConfig(\n opts: Parameters[0],\n callback?: (err: Error, val: PartialConfig | null) => void,\n) {\n if (callback !== undefined) {\n beginHiddenCallStack(loadPartialConfigRunner.errback)(opts, callback);\n } else if (typeof opts === \"function\") {\n beginHiddenCallStack(loadPartialConfigRunner.errback)(\n undefined,\n opts as (err: Error, val: PartialConfig | null) => void,\n );\n } else {\n if (process.env.BABEL_8_BREAKING) {\n throw new Error(\n \"Starting from Babel 8.0.0, the 'loadPartialConfig' function expects a callback. If you need to call it synchronously, please use 'loadPartialConfigSync'.\",\n );\n } else {\n return loadPartialConfigSync(opts);\n }\n }\n}\n\nfunction* loadOptionsImpl(opts: unknown): Handler {\n const config = yield* loadFullConfig(opts);\n // NOTE: We want to return \"null\" explicitly, while ?. alone returns undefined\n return config?.options ?? null;\n}\nconst loadOptionsRunner = gensync(loadOptionsImpl);\nexport function loadOptionsAsync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(loadOptionsRunner.async)(...args);\n}\nexport function loadOptionsSync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(loadOptionsRunner.sync)(...args);\n}\nexport function loadOptions(\n opts: Parameters[0],\n callback?: (err: Error, val: ResolvedConfig | null) => void,\n) {\n if (callback !== undefined) {\n beginHiddenCallStack(loadOptionsRunner.errback)(opts, callback);\n } else if (typeof opts === \"function\") {\n beginHiddenCallStack(loadOptionsRunner.errback)(\n undefined,\n opts as (err: Error, val: ResolvedConfig | null) => void,\n );\n } else {\n if (process.env.BABEL_8_BREAKING) {\n throw new Error(\n \"Starting from Babel 8.0.0, the 'loadOptions' function expects a callback. If you need to call it synchronously, please use 'loadOptionsSync'.\",\n );\n } else {\n return loadOptionsSync(opts);\n }\n }\n}\n\nconst createConfigItemRunner = gensync(createConfigItemImpl);\nexport function createConfigItemAsync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(createConfigItemRunner.async)(...args);\n}\nexport function createConfigItemSync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(createConfigItemRunner.sync)(...args);\n}\nexport function createConfigItem(\n target: PluginTarget,\n options: Parameters[1],\n callback?: (err: Error, val: ConfigItem | null) => void,\n) {\n if (callback !== undefined) {\n beginHiddenCallStack(createConfigItemRunner.errback)(\n target,\n options,\n callback,\n );\n } else if (typeof options === \"function\") {\n beginHiddenCallStack(createConfigItemRunner.errback)(\n target,\n undefined,\n callback,\n );\n } else {\n if (process.env.BABEL_8_BREAKING) {\n throw new Error(\n \"Starting from Babel 8.0.0, the 'createConfigItem' function expects a callback. If you need to call it synchronously, please use 'createConfigItemSync'.\",\n );\n } else {\n return createConfigItemSync(target, options);\n }\n }\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/item.js b/node_modules/@babel/core/lib/config/item.js index 37f1348d8d93..69cf01ff1ac7 100644 --- a/node_modules/@babel/core/lib/config/item.js +++ b/node_modules/@babel/core/lib/config/item.js @@ -13,11 +13,10 @@ function _path() { }; return data; } -var _configDescriptors = require("./config-descriptors"); +var _configDescriptors = require("./config-descriptors.js"); function createItemFromDescriptor(desc) { return new ConfigItem(desc); } - function* createConfigItem(value, { dirname = ".", type @@ -36,7 +35,6 @@ function getItemDescriptor(item) { return undefined; } class ConfigItem { - constructor(descriptor) { this._descriptor = void 0; this[CONFIG_ITEM_BRAND] = true; @@ -60,7 +58,6 @@ class ConfigItem { request: this._descriptor.file.request, resolved: this._descriptor.file.resolved } : undefined; - Object.freeze(this); } } diff --git a/node_modules/@babel/core/lib/config/item.js.map b/node_modules/@babel/core/lib/config/item.js.map index f5e0a478a5df..e5d00be7edb0 100644 --- a/node_modules/@babel/core/lib/config/item.js.map +++ b/node_modules/@babel/core/lib/config/item.js.map @@ -1 +1 @@ -{"version":3,"names":["createItemFromDescriptor","desc","ConfigItem","createConfigItem","value","dirname","type","descriptor","createDescriptor","path","resolve","alias","CONFIG_ITEM_BRAND","Symbol","for","getItemDescriptor","item","_descriptor","undefined","constructor","options","name","file","Object","defineProperty","enumerable","request","resolved","freeze","prototype"],"sources":["../../src/config/item.ts"],"sourcesContent":["import type { Handler } from \"gensync\";\nimport type { PluginTarget, PluginOptions } from \"./validation/options\";\n\nimport path from \"path\";\nimport { createDescriptor } from \"./config-descriptors\";\n\nimport type { UnloadedDescriptor } from \"./config-descriptors\";\n\nexport function createItemFromDescriptor(desc: UnloadedDescriptor): ConfigItem {\n return new ConfigItem(desc);\n}\n\n/**\n * Create a config item using the same value format used in Babel's config\n * files. Items returned from this function should be cached by the caller\n * ideally, as recreating the config item will mean re-resolving the item\n * and re-evaluating the plugin/preset function.\n */\nexport function* createConfigItem(\n value:\n | PluginTarget\n | [PluginTarget, PluginOptions]\n | [PluginTarget, PluginOptions, string | void],\n {\n dirname = \".\",\n type,\n }: {\n dirname?: string;\n type?: \"preset\" | \"plugin\";\n } = {},\n): Handler {\n const descriptor = yield* createDescriptor(value, path.resolve(dirname), {\n type,\n alias: \"programmatic item\",\n });\n\n return createItemFromDescriptor(descriptor);\n}\n\nconst CONFIG_ITEM_BRAND = Symbol.for(\"@babel/core@7 - ConfigItem\");\n\nexport function getItemDescriptor(item: unknown): UnloadedDescriptor | void {\n if ((item as any)?.[CONFIG_ITEM_BRAND]) {\n return (item as ConfigItem)._descriptor;\n }\n\n return undefined;\n}\n\nexport type { ConfigItem };\n\n/**\n * A public representation of a plugin/preset that will _eventually_ be load.\n * Users can use this to interact with the results of a loaded Babel\n * configuration.\n *\n * Any changes to public properties of this class should be considered a\n * breaking change to Babel's API.\n */\nclass ConfigItem {\n /**\n * The private underlying descriptor that Babel actually cares about.\n * If you access this, you are a bad person.\n */\n _descriptor: UnloadedDescriptor;\n\n // TODO(Babel 8): Check if this symbol needs to be updated\n /**\n * Used to detect ConfigItem instances from other Babel instances.\n */\n [CONFIG_ITEM_BRAND] = true;\n\n /**\n * The resolved value of the item itself.\n */\n value: {} | Function;\n\n /**\n * The options, if any, that were passed to the item.\n * Mutating this will lead to undefined behavior.\n *\n * \"false\" means that this item has been disabled.\n */\n options: {} | void | false;\n\n /**\n * The directory that the options for this item are relative to.\n */\n dirname: string;\n\n /**\n * Get the name of the plugin, if the user gave it one.\n */\n name: string | void;\n\n /**\n * Data about the file that the item was loaded from, if Babel knows it.\n */\n file: {\n // The requested path, e.g. \"@babel/env\".\n request: string;\n // The resolved absolute path of the file.\n resolved: string;\n } | void;\n\n constructor(descriptor: UnloadedDescriptor) {\n // Make people less likely to stumble onto this if they are exploring\n // programmatically, and also make sure that if people happen to\n // pass the item through JSON.stringify, it doesn't show up.\n this._descriptor = descriptor;\n Object.defineProperty(this, \"_descriptor\", { enumerable: false });\n\n Object.defineProperty(this, CONFIG_ITEM_BRAND, { enumerable: false });\n\n this.value = this._descriptor.value;\n this.options = this._descriptor.options;\n this.dirname = this._descriptor.dirname;\n this.name = this._descriptor.name;\n this.file = this._descriptor.file\n ? {\n request: this._descriptor.file.request,\n resolved: this._descriptor.file.resolved,\n }\n : undefined;\n\n // Freeze the object to make it clear that people shouldn't expect mutating\n // this object to do anything. A new item should be created if they want\n // to change something.\n Object.freeze(this);\n }\n}\n\nObject.freeze(ConfigItem.prototype);\n"],"mappings":";;;;;;;;AAGA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;AAIO,SAASA,wBAAwB,CAACC,IAAwB,EAAc;EAC7E,OAAO,IAAIC,UAAU,CAACD,IAAI,CAAC;AAC7B;;AAQO,UAAUE,gBAAgB,CAC/BC,KAGgD,EAChD;EACEC,OAAO,GAAG,GAAG;EACbC;AAIF,CAAC,GAAG,CAAC,CAAC,EACe;EACrB,MAAMC,UAAU,GAAG,OAAO,IAAAC,mCAAgB,EAACJ,KAAK,EAAEK,OAAI,CAACC,OAAO,CAACL,OAAO,CAAC,EAAE;IACvEC,IAAI;IACJK,KAAK,EAAE;EACT,CAAC,CAAC;EAEF,OAAOX,wBAAwB,CAACO,UAAU,CAAC;AAC7C;AAEA,MAAMK,iBAAiB,GAAGC,MAAM,CAACC,GAAG,CAAC,4BAA4B,CAAC;AAE3D,SAASC,iBAAiB,CAACC,IAAa,EAA6B;EAC1E,IAAKA,IAAI,YAAJA,IAAI,CAAWJ,iBAAiB,CAAC,EAAE;IACtC,OAAQI,IAAI,CAAgBC,WAAW;EACzC;EAEA,OAAOC,SAAS;AAClB;AAYA,MAAMhB,UAAU,CAAC;;EA8CfiB,WAAW,CAACZ,UAA8B,EAAE;IAAA,KAzC5CU,WAAW;IAAA,KAMVL,iBAAiB,IAAI,IAAI;IAAA,KAK1BR,KAAK;IAAA,KAQLgB,OAAO;IAAA,KAKPf,OAAO;IAAA,KAKPgB,IAAI;IAAA,KAKJC,IAAI;IAWF,IAAI,CAACL,WAAW,GAAGV,UAAU;IAC7BgB,MAAM,CAACC,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE;MAAEC,UAAU,EAAE;IAAM,CAAC,CAAC;IAEjEF,MAAM,CAACC,cAAc,CAAC,IAAI,EAAEZ,iBAAiB,EAAE;MAAEa,UAAU,EAAE;IAAM,CAAC,CAAC;IAErE,IAAI,CAACrB,KAAK,GAAG,IAAI,CAACa,WAAW,CAACb,KAAK;IACnC,IAAI,CAACgB,OAAO,GAAG,IAAI,CAACH,WAAW,CAACG,OAAO;IACvC,IAAI,CAACf,OAAO,GAAG,IAAI,CAACY,WAAW,CAACZ,OAAO;IACvC,IAAI,CAACgB,IAAI,GAAG,IAAI,CAACJ,WAAW,CAACI,IAAI;IACjC,IAAI,CAACC,IAAI,GAAG,IAAI,CAACL,WAAW,CAACK,IAAI,GAC7B;MACEI,OAAO,EAAE,IAAI,CAACT,WAAW,CAACK,IAAI,CAACI,OAAO;MACtCC,QAAQ,EAAE,IAAI,CAACV,WAAW,CAACK,IAAI,CAACK;IAClC,CAAC,GACDT,SAAS;;IAKbK,MAAM,CAACK,MAAM,CAAC,IAAI,CAAC;EACrB;AACF;AAEAL,MAAM,CAACK,MAAM,CAAC1B,UAAU,CAAC2B,SAAS,CAAC;AAAC"} \ No newline at end of file +{"version":3,"names":["_path","data","require","_configDescriptors","createItemFromDescriptor","desc","ConfigItem","createConfigItem","value","dirname","type","descriptor","createDescriptor","path","resolve","alias","CONFIG_ITEM_BRAND","Symbol","for","getItemDescriptor","item","_descriptor","undefined","constructor","options","name","file","Object","defineProperty","enumerable","request","resolved","freeze","prototype"],"sources":["../../src/config/item.ts"],"sourcesContent":["import type { Handler } from \"gensync\";\nimport type { PluginTarget, PluginOptions } from \"./validation/options.ts\";\n\nimport path from \"path\";\nimport { createDescriptor } from \"./config-descriptors.ts\";\n\nimport type { UnloadedDescriptor } from \"./config-descriptors.ts\";\n\nexport function createItemFromDescriptor(\n desc: UnloadedDescriptor,\n): ConfigItem {\n return new ConfigItem(desc);\n}\n\n/**\n * Create a config item using the same value format used in Babel's config\n * files. Items returned from this function should be cached by the caller\n * ideally, as recreating the config item will mean re-resolving the item\n * and re-evaluating the plugin/preset function.\n */\nexport function* createConfigItem(\n value:\n | PluginTarget\n | [PluginTarget, PluginOptions]\n | [PluginTarget, PluginOptions, string | void],\n {\n dirname = \".\",\n type,\n }: {\n dirname?: string;\n type?: \"preset\" | \"plugin\";\n } = {},\n): Handler> {\n const descriptor = yield* createDescriptor(value, path.resolve(dirname), {\n type,\n alias: \"programmatic item\",\n });\n\n return createItemFromDescriptor(descriptor);\n}\n\nconst CONFIG_ITEM_BRAND = Symbol.for(\"@babel/core@7 - ConfigItem\");\n\nexport function getItemDescriptor(\n item: unknown,\n): UnloadedDescriptor | void {\n if ((item as any)?.[CONFIG_ITEM_BRAND]) {\n return (item as ConfigItem)._descriptor;\n }\n\n return undefined;\n}\n\nexport type { ConfigItem };\n\n/**\n * A public representation of a plugin/preset that will _eventually_ be load.\n * Users can use this to interact with the results of a loaded Babel\n * configuration.\n *\n * Any changes to public properties of this class should be considered a\n * breaking change to Babel's API.\n */\nclass ConfigItem {\n /**\n * The private underlying descriptor that Babel actually cares about.\n * If you access this, you are a bad person.\n */\n _descriptor: UnloadedDescriptor;\n\n // TODO(Babel 9): Check if this symbol needs to be updated\n /**\n * Used to detect ConfigItem instances from other Babel instances.\n */\n [CONFIG_ITEM_BRAND] = true;\n\n /**\n * The resolved value of the item itself.\n */\n value: {} | Function;\n\n /**\n * The options, if any, that were passed to the item.\n * Mutating this will lead to undefined behavior.\n *\n * \"false\" means that this item has been disabled.\n */\n options: {} | void | false;\n\n /**\n * The directory that the options for this item are relative to.\n */\n dirname: string;\n\n /**\n * Get the name of the plugin, if the user gave it one.\n */\n name: string | void;\n\n /**\n * Data about the file that the item was loaded from, if Babel knows it.\n */\n file: {\n // The requested path, e.g. \"@babel/env\".\n request: string;\n // The resolved absolute path of the file.\n resolved: string;\n } | void;\n\n constructor(descriptor: UnloadedDescriptor) {\n // Make people less likely to stumble onto this if they are exploring\n // programmatically, and also make sure that if people happen to\n // pass the item through JSON.stringify, it doesn't show up.\n this._descriptor = descriptor;\n Object.defineProperty(this, \"_descriptor\", { enumerable: false });\n\n Object.defineProperty(this, CONFIG_ITEM_BRAND, { enumerable: false });\n\n this.value = this._descriptor.value;\n this.options = this._descriptor.options;\n this.dirname = this._descriptor.dirname;\n this.name = this._descriptor.name;\n this.file = this._descriptor.file\n ? {\n request: this._descriptor.file.request,\n resolved: this._descriptor.file.resolved,\n }\n : undefined;\n\n // Freeze the object to make it clear that people shouldn't expect mutating\n // this object to do anything. A new item should be created if they want\n // to change something.\n Object.freeze(this);\n }\n}\n\nObject.freeze(ConfigItem.prototype);\n"],"mappings":";;;;;;;;AAGA,SAAAA,MAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,KAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,IAAAE,kBAAA,GAAAD,OAAA;AAIO,SAASE,wBAAwBA,CACtCC,IAA6B,EACZ;EACjB,OAAO,IAAIC,UAAU,CAACD,IAAI,CAAC;AAC7B;AAQO,UAAUE,gBAAgBA,CAC/BC,KAGgD,EAChD;EACEC,OAAO,GAAG,GAAG;EACbC;AAIF,CAAC,GAAG,CAAC,CAAC,EACoB;EAC1B,MAAMC,UAAU,GAAG,OAAO,IAAAC,mCAAgB,EAACJ,KAAK,EAAEK,MAAGA,CAAC,CAACC,OAAO,CAACL,OAAO,CAAC,EAAE;IACvEC,IAAI;IACJK,KAAK,EAAE;EACT,CAAC,CAAC;EAEF,OAAOX,wBAAwB,CAACO,UAAU,CAAC;AAC7C;AAEA,MAAMK,iBAAiB,GAAGC,MAAM,CAACC,GAAG,CAAC,4BAA4B,CAAC;AAE3D,SAASC,iBAAiBA,CAC/BC,IAAa,EACmB;EAChC,IAAKA,IAAI,YAAJA,IAAI,CAAWJ,iBAAiB,CAAC,EAAE;IACtC,OAAQI,IAAI,CAAqBC,WAAW;EAC9C;EAEA,OAAOC,SAAS;AAClB;AAYA,MAAMhB,UAAU,CAAM;EA8CpBiB,WAAWA,CAACZ,UAAmC,EAAE;IAAA,KAzCjDU,WAAW;IAAA,KAMVL,iBAAiB,IAAI,IAAI;IAAA,KAK1BR,KAAK;IAAA,KAQLgB,OAAO;IAAA,KAKPf,OAAO;IAAA,KAKPgB,IAAI;IAAA,KAKJC,IAAI;IAWF,IAAI,CAACL,WAAW,GAAGV,UAAU;IAC7BgB,MAAM,CAACC,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE;MAAEC,UAAU,EAAE;IAAM,CAAC,CAAC;IAEjEF,MAAM,CAACC,cAAc,CAAC,IAAI,EAAEZ,iBAAiB,EAAE;MAAEa,UAAU,EAAE;IAAM,CAAC,CAAC;IAErE,IAAI,CAACrB,KAAK,GAAG,IAAI,CAACa,WAAW,CAACb,KAAK;IACnC,IAAI,CAACgB,OAAO,GAAG,IAAI,CAACH,WAAW,CAACG,OAAO;IACvC,IAAI,CAACf,OAAO,GAAG,IAAI,CAACY,WAAW,CAACZ,OAAO;IACvC,IAAI,CAACgB,IAAI,GAAG,IAAI,CAACJ,WAAW,CAACI,IAAI;IACjC,IAAI,CAACC,IAAI,GAAG,IAAI,CAACL,WAAW,CAACK,IAAI,GAC7B;MACEI,OAAO,EAAE,IAAI,CAACT,WAAW,CAACK,IAAI,CAACI,OAAO;MACtCC,QAAQ,EAAE,IAAI,CAACV,WAAW,CAACK,IAAI,CAACK;IAClC,CAAC,GACDT,SAAS;IAKbK,MAAM,CAACK,MAAM,CAAC,IAAI,CAAC;EACrB;AACF;AAEAL,MAAM,CAACK,MAAM,CAAC1B,UAAU,CAAC2B,SAAS,CAAC;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/partial.js b/node_modules/@babel/core/lib/config/partial.js index d724fd7de62f..5874ad99b943 100644 --- a/node_modules/@babel/core/lib/config/partial.js +++ b/node_modules/@babel/core/lib/config/partial.js @@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = loadPrivatePartialConfig; -exports.loadPartialConfig = void 0; +exports.loadPartialConfig = loadPartialConfig; function _path() { const data = require("path"); _path = function () { @@ -12,21 +12,14 @@ function _path() { }; return data; } -function _gensync() { - const data = require("gensync"); - _gensync = function () { - return data; - }; - return data; -} -var _plugin = require("./plugin"); -var _util = require("./util"); -var _item = require("./item"); -var _configChain = require("./config-chain"); -var _environment = require("./helpers/environment"); -var _options = require("./validation/options"); -var _files = require("./files"); -var _resolveTargets = require("./resolve-targets"); +var _plugin = require("./plugin.js"); +var _util = require("./util.js"); +var _item = require("./item.js"); +var _configChain = require("./config-chain.js"); +var _environment = require("./helpers/environment.js"); +var _options = require("./validation/options.js"); +var _index = require("./files/index.js"); +var _resolveTargets = require("./resolve-targets.js"); const _excluded = ["showIgnoredFiles"]; function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function resolveRootMode(rootDir, rootMode) { @@ -35,14 +28,14 @@ function resolveRootMode(rootDir, rootMode) { return rootDir; case "upward-optional": { - const upwardRootDir = (0, _files.findConfigUpwards)(rootDir); + const upwardRootDir = (0, _index.findConfigUpwards)(rootDir); return upwardRootDir === null ? rootDir : upwardRootDir; } case "upward": { - const upwardRootDir = (0, _files.findConfigUpwards)(rootDir); + const upwardRootDir = (0, _index.findConfigUpwards)(rootDir); if (upwardRootDir !== null) return upwardRootDir; - throw Object.assign(new Error(`Babel was run with rootMode:"upward" but a root could not ` + `be found when searching upward from "${rootDir}".\n` + `One of the following config files must be in the directory tree: ` + `"${_files.ROOT_CONFIG_FILENAMES.join(", ")}".`), { + throw Object.assign(new Error(`Babel was run with rootMode:"upward" but a root could not ` + `be found when searching upward from "${rootDir}".\n` + `One of the following config files must be in the directory tree: ` + `"${_index.ROOT_CONFIG_FILENAMES.join(", ")}".`), { code: "BABEL_ROOT_NOT_FOUND", dirname: rootDir }); @@ -67,7 +60,7 @@ function* loadPrivatePartialConfig(inputOpts) { const absoluteCwd = _path().resolve(cwd); const absoluteRootDir = resolveRootMode(_path().resolve(absoluteCwd, rootDir), rootMode); const filename = typeof args.filename === "string" ? _path().resolve(cwd, args.filename) : undefined; - const showConfigPath = yield* (0, _files.resolveShowConfigPath)(absoluteCwd); + const showConfigPath = yield* (0, _index.resolveShowConfigPath)(absoluteCwd); const context = { filename, cwd: absoluteCwd, @@ -109,7 +102,7 @@ function* loadPrivatePartialConfig(inputOpts) { files: configChain.files }; } -const loadPartialConfig = _gensync()(function* (opts) { +function* loadPartialConfig(opts) { let showIgnoredFiles = false; if (typeof opts === "object" && opts !== null && !Array.isArray(opts)) { var _opts = opts; @@ -138,10 +131,8 @@ const loadPartialConfig = _gensync()(function* (opts) { } }); return new PartialConfig(options, babelrc ? babelrc.filepath : undefined, ignore ? ignore.filepath : undefined, config ? config.filepath : undefined, fileHandling, files); -}); -exports.loadPartialConfig = loadPartialConfig; +} class PartialConfig { - constructor(options, babelrc, ignore, config, fileHandling, files) { this.options = void 0; this.babelrc = void 0; @@ -155,10 +146,8 @@ class PartialConfig { this.config = config; this.fileHandling = fileHandling; this.files = files; - Object.freeze(this); } - hasFilesystemConfig() { return this.babelrc !== undefined || this.config !== undefined; } diff --git a/node_modules/@babel/core/lib/config/partial.js.map b/node_modules/@babel/core/lib/config/partial.js.map index 300bfd860ea9..43b2a59161fe 100644 --- a/node_modules/@babel/core/lib/config/partial.js.map +++ b/node_modules/@babel/core/lib/config/partial.js.map @@ -1 +1 @@ -{"version":3,"names":["resolveRootMode","rootDir","rootMode","upwardRootDir","findConfigUpwards","Object","assign","Error","ROOT_CONFIG_FILENAMES","join","code","dirname","loadPrivatePartialConfig","inputOpts","Array","isArray","args","validate","envName","getEnv","cwd","root","caller","cloneInputAst","absoluteCwd","path","resolve","absoluteRootDir","filename","undefined","showConfigPath","resolveShowConfigPath","context","showConfig","configChain","buildRootChain","merged","assumptions","options","forEach","opts","mergeOptions","targets","resolveTargets","babelrc","configFile","browserslistConfigFile","passPerPreset","plugins","map","descriptor","createItemFromDescriptor","presets","fileHandling","ignore","config","files","loadPartialConfig","gensync","showIgnoredFiles","result","item","value","Plugin","PartialConfig","filepath","constructor","babelignore","freeze","hasFilesystemConfig","prototype"],"sources":["../../src/config/partial.ts"],"sourcesContent":["import path from \"path\";\nimport gensync from \"gensync\";\nimport type { Handler } from \"gensync\";\nimport Plugin from \"./plugin\";\nimport { mergeOptions } from \"./util\";\nimport { createItemFromDescriptor } from \"./item\";\nimport { buildRootChain } from \"./config-chain\";\nimport type { ConfigContext, FileHandling } from \"./config-chain\";\nimport { getEnv } from \"./helpers/environment\";\nimport { validate } from \"./validation/options\";\n\nimport type {\n ValidatedOptions,\n NormalizedOptions,\n RootMode,\n} from \"./validation/options\";\n\nimport {\n findConfigUpwards,\n resolveShowConfigPath,\n ROOT_CONFIG_FILENAMES,\n} from \"./files\";\nimport type { ConfigFile, IgnoreFile } from \"./files\";\nimport { resolveTargets } from \"./resolve-targets\";\n\nfunction resolveRootMode(rootDir: string, rootMode: RootMode): string {\n switch (rootMode) {\n case \"root\":\n return rootDir;\n\n case \"upward-optional\": {\n const upwardRootDir = findConfigUpwards(rootDir);\n return upwardRootDir === null ? rootDir : upwardRootDir;\n }\n\n case \"upward\": {\n const upwardRootDir = findConfigUpwards(rootDir);\n if (upwardRootDir !== null) return upwardRootDir;\n\n throw Object.assign(\n new Error(\n `Babel was run with rootMode:\"upward\" but a root could not ` +\n `be found when searching upward from \"${rootDir}\".\\n` +\n `One of the following config files must be in the directory tree: ` +\n `\"${ROOT_CONFIG_FILENAMES.join(\", \")}\".`,\n ) as any,\n {\n code: \"BABEL_ROOT_NOT_FOUND\",\n dirname: rootDir,\n },\n );\n }\n default:\n throw new Error(`Assertion failure - unknown rootMode value.`);\n }\n}\n\ntype PrivPartialConfig = {\n options: NormalizedOptions;\n context: ConfigContext;\n fileHandling: FileHandling;\n ignore: IgnoreFile | void;\n babelrc: ConfigFile | void;\n config: ConfigFile | void;\n files: Set;\n};\n\nexport default function* loadPrivatePartialConfig(\n inputOpts: unknown,\n): Handler {\n if (\n inputOpts != null &&\n (typeof inputOpts !== \"object\" || Array.isArray(inputOpts))\n ) {\n throw new Error(\"Babel options must be an object, null, or undefined\");\n }\n\n const args = inputOpts ? validate(\"arguments\", inputOpts) : {};\n\n const {\n envName = getEnv(),\n cwd = \".\",\n root: rootDir = \".\",\n rootMode = \"root\",\n caller,\n cloneInputAst = true,\n } = args;\n const absoluteCwd = path.resolve(cwd);\n const absoluteRootDir = resolveRootMode(\n path.resolve(absoluteCwd, rootDir),\n rootMode,\n );\n\n const filename =\n typeof args.filename === \"string\"\n ? path.resolve(cwd, args.filename)\n : undefined;\n\n const showConfigPath = yield* resolveShowConfigPath(absoluteCwd);\n\n const context: ConfigContext = {\n filename,\n cwd: absoluteCwd,\n root: absoluteRootDir,\n envName,\n caller,\n showConfig: showConfigPath === filename,\n };\n\n const configChain = yield* buildRootChain(args, context);\n if (!configChain) return null;\n\n const merged: ValidatedOptions = {\n assumptions: {},\n };\n configChain.options.forEach(opts => {\n mergeOptions(merged as any, opts);\n });\n\n const options: NormalizedOptions = {\n ...merged,\n targets: resolveTargets(merged, absoluteRootDir),\n\n // Tack the passes onto the object itself so that, if this object is\n // passed back to Babel a second time, it will be in the right structure\n // to not change behavior.\n cloneInputAst,\n babelrc: false,\n configFile: false,\n browserslistConfigFile: false,\n passPerPreset: false,\n envName: context.envName,\n cwd: context.cwd,\n root: context.root,\n rootMode: \"root\",\n filename:\n typeof context.filename === \"string\" ? context.filename : undefined,\n\n plugins: configChain.plugins.map(descriptor =>\n createItemFromDescriptor(descriptor),\n ),\n presets: configChain.presets.map(descriptor =>\n createItemFromDescriptor(descriptor),\n ),\n };\n\n return {\n options,\n context,\n fileHandling: configChain.fileHandling,\n ignore: configChain.ignore,\n babelrc: configChain.babelrc,\n config: configChain.config,\n files: configChain.files,\n };\n}\n\ntype LoadPartialConfigOpts = {\n showIgnoredFiles?: boolean;\n};\n\nexport const loadPartialConfig = gensync(function* (\n opts?: LoadPartialConfigOpts,\n): Handler {\n let showIgnoredFiles = false;\n // We only extract showIgnoredFiles if opts is an object, so that\n // loadPrivatePartialConfig can throw the appropriate error if it's not.\n if (typeof opts === \"object\" && opts !== null && !Array.isArray(opts)) {\n ({ showIgnoredFiles, ...opts } = opts);\n }\n\n const result: PrivPartialConfig | undefined | null =\n yield* loadPrivatePartialConfig(opts);\n if (!result) return null;\n\n const { options, babelrc, ignore, config, fileHandling, files } = result;\n\n if (fileHandling === \"ignored\" && !showIgnoredFiles) {\n return null;\n }\n\n (options.plugins || []).forEach(item => {\n // @ts-expect-error todo(flow->ts): better type annotation for `item.value`\n if (item.value instanceof Plugin) {\n throw new Error(\n \"Passing cached plugin instances is not supported in \" +\n \"babel.loadPartialConfig()\",\n );\n }\n });\n\n return new PartialConfig(\n options,\n babelrc ? babelrc.filepath : undefined,\n ignore ? ignore.filepath : undefined,\n config ? config.filepath : undefined,\n fileHandling,\n files,\n );\n});\n\nexport type { PartialConfig };\n\nclass PartialConfig {\n /**\n * These properties are public, so any changes to them should be considered\n * a breaking change to Babel's API.\n */\n options: NormalizedOptions;\n babelrc: string | void;\n babelignore: string | void;\n config: string | void;\n fileHandling: FileHandling;\n files: Set;\n\n constructor(\n options: NormalizedOptions,\n babelrc: string | void,\n ignore: string | void,\n config: string | void,\n fileHandling: FileHandling,\n files: Set,\n ) {\n this.options = options;\n this.babelignore = ignore;\n this.babelrc = babelrc;\n this.config = config;\n this.fileHandling = fileHandling;\n this.files = files;\n\n // Freeze since this is a public API and it should be extremely obvious that\n // reassigning properties on here does nothing.\n Object.freeze(this);\n }\n\n /**\n * Returns true if there is a config file in the filesystem for this config.\n */\n hasFilesystemConfig(): boolean {\n return this.babelrc !== undefined || this.config !== undefined;\n }\n}\nObject.freeze(PartialConfig.prototype);\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_path","data","require","_plugin","_util","_item","_configChain","_environment","_options","_index","_resolveTargets","_excluded","_objectWithoutPropertiesLoose","source","excluded","target","sourceKeys","Object","keys","key","i","length","indexOf","resolveRootMode","rootDir","rootMode","upwardRootDir","findConfigUpwards","assign","Error","ROOT_CONFIG_FILENAMES","join","code","dirname","loadPrivatePartialConfig","inputOpts","Array","isArray","args","validate","envName","getEnv","cwd","root","caller","cloneInputAst","absoluteCwd","path","resolve","absoluteRootDir","filename","undefined","showConfigPath","resolveShowConfigPath","context","showConfig","configChain","buildRootChain","merged","assumptions","options","forEach","opts","mergeOptions","targets","resolveTargets","babelrc","configFile","browserslistConfigFile","passPerPreset","plugins","map","descriptor","createItemFromDescriptor","presets","fileHandling","ignore","config","files","loadPartialConfig","showIgnoredFiles","_opts","result","item","value","Plugin","PartialConfig","filepath","constructor","babelignore","freeze","hasFilesystemConfig","prototype"],"sources":["../../src/config/partial.ts"],"sourcesContent":["import path from \"path\";\nimport type { Handler } from \"gensync\";\nimport Plugin from \"./plugin.ts\";\nimport { mergeOptions } from \"./util.ts\";\nimport { createItemFromDescriptor } from \"./item.ts\";\nimport { buildRootChain } from \"./config-chain.ts\";\nimport type { ConfigContext, FileHandling } from \"./config-chain.ts\";\nimport { getEnv } from \"./helpers/environment.ts\";\nimport { validate } from \"./validation/options.ts\";\n\nimport type {\n ValidatedOptions,\n NormalizedOptions,\n RootMode,\n} from \"./validation/options.ts\";\n\nimport {\n findConfigUpwards,\n resolveShowConfigPath,\n ROOT_CONFIG_FILENAMES,\n} from \"./files/index.ts\";\nimport type { ConfigFile, IgnoreFile } from \"./files/index.ts\";\nimport { resolveTargets } from \"./resolve-targets.ts\";\n\nfunction resolveRootMode(rootDir: string, rootMode: RootMode): string {\n switch (rootMode) {\n case \"root\":\n return rootDir;\n\n case \"upward-optional\": {\n const upwardRootDir = findConfigUpwards(rootDir);\n return upwardRootDir === null ? rootDir : upwardRootDir;\n }\n\n case \"upward\": {\n const upwardRootDir = findConfigUpwards(rootDir);\n if (upwardRootDir !== null) return upwardRootDir;\n\n throw Object.assign(\n new Error(\n `Babel was run with rootMode:\"upward\" but a root could not ` +\n `be found when searching upward from \"${rootDir}\".\\n` +\n `One of the following config files must be in the directory tree: ` +\n `\"${ROOT_CONFIG_FILENAMES.join(\", \")}\".`,\n ) as any,\n {\n code: \"BABEL_ROOT_NOT_FOUND\",\n dirname: rootDir,\n },\n );\n }\n default:\n throw new Error(`Assertion failure - unknown rootMode value.`);\n }\n}\n\ntype PrivPartialConfig = {\n options: NormalizedOptions;\n context: ConfigContext;\n fileHandling: FileHandling;\n ignore: IgnoreFile | void;\n babelrc: ConfigFile | void;\n config: ConfigFile | void;\n files: Set;\n};\n\nexport default function* loadPrivatePartialConfig(\n inputOpts: unknown,\n): Handler {\n if (\n inputOpts != null &&\n (typeof inputOpts !== \"object\" || Array.isArray(inputOpts))\n ) {\n throw new Error(\"Babel options must be an object, null, or undefined\");\n }\n\n const args = inputOpts ? validate(\"arguments\", inputOpts) : {};\n\n const {\n envName = getEnv(),\n cwd = \".\",\n root: rootDir = \".\",\n rootMode = \"root\",\n caller,\n cloneInputAst = true,\n } = args;\n const absoluteCwd = path.resolve(cwd);\n const absoluteRootDir = resolveRootMode(\n path.resolve(absoluteCwd, rootDir),\n rootMode,\n );\n\n const filename =\n typeof args.filename === \"string\"\n ? path.resolve(cwd, args.filename)\n : undefined;\n\n const showConfigPath = yield* resolveShowConfigPath(absoluteCwd);\n\n const context: ConfigContext = {\n filename,\n cwd: absoluteCwd,\n root: absoluteRootDir,\n envName,\n caller,\n showConfig: showConfigPath === filename,\n };\n\n const configChain = yield* buildRootChain(args, context);\n if (!configChain) return null;\n\n const merged: ValidatedOptions = {\n assumptions: {},\n };\n configChain.options.forEach(opts => {\n mergeOptions(merged as any, opts);\n });\n\n const options: NormalizedOptions = {\n ...merged,\n targets: resolveTargets(merged, absoluteRootDir),\n\n // Tack the passes onto the object itself so that, if this object is\n // passed back to Babel a second time, it will be in the right structure\n // to not change behavior.\n cloneInputAst,\n babelrc: false,\n configFile: false,\n browserslistConfigFile: false,\n passPerPreset: false,\n envName: context.envName,\n cwd: context.cwd,\n root: context.root,\n rootMode: \"root\",\n filename:\n typeof context.filename === \"string\" ? context.filename : undefined,\n\n plugins: configChain.plugins.map(descriptor =>\n createItemFromDescriptor(descriptor),\n ),\n presets: configChain.presets.map(descriptor =>\n createItemFromDescriptor(descriptor),\n ),\n };\n\n return {\n options,\n context,\n fileHandling: configChain.fileHandling,\n ignore: configChain.ignore,\n babelrc: configChain.babelrc,\n config: configChain.config,\n files: configChain.files,\n };\n}\n\ntype LoadPartialConfigOpts = {\n showIgnoredFiles?: boolean;\n};\n\nexport function* loadPartialConfig(\n opts?: LoadPartialConfigOpts,\n): Handler {\n let showIgnoredFiles = false;\n // We only extract showIgnoredFiles if opts is an object, so that\n // loadPrivatePartialConfig can throw the appropriate error if it's not.\n if (typeof opts === \"object\" && opts !== null && !Array.isArray(opts)) {\n ({ showIgnoredFiles, ...opts } = opts);\n }\n\n const result: PrivPartialConfig | undefined | null =\n yield* loadPrivatePartialConfig(opts);\n if (!result) return null;\n\n const { options, babelrc, ignore, config, fileHandling, files } = result;\n\n if (fileHandling === \"ignored\" && !showIgnoredFiles) {\n return null;\n }\n\n (options.plugins || []).forEach(item => {\n // @ts-expect-error todo(flow->ts): better type annotation for `item.value`\n if (item.value instanceof Plugin) {\n throw new Error(\n \"Passing cached plugin instances is not supported in \" +\n \"babel.loadPartialConfig()\",\n );\n }\n });\n\n return new PartialConfig(\n options,\n babelrc ? babelrc.filepath : undefined,\n ignore ? ignore.filepath : undefined,\n config ? config.filepath : undefined,\n fileHandling,\n files,\n );\n}\n\nexport type { PartialConfig };\n\nclass PartialConfig {\n /**\n * These properties are public, so any changes to them should be considered\n * a breaking change to Babel's API.\n */\n options: NormalizedOptions;\n babelrc: string | void;\n babelignore: string | void;\n config: string | void;\n fileHandling: FileHandling;\n files: Set;\n\n constructor(\n options: NormalizedOptions,\n babelrc: string | void,\n ignore: string | void,\n config: string | void,\n fileHandling: FileHandling,\n files: Set,\n ) {\n this.options = options;\n this.babelignore = ignore;\n this.babelrc = babelrc;\n this.config = config;\n this.fileHandling = fileHandling;\n this.files = files;\n\n // Freeze since this is a public API and it should be extremely obvious that\n // reassigning properties on here does nothing.\n Object.freeze(this);\n }\n\n /**\n * Returns true if there is a config file in the filesystem for this config.\n */\n hasFilesystemConfig(): boolean {\n return this.babelrc !== undefined || this.config !== undefined;\n }\n}\nObject.freeze(PartialConfig.prototype);\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/pattern-to-regex.js b/node_modules/@babel/core/lib/config/pattern-to-regex.js index 73bfc1b629cc..e061f7935026 100644 --- a/node_modules/@babel/core/lib/config/pattern-to-regex.js +++ b/node_modules/@babel/core/lib/config/pattern-to-regex.js @@ -21,20 +21,15 @@ const starStarPatLast = `${starPat}*?${starPatLast}?`; function escapeRegExp(string) { return string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&"); } - function pathToPattern(pattern, dirname) { const parts = _path().resolve(dirname, pattern).split(_path().sep); return new RegExp(["^", ...parts.map((part, i) => { const last = i === parts.length - 1; - if (part === "**") return last ? starStarPatLast : starStarPat; - if (part === "*") return last ? starPatLast : starPat; - if (part.indexOf("*.") === 0) { return substitution + escapeRegExp(part.slice(1)) + (last ? endSep : sep); } - return escapeRegExp(part) + (last ? endSep : sep); })].join("")); } diff --git a/node_modules/@babel/core/lib/config/pattern-to-regex.js.map b/node_modules/@babel/core/lib/config/pattern-to-regex.js.map index 4b6a594f4e50..6ff196b7f6a7 100644 --- a/node_modules/@babel/core/lib/config/pattern-to-regex.js.map +++ b/node_modules/@babel/core/lib/config/pattern-to-regex.js.map @@ -1 +1 @@ -{"version":3,"names":["sep","path","endSep","substitution","starPat","starPatLast","starStarPat","starStarPatLast","escapeRegExp","string","replace","pathToPattern","pattern","dirname","parts","resolve","split","RegExp","map","part","i","last","length","indexOf","slice","join"],"sources":["../../src/config/pattern-to-regex.ts"],"sourcesContent":["import path from \"path\";\n\nconst sep = `\\\\${path.sep}`;\nconst endSep = `(?:${sep}|$)`;\n\nconst substitution = `[^${sep}]+`;\n\nconst starPat = `(?:${substitution}${sep})`;\nconst starPatLast = `(?:${substitution}${endSep})`;\n\nconst starStarPat = `${starPat}*?`;\nconst starStarPatLast = `${starPat}*?${starPatLast}?`;\n\nfunction escapeRegExp(string: string) {\n return string.replace(/[|\\\\{}()[\\]^$+*?.]/g, \"\\\\$&\");\n}\n\n/**\n * Implement basic pattern matching that will allow users to do the simple\n * tests with * and **. If users want full complex pattern matching, then can\n * always use regex matching, or function validation.\n */\nexport default function pathToPattern(\n pattern: string,\n dirname: string,\n): RegExp {\n const parts = path.resolve(dirname, pattern).split(path.sep);\n\n return new RegExp(\n [\n \"^\",\n ...parts.map((part, i) => {\n const last = i === parts.length - 1;\n\n // ** matches 0 or more path parts.\n if (part === \"**\") return last ? starStarPatLast : starStarPat;\n\n // * matches 1 path part.\n if (part === \"*\") return last ? starPatLast : starPat;\n\n // *.ext matches a wildcard with an extension.\n if (part.indexOf(\"*.\") === 0) {\n return (\n substitution + escapeRegExp(part.slice(1)) + (last ? endSep : sep)\n );\n }\n\n // Otherwise match the pattern text.\n return escapeRegExp(part) + (last ? endSep : sep);\n }),\n ].join(\"\"),\n );\n}\n"],"mappings":";;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA,MAAMA,GAAG,GAAI,KAAIC,OAAI,CAACD,GAAI,EAAC;AAC3B,MAAME,MAAM,GAAI,MAAKF,GAAI,KAAI;AAE7B,MAAMG,YAAY,GAAI,KAAIH,GAAI,IAAG;AAEjC,MAAMI,OAAO,GAAI,MAAKD,YAAa,GAAEH,GAAI,GAAE;AAC3C,MAAMK,WAAW,GAAI,MAAKF,YAAa,GAAED,MAAO,GAAE;AAElD,MAAMI,WAAW,GAAI,GAAEF,OAAQ,IAAG;AAClC,MAAMG,eAAe,GAAI,GAAEH,OAAQ,KAAIC,WAAY,GAAE;AAErD,SAASG,YAAY,CAACC,MAAc,EAAE;EACpC,OAAOA,MAAM,CAACC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC;AACtD;;AAOe,SAASC,aAAa,CACnCC,OAAe,EACfC,OAAe,EACP;EACR,MAAMC,KAAK,GAAGb,OAAI,CAACc,OAAO,CAACF,OAAO,EAAED,OAAO,CAAC,CAACI,KAAK,CAACf,OAAI,CAACD,GAAG,CAAC;EAE5D,OAAO,IAAIiB,MAAM,CACf,CACE,GAAG,EACH,GAAGH,KAAK,CAACI,GAAG,CAAC,CAACC,IAAI,EAAEC,CAAC,KAAK;IACxB,MAAMC,IAAI,GAAGD,CAAC,KAAKN,KAAK,CAACQ,MAAM,GAAG,CAAC;;IAGnC,IAAIH,IAAI,KAAK,IAAI,EAAE,OAAOE,IAAI,GAAGd,eAAe,GAAGD,WAAW;;IAG9D,IAAIa,IAAI,KAAK,GAAG,EAAE,OAAOE,IAAI,GAAGhB,WAAW,GAAGD,OAAO;;IAGrD,IAAIe,IAAI,CAACI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;MAC5B,OACEpB,YAAY,GAAGK,YAAY,CAACW,IAAI,CAACK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAIH,IAAI,GAAGnB,MAAM,GAAGF,GAAG,CAAC;IAEtE;;IAGA,OAAOQ,YAAY,CAACW,IAAI,CAAC,IAAIE,IAAI,GAAGnB,MAAM,GAAGF,GAAG,CAAC;EACnD,CAAC,CAAC,CACH,CAACyB,IAAI,CAAC,EAAE,CAAC,CACX;AACH;AAAC"} \ No newline at end of file +{"version":3,"names":["_path","data","require","sep","path","endSep","substitution","starPat","starPatLast","starStarPat","starStarPatLast","escapeRegExp","string","replace","pathToPattern","pattern","dirname","parts","resolve","split","RegExp","map","part","i","last","length","indexOf","slice","join"],"sources":["../../src/config/pattern-to-regex.ts"],"sourcesContent":["import path from \"path\";\n\nconst sep = `\\\\${path.sep}`;\nconst endSep = `(?:${sep}|$)`;\n\nconst substitution = `[^${sep}]+`;\n\nconst starPat = `(?:${substitution}${sep})`;\nconst starPatLast = `(?:${substitution}${endSep})`;\n\nconst starStarPat = `${starPat}*?`;\nconst starStarPatLast = `${starPat}*?${starPatLast}?`;\n\nfunction escapeRegExp(string: string) {\n return string.replace(/[|\\\\{}()[\\]^$+*?.]/g, \"\\\\$&\");\n}\n\n/**\n * Implement basic pattern matching that will allow users to do the simple\n * tests with * and **. If users want full complex pattern matching, then can\n * always use regex matching, or function validation.\n */\nexport default function pathToPattern(\n pattern: string,\n dirname: string,\n): RegExp {\n const parts = path.resolve(dirname, pattern).split(path.sep);\n\n return new RegExp(\n [\n \"^\",\n ...parts.map((part, i) => {\n const last = i === parts.length - 1;\n\n // ** matches 0 or more path parts.\n if (part === \"**\") return last ? starStarPatLast : starStarPat;\n\n // * matches 1 path part.\n if (part === \"*\") return last ? starPatLast : starPat;\n\n // *.ext matches a wildcard with an extension.\n if (part.indexOf(\"*.\") === 0) {\n return (\n substitution + escapeRegExp(part.slice(1)) + (last ? endSep : sep)\n );\n }\n\n // Otherwise match the pattern text.\n return escapeRegExp(part) + (last ? endSep : sep);\n }),\n ].join(\"\"),\n );\n}\n"],"mappings":";;;;;;AAAA,SAAAA,MAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,KAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,MAAME,GAAG,GAAI,KAAIC,MAAGA,CAAC,CAACD,GAAI,EAAC;AAC3B,MAAME,MAAM,GAAI,MAAKF,GAAI,KAAI;AAE7B,MAAMG,YAAY,GAAI,KAAIH,GAAI,IAAG;AAEjC,MAAMI,OAAO,GAAI,MAAKD,YAAa,GAAEH,GAAI,GAAE;AAC3C,MAAMK,WAAW,GAAI,MAAKF,YAAa,GAAED,MAAO,GAAE;AAElD,MAAMI,WAAW,GAAI,GAAEF,OAAQ,IAAG;AAClC,MAAMG,eAAe,GAAI,GAAEH,OAAQ,KAAIC,WAAY,GAAE;AAErD,SAASG,YAAYA,CAACC,MAAc,EAAE;EACpC,OAAOA,MAAM,CAACC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC;AACtD;AAOe,SAASC,aAAaA,CACnCC,OAAe,EACfC,OAAe,EACP;EACR,MAAMC,KAAK,GAAGb,MAAGA,CAAC,CAACc,OAAO,CAACF,OAAO,EAAED,OAAO,CAAC,CAACI,KAAK,CAACf,MAAGA,CAAC,CAACD,GAAG,CAAC;EAE5D,OAAO,IAAIiB,MAAM,CACf,CACE,GAAG,EACH,GAAGH,KAAK,CAACI,GAAG,CAAC,CAACC,IAAI,EAAEC,CAAC,KAAK;IACxB,MAAMC,IAAI,GAAGD,CAAC,KAAKN,KAAK,CAACQ,MAAM,GAAG,CAAC;IAGnC,IAAIH,IAAI,KAAK,IAAI,EAAE,OAAOE,IAAI,GAAGd,eAAe,GAAGD,WAAW;IAG9D,IAAIa,IAAI,KAAK,GAAG,EAAE,OAAOE,IAAI,GAAGhB,WAAW,GAAGD,OAAO;IAGrD,IAAIe,IAAI,CAACI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;MAC5B,OACEpB,YAAY,GAAGK,YAAY,CAACW,IAAI,CAACK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAIH,IAAI,GAAGnB,MAAM,GAAGF,GAAG,CAAC;IAEtE;IAGA,OAAOQ,YAAY,CAACW,IAAI,CAAC,IAAIE,IAAI,GAAGnB,MAAM,GAAGF,GAAG,CAAC;EACnD,CAAC,CAAC,CACH,CAACyB,IAAI,CAAC,EAAE,CACX,CAAC;AACH;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/plugin.js b/node_modules/@babel/core/lib/config/plugin.js index 58dcb03403a1..21a28cd5a542 100644 --- a/node_modules/@babel/core/lib/config/plugin.js +++ b/node_modules/@babel/core/lib/config/plugin.js @@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _deepArray = require("./helpers/deep-array"); +var _deepArray = require("./helpers/deep-array.js"); class Plugin { constructor(plugin, options, key, externalDependencies = (0, _deepArray.finalize)([])) { this.key = void 0; diff --git a/node_modules/@babel/core/lib/config/plugin.js.map b/node_modules/@babel/core/lib/config/plugin.js.map index 2ad796173e62..1a91977e8238 100644 --- a/node_modules/@babel/core/lib/config/plugin.js.map +++ b/node_modules/@babel/core/lib/config/plugin.js.map @@ -1 +1 @@ -{"version":3,"names":["Plugin","constructor","plugin","options","key","externalDependencies","finalize","manipulateOptions","post","pre","visitor","parserOverride","generatorOverride","name"],"sources":["../../src/config/plugin.ts"],"sourcesContent":["import { finalize } from \"./helpers/deep-array\";\nimport type { ReadonlyDeepArray } from \"./helpers/deep-array\";\nimport type { PluginObject } from \"./validation/plugins\";\n\nexport default class Plugin {\n key: string | undefined | null;\n manipulateOptions?: (options: unknown, parserOpts: unknown) => void;\n post?: PluginObject[\"post\"];\n pre?: PluginObject[\"pre\"];\n visitor: PluginObject[\"visitor\"];\n\n parserOverride?: Function;\n generatorOverride?: Function;\n\n options: {};\n\n externalDependencies: ReadonlyDeepArray;\n\n constructor(\n plugin: PluginObject,\n options: {},\n key?: string,\n externalDependencies: ReadonlyDeepArray = finalize([]),\n ) {\n this.key = plugin.name || key;\n\n this.manipulateOptions = plugin.manipulateOptions;\n this.post = plugin.post;\n this.pre = plugin.pre;\n this.visitor = plugin.visitor || {};\n this.parserOverride = plugin.parserOverride;\n this.generatorOverride = plugin.generatorOverride;\n\n this.options = options;\n this.externalDependencies = externalDependencies;\n }\n}\n"],"mappings":";;;;;;AAAA;AAIe,MAAMA,MAAM,CAAC;EAc1BC,WAAW,CACTC,MAAoB,EACpBC,OAAW,EACXC,GAAY,EACZC,oBAA+C,GAAG,IAAAC,mBAAQ,EAAC,EAAE,CAAC,EAC9D;IAAA,KAlBFF,GAAG;IAAA,KACHG,iBAAiB;IAAA,KACjBC,IAAI;IAAA,KACJC,GAAG;IAAA,KACHC,OAAO;IAAA,KAEPC,cAAc;IAAA,KACdC,iBAAiB;IAAA,KAEjBT,OAAO;IAAA,KAEPE,oBAAoB;IAQlB,IAAI,CAACD,GAAG,GAAGF,MAAM,CAACW,IAAI,IAAIT,GAAG;IAE7B,IAAI,CAACG,iBAAiB,GAAGL,MAAM,CAACK,iBAAiB;IACjD,IAAI,CAACC,IAAI,GAAGN,MAAM,CAACM,IAAI;IACvB,IAAI,CAACC,GAAG,GAAGP,MAAM,CAACO,GAAG;IACrB,IAAI,CAACC,OAAO,GAAGR,MAAM,CAACQ,OAAO,IAAI,CAAC,CAAC;IACnC,IAAI,CAACC,cAAc,GAAGT,MAAM,CAACS,cAAc;IAC3C,IAAI,CAACC,iBAAiB,GAAGV,MAAM,CAACU,iBAAiB;IAEjD,IAAI,CAACT,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACE,oBAAoB,GAAGA,oBAAoB;EAClD;AACF;AAAC;AAAA"} \ No newline at end of file +{"version":3,"names":["_deepArray","require","Plugin","constructor","plugin","options","key","externalDependencies","finalize","manipulateOptions","post","pre","visitor","parserOverride","generatorOverride","name","exports","default"],"sources":["../../src/config/plugin.ts"],"sourcesContent":["import { finalize } from \"./helpers/deep-array.ts\";\nimport type { ReadonlyDeepArray } from \"./helpers/deep-array.ts\";\nimport type { PluginObject } from \"./validation/plugins.ts\";\n\nexport default class Plugin {\n key: string | undefined | null;\n manipulateOptions?: (options: unknown, parserOpts: unknown) => void;\n post?: PluginObject[\"post\"];\n pre?: PluginObject[\"pre\"];\n visitor: PluginObject[\"visitor\"];\n\n parserOverride?: Function;\n generatorOverride?: Function;\n\n options: {};\n\n externalDependencies: ReadonlyDeepArray;\n\n constructor(\n plugin: PluginObject,\n options: {},\n key?: string,\n externalDependencies: ReadonlyDeepArray = finalize([]),\n ) {\n this.key = plugin.name || key;\n\n this.manipulateOptions = plugin.manipulateOptions;\n this.post = plugin.post;\n this.pre = plugin.pre;\n this.visitor = plugin.visitor || {};\n this.parserOverride = plugin.parserOverride;\n this.generatorOverride = plugin.generatorOverride;\n\n this.options = options;\n this.externalDependencies = externalDependencies;\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAIe,MAAMC,MAAM,CAAC;EAc1BC,WAAWA,CACTC,MAAoB,EACpBC,OAAW,EACXC,GAAY,EACZC,oBAA+C,GAAG,IAAAC,mBAAQ,EAAC,EAAE,CAAC,EAC9D;IAAA,KAlBFF,GAAG;IAAA,KACHG,iBAAiB;IAAA,KACjBC,IAAI;IAAA,KACJC,GAAG;IAAA,KACHC,OAAO;IAAA,KAEPC,cAAc;IAAA,KACdC,iBAAiB;IAAA,KAEjBT,OAAO;IAAA,KAEPE,oBAAoB;IAQlB,IAAI,CAACD,GAAG,GAAGF,MAAM,CAACW,IAAI,IAAIT,GAAG;IAE7B,IAAI,CAACG,iBAAiB,GAAGL,MAAM,CAACK,iBAAiB;IACjD,IAAI,CAACC,IAAI,GAAGN,MAAM,CAACM,IAAI;IACvB,IAAI,CAACC,GAAG,GAAGP,MAAM,CAACO,GAAG;IACrB,IAAI,CAACC,OAAO,GAAGR,MAAM,CAACQ,OAAO,IAAI,CAAC,CAAC;IACnC,IAAI,CAACC,cAAc,GAAGT,MAAM,CAACS,cAAc;IAC3C,IAAI,CAACC,iBAAiB,GAAGV,MAAM,CAACU,iBAAiB;IAEjD,IAAI,CAACT,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACE,oBAAoB,GAAGA,oBAAoB;EAClD;AACF;AAACS,OAAA,CAAAC,OAAA,GAAAf,MAAA;AAAA"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/printer.js b/node_modules/@babel/core/lib/config/printer.js index 3fb9ced37878..3ac2c0753db3 100644 --- a/node_modules/@babel/core/lib/config/printer.js +++ b/node_modules/@babel/core/lib/config/printer.js @@ -11,11 +11,10 @@ function _gensync() { }; return data; } -const ChainFormatter = { +const ChainFormatter = exports.ChainFormatter = { Programmatic: 0, Config: 1 }; -exports.ChainFormatter = ChainFormatter; const Formatter = { title(type, callerName, filepath) { let title = ""; diff --git a/node_modules/@babel/core/lib/config/printer.js.map b/node_modules/@babel/core/lib/config/printer.js.map index ae26f6a512a1..7c64c29a2e14 100644 --- a/node_modules/@babel/core/lib/config/printer.js.map +++ b/node_modules/@babel/core/lib/config/printer.js.map @@ -1 +1 @@ -{"version":3,"names":["ChainFormatter","Programmatic","Config","Formatter","title","type","callerName","filepath","loc","index","envName","optionsAndDescriptors","opt","content","options","overrides","env","pluginDescriptors","plugins","length","map","d","descriptorToConfig","presetDescriptors","presets","JSON","stringify","undefined","name","file","request","value","toString","slice","ConfigPrinter","_stack","configure","enabled","push","format","config","output","configs","gensync","all","s","join"],"sources":["../../src/config/printer.ts"],"sourcesContent":["import gensync from \"gensync\";\n\nimport type { Handler } from \"gensync\";\n\nimport type {\n OptionsAndDescriptors,\n UnloadedDescriptor,\n} from \"./config-descriptors\";\n\n// todo: Use flow enums when @babel/transform-flow-types supports it\nexport const ChainFormatter = {\n Programmatic: 0,\n Config: 1,\n};\n\ntype PrintableConfig = {\n content: OptionsAndDescriptors;\n type: typeof ChainFormatter[keyof typeof ChainFormatter];\n callerName: string | undefined | null;\n filepath: string | undefined | null;\n index: number | undefined | null;\n envName: string | undefined | null;\n};\n\nconst Formatter = {\n title(\n type: typeof ChainFormatter[keyof typeof ChainFormatter],\n callerName?: string | null,\n filepath?: string | null,\n ): string {\n let title = \"\";\n if (type === ChainFormatter.Programmatic) {\n title = \"programmatic options\";\n if (callerName) {\n title += \" from \" + callerName;\n }\n } else {\n title = \"config \" + filepath;\n }\n return title;\n },\n loc(index?: number | null, envName?: string | null): string {\n let loc = \"\";\n if (index != null) {\n loc += `.overrides[${index}]`;\n }\n if (envName != null) {\n loc += `.env[\"${envName}\"]`;\n }\n return loc;\n },\n\n *optionsAndDescriptors(opt: OptionsAndDescriptors) {\n const content = { ...opt.options };\n // overrides and env will be printed as separated config items\n delete content.overrides;\n delete content.env;\n // resolve to descriptors\n const pluginDescriptors = [...(yield* opt.plugins())];\n if (pluginDescriptors.length) {\n content.plugins = pluginDescriptors.map(d => descriptorToConfig(d));\n }\n const presetDescriptors = [...(yield* opt.presets())];\n if (presetDescriptors.length) {\n content.presets = [...presetDescriptors].map(d => descriptorToConfig(d));\n }\n return JSON.stringify(content, undefined, 2);\n },\n};\n\nfunction descriptorToConfig(\n d: UnloadedDescriptor,\n): string | {} | Array {\n let name = d.file?.request;\n if (name == null) {\n if (typeof d.value === \"object\") {\n name = d.value;\n } else if (typeof d.value === \"function\") {\n // If the unloaded descriptor is a function, i.e. `plugins: [ require(\"my-plugin\") ]`,\n // we print the first 50 characters of the function source code and hopefully we can see\n // `name: 'my-plugin'` in the source\n name = `[Function: ${d.value.toString().slice(0, 50)} ... ]`;\n }\n }\n if (name == null) {\n name = \"[Unknown]\";\n }\n if (d.options === undefined) {\n return name;\n } else if (d.name == null) {\n return [name, d.options];\n } else {\n return [name, d.options, d.name];\n }\n}\n\nexport class ConfigPrinter {\n _stack: Array = [];\n configure(\n enabled: boolean,\n type: typeof ChainFormatter[keyof typeof ChainFormatter],\n {\n callerName,\n filepath,\n }: {\n callerName?: string;\n filepath?: string;\n },\n ) {\n if (!enabled) return () => {};\n return (\n content: OptionsAndDescriptors,\n index?: number | null,\n envName?: string | null,\n ) => {\n this._stack.push({\n type,\n callerName,\n filepath,\n content,\n index,\n envName,\n });\n };\n }\n static *format(config: PrintableConfig): Handler {\n let title = Formatter.title(\n config.type,\n config.callerName,\n config.filepath,\n );\n const loc = Formatter.loc(config.index, config.envName);\n if (loc) title += ` ${loc}`;\n const content = yield* Formatter.optionsAndDescriptors(config.content);\n return `${title}\\n${content}`;\n }\n\n *output(): Handler {\n if (this._stack.length === 0) return \"\";\n const configs = yield* gensync.all(\n this._stack.map(s => ConfigPrinter.format(s)),\n );\n return configs.join(\"\\n\\n\");\n }\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_gensync","data","require","ChainFormatter","exports","Programmatic","Config","Formatter","title","type","callerName","filepath","loc","index","envName","optionsAndDescriptors","opt","content","Object","assign","options","overrides","env","pluginDescriptors","plugins","length","map","d","descriptorToConfig","presetDescriptors","presets","JSON","stringify","undefined","_d$file","name","file","request","value","toString","slice","ConfigPrinter","constructor","_stack","configure","enabled","push","format","config","output","configs","gensync","all","s","join"],"sources":["../../src/config/printer.ts"],"sourcesContent":["import gensync from \"gensync\";\n\nimport type { Handler } from \"gensync\";\n\nimport type {\n OptionsAndDescriptors,\n UnloadedDescriptor,\n} from \"./config-descriptors.ts\";\n\n// todo: Use flow enums when @babel/transform-flow-types supports it\nexport const ChainFormatter = {\n Programmatic: 0,\n Config: 1,\n};\n\ntype PrintableConfig = {\n content: OptionsAndDescriptors;\n type: (typeof ChainFormatter)[keyof typeof ChainFormatter];\n callerName: string | undefined | null;\n filepath: string | undefined | null;\n index: number | undefined | null;\n envName: string | undefined | null;\n};\n\nconst Formatter = {\n title(\n type: (typeof ChainFormatter)[keyof typeof ChainFormatter],\n callerName?: string | null,\n filepath?: string | null,\n ): string {\n let title = \"\";\n if (type === ChainFormatter.Programmatic) {\n title = \"programmatic options\";\n if (callerName) {\n title += \" from \" + callerName;\n }\n } else {\n title = \"config \" + filepath;\n }\n return title;\n },\n loc(index?: number | null, envName?: string | null): string {\n let loc = \"\";\n if (index != null) {\n loc += `.overrides[${index}]`;\n }\n if (envName != null) {\n loc += `.env[\"${envName}\"]`;\n }\n return loc;\n },\n\n *optionsAndDescriptors(opt: OptionsAndDescriptors) {\n const content = { ...opt.options };\n // overrides and env will be printed as separated config items\n delete content.overrides;\n delete content.env;\n // resolve to descriptors\n const pluginDescriptors = [...(yield* opt.plugins())];\n if (pluginDescriptors.length) {\n content.plugins = pluginDescriptors.map(d => descriptorToConfig(d));\n }\n const presetDescriptors = [...(yield* opt.presets())];\n if (presetDescriptors.length) {\n content.presets = [...presetDescriptors].map(d => descriptorToConfig(d));\n }\n return JSON.stringify(content, undefined, 2);\n },\n};\n\nfunction descriptorToConfig(\n d: UnloadedDescriptor,\n): object | string | [string, unknown] | [string, unknown, string] {\n let name: object | string = d.file?.request;\n if (name == null) {\n if (typeof d.value === \"object\") {\n name = d.value;\n } else if (typeof d.value === \"function\") {\n // If the unloaded descriptor is a function, i.e. `plugins: [ require(\"my-plugin\") ]`,\n // we print the first 50 characters of the function source code and hopefully we can see\n // `name: 'my-plugin'` in the source\n name = `[Function: ${d.value.toString().slice(0, 50)} ... ]`;\n }\n }\n if (name == null) {\n name = \"[Unknown]\";\n }\n if (d.options === undefined) {\n return name;\n } else if (d.name == null) {\n return [name, d.options];\n } else {\n return [name, d.options, d.name];\n }\n}\n\nexport class ConfigPrinter {\n _stack: Array = [];\n configure(\n enabled: boolean,\n type: (typeof ChainFormatter)[keyof typeof ChainFormatter],\n {\n callerName,\n filepath,\n }: {\n callerName?: string;\n filepath?: string;\n },\n ) {\n if (!enabled) return () => {};\n return (\n content: OptionsAndDescriptors,\n index?: number | null,\n envName?: string | null,\n ) => {\n this._stack.push({\n type,\n callerName,\n filepath,\n content,\n index,\n envName,\n });\n };\n }\n static *format(config: PrintableConfig): Handler {\n let title = Formatter.title(\n config.type,\n config.callerName,\n config.filepath,\n );\n const loc = Formatter.loc(config.index, config.envName);\n if (loc) title += ` ${loc}`;\n const content = yield* Formatter.optionsAndDescriptors(config.content);\n return `${title}\\n${content}`;\n }\n\n *output(): Handler {\n if (this._stack.length === 0) return \"\";\n const configs = yield* gensync.all(\n this._stack.map(s => ConfigPrinter.format(s)),\n );\n return configs.join(\"\\n\\n\");\n }\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/resolve-targets-browser.js b/node_modules/@babel/core/lib/config/resolve-targets-browser.js index d2c2aa3cfc8a..3fdbd8826716 100644 --- a/node_modules/@babel/core/lib/config/resolve-targets-browser.js +++ b/node_modules/@babel/core/lib/config/resolve-targets-browser.js @@ -12,13 +12,10 @@ function _helperCompilationTargets() { }; return data; } -function resolveBrowserslistConfigFile( -browserslistConfigFile, -configFilePath) { +function resolveBrowserslistConfigFile(browserslistConfigFile, configFilePath) { return undefined; } -function resolveTargets(options, -root) { +function resolveTargets(options, root) { const optTargets = options.targets; let targets; if (typeof optTargets === "string" || Array.isArray(optTargets)) { diff --git a/node_modules/@babel/core/lib/config/resolve-targets-browser.js.map b/node_modules/@babel/core/lib/config/resolve-targets-browser.js.map index 986bfef805fb..c088fc5a4a46 100644 --- a/node_modules/@babel/core/lib/config/resolve-targets-browser.js.map +++ b/node_modules/@babel/core/lib/config/resolve-targets-browser.js.map @@ -1 +1 @@ -{"version":3,"names":["resolveBrowserslistConfigFile","browserslistConfigFile","configFilePath","undefined","resolveTargets","options","root","optTargets","targets","Array","isArray","browsers","esmodules","getTargets","ignoreBrowserslistConfig","browserslistEnv"],"sources":["../../src/config/resolve-targets-browser.ts"],"sourcesContent":["import type { ValidatedOptions } from \"./validation/options\";\nimport getTargets, {\n type InputTargets,\n} from \"@babel/helper-compilation-targets\";\n\nimport type { Targets } from \"@babel/helper-compilation-targets\";\n\nexport function resolveBrowserslistConfigFile(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n browserslistConfigFile: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n configFilePath: string,\n): string | void {\n return undefined;\n}\n\nexport function resolveTargets(\n options: ValidatedOptions,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n root: string,\n): Targets {\n const optTargets = options.targets;\n let targets: InputTargets;\n\n if (typeof optTargets === \"string\" || Array.isArray(optTargets)) {\n targets = { browsers: optTargets };\n } else if (optTargets) {\n if (\"esmodules\" in optTargets) {\n targets = { ...optTargets, esmodules: \"intersect\" };\n } else {\n // https://github.com/microsoft/TypeScript/issues/17002\n targets = optTargets as InputTargets;\n }\n }\n\n return getTargets(targets, {\n ignoreBrowserslistConfig: true,\n browserslistEnv: options.browserslistEnv,\n });\n}\n"],"mappings":";;;;;;;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAMO,SAASA,6BAA6B;AAE3CC,sBAA8B;AAE9BC,cAAsB,EACP;EACf,OAAOC,SAAS;AAClB;AAEO,SAASC,cAAc,CAC5BC,OAAyB;AAEzBC,IAAY,EACH;EACT,MAAMC,UAAU,GAAGF,OAAO,CAACG,OAAO;EAClC,IAAIA,OAAqB;EAEzB,IAAI,OAAOD,UAAU,KAAK,QAAQ,IAAIE,KAAK,CAACC,OAAO,CAACH,UAAU,CAAC,EAAE;IAC/DC,OAAO,GAAG;MAAEG,QAAQ,EAAEJ;IAAW,CAAC;EACpC,CAAC,MAAM,IAAIA,UAAU,EAAE;IACrB,IAAI,WAAW,IAAIA,UAAU,EAAE;MAC7BC,OAAO,qBAAQD,UAAU;QAAEK,SAAS,EAAE;MAAW,EAAE;IACrD,CAAC,MAAM;MAELJ,OAAO,GAAGD,UAA0B;IACtC;EACF;EAEA,OAAO,IAAAM,mCAAU,EAACL,OAAO,EAAE;IACzBM,wBAAwB,EAAE,IAAI;IAC9BC,eAAe,EAAEV,OAAO,CAACU;EAC3B,CAAC,CAAC;AACJ;AAAC"} \ No newline at end of file +{"version":3,"names":["_helperCompilationTargets","data","require","resolveBrowserslistConfigFile","browserslistConfigFile","configFilePath","undefined","resolveTargets","options","root","optTargets","targets","Array","isArray","browsers","Object","assign","esmodules","getTargets","ignoreBrowserslistConfig","browserslistEnv"],"sources":["../../src/config/resolve-targets-browser.ts"],"sourcesContent":["import type { ValidatedOptions } from \"./validation/options.ts\";\nimport getTargets, {\n type InputTargets,\n} from \"@babel/helper-compilation-targets\";\n\nimport type { Targets } from \"@babel/helper-compilation-targets\";\n\nexport function resolveBrowserslistConfigFile(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n browserslistConfigFile: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n configFilePath: string,\n): string | void {\n return undefined;\n}\n\nexport function resolveTargets(\n options: ValidatedOptions,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n root: string,\n): Targets {\n const optTargets = options.targets;\n let targets: InputTargets;\n\n if (typeof optTargets === \"string\" || Array.isArray(optTargets)) {\n targets = { browsers: optTargets };\n } else if (optTargets) {\n if (\"esmodules\" in optTargets) {\n targets = { ...optTargets, esmodules: \"intersect\" };\n } else {\n // https://github.com/microsoft/TypeScript/issues/17002\n targets = optTargets as InputTargets;\n }\n }\n\n return getTargets(targets, {\n ignoreBrowserslistConfig: true,\n browserslistEnv: options.browserslistEnv,\n });\n}\n"],"mappings":";;;;;;;AACA,SAAAA,0BAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,yBAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAMO,SAASE,6BAA6BA,CAE3CC,sBAA8B,EAE9BC,cAAsB,EACP;EACf,OAAOC,SAAS;AAClB;AAEO,SAASC,cAAcA,CAC5BC,OAAyB,EAEzBC,IAAY,EACH;EACT,MAAMC,UAAU,GAAGF,OAAO,CAACG,OAAO;EAClC,IAAIA,OAAqB;EAEzB,IAAI,OAAOD,UAAU,KAAK,QAAQ,IAAIE,KAAK,CAACC,OAAO,CAACH,UAAU,CAAC,EAAE;IAC/DC,OAAO,GAAG;MAAEG,QAAQ,EAAEJ;IAAW,CAAC;EACpC,CAAC,MAAM,IAAIA,UAAU,EAAE;IACrB,IAAI,WAAW,IAAIA,UAAU,EAAE;MAC7BC,OAAO,GAAAI,MAAA,CAAAC,MAAA,KAAQN,UAAU;QAAEO,SAAS,EAAE;MAAW,EAAE;IACrD,CAAC,MAAM;MAELN,OAAO,GAAGD,UAA0B;IACtC;EACF;EAEA,OAAO,IAAAQ,mCAAU,EAACP,OAAO,EAAE;IACzBQ,wBAAwB,EAAE,IAAI;IAC9BC,eAAe,EAAEZ,OAAO,CAACY;EAC3B,CAAC,CAAC;AACJ;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/resolve-targets.js.map b/node_modules/@babel/core/lib/config/resolve-targets.js.map index f3059fe5257b..50463757b47b 100644 --- a/node_modules/@babel/core/lib/config/resolve-targets.js.map +++ b/node_modules/@babel/core/lib/config/resolve-targets.js.map @@ -1 +1 @@ -{"version":3,"names":["resolveBrowserslistConfigFile","browserslistConfigFile","configFileDir","path","resolve","resolveTargets","options","root","optTargets","targets","Array","isArray","browsers","esmodules","configFile","ignoreBrowserslistConfig","getTargets","configPath","browserslistEnv"],"sources":["../../src/config/resolve-targets.ts"],"sourcesContent":["type browserType = typeof import(\"./resolve-targets-browser\");\ntype nodeType = typeof import(\"./resolve-targets\");\n\n// Kind of gross, but essentially asserting that the exports of this module are the same as the\n// exports of index-browser, since this file may be replaced at bundle time with index-browser.\n({} as any as browserType as nodeType);\n\nimport type { ValidatedOptions } from \"./validation/options\";\nimport path from \"path\";\nimport getTargets, {\n type InputTargets,\n} from \"@babel/helper-compilation-targets\";\n\nimport type { Targets } from \"@babel/helper-compilation-targets\";\n\nexport function resolveBrowserslistConfigFile(\n browserslistConfigFile: string,\n configFileDir: string,\n): string | undefined {\n return path.resolve(configFileDir, browserslistConfigFile);\n}\n\nexport function resolveTargets(\n options: ValidatedOptions,\n root: string,\n): Targets {\n const optTargets = options.targets;\n let targets: InputTargets;\n\n if (typeof optTargets === \"string\" || Array.isArray(optTargets)) {\n targets = { browsers: optTargets };\n } else if (optTargets) {\n if (\"esmodules\" in optTargets) {\n targets = { ...optTargets, esmodules: \"intersect\" };\n } else {\n // https://github.com/microsoft/TypeScript/issues/17002\n targets = optTargets as InputTargets;\n }\n }\n\n const { browserslistConfigFile } = options;\n let configFile;\n let ignoreBrowserslistConfig = false;\n if (typeof browserslistConfigFile === \"string\") {\n configFile = browserslistConfigFile;\n } else {\n ignoreBrowserslistConfig = browserslistConfigFile === false;\n }\n\n return getTargets(targets, {\n ignoreBrowserslistConfig,\n configFile,\n configPath: root,\n browserslistEnv: options.browserslistEnv,\n });\n}\n"],"mappings":";;;;;;;AAQA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAJA,CAAC,CAAC,CAAC;AAUI,SAASA,6BAA6B,CAC3CC,sBAA8B,EAC9BC,aAAqB,EACD;EACpB,OAAOC,OAAI,CAACC,OAAO,CAACF,aAAa,EAAED,sBAAsB,CAAC;AAC5D;AAEO,SAASI,cAAc,CAC5BC,OAAyB,EACzBC,IAAY,EACH;EACT,MAAMC,UAAU,GAAGF,OAAO,CAACG,OAAO;EAClC,IAAIA,OAAqB;EAEzB,IAAI,OAAOD,UAAU,KAAK,QAAQ,IAAIE,KAAK,CAACC,OAAO,CAACH,UAAU,CAAC,EAAE;IAC/DC,OAAO,GAAG;MAAEG,QAAQ,EAAEJ;IAAW,CAAC;EACpC,CAAC,MAAM,IAAIA,UAAU,EAAE;IACrB,IAAI,WAAW,IAAIA,UAAU,EAAE;MAC7BC,OAAO,qBAAQD,UAAU;QAAEK,SAAS,EAAE;MAAW,EAAE;IACrD,CAAC,MAAM;MAELJ,OAAO,GAAGD,UAA0B;IACtC;EACF;EAEA,MAAM;IAAEP;EAAuB,CAAC,GAAGK,OAAO;EAC1C,IAAIQ,UAAU;EACd,IAAIC,wBAAwB,GAAG,KAAK;EACpC,IAAI,OAAOd,sBAAsB,KAAK,QAAQ,EAAE;IAC9Ca,UAAU,GAAGb,sBAAsB;EACrC,CAAC,MAAM;IACLc,wBAAwB,GAAGd,sBAAsB,KAAK,KAAK;EAC7D;EAEA,OAAO,IAAAe,mCAAU,EAACP,OAAO,EAAE;IACzBM,wBAAwB;IACxBD,UAAU;IACVG,UAAU,EAAEV,IAAI;IAChBW,eAAe,EAAEZ,OAAO,CAACY;EAC3B,CAAC,CAAC;AACJ;AAAC"} \ No newline at end of file +{"version":3,"names":["_path","data","require","_helperCompilationTargets","resolveBrowserslistConfigFile","browserslistConfigFile","configFileDir","path","resolve","resolveTargets","options","root","optTargets","targets","Array","isArray","browsers","Object","assign","esmodules","configFile","ignoreBrowserslistConfig","getTargets","configPath","browserslistEnv"],"sources":["../../src/config/resolve-targets.ts"],"sourcesContent":["type browserType = typeof import(\"./resolve-targets-browser\");\ntype nodeType = typeof import(\"./resolve-targets\");\n\n// Kind of gross, but essentially asserting that the exports of this module are the same as the\n// exports of index-browser, since this file may be replaced at bundle time with index-browser.\n({}) as any as browserType as nodeType;\n\nimport type { ValidatedOptions } from \"./validation/options.ts\";\nimport path from \"path\";\nimport getTargets, {\n type InputTargets,\n} from \"@babel/helper-compilation-targets\";\n\nimport type { Targets } from \"@babel/helper-compilation-targets\";\n\nexport function resolveBrowserslistConfigFile(\n browserslistConfigFile: string,\n configFileDir: string,\n): string | undefined {\n return path.resolve(configFileDir, browserslistConfigFile);\n}\n\nexport function resolveTargets(\n options: ValidatedOptions,\n root: string,\n): Targets {\n const optTargets = options.targets;\n let targets: InputTargets;\n\n if (typeof optTargets === \"string\" || Array.isArray(optTargets)) {\n targets = { browsers: optTargets };\n } else if (optTargets) {\n if (\"esmodules\" in optTargets) {\n targets = { ...optTargets, esmodules: \"intersect\" };\n } else {\n // https://github.com/microsoft/TypeScript/issues/17002\n targets = optTargets as InputTargets;\n }\n }\n\n const { browserslistConfigFile } = options;\n let configFile;\n let ignoreBrowserslistConfig = false;\n if (typeof browserslistConfigFile === \"string\") {\n configFile = browserslistConfigFile;\n } else {\n ignoreBrowserslistConfig = browserslistConfigFile === false;\n }\n\n return getTargets(targets, {\n ignoreBrowserslistConfig,\n configFile,\n configPath: root,\n browserslistEnv: options.browserslistEnv,\n });\n}\n"],"mappings":";;;;;;;AAQA,SAAAA,MAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,KAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAE,0BAAA;EAAA,MAAAF,IAAA,GAAAC,OAAA;EAAAC,yBAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAJA,CAAC,CAAC,CAAC;AAUI,SAASG,6BAA6BA,CAC3CC,sBAA8B,EAC9BC,aAAqB,EACD;EACpB,OAAOC,MAAGA,CAAC,CAACC,OAAO,CAACF,aAAa,EAAED,sBAAsB,CAAC;AAC5D;AAEO,SAASI,cAAcA,CAC5BC,OAAyB,EACzBC,IAAY,EACH;EACT,MAAMC,UAAU,GAAGF,OAAO,CAACG,OAAO;EAClC,IAAIA,OAAqB;EAEzB,IAAI,OAAOD,UAAU,KAAK,QAAQ,IAAIE,KAAK,CAACC,OAAO,CAACH,UAAU,CAAC,EAAE;IAC/DC,OAAO,GAAG;MAAEG,QAAQ,EAAEJ;IAAW,CAAC;EACpC,CAAC,MAAM,IAAIA,UAAU,EAAE;IACrB,IAAI,WAAW,IAAIA,UAAU,EAAE;MAC7BC,OAAO,GAAAI,MAAA,CAAAC,MAAA,KAAQN,UAAU;QAAEO,SAAS,EAAE;MAAW,EAAE;IACrD,CAAC,MAAM;MAELN,OAAO,GAAGD,UAA0B;IACtC;EACF;EAEA,MAAM;IAAEP;EAAuB,CAAC,GAAGK,OAAO;EAC1C,IAAIU,UAAU;EACd,IAAIC,wBAAwB,GAAG,KAAK;EACpC,IAAI,OAAOhB,sBAAsB,KAAK,QAAQ,EAAE;IAC9Ce,UAAU,GAAGf,sBAAsB;EACrC,CAAC,MAAM;IACLgB,wBAAwB,GAAGhB,sBAAsB,KAAK,KAAK;EAC7D;EAEA,OAAO,IAAAiB,mCAAU,EAACT,OAAO,EAAE;IACzBQ,wBAAwB;IACxBD,UAAU;IACVG,UAAU,EAAEZ,IAAI;IAChBa,eAAe,EAAEd,OAAO,CAACc;EAC3B,CAAC,CAAC;AACJ;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/util.js.map b/node_modules/@babel/core/lib/config/util.js.map index 4157eca2c137..06aebe914cac 100644 --- a/node_modules/@babel/core/lib/config/util.js.map +++ b/node_modules/@babel/core/lib/config/util.js.map @@ -1 +1 @@ -{"version":3,"names":["mergeOptions","target","source","k","Object","keys","parserOpts","targetObj","mergeDefaultFields","val","undefined","isIterableIterator","value","next","Symbol","iterator"],"sources":["../../src/config/util.ts"],"sourcesContent":["import type { ValidatedOptions, NormalizedOptions } from \"./validation/options\";\n\nexport function mergeOptions(\n target: ValidatedOptions,\n source: ValidatedOptions | NormalizedOptions,\n): void {\n for (const k of Object.keys(source)) {\n if (\n (k === \"parserOpts\" || k === \"generatorOpts\" || k === \"assumptions\") &&\n source[k]\n ) {\n const parserOpts = source[k];\n const targetObj = target[k] || (target[k] = {});\n mergeDefaultFields(targetObj, parserOpts);\n } else {\n //@ts-expect-error k must index source\n const val = source[k];\n //@ts-expect-error assigning source to target\n if (val !== undefined) target[k] = val as any;\n }\n }\n}\n\nfunction mergeDefaultFields(target: T, source: T) {\n for (const k of Object.keys(source) as (keyof T)[]) {\n const val = source[k];\n if (val !== undefined) target[k] = val;\n }\n}\n\nexport function isIterableIterator(value: any): value is IterableIterator {\n return (\n !!value &&\n typeof value.next === \"function\" &&\n typeof value[Symbol.iterator] === \"function\"\n );\n}\n"],"mappings":";;;;;;;AAEO,SAASA,YAAY,CAC1BC,MAAwB,EACxBC,MAA4C,EACtC;EACN,KAAK,MAAMC,CAAC,IAAIC,MAAM,CAACC,IAAI,CAACH,MAAM,CAAC,EAAE;IACnC,IACE,CAACC,CAAC,KAAK,YAAY,IAAIA,CAAC,KAAK,eAAe,IAAIA,CAAC,KAAK,aAAa,KACnED,MAAM,CAACC,CAAC,CAAC,EACT;MACA,MAAMG,UAAU,GAAGJ,MAAM,CAACC,CAAC,CAAC;MAC5B,MAAMI,SAAS,GAAGN,MAAM,CAACE,CAAC,CAAC,KAAKF,MAAM,CAACE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;MAC/CK,kBAAkB,CAACD,SAAS,EAAED,UAAU,CAAC;IAC3C,CAAC,MAAM;MAEL,MAAMG,GAAG,GAAGP,MAAM,CAACC,CAAC,CAAC;MAErB,IAAIM,GAAG,KAAKC,SAAS,EAAET,MAAM,CAACE,CAAC,CAAC,GAAGM,GAAU;IAC/C;EACF;AACF;AAEA,SAASD,kBAAkB,CAAeP,MAAS,EAAEC,MAAS,EAAE;EAC9D,KAAK,MAAMC,CAAC,IAAIC,MAAM,CAACC,IAAI,CAACH,MAAM,CAAC,EAAiB;IAClD,MAAMO,GAAG,GAAGP,MAAM,CAACC,CAAC,CAAC;IACrB,IAAIM,GAAG,KAAKC,SAAS,EAAET,MAAM,CAACE,CAAC,CAAC,GAAGM,GAAG;EACxC;AACF;AAEO,SAASE,kBAAkB,CAACC,KAAU,EAAkC;EAC7E,OACE,CAAC,CAACA,KAAK,IACP,OAAOA,KAAK,CAACC,IAAI,KAAK,UAAU,IAChC,OAAOD,KAAK,CAACE,MAAM,CAACC,QAAQ,CAAC,KAAK,UAAU;AAEhD;AAAC"} \ No newline at end of file +{"version":3,"names":["mergeOptions","target","source","k","Object","keys","parserOpts","targetObj","mergeDefaultFields","val","undefined","isIterableIterator","value","next","Symbol","iterator"],"sources":["../../src/config/util.ts"],"sourcesContent":["import type {\n ValidatedOptions,\n NormalizedOptions,\n} from \"./validation/options.ts\";\n\nexport function mergeOptions(\n target: ValidatedOptions,\n source: ValidatedOptions | NormalizedOptions,\n): void {\n for (const k of Object.keys(source)) {\n if (\n (k === \"parserOpts\" || k === \"generatorOpts\" || k === \"assumptions\") &&\n source[k]\n ) {\n const parserOpts = source[k];\n const targetObj = target[k] || (target[k] = {});\n mergeDefaultFields(targetObj, parserOpts);\n } else {\n //@ts-expect-error k must index source\n const val = source[k];\n //@ts-expect-error assigning source to target\n if (val !== undefined) target[k] = val as any;\n }\n }\n}\n\nfunction mergeDefaultFields(target: T, source: T) {\n for (const k of Object.keys(source) as (keyof T)[]) {\n const val = source[k];\n if (val !== undefined) target[k] = val;\n }\n}\n\nexport function isIterableIterator(value: any): value is IterableIterator {\n return (\n !!value &&\n typeof value.next === \"function\" &&\n typeof value[Symbol.iterator] === \"function\"\n );\n}\n"],"mappings":";;;;;;;AAKO,SAASA,YAAYA,CAC1BC,MAAwB,EACxBC,MAA4C,EACtC;EACN,KAAK,MAAMC,CAAC,IAAIC,MAAM,CAACC,IAAI,CAACH,MAAM,CAAC,EAAE;IACnC,IACE,CAACC,CAAC,KAAK,YAAY,IAAIA,CAAC,KAAK,eAAe,IAAIA,CAAC,KAAK,aAAa,KACnED,MAAM,CAACC,CAAC,CAAC,EACT;MACA,MAAMG,UAAU,GAAGJ,MAAM,CAACC,CAAC,CAAC;MAC5B,MAAMI,SAAS,GAAGN,MAAM,CAACE,CAAC,CAAC,KAAKF,MAAM,CAACE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;MAC/CK,kBAAkB,CAACD,SAAS,EAAED,UAAU,CAAC;IAC3C,CAAC,MAAM;MAEL,MAAMG,GAAG,GAAGP,MAAM,CAACC,CAAC,CAAC;MAErB,IAAIM,GAAG,KAAKC,SAAS,EAAET,MAAM,CAACE,CAAC,CAAC,GAAGM,GAAU;IAC/C;EACF;AACF;AAEA,SAASD,kBAAkBA,CAAeP,MAAS,EAAEC,MAAS,EAAE;EAC9D,KAAK,MAAMC,CAAC,IAAIC,MAAM,CAACC,IAAI,CAACH,MAAM,CAAC,EAAiB;IAClD,MAAMO,GAAG,GAAGP,MAAM,CAACC,CAAC,CAAC;IACrB,IAAIM,GAAG,KAAKC,SAAS,EAAET,MAAM,CAACE,CAAC,CAAC,GAAGM,GAAG;EACxC;AACF;AAEO,SAASE,kBAAkBA,CAACC,KAAU,EAAkC;EAC7E,OACE,CAAC,CAACA,KAAK,IACP,OAAOA,KAAK,CAACC,IAAI,KAAK,UAAU,IAChC,OAAOD,KAAK,CAACE,MAAM,CAACC,QAAQ,CAAC,KAAK,UAAU;AAEhD;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/validation/option-assertions.js b/node_modules/@babel/core/lib/config/validation/option-assertions.js index 21bc8490d128..4cecb99ca4b0 100644 --- a/node_modules/@babel/core/lib/config/validation/option-assertions.js +++ b/node_modules/@babel/core/lib/config/validation/option-assertions.js @@ -30,7 +30,7 @@ function _helperCompilationTargets() { }; return data; } -var _options = require("./options"); +var _options = require("./options.js"); function msg(loc) { switch (loc.type) { case "root": @@ -132,9 +132,7 @@ function assertArray(loc, value) { } function assertIgnoreList(loc, value) { const arr = assertArray(loc, value); - if (arr) { - arr.forEach((item, i) => assertIgnoreItem(access(loc, i), item)); - } + arr == null || arr.forEach((item, i) => assertIgnoreItem(access(loc, i), item)); return arr; } function assertIgnoreItem(loc, value) { @@ -213,7 +211,6 @@ function assertPluginItem(loc, value) { } else { assertPluginTarget(loc, value); } - return value; } function assertPluginTarget(loc, value) { @@ -256,7 +253,6 @@ function assertAssumptions(loc, value) { if (typeof value !== "object" || value === null) { throw new Error(`${msg(loc)} must be an object or undefined.`); } - let root = loc; do { root = root.parent; @@ -274,7 +270,6 @@ function assertAssumptions(loc, value) { throw new Error(`${msg(subLoc)} cannot be set to 'false' inside presets.`); } } - return value; } 0 && 0; diff --git a/node_modules/@babel/core/lib/config/validation/option-assertions.js.map b/node_modules/@babel/core/lib/config/validation/option-assertions.js.map index e36c4948d7ca..284f2ea392ed 100644 --- a/node_modules/@babel/core/lib/config/validation/option-assertions.js.map +++ b/node_modules/@babel/core/lib/config/validation/option-assertions.js.map @@ -1 +1 @@ -{"version":3,"names":["msg","loc","type","parent","name","index","JSON","stringify","Error","access","assertRootMode","value","undefined","assertSourceMaps","assertCompact","assertSourceType","assertCallerMetadata","obj","assertObject","prop","Object","keys","propLoc","assertInputSourceMap","assertString","assertFunction","assertBoolean","Array","isArray","assertArray","assertIgnoreList","arr","forEach","item","i","assertIgnoreItem","RegExp","assertConfigApplicableTest","checkValidTest","assertConfigFileSearch","assertBabelrcSearch","assertPluginList","assertPluginItem","length","assertPluginTarget","opts","assertTargets","isBrowsersQueryValid","browsersLoc","esmodulesLoc","assertBrowsersList","browsers","esmodules","key","val","subLoc","hasOwnProperty","call","TargetNames","validTargets","join","assertBrowserVersion","Math","round","assertAssumptions","root","inPreset","source","assumptionsNames","has"],"sources":["../../../src/config/validation/option-assertions.ts"],"sourcesContent":["import {\n isBrowsersQueryValid,\n TargetNames,\n} from \"@babel/helper-compilation-targets\";\n\nimport type {\n ConfigFileSearch,\n BabelrcSearch,\n IgnoreList,\n IgnoreItem,\n PluginList,\n PluginItem,\n PluginTarget,\n ConfigApplicableTest,\n SourceMapsOption,\n SourceTypeOption,\n CompactOption,\n RootInputSourceMapOption,\n NestingPath,\n CallerMetadata,\n RootMode,\n TargetsListOrObject,\n AssumptionName,\n} from \"./options\";\n\nimport { assumptionsNames } from \"./options\";\n\nexport type { RootPath } from \"./options\";\n\nexport type ValidatorSet = {\n [name: string]: Validator;\n};\n\nexport type Validator = (loc: OptionPath, value: unknown) => T;\n\nexport function msg(loc: NestingPath | GeneralPath): string {\n switch (loc.type) {\n case \"root\":\n return ``;\n case \"env\":\n return `${msg(loc.parent)}.env[\"${loc.name}\"]`;\n case \"overrides\":\n return `${msg(loc.parent)}.overrides[${loc.index}]`;\n case \"option\":\n return `${msg(loc.parent)}.${loc.name}`;\n case \"access\":\n return `${msg(loc.parent)}[${JSON.stringify(loc.name)}]`;\n default:\n // @ts-expect-error should not happen when code is type checked\n throw new Error(`Assertion failure: Unknown type ${loc.type}`);\n }\n}\n\nexport function access(loc: GeneralPath, name: string | number): AccessPath {\n return {\n type: \"access\",\n name,\n parent: loc,\n };\n}\n\nexport type OptionPath = Readonly<{\n type: \"option\";\n name: string;\n parent: NestingPath;\n}>;\ntype AccessPath = Readonly<{\n type: \"access\";\n name: string | number;\n parent: GeneralPath;\n}>;\ntype GeneralPath = OptionPath | AccessPath;\n\nexport function assertRootMode(\n loc: OptionPath,\n value: unknown,\n): RootMode | void {\n if (\n value !== undefined &&\n value !== \"root\" &&\n value !== \"upward\" &&\n value !== \"upward-optional\"\n ) {\n throw new Error(\n `${msg(loc)} must be a \"root\", \"upward\", \"upward-optional\" or undefined`,\n );\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertSourceMaps(\n loc: OptionPath,\n value: unknown,\n): SourceMapsOption | void {\n if (\n value !== undefined &&\n typeof value !== \"boolean\" &&\n value !== \"inline\" &&\n value !== \"both\"\n ) {\n throw new Error(\n `${msg(loc)} must be a boolean, \"inline\", \"both\", or undefined`,\n );\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertCompact(\n loc: OptionPath,\n value: unknown,\n): CompactOption | void {\n if (value !== undefined && typeof value !== \"boolean\" && value !== \"auto\") {\n throw new Error(`${msg(loc)} must be a boolean, \"auto\", or undefined`);\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertSourceType(\n loc: OptionPath,\n value: unknown,\n): SourceTypeOption | void {\n if (\n value !== undefined &&\n value !== \"module\" &&\n value !== \"script\" &&\n value !== \"unambiguous\"\n ) {\n throw new Error(\n `${msg(loc)} must be \"module\", \"script\", \"unambiguous\", or undefined`,\n );\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertCallerMetadata(\n loc: OptionPath,\n value: unknown,\n): CallerMetadata | undefined {\n const obj = assertObject(loc, value);\n if (obj) {\n if (typeof obj.name !== \"string\") {\n throw new Error(\n `${msg(loc)} set but does not contain \"name\" property string`,\n );\n }\n\n for (const prop of Object.keys(obj)) {\n const propLoc = access(loc, prop);\n const value = obj[prop];\n if (\n value != null &&\n typeof value !== \"boolean\" &&\n typeof value !== \"string\" &&\n typeof value !== \"number\"\n ) {\n // NOTE(logan): I'm limiting the type here so that we can guarantee that\n // the \"caller\" value will serialize to JSON nicely. We can always\n // allow more complex structures later though.\n throw new Error(\n `${msg(\n propLoc,\n )} must be null, undefined, a boolean, a string, or a number.`,\n );\n }\n }\n }\n // @ts-expect-error todo(flow->ts)\n return value;\n}\n\nexport function assertInputSourceMap(\n loc: OptionPath,\n value: unknown,\n): RootInputSourceMapOption | void {\n if (\n value !== undefined &&\n typeof value !== \"boolean\" &&\n (typeof value !== \"object\" || !value)\n ) {\n throw new Error(`${msg(loc)} must be a boolean, object, or undefined`);\n }\n return value;\n}\n\nexport function assertString(loc: GeneralPath, value: unknown): string | void {\n if (value !== undefined && typeof value !== \"string\") {\n throw new Error(`${msg(loc)} must be a string, or undefined`);\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertFunction(\n loc: GeneralPath,\n value: unknown,\n): Function | void {\n if (value !== undefined && typeof value !== \"function\") {\n throw new Error(`${msg(loc)} must be a function, or undefined`);\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertBoolean(\n loc: GeneralPath,\n value: unknown,\n): boolean | void {\n if (value !== undefined && typeof value !== \"boolean\") {\n throw new Error(`${msg(loc)} must be a boolean, or undefined`);\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertObject(\n loc: GeneralPath,\n value: unknown,\n): { readonly [key: string]: unknown } | void {\n if (\n value !== undefined &&\n (typeof value !== \"object\" || Array.isArray(value) || !value)\n ) {\n throw new Error(`${msg(loc)} must be an object, or undefined`);\n }\n // @ts-expect-error todo(flow->ts) value is still typed as unknown, also assert function typically should not return a value\n return value;\n}\n\nexport function assertArray(\n loc: GeneralPath,\n value: Array | undefined | null,\n): ReadonlyArray | undefined | null {\n if (value != null && !Array.isArray(value)) {\n throw new Error(`${msg(loc)} must be an array, or undefined`);\n }\n return value;\n}\n\nexport function assertIgnoreList(\n loc: OptionPath,\n value: unknown[] | undefined,\n): IgnoreList | void {\n const arr = assertArray(loc, value);\n if (arr) {\n arr.forEach((item, i) => assertIgnoreItem(access(loc, i), item));\n }\n // @ts-expect-error todo(flow->ts)\n return arr;\n}\nfunction assertIgnoreItem(loc: GeneralPath, value: unknown): IgnoreItem {\n if (\n typeof value !== \"string\" &&\n typeof value !== \"function\" &&\n !(value instanceof RegExp)\n ) {\n throw new Error(\n `${msg(\n loc,\n )} must be an array of string/Function/RegExp values, or undefined`,\n );\n }\n return value as IgnoreItem;\n}\n\nexport function assertConfigApplicableTest(\n loc: OptionPath,\n value: unknown,\n): ConfigApplicableTest | void {\n if (value === undefined) {\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, i) => {\n if (!checkValidTest(item)) {\n throw new Error(\n `${msg(access(loc, i))} must be a string/Function/RegExp.`,\n );\n }\n });\n } else if (!checkValidTest(value)) {\n throw new Error(\n `${msg(loc)} must be a string/Function/RegExp, or an array of those`,\n );\n }\n return value as ConfigApplicableTest;\n}\n\nfunction checkValidTest(value: unknown): value is string | Function | RegExp {\n return (\n typeof value === \"string\" ||\n typeof value === \"function\" ||\n value instanceof RegExp\n );\n}\n\nexport function assertConfigFileSearch(\n loc: OptionPath,\n value: unknown,\n): ConfigFileSearch | void {\n if (\n value !== undefined &&\n typeof value !== \"boolean\" &&\n typeof value !== \"string\"\n ) {\n throw new Error(\n `${msg(loc)} must be a undefined, a boolean, a string, ` +\n `got ${JSON.stringify(value)}`,\n );\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertBabelrcSearch(\n loc: OptionPath,\n value: unknown,\n): BabelrcSearch | void {\n if (value === undefined || typeof value === \"boolean\") {\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, i) => {\n if (!checkValidTest(item)) {\n throw new Error(\n `${msg(access(loc, i))} must be a string/Function/RegExp.`,\n );\n }\n });\n } else if (!checkValidTest(value)) {\n throw new Error(\n `${msg(loc)} must be a undefined, a boolean, a string/Function/RegExp ` +\n `or an array of those, got ${JSON.stringify(value as any)}`,\n );\n }\n return value as BabelrcSearch;\n}\n\nexport function assertPluginList(\n loc: OptionPath,\n value: unknown[] | null | undefined,\n): PluginList | void {\n const arr = assertArray(loc, value);\n if (arr) {\n // Loop instead of using `.map` in order to preserve object identity\n // for plugin array for use during config chain processing.\n arr.forEach((item, i) => assertPluginItem(access(loc, i), item));\n }\n return arr as any;\n}\nfunction assertPluginItem(loc: GeneralPath, value: unknown): PluginItem {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n throw new Error(`${msg(loc)} must include an object`);\n }\n\n if (value.length > 3) {\n throw new Error(`${msg(loc)} may only be a two-tuple or three-tuple`);\n }\n\n assertPluginTarget(access(loc, 0), value[0]);\n\n if (value.length > 1) {\n const opts = value[1];\n if (\n opts !== undefined &&\n opts !== false &&\n (typeof opts !== \"object\" || Array.isArray(opts) || opts === null)\n ) {\n throw new Error(\n `${msg(access(loc, 1))} must be an object, false, or undefined`,\n );\n }\n }\n if (value.length === 3) {\n const name = value[2];\n if (name !== undefined && typeof name !== \"string\") {\n throw new Error(\n `${msg(access(loc, 2))} must be a string, or undefined`,\n );\n }\n }\n } else {\n assertPluginTarget(loc, value);\n }\n\n // @ts-expect-error todo(flow->ts)\n return value;\n}\nfunction assertPluginTarget(loc: GeneralPath, value: unknown): PluginTarget {\n if (\n (typeof value !== \"object\" || !value) &&\n typeof value !== \"string\" &&\n typeof value !== \"function\"\n ) {\n throw new Error(`${msg(loc)} must be a string, object, function`);\n }\n return value;\n}\n\nexport function assertTargets(\n loc: GeneralPath,\n value: any,\n): TargetsListOrObject {\n if (isBrowsersQueryValid(value)) return value;\n\n if (typeof value !== \"object\" || !value || Array.isArray(value)) {\n throw new Error(\n `${msg(loc)} must be a string, an array of strings or an object`,\n );\n }\n\n const browsersLoc = access(loc, \"browsers\");\n const esmodulesLoc = access(loc, \"esmodules\");\n\n assertBrowsersList(browsersLoc, value.browsers);\n assertBoolean(esmodulesLoc, value.esmodules);\n\n for (const key of Object.keys(value)) {\n const val = value[key];\n const subLoc = access(loc, key);\n\n if (key === \"esmodules\") assertBoolean(subLoc, val);\n else if (key === \"browsers\") assertBrowsersList(subLoc, val);\n else if (!Object.hasOwnProperty.call(TargetNames, key)) {\n const validTargets = Object.keys(TargetNames).join(\", \");\n throw new Error(\n `${msg(\n subLoc,\n )} is not a valid target. Supported targets are ${validTargets}`,\n );\n } else assertBrowserVersion(subLoc, val);\n }\n\n return value;\n}\n\nfunction assertBrowsersList(loc: GeneralPath, value: unknown) {\n if (value !== undefined && !isBrowsersQueryValid(value)) {\n throw new Error(\n `${msg(loc)} must be undefined, a string or an array of strings`,\n );\n }\n}\n\nfunction assertBrowserVersion(loc: GeneralPath, value: unknown) {\n if (typeof value === \"number\" && Math.round(value) === value) return;\n if (typeof value === \"string\") return;\n\n throw new Error(`${msg(loc)} must be a string or an integer number`);\n}\n\nexport function assertAssumptions(\n loc: GeneralPath,\n value: { [key: string]: unknown },\n): { [name: string]: boolean } | void {\n if (value === undefined) return;\n\n if (typeof value !== \"object\" || value === null) {\n throw new Error(`${msg(loc)} must be an object or undefined.`);\n }\n\n // todo(flow->ts): remove any\n let root: any = loc;\n do {\n root = root.parent;\n } while (root.type !== \"root\");\n const inPreset = root.source === \"preset\";\n\n for (const name of Object.keys(value)) {\n const subLoc = access(loc, name);\n if (!assumptionsNames.has(name as AssumptionName)) {\n throw new Error(`${msg(subLoc)} is not a supported assumption.`);\n }\n if (typeof value[name] !== \"boolean\") {\n throw new Error(`${msg(subLoc)} must be a boolean.`);\n }\n if (inPreset && value[name] === false) {\n throw new Error(\n `${msg(subLoc)} cannot be set to 'false' inside presets.`,\n );\n }\n }\n\n // @ts-expect-error todo(flow->ts)\n return value;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAyBA;AAUO,SAASA,GAAG,CAACC,GAA8B,EAAU;EAC1D,QAAQA,GAAG,CAACC,IAAI;IACd,KAAK,MAAM;MACT,OAAQ,EAAC;IACX,KAAK,KAAK;MACR,OAAQ,GAAEF,GAAG,CAACC,GAAG,CAACE,MAAM,CAAE,SAAQF,GAAG,CAACG,IAAK,IAAG;IAChD,KAAK,WAAW;MACd,OAAQ,GAAEJ,GAAG,CAACC,GAAG,CAACE,MAAM,CAAE,cAAaF,GAAG,CAACI,KAAM,GAAE;IACrD,KAAK,QAAQ;MACX,OAAQ,GAAEL,GAAG,CAACC,GAAG,CAACE,MAAM,CAAE,IAAGF,GAAG,CAACG,IAAK,EAAC;IACzC,KAAK,QAAQ;MACX,OAAQ,GAAEJ,GAAG,CAACC,GAAG,CAACE,MAAM,CAAE,IAAGG,IAAI,CAACC,SAAS,CAACN,GAAG,CAACG,IAAI,CAAE,GAAE;IAC1D;MAEE,MAAM,IAAII,KAAK,CAAE,mCAAkCP,GAAG,CAACC,IAAK,EAAC,CAAC;EAAC;AAErE;AAEO,SAASO,MAAM,CAACR,GAAgB,EAAEG,IAAqB,EAAc;EAC1E,OAAO;IACLF,IAAI,EAAE,QAAQ;IACdE,IAAI;IACJD,MAAM,EAAEF;EACV,CAAC;AACH;AAcO,SAASS,cAAc,CAC5BT,GAAe,EACfU,KAAc,EACG;EACjB,IACEA,KAAK,KAAKC,SAAS,IACnBD,KAAK,KAAK,MAAM,IAChBA,KAAK,KAAK,QAAQ,IAClBA,KAAK,KAAK,iBAAiB,EAC3B;IACA,MAAM,IAAIH,KAAK,CACZ,GAAER,GAAG,CAACC,GAAG,CAAE,6DAA4D,CACzE;EACH;EAEA,OAAOU,KAAK;AACd;AAEO,SAASE,gBAAgB,CAC9BZ,GAAe,EACfU,KAAc,EACW;EACzB,IACEA,KAAK,KAAKC,SAAS,IACnB,OAAOD,KAAK,KAAK,SAAS,IAC1BA,KAAK,KAAK,QAAQ,IAClBA,KAAK,KAAK,MAAM,EAChB;IACA,MAAM,IAAIH,KAAK,CACZ,GAAER,GAAG,CAACC,GAAG,CAAE,oDAAmD,CAChE;EACH;EAEA,OAAOU,KAAK;AACd;AAEO,SAASG,aAAa,CAC3Bb,GAAe,EACfU,KAAc,EACQ;EACtB,IAAIA,KAAK,KAAKC,SAAS,IAAI,OAAOD,KAAK,KAAK,SAAS,IAAIA,KAAK,KAAK,MAAM,EAAE;IACzE,MAAM,IAAIH,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,0CAAyC,CAAC;EACxE;EAEA,OAAOU,KAAK;AACd;AAEO,SAASI,gBAAgB,CAC9Bd,GAAe,EACfU,KAAc,EACW;EACzB,IACEA,KAAK,KAAKC,SAAS,IACnBD,KAAK,KAAK,QAAQ,IAClBA,KAAK,KAAK,QAAQ,IAClBA,KAAK,KAAK,aAAa,EACvB;IACA,MAAM,IAAIH,KAAK,CACZ,GAAER,GAAG,CAACC,GAAG,CAAE,0DAAyD,CACtE;EACH;EAEA,OAAOU,KAAK;AACd;AAEO,SAASK,oBAAoB,CAClCf,GAAe,EACfU,KAAc,EACc;EAC5B,MAAMM,GAAG,GAAGC,YAAY,CAACjB,GAAG,EAAEU,KAAK,CAAC;EACpC,IAAIM,GAAG,EAAE;IACP,IAAI,OAAOA,GAAG,CAACb,IAAI,KAAK,QAAQ,EAAE;MAChC,MAAM,IAAII,KAAK,CACZ,GAAER,GAAG,CAACC,GAAG,CAAE,kDAAiD,CAC9D;IACH;IAEA,KAAK,MAAMkB,IAAI,IAAIC,MAAM,CAACC,IAAI,CAACJ,GAAG,CAAC,EAAE;MACnC,MAAMK,OAAO,GAAGb,MAAM,CAACR,GAAG,EAAEkB,IAAI,CAAC;MACjC,MAAMR,KAAK,GAAGM,GAAG,CAACE,IAAI,CAAC;MACvB,IACER,KAAK,IAAI,IAAI,IACb,OAAOA,KAAK,KAAK,SAAS,IAC1B,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,QAAQ,EACzB;QAIA,MAAM,IAAIH,KAAK,CACZ,GAAER,GAAG,CACJsB,OAAO,CACP,6DAA4D,CAC/D;MACH;IACF;EACF;EAEA,OAAOX,KAAK;AACd;AAEO,SAASY,oBAAoB,CAClCtB,GAAe,EACfU,KAAc,EACmB;EACjC,IACEA,KAAK,KAAKC,SAAS,IACnB,OAAOD,KAAK,KAAK,SAAS,KACzB,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAACA,KAAK,CAAC,EACrC;IACA,MAAM,IAAIH,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,0CAAyC,CAAC;EACxE;EACA,OAAOU,KAAK;AACd;AAEO,SAASa,YAAY,CAACvB,GAAgB,EAAEU,KAAc,EAAiB;EAC5E,IAAIA,KAAK,KAAKC,SAAS,IAAI,OAAOD,KAAK,KAAK,QAAQ,EAAE;IACpD,MAAM,IAAIH,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,iCAAgC,CAAC;EAC/D;EAEA,OAAOU,KAAK;AACd;AAEO,SAASc,cAAc,CAC5BxB,GAAgB,EAChBU,KAAc,EACG;EACjB,IAAIA,KAAK,KAAKC,SAAS,IAAI,OAAOD,KAAK,KAAK,UAAU,EAAE;IACtD,MAAM,IAAIH,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,mCAAkC,CAAC;EACjE;EAEA,OAAOU,KAAK;AACd;AAEO,SAASe,aAAa,CAC3BzB,GAAgB,EAChBU,KAAc,EACE;EAChB,IAAIA,KAAK,KAAKC,SAAS,IAAI,OAAOD,KAAK,KAAK,SAAS,EAAE;IACrD,MAAM,IAAIH,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,kCAAiC,CAAC;EAChE;EAEA,OAAOU,KAAK;AACd;AAEO,SAASO,YAAY,CAC1BjB,GAAgB,EAChBU,KAAc,EAC8B;EAC5C,IACEA,KAAK,KAAKC,SAAS,KAClB,OAAOD,KAAK,KAAK,QAAQ,IAAIgB,KAAK,CAACC,OAAO,CAACjB,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC,EAC7D;IACA,MAAM,IAAIH,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,kCAAiC,CAAC;EAChE;EAEA,OAAOU,KAAK;AACd;AAEO,SAASkB,WAAW,CACzB5B,GAAgB,EAChBU,KAAkC,EACG;EACrC,IAAIA,KAAK,IAAI,IAAI,IAAI,CAACgB,KAAK,CAACC,OAAO,CAACjB,KAAK,CAAC,EAAE;IAC1C,MAAM,IAAIH,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,iCAAgC,CAAC;EAC/D;EACA,OAAOU,KAAK;AACd;AAEO,SAASmB,gBAAgB,CAC9B7B,GAAe,EACfU,KAA4B,EACT;EACnB,MAAMoB,GAAG,GAAGF,WAAW,CAAC5B,GAAG,EAAEU,KAAK,CAAC;EACnC,IAAIoB,GAAG,EAAE;IACPA,GAAG,CAACC,OAAO,CAAC,CAACC,IAAI,EAAEC,CAAC,KAAKC,gBAAgB,CAAC1B,MAAM,CAACR,GAAG,EAAEiC,CAAC,CAAC,EAAED,IAAI,CAAC,CAAC;EAClE;EAEA,OAAOF,GAAG;AACZ;AACA,SAASI,gBAAgB,CAAClC,GAAgB,EAAEU,KAAc,EAAc;EACtE,IACE,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,UAAU,IAC3B,EAAEA,KAAK,YAAYyB,MAAM,CAAC,EAC1B;IACA,MAAM,IAAI5B,KAAK,CACZ,GAAER,GAAG,CACJC,GAAG,CACH,kEAAiE,CACpE;EACH;EACA,OAAOU,KAAK;AACd;AAEO,SAAS0B,0BAA0B,CACxCpC,GAAe,EACfU,KAAc,EACe;EAC7B,IAAIA,KAAK,KAAKC,SAAS,EAAE;IAEvB,OAAOD,KAAK;EACd;EAEA,IAAIgB,KAAK,CAACC,OAAO,CAACjB,KAAK,CAAC,EAAE;IACxBA,KAAK,CAACqB,OAAO,CAAC,CAACC,IAAI,EAAEC,CAAC,KAAK;MACzB,IAAI,CAACI,cAAc,CAACL,IAAI,CAAC,EAAE;QACzB,MAAM,IAAIzB,KAAK,CACZ,GAAER,GAAG,CAACS,MAAM,CAACR,GAAG,EAAEiC,CAAC,CAAC,CAAE,oCAAmC,CAC3D;MACH;IACF,CAAC,CAAC;EACJ,CAAC,MAAM,IAAI,CAACI,cAAc,CAAC3B,KAAK,CAAC,EAAE;IACjC,MAAM,IAAIH,KAAK,CACZ,GAAER,GAAG,CAACC,GAAG,CAAE,yDAAwD,CACrE;EACH;EACA,OAAOU,KAAK;AACd;AAEA,SAAS2B,cAAc,CAAC3B,KAAc,EAAuC;EAC3E,OACE,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,UAAU,IAC3BA,KAAK,YAAYyB,MAAM;AAE3B;AAEO,SAASG,sBAAsB,CACpCtC,GAAe,EACfU,KAAc,EACW;EACzB,IACEA,KAAK,KAAKC,SAAS,IACnB,OAAOD,KAAK,KAAK,SAAS,IAC1B,OAAOA,KAAK,KAAK,QAAQ,EACzB;IACA,MAAM,IAAIH,KAAK,CACZ,GAAER,GAAG,CAACC,GAAG,CAAE,6CAA4C,GACrD,OAAMK,IAAI,CAACC,SAAS,CAACI,KAAK,CAAE,EAAC,CACjC;EACH;EAEA,OAAOA,KAAK;AACd;AAEO,SAAS6B,mBAAmB,CACjCvC,GAAe,EACfU,KAAc,EACQ;EACtB,IAAIA,KAAK,KAAKC,SAAS,IAAI,OAAOD,KAAK,KAAK,SAAS,EAAE;IAErD,OAAOA,KAAK;EACd;EAEA,IAAIgB,KAAK,CAACC,OAAO,CAACjB,KAAK,CAAC,EAAE;IACxBA,KAAK,CAACqB,OAAO,CAAC,CAACC,IAAI,EAAEC,CAAC,KAAK;MACzB,IAAI,CAACI,cAAc,CAACL,IAAI,CAAC,EAAE;QACzB,MAAM,IAAIzB,KAAK,CACZ,GAAER,GAAG,CAACS,MAAM,CAACR,GAAG,EAAEiC,CAAC,CAAC,CAAE,oCAAmC,CAC3D;MACH;IACF,CAAC,CAAC;EACJ,CAAC,MAAM,IAAI,CAACI,cAAc,CAAC3B,KAAK,CAAC,EAAE;IACjC,MAAM,IAAIH,KAAK,CACZ,GAAER,GAAG,CAACC,GAAG,CAAE,4DAA2D,GACpE,6BAA4BK,IAAI,CAACC,SAAS,CAACI,KAAK,CAAS,EAAC,CAC9D;EACH;EACA,OAAOA,KAAK;AACd;AAEO,SAAS8B,gBAAgB,CAC9BxC,GAAe,EACfU,KAAmC,EAChB;EACnB,MAAMoB,GAAG,GAAGF,WAAW,CAAC5B,GAAG,EAAEU,KAAK,CAAC;EACnC,IAAIoB,GAAG,EAAE;IAGPA,GAAG,CAACC,OAAO,CAAC,CAACC,IAAI,EAAEC,CAAC,KAAKQ,gBAAgB,CAACjC,MAAM,CAACR,GAAG,EAAEiC,CAAC,CAAC,EAAED,IAAI,CAAC,CAAC;EAClE;EACA,OAAOF,GAAG;AACZ;AACA,SAASW,gBAAgB,CAACzC,GAAgB,EAAEU,KAAc,EAAc;EACtE,IAAIgB,KAAK,CAACC,OAAO,CAACjB,KAAK,CAAC,EAAE;IACxB,IAAIA,KAAK,CAACgC,MAAM,KAAK,CAAC,EAAE;MACtB,MAAM,IAAInC,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,yBAAwB,CAAC;IACvD;IAEA,IAAIU,KAAK,CAACgC,MAAM,GAAG,CAAC,EAAE;MACpB,MAAM,IAAInC,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,yCAAwC,CAAC;IACvE;IAEA2C,kBAAkB,CAACnC,MAAM,CAACR,GAAG,EAAE,CAAC,CAAC,EAAEU,KAAK,CAAC,CAAC,CAAC,CAAC;IAE5C,IAAIA,KAAK,CAACgC,MAAM,GAAG,CAAC,EAAE;MACpB,MAAME,IAAI,GAAGlC,KAAK,CAAC,CAAC,CAAC;MACrB,IACEkC,IAAI,KAAKjC,SAAS,IAClBiC,IAAI,KAAK,KAAK,KACb,OAAOA,IAAI,KAAK,QAAQ,IAAIlB,KAAK,CAACC,OAAO,CAACiB,IAAI,CAAC,IAAIA,IAAI,KAAK,IAAI,CAAC,EAClE;QACA,MAAM,IAAIrC,KAAK,CACZ,GAAER,GAAG,CAACS,MAAM,CAACR,GAAG,EAAE,CAAC,CAAC,CAAE,yCAAwC,CAChE;MACH;IACF;IACA,IAAIU,KAAK,CAACgC,MAAM,KAAK,CAAC,EAAE;MACtB,MAAMvC,IAAI,GAAGO,KAAK,CAAC,CAAC,CAAC;MACrB,IAAIP,IAAI,KAAKQ,SAAS,IAAI,OAAOR,IAAI,KAAK,QAAQ,EAAE;QAClD,MAAM,IAAII,KAAK,CACZ,GAAER,GAAG,CAACS,MAAM,CAACR,GAAG,EAAE,CAAC,CAAC,CAAE,iCAAgC,CACxD;MACH;IACF;EACF,CAAC,MAAM;IACL2C,kBAAkB,CAAC3C,GAAG,EAAEU,KAAK,CAAC;EAChC;;EAGA,OAAOA,KAAK;AACd;AACA,SAASiC,kBAAkB,CAAC3C,GAAgB,EAAEU,KAAc,EAAgB;EAC1E,IACE,CAAC,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAACA,KAAK,KACpC,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,UAAU,EAC3B;IACA,MAAM,IAAIH,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,qCAAoC,CAAC;EACnE;EACA,OAAOU,KAAK;AACd;AAEO,SAASmC,aAAa,CAC3B7C,GAAgB,EAChBU,KAAU,EACW;EACrB,IAAI,IAAAoC,gDAAoB,EAACpC,KAAK,CAAC,EAAE,OAAOA,KAAK;EAE7C,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAACA,KAAK,IAAIgB,KAAK,CAACC,OAAO,CAACjB,KAAK,CAAC,EAAE;IAC/D,MAAM,IAAIH,KAAK,CACZ,GAAER,GAAG,CAACC,GAAG,CAAE,qDAAoD,CACjE;EACH;EAEA,MAAM+C,WAAW,GAAGvC,MAAM,CAACR,GAAG,EAAE,UAAU,CAAC;EAC3C,MAAMgD,YAAY,GAAGxC,MAAM,CAACR,GAAG,EAAE,WAAW,CAAC;EAE7CiD,kBAAkB,CAACF,WAAW,EAAErC,KAAK,CAACwC,QAAQ,CAAC;EAC/CzB,aAAa,CAACuB,YAAY,EAAEtC,KAAK,CAACyC,SAAS,CAAC;EAE5C,KAAK,MAAMC,GAAG,IAAIjC,MAAM,CAACC,IAAI,CAACV,KAAK,CAAC,EAAE;IACpC,MAAM2C,GAAG,GAAG3C,KAAK,CAAC0C,GAAG,CAAC;IACtB,MAAME,MAAM,GAAG9C,MAAM,CAACR,GAAG,EAAEoD,GAAG,CAAC;IAE/B,IAAIA,GAAG,KAAK,WAAW,EAAE3B,aAAa,CAAC6B,MAAM,EAAED,GAAG,CAAC,CAAC,KAC/C,IAAID,GAAG,KAAK,UAAU,EAAEH,kBAAkB,CAACK,MAAM,EAAED,GAAG,CAAC,CAAC,KACxD,IAAI,CAAClC,MAAM,CAACoC,cAAc,CAACC,IAAI,CAACC,uCAAW,EAAEL,GAAG,CAAC,EAAE;MACtD,MAAMM,YAAY,GAAGvC,MAAM,CAACC,IAAI,CAACqC,uCAAW,CAAC,CAACE,IAAI,CAAC,IAAI,CAAC;MACxD,MAAM,IAAIpD,KAAK,CACZ,GAAER,GAAG,CACJuD,MAAM,CACN,iDAAgDI,YAAa,EAAC,CACjE;IACH,CAAC,MAAME,oBAAoB,CAACN,MAAM,EAAED,GAAG,CAAC;EAC1C;EAEA,OAAO3C,KAAK;AACd;AAEA,SAASuC,kBAAkB,CAACjD,GAAgB,EAAEU,KAAc,EAAE;EAC5D,IAAIA,KAAK,KAAKC,SAAS,IAAI,CAAC,IAAAmC,gDAAoB,EAACpC,KAAK,CAAC,EAAE;IACvD,MAAM,IAAIH,KAAK,CACZ,GAAER,GAAG,CAACC,GAAG,CAAE,qDAAoD,CACjE;EACH;AACF;AAEA,SAAS4D,oBAAoB,CAAC5D,GAAgB,EAAEU,KAAc,EAAE;EAC9D,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAImD,IAAI,CAACC,KAAK,CAACpD,KAAK,CAAC,KAAKA,KAAK,EAAE;EAC9D,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;EAE/B,MAAM,IAAIH,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,wCAAuC,CAAC;AACtE;AAEO,SAAS+D,iBAAiB,CAC/B/D,GAAgB,EAChBU,KAAiC,EACG;EACpC,IAAIA,KAAK,KAAKC,SAAS,EAAE;EAEzB,IAAI,OAAOD,KAAK,KAAK,QAAQ,IAAIA,KAAK,KAAK,IAAI,EAAE;IAC/C,MAAM,IAAIH,KAAK,CAAE,GAAER,GAAG,CAACC,GAAG,CAAE,kCAAiC,CAAC;EAChE;;EAGA,IAAIgE,IAAS,GAAGhE,GAAG;EACnB,GAAG;IACDgE,IAAI,GAAGA,IAAI,CAAC9D,MAAM;EACpB,CAAC,QAAQ8D,IAAI,CAAC/D,IAAI,KAAK,MAAM;EAC7B,MAAMgE,QAAQ,GAAGD,IAAI,CAACE,MAAM,KAAK,QAAQ;EAEzC,KAAK,MAAM/D,IAAI,IAAIgB,MAAM,CAACC,IAAI,CAACV,KAAK,CAAC,EAAE;IACrC,MAAM4C,MAAM,GAAG9C,MAAM,CAACR,GAAG,EAAEG,IAAI,CAAC;IAChC,IAAI,CAACgE,yBAAgB,CAACC,GAAG,CAACjE,IAAI,CAAmB,EAAE;MACjD,MAAM,IAAII,KAAK,CAAE,GAAER,GAAG,CAACuD,MAAM,CAAE,iCAAgC,CAAC;IAClE;IACA,IAAI,OAAO5C,KAAK,CAACP,IAAI,CAAC,KAAK,SAAS,EAAE;MACpC,MAAM,IAAII,KAAK,CAAE,GAAER,GAAG,CAACuD,MAAM,CAAE,qBAAoB,CAAC;IACtD;IACA,IAAIW,QAAQ,IAAIvD,KAAK,CAACP,IAAI,CAAC,KAAK,KAAK,EAAE;MACrC,MAAM,IAAII,KAAK,CACZ,GAAER,GAAG,CAACuD,MAAM,CAAE,2CAA0C,CAC1D;IACH;EACF;;EAGA,OAAO5C,KAAK;AACd;AAAC"} \ No newline at end of file +{"version":3,"names":["_helperCompilationTargets","data","require","_options","msg","loc","type","parent","name","index","JSON","stringify","Error","access","assertRootMode","value","undefined","assertSourceMaps","assertCompact","assertSourceType","assertCallerMetadata","obj","assertObject","prop","Object","keys","propLoc","assertInputSourceMap","assertString","assertFunction","assertBoolean","Array","isArray","assertArray","assertIgnoreList","arr","forEach","item","i","assertIgnoreItem","RegExp","assertConfigApplicableTest","checkValidTest","assertConfigFileSearch","assertBabelrcSearch","assertPluginList","assertPluginItem","length","assertPluginTarget","opts","assertTargets","isBrowsersQueryValid","browsersLoc","esmodulesLoc","assertBrowsersList","browsers","esmodules","key","val","subLoc","hasOwnProperty","call","TargetNames","validTargets","join","assertBrowserVersion","Math","round","assertAssumptions","root","inPreset","source","assumptionsNames","has"],"sources":["../../../src/config/validation/option-assertions.ts"],"sourcesContent":["import {\n isBrowsersQueryValid,\n TargetNames,\n} from \"@babel/helper-compilation-targets\";\n\nimport type {\n ConfigFileSearch,\n BabelrcSearch,\n IgnoreList,\n IgnoreItem,\n PluginList,\n PluginItem,\n PluginTarget,\n ConfigApplicableTest,\n SourceMapsOption,\n SourceTypeOption,\n CompactOption,\n RootInputSourceMapOption,\n NestingPath,\n CallerMetadata,\n RootMode,\n TargetsListOrObject,\n AssumptionName,\n} from \"./options.ts\";\n\nimport { assumptionsNames } from \"./options.ts\";\n\nexport type { RootPath } from \"./options.ts\";\n\nexport type ValidatorSet = {\n [name: string]: Validator;\n};\n\nexport type Validator = (loc: OptionPath, value: unknown) => T;\n\nexport function msg(loc: NestingPath | GeneralPath): string {\n switch (loc.type) {\n case \"root\":\n return ``;\n case \"env\":\n return `${msg(loc.parent)}.env[\"${loc.name}\"]`;\n case \"overrides\":\n return `${msg(loc.parent)}.overrides[${loc.index}]`;\n case \"option\":\n return `${msg(loc.parent)}.${loc.name}`;\n case \"access\":\n return `${msg(loc.parent)}[${JSON.stringify(loc.name)}]`;\n default:\n // @ts-expect-error should not happen when code is type checked\n throw new Error(`Assertion failure: Unknown type ${loc.type}`);\n }\n}\n\nexport function access(loc: GeneralPath, name: string | number): AccessPath {\n return {\n type: \"access\",\n name,\n parent: loc,\n };\n}\n\nexport type OptionPath = Readonly<{\n type: \"option\";\n name: string;\n parent: NestingPath;\n}>;\ntype AccessPath = Readonly<{\n type: \"access\";\n name: string | number;\n parent: GeneralPath;\n}>;\ntype GeneralPath = OptionPath | AccessPath;\n\nexport function assertRootMode(\n loc: OptionPath,\n value: unknown,\n): RootMode | void {\n if (\n value !== undefined &&\n value !== \"root\" &&\n value !== \"upward\" &&\n value !== \"upward-optional\"\n ) {\n throw new Error(\n `${msg(loc)} must be a \"root\", \"upward\", \"upward-optional\" or undefined`,\n );\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertSourceMaps(\n loc: OptionPath,\n value: unknown,\n): SourceMapsOption | void {\n if (\n value !== undefined &&\n typeof value !== \"boolean\" &&\n value !== \"inline\" &&\n value !== \"both\"\n ) {\n throw new Error(\n `${msg(loc)} must be a boolean, \"inline\", \"both\", or undefined`,\n );\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertCompact(\n loc: OptionPath,\n value: unknown,\n): CompactOption | void {\n if (value !== undefined && typeof value !== \"boolean\" && value !== \"auto\") {\n throw new Error(`${msg(loc)} must be a boolean, \"auto\", or undefined`);\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertSourceType(\n loc: OptionPath,\n value: unknown,\n): SourceTypeOption | void {\n if (\n value !== undefined &&\n value !== \"module\" &&\n value !== \"script\" &&\n value !== \"unambiguous\"\n ) {\n throw new Error(\n `${msg(loc)} must be \"module\", \"script\", \"unambiguous\", or undefined`,\n );\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertCallerMetadata(\n loc: OptionPath,\n value: unknown,\n): CallerMetadata | undefined {\n const obj = assertObject(loc, value);\n if (obj) {\n if (typeof obj.name !== \"string\") {\n throw new Error(\n `${msg(loc)} set but does not contain \"name\" property string`,\n );\n }\n\n for (const prop of Object.keys(obj)) {\n const propLoc = access(loc, prop);\n const value = obj[prop];\n if (\n value != null &&\n typeof value !== \"boolean\" &&\n typeof value !== \"string\" &&\n typeof value !== \"number\"\n ) {\n // NOTE(logan): I'm limiting the type here so that we can guarantee that\n // the \"caller\" value will serialize to JSON nicely. We can always\n // allow more complex structures later though.\n throw new Error(\n `${msg(\n propLoc,\n )} must be null, undefined, a boolean, a string, or a number.`,\n );\n }\n }\n }\n // @ts-expect-error todo(flow->ts)\n return value;\n}\n\nexport function assertInputSourceMap(\n loc: OptionPath,\n value: unknown,\n): RootInputSourceMapOption | void {\n if (\n value !== undefined &&\n typeof value !== \"boolean\" &&\n (typeof value !== \"object\" || !value)\n ) {\n throw new Error(`${msg(loc)} must be a boolean, object, or undefined`);\n }\n return value;\n}\n\nexport function assertString(loc: GeneralPath, value: unknown): string | void {\n if (value !== undefined && typeof value !== \"string\") {\n throw new Error(`${msg(loc)} must be a string, or undefined`);\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertFunction(\n loc: GeneralPath,\n value: unknown,\n): Function | void {\n if (value !== undefined && typeof value !== \"function\") {\n throw new Error(`${msg(loc)} must be a function, or undefined`);\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertBoolean(\n loc: GeneralPath,\n value: unknown,\n): boolean | void {\n if (value !== undefined && typeof value !== \"boolean\") {\n throw new Error(`${msg(loc)} must be a boolean, or undefined`);\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertObject(\n loc: GeneralPath,\n value: unknown,\n): { readonly [key: string]: unknown } | void {\n if (\n value !== undefined &&\n (typeof value !== \"object\" || Array.isArray(value) || !value)\n ) {\n throw new Error(`${msg(loc)} must be an object, or undefined`);\n }\n // @ts-expect-error todo(flow->ts) value is still typed as unknown, also assert function typically should not return a value\n return value;\n}\n\nexport function assertArray(\n loc: GeneralPath,\n value: Array | undefined | null,\n): ReadonlyArray | undefined | null {\n if (value != null && !Array.isArray(value)) {\n throw new Error(`${msg(loc)} must be an array, or undefined`);\n }\n return value;\n}\n\nexport function assertIgnoreList(\n loc: OptionPath,\n value: unknown[] | undefined,\n): IgnoreList | void {\n const arr = assertArray(loc, value);\n arr?.forEach((item, i) => assertIgnoreItem(access(loc, i), item));\n // @ts-expect-error todo(flow->ts)\n return arr;\n}\nfunction assertIgnoreItem(loc: GeneralPath, value: unknown): IgnoreItem {\n if (\n typeof value !== \"string\" &&\n typeof value !== \"function\" &&\n !(value instanceof RegExp)\n ) {\n throw new Error(\n `${msg(\n loc,\n )} must be an array of string/Function/RegExp values, or undefined`,\n );\n }\n return value as IgnoreItem;\n}\n\nexport function assertConfigApplicableTest(\n loc: OptionPath,\n value: unknown,\n): ConfigApplicableTest | void {\n if (value === undefined) {\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, i) => {\n if (!checkValidTest(item)) {\n throw new Error(\n `${msg(access(loc, i))} must be a string/Function/RegExp.`,\n );\n }\n });\n } else if (!checkValidTest(value)) {\n throw new Error(\n `${msg(loc)} must be a string/Function/RegExp, or an array of those`,\n );\n }\n return value as ConfigApplicableTest;\n}\n\nfunction checkValidTest(value: unknown): value is string | Function | RegExp {\n return (\n typeof value === \"string\" ||\n typeof value === \"function\" ||\n value instanceof RegExp\n );\n}\n\nexport function assertConfigFileSearch(\n loc: OptionPath,\n value: unknown,\n): ConfigFileSearch | void {\n if (\n value !== undefined &&\n typeof value !== \"boolean\" &&\n typeof value !== \"string\"\n ) {\n throw new Error(\n `${msg(loc)} must be a undefined, a boolean, a string, ` +\n `got ${JSON.stringify(value)}`,\n );\n }\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n}\n\nexport function assertBabelrcSearch(\n loc: OptionPath,\n value: unknown,\n): BabelrcSearch | void {\n if (value === undefined || typeof value === \"boolean\") {\n // @ts-expect-error: TS can only narrow down the type when \"strictNullCheck\" is true\n return value;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, i) => {\n if (!checkValidTest(item)) {\n throw new Error(\n `${msg(access(loc, i))} must be a string/Function/RegExp.`,\n );\n }\n });\n } else if (!checkValidTest(value)) {\n throw new Error(\n `${msg(loc)} must be a undefined, a boolean, a string/Function/RegExp ` +\n `or an array of those, got ${JSON.stringify(value as any)}`,\n );\n }\n return value as BabelrcSearch;\n}\n\nexport function assertPluginList(\n loc: OptionPath,\n value: unknown[] | null | undefined,\n): PluginList | void {\n const arr = assertArray(loc, value);\n if (arr) {\n // Loop instead of using `.map` in order to preserve object identity\n // for plugin array for use during config chain processing.\n arr.forEach((item, i) => assertPluginItem(access(loc, i), item));\n }\n return arr as any;\n}\nfunction assertPluginItem(loc: GeneralPath, value: unknown): PluginItem {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n throw new Error(`${msg(loc)} must include an object`);\n }\n\n if (value.length > 3) {\n throw new Error(`${msg(loc)} may only be a two-tuple or three-tuple`);\n }\n\n assertPluginTarget(access(loc, 0), value[0]);\n\n if (value.length > 1) {\n const opts = value[1];\n if (\n opts !== undefined &&\n opts !== false &&\n (typeof opts !== \"object\" || Array.isArray(opts) || opts === null)\n ) {\n throw new Error(\n `${msg(access(loc, 1))} must be an object, false, or undefined`,\n );\n }\n }\n if (value.length === 3) {\n const name = value[2];\n if (name !== undefined && typeof name !== \"string\") {\n throw new Error(\n `${msg(access(loc, 2))} must be a string, or undefined`,\n );\n }\n }\n } else {\n assertPluginTarget(loc, value);\n }\n\n // @ts-expect-error todo(flow->ts)\n return value;\n}\nfunction assertPluginTarget(loc: GeneralPath, value: unknown): PluginTarget {\n if (\n (typeof value !== \"object\" || !value) &&\n typeof value !== \"string\" &&\n typeof value !== \"function\"\n ) {\n throw new Error(`${msg(loc)} must be a string, object, function`);\n }\n return value;\n}\n\nexport function assertTargets(\n loc: GeneralPath,\n value: any,\n): TargetsListOrObject {\n if (isBrowsersQueryValid(value)) return value;\n\n if (typeof value !== \"object\" || !value || Array.isArray(value)) {\n throw new Error(\n `${msg(loc)} must be a string, an array of strings or an object`,\n );\n }\n\n const browsersLoc = access(loc, \"browsers\");\n const esmodulesLoc = access(loc, \"esmodules\");\n\n assertBrowsersList(browsersLoc, value.browsers);\n assertBoolean(esmodulesLoc, value.esmodules);\n\n for (const key of Object.keys(value)) {\n const val = value[key];\n const subLoc = access(loc, key);\n\n if (key === \"esmodules\") assertBoolean(subLoc, val);\n else if (key === \"browsers\") assertBrowsersList(subLoc, val);\n else if (!Object.hasOwnProperty.call(TargetNames, key)) {\n const validTargets = Object.keys(TargetNames).join(\", \");\n throw new Error(\n `${msg(\n subLoc,\n )} is not a valid target. Supported targets are ${validTargets}`,\n );\n } else assertBrowserVersion(subLoc, val);\n }\n\n return value;\n}\n\nfunction assertBrowsersList(loc: GeneralPath, value: unknown) {\n if (value !== undefined && !isBrowsersQueryValid(value)) {\n throw new Error(\n `${msg(loc)} must be undefined, a string or an array of strings`,\n );\n }\n}\n\nfunction assertBrowserVersion(loc: GeneralPath, value: unknown) {\n if (typeof value === \"number\" && Math.round(value) === value) return;\n if (typeof value === \"string\") return;\n\n throw new Error(`${msg(loc)} must be a string or an integer number`);\n}\n\nexport function assertAssumptions(\n loc: GeneralPath,\n value: { [key: string]: unknown },\n): { [name: string]: boolean } | void {\n if (value === undefined) return;\n\n if (typeof value !== \"object\" || value === null) {\n throw new Error(`${msg(loc)} must be an object or undefined.`);\n }\n\n // todo(flow->ts): remove any\n let root: any = loc;\n do {\n root = root.parent;\n } while (root.type !== \"root\");\n const inPreset = root.source === \"preset\";\n\n for (const name of Object.keys(value)) {\n const subLoc = access(loc, name);\n if (!assumptionsNames.has(name as AssumptionName)) {\n throw new Error(`${msg(subLoc)} is not a supported assumption.`);\n }\n if (typeof value[name] !== \"boolean\") {\n throw new Error(`${msg(subLoc)} must be a boolean.`);\n }\n if (inPreset && value[name] === false) {\n throw new Error(\n `${msg(subLoc)} cannot be set to 'false' inside presets.`,\n );\n }\n }\n\n // @ts-expect-error todo(flow->ts)\n return value;\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/validation/options.js b/node_modules/@babel/core/lib/config/validation/options.js index 144b79203494..e8af7f23ae99 100644 --- a/node_modules/@babel/core/lib/config/validation/options.js +++ b/node_modules/@babel/core/lib/config/validation/options.js @@ -6,9 +6,9 @@ Object.defineProperty(exports, "__esModule", { exports.assumptionsNames = void 0; exports.checkNoUnwrappedItemOptionPairs = checkNoUnwrappedItemOptionPairs; exports.validate = validate; -var _removed = require("./removed"); -var _optionAssertions = require("./option-assertions"); -var _configError = require("../../errors/config-error"); +var _removed = require("./removed.js"); +var _optionAssertions = require("./option-assertions.js"); +var _configError = require("../../errors/config-error.js"); const ROOT_VALIDATORS = { cwd: _optionAssertions.assertString, root: _optionAssertions.assertString, @@ -70,9 +70,8 @@ const COMMON_VALIDATORS = { moduleId: _optionAssertions.assertString }); } -const knownAssumptions = ["arrayLikeIsIterable", "constantReexports", "constantSuper", "enumerableModuleMeta", "ignoreFunctionLength", "ignoreToPrimitiveHint", "iterableIsArray", "mutableTemplateObject", "noClassCalls", "noDocumentAll", "noIncompleteNsImportDetection", "noNewArrows", "objectRestNoSymbols", "privateFieldsAsProperties", "pureGetters", "setClassMethods", "setComputedProperties", "setPublicClassFields", "setSpreadProperties", "skipForOfIteratorClosing", "superIsCallableConstructor"]; -const assumptionsNames = new Set(knownAssumptions); -exports.assumptionsNames = assumptionsNames; +const knownAssumptions = ["arrayLikeIsIterable", "constantReexports", "constantSuper", "enumerableModuleMeta", "ignoreFunctionLength", "ignoreToPrimitiveHint", "iterableIsArray", "mutableTemplateObject", "noClassCalls", "noDocumentAll", "noIncompleteNsImportDetection", "noNewArrows", "objectRestNoSymbols", "privateFieldsAsSymbols", "privateFieldsAsProperties", "pureGetters", "setClassMethods", "setComputedProperties", "setPublicClassFields", "setSpreadProperties", "skipForOfIteratorClosing", "superIsCallableConstructor"]; +const assumptionsNames = exports.assumptionsNames = new Set(knownAssumptions); function getSource(loc) { return loc.type === "root" ? loc.source : getSource(loc.parent); } diff --git a/node_modules/@babel/core/lib/config/validation/options.js.map b/node_modules/@babel/core/lib/config/validation/options.js.map index 5e2d81e5692c..0d5c4355775f 100644 --- a/node_modules/@babel/core/lib/config/validation/options.js.map +++ b/node_modules/@babel/core/lib/config/validation/options.js.map @@ -1 +1 @@ -{"version":3,"names":["ROOT_VALIDATORS","cwd","assertString","root","rootMode","assertRootMode","configFile","assertConfigFileSearch","caller","assertCallerMetadata","filename","filenameRelative","code","assertBoolean","ast","cloneInputAst","envName","BABELRC_VALIDATORS","babelrc","babelrcRoots","assertBabelrcSearch","NONPRESET_VALIDATORS","extends","ignore","assertIgnoreList","only","targets","assertTargets","browserslistConfigFile","browserslistEnv","COMMON_VALIDATORS","inputSourceMap","assertInputSourceMap","presets","assertPluginList","plugins","passPerPreset","assumptions","assertAssumptions","env","assertEnvSet","overrides","assertOverridesList","test","assertConfigApplicableTest","include","exclude","retainLines","comments","shouldPrintComment","assertFunction","compact","assertCompact","minified","auxiliaryCommentBefore","auxiliaryCommentAfter","sourceType","assertSourceType","wrapPluginVisitorMethod","highlightCode","sourceMaps","assertSourceMaps","sourceMap","sourceFileName","sourceRoot","parserOpts","assertObject","generatorOpts","Object","assign","getModuleId","moduleRoot","moduleIds","moduleId","knownAssumptions","assumptionsNames","Set","getSource","loc","type","source","parent","validate","opts","validateNested","error","configError","ConfigError","message","assertNoDuplicateSourcemap","keys","forEach","key","optLoc","name","Error","msg","validator","throwUnknownError","removed","version","unknownOptErr","has","obj","prototype","hasOwnProperty","call","value","access","envLoc","arr","assertArray","index","item","entries","objLoc","overridesLoc","checkNoUnwrappedItemOptionPairs","items","e","lastItem","thisItem","file","options","undefined","request","JSON","stringify"],"sources":["../../../src/config/validation/options.ts"],"sourcesContent":["import type { InputTargets, Targets } from \"@babel/helper-compilation-targets\";\n\nimport type { ConfigItem } from \"../item\";\nimport type Plugin from \"../plugin\";\n\nimport removed from \"./removed\";\nimport {\n msg,\n access,\n assertString,\n assertBoolean,\n assertObject,\n assertArray,\n assertCallerMetadata,\n assertInputSourceMap,\n assertIgnoreList,\n assertPluginList,\n assertConfigApplicableTest,\n assertConfigFileSearch,\n assertBabelrcSearch,\n assertFunction,\n assertRootMode,\n assertSourceMaps,\n assertCompact,\n assertSourceType,\n assertTargets,\n assertAssumptions,\n} from \"./option-assertions\";\nimport type { ValidatorSet, Validator, OptionPath } from \"./option-assertions\";\nimport type { UnloadedDescriptor } from \"../config-descriptors\";\nimport type { ParserOptions } from \"@babel/parser\";\nimport type { GeneratorOptions } from \"@babel/generator\";\nimport ConfigError from \"../../errors/config-error\";\n\nconst ROOT_VALIDATORS: ValidatorSet = {\n cwd: assertString as Validator,\n root: assertString as Validator,\n rootMode: assertRootMode as Validator,\n configFile: assertConfigFileSearch as Validator<\n ValidatedOptions[\"configFile\"]\n >,\n\n caller: assertCallerMetadata as Validator,\n filename: assertString as Validator,\n filenameRelative: assertString as Validator<\n ValidatedOptions[\"filenameRelative\"]\n >,\n code: assertBoolean as Validator,\n ast: assertBoolean as Validator,\n\n cloneInputAst: assertBoolean as Validator,\n\n envName: assertString as Validator,\n};\n\nconst BABELRC_VALIDATORS: ValidatorSet = {\n babelrc: assertBoolean as Validator,\n babelrcRoots: assertBabelrcSearch as Validator<\n ValidatedOptions[\"babelrcRoots\"]\n >,\n};\n\nconst NONPRESET_VALIDATORS: ValidatorSet = {\n extends: assertString as Validator,\n ignore: assertIgnoreList as Validator,\n only: assertIgnoreList as Validator,\n\n targets: assertTargets as Validator,\n browserslistConfigFile: assertConfigFileSearch as Validator<\n ValidatedOptions[\"browserslistConfigFile\"]\n >,\n browserslistEnv: assertString as Validator<\n ValidatedOptions[\"browserslistEnv\"]\n >,\n};\n\nconst COMMON_VALIDATORS: ValidatorSet = {\n // TODO: Should 'inputSourceMap' be moved to be a root-only option?\n // We may want a boolean-only version to be a common option, with the\n // object only allowed as a root config argument.\n inputSourceMap: assertInputSourceMap as Validator<\n ValidatedOptions[\"inputSourceMap\"]\n >,\n presets: assertPluginList as Validator,\n plugins: assertPluginList as Validator,\n passPerPreset: assertBoolean as Validator,\n assumptions: assertAssumptions as Validator,\n\n env: assertEnvSet as Validator,\n overrides: assertOverridesList as Validator,\n\n // We could limit these to 'overrides' blocks, but it's not clear why we'd\n // bother, when the ability to limit a config to a specific set of files\n // is a fairly general useful feature.\n test: assertConfigApplicableTest as Validator,\n include: assertConfigApplicableTest as Validator,\n exclude: assertConfigApplicableTest as Validator,\n\n retainLines: assertBoolean as Validator,\n comments: assertBoolean as Validator,\n shouldPrintComment: assertFunction as Validator<\n ValidatedOptions[\"shouldPrintComment\"]\n >,\n compact: assertCompact as Validator,\n minified: assertBoolean as Validator,\n auxiliaryCommentBefore: assertString as Validator<\n ValidatedOptions[\"auxiliaryCommentBefore\"]\n >,\n auxiliaryCommentAfter: assertString as Validator<\n ValidatedOptions[\"auxiliaryCommentAfter\"]\n >,\n sourceType: assertSourceType as Validator,\n wrapPluginVisitorMethod: assertFunction as Validator<\n ValidatedOptions[\"wrapPluginVisitorMethod\"]\n >,\n highlightCode: assertBoolean as Validator,\n sourceMaps: assertSourceMaps as Validator,\n sourceMap: assertSourceMaps as Validator,\n sourceFileName: assertString as Validator,\n sourceRoot: assertString as Validator,\n parserOpts: assertObject as Validator,\n generatorOpts: assertObject as Validator,\n};\nif (!process.env.BABEL_8_BREAKING) {\n Object.assign(COMMON_VALIDATORS, {\n getModuleId: assertFunction,\n moduleRoot: assertString,\n moduleIds: assertBoolean,\n moduleId: assertString,\n });\n}\n\nexport type InputOptions = ValidatedOptions;\n\nexport type ValidatedOptions = {\n cwd?: string;\n filename?: string;\n filenameRelative?: string;\n babelrc?: boolean;\n babelrcRoots?: BabelrcSearch;\n configFile?: ConfigFileSearch;\n root?: string;\n rootMode?: RootMode;\n code?: boolean;\n ast?: boolean;\n cloneInputAst?: boolean;\n inputSourceMap?: RootInputSourceMapOption;\n envName?: string;\n caller?: CallerMetadata;\n extends?: string;\n env?: EnvSet;\n ignore?: IgnoreList;\n only?: IgnoreList;\n overrides?: OverridesList;\n // Generally verify if a given config object should be applied to the given file.\n test?: ConfigApplicableTest;\n include?: ConfigApplicableTest;\n exclude?: ConfigApplicableTest;\n presets?: PluginList;\n plugins?: PluginList;\n passPerPreset?: boolean;\n assumptions?: {\n [name: string]: boolean;\n };\n // browserslists-related options\n targets?: TargetsListOrObject;\n browserslistConfigFile?: ConfigFileSearch;\n browserslistEnv?: string;\n // Options for @babel/generator\n retainLines?: boolean;\n comments?: boolean;\n shouldPrintComment?: Function;\n compact?: CompactOption;\n minified?: boolean;\n auxiliaryCommentBefore?: string;\n auxiliaryCommentAfter?: string;\n // Parser\n sourceType?: SourceTypeOption;\n wrapPluginVisitorMethod?: Function;\n highlightCode?: boolean;\n // Sourcemap generation options.\n sourceMaps?: SourceMapsOption;\n sourceMap?: SourceMapsOption;\n sourceFileName?: string;\n sourceRoot?: string;\n // Deprecate top level parserOpts\n parserOpts?: ParserOptions;\n // Deprecate top level generatorOpts\n generatorOpts?: GeneratorOptions;\n};\n\nexport type NormalizedOptions = {\n readonly targets: Targets;\n} & Omit;\n\nexport type CallerMetadata = {\n // If 'caller' is specified, require that the name is given for debugging\n // messages.\n name: string;\n};\nexport type EnvSet = {\n [x: string]: T;\n};\nexport type IgnoreItem =\n | string\n | RegExp\n | ((\n path: string | undefined,\n context: { dirname: string; caller: CallerMetadata; envName: string },\n ) => unknown);\nexport type IgnoreList = ReadonlyArray;\n\nexport type PluginOptions = object | void | false;\nexport type PluginTarget = string | object | Function;\nexport type PluginItem =\n | ConfigItem\n | Plugin\n | PluginTarget\n | [PluginTarget, PluginOptions]\n | [PluginTarget, PluginOptions, string | void];\nexport type PluginList = ReadonlyArray;\n\nexport type OverridesList = Array;\nexport type ConfigApplicableTest = IgnoreItem | Array;\n\nexport type ConfigFileSearch = string | boolean;\nexport type BabelrcSearch = boolean | IgnoreItem | IgnoreList;\nexport type SourceMapsOption = boolean | \"inline\" | \"both\";\nexport type SourceTypeOption = \"module\" | \"script\" | \"unambiguous\";\nexport type CompactOption = boolean | \"auto\";\nexport type RootInputSourceMapOption = {} | boolean;\nexport type RootMode = \"root\" | \"upward\" | \"upward-optional\";\n\nexport type TargetsListOrObject =\n | Targets\n | InputTargets\n | InputTargets[\"browsers\"];\n\nexport type OptionsSource =\n | \"arguments\"\n | \"configfile\"\n | \"babelrcfile\"\n | \"extendsfile\"\n | \"preset\"\n | \"plugin\";\n\nexport type RootPath = Readonly<{\n type: \"root\";\n source: OptionsSource;\n}>;\n\ntype OverridesPath = Readonly<{\n type: \"overrides\";\n index: number;\n parent: RootPath;\n}>;\n\ntype EnvPath = Readonly<{\n type: \"env\";\n name: string;\n parent: RootPath | OverridesPath;\n}>;\n\nexport type NestingPath = RootPath | OverridesPath | EnvPath;\n\nconst knownAssumptions = [\n \"arrayLikeIsIterable\",\n \"constantReexports\",\n \"constantSuper\",\n \"enumerableModuleMeta\",\n \"ignoreFunctionLength\",\n \"ignoreToPrimitiveHint\",\n \"iterableIsArray\",\n \"mutableTemplateObject\",\n \"noClassCalls\",\n \"noDocumentAll\",\n \"noIncompleteNsImportDetection\",\n \"noNewArrows\",\n \"objectRestNoSymbols\",\n \"privateFieldsAsProperties\",\n \"pureGetters\",\n \"setClassMethods\",\n \"setComputedProperties\",\n \"setPublicClassFields\",\n \"setSpreadProperties\",\n \"skipForOfIteratorClosing\",\n \"superIsCallableConstructor\",\n] as const;\nexport type AssumptionName = typeof knownAssumptions[number];\nexport const assumptionsNames = new Set(knownAssumptions);\n\nfunction getSource(loc: NestingPath): OptionsSource {\n return loc.type === \"root\" ? loc.source : getSource(loc.parent);\n}\n\nexport function validate(\n type: OptionsSource,\n opts: {},\n filename?: string,\n): ValidatedOptions {\n try {\n return validateNested(\n {\n type: \"root\",\n source: type,\n },\n opts,\n );\n } catch (error) {\n const configError = new ConfigError(error.message, filename);\n // @ts-expect-error TODO: .code is not defined on ConfigError or Error\n if (error.code) configError.code = error.code;\n throw configError;\n }\n}\n\nfunction validateNested(loc: NestingPath, opts: { [key: string]: unknown }) {\n const type = getSource(loc);\n\n assertNoDuplicateSourcemap(opts);\n\n Object.keys(opts).forEach((key: string) => {\n const optLoc = {\n type: \"option\",\n name: key,\n parent: loc,\n } as const;\n\n if (type === \"preset\" && NONPRESET_VALIDATORS[key]) {\n throw new Error(`${msg(optLoc)} is not allowed in preset options`);\n }\n if (type !== \"arguments\" && ROOT_VALIDATORS[key]) {\n throw new Error(\n `${msg(optLoc)} is only allowed in root programmatic options`,\n );\n }\n if (\n type !== \"arguments\" &&\n type !== \"configfile\" &&\n BABELRC_VALIDATORS[key]\n ) {\n if (type === \"babelrcfile\" || type === \"extendsfile\") {\n throw new Error(\n `${msg(\n optLoc,\n )} is not allowed in .babelrc or \"extends\"ed files, only in root programmatic options, ` +\n `or babel.config.js/config file options`,\n );\n }\n\n throw new Error(\n `${msg(\n optLoc,\n )} is only allowed in root programmatic options, or babel.config.js/config file options`,\n );\n }\n\n const validator =\n COMMON_VALIDATORS[key] ||\n NONPRESET_VALIDATORS[key] ||\n BABELRC_VALIDATORS[key] ||\n ROOT_VALIDATORS[key] ||\n (throwUnknownError as Validator);\n\n validator(optLoc, opts[key]);\n });\n\n return opts;\n}\n\nfunction throwUnknownError(loc: OptionPath) {\n const key = loc.name;\n\n if (removed[key]) {\n const { message, version = 5 } = removed[key];\n\n throw new Error(\n `Using removed Babel ${version} option: ${msg(loc)} - ${message}`,\n );\n } else {\n // eslint-disable-next-line max-len\n const unknownOptErr = new Error(\n `Unknown option: ${msg(\n loc,\n )}. Check out https://babeljs.io/docs/en/babel-core/#options for more information about options.`,\n );\n // @ts-expect-error todo(flow->ts): consider creating something like BabelConfigError with code field in it\n unknownOptErr.code = \"BABEL_UNKNOWN_OPTION\";\n\n throw unknownOptErr;\n }\n}\n\nfunction has(obj: {}, key: string) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction assertNoDuplicateSourcemap(opts: {}): void {\n if (has(opts, \"sourceMap\") && has(opts, \"sourceMaps\")) {\n throw new Error(\".sourceMap is an alias for .sourceMaps, cannot use both\");\n }\n}\n\nfunction assertEnvSet(\n loc: OptionPath,\n value: unknown,\n): void | EnvSet {\n if (loc.parent.type === \"env\") {\n throw new Error(`${msg(loc)} is not allowed inside of another .env block`);\n }\n const parent: RootPath | OverridesPath = loc.parent;\n\n const obj = assertObject(loc, value);\n if (obj) {\n // Validate but don't copy the .env object in order to preserve\n // object identity for use during config chain processing.\n for (const envName of Object.keys(obj)) {\n const env = assertObject(access(loc, envName), obj[envName]);\n if (!env) continue;\n\n const envLoc = {\n type: \"env\",\n name: envName,\n parent,\n } as const;\n validateNested(envLoc, env);\n }\n }\n return obj;\n}\n\nfunction assertOverridesList(\n loc: OptionPath,\n value: unknown[],\n): undefined | OverridesList {\n if (loc.parent.type === \"env\") {\n throw new Error(`${msg(loc)} is not allowed inside an .env block`);\n }\n if (loc.parent.type === \"overrides\") {\n throw new Error(`${msg(loc)} is not allowed inside an .overrides block`);\n }\n const parent: RootPath = loc.parent;\n\n const arr = assertArray(loc, value);\n if (arr) {\n for (const [index, item] of arr.entries()) {\n const objLoc = access(loc, index);\n const env = assertObject(objLoc, item);\n if (!env) throw new Error(`${msg(objLoc)} must be an object`);\n\n const overridesLoc = {\n type: \"overrides\",\n index,\n parent,\n } as const;\n validateNested(overridesLoc, env);\n }\n }\n return arr as OverridesList;\n}\n\nexport function checkNoUnwrappedItemOptionPairs(\n items: Array,\n index: number,\n type: \"plugin\" | \"preset\",\n e: Error,\n): void {\n if (index === 0) return;\n\n const lastItem = items[index - 1];\n const thisItem = items[index];\n\n if (\n lastItem.file &&\n lastItem.options === undefined &&\n typeof thisItem.value === \"object\"\n ) {\n e.message +=\n `\\n- Maybe you meant to use\\n` +\n `\"${type}s\": [\\n [\"${lastItem.file.request}\", ${JSON.stringify(\n thisItem.value,\n undefined,\n 2,\n )}]\\n]\\n` +\n `To be a valid ${type}, its name and options should be wrapped in a pair of brackets`;\n }\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_removed","require","_optionAssertions","_configError","ROOT_VALIDATORS","cwd","assertString","root","rootMode","assertRootMode","configFile","assertConfigFileSearch","caller","assertCallerMetadata","filename","filenameRelative","code","assertBoolean","ast","cloneInputAst","envName","BABELRC_VALIDATORS","babelrc","babelrcRoots","assertBabelrcSearch","NONPRESET_VALIDATORS","extends","ignore","assertIgnoreList","only","targets","assertTargets","browserslistConfigFile","browserslistEnv","COMMON_VALIDATORS","inputSourceMap","assertInputSourceMap","presets","assertPluginList","plugins","passPerPreset","assumptions","assertAssumptions","env","assertEnvSet","overrides","assertOverridesList","test","assertConfigApplicableTest","include","exclude","retainLines","comments","shouldPrintComment","assertFunction","compact","assertCompact","minified","auxiliaryCommentBefore","auxiliaryCommentAfter","sourceType","assertSourceType","wrapPluginVisitorMethod","highlightCode","sourceMaps","assertSourceMaps","sourceMap","sourceFileName","sourceRoot","parserOpts","assertObject","generatorOpts","Object","assign","getModuleId","moduleRoot","moduleIds","moduleId","knownAssumptions","assumptionsNames","exports","Set","getSource","loc","type","source","parent","validate","opts","validateNested","error","configError","ConfigError","message","assertNoDuplicateSourcemap","keys","forEach","key","optLoc","name","Error","msg","validator","throwUnknownError","removed","version","unknownOptErr","has","obj","prototype","hasOwnProperty","call","value","access","envLoc","arr","assertArray","index","item","entries","objLoc","overridesLoc","checkNoUnwrappedItemOptionPairs","items","e","lastItem","thisItem","file","options","undefined","request","JSON","stringify"],"sources":["../../../src/config/validation/options.ts"],"sourcesContent":["import type { InputTargets, Targets } from \"@babel/helper-compilation-targets\";\n\nimport type { ConfigItem } from \"../item.ts\";\nimport type Plugin from \"../plugin.ts\";\n\nimport removed from \"./removed.ts\";\nimport {\n msg,\n access,\n assertString,\n assertBoolean,\n assertObject,\n assertArray,\n assertCallerMetadata,\n assertInputSourceMap,\n assertIgnoreList,\n assertPluginList,\n assertConfigApplicableTest,\n assertConfigFileSearch,\n assertBabelrcSearch,\n assertFunction,\n assertRootMode,\n assertSourceMaps,\n assertCompact,\n assertSourceType,\n assertTargets,\n assertAssumptions,\n} from \"./option-assertions.ts\";\nimport type {\n ValidatorSet,\n Validator,\n OptionPath,\n} from \"./option-assertions.ts\";\nimport type { UnloadedDescriptor } from \"../config-descriptors.ts\";\nimport type { PluginAPI } from \"../helpers/config-api.ts\";\nimport type { ParserOptions } from \"@babel/parser\";\nimport type { GeneratorOptions } from \"@babel/generator\";\nimport ConfigError from \"../../errors/config-error.ts\";\n\nconst ROOT_VALIDATORS: ValidatorSet = {\n cwd: assertString as Validator,\n root: assertString as Validator,\n rootMode: assertRootMode as Validator,\n configFile: assertConfigFileSearch as Validator<\n ValidatedOptions[\"configFile\"]\n >,\n\n caller: assertCallerMetadata as Validator,\n filename: assertString as Validator,\n filenameRelative: assertString as Validator<\n ValidatedOptions[\"filenameRelative\"]\n >,\n code: assertBoolean as Validator,\n ast: assertBoolean as Validator,\n\n cloneInputAst: assertBoolean as Validator,\n\n envName: assertString as Validator,\n};\n\nconst BABELRC_VALIDATORS: ValidatorSet = {\n babelrc: assertBoolean as Validator,\n babelrcRoots: assertBabelrcSearch as Validator<\n ValidatedOptions[\"babelrcRoots\"]\n >,\n};\n\nconst NONPRESET_VALIDATORS: ValidatorSet = {\n extends: assertString as Validator,\n ignore: assertIgnoreList as Validator,\n only: assertIgnoreList as Validator,\n\n targets: assertTargets as Validator,\n browserslistConfigFile: assertConfigFileSearch as Validator<\n ValidatedOptions[\"browserslistConfigFile\"]\n >,\n browserslistEnv: assertString as Validator<\n ValidatedOptions[\"browserslistEnv\"]\n >,\n};\n\nconst COMMON_VALIDATORS: ValidatorSet = {\n // TODO: Should 'inputSourceMap' be moved to be a root-only option?\n // We may want a boolean-only version to be a common option, with the\n // object only allowed as a root config argument.\n inputSourceMap: assertInputSourceMap as Validator<\n ValidatedOptions[\"inputSourceMap\"]\n >,\n presets: assertPluginList as Validator,\n plugins: assertPluginList as Validator,\n passPerPreset: assertBoolean as Validator,\n assumptions: assertAssumptions as Validator,\n\n env: assertEnvSet as Validator,\n overrides: assertOverridesList as Validator,\n\n // We could limit these to 'overrides' blocks, but it's not clear why we'd\n // bother, when the ability to limit a config to a specific set of files\n // is a fairly general useful feature.\n test: assertConfigApplicableTest as Validator,\n include: assertConfigApplicableTest as Validator,\n exclude: assertConfigApplicableTest as Validator,\n\n retainLines: assertBoolean as Validator,\n comments: assertBoolean as Validator,\n shouldPrintComment: assertFunction as Validator<\n ValidatedOptions[\"shouldPrintComment\"]\n >,\n compact: assertCompact as Validator,\n minified: assertBoolean as Validator,\n auxiliaryCommentBefore: assertString as Validator<\n ValidatedOptions[\"auxiliaryCommentBefore\"]\n >,\n auxiliaryCommentAfter: assertString as Validator<\n ValidatedOptions[\"auxiliaryCommentAfter\"]\n >,\n sourceType: assertSourceType as Validator,\n wrapPluginVisitorMethod: assertFunction as Validator<\n ValidatedOptions[\"wrapPluginVisitorMethod\"]\n >,\n highlightCode: assertBoolean as Validator,\n sourceMaps: assertSourceMaps as Validator,\n sourceMap: assertSourceMaps as Validator,\n sourceFileName: assertString as Validator,\n sourceRoot: assertString as Validator,\n parserOpts: assertObject as Validator,\n generatorOpts: assertObject as Validator,\n};\nif (!process.env.BABEL_8_BREAKING) {\n Object.assign(COMMON_VALIDATORS, {\n getModuleId: assertFunction,\n moduleRoot: assertString,\n moduleIds: assertBoolean,\n moduleId: assertString,\n });\n}\n\nexport type InputOptions = ValidatedOptions;\n\nexport type ValidatedOptions = {\n cwd?: string;\n filename?: string;\n filenameRelative?: string;\n babelrc?: boolean;\n babelrcRoots?: BabelrcSearch;\n configFile?: ConfigFileSearch;\n root?: string;\n rootMode?: RootMode;\n code?: boolean;\n ast?: boolean;\n cloneInputAst?: boolean;\n inputSourceMap?: RootInputSourceMapOption;\n envName?: string;\n caller?: CallerMetadata;\n extends?: string;\n env?: EnvSet;\n ignore?: IgnoreList;\n only?: IgnoreList;\n overrides?: OverridesList;\n // Generally verify if a given config object should be applied to the given file.\n test?: ConfigApplicableTest;\n include?: ConfigApplicableTest;\n exclude?: ConfigApplicableTest;\n presets?: PluginList;\n plugins?: PluginList;\n passPerPreset?: boolean;\n assumptions?: {\n [name: string]: boolean;\n };\n // browserslists-related options\n targets?: TargetsListOrObject;\n browserslistConfigFile?: ConfigFileSearch;\n browserslistEnv?: string;\n // Options for @babel/generator\n retainLines?: boolean;\n comments?: boolean;\n shouldPrintComment?: Function;\n compact?: CompactOption;\n minified?: boolean;\n auxiliaryCommentBefore?: string;\n auxiliaryCommentAfter?: string;\n // Parser\n sourceType?: SourceTypeOption;\n wrapPluginVisitorMethod?: Function;\n highlightCode?: boolean;\n // Sourcemap generation options.\n sourceMaps?: SourceMapsOption;\n sourceMap?: SourceMapsOption;\n sourceFileName?: string;\n sourceRoot?: string;\n // Deprecate top level parserOpts\n parserOpts?: ParserOptions;\n // Deprecate top level generatorOpts\n generatorOpts?: GeneratorOptions;\n};\n\nexport type NormalizedOptions = {\n readonly targets: Targets;\n} & Omit;\n\nexport type CallerMetadata = {\n // If 'caller' is specified, require that the name is given for debugging\n // messages.\n name: string;\n};\nexport type EnvSet = {\n [x: string]: T;\n};\nexport type IgnoreItem =\n | string\n | RegExp\n | ((\n path: string | undefined,\n context: { dirname: string; caller: CallerMetadata; envName: string },\n ) => unknown);\nexport type IgnoreList = ReadonlyArray;\n\nexport type PluginOptions = object | void | false;\nexport type PluginTarget = string | object | Function;\nexport type PluginItem =\n | ConfigItem\n | Plugin\n | PluginTarget\n | [PluginTarget, PluginOptions]\n | [PluginTarget, PluginOptions, string | void];\nexport type PluginList = ReadonlyArray;\n\nexport type OverridesList = Array;\nexport type ConfigApplicableTest = IgnoreItem | Array;\n\nexport type ConfigFileSearch = string | boolean;\nexport type BabelrcSearch = boolean | IgnoreItem | IgnoreList;\nexport type SourceMapsOption = boolean | \"inline\" | \"both\";\nexport type SourceTypeOption = \"module\" | \"script\" | \"unambiguous\";\nexport type CompactOption = boolean | \"auto\";\nexport type RootInputSourceMapOption = {} | boolean;\nexport type RootMode = \"root\" | \"upward\" | \"upward-optional\";\n\nexport type TargetsListOrObject =\n | Targets\n | InputTargets\n | InputTargets[\"browsers\"];\n\nexport type OptionsSource =\n | \"arguments\"\n | \"configfile\"\n | \"babelrcfile\"\n | \"extendsfile\"\n | \"preset\"\n | \"plugin\";\n\nexport type RootPath = Readonly<{\n type: \"root\";\n source: OptionsSource;\n}>;\n\ntype OverridesPath = Readonly<{\n type: \"overrides\";\n index: number;\n parent: RootPath;\n}>;\n\ntype EnvPath = Readonly<{\n type: \"env\";\n name: string;\n parent: RootPath | OverridesPath;\n}>;\n\nexport type NestingPath = RootPath | OverridesPath | EnvPath;\n\nconst knownAssumptions = [\n \"arrayLikeIsIterable\",\n \"constantReexports\",\n \"constantSuper\",\n \"enumerableModuleMeta\",\n \"ignoreFunctionLength\",\n \"ignoreToPrimitiveHint\",\n \"iterableIsArray\",\n \"mutableTemplateObject\",\n \"noClassCalls\",\n \"noDocumentAll\",\n \"noIncompleteNsImportDetection\",\n \"noNewArrows\",\n \"objectRestNoSymbols\",\n \"privateFieldsAsSymbols\",\n \"privateFieldsAsProperties\",\n \"pureGetters\",\n \"setClassMethods\",\n \"setComputedProperties\",\n \"setPublicClassFields\",\n \"setSpreadProperties\",\n \"skipForOfIteratorClosing\",\n \"superIsCallableConstructor\",\n] as const;\nexport type AssumptionName = (typeof knownAssumptions)[number];\nexport const assumptionsNames = new Set(knownAssumptions);\n\nfunction getSource(loc: NestingPath): OptionsSource {\n return loc.type === \"root\" ? loc.source : getSource(loc.parent);\n}\n\nexport function validate(\n type: OptionsSource,\n opts: {},\n filename?: string,\n): ValidatedOptions {\n try {\n return validateNested(\n {\n type: \"root\",\n source: type,\n },\n opts,\n );\n } catch (error) {\n const configError = new ConfigError(error.message, filename);\n // @ts-expect-error TODO: .code is not defined on ConfigError or Error\n if (error.code) configError.code = error.code;\n throw configError;\n }\n}\n\nfunction validateNested(loc: NestingPath, opts: { [key: string]: unknown }) {\n const type = getSource(loc);\n\n assertNoDuplicateSourcemap(opts);\n\n Object.keys(opts).forEach((key: string) => {\n const optLoc = {\n type: \"option\",\n name: key,\n parent: loc,\n } as const;\n\n if (type === \"preset\" && NONPRESET_VALIDATORS[key]) {\n throw new Error(`${msg(optLoc)} is not allowed in preset options`);\n }\n if (type !== \"arguments\" && ROOT_VALIDATORS[key]) {\n throw new Error(\n `${msg(optLoc)} is only allowed in root programmatic options`,\n );\n }\n if (\n type !== \"arguments\" &&\n type !== \"configfile\" &&\n BABELRC_VALIDATORS[key]\n ) {\n if (type === \"babelrcfile\" || type === \"extendsfile\") {\n throw new Error(\n `${msg(\n optLoc,\n )} is not allowed in .babelrc or \"extends\"ed files, only in root programmatic options, ` +\n `or babel.config.js/config file options`,\n );\n }\n\n throw new Error(\n `${msg(\n optLoc,\n )} is only allowed in root programmatic options, or babel.config.js/config file options`,\n );\n }\n\n const validator =\n COMMON_VALIDATORS[key] ||\n NONPRESET_VALIDATORS[key] ||\n BABELRC_VALIDATORS[key] ||\n ROOT_VALIDATORS[key] ||\n (throwUnknownError as Validator);\n\n validator(optLoc, opts[key]);\n });\n\n return opts;\n}\n\nfunction throwUnknownError(loc: OptionPath) {\n const key = loc.name;\n\n if (removed[key]) {\n const { message, version = 5 } = removed[key];\n\n throw new Error(\n `Using removed Babel ${version} option: ${msg(loc)} - ${message}`,\n );\n } else {\n const unknownOptErr = new Error(\n `Unknown option: ${msg(\n loc,\n )}. Check out https://babeljs.io/docs/en/babel-core/#options for more information about options.`,\n );\n // @ts-expect-error todo(flow->ts): consider creating something like BabelConfigError with code field in it\n unknownOptErr.code = \"BABEL_UNKNOWN_OPTION\";\n\n throw unknownOptErr;\n }\n}\n\nfunction has(obj: {}, key: string) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction assertNoDuplicateSourcemap(opts: {}): void {\n if (has(opts, \"sourceMap\") && has(opts, \"sourceMaps\")) {\n throw new Error(\".sourceMap is an alias for .sourceMaps, cannot use both\");\n }\n}\n\nfunction assertEnvSet(\n loc: OptionPath,\n value: unknown,\n): void | EnvSet {\n if (loc.parent.type === \"env\") {\n throw new Error(`${msg(loc)} is not allowed inside of another .env block`);\n }\n const parent: RootPath | OverridesPath = loc.parent;\n\n const obj = assertObject(loc, value);\n if (obj) {\n // Validate but don't copy the .env object in order to preserve\n // object identity for use during config chain processing.\n for (const envName of Object.keys(obj)) {\n const env = assertObject(access(loc, envName), obj[envName]);\n if (!env) continue;\n\n const envLoc = {\n type: \"env\",\n name: envName,\n parent,\n } as const;\n validateNested(envLoc, env);\n }\n }\n return obj;\n}\n\nfunction assertOverridesList(\n loc: OptionPath,\n value: unknown[],\n): undefined | OverridesList {\n if (loc.parent.type === \"env\") {\n throw new Error(`${msg(loc)} is not allowed inside an .env block`);\n }\n if (loc.parent.type === \"overrides\") {\n throw new Error(`${msg(loc)} is not allowed inside an .overrides block`);\n }\n const parent: RootPath = loc.parent;\n\n const arr = assertArray(loc, value);\n if (arr) {\n for (const [index, item] of arr.entries()) {\n const objLoc = access(loc, index);\n const env = assertObject(objLoc, item);\n if (!env) throw new Error(`${msg(objLoc)} must be an object`);\n\n const overridesLoc = {\n type: \"overrides\",\n index,\n parent,\n } as const;\n validateNested(overridesLoc, env);\n }\n }\n return arr as OverridesList;\n}\n\nexport function checkNoUnwrappedItemOptionPairs(\n items: Array>,\n index: number,\n type: \"plugin\" | \"preset\",\n e: Error,\n): void {\n if (index === 0) return;\n\n const lastItem = items[index - 1];\n const thisItem = items[index];\n\n if (\n lastItem.file &&\n lastItem.options === undefined &&\n typeof thisItem.value === \"object\"\n ) {\n e.message +=\n `\\n- Maybe you meant to use\\n` +\n `\"${type}s\": [\\n [\"${lastItem.file.request}\", ${JSON.stringify(\n thisItem.value,\n undefined,\n 2,\n )}]\\n]\\n` +\n `To be a valid ${type}, its name and options should be wrapped in a pair of brackets`;\n }\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/validation/plugins.js b/node_modules/@babel/core/lib/config/validation/plugins.js index 6ea3a0dc0a60..d744eccc4c59 100644 --- a/node_modules/@babel/core/lib/config/validation/plugins.js +++ b/node_modules/@babel/core/lib/config/validation/plugins.js @@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.validatePluginObject = validatePluginObject; -var _optionAssertions = require("./option-assertions"); +var _optionAssertions = require("./option-assertions.js"); const VALIDATORS = { name: _optionAssertions.assertString, manipulateOptions: _optionAssertions.assertFunction, @@ -18,7 +18,11 @@ const VALIDATORS = { function assertVisitorMap(loc, value) { const obj = (0, _optionAssertions.assertObject)(loc, value); if (obj) { - Object.keys(obj).forEach(prop => assertVisitorHandler(prop, obj[prop])); + Object.keys(obj).forEach(prop => { + if (prop !== "_exploded" && prop !== "_verified") { + assertVisitorHandler(prop, obj[prop]); + } + }); if (obj.enter || obj.exit) { throw new Error(`${(0, _optionAssertions.msg)(loc)} cannot contain catch-all "enter" or "exit" handlers. Please target individual nodes.`); } @@ -35,7 +39,6 @@ function assertVisitorHandler(key, value) { } else if (typeof value !== "function") { throw new Error(`.visitor["${key}"] must be a function`); } - return value; } function validatePluginObject(obj) { const rootPath = { diff --git a/node_modules/@babel/core/lib/config/validation/plugins.js.map b/node_modules/@babel/core/lib/config/validation/plugins.js.map index fbaf16edd443..2ddf2c4a1221 100644 --- a/node_modules/@babel/core/lib/config/validation/plugins.js.map +++ b/node_modules/@babel/core/lib/config/validation/plugins.js.map @@ -1 +1 @@ -{"version":3,"names":["VALIDATORS","name","assertString","manipulateOptions","assertFunction","pre","post","inherits","visitor","assertVisitorMap","parserOverride","generatorOverride","loc","value","obj","assertObject","Object","keys","forEach","prop","assertVisitorHandler","enter","exit","Error","msg","key","handler","validatePluginObject","rootPath","type","source","validator","optLoc","parent","invalidPluginPropertyError","code"],"sources":["../../../src/config/validation/plugins.ts"],"sourcesContent":["import {\n assertString,\n assertFunction,\n assertObject,\n msg,\n} from \"./option-assertions\";\n\nimport type {\n ValidatorSet,\n Validator,\n OptionPath,\n RootPath,\n} from \"./option-assertions\";\nimport type { ParserOptions } from \"@babel/parser\";\nimport type { Visitor } from \"@babel/traverse\";\nimport type { ValidatedOptions } from \"./options\";\nimport type { File, PluginPass } from \"../../index\";\n\n// Note: The casts here are just meant to be static assertions to make sure\n// that the assertion functions actually assert that the value's type matches\n// the declared types.\nconst VALIDATORS: ValidatorSet = {\n name: assertString as Validator,\n manipulateOptions: assertFunction as Validator<\n PluginObject[\"manipulateOptions\"]\n >,\n pre: assertFunction as Validator,\n post: assertFunction as Validator,\n inherits: assertFunction as Validator,\n visitor: assertVisitorMap as Validator,\n\n parserOverride: assertFunction as Validator,\n generatorOverride: assertFunction as Validator<\n PluginObject[\"generatorOverride\"]\n >,\n};\n\nfunction assertVisitorMap(loc: OptionPath, value: unknown): Visitor {\n const obj = assertObject(loc, value);\n if (obj) {\n Object.keys(obj).forEach(prop => assertVisitorHandler(prop, obj[prop]));\n\n if (obj.enter || obj.exit) {\n throw new Error(\n `${msg(\n loc,\n )} cannot contain catch-all \"enter\" or \"exit\" handlers. Please target individual nodes.`,\n );\n }\n }\n return obj as Visitor;\n}\n\nfunction assertVisitorHandler(\n key: string,\n value: unknown,\n): VisitorHandler | void {\n if (value && typeof value === \"object\") {\n Object.keys(value).forEach((handler: string) => {\n if (handler !== \"enter\" && handler !== \"exit\") {\n throw new Error(\n `.visitor[\"${key}\"] may only have .enter and/or .exit handlers.`,\n );\n }\n });\n } else if (typeof value !== \"function\") {\n throw new Error(`.visitor[\"${key}\"] must be a function`);\n }\n\n return value as any;\n}\n\ntype VisitorHandler =\n | Function\n | {\n enter?: Function;\n exit?: Function;\n };\n\nexport type PluginObject = {\n name?: string;\n manipulateOptions?: (\n options: ValidatedOptions,\n parserOpts: ParserOptions,\n ) => void;\n pre?: (this: S, file: File) => void;\n post?: (this: S, file: File) => void;\n inherits?: Function;\n visitor?: Visitor;\n parserOverride?: Function;\n generatorOverride?: Function;\n};\n\nexport function validatePluginObject(obj: {\n [key: string]: unknown;\n}): PluginObject {\n const rootPath: RootPath = {\n type: \"root\",\n source: \"plugin\",\n };\n Object.keys(obj).forEach((key: string) => {\n const validator = VALIDATORS[key];\n\n if (validator) {\n const optLoc: OptionPath = {\n type: \"option\",\n name: key,\n parent: rootPath,\n };\n validator(optLoc, obj[key]);\n } else {\n const invalidPluginPropertyError = new Error(\n `.${key} is not a valid Plugin property`,\n );\n // @ts-expect-error todo(flow->ts) consider additing BabelConfigError with code field\n invalidPluginPropertyError.code = \"BABEL_UNKNOWN_PLUGIN_PROPERTY\";\n throw invalidPluginPropertyError;\n }\n });\n\n return obj as any;\n}\n"],"mappings":";;;;;;AAAA;AAqBA,MAAMA,UAAwB,GAAG;EAC/BC,IAAI,EAAEC,8BAA+C;EACrDC,iBAAiB,EAAEC,gCAElB;EACDC,GAAG,EAAED,gCAAgD;EACrDE,IAAI,EAAEF,gCAAiD;EACvDG,QAAQ,EAAEH,gCAAqD;EAC/DI,OAAO,EAAEC,gBAAsD;EAE/DC,cAAc,EAAEN,gCAA2D;EAC3EO,iBAAiB,EAAEP;AAGrB,CAAC;AAED,SAASK,gBAAgB,CAACG,GAAe,EAAEC,KAAc,EAAW;EAClE,MAAMC,GAAG,GAAG,IAAAC,8BAAY,EAACH,GAAG,EAAEC,KAAK,CAAC;EACpC,IAAIC,GAAG,EAAE;IACPE,MAAM,CAACC,IAAI,CAACH,GAAG,CAAC,CAACI,OAAO,CAACC,IAAI,IAAIC,oBAAoB,CAACD,IAAI,EAAEL,GAAG,CAACK,IAAI,CAAC,CAAC,CAAC;IAEvE,IAAIL,GAAG,CAACO,KAAK,IAAIP,GAAG,CAACQ,IAAI,EAAE;MACzB,MAAM,IAAIC,KAAK,CACZ,GAAE,IAAAC,qBAAG,EACJZ,GAAG,CACH,uFAAsF,CACzF;IACH;EACF;EACA,OAAOE,GAAG;AACZ;AAEA,SAASM,oBAAoB,CAC3BK,GAAW,EACXZ,KAAc,EACS;EACvB,IAAIA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IACtCG,MAAM,CAACC,IAAI,CAACJ,KAAK,CAAC,CAACK,OAAO,CAAEQ,OAAe,IAAK;MAC9C,IAAIA,OAAO,KAAK,OAAO,IAAIA,OAAO,KAAK,MAAM,EAAE;QAC7C,MAAM,IAAIH,KAAK,CACZ,aAAYE,GAAI,gDAA+C,CACjE;MACH;IACF,CAAC,CAAC;EACJ,CAAC,MAAM,IAAI,OAAOZ,KAAK,KAAK,UAAU,EAAE;IACtC,MAAM,IAAIU,KAAK,CAAE,aAAYE,GAAI,uBAAsB,CAAC;EAC1D;EAEA,OAAOZ,KAAK;AACd;AAuBO,SAASc,oBAAoB,CAACb,GAEpC,EAAgB;EACf,MAAMc,QAAkB,GAAG;IACzBC,IAAI,EAAE,MAAM;IACZC,MAAM,EAAE;EACV,CAAC;EACDd,MAAM,CAACC,IAAI,CAACH,GAAG,CAAC,CAACI,OAAO,CAAEO,GAAW,IAAK;IACxC,MAAMM,SAAS,GAAG/B,UAAU,CAACyB,GAAG,CAAC;IAEjC,IAAIM,SAAS,EAAE;MACb,MAAMC,MAAkB,GAAG;QACzBH,IAAI,EAAE,QAAQ;QACd5B,IAAI,EAAEwB,GAAG;QACTQ,MAAM,EAAEL;MACV,CAAC;MACDG,SAAS,CAACC,MAAM,EAAElB,GAAG,CAACW,GAAG,CAAC,CAAC;IAC7B,CAAC,MAAM;MACL,MAAMS,0BAA0B,GAAG,IAAIX,KAAK,CACzC,IAAGE,GAAI,iCAAgC,CACzC;MAEDS,0BAA0B,CAACC,IAAI,GAAG,+BAA+B;MACjE,MAAMD,0BAA0B;IAClC;EACF,CAAC,CAAC;EAEF,OAAOpB,GAAG;AACZ;AAAC"} \ No newline at end of file +{"version":3,"names":["_optionAssertions","require","VALIDATORS","name","assertString","manipulateOptions","assertFunction","pre","post","inherits","visitor","assertVisitorMap","parserOverride","generatorOverride","loc","value","obj","assertObject","Object","keys","forEach","prop","assertVisitorHandler","enter","exit","Error","msg","key","handler","validatePluginObject","rootPath","type","source","validator","optLoc","parent","invalidPluginPropertyError","code"],"sources":["../../../src/config/validation/plugins.ts"],"sourcesContent":["import {\n assertString,\n assertFunction,\n assertObject,\n msg,\n} from \"./option-assertions.ts\";\n\nimport type {\n ValidatorSet,\n Validator,\n OptionPath,\n RootPath,\n} from \"./option-assertions.ts\";\nimport type { ParserOptions } from \"@babel/parser\";\nimport type { Visitor } from \"@babel/traverse\";\nimport type { ValidatedOptions } from \"./options.ts\";\nimport type { File, PluginAPI, PluginPass } from \"../../index.ts\";\n\n// Note: The casts here are just meant to be static assertions to make sure\n// that the assertion functions actually assert that the value's type matches\n// the declared types.\nconst VALIDATORS: ValidatorSet = {\n name: assertString as Validator,\n manipulateOptions: assertFunction as Validator<\n PluginObject[\"manipulateOptions\"]\n >,\n pre: assertFunction as Validator,\n post: assertFunction as Validator,\n inherits: assertFunction as Validator,\n visitor: assertVisitorMap as Validator,\n\n parserOverride: assertFunction as Validator,\n generatorOverride: assertFunction as Validator<\n PluginObject[\"generatorOverride\"]\n >,\n};\n\nfunction assertVisitorMap(loc: OptionPath, value: unknown): Visitor {\n const obj = assertObject(loc, value);\n if (obj) {\n Object.keys(obj).forEach(prop => {\n if (prop !== \"_exploded\" && prop !== \"_verified\") {\n assertVisitorHandler(prop, obj[prop]);\n }\n });\n\n if (obj.enter || obj.exit) {\n throw new Error(\n `${msg(\n loc,\n )} cannot contain catch-all \"enter\" or \"exit\" handlers. Please target individual nodes.`,\n );\n }\n }\n return obj as Visitor;\n}\n\nfunction assertVisitorHandler(\n key: string,\n value: unknown,\n): asserts value is VisitorHandler {\n if (value && typeof value === \"object\") {\n Object.keys(value).forEach((handler: string) => {\n if (handler !== \"enter\" && handler !== \"exit\") {\n throw new Error(\n `.visitor[\"${key}\"] may only have .enter and/or .exit handlers.`,\n );\n }\n });\n } else if (typeof value !== \"function\") {\n throw new Error(`.visitor[\"${key}\"] must be a function`);\n }\n}\n\ntype VisitorHandler =\n | Function\n | {\n enter?: Function;\n exit?: Function;\n };\n\nexport type PluginObject = {\n name?: string;\n manipulateOptions?: (\n options: ValidatedOptions,\n parserOpts: ParserOptions,\n ) => void;\n pre?: (this: S, file: File) => void;\n post?: (this: S, file: File) => void;\n inherits?: (\n api: PluginAPI,\n options: unknown,\n dirname: string,\n ) => PluginObject;\n visitor?: Visitor;\n parserOverride?: Function;\n generatorOverride?: Function;\n};\n\nexport function validatePluginObject(obj: {\n [key: string]: unknown;\n}): PluginObject {\n const rootPath: RootPath = {\n type: \"root\",\n source: \"plugin\",\n };\n Object.keys(obj).forEach((key: string) => {\n const validator = VALIDATORS[key];\n\n if (validator) {\n const optLoc: OptionPath = {\n type: \"option\",\n name: key,\n parent: rootPath,\n };\n validator(optLoc, obj[key]);\n } else {\n const invalidPluginPropertyError = new Error(\n `.${key} is not a valid Plugin property`,\n );\n // @ts-expect-error todo(flow->ts) consider adding BabelConfigError with code field\n invalidPluginPropertyError.code = \"BABEL_UNKNOWN_PLUGIN_PROPERTY\";\n throw invalidPluginPropertyError;\n }\n });\n\n return obj as any;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AAqBA,MAAMC,UAAwB,GAAG;EAC/BC,IAAI,EAAEC,8BAA+C;EACrDC,iBAAiB,EAAEC,gCAElB;EACDC,GAAG,EAAED,gCAAgD;EACrDE,IAAI,EAAEF,gCAAiD;EACvDG,QAAQ,EAAEH,gCAAqD;EAC/DI,OAAO,EAAEC,gBAAsD;EAE/DC,cAAc,EAAEN,gCAA2D;EAC3EO,iBAAiB,EAAEP;AAGrB,CAAC;AAED,SAASK,gBAAgBA,CAACG,GAAe,EAAEC,KAAc,EAAW;EAClE,MAAMC,GAAG,GAAG,IAAAC,8BAAY,EAACH,GAAG,EAAEC,KAAK,CAAC;EACpC,IAAIC,GAAG,EAAE;IACPE,MAAM,CAACC,IAAI,CAACH,GAAG,CAAC,CAACI,OAAO,CAACC,IAAI,IAAI;MAC/B,IAAIA,IAAI,KAAK,WAAW,IAAIA,IAAI,KAAK,WAAW,EAAE;QAChDC,oBAAoB,CAACD,IAAI,EAAEL,GAAG,CAACK,IAAI,CAAC,CAAC;MACvC;IACF,CAAC,CAAC;IAEF,IAAIL,GAAG,CAACO,KAAK,IAAIP,GAAG,CAACQ,IAAI,EAAE;MACzB,MAAM,IAAIC,KAAK,CACZ,GAAE,IAAAC,qBAAG,EACJZ,GACF,CAAE,uFACJ,CAAC;IACH;EACF;EACA,OAAOE,GAAG;AACZ;AAEA,SAASM,oBAAoBA,CAC3BK,GAAW,EACXZ,KAAc,EACmB;EACjC,IAAIA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IACtCG,MAAM,CAACC,IAAI,CAACJ,KAAK,CAAC,CAACK,OAAO,CAAEQ,OAAe,IAAK;MAC9C,IAAIA,OAAO,KAAK,OAAO,IAAIA,OAAO,KAAK,MAAM,EAAE;QAC7C,MAAM,IAAIH,KAAK,CACZ,aAAYE,GAAI,gDACnB,CAAC;MACH;IACF,CAAC,CAAC;EACJ,CAAC,MAAM,IAAI,OAAOZ,KAAK,KAAK,UAAU,EAAE;IACtC,MAAM,IAAIU,KAAK,CAAE,aAAYE,GAAI,uBAAsB,CAAC;EAC1D;AACF;AA2BO,SAASE,oBAAoBA,CAACb,GAEpC,EAAgB;EACf,MAAMc,QAAkB,GAAG;IACzBC,IAAI,EAAE,MAAM;IACZC,MAAM,EAAE;EACV,CAAC;EACDd,MAAM,CAACC,IAAI,CAACH,GAAG,CAAC,CAACI,OAAO,CAAEO,GAAW,IAAK;IACxC,MAAMM,SAAS,GAAG/B,UAAU,CAACyB,GAAG,CAAC;IAEjC,IAAIM,SAAS,EAAE;MACb,MAAMC,MAAkB,GAAG;QACzBH,IAAI,EAAE,QAAQ;QACd5B,IAAI,EAAEwB,GAAG;QACTQ,MAAM,EAAEL;MACV,CAAC;MACDG,SAAS,CAACC,MAAM,EAAElB,GAAG,CAACW,GAAG,CAAC,CAAC;IAC7B,CAAC,MAAM;MACL,MAAMS,0BAA0B,GAAG,IAAIX,KAAK,CACzC,IAAGE,GAAI,iCACV,CAAC;MAEDS,0BAA0B,CAACC,IAAI,GAAG,+BAA+B;MACjE,MAAMD,0BAA0B;IAClC;EACF,CAAC,CAAC;EAEF,OAAOpB,GAAG;AACZ;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/config/validation/removed.js b/node_modules/@babel/core/lib/config/validation/removed.js index 57270ea93b3b..9bd436e88cd9 100644 --- a/node_modules/@babel/core/lib/config/validation/removed.js +++ b/node_modules/@babel/core/lib/config/validation/removed.js @@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _default = { +var _default = exports.default = { auxiliaryComment: { message: "Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`" }, @@ -63,7 +63,6 @@ var _default = { message: "The `sourceMapTarget` option has been removed because it makes more sense for the tooling " + "that calls Babel to assign `map.file` themselves." } }; -exports.default = _default; 0 && 0; //# sourceMappingURL=removed.js.map diff --git a/node_modules/@babel/core/lib/config/validation/removed.js.map b/node_modules/@babel/core/lib/config/validation/removed.js.map index da9a0972e801..04441b5ef148 100644 --- a/node_modules/@babel/core/lib/config/validation/removed.js.map +++ b/node_modules/@babel/core/lib/config/validation/removed.js.map @@ -1 +1 @@ -{"version":3,"names":["auxiliaryComment","message","blacklist","breakConfig","experimental","externalHelpers","extra","jsxPragma","loose","metadataUsedHelpers","modules","nonStandard","optional","sourceMapName","stage","whitelist","resolveModuleSource","version","metadata","sourceMapTarget"],"sources":["../../../src/config/validation/removed.ts"],"sourcesContent":["export default {\n auxiliaryComment: {\n message: \"Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`\",\n },\n blacklist: {\n message: \"Put the specific transforms you want in the `plugins` option\",\n },\n breakConfig: {\n message: \"This is not a necessary option in Babel 6\",\n },\n experimental: {\n message: \"Put the specific transforms you want in the `plugins` option\",\n },\n externalHelpers: {\n message:\n \"Use the `external-helpers` plugin instead. \" +\n \"Check out http://babeljs.io/docs/plugins/external-helpers/\",\n },\n extra: {\n message: \"\",\n },\n jsxPragma: {\n message:\n \"use the `pragma` option in the `react-jsx` plugin. \" +\n \"Check out http://babeljs.io/docs/plugins/transform-react-jsx/\",\n },\n loose: {\n message:\n \"Specify the `loose` option for the relevant plugin you are using \" +\n \"or use a preset that sets the option.\",\n },\n metadataUsedHelpers: {\n message: \"Not required anymore as this is enabled by default\",\n },\n modules: {\n message:\n \"Use the corresponding module transform plugin in the `plugins` option. \" +\n \"Check out http://babeljs.io/docs/plugins/#modules\",\n },\n nonStandard: {\n message:\n \"Use the `react-jsx` and `flow-strip-types` plugins to support JSX and Flow. \" +\n \"Also check out the react preset http://babeljs.io/docs/plugins/preset-react/\",\n },\n optional: {\n message: \"Put the specific transforms you want in the `plugins` option\",\n },\n sourceMapName: {\n message:\n \"The `sourceMapName` option has been removed because it makes more sense for the \" +\n \"tooling that calls Babel to assign `map.file` themselves.\",\n },\n stage: {\n message:\n \"Check out the corresponding stage-x presets http://babeljs.io/docs/plugins/#presets\",\n },\n whitelist: {\n message: \"Put the specific transforms you want in the `plugins` option\",\n },\n\n resolveModuleSource: {\n version: 6,\n message: \"Use `babel-plugin-module-resolver@3`'s 'resolvePath' options\",\n },\n metadata: {\n version: 6,\n message:\n \"Generated plugin metadata is always included in the output result\",\n },\n sourceMapTarget: {\n version: 6,\n message:\n \"The `sourceMapTarget` option has been removed because it makes more sense for the tooling \" +\n \"that calls Babel to assign `map.file` themselves.\",\n },\n} as { [name: string]: { version?: number; message: string } };\n"],"mappings":";;;;;;eAAe;EACbA,gBAAgB,EAAE;IAChBC,OAAO,EAAE;EACX,CAAC;EACDC,SAAS,EAAE;IACTD,OAAO,EAAE;EACX,CAAC;EACDE,WAAW,EAAE;IACXF,OAAO,EAAE;EACX,CAAC;EACDG,YAAY,EAAE;IACZH,OAAO,EAAE;EACX,CAAC;EACDI,eAAe,EAAE;IACfJ,OAAO,EACL,6CAA6C,GAC7C;EACJ,CAAC;EACDK,KAAK,EAAE;IACLL,OAAO,EAAE;EACX,CAAC;EACDM,SAAS,EAAE;IACTN,OAAO,EACL,qDAAqD,GACrD;EACJ,CAAC;EACDO,KAAK,EAAE;IACLP,OAAO,EACL,mEAAmE,GACnE;EACJ,CAAC;EACDQ,mBAAmB,EAAE;IACnBR,OAAO,EAAE;EACX,CAAC;EACDS,OAAO,EAAE;IACPT,OAAO,EACL,yEAAyE,GACzE;EACJ,CAAC;EACDU,WAAW,EAAE;IACXV,OAAO,EACL,8EAA8E,GAC9E;EACJ,CAAC;EACDW,QAAQ,EAAE;IACRX,OAAO,EAAE;EACX,CAAC;EACDY,aAAa,EAAE;IACbZ,OAAO,EACL,kFAAkF,GAClF;EACJ,CAAC;EACDa,KAAK,EAAE;IACLb,OAAO,EACL;EACJ,CAAC;EACDc,SAAS,EAAE;IACTd,OAAO,EAAE;EACX,CAAC;EAEDe,mBAAmB,EAAE;IACnBC,OAAO,EAAE,CAAC;IACVhB,OAAO,EAAE;EACX,CAAC;EACDiB,QAAQ,EAAE;IACRD,OAAO,EAAE,CAAC;IACVhB,OAAO,EACL;EACJ,CAAC;EACDkB,eAAe,EAAE;IACfF,OAAO,EAAE,CAAC;IACVhB,OAAO,EACL,4FAA4F,GAC5F;EACJ;AACF,CAAC;AAAA;AAAA"} \ No newline at end of file +{"version":3,"names":["auxiliaryComment","message","blacklist","breakConfig","experimental","externalHelpers","extra","jsxPragma","loose","metadataUsedHelpers","modules","nonStandard","optional","sourceMapName","stage","whitelist","resolveModuleSource","version","metadata","sourceMapTarget"],"sources":["../../../src/config/validation/removed.ts"],"sourcesContent":["export default {\n auxiliaryComment: {\n message: \"Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`\",\n },\n blacklist: {\n message: \"Put the specific transforms you want in the `plugins` option\",\n },\n breakConfig: {\n message: \"This is not a necessary option in Babel 6\",\n },\n experimental: {\n message: \"Put the specific transforms you want in the `plugins` option\",\n },\n externalHelpers: {\n message:\n \"Use the `external-helpers` plugin instead. \" +\n \"Check out http://babeljs.io/docs/plugins/external-helpers/\",\n },\n extra: {\n message: \"\",\n },\n jsxPragma: {\n message:\n \"use the `pragma` option in the `react-jsx` plugin. \" +\n \"Check out http://babeljs.io/docs/plugins/transform-react-jsx/\",\n },\n loose: {\n message:\n \"Specify the `loose` option for the relevant plugin you are using \" +\n \"or use a preset that sets the option.\",\n },\n metadataUsedHelpers: {\n message: \"Not required anymore as this is enabled by default\",\n },\n modules: {\n message:\n \"Use the corresponding module transform plugin in the `plugins` option. \" +\n \"Check out http://babeljs.io/docs/plugins/#modules\",\n },\n nonStandard: {\n message:\n \"Use the `react-jsx` and `flow-strip-types` plugins to support JSX and Flow. \" +\n \"Also check out the react preset http://babeljs.io/docs/plugins/preset-react/\",\n },\n optional: {\n message: \"Put the specific transforms you want in the `plugins` option\",\n },\n sourceMapName: {\n message:\n \"The `sourceMapName` option has been removed because it makes more sense for the \" +\n \"tooling that calls Babel to assign `map.file` themselves.\",\n },\n stage: {\n message:\n \"Check out the corresponding stage-x presets http://babeljs.io/docs/plugins/#presets\",\n },\n whitelist: {\n message: \"Put the specific transforms you want in the `plugins` option\",\n },\n\n resolveModuleSource: {\n version: 6,\n message: \"Use `babel-plugin-module-resolver@3`'s 'resolvePath' options\",\n },\n metadata: {\n version: 6,\n message:\n \"Generated plugin metadata is always included in the output result\",\n },\n sourceMapTarget: {\n version: 6,\n message:\n \"The `sourceMapTarget` option has been removed because it makes more sense for the tooling \" +\n \"that calls Babel to assign `map.file` themselves.\",\n },\n} as { [name: string]: { version?: number; message: string } };\n"],"mappings":";;;;;;iCAAe;EACbA,gBAAgB,EAAE;IAChBC,OAAO,EAAE;EACX,CAAC;EACDC,SAAS,EAAE;IACTD,OAAO,EAAE;EACX,CAAC;EACDE,WAAW,EAAE;IACXF,OAAO,EAAE;EACX,CAAC;EACDG,YAAY,EAAE;IACZH,OAAO,EAAE;EACX,CAAC;EACDI,eAAe,EAAE;IACfJ,OAAO,EACL,6CAA6C,GAC7C;EACJ,CAAC;EACDK,KAAK,EAAE;IACLL,OAAO,EAAE;EACX,CAAC;EACDM,SAAS,EAAE;IACTN,OAAO,EACL,qDAAqD,GACrD;EACJ,CAAC;EACDO,KAAK,EAAE;IACLP,OAAO,EACL,mEAAmE,GACnE;EACJ,CAAC;EACDQ,mBAAmB,EAAE;IACnBR,OAAO,EAAE;EACX,CAAC;EACDS,OAAO,EAAE;IACPT,OAAO,EACL,yEAAyE,GACzE;EACJ,CAAC;EACDU,WAAW,EAAE;IACXV,OAAO,EACL,8EAA8E,GAC9E;EACJ,CAAC;EACDW,QAAQ,EAAE;IACRX,OAAO,EAAE;EACX,CAAC;EACDY,aAAa,EAAE;IACbZ,OAAO,EACL,kFAAkF,GAClF;EACJ,CAAC;EACDa,KAAK,EAAE;IACLb,OAAO,EACL;EACJ,CAAC;EACDc,SAAS,EAAE;IACTd,OAAO,EAAE;EACX,CAAC;EAEDe,mBAAmB,EAAE;IACnBC,OAAO,EAAE,CAAC;IACVhB,OAAO,EAAE;EACX,CAAC;EACDiB,QAAQ,EAAE;IACRD,OAAO,EAAE,CAAC;IACVhB,OAAO,EACL;EACJ,CAAC;EACDkB,eAAe,EAAE;IACfF,OAAO,EAAE,CAAC;IACVhB,OAAO,EACL,4FAA4F,GAC5F;EACJ;AACF,CAAC;AAAA"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/errors/config-error.js b/node_modules/@babel/core/lib/errors/config-error.js index 1ee56a883830..c290804789db 100644 --- a/node_modules/@babel/core/lib/errors/config-error.js +++ b/node_modules/@babel/core/lib/errors/config-error.js @@ -4,12 +4,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _rewriteStackTrace = require("./rewrite-stack-trace"); +var _rewriteStackTrace = require("./rewrite-stack-trace.js"); class ConfigError extends Error { constructor(message, filename) { super(message); (0, _rewriteStackTrace.expectedError)(this); - if (filename) (0, _rewriteStackTrace.injcectVirtualStackFrame)(this, filename); + if (filename) (0, _rewriteStackTrace.injectVirtualStackFrame)(this, filename); } } exports.default = ConfigError; diff --git a/node_modules/@babel/core/lib/errors/config-error.js.map b/node_modules/@babel/core/lib/errors/config-error.js.map index 3aaf90ab571f..a4622dceaecf 100644 --- a/node_modules/@babel/core/lib/errors/config-error.js.map +++ b/node_modules/@babel/core/lib/errors/config-error.js.map @@ -1 +1 @@ -{"version":3,"names":["ConfigError","Error","constructor","message","filename","expectedError","injcectVirtualStackFrame"],"sources":["../../src/errors/config-error.ts"],"sourcesContent":["import { injcectVirtualStackFrame, expectedError } from \"./rewrite-stack-trace\";\n\nexport default class ConfigError extends Error {\n constructor(message: string, filename?: string) {\n super(message);\n expectedError(this);\n if (filename) injcectVirtualStackFrame(this, filename);\n }\n}\n"],"mappings":";;;;;;AAAA;AAEe,MAAMA,WAAW,SAASC,KAAK,CAAC;EAC7CC,WAAW,CAACC,OAAe,EAAEC,QAAiB,EAAE;IAC9C,KAAK,CAACD,OAAO,CAAC;IACd,IAAAE,gCAAa,EAAC,IAAI,CAAC;IACnB,IAAID,QAAQ,EAAE,IAAAE,2CAAwB,EAAC,IAAI,EAAEF,QAAQ,CAAC;EACxD;AACF;AAAC;AAAA"} \ No newline at end of file +{"version":3,"names":["_rewriteStackTrace","require","ConfigError","Error","constructor","message","filename","expectedError","injectVirtualStackFrame","exports","default"],"sources":["../../src/errors/config-error.ts"],"sourcesContent":["import {\n injectVirtualStackFrame,\n expectedError,\n} from \"./rewrite-stack-trace.ts\";\n\nexport default class ConfigError extends Error {\n constructor(message: string, filename?: string) {\n super(message);\n expectedError(this);\n if (filename) injectVirtualStackFrame(this, filename);\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,kBAAA,GAAAC,OAAA;AAKe,MAAMC,WAAW,SAASC,KAAK,CAAC;EAC7CC,WAAWA,CAACC,OAAe,EAAEC,QAAiB,EAAE;IAC9C,KAAK,CAACD,OAAO,CAAC;IACd,IAAAE,gCAAa,EAAC,IAAI,CAAC;IACnB,IAAID,QAAQ,EAAE,IAAAE,0CAAuB,EAAC,IAAI,EAAEF,QAAQ,CAAC;EACvD;AACF;AAACG,OAAA,CAAAC,OAAA,GAAAR,WAAA;AAAA"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/errors/rewrite-stack-trace.js b/node_modules/@babel/core/lib/errors/rewrite-stack-trace.js index b07288b6f3fa..68896d38347a 100644 --- a/node_modules/@babel/core/lib/errors/rewrite-stack-trace.js +++ b/node_modules/@babel/core/lib/errors/rewrite-stack-trace.js @@ -6,12 +6,12 @@ Object.defineProperty(exports, "__esModule", { exports.beginHiddenCallStack = beginHiddenCallStack; exports.endHiddenCallStack = endHiddenCallStack; exports.expectedError = expectedError; -exports.injcectVirtualStackFrame = injcectVirtualStackFrame; - +exports.injectVirtualStackFrame = injectVirtualStackFrame; +var _Object$getOwnPropert; const ErrorToString = Function.call.bind(Error.prototype.toString); -const SUPPORTED = !!Error.captureStackTrace; -const START_HIDNG = "startHiding - secret - don't use this - v1"; -const STOP_HIDNG = "stopHiding - secret - don't use this - v1"; +const SUPPORTED = !!Error.captureStackTrace && ((_Object$getOwnPropert = Object.getOwnPropertyDescriptor(Error, "stackTraceLimit")) == null ? void 0 : _Object$getOwnPropert.writable) === true; +const START_HIDING = "startHiding - secret - don't use this - v1"; +const STOP_HIDING = "stopHiding - secret - don't use this - v1"; const expectedErrors = new WeakSet(); const virtualFrames = new WeakMap(); function CallSite(filename) { @@ -28,7 +28,7 @@ function CallSite(filename) { toString: () => filename }); } -function injcectVirtualStackFrame(error, filename) { +function injectVirtualStackFrame(error, filename) { if (!SUPPORTED) return; let frames = virtualFrames.get(error); if (!frames) virtualFrames.set(error, frames = []); @@ -46,7 +46,7 @@ function beginHiddenCallStack(fn) { setupPrepareStackTrace(); return fn(...args); }, "name", { - value: STOP_HIDNG + value: STOP_HIDING }); } function endHiddenCallStack(fn) { @@ -54,7 +54,7 @@ function endHiddenCallStack(fn) { return Object.defineProperty(function (...args) { return fn(...args); }, "name", { - value: START_HIDNG + value: START_HIDING }); } function setupPrepareStackTrace() { @@ -62,7 +62,6 @@ function setupPrepareStackTrace() { const { prepareStackTrace = defaultPrepareStackTrace } = Error; - const MIN_STACK_TRACE_LIMIT = 50; Error.stackTraceLimit && (Error.stackTraceLimit = Math.max(Error.stackTraceLimit, MIN_STACK_TRACE_LIMIT)); Error.prepareStackTrace = function stackTraceRewriter(err, trace) { @@ -71,9 +70,9 @@ function setupPrepareStackTrace() { let status = isExpected ? "hiding" : "unknown"; for (let i = 0; i < trace.length; i++) { const name = trace[i].getFunctionName(); - if (name === START_HIDNG) { + if (name === START_HIDING) { status = "hiding"; - } else if (name === STOP_HIDNG) { + } else if (name === STOP_HIDING) { if (status === "hiding") { status = "showing"; if (virtualFrames.has(err)) { diff --git a/node_modules/@babel/core/lib/errors/rewrite-stack-trace.js.map b/node_modules/@babel/core/lib/errors/rewrite-stack-trace.js.map index f7e90cdea0d8..0bec3cb8058d 100644 --- a/node_modules/@babel/core/lib/errors/rewrite-stack-trace.js.map +++ b/node_modules/@babel/core/lib/errors/rewrite-stack-trace.js.map @@ -1 +1 @@ -{"version":3,"names":["ErrorToString","Function","call","bind","Error","prototype","toString","SUPPORTED","captureStackTrace","START_HIDNG","STOP_HIDNG","expectedErrors","WeakSet","virtualFrames","WeakMap","CallSite","filename","Object","create","isNative","isConstructor","isToplevel","getFileName","getLineNumber","undefined","getColumnNumber","getFunctionName","getMethodName","getTypeName","injcectVirtualStackFrame","error","frames","get","set","push","expectedError","add","beginHiddenCallStack","fn","defineProperty","args","setupPrepareStackTrace","value","endHiddenCallStack","prepareStackTrace","defaultPrepareStackTrace","MIN_STACK_TRACE_LIMIT","stackTraceLimit","Math","max","stackTraceRewriter","err","trace","newTrace","isExpected","has","status","i","length","name","unshift","join"],"sources":["../../src/errors/rewrite-stack-trace.ts"],"sourcesContent":["/**\n * This file uses the iternal V8 Stack Trace API (https://v8.dev/docs/stack-trace-api)\n * to provide utilities to rewrite the stack trace.\n * When this API is not present, all the functions in this file become noops.\n *\n * beginHiddenCallStack(fn) and endHiddenCallStack(fn) wrap their parameter to\n * mark an hidden portion of the stack trace. The function passed to\n * beginHiddenCallStack is the first hidden function, while the function passed\n * to endHiddenCallStack is the first shown function.\n *\n * When an error is thrown _outside_ of the hidden zone, everything between\n * beginHiddenCallStack and endHiddenCallStack will not be shown.\n * If an error is thrown _inside_ the hidden zone, then the whole stack trace\n * will be visible: this is to avoid hiding real bugs.\n * However, if an error inside the hidden zone is expected, it can be marked\n * with the expectedError(error) function to keep the hidden frames hidden.\n *\n * Consider this call stack (the outer function is the bottom one):\n *\n * 1. a()\n * 2. endHiddenCallStack(b)()\n * 3. c()\n * 4. beginHiddenCallStack(d)()\n * 5. e()\n * 6. f()\n *\n * - If a() throws an error, then its shown call stack will be \"a, b, e, f\"\n * - If b() throws an error, then its shown call stack will be \"b, e, f\"\n * - If c() throws an expected error, then its shown call stack will be \"e, f\"\n * - If c() throws an unexpected error, then its shown call stack will be \"c, d, e, f\"\n * - If d() throws an expected error, then its shown call stack will be \"e, f\"\n * - If d() throws an unexpected error, then its shown call stack will be \"d, e, f\"\n * - If e() throws an error, then its shown call stack will be \"e, f\"\n *\n * Additionally, an error can inject additional \"virtual\" stack frames using the\n * injcectVirtualStackFrame(error, filename) function: those are injected as a\n * replacement of the hidden frames.\n * In the example above, if we called injcectVirtualStackFrame(err, \"h\") and\n * injcectVirtualStackFrame(err, \"i\") on the expected error thrown by c(), its\n * shown call stack would have been \"h, i, e, f\".\n * This can be useful, for example, to report config validation errors as if they\n * were directly thrown in the config file.\n */\n\nconst ErrorToString = Function.call.bind(Error.prototype.toString);\n\nconst SUPPORTED = !!Error.captureStackTrace;\n\nconst START_HIDNG = \"startHiding - secret - don't use this - v1\";\nconst STOP_HIDNG = \"stopHiding - secret - don't use this - v1\";\n\ntype CallSite = Parameters[1][number];\n\nconst expectedErrors = new WeakSet();\nconst virtualFrames = new WeakMap();\n\nfunction CallSite(filename: string): CallSite {\n // We need to use a prototype otherwise it breaks source-map-support's internals\n return Object.create({\n isNative: () => false,\n isConstructor: () => false,\n isToplevel: () => true,\n getFileName: () => filename,\n getLineNumber: () => undefined,\n getColumnNumber: () => undefined,\n getFunctionName: () => undefined,\n getMethodName: () => undefined,\n getTypeName: () => undefined,\n toString: () => filename,\n } as CallSite);\n}\n\nexport function injcectVirtualStackFrame(error: Error, filename: string) {\n if (!SUPPORTED) return;\n\n let frames = virtualFrames.get(error);\n if (!frames) virtualFrames.set(error, (frames = []));\n frames.push(CallSite(filename));\n\n return error;\n}\n\nexport function expectedError(error: Error) {\n if (!SUPPORTED) return;\n expectedErrors.add(error);\n return error;\n}\n\nexport function beginHiddenCallStack(\n fn: (...args: A) => R,\n) {\n if (!SUPPORTED) return fn;\n\n return Object.defineProperty(\n function (...args: A) {\n setupPrepareStackTrace();\n return fn(...args);\n },\n \"name\",\n { value: STOP_HIDNG },\n );\n}\n\nexport function endHiddenCallStack(\n fn: (...args: A) => R,\n) {\n if (!SUPPORTED) return fn;\n\n return Object.defineProperty(\n function (...args: A) {\n return fn(...args);\n },\n \"name\",\n { value: START_HIDNG },\n );\n}\n\nfunction setupPrepareStackTrace() {\n // @ts-expect-error This function is a singleton\n // eslint-disable-next-line no-func-assign\n setupPrepareStackTrace = () => {};\n\n const { prepareStackTrace = defaultPrepareStackTrace } = Error;\n\n // We add some extra frames to Error.stackTraceLimit, so that we can\n // always show some useful frames even after deleting ours.\n // STACK_TRACE_LIMIT_DELTA should be around the maximum expected number\n // of internal frames, and not too big because capturing the stack trace\n // is slow (this is why Error.stackTraceLimit does not default to Infinity!).\n // Increase it if needed.\n // However, we only do it if the user did not explicitly set it to 0.\n const MIN_STACK_TRACE_LIMIT = 50;\n Error.stackTraceLimit &&= Math.max(\n Error.stackTraceLimit,\n MIN_STACK_TRACE_LIMIT,\n );\n\n Error.prepareStackTrace = function stackTraceRewriter(err, trace) {\n let newTrace = [];\n\n const isExpected = expectedErrors.has(err);\n let status: \"showing\" | \"hiding\" | \"unknown\" = isExpected\n ? \"hiding\"\n : \"unknown\";\n for (let i = 0; i < trace.length; i++) {\n const name = trace[i].getFunctionName();\n if (name === START_HIDNG) {\n status = \"hiding\";\n } else if (name === STOP_HIDNG) {\n if (status === \"hiding\") {\n status = \"showing\";\n if (virtualFrames.has(err)) {\n newTrace.unshift(...virtualFrames.get(err));\n }\n } else if (status === \"unknown\") {\n // Unexpected internal error, show the full stack trace\n newTrace = trace;\n break;\n }\n } else if (status !== \"hiding\") {\n newTrace.push(trace[i]);\n }\n }\n\n return prepareStackTrace(err, newTrace);\n };\n}\n\nfunction defaultPrepareStackTrace(err: Error, trace: CallSite[]) {\n if (trace.length === 0) return ErrorToString(err);\n return `${ErrorToString(err)}\\n at ${trace.join(\"\\n at \")}`;\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["ErrorToString","Function","call","bind","Error","prototype","toString","SUPPORTED","captureStackTrace","_Object$getOwnPropert","Object","getOwnPropertyDescriptor","writable","START_HIDING","STOP_HIDING","expectedErrors","WeakSet","virtualFrames","WeakMap","CallSite","filename","create","isNative","isConstructor","isToplevel","getFileName","getLineNumber","undefined","getColumnNumber","getFunctionName","getMethodName","getTypeName","injectVirtualStackFrame","error","frames","get","set","push","expectedError","add","beginHiddenCallStack","fn","defineProperty","args","setupPrepareStackTrace","value","endHiddenCallStack","prepareStackTrace","defaultPrepareStackTrace","MIN_STACK_TRACE_LIMIT","stackTraceLimit","Math","max","stackTraceRewriter","err","trace","newTrace","isExpected","has","status","i","length","name","unshift","join"],"sources":["../../src/errors/rewrite-stack-trace.ts"],"sourcesContent":["/**\n * This file uses the internal V8 Stack Trace API (https://v8.dev/docs/stack-trace-api)\n * to provide utilities to rewrite the stack trace.\n * When this API is not present, all the functions in this file become noops.\n *\n * beginHiddenCallStack(fn) and endHiddenCallStack(fn) wrap their parameter to\n * mark an hidden portion of the stack trace. The function passed to\n * beginHiddenCallStack is the first hidden function, while the function passed\n * to endHiddenCallStack is the first shown function.\n *\n * When an error is thrown _outside_ of the hidden zone, everything between\n * beginHiddenCallStack and endHiddenCallStack will not be shown.\n * If an error is thrown _inside_ the hidden zone, then the whole stack trace\n * will be visible: this is to avoid hiding real bugs.\n * However, if an error inside the hidden zone is expected, it can be marked\n * with the expectedError(error) function to keep the hidden frames hidden.\n *\n * Consider this call stack (the outer function is the bottom one):\n *\n * 1. a()\n * 2. endHiddenCallStack(b)()\n * 3. c()\n * 4. beginHiddenCallStack(d)()\n * 5. e()\n * 6. f()\n *\n * - If a() throws an error, then its shown call stack will be \"a, b, e, f\"\n * - If b() throws an error, then its shown call stack will be \"b, e, f\"\n * - If c() throws an expected error, then its shown call stack will be \"e, f\"\n * - If c() throws an unexpected error, then its shown call stack will be \"c, d, e, f\"\n * - If d() throws an expected error, then its shown call stack will be \"e, f\"\n * - If d() throws an unexpected error, then its shown call stack will be \"d, e, f\"\n * - If e() throws an error, then its shown call stack will be \"e, f\"\n *\n * Additionally, an error can inject additional \"virtual\" stack frames using the\n * injectVirtualStackFrame(error, filename) function: those are injected as a\n * replacement of the hidden frames.\n * In the example above, if we called injectVirtualStackFrame(err, \"h\") and\n * injectVirtualStackFrame(err, \"i\") on the expected error thrown by c(), its\n * shown call stack would have been \"h, i, e, f\".\n * This can be useful, for example, to report config validation errors as if they\n * were directly thrown in the config file.\n */\n\nconst ErrorToString = Function.call.bind(Error.prototype.toString);\n\nconst SUPPORTED =\n !!Error.captureStackTrace &&\n Object.getOwnPropertyDescriptor(Error, \"stackTraceLimit\")?.writable === true;\n\nconst START_HIDING = \"startHiding - secret - don't use this - v1\";\nconst STOP_HIDING = \"stopHiding - secret - don't use this - v1\";\n\ntype CallSite = NodeJS.CallSite;\n\nconst expectedErrors = new WeakSet();\nconst virtualFrames = new WeakMap();\n\nfunction CallSite(filename: string): CallSite {\n // We need to use a prototype otherwise it breaks source-map-support's internals\n return Object.create({\n isNative: () => false,\n isConstructor: () => false,\n isToplevel: () => true,\n getFileName: () => filename,\n getLineNumber: () => undefined,\n getColumnNumber: () => undefined,\n getFunctionName: () => undefined,\n getMethodName: () => undefined,\n getTypeName: () => undefined,\n toString: () => filename,\n } as CallSite);\n}\n\nexport function injectVirtualStackFrame(error: Error, filename: string) {\n if (!SUPPORTED) return;\n\n let frames = virtualFrames.get(error);\n if (!frames) virtualFrames.set(error, (frames = []));\n frames.push(CallSite(filename));\n\n return error;\n}\n\nexport function expectedError(error: Error) {\n if (!SUPPORTED) return;\n expectedErrors.add(error);\n return error;\n}\n\nexport function beginHiddenCallStack(\n fn: (...args: A) => R,\n) {\n if (!SUPPORTED) return fn;\n\n return Object.defineProperty(\n function (...args: A) {\n setupPrepareStackTrace();\n return fn(...args);\n },\n \"name\",\n { value: STOP_HIDING },\n );\n}\n\nexport function endHiddenCallStack(\n fn: (...args: A) => R,\n) {\n if (!SUPPORTED) return fn;\n\n return Object.defineProperty(\n function (...args: A) {\n return fn(...args);\n },\n \"name\",\n { value: START_HIDING },\n );\n}\n\nfunction setupPrepareStackTrace() {\n // @ts-expect-error This function is a singleton\n // eslint-disable-next-line no-func-assign\n setupPrepareStackTrace = () => {};\n\n const { prepareStackTrace = defaultPrepareStackTrace } = Error;\n\n // We add some extra frames to Error.stackTraceLimit, so that we can\n // always show some useful frames even after deleting ours.\n // STACK_TRACE_LIMIT_DELTA should be around the maximum expected number\n // of internal frames, and not too big because capturing the stack trace\n // is slow (this is why Error.stackTraceLimit does not default to Infinity!).\n // Increase it if needed.\n // However, we only do it if the user did not explicitly set it to 0.\n const MIN_STACK_TRACE_LIMIT = 50;\n Error.stackTraceLimit &&= Math.max(\n Error.stackTraceLimit,\n MIN_STACK_TRACE_LIMIT,\n );\n\n Error.prepareStackTrace = function stackTraceRewriter(err, trace) {\n let newTrace = [];\n\n const isExpected = expectedErrors.has(err);\n let status: \"showing\" | \"hiding\" | \"unknown\" = isExpected\n ? \"hiding\"\n : \"unknown\";\n for (let i = 0; i < trace.length; i++) {\n const name = trace[i].getFunctionName();\n if (name === START_HIDING) {\n status = \"hiding\";\n } else if (name === STOP_HIDING) {\n if (status === \"hiding\") {\n status = \"showing\";\n if (virtualFrames.has(err)) {\n newTrace.unshift(...virtualFrames.get(err));\n }\n } else if (status === \"unknown\") {\n // Unexpected internal error, show the full stack trace\n newTrace = trace;\n break;\n }\n } else if (status !== \"hiding\") {\n newTrace.push(trace[i]);\n }\n }\n\n return prepareStackTrace(err, newTrace);\n };\n}\n\nfunction defaultPrepareStackTrace(err: Error, trace: CallSite[]) {\n if (trace.length === 0) return ErrorToString(err);\n return `${ErrorToString(err)}\\n at ${trace.join(\"\\n at \")}`;\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/gensync-utils/async.js b/node_modules/@babel/core/lib/gensync-utils/async.js index 1a37dc25d79f..9e00fde8b5f4 100644 --- a/node_modules/@babel/core/lib/gensync-utils/async.js +++ b/node_modules/@babel/core/lib/gensync-utils/async.js @@ -20,13 +20,10 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar const runGenerator = _gensync()(function* (item) { return yield* item; }); - -const isAsync = _gensync()({ +const isAsync = exports.isAsync = _gensync()({ sync: () => false, errback: cb => cb(null, true) }); - -exports.isAsync = isAsync; function maybeAsync(fn, message) { return _gensync()({ sync(...args) { @@ -50,7 +47,6 @@ const withKind = _gensync()({ }; }() }); - function forwardAsync(action, cb) { const g = _gensync()(action); return withKind(kind => { @@ -58,8 +54,7 @@ function forwardAsync(action, cb) { return cb(adapted); }); } - -const onFirstPause = _gensync()({ +const onFirstPause = exports.onFirstPause = _gensync()({ name: "onFirstPause", arity: 2, sync: function (item) { @@ -76,9 +71,7 @@ const onFirstPause = _gensync()({ } } }); - -exports.onFirstPause = onFirstPause; -const waitFor = _gensync()({ +const waitFor = exports.waitFor = _gensync()({ sync: x => x, async: function () { var _ref2 = _asyncToGenerator(function* (x) { @@ -89,7 +82,6 @@ const waitFor = _gensync()({ }; }() }); -exports.waitFor = waitFor; function isThenable(val) { return !!val && (typeof val === "object" || typeof val === "function") && !!val.then && typeof val.then === "function"; } diff --git a/node_modules/@babel/core/lib/gensync-utils/async.js.map b/node_modules/@babel/core/lib/gensync-utils/async.js.map index b0a7b7528770..8c7d46ccaf70 100644 --- a/node_modules/@babel/core/lib/gensync-utils/async.js.map +++ b/node_modules/@babel/core/lib/gensync-utils/async.js.map @@ -1 +1 @@ -{"version":3,"names":["runGenerator","gensync","item","isAsync","sync","errback","cb","maybeAsync","fn","message","args","result","apply","isThenable","Error","async","Promise","resolve","withKind","forwardAsync","action","g","kind","adapted","onFirstPause","name","arity","firstPause","completed","err","value","waitFor","x","val","then"],"sources":["../../src/gensync-utils/async.ts"],"sourcesContent":["import gensync, { type Gensync, type Handler, type Callback } from \"gensync\";\n\ntype MaybePromise = T | Promise;\n\nconst runGenerator: {\n sync(gen: Handler): Return;\n async(gen: Handler): Promise;\n errback(gen: Handler, cb: Callback): void;\n} = gensync(function* (item: Handler): Handler {\n return yield* item;\n});\n\n// This Gensync returns true if the current execution context is\n// asynchronous, otherwise it returns false.\nexport const isAsync = gensync({\n sync: () => false,\n errback: cb => cb(null, true),\n});\n\n// This function wraps any functions (which could be either synchronous or\n// asynchronous) with a Gensync. If the wrapped function returns a promise\n// but the current execution context is synchronous, it will throw the\n// provided error.\n// This is used to handle user-provided functions which could be asynchronous.\nexport function maybeAsync(\n fn: (...args: Args) => Return,\n message: string,\n): Gensync {\n return gensync({\n sync(...args) {\n const result = fn.apply(this, args) as Return;\n if (isThenable(result)) throw new Error(message);\n return result;\n },\n async(...args) {\n return Promise.resolve(fn.apply(this, args));\n },\n });\n}\n\nconst withKind = gensync({\n sync: cb => cb(\"sync\"),\n async: async cb => cb(\"async\"),\n}) as (cb: (kind: \"sync\" | \"async\") => MaybePromise) => Handler;\n\n// This function wraps a generator (or a Gensync) into another function which,\n// when called, will run the provided generator in a sync or async way, depending\n// on the execution context where this forwardAsync function is called.\n// This is useful, for example, when passing a callback to a function which isn't\n// aware of gensync, but it only knows about synchronous and asynchronous functions.\n// An example is cache.using, which being exposed to the user must be as simple as\n// possible:\n// yield* forwardAsync(gensyncFn, wrappedFn =>\n// cache.using(x => {\n// // Here we don't know about gensync. wrappedFn is a\n// // normal sync or async function\n// return wrappedFn(x);\n// })\n// )\nexport function forwardAsync(\n action: (...args: Args) => Handler,\n cb: (\n adapted: (...args: Args) => MaybePromise,\n ) => MaybePromise,\n): Handler {\n const g = gensync(action);\n return withKind(kind => {\n const adapted = g[kind];\n return cb(adapted);\n });\n}\n\n// If the given generator is executed asynchronously, the first time that it\n// is paused (i.e. When it yields a gensync generator which can't be run\n// synchronously), call the \"firstPause\" callback.\nexport const onFirstPause = gensync<\n [gen: Handler, firstPause: () => void],\n unknown\n>({\n name: \"onFirstPause\",\n arity: 2,\n sync: function (item) {\n return runGenerator.sync(item);\n },\n errback: function (item, firstPause, cb) {\n let completed = false;\n\n runGenerator.errback(item, (err, value) => {\n completed = true;\n cb(err, value);\n });\n\n if (!completed) {\n firstPause();\n }\n },\n}) as (gen: Handler, firstPause: () => void) => Handler;\n\n// Wait for the given promise to be resolved\nexport const waitFor = gensync({\n sync: x => x,\n async: async x => x,\n}) as (p: T | Promise) => Handler;\n\nexport function isThenable(val: any): val is PromiseLike {\n return (\n !!val &&\n (typeof val === \"object\" || typeof val === \"function\") &&\n !!val.then &&\n typeof val.then === \"function\"\n );\n}\n"],"mappings":";;;;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAA6E;AAAA;AAI7E,MAAMA,YAIL,GAAGC,UAAO,CAAC,WAAWC,IAAkB,EAAgB;EACvD,OAAO,OAAOA,IAAI;AACpB,CAAC,CAAC;;AAIK,MAAMC,OAAO,GAAGF,UAAO,CAAC;EAC7BG,IAAI,EAAE,MAAM,KAAK;EACjBC,OAAO,EAAEC,EAAE,IAAIA,EAAE,CAAC,IAAI,EAAE,IAAI;AAC9B,CAAC,CAAC;;AAAC;AAOI,SAASC,UAAU,CACxBC,EAA6B,EAC7BC,OAAe,EACQ;EACvB,OAAOR,UAAO,CAAC;IACbG,IAAI,CAAC,GAAGM,IAAI,EAAE;MACZ,MAAMC,MAAM,GAAGH,EAAE,CAACI,KAAK,CAAC,IAAI,EAAEF,IAAI,CAAW;MAC7C,IAAIG,UAAU,CAACF,MAAM,CAAC,EAAE,MAAM,IAAIG,KAAK,CAACL,OAAO,CAAC;MAChD,OAAOE,MAAM;IACf,CAAC;IACDI,KAAK,CAAC,GAAGL,IAAI,EAAE;MACb,OAAOM,OAAO,CAACC,OAAO,CAACT,EAAE,CAACI,KAAK,CAAC,IAAI,EAAEF,IAAI,CAAC,CAAC;IAC9C;EACF,CAAC,CAAC;AACJ;AAEA,MAAMQ,QAAQ,GAAGjB,UAAO,CAAC;EACvBG,IAAI,EAAEE,EAAE,IAAIA,EAAE,CAAC,MAAM,CAAC;EACtBS,KAAK;IAAA,6BAAE,WAAMT,EAAE;MAAA,OAAIA,EAAE,CAAC,OAAO,CAAC;IAAA;IAAA;MAAA;IAAA;EAAA;AAChC,CAAC,CAAuE;;AAgBjE,SAASa,YAAY,CAC1BC,MAA0C,EAC1Cd,EAEyB,EACR;EACjB,MAAMe,CAAC,GAAGpB,UAAO,CAACmB,MAAM,CAAC;EACzB,OAAOF,QAAQ,CAACI,IAAI,IAAI;IACtB,MAAMC,OAAO,GAAGF,CAAC,CAACC,IAAI,CAAC;IACvB,OAAOhB,EAAE,CAACiB,OAAO,CAAC;EACpB,CAAC,CAAC;AACJ;;AAKO,MAAMC,YAAY,GAAGvB,UAAO,CAGjC;EACAwB,IAAI,EAAE,cAAc;EACpBC,KAAK,EAAE,CAAC;EACRtB,IAAI,EAAE,UAAUF,IAAI,EAAE;IACpB,OAAOF,YAAY,CAACI,IAAI,CAACF,IAAI,CAAC;EAChC,CAAC;EACDG,OAAO,EAAE,UAAUH,IAAI,EAAEyB,UAAU,EAAErB,EAAE,EAAE;IACvC,IAAIsB,SAAS,GAAG,KAAK;IAErB5B,YAAY,CAACK,OAAO,CAACH,IAAI,EAAE,CAAC2B,GAAG,EAAEC,KAAK,KAAK;MACzCF,SAAS,GAAG,IAAI;MAChBtB,EAAE,CAACuB,GAAG,EAAEC,KAAK,CAAC;IAChB,CAAC,CAAC;IAEF,IAAI,CAACF,SAAS,EAAE;MACdD,UAAU,EAAE;IACd;EACF;AACF,CAAC,CAA+D;;AAAC;AAG1D,MAAMI,OAAO,GAAG9B,UAAO,CAAC;EAC7BG,IAAI,EAAE4B,CAAC,IAAIA,CAAC;EACZjB,KAAK;IAAA,8BAAE,WAAMiB,CAAC;MAAA,OAAIA,CAAC;IAAA;IAAA;MAAA;IAAA;EAAA;AACrB,CAAC,CAAyC;AAAC;AAEpC,SAASnB,UAAU,CAAUoB,GAAQ,EAAyB;EACnE,OACE,CAAC,CAACA,GAAG,KACJ,OAAOA,GAAG,KAAK,QAAQ,IAAI,OAAOA,GAAG,KAAK,UAAU,CAAC,IACtD,CAAC,CAACA,GAAG,CAACC,IAAI,IACV,OAAOD,GAAG,CAACC,IAAI,KAAK,UAAU;AAElC;AAAC"} \ No newline at end of file +{"version":3,"names":["_gensync","data","require","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","runGenerator","gensync","item","isAsync","exports","sync","errback","cb","maybeAsync","message","result","isThenable","Error","async","withKind","_ref","_x","forwardAsync","action","g","kind","adapted","onFirstPause","name","arity","firstPause","completed","waitFor","x","_ref2","_x2","val"],"sources":["../../src/gensync-utils/async.ts"],"sourcesContent":["import gensync, { type Gensync, type Handler, type Callback } from \"gensync\";\n\ntype MaybePromise = T | Promise;\n\nconst runGenerator: {\n sync(gen: Handler): Return;\n async(gen: Handler): Promise;\n errback(gen: Handler, cb: Callback): void;\n} = gensync(function* (item: Handler): Handler {\n return yield* item;\n});\n\n// This Gensync returns true if the current execution context is\n// asynchronous, otherwise it returns false.\nexport const isAsync = gensync({\n sync: () => false,\n errback: cb => cb(null, true),\n});\n\n// This function wraps any functions (which could be either synchronous or\n// asynchronous) with a Gensync. If the wrapped function returns a promise\n// but the current execution context is synchronous, it will throw the\n// provided error.\n// This is used to handle user-provided functions which could be asynchronous.\nexport function maybeAsync(\n fn: (...args: Args) => Return,\n message: string,\n): Gensync {\n return gensync({\n sync(...args) {\n const result = fn.apply(this, args);\n if (isThenable(result)) throw new Error(message);\n return result;\n },\n async(...args) {\n return Promise.resolve(fn.apply(this, args));\n },\n });\n}\n\nconst withKind = gensync({\n sync: cb => cb(\"sync\"),\n async: async cb => cb(\"async\"),\n}) as (cb: (kind: \"sync\" | \"async\") => MaybePromise) => Handler;\n\n// This function wraps a generator (or a Gensync) into another function which,\n// when called, will run the provided generator in a sync or async way, depending\n// on the execution context where this forwardAsync function is called.\n// This is useful, for example, when passing a callback to a function which isn't\n// aware of gensync, but it only knows about synchronous and asynchronous functions.\n// An example is cache.using, which being exposed to the user must be as simple as\n// possible:\n// yield* forwardAsync(gensyncFn, wrappedFn =>\n// cache.using(x => {\n// // Here we don't know about gensync. wrappedFn is a\n// // normal sync or async function\n// return wrappedFn(x);\n// })\n// )\nexport function forwardAsync(\n action: (...args: Args) => Handler,\n cb: (\n adapted: (...args: Args) => MaybePromise,\n ) => MaybePromise,\n): Handler {\n const g = gensync(action);\n return withKind(kind => {\n const adapted = g[kind];\n return cb(adapted);\n });\n}\n\n// If the given generator is executed asynchronously, the first time that it\n// is paused (i.e. When it yields a gensync generator which can't be run\n// synchronously), call the \"firstPause\" callback.\nexport const onFirstPause = gensync<\n [gen: Handler, firstPause: () => void],\n unknown\n>({\n name: \"onFirstPause\",\n arity: 2,\n sync: function (item) {\n return runGenerator.sync(item);\n },\n errback: function (item, firstPause, cb) {\n let completed = false;\n\n runGenerator.errback(item, (err, value) => {\n completed = true;\n cb(err, value);\n });\n\n if (!completed) {\n firstPause();\n }\n },\n}) as (gen: Handler, firstPause: () => void) => Handler;\n\n// Wait for the given promise to be resolved\nexport const waitFor = gensync({\n sync: x => x,\n async: async x => x,\n}) as (p: T | Promise) => Handler;\n\nexport function isThenable(val: any): val is PromiseLike {\n return (\n !!val &&\n (typeof val === \"object\" || typeof val === \"function\") &&\n !!val.then &&\n typeof val.then === \"function\"\n );\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAAA,SAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,QAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAA6E,SAAAE,mBAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,EAAAC,GAAA,EAAAC,GAAA,cAAAC,IAAA,GAAAP,GAAA,CAAAK,GAAA,EAAAC,GAAA,OAAAE,KAAA,GAAAD,IAAA,CAAAC,KAAA,WAAAC,KAAA,IAAAP,MAAA,CAAAO,KAAA,iBAAAF,IAAA,CAAAG,IAAA,IAAAT,OAAA,CAAAO,KAAA,YAAAG,OAAA,CAAAV,OAAA,CAAAO,KAAA,EAAAI,IAAA,CAAAT,KAAA,EAAAC,MAAA;AAAA,SAAAS,kBAAAC,EAAA,6BAAAC,IAAA,SAAAC,IAAA,GAAAC,SAAA,aAAAN,OAAA,WAAAV,OAAA,EAAAC,MAAA,QAAAF,GAAA,GAAAc,EAAA,CAAAI,KAAA,CAAAH,IAAA,EAAAC,IAAA,YAAAb,MAAAK,KAAA,IAAAT,kBAAA,CAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,UAAAI,KAAA,cAAAJ,OAAAe,GAAA,IAAApB,kBAAA,CAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,WAAAe,GAAA,KAAAhB,KAAA,CAAAiB,SAAA;AAI7E,MAAMC,YAIL,GAAGC,SAAMA,CAAC,CAAC,WAAWC,IAAkB,EAAgB;EACvD,OAAO,OAAOA,IAAI;AACpB,CAAC,CAAC;AAIK,MAAMC,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAGF,SAAMA,CAAC,CAAC;EAC7BI,IAAI,EAAEA,CAAA,KAAM,KAAK;EACjBC,OAAO,EAAEC,EAAE,IAAIA,EAAE,CAAC,IAAI,EAAE,IAAI;AAC9B,CAAC,CAAC;AAOK,SAASC,UAAUA,CACxBf,EAA6B,EAC7BgB,OAAe,EACQ;EACvB,OAAOR,SAAMA,CAAC,CAAC;IACbI,IAAIA,CAAC,GAAGV,IAAI,EAAE;MACZ,MAAMe,MAAM,GAAGjB,EAAE,CAACI,KAAK,CAAC,IAAI,EAAEF,IAAI,CAAC;MACnC,IAAIgB,UAAU,CAACD,MAAM,CAAC,EAAE,MAAM,IAAIE,KAAK,CAACH,OAAO,CAAC;MAChD,OAAOC,MAAM;IACf,CAAC;IACDG,KAAKA,CAAC,GAAGlB,IAAI,EAAE;MACb,OAAOL,OAAO,CAACV,OAAO,CAACa,EAAE,CAACI,KAAK,CAAC,IAAI,EAAEF,IAAI,CAAC,CAAC;IAC9C;EACF,CAAC,CAAC;AACJ;AAEA,MAAMmB,QAAQ,GAAGb,SAAMA,CAAC,CAAC;EACvBI,IAAI,EAAEE,EAAE,IAAIA,EAAE,CAAC,MAAM,CAAC;EACtBM,KAAK;IAAA,IAAAE,IAAA,GAAAvB,iBAAA,CAAE,WAAMe,EAAE;MAAA,OAAIA,EAAE,CAAC,OAAO,CAAC;IAAA;IAAA,gBAAAM,MAAAG,EAAA;MAAA,OAAAD,IAAA,CAAAlB,KAAA,OAAAD,SAAA;IAAA;EAAA;AAChC,CAAC,CAAuE;AAgBjE,SAASqB,YAAYA,CAC1BC,MAA0C,EAC1CX,EAEyB,EACR;EACjB,MAAMY,CAAC,GAAGlB,SAAMA,CAAC,CAACiB,MAAM,CAAC;EACzB,OAAOJ,QAAQ,CAACM,IAAI,IAAI;IACtB,MAAMC,OAAO,GAAGF,CAAC,CAACC,IAAI,CAAC;IACvB,OAAOb,EAAE,CAACc,OAAO,CAAC;EACpB,CAAC,CAAC;AACJ;AAKO,MAAMC,YAAY,GAAAlB,OAAA,CAAAkB,YAAA,GAAGrB,SAAMA,CAAC,CAGjC;EACAsB,IAAI,EAAE,cAAc;EACpBC,KAAK,EAAE,CAAC;EACRnB,IAAI,EAAE,SAAAA,CAAUH,IAAI,EAAE;IACpB,OAAOF,YAAY,CAACK,IAAI,CAACH,IAAI,CAAC;EAChC,CAAC;EACDI,OAAO,EAAE,SAAAA,CAAUJ,IAAI,EAAEuB,UAAU,EAAElB,EAAE,EAAE;IACvC,IAAImB,SAAS,GAAG,KAAK;IAErB1B,YAAY,CAACM,OAAO,CAACJ,IAAI,EAAE,CAACJ,GAAG,EAAEX,KAAK,KAAK;MACzCuC,SAAS,GAAG,IAAI;MAChBnB,EAAE,CAACT,GAAG,EAAEX,KAAK,CAAC;IAChB,CAAC,CAAC;IAEF,IAAI,CAACuC,SAAS,EAAE;MACdD,UAAU,CAAC,CAAC;IACd;EACF;AACF,CAAC,CAA+D;AAGzD,MAAME,OAAO,GAAAvB,OAAA,CAAAuB,OAAA,GAAG1B,SAAMA,CAAC,CAAC;EAC7BI,IAAI,EAAEuB,CAAC,IAAIA,CAAC;EACZf,KAAK;IAAA,IAAAgB,KAAA,GAAArC,iBAAA,CAAE,WAAMoC,CAAC;MAAA,OAAIA,CAAC;IAAA;IAAA,gBAAAf,MAAAiB,GAAA;MAAA,OAAAD,KAAA,CAAAhC,KAAA,OAAAD,SAAA;IAAA;EAAA;AACrB,CAAC,CAAyC;AAEnC,SAASe,UAAUA,CAAUoB,GAAQ,EAAyB;EACnE,OACE,CAAC,CAACA,GAAG,KACJ,OAAOA,GAAG,KAAK,QAAQ,IAAI,OAAOA,GAAG,KAAK,UAAU,CAAC,IACtD,CAAC,CAACA,GAAG,CAACxC,IAAI,IACV,OAAOwC,GAAG,CAACxC,IAAI,KAAK,UAAU;AAElC;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/gensync-utils/fs.js b/node_modules/@babel/core/lib/gensync-utils/fs.js index db7f3d1d39db..b842df84d9d8 100644 --- a/node_modules/@babel/core/lib/gensync-utils/fs.js +++ b/node_modules/@babel/core/lib/gensync-utils/fs.js @@ -18,16 +18,14 @@ function _gensync() { }; return data; } -const readFile = _gensync()({ +const readFile = exports.readFile = _gensync()({ sync: _fs().readFileSync, errback: _fs().readFile }); -exports.readFile = readFile; -const stat = _gensync()({ +const stat = exports.stat = _gensync()({ sync: _fs().statSync, errback: _fs().stat }); -exports.stat = stat; 0 && 0; //# sourceMappingURL=fs.js.map diff --git a/node_modules/@babel/core/lib/gensync-utils/fs.js.map b/node_modules/@babel/core/lib/gensync-utils/fs.js.map index 788a14fa6428..403a074107cb 100644 --- a/node_modules/@babel/core/lib/gensync-utils/fs.js.map +++ b/node_modules/@babel/core/lib/gensync-utils/fs.js.map @@ -1 +1 @@ -{"version":3,"names":["readFile","gensync","sync","fs","readFileSync","errback","stat","statSync"],"sources":["../../src/gensync-utils/fs.ts"],"sourcesContent":["import fs from \"fs\";\nimport gensync from \"gensync\";\n\nexport const readFile = gensync<[filepath: string, encoding: \"utf8\"], string>({\n sync: fs.readFileSync,\n errback: fs.readFile,\n});\n\nexport const stat = gensync({\n sync: fs.statSync,\n errback: fs.stat,\n});\n"],"mappings":";;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEO,MAAMA,QAAQ,GAAGC,UAAO,CAA+C;EAC5EC,IAAI,EAAEC,KAAE,CAACC,YAAY;EACrBC,OAAO,EAAEF,KAAE,CAACH;AACd,CAAC,CAAC;AAAC;AAEI,MAAMM,IAAI,GAAGL,UAAO,CAAC;EAC1BC,IAAI,EAAEC,KAAE,CAACI,QAAQ;EACjBF,OAAO,EAAEF,KAAE,CAACG;AACd,CAAC,CAAC;AAAC;AAAA"} \ No newline at end of file +{"version":3,"names":["_fs","data","require","_gensync","readFile","exports","gensync","sync","fs","readFileSync","errback","stat","statSync"],"sources":["../../src/gensync-utils/fs.ts"],"sourcesContent":["import fs from \"fs\";\nimport gensync from \"gensync\";\n\nexport const readFile = gensync<[filepath: string, encoding: \"utf8\"], string>({\n sync: fs.readFileSync,\n errback: fs.readFile,\n});\n\nexport const stat = gensync({\n sync: fs.statSync,\n errback: fs.stat,\n});\n"],"mappings":";;;;;;AAAA,SAAAA,IAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,GAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAE,SAAA;EAAA,MAAAF,IAAA,GAAAC,OAAA;EAAAC,QAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEO,MAAMG,QAAQ,GAAAC,OAAA,CAAAD,QAAA,GAAGE,SAAMA,CAAC,CAA+C;EAC5EC,IAAI,EAAEC,IAACA,CAAC,CAACC,YAAY;EACrBC,OAAO,EAAEF,IAACA,CAAC,CAACJ;AACd,CAAC,CAAC;AAEK,MAAMO,IAAI,GAAAN,OAAA,CAAAM,IAAA,GAAGL,SAAMA,CAAC,CAAC;EAC1BC,IAAI,EAAEC,IAACA,CAAC,CAACI,QAAQ;EACjBF,OAAO,EAAEF,IAACA,CAAC,CAACG;AACd,CAAC,CAAC;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/gensync-utils/functional.js b/node_modules/@babel/core/lib/gensync-utils/functional.js index db849596b0ee..d7f77554fb0b 100644 --- a/node_modules/@babel/core/lib/gensync-utils/functional.js +++ b/node_modules/@babel/core/lib/gensync-utils/functional.js @@ -4,28 +4,53 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.once = once; -var _async = require("./async"); +var _async = require("./async.js"); function once(fn) { let result; let resultP; + let promiseReferenced = false; return function* () { - if (result) return result; - if (!(yield* (0, _async.isAsync)())) return result = yield* fn(); - if (resultP) return yield* (0, _async.waitFor)(resultP); - let resolve, reject; - resultP = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - try { - result = yield* fn(); - resultP = null; - resolve(result); - return result; - } catch (error) { - reject(error); - throw error; + if (!result) { + if (resultP) { + promiseReferenced = true; + return yield* (0, _async.waitFor)(resultP); + } + if (!(yield* (0, _async.isAsync)())) { + try { + result = { + ok: true, + value: yield* fn() + }; + } catch (error) { + result = { + ok: false, + value: error + }; + } + } else { + let resolve, reject; + resultP = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + try { + result = { + ok: true, + value: yield* fn() + }; + resultP = null; + if (promiseReferenced) resolve(result.value); + } catch (error) { + result = { + ok: false, + value: error + }; + resultP = null; + if (promiseReferenced) reject(error); + } + } } + if (result.ok) return result.value;else throw result.value; }; } 0 && 0; diff --git a/node_modules/@babel/core/lib/gensync-utils/functional.js.map b/node_modules/@babel/core/lib/gensync-utils/functional.js.map index cfa6ed0240a3..3841d0a6986b 100644 --- a/node_modules/@babel/core/lib/gensync-utils/functional.js.map +++ b/node_modules/@babel/core/lib/gensync-utils/functional.js.map @@ -1 +1 @@ -{"version":3,"names":["once","fn","result","resultP","isAsync","waitFor","resolve","reject","Promise","res","rej","error"],"sources":["../../src/gensync-utils/functional.ts"],"sourcesContent":["import type { Handler } from \"gensync\";\n\nimport { isAsync, waitFor } from \"./async\";\n\nexport function once(fn: () => Handler): () => Handler {\n let result: R;\n let resultP: Promise;\n return function* () {\n if (result) return result;\n if (!(yield* isAsync())) return (result = yield* fn());\n if (resultP) return yield* waitFor(resultP);\n\n let resolve: (result: R) => void, reject: (error: unknown) => void;\n resultP = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n try {\n result = yield* fn();\n // Avoid keeping the promise around\n // now that we have the result.\n resultP = null;\n resolve(result);\n return result;\n } catch (error) {\n reject(error);\n throw error;\n }\n };\n}\n"],"mappings":";;;;;;AAEA;AAEO,SAASA,IAAI,CAAIC,EAAoB,EAAoB;EAC9D,IAAIC,MAAS;EACb,IAAIC,OAAmB;EACvB,OAAO,aAAa;IAClB,IAAID,MAAM,EAAE,OAAOA,MAAM;IACzB,IAAI,EAAE,OAAO,IAAAE,cAAO,GAAE,CAAC,EAAE,OAAQF,MAAM,GAAG,OAAOD,EAAE,EAAE;IACrD,IAAIE,OAAO,EAAE,OAAO,OAAO,IAAAE,cAAO,EAACF,OAAO,CAAC;IAE3C,IAAIG,OAA4B,EAAEC,MAAgC;IAClEJ,OAAO,GAAG,IAAIK,OAAO,CAAC,CAACC,GAAG,EAAEC,GAAG,KAAK;MAClCJ,OAAO,GAAGG,GAAG;MACbF,MAAM,GAAGG,GAAG;IACd,CAAC,CAAC;IAEF,IAAI;MACFR,MAAM,GAAG,OAAOD,EAAE,EAAE;MAGpBE,OAAO,GAAG,IAAI;MACdG,OAAO,CAACJ,MAAM,CAAC;MACf,OAAOA,MAAM;IACf,CAAC,CAAC,OAAOS,KAAK,EAAE;MACdJ,MAAM,CAACI,KAAK,CAAC;MACb,MAAMA,KAAK;IACb;EACF,CAAC;AACH;AAAC"} \ No newline at end of file +{"version":3,"names":["_async","require","once","fn","result","resultP","promiseReferenced","waitFor","isAsync","ok","value","error","resolve","reject","Promise","res","rej"],"sources":["../../src/gensync-utils/functional.ts"],"sourcesContent":["import type { Handler } from \"gensync\";\n\nimport { isAsync, waitFor } from \"./async.ts\";\n\nexport function once(fn: () => Handler): () => Handler {\n let result: { ok: true; value: R } | { ok: false; value: unknown };\n let resultP: Promise;\n let promiseReferenced = false;\n return function* () {\n if (!result) {\n if (resultP) {\n promiseReferenced = true;\n return yield* waitFor(resultP);\n }\n\n if (!(yield* isAsync())) {\n try {\n result = { ok: true, value: yield* fn() };\n } catch (error) {\n result = { ok: false, value: error };\n }\n } else {\n let resolve: (result: R) => void, reject: (error: unknown) => void;\n resultP = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n try {\n result = { ok: true, value: yield* fn() };\n // Avoid keeping the promise around\n // now that we have the result.\n resultP = null;\n // We only resolve/reject the promise if it has been actually\n // referenced. If there are no listeners we can forget about it.\n // In the reject case, this avoid uncatchable unhandledRejection\n // events.\n if (promiseReferenced) resolve(result.value);\n } catch (error) {\n result = { ok: false, value: error };\n resultP = null;\n if (promiseReferenced) reject(error);\n }\n }\n }\n\n if (result.ok) return result.value;\n else throw result.value;\n };\n}\n"],"mappings":";;;;;;AAEA,IAAAA,MAAA,GAAAC,OAAA;AAEO,SAASC,IAAIA,CAAIC,EAAoB,EAAoB;EAC9D,IAAIC,MAA8D;EAClE,IAAIC,OAAmB;EACvB,IAAIC,iBAAiB,GAAG,KAAK;EAC7B,OAAO,aAAa;IAClB,IAAI,CAACF,MAAM,EAAE;MACX,IAAIC,OAAO,EAAE;QACXC,iBAAiB,GAAG,IAAI;QACxB,OAAO,OAAO,IAAAC,cAAO,EAACF,OAAO,CAAC;MAChC;MAEA,IAAI,EAAE,OAAO,IAAAG,cAAO,EAAC,CAAC,CAAC,EAAE;QACvB,IAAI;UACFJ,MAAM,GAAG;YAAEK,EAAE,EAAE,IAAI;YAAEC,KAAK,EAAE,OAAOP,EAAE,CAAC;UAAE,CAAC;QAC3C,CAAC,CAAC,OAAOQ,KAAK,EAAE;UACdP,MAAM,GAAG;YAAEK,EAAE,EAAE,KAAK;YAAEC,KAAK,EAAEC;UAAM,CAAC;QACtC;MACF,CAAC,MAAM;QACL,IAAIC,OAA4B,EAAEC,MAAgC;QAClER,OAAO,GAAG,IAAIS,OAAO,CAAC,CAACC,GAAG,EAAEC,GAAG,KAAK;UAClCJ,OAAO,GAAGG,GAAG;UACbF,MAAM,GAAGG,GAAG;QACd,CAAC,CAAC;QAEF,IAAI;UACFZ,MAAM,GAAG;YAAEK,EAAE,EAAE,IAAI;YAAEC,KAAK,EAAE,OAAOP,EAAE,CAAC;UAAE,CAAC;UAGzCE,OAAO,GAAG,IAAI;UAKd,IAAIC,iBAAiB,EAAEM,OAAO,CAACR,MAAM,CAACM,KAAK,CAAC;QAC9C,CAAC,CAAC,OAAOC,KAAK,EAAE;UACdP,MAAM,GAAG;YAAEK,EAAE,EAAE,KAAK;YAAEC,KAAK,EAAEC;UAAM,CAAC;UACpCN,OAAO,GAAG,IAAI;UACd,IAAIC,iBAAiB,EAAEO,MAAM,CAACF,KAAK,CAAC;QACtC;MACF;IACF;IAEA,IAAIP,MAAM,CAACK,EAAE,EAAE,OAAOL,MAAM,CAACM,KAAK,CAAC,KAC9B,MAAMN,MAAM,CAACM,KAAK;EACzB,CAAC;AACH;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/index.js b/node_modules/@babel/core/lib/index.js index cd6d14890a42..f8bcd9d04bd4 100644 --- a/node_modules/@babel/core/lib/index.js +++ b/node_modules/@babel/core/lib/index.js @@ -10,8 +10,6 @@ Object.defineProperty(exports, "File", { return _file.default; } }); -exports.OptionManager = void 0; -exports.Plugin = Plugin; Object.defineProperty(exports, "buildExternalHelpers", { enumerable: true, get: function () { @@ -21,19 +19,19 @@ Object.defineProperty(exports, "buildExternalHelpers", { Object.defineProperty(exports, "createConfigItem", { enumerable: true, get: function () { - return _config.createConfigItem; + return _index2.createConfigItem; } }); Object.defineProperty(exports, "createConfigItemAsync", { enumerable: true, get: function () { - return _config.createConfigItemAsync; + return _index2.createConfigItemAsync; } }); Object.defineProperty(exports, "createConfigItemSync", { enumerable: true, get: function () { - return _config.createConfigItemSync; + return _index2.createConfigItemSync; } }); Object.defineProperty(exports, "getEnv", { @@ -45,37 +43,37 @@ Object.defineProperty(exports, "getEnv", { Object.defineProperty(exports, "loadOptions", { enumerable: true, get: function () { - return _config.loadOptions; + return _index2.loadOptions; } }); Object.defineProperty(exports, "loadOptionsAsync", { enumerable: true, get: function () { - return _config.loadOptionsAsync; + return _index2.loadOptionsAsync; } }); Object.defineProperty(exports, "loadOptionsSync", { enumerable: true, get: function () { - return _config.loadOptionsSync; + return _index2.loadOptionsSync; } }); Object.defineProperty(exports, "loadPartialConfig", { enumerable: true, get: function () { - return _config.loadPartialConfig; + return _index2.loadPartialConfig; } }); Object.defineProperty(exports, "loadPartialConfigAsync", { enumerable: true, get: function () { - return _config.loadPartialConfigAsync; + return _index2.loadPartialConfigAsync; } }); Object.defineProperty(exports, "loadPartialConfigSync", { enumerable: true, get: function () { - return _config.loadPartialConfigSync; + return _index2.loadPartialConfigSync; } }); Object.defineProperty(exports, "parse", { @@ -99,13 +97,13 @@ Object.defineProperty(exports, "parseSync", { Object.defineProperty(exports, "resolvePlugin", { enumerable: true, get: function () { - return _files.resolvePlugin; + return _index.resolvePlugin; } }); Object.defineProperty(exports, "resolvePreset", { enumerable: true, get: function () { - return _files.resolvePreset; + return _index.resolvePreset; } }); Object.defineProperty((0, exports), "template", { @@ -181,10 +179,10 @@ Object.defineProperty((0, exports), "traverse", { } }); exports.version = exports.types = void 0; -var _file = require("./transformation/file/file"); -var _buildExternalHelpers = require("./tools/build-external-helpers"); -var _files = require("./config/files"); -var _environment = require("./config/helpers/environment"); +var _file = require("./transformation/file/file.js"); +var _buildExternalHelpers = require("./tools/build-external-helpers.js"); +var _index = require("./config/files/index.js"); +var _environment = require("./config/helpers/environment.js"); function _types() { const data = require("@babel/types"); _types = function () { @@ -219,24 +217,25 @@ function _template() { }; return data; } -var _config = require("./config"); -var _transform = require("./transform"); -var _transformFile = require("./transform-file"); -var _transformAst = require("./transform-ast"); -var _parse = require("./parse"); -const version = "7.20.5"; -exports.version = version; -const DEFAULT_EXTENSIONS = Object.freeze([".js", ".jsx", ".es6", ".es", ".mjs", ".cjs"]); - -exports.DEFAULT_EXTENSIONS = DEFAULT_EXTENSIONS; -class OptionManager { - init(opts) { - return (0, _config.loadOptionsSync)(opts); - } -} -exports.OptionManager = OptionManager; -function Plugin(alias) { - throw new Error(`The (${alias}) Babel 5 plugin is being run with an unsupported Babel version.`); +var _index2 = require("./config/index.js"); +var _transform = require("./transform.js"); +var _transformFile = require("./transform-file.js"); +var _transformAst = require("./transform-ast.js"); +var _parse = require("./parse.js"); +var thisFile = require("./index.js"); +; +const version = exports.version = "7.23.9"; +const DEFAULT_EXTENSIONS = exports.DEFAULT_EXTENSIONS = Object.freeze([".js", ".jsx", ".es6", ".es", ".mjs", ".cjs"]); +; +{ + exports.OptionManager = class OptionManager { + init(opts) { + return (0, _index2.loadOptionsSync)(opts); + } + }; + exports.Plugin = function Plugin(alias) { + throw new Error(`The (${alias}) Babel 5 plugin is being run with an unsupported Babel version.`); + }; } 0 && (exports.types = exports.traverse = exports.tokTypes = exports.template = 0); diff --git a/node_modules/@babel/core/lib/index.js.map b/node_modules/@babel/core/lib/index.js.map index 140d7cc62880..fc8275222e54 100644 --- a/node_modules/@babel/core/lib/index.js.map +++ b/node_modules/@babel/core/lib/index.js.map @@ -1 +1 @@ -{"version":3,"names":["version","DEFAULT_EXTENSIONS","Object","freeze","OptionManager","init","opts","loadOptionsSync","Plugin","alias","Error"],"sources":["../src/index.ts"],"sourcesContent":["declare const PACKAGE_JSON: { name: string; version: string };\nexport const version = PACKAGE_JSON.version;\n\nexport { default as File } from \"./transformation/file/file\";\nexport type { default as PluginPass } from \"./transformation/plugin-pass\";\nexport { default as buildExternalHelpers } from \"./tools/build-external-helpers\";\nexport { resolvePlugin, resolvePreset } from \"./config/files\";\n\nexport { getEnv } from \"./config/helpers/environment\";\n\n// NOTE: Lazy re-exports aren't detected by the Node.js CJS-ESM interop.\n// These are handled by pluginInjectNodeReexportsHints in our babel.config.js\n// so that they can work well.\nexport * as types from \"@babel/types\";\nexport { tokTypes } from \"@babel/parser\";\nexport { default as traverse } from \"@babel/traverse\";\nexport { default as template } from \"@babel/template\";\n\nexport {\n createConfigItem,\n createConfigItemSync,\n createConfigItemAsync,\n} from \"./config\";\n\nexport {\n loadPartialConfig,\n loadPartialConfigSync,\n loadPartialConfigAsync,\n loadOptions,\n loadOptionsSync,\n loadOptionsAsync,\n} from \"./config\";\n\nexport type {\n CallerMetadata,\n InputOptions,\n PluginAPI,\n PluginObject,\n PresetAPI,\n PresetObject,\n} from \"./config\";\n\nexport {\n transform,\n transformSync,\n transformAsync,\n type FileResult,\n} from \"./transform\";\nexport {\n transformFile,\n transformFileSync,\n transformFileAsync,\n} from \"./transform-file\";\nexport {\n transformFromAst,\n transformFromAstSync,\n transformFromAstAsync,\n} from \"./transform-ast\";\nexport { parse, parseSync, parseAsync } from \"./parse\";\n\n/**\n * Recommended set of compilable extensions. Not used in @babel/core directly, but meant as\n * as an easy source for tooling making use of @babel/core.\n */\nexport const DEFAULT_EXTENSIONS = Object.freeze([\n \".js\",\n \".jsx\",\n \".es6\",\n \".es\",\n \".mjs\",\n \".cjs\",\n] as const);\n\n// For easier backward-compatibility, provide an API like the one we exposed in Babel 6.\nimport { loadOptionsSync } from \"./config\";\nexport class OptionManager {\n init(opts: {}) {\n return loadOptionsSync(opts);\n }\n}\n\nexport function Plugin(alias: string) {\n throw new Error(\n `The (${alias}) Babel 5 plugin is being run with an unsupported Babel version.`,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;AAEA;AACA;AAEA;AAAsD;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAAA;EAAA;EAAA;IAAA;EAAA;AAAA;AAMtD;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;AAwBA;AAMA;AAKA;AAKA;AAzDO,MAAMA,OAAO,WAAuB;AAAC;AA+DrC,MAAMC,kBAAkB,GAAGC,MAAM,CAACC,MAAM,CAAC,CAC9C,KAAK,EACL,MAAM,EACN,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,CACP,CAAU;;AAAC;AAIL,MAAMC,aAAa,CAAC;EACzBC,IAAI,CAACC,IAAQ,EAAE;IACb,OAAO,IAAAC,uBAAe,EAACD,IAAI,CAAC;EAC9B;AACF;AAAC;AAEM,SAASE,MAAM,CAACC,KAAa,EAAE;EACpC,MAAM,IAAIC,KAAK,CACZ,QAAOD,KAAM,kEAAiE,CAChF;AACH;AAAC"} \ No newline at end of file +{"version":3,"names":["_file","require","_buildExternalHelpers","_index","_environment","_types","data","Object","defineProperty","exports","enumerable","get","_parser","_traverse","_template","_index2","_transform","_transformFile","_transformAst","_parse","thisFile","version","DEFAULT_EXTENSIONS","freeze","OptionManager","init","opts","loadOptionsSync","Plugin","alias","Error","types","traverse","tokTypes","template"],"sources":["../src/index.ts"],"sourcesContent":["if (!process.env.IS_PUBLISH && !USE_ESM && process.env.BABEL_8_BREAKING) {\n throw new Error(\n \"BABEL_8_BREAKING is only supported in ESM. Please run `make use-esm`.\",\n );\n}\n\nexport const version = PACKAGE_JSON.version;\n\nexport { default as File } from \"./transformation/file/file.ts\";\nexport type { default as PluginPass } from \"./transformation/plugin-pass.ts\";\nexport { default as buildExternalHelpers } from \"./tools/build-external-helpers.ts\";\nexport { resolvePlugin, resolvePreset } from \"./config/files/index.ts\";\n\nexport { getEnv } from \"./config/helpers/environment.ts\";\n\n// NOTE: Lazy re-exports aren't detected by the Node.js CJS-ESM interop.\n// These are handled by pluginInjectNodeReexportsHints in our babel.config.js\n// so that they can work well.\nexport * as types from \"@babel/types\";\nexport { tokTypes } from \"@babel/parser\";\nexport { default as traverse } from \"@babel/traverse\";\nexport { default as template } from \"@babel/template\";\n\nexport {\n createConfigItem,\n createConfigItemSync,\n createConfigItemAsync,\n} from \"./config/index.ts\";\n\nexport {\n loadPartialConfig,\n loadPartialConfigSync,\n loadPartialConfigAsync,\n loadOptions,\n loadOptionsAsync,\n} from \"./config/index.ts\";\nimport { loadOptionsSync } from \"./config/index.ts\";\nexport { loadOptionsSync };\n\nexport type {\n CallerMetadata,\n InputOptions,\n PluginAPI,\n PluginObject,\n PresetAPI,\n PresetObject,\n ConfigItem,\n} from \"./config/index.ts\";\n\nexport {\n transform,\n transformSync,\n transformAsync,\n type FileResult,\n} from \"./transform.ts\";\nexport {\n transformFile,\n transformFileSync,\n transformFileAsync,\n} from \"./transform-file.ts\";\nexport {\n transformFromAst,\n transformFromAstSync,\n transformFromAstAsync,\n} from \"./transform-ast.ts\";\nexport { parse, parseSync, parseAsync } from \"./parse.ts\";\n\n/**\n * Recommended set of compilable extensions. Not used in @babel/core directly, but meant as\n * as an easy source for tooling making use of @babel/core.\n */\nexport const DEFAULT_EXTENSIONS = Object.freeze([\n \".js\",\n \".jsx\",\n \".es6\",\n \".es\",\n \".mjs\",\n \".cjs\",\n] as const);\n\nimport Module from \"module\";\nimport * as thisFile from \"./index.ts\";\nif (USE_ESM && !IS_STANDALONE) {\n // Pass this module to the CJS proxy, so that it can be synchronously accessed.\n const cjsProxy = Module.createRequire(import.meta.url)(\"../cjs-proxy.cjs\");\n cjsProxy[\"__ initialize @babel/core cjs proxy __\"] = thisFile;\n}\n\nif (!process.env.BABEL_8_BREAKING && !USE_ESM) {\n // For easier backward-compatibility, provide an API like the one we exposed in Babel 6.\n // eslint-disable-next-line no-restricted-globals\n exports.OptionManager = class OptionManager {\n init(opts: {}) {\n return loadOptionsSync(opts);\n }\n };\n\n // eslint-disable-next-line no-restricted-globals\n exports.Plugin = function Plugin(alias: string) {\n throw new Error(\n `The (${alias}) Babel 5 plugin is being run with an unsupported Babel version.`,\n );\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,IAAAA,KAAA,GAAAC,OAAA;AAEA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAEA,IAAAG,YAAA,GAAAH,OAAA;AAAyD,SAAAI,OAAA;EAAA,MAAAC,IAAA,GAAAL,OAAA;EAAAI,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAAC,MAAA,CAAAC,cAAA,KAAAC,OAAA;EAAAC,UAAA;EAAAC,GAAA,WAAAA,CAAA;IAAA,OAAAN,MAAA;EAAA;AAAA;AAMzD,SAAAO,QAAA;EAAA,MAAAN,IAAA,GAAAL,OAAA;EAAAW,OAAA,YAAAA,CAAA;IAAA,OAAAN,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAO,UAAA;EAAA,MAAAP,IAAA,GAAAL,OAAA;EAAAY,SAAA,YAAAA,CAAA;IAAA,OAAAP,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAQ,UAAA;EAAA,MAAAR,IAAA,GAAAL,OAAA;EAAAa,SAAA,YAAAA,CAAA;IAAA,OAAAR,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,IAAAS,OAAA,GAAAd,OAAA;AA0BA,IAAAe,UAAA,GAAAf,OAAA;AAMA,IAAAgB,cAAA,GAAAhB,OAAA;AAKA,IAAAiB,aAAA,GAAAjB,OAAA;AAKA,IAAAkB,MAAA,GAAAlB,OAAA;AAgBA,IAAAmB,QAAA,GAAAnB,OAAA;AAAuC;AA3EhC,MAAMoB,OAAO,GAAAZ,OAAA,CAAAY,OAAA,WAAuB;AAiEpC,MAAMC,kBAAkB,GAAAb,OAAA,CAAAa,kBAAA,GAAGf,MAAM,CAACgB,MAAM,CAAC,CAC9C,KAAK,EACL,MAAM,EACN,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,CACE,CAAC;AAAC;AAUmC;EAG7Cd,OAAO,CAACe,aAAa,GAAG,MAAMA,aAAa,CAAC;IAC1CC,IAAIA,CAACC,IAAQ,EAAE;MACb,OAAO,IAAAC,uBAAe,EAACD,IAAI,CAAC;IAC9B;EACF,CAAC;EAGDjB,OAAO,CAACmB,MAAM,GAAG,SAASA,MAAMA,CAACC,KAAa,EAAE;IAC9C,MAAM,IAAIC,KAAK,CACZ,QAAOD,KAAM,kEAChB,CAAC;EACH,CAAC;AACH;AAAC,MAAApB,OAAA,CAAAsB,KAAA,GAAAtB,OAAA,CAAAuB,QAAA,GAAAvB,OAAA,CAAAwB,QAAA,GAAAxB,OAAA,CAAAyB,QAAA"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/parse.js b/node_modules/@babel/core/lib/parse.js index 93bb7d1006d5..7e4114245f7c 100644 --- a/node_modules/@babel/core/lib/parse.js +++ b/node_modules/@babel/core/lib/parse.js @@ -13,18 +13,18 @@ function _gensync() { }; return data; } -var _config = require("./config"); -var _parser = require("./parser"); -var _normalizeOpts = require("./transformation/normalize-opts"); -var _rewriteStackTrace = require("./errors/rewrite-stack-trace"); +var _index = require("./config/index.js"); +var _index2 = require("./parser/index.js"); +var _normalizeOpts = require("./transformation/normalize-opts.js"); +var _rewriteStackTrace = require("./errors/rewrite-stack-trace.js"); const parseRunner = _gensync()(function* parse(code, opts) { - const config = yield* (0, _config.default)(opts); + const config = yield* (0, _index.default)(opts); if (config === null) { return null; } - return yield* (0, _parser.default)(config.passes, (0, _normalizeOpts.default)(config), code); + return yield* (0, _index2.default)(config.passes, (0, _normalizeOpts.default)(config), code); }); -const parse = function parse(code, opts, callback) { +const parse = exports.parse = function parse(code, opts, callback) { if (typeof opts === "function") { callback = opts; opts = undefined; @@ -36,7 +36,6 @@ const parse = function parse(code, opts, callback) { } (0, _rewriteStackTrace.beginHiddenCallStack)(parseRunner.errback)(code, opts, callback); }; -exports.parse = parse; function parseSync(...args) { return (0, _rewriteStackTrace.beginHiddenCallStack)(parseRunner.sync)(...args); } diff --git a/node_modules/@babel/core/lib/parse.js.map b/node_modules/@babel/core/lib/parse.js.map index f22369678849..cf6e53cb4c52 100644 --- a/node_modules/@babel/core/lib/parse.js.map +++ b/node_modules/@babel/core/lib/parse.js.map @@ -1 +1 @@ -{"version":3,"names":["parseRunner","gensync","parse","code","opts","config","loadConfig","parser","passes","normalizeOptions","callback","undefined","beginHiddenCallStack","sync","errback","parseSync","args","parseAsync","async"],"sources":["../src/parse.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\n\nimport loadConfig from \"./config\";\nimport type { InputOptions } from \"./config\";\nimport parser from \"./parser\";\nimport type { ParseResult } from \"./parser\";\nimport normalizeOptions from \"./transformation/normalize-opts\";\nimport type { ValidatedOptions } from \"./config/validation/options\";\n\nimport { beginHiddenCallStack } from \"./errors/rewrite-stack-trace\";\n\ntype FileParseCallback = {\n (err: Error, ast: null): void;\n (err: null, ast: ParseResult | null): void;\n};\n\ntype Parse = {\n (code: string, callback: FileParseCallback): void;\n (\n code: string,\n opts: InputOptions | undefined | null,\n callback: FileParseCallback,\n ): void;\n (code: string, opts?: InputOptions | null): ParseResult | null;\n};\n\nconst parseRunner = gensync(function* parse(\n code: string,\n opts: InputOptions | undefined | null,\n): Handler {\n const config = yield* loadConfig(opts);\n\n if (config === null) {\n return null;\n }\n\n return yield* parser(config.passes, normalizeOptions(config), code);\n});\n\nexport const parse: Parse = function parse(\n code,\n opts?,\n callback?: FileParseCallback,\n) {\n if (typeof opts === \"function\") {\n callback = opts;\n opts = undefined as ValidatedOptions;\n }\n\n if (callback === undefined) {\n if (process.env.BABEL_8_BREAKING) {\n throw new Error(\n \"Starting from Babel 8.0.0, the 'parse' function expects a callback. If you need to call it synchronously, please use 'parseSync'.\",\n );\n } else {\n // console.warn(\n // \"Starting from Babel 8.0.0, the 'parse' function will expect a callback. If you need to call it synchronously, please use 'parseSync'.\",\n // );\n return beginHiddenCallStack(parseRunner.sync)(code, opts);\n }\n }\n\n beginHiddenCallStack(parseRunner.errback)(code, opts, callback);\n};\n\nexport function parseSync(...args: Parameters) {\n return beginHiddenCallStack(parseRunner.sync)(...args);\n}\nexport function parseAsync(...args: Parameters) {\n return beginHiddenCallStack(parseRunner.async)(...args);\n}\n"],"mappings":";;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;AAEA;AAEA;AAGA;AAiBA,MAAMA,WAAW,GAAGC,UAAO,CAAC,UAAUC,KAAK,CACzCC,IAAY,EACZC,IAAqC,EACR;EAC7B,MAAMC,MAAM,GAAG,OAAO,IAAAC,eAAU,EAACF,IAAI,CAAC;EAEtC,IAAIC,MAAM,KAAK,IAAI,EAAE;IACnB,OAAO,IAAI;EACb;EAEA,OAAO,OAAO,IAAAE,eAAM,EAACF,MAAM,CAACG,MAAM,EAAE,IAAAC,sBAAgB,EAACJ,MAAM,CAAC,EAAEF,IAAI,CAAC;AACrE,CAAC,CAAC;AAEK,MAAMD,KAAY,GAAG,SAASA,KAAK,CACxCC,IAAI,EACJC,IAAK,EACLM,QAA4B,EAC5B;EACA,IAAI,OAAON,IAAI,KAAK,UAAU,EAAE;IAC9BM,QAAQ,GAAGN,IAAI;IACfA,IAAI,GAAGO,SAA6B;EACtC;EAEA,IAAID,QAAQ,KAAKC,SAAS,EAAE;IAKnB;MAIL,OAAO,IAAAC,uCAAoB,EAACZ,WAAW,CAACa,IAAI,CAAC,CAACV,IAAI,EAAEC,IAAI,CAAC;IAC3D;EACF;EAEA,IAAAQ,uCAAoB,EAACZ,WAAW,CAACc,OAAO,CAAC,CAACX,IAAI,EAAEC,IAAI,EAAEM,QAAQ,CAAC;AACjE,CAAC;AAAC;AAEK,SAASK,SAAS,CAAC,GAAGC,IAAyC,EAAE;EACtE,OAAO,IAAAJ,uCAAoB,EAACZ,WAAW,CAACa,IAAI,CAAC,CAAC,GAAGG,IAAI,CAAC;AACxD;AACO,SAASC,UAAU,CAAC,GAAGD,IAA0C,EAAE;EACxE,OAAO,IAAAJ,uCAAoB,EAACZ,WAAW,CAACkB,KAAK,CAAC,CAAC,GAAGF,IAAI,CAAC;AACzD;AAAC"} \ No newline at end of file +{"version":3,"names":["_gensync","data","require","_index","_index2","_normalizeOpts","_rewriteStackTrace","parseRunner","gensync","parse","code","opts","config","loadConfig","parser","passes","normalizeOptions","exports","callback","undefined","beginHiddenCallStack","sync","errback","parseSync","args","parseAsync","async"],"sources":["../src/parse.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\n\nimport loadConfig, { type InputOptions } from \"./config/index.ts\";\nimport parser, { type ParseResult } from \"./parser/index.ts\";\nimport normalizeOptions from \"./transformation/normalize-opts.ts\";\nimport type { ValidatedOptions } from \"./config/validation/options.ts\";\n\nimport { beginHiddenCallStack } from \"./errors/rewrite-stack-trace.ts\";\n\ntype FileParseCallback = {\n (err: Error, ast: null): void;\n (err: null, ast: ParseResult | null): void;\n};\n\ntype Parse = {\n (code: string, callback: FileParseCallback): void;\n (\n code: string,\n opts: InputOptions | undefined | null,\n callback: FileParseCallback,\n ): void;\n (code: string, opts?: InputOptions | null): ParseResult | null;\n};\n\nconst parseRunner = gensync(function* parse(\n code: string,\n opts: InputOptions | undefined | null,\n): Handler {\n const config = yield* loadConfig(opts);\n\n if (config === null) {\n return null;\n }\n\n return yield* parser(config.passes, normalizeOptions(config), code);\n});\n\nexport const parse: Parse = function parse(\n code,\n opts?,\n callback?: FileParseCallback,\n) {\n if (typeof opts === \"function\") {\n callback = opts;\n opts = undefined as ValidatedOptions;\n }\n\n if (callback === undefined) {\n if (process.env.BABEL_8_BREAKING) {\n throw new Error(\n \"Starting from Babel 8.0.0, the 'parse' function expects a callback. If you need to call it synchronously, please use 'parseSync'.\",\n );\n } else {\n // console.warn(\n // \"Starting from Babel 8.0.0, the 'parse' function will expect a callback. If you need to call it synchronously, please use 'parseSync'.\",\n // );\n return beginHiddenCallStack(parseRunner.sync)(code, opts);\n }\n }\n\n beginHiddenCallStack(parseRunner.errback)(code, opts, callback);\n};\n\nexport function parseSync(...args: Parameters) {\n return beginHiddenCallStack(parseRunner.sync)(...args);\n}\nexport function parseAsync(...args: Parameters) {\n return beginHiddenCallStack(parseRunner.async)(...args);\n}\n"],"mappings":";;;;;;;;AAAA,SAAAA,SAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,QAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,IAAAE,MAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AAGA,IAAAI,kBAAA,GAAAJ,OAAA;AAiBA,MAAMK,WAAW,GAAGC,SAAMA,CAAC,CAAC,UAAUC,KAAKA,CACzCC,IAAY,EACZC,IAAqC,EACR;EAC7B,MAAMC,MAAM,GAAG,OAAO,IAAAC,cAAU,EAACF,IAAI,CAAC;EAEtC,IAAIC,MAAM,KAAK,IAAI,EAAE;IACnB,OAAO,IAAI;EACb;EAEA,OAAO,OAAO,IAAAE,eAAM,EAACF,MAAM,CAACG,MAAM,EAAE,IAAAC,sBAAgB,EAACJ,MAAM,CAAC,EAAEF,IAAI,CAAC;AACrE,CAAC,CAAC;AAEK,MAAMD,KAAY,GAAAQ,OAAA,CAAAR,KAAA,GAAG,SAASA,KAAKA,CACxCC,IAAI,EACJC,IAAK,EACLO,QAA4B,EAC5B;EACA,IAAI,OAAOP,IAAI,KAAK,UAAU,EAAE;IAC9BO,QAAQ,GAAGP,IAAI;IACfA,IAAI,GAAGQ,SAA6B;EACtC;EAEA,IAAID,QAAQ,KAAKC,SAAS,EAAE;IAKnB;MAIL,OAAO,IAAAC,uCAAoB,EAACb,WAAW,CAACc,IAAI,CAAC,CAACX,IAAI,EAAEC,IAAI,CAAC;IAC3D;EACF;EAEA,IAAAS,uCAAoB,EAACb,WAAW,CAACe,OAAO,CAAC,CAACZ,IAAI,EAAEC,IAAI,EAAEO,QAAQ,CAAC;AACjE,CAAC;AAEM,SAASK,SAASA,CAAC,GAAGC,IAAyC,EAAE;EACtE,OAAO,IAAAJ,uCAAoB,EAACb,WAAW,CAACc,IAAI,CAAC,CAAC,GAAGG,IAAI,CAAC;AACxD;AACO,SAASC,UAAUA,CAAC,GAAGD,IAA0C,EAAE;EACxE,OAAO,IAAAJ,uCAAoB,EAACb,WAAW,CAACmB,KAAK,CAAC,CAAC,GAAGF,IAAI,CAAC;AACzD;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/parser/index.js b/node_modules/@babel/core/lib/parser/index.js index 582c3e7f8f81..4355697d4cd8 100644 --- a/node_modules/@babel/core/lib/parser/index.js +++ b/node_modules/@babel/core/lib/parser/index.js @@ -18,7 +18,7 @@ function _codeFrame() { }; return data; } -var _missingPluginHelper = require("./util/missing-plugin-helper"); +var _missingPluginHelper = require("./util/missing-plugin-helper.js"); function* parser(pluginPasses, { parserOpts, highlightCode = true, @@ -51,7 +51,6 @@ function* parser(pluginPasses, { if (err.code === "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED") { err.message += "\nConsider renaming the file to '.mjs', or setting sourceType:module " + "or sourceType:unambiguous in your Babel config for this file."; } - const { loc, missingPlugin diff --git a/node_modules/@babel/core/lib/parser/index.js.map b/node_modules/@babel/core/lib/parser/index.js.map index fe6d0cb5095f..52977b7a56be 100644 --- a/node_modules/@babel/core/lib/parser/index.js.map +++ b/node_modules/@babel/core/lib/parser/index.js.map @@ -1 +1 @@ -{"version":3,"names":["parser","pluginPasses","parserOpts","highlightCode","filename","code","results","plugins","plugin","parserOverride","ast","parse","undefined","push","length","then","Error","err","message","loc","missingPlugin","codeFrame","codeFrameColumns","start","line","column","generateMissingPluginMessage"],"sources":["../../src/parser/index.ts"],"sourcesContent":["import type { Handler } from \"gensync\";\nimport { parse } from \"@babel/parser\";\nimport { codeFrameColumns } from \"@babel/code-frame\";\nimport generateMissingPluginMessage from \"./util/missing-plugin-helper\";\nimport type { PluginPasses } from \"../config\";\n\nexport type ParseResult = ReturnType;\n\nexport default function* parser(\n pluginPasses: PluginPasses,\n { parserOpts, highlightCode = true, filename = \"unknown\" }: any,\n code: string,\n): Handler {\n try {\n const results = [];\n for (const plugins of pluginPasses) {\n for (const plugin of plugins) {\n const { parserOverride } = plugin;\n if (parserOverride) {\n const ast = parserOverride(code, parserOpts, parse);\n\n if (ast !== undefined) results.push(ast);\n }\n }\n }\n\n if (results.length === 0) {\n return parse(code, parserOpts);\n } else if (results.length === 1) {\n // @ts-expect-error - If we want to allow async parsers\n yield* [];\n if (typeof results[0].then === \"function\") {\n throw new Error(\n `You appear to be using an async parser plugin, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, you may need to upgrade ` +\n `your @babel/core version.`,\n );\n }\n return results[0];\n }\n // TODO: Add an error code\n throw new Error(\"More than one plugin attempted to override parsing.\");\n } catch (err) {\n if (err.code === \"BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED\") {\n err.message +=\n \"\\nConsider renaming the file to '.mjs', or setting sourceType:module \" +\n \"or sourceType:unambiguous in your Babel config for this file.\";\n // err.code will be changed to BABEL_PARSE_ERROR later.\n }\n\n const { loc, missingPlugin } = err;\n if (loc) {\n const codeFrame = codeFrameColumns(\n code,\n {\n start: {\n line: loc.line,\n column: loc.column + 1,\n },\n },\n {\n highlightCode,\n },\n );\n if (missingPlugin) {\n err.message =\n `${filename}: ` +\n generateMissingPluginMessage(missingPlugin[0], loc, codeFrame);\n } else {\n err.message = `${filename}: ${err.message}\\n\\n` + codeFrame;\n }\n err.code = \"BABEL_PARSE_ERROR\";\n }\n throw err;\n }\n}\n"],"mappings":";;;;;;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;AAKe,UAAUA,MAAM,CAC7BC,YAA0B,EAC1B;EAAEC,UAAU;EAAEC,aAAa,GAAG,IAAI;EAAEC,QAAQ,GAAG;AAAe,CAAC,EAC/DC,IAAY,EACU;EACtB,IAAI;IACF,MAAMC,OAAO,GAAG,EAAE;IAClB,KAAK,MAAMC,OAAO,IAAIN,YAAY,EAAE;MAClC,KAAK,MAAMO,MAAM,IAAID,OAAO,EAAE;QAC5B,MAAM;UAAEE;QAAe,CAAC,GAAGD,MAAM;QACjC,IAAIC,cAAc,EAAE;UAClB,MAAMC,GAAG,GAAGD,cAAc,CAACJ,IAAI,EAAEH,UAAU,EAAES,eAAK,CAAC;UAEnD,IAAID,GAAG,KAAKE,SAAS,EAAEN,OAAO,CAACO,IAAI,CAACH,GAAG,CAAC;QAC1C;MACF;IACF;IAEA,IAAIJ,OAAO,CAACQ,MAAM,KAAK,CAAC,EAAE;MACxB,OAAO,IAAAH,eAAK,EAACN,IAAI,EAAEH,UAAU,CAAC;IAChC,CAAC,MAAM,IAAII,OAAO,CAACQ,MAAM,KAAK,CAAC,EAAE;MAE/B,OAAO,EAAE;MACT,IAAI,OAAOR,OAAO,CAAC,CAAC,CAAC,CAACS,IAAI,KAAK,UAAU,EAAE;QACzC,MAAM,IAAIC,KAAK,CACZ,iDAAgD,GAC9C,wDAAuD,GACvD,8DAA6D,GAC7D,2BAA0B,CAC9B;MACH;MACA,OAAOV,OAAO,CAAC,CAAC,CAAC;IACnB;IAEA,MAAM,IAAIU,KAAK,CAAC,qDAAqD,CAAC;EACxE,CAAC,CAAC,OAAOC,GAAG,EAAE;IACZ,IAAIA,GAAG,CAACZ,IAAI,KAAK,yCAAyC,EAAE;MAC1DY,GAAG,CAACC,OAAO,IACT,uEAAuE,GACvE,+DAA+D;IAEnE;;IAEA,MAAM;MAAEC,GAAG;MAAEC;IAAc,CAAC,GAAGH,GAAG;IAClC,IAAIE,GAAG,EAAE;MACP,MAAME,SAAS,GAAG,IAAAC,6BAAgB,EAChCjB,IAAI,EACJ;QACEkB,KAAK,EAAE;UACLC,IAAI,EAAEL,GAAG,CAACK,IAAI;UACdC,MAAM,EAAEN,GAAG,CAACM,MAAM,GAAG;QACvB;MACF,CAAC,EACD;QACEtB;MACF,CAAC,CACF;MACD,IAAIiB,aAAa,EAAE;QACjBH,GAAG,CAACC,OAAO,GACR,GAAEd,QAAS,IAAG,GACf,IAAAsB,4BAA4B,EAACN,aAAa,CAAC,CAAC,CAAC,EAAED,GAAG,EAAEE,SAAS,CAAC;MAClE,CAAC,MAAM;QACLJ,GAAG,CAACC,OAAO,GAAI,GAAEd,QAAS,KAAIa,GAAG,CAACC,OAAQ,MAAK,GAAGG,SAAS;MAC7D;MACAJ,GAAG,CAACZ,IAAI,GAAG,mBAAmB;IAChC;IACA,MAAMY,GAAG;EACX;AACF;AAAC"} \ No newline at end of file +{"version":3,"names":["_parser","data","require","_codeFrame","_missingPluginHelper","parser","pluginPasses","parserOpts","highlightCode","filename","code","results","plugins","plugin","parserOverride","ast","parse","undefined","push","length","then","Error","err","message","loc","missingPlugin","codeFrame","codeFrameColumns","start","line","column","generateMissingPluginMessage"],"sources":["../../src/parser/index.ts"],"sourcesContent":["import type { Handler } from \"gensync\";\nimport { parse } from \"@babel/parser\";\nimport { codeFrameColumns } from \"@babel/code-frame\";\nimport generateMissingPluginMessage from \"./util/missing-plugin-helper.ts\";\nimport type { PluginPasses } from \"../config/index.ts\";\n\nexport type ParseResult = ReturnType;\n\nexport default function* parser(\n pluginPasses: PluginPasses,\n { parserOpts, highlightCode = true, filename = \"unknown\" }: any,\n code: string,\n): Handler {\n try {\n const results = [];\n for (const plugins of pluginPasses) {\n for (const plugin of plugins) {\n const { parserOverride } = plugin;\n if (parserOverride) {\n const ast = parserOverride(code, parserOpts, parse);\n\n if (ast !== undefined) results.push(ast);\n }\n }\n }\n\n if (results.length === 0) {\n return parse(code, parserOpts);\n } else if (results.length === 1) {\n // @ts-expect-error - If we want to allow async parsers\n yield* [];\n if (typeof results[0].then === \"function\") {\n throw new Error(\n `You appear to be using an async parser plugin, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, you may need to upgrade ` +\n `your @babel/core version.`,\n );\n }\n return results[0];\n }\n // TODO: Add an error code\n throw new Error(\"More than one plugin attempted to override parsing.\");\n } catch (err) {\n if (err.code === \"BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED\") {\n err.message +=\n \"\\nConsider renaming the file to '.mjs', or setting sourceType:module \" +\n \"or sourceType:unambiguous in your Babel config for this file.\";\n // err.code will be changed to BABEL_PARSE_ERROR later.\n }\n\n const { loc, missingPlugin } = err;\n if (loc) {\n const codeFrame = codeFrameColumns(\n code,\n {\n start: {\n line: loc.line,\n column: loc.column + 1,\n },\n },\n {\n highlightCode,\n },\n );\n if (missingPlugin) {\n err.message =\n `${filename}: ` +\n generateMissingPluginMessage(missingPlugin[0], loc, codeFrame);\n } else {\n err.message = `${filename}: ${err.message}\\n\\n` + codeFrame;\n }\n err.code = \"BABEL_PARSE_ERROR\";\n }\n throw err;\n }\n}\n"],"mappings":";;;;;;AACA,SAAAA,QAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,OAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAE,WAAA;EAAA,MAAAF,IAAA,GAAAC,OAAA;EAAAC,UAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,IAAAG,oBAAA,GAAAF,OAAA;AAKe,UAAUG,MAAMA,CAC7BC,YAA0B,EAC1B;EAAEC,UAAU;EAAEC,aAAa,GAAG,IAAI;EAAEC,QAAQ,GAAG;AAAe,CAAC,EAC/DC,IAAY,EACU;EACtB,IAAI;IACF,MAAMC,OAAO,GAAG,EAAE;IAClB,KAAK,MAAMC,OAAO,IAAIN,YAAY,EAAE;MAClC,KAAK,MAAMO,MAAM,IAAID,OAAO,EAAE;QAC5B,MAAM;UAAEE;QAAe,CAAC,GAAGD,MAAM;QACjC,IAAIC,cAAc,EAAE;UAClB,MAAMC,GAAG,GAAGD,cAAc,CAACJ,IAAI,EAAEH,UAAU,EAAES,eAAK,CAAC;UAEnD,IAAID,GAAG,KAAKE,SAAS,EAAEN,OAAO,CAACO,IAAI,CAACH,GAAG,CAAC;QAC1C;MACF;IACF;IAEA,IAAIJ,OAAO,CAACQ,MAAM,KAAK,CAAC,EAAE;MACxB,OAAO,IAAAH,eAAK,EAACN,IAAI,EAAEH,UAAU,CAAC;IAChC,CAAC,MAAM,IAAII,OAAO,CAACQ,MAAM,KAAK,CAAC,EAAE;MAE/B,OAAO,EAAE;MACT,IAAI,OAAOR,OAAO,CAAC,CAAC,CAAC,CAACS,IAAI,KAAK,UAAU,EAAE;QACzC,MAAM,IAAIC,KAAK,CACZ,iDAAgD,GAC9C,wDAAuD,GACvD,8DAA6D,GAC7D,2BACL,CAAC;MACH;MACA,OAAOV,OAAO,CAAC,CAAC,CAAC;IACnB;IAEA,MAAM,IAAIU,KAAK,CAAC,qDAAqD,CAAC;EACxE,CAAC,CAAC,OAAOC,GAAG,EAAE;IACZ,IAAIA,GAAG,CAACZ,IAAI,KAAK,yCAAyC,EAAE;MAC1DY,GAAG,CAACC,OAAO,IACT,uEAAuE,GACvE,+DAA+D;IAEnE;IAEA,MAAM;MAAEC,GAAG;MAAEC;IAAc,CAAC,GAAGH,GAAG;IAClC,IAAIE,GAAG,EAAE;MACP,MAAME,SAAS,GAAG,IAAAC,6BAAgB,EAChCjB,IAAI,EACJ;QACEkB,KAAK,EAAE;UACLC,IAAI,EAAEL,GAAG,CAACK,IAAI;UACdC,MAAM,EAAEN,GAAG,CAACM,MAAM,GAAG;QACvB;MACF,CAAC,EACD;QACEtB;MACF,CACF,CAAC;MACD,IAAIiB,aAAa,EAAE;QACjBH,GAAG,CAACC,OAAO,GACR,GAAEd,QAAS,IAAG,GACf,IAAAsB,4BAA4B,EAACN,aAAa,CAAC,CAAC,CAAC,EAAED,GAAG,EAAEE,SAAS,CAAC;MAClE,CAAC,MAAM;QACLJ,GAAG,CAACC,OAAO,GAAI,GAAEd,QAAS,KAAIa,GAAG,CAACC,OAAQ,MAAK,GAAGG,SAAS;MAC7D;MACAJ,GAAG,CAACZ,IAAI,GAAG,mBAAmB;IAChC;IACA,MAAMY,GAAG;EACX;AACF;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/parser/util/missing-plugin-helper.js b/node_modules/@babel/core/lib/parser/util/missing-plugin-helper.js index 992bf81d4a16..1c2f4ca3d980 100644 --- a/node_modules/@babel/core/lib/parser/util/missing-plugin-helper.js +++ b/node_modules/@babel/core/lib/parser/util/missing-plugin-helper.js @@ -87,10 +87,10 @@ const pluginNameMap = { url: "https://github.com/babel/babel/tree/main/packages/babel-preset-react" } }, - importAssertions: { + importAttributes: { syntax: { - name: "@babel/plugin-syntax-import-assertions", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-import-assertions" + name: "@babel/plugin-syntax-import-attributes", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-import-attributes" } }, pipelineOperator: { @@ -109,16 +109,6 @@ const pluginNameMap = { url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-record-and-tuple" } }, - regexpUnicodeSets: { - syntax: { - name: "@babel/plugin-syntax-unicode-sets-regex", - url: "https://github.com/babel/babel/blob/main/packages/babel-plugin-syntax-unicode-sets-regex/README.md" - }, - transform: { - name: "@babel/plugin-proposal-unicode-sets-regex", - url: "https://github.com/babel/babel/blob/main/packages/babel-plugin-proposalunicode-sets-regex/README.md" - } - }, throwExpressions: { syntax: { name: "@babel/plugin-syntax-throw-expressions", @@ -138,163 +128,180 @@ const pluginNameMap = { name: "@babel/preset-typescript", url: "https://github.com/babel/babel/tree/main/packages/babel-preset-typescript" } - }, - asyncGenerators: { - syntax: { - name: "@babel/plugin-syntax-async-generators", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-async-generators" + } +}; +{ + Object.assign(pluginNameMap, { + asyncGenerators: { + syntax: { + name: "@babel/plugin-syntax-async-generators", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-async-generators" + }, + transform: { + name: "@babel/plugin-transform-async-generator-functions", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-async-generator-functions" + } }, - transform: { - name: "@babel/plugin-proposal-async-generator-functions", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-async-generator-functions" - } - }, - classProperties: { - syntax: { - name: "@babel/plugin-syntax-class-properties", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties" + classProperties: { + syntax: { + name: "@babel/plugin-syntax-class-properties", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties" + }, + transform: { + name: "@babel/plugin-transform-class-properties", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-class-properties" + } }, - transform: { - name: "@babel/plugin-proposal-class-properties", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-class-properties" - } - }, - classPrivateProperties: { - syntax: { - name: "@babel/plugin-syntax-class-properties", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties" + classPrivateProperties: { + syntax: { + name: "@babel/plugin-syntax-class-properties", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties" + }, + transform: { + name: "@babel/plugin-transform-class-properties", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-class-properties" + } }, - transform: { - name: "@babel/plugin-proposal-class-properties", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-class-properties" - } - }, - classPrivateMethods: { - syntax: { - name: "@babel/plugin-syntax-class-properties", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties" + classPrivateMethods: { + syntax: { + name: "@babel/plugin-syntax-class-properties", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties" + }, + transform: { + name: "@babel/plugin-transform-private-methods", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-private-methods" + } }, - transform: { - name: "@babel/plugin-proposal-private-methods", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-private-methods" - } - }, - classStaticBlock: { - syntax: { - name: "@babel/plugin-syntax-class-static-block", - url: "https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-syntax-class-static-block" + classStaticBlock: { + syntax: { + name: "@babel/plugin-syntax-class-static-block", + url: "https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-syntax-class-static-block" + }, + transform: { + name: "@babel/plugin-transform-class-static-block", + url: "https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-class-static-block" + } }, - transform: { - name: "@babel/plugin-proposal-class-static-block", - url: "https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-proposal-class-static-block" - } - }, - dynamicImport: { - syntax: { - name: "@babel/plugin-syntax-dynamic-import", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-dynamic-import" - } - }, - exportNamespaceFrom: { - syntax: { - name: "@babel/plugin-syntax-export-namespace-from", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-export-namespace-from" + dynamicImport: { + syntax: { + name: "@babel/plugin-syntax-dynamic-import", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-dynamic-import" + } }, - transform: { - name: "@babel/plugin-proposal-export-namespace-from", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-export-namespace-from" - } - }, - importMeta: { - syntax: { - name: "@babel/plugin-syntax-import-meta", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-import-meta" - } - }, - logicalAssignment: { - syntax: { - name: "@babel/plugin-syntax-logical-assignment-operators", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-logical-assignment-operators" + exportNamespaceFrom: { + syntax: { + name: "@babel/plugin-syntax-export-namespace-from", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-export-namespace-from" + }, + transform: { + name: "@babel/plugin-transform-export-namespace-from", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-export-namespace-from" + } }, - transform: { - name: "@babel/plugin-proposal-logical-assignment-operators", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-logical-assignment-operators" - } - }, - moduleStringNames: { - syntax: { - name: "@babel/plugin-syntax-module-string-names", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-module-string-names" - } - }, - numericSeparator: { - syntax: { - name: "@babel/plugin-syntax-numeric-separator", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-numeric-separator" + importAssertions: { + syntax: { + name: "@babel/plugin-syntax-import-assertions", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-import-assertions" + } }, - transform: { - name: "@babel/plugin-proposal-numeric-separator", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-numeric-separator" - } - }, - nullishCoalescingOperator: { - syntax: { - name: "@babel/plugin-syntax-nullish-coalescing-operator", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-nullish-coalescing-operator" + importMeta: { + syntax: { + name: "@babel/plugin-syntax-import-meta", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-import-meta" + } }, - transform: { - name: "@babel/plugin-proposal-nullish-coalescing-operator", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-nullish-coalescing-opearator" - } - }, - objectRestSpread: { - syntax: { - name: "@babel/plugin-syntax-object-rest-spread", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-object-rest-spread" + logicalAssignment: { + syntax: { + name: "@babel/plugin-syntax-logical-assignment-operators", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-logical-assignment-operators" + }, + transform: { + name: "@babel/plugin-transform-logical-assignment-operators", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-logical-assignment-operators" + } }, - transform: { - name: "@babel/plugin-proposal-object-rest-spread", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-object-rest-spread" - } - }, - optionalCatchBinding: { - syntax: { - name: "@babel/plugin-syntax-optional-catch-binding", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-optional-catch-binding" + moduleStringNames: { + syntax: { + name: "@babel/plugin-syntax-module-string-names", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-module-string-names" + } }, - transform: { - name: "@babel/plugin-proposal-optional-catch-binding", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-optional-catch-binding" - } - }, - optionalChaining: { - syntax: { - name: "@babel/plugin-syntax-optional-chaining", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-optional-chaining" + numericSeparator: { + syntax: { + name: "@babel/plugin-syntax-numeric-separator", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-numeric-separator" + }, + transform: { + name: "@babel/plugin-transform-numeric-separator", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-numeric-separator" + } }, - transform: { - name: "@babel/plugin-proposal-optional-chaining", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-optional-chaining" - } - }, - privateIn: { - syntax: { - name: "@babel/plugin-syntax-private-property-in-object", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-private-property-in-object" + nullishCoalescingOperator: { + syntax: { + name: "@babel/plugin-syntax-nullish-coalescing-operator", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-nullish-coalescing-operator" + }, + transform: { + name: "@babel/plugin-transform-nullish-coalescing-operator", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-nullish-coalescing-opearator" + } }, - transform: { - name: "@babel/plugin-proposal-private-property-in-object", - url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-private-property-in-object" + objectRestSpread: { + syntax: { + name: "@babel/plugin-syntax-object-rest-spread", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-object-rest-spread" + }, + transform: { + name: "@babel/plugin-transform-object-rest-spread", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-object-rest-spread" + } + }, + optionalCatchBinding: { + syntax: { + name: "@babel/plugin-syntax-optional-catch-binding", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-optional-catch-binding" + }, + transform: { + name: "@babel/plugin-transform-optional-catch-binding", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-optional-catch-binding" + } + }, + optionalChaining: { + syntax: { + name: "@babel/plugin-syntax-optional-chaining", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-optional-chaining" + }, + transform: { + name: "@babel/plugin-transform-optional-chaining", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-optional-chaining" + } + }, + privateIn: { + syntax: { + name: "@babel/plugin-syntax-private-property-in-object", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-private-property-in-object" + }, + transform: { + name: "@babel/plugin-transform-private-property-in-object", + url: "https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-private-property-in-object" + } + }, + regexpUnicodeSets: { + syntax: { + name: "@babel/plugin-syntax-unicode-sets-regex", + url: "https://github.com/babel/babel/blob/main/packages/babel-plugin-syntax-unicode-sets-regex/README.md" + }, + transform: { + name: "@babel/plugin-transform-unicode-sets-regex", + url: "https://github.com/babel/babel/blob/main/packages/babel-plugin-proposalunicode-sets-regex/README.md" + } } - } -}; - -pluginNameMap.privateIn.syntax = pluginNameMap.privateIn.transform; + }); +} const getNameURLCombination = ({ name, url }) => `${name} (${url})`; - function generateMissingPluginMessage(missingPluginName, loc, codeFrame) { let helpMessage = `Support for the experimental syntax '${missingPluginName}' isn't currently enabled ` + `(${loc.line}:${loc.column + 1}):\n\n` + codeFrame; const pluginInfo = pluginNameMap[missingPluginName]; diff --git a/node_modules/@babel/core/lib/parser/util/missing-plugin-helper.js.map b/node_modules/@babel/core/lib/parser/util/missing-plugin-helper.js.map index 3c17cbc01f93..9e735162f2b8 100644 --- a/node_modules/@babel/core/lib/parser/util/missing-plugin-helper.js.map +++ b/node_modules/@babel/core/lib/parser/util/missing-plugin-helper.js.map @@ -1 +1 @@ -{"version":3,"names":["pluginNameMap","asyncDoExpressions","syntax","name","url","decimal","decorators","transform","doExpressions","exportDefaultFrom","flow","functionBind","functionSent","jsx","importAssertions","pipelineOperator","recordAndTuple","regexpUnicodeSets","throwExpressions","typescript","asyncGenerators","classProperties","classPrivateProperties","classPrivateMethods","classStaticBlock","dynamicImport","exportNamespaceFrom","importMeta","logicalAssignment","moduleStringNames","numericSeparator","nullishCoalescingOperator","objectRestSpread","optionalCatchBinding","optionalChaining","privateIn","getNameURLCombination","generateMissingPluginMessage","missingPluginName","loc","codeFrame","helpMessage","line","column","pluginInfo","syntaxPlugin","transformPlugin","syntaxPluginInfo","transformPluginInfo","sectionType","startsWith"],"sources":["../../../src/parser/util/missing-plugin-helper.ts"],"sourcesContent":["const pluginNameMap: Record<\n string,\n Partial>>\n> = {\n asyncDoExpressions: {\n syntax: {\n name: \"@babel/plugin-syntax-async-do-expressions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-async-do-expressions\",\n },\n },\n decimal: {\n syntax: {\n name: \"@babel/plugin-syntax-decimal\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-decimal\",\n },\n },\n decorators: {\n syntax: {\n name: \"@babel/plugin-syntax-decorators\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-decorators\",\n },\n transform: {\n name: \"@babel/plugin-proposal-decorators\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-decorators\",\n },\n },\n doExpressions: {\n syntax: {\n name: \"@babel/plugin-syntax-do-expressions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-do-expressions\",\n },\n transform: {\n name: \"@babel/plugin-proposal-do-expressions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-do-expressions\",\n },\n },\n exportDefaultFrom: {\n syntax: {\n name: \"@babel/plugin-syntax-export-default-from\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-export-default-from\",\n },\n transform: {\n name: \"@babel/plugin-proposal-export-default-from\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-export-default-from\",\n },\n },\n flow: {\n syntax: {\n name: \"@babel/plugin-syntax-flow\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-flow\",\n },\n transform: {\n name: \"@babel/preset-flow\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-preset-flow\",\n },\n },\n functionBind: {\n syntax: {\n name: \"@babel/plugin-syntax-function-bind\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-function-bind\",\n },\n transform: {\n name: \"@babel/plugin-proposal-function-bind\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-function-bind\",\n },\n },\n functionSent: {\n syntax: {\n name: \"@babel/plugin-syntax-function-sent\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-function-sent\",\n },\n transform: {\n name: \"@babel/plugin-proposal-function-sent\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-function-sent\",\n },\n },\n jsx: {\n syntax: {\n name: \"@babel/plugin-syntax-jsx\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-jsx\",\n },\n transform: {\n name: \"@babel/preset-react\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-preset-react\",\n },\n },\n importAssertions: {\n syntax: {\n name: \"@babel/plugin-syntax-import-assertions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-import-assertions\",\n },\n },\n pipelineOperator: {\n syntax: {\n name: \"@babel/plugin-syntax-pipeline-operator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-pipeline-operator\",\n },\n transform: {\n name: \"@babel/plugin-proposal-pipeline-operator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-pipeline-operator\",\n },\n },\n recordAndTuple: {\n syntax: {\n name: \"@babel/plugin-syntax-record-and-tuple\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-record-and-tuple\",\n },\n },\n regexpUnicodeSets: {\n syntax: {\n name: \"@babel/plugin-syntax-unicode-sets-regex\",\n url: \"https://github.com/babel/babel/blob/main/packages/babel-plugin-syntax-unicode-sets-regex/README.md\",\n },\n transform: {\n name: \"@babel/plugin-proposal-unicode-sets-regex\",\n url: \"https://github.com/babel/babel/blob/main/packages/babel-plugin-proposalunicode-sets-regex/README.md\",\n },\n },\n throwExpressions: {\n syntax: {\n name: \"@babel/plugin-syntax-throw-expressions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-throw-expressions\",\n },\n transform: {\n name: \"@babel/plugin-proposal-throw-expressions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-throw-expressions\",\n },\n },\n typescript: {\n syntax: {\n name: \"@babel/plugin-syntax-typescript\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-typescript\",\n },\n transform: {\n name: \"@babel/preset-typescript\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-preset-typescript\",\n },\n },\n\n // TODO: This plugins are now supported by default by @babel/parser: they can\n // be removed from this list. Although removing them isn't a breaking change,\n // it's better to keep a nice error message for users using older versions of\n // the parser. They can be removed in Babel 8.\n asyncGenerators: {\n syntax: {\n name: \"@babel/plugin-syntax-async-generators\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-async-generators\",\n },\n transform: {\n name: \"@babel/plugin-proposal-async-generator-functions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-async-generator-functions\",\n },\n },\n classProperties: {\n syntax: {\n name: \"@babel/plugin-syntax-class-properties\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties\",\n },\n transform: {\n name: \"@babel/plugin-proposal-class-properties\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-class-properties\",\n },\n },\n classPrivateProperties: {\n syntax: {\n name: \"@babel/plugin-syntax-class-properties\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties\",\n },\n transform: {\n name: \"@babel/plugin-proposal-class-properties\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-class-properties\",\n },\n },\n classPrivateMethods: {\n syntax: {\n name: \"@babel/plugin-syntax-class-properties\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties\",\n },\n transform: {\n name: \"@babel/plugin-proposal-private-methods\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-private-methods\",\n },\n },\n classStaticBlock: {\n syntax: {\n name: \"@babel/plugin-syntax-class-static-block\",\n url: \"https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-syntax-class-static-block\",\n },\n transform: {\n name: \"@babel/plugin-proposal-class-static-block\",\n url: \"https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-proposal-class-static-block\",\n },\n },\n dynamicImport: {\n syntax: {\n name: \"@babel/plugin-syntax-dynamic-import\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-dynamic-import\",\n },\n },\n exportNamespaceFrom: {\n syntax: {\n name: \"@babel/plugin-syntax-export-namespace-from\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-export-namespace-from\",\n },\n transform: {\n name: \"@babel/plugin-proposal-export-namespace-from\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-export-namespace-from\",\n },\n },\n importMeta: {\n syntax: {\n name: \"@babel/plugin-syntax-import-meta\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-import-meta\",\n },\n },\n logicalAssignment: {\n syntax: {\n name: \"@babel/plugin-syntax-logical-assignment-operators\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-logical-assignment-operators\",\n },\n transform: {\n name: \"@babel/plugin-proposal-logical-assignment-operators\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-logical-assignment-operators\",\n },\n },\n moduleStringNames: {\n syntax: {\n name: \"@babel/plugin-syntax-module-string-names\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-module-string-names\",\n },\n },\n numericSeparator: {\n syntax: {\n name: \"@babel/plugin-syntax-numeric-separator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-numeric-separator\",\n },\n transform: {\n name: \"@babel/plugin-proposal-numeric-separator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-numeric-separator\",\n },\n },\n nullishCoalescingOperator: {\n syntax: {\n name: \"@babel/plugin-syntax-nullish-coalescing-operator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-nullish-coalescing-operator\",\n },\n transform: {\n name: \"@babel/plugin-proposal-nullish-coalescing-operator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-nullish-coalescing-opearator\",\n },\n },\n objectRestSpread: {\n syntax: {\n name: \"@babel/plugin-syntax-object-rest-spread\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-object-rest-spread\",\n },\n transform: {\n name: \"@babel/plugin-proposal-object-rest-spread\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-object-rest-spread\",\n },\n },\n optionalCatchBinding: {\n syntax: {\n name: \"@babel/plugin-syntax-optional-catch-binding\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-optional-catch-binding\",\n },\n transform: {\n name: \"@babel/plugin-proposal-optional-catch-binding\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-optional-catch-binding\",\n },\n },\n optionalChaining: {\n syntax: {\n name: \"@babel/plugin-syntax-optional-chaining\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-optional-chaining\",\n },\n transform: {\n name: \"@babel/plugin-proposal-optional-chaining\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-optional-chaining\",\n },\n },\n privateIn: {\n syntax: {\n name: \"@babel/plugin-syntax-private-property-in-object\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-private-property-in-object\",\n },\n transform: {\n name: \"@babel/plugin-proposal-private-property-in-object\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-private-property-in-object\",\n },\n },\n};\n\n//todo: we don't have plugin-syntax-private-property-in-object\npluginNameMap.privateIn.syntax = pluginNameMap.privateIn.transform;\n\nconst getNameURLCombination = ({ name, url }: { name: string; url: string }) =>\n `${name} (${url})`;\n\n/*\nReturns a string of the format:\nSupport for the experimental syntax [@babel/parser plugin name] isn't currently enabled ([loc]):\n\n[code frame]\n\nAdd [npm package name] ([url]) to the 'plugins' section of your Babel config\nto enable [parsing|transformation].\n*/\nexport default function generateMissingPluginMessage(\n missingPluginName: string,\n loc: {\n line: number;\n column: number;\n },\n codeFrame: string,\n): string {\n let helpMessage =\n `Support for the experimental syntax '${missingPluginName}' isn't currently enabled ` +\n `(${loc.line}:${loc.column + 1}):\\n\\n` +\n codeFrame;\n const pluginInfo = pluginNameMap[missingPluginName];\n if (pluginInfo) {\n const { syntax: syntaxPlugin, transform: transformPlugin } = pluginInfo;\n if (syntaxPlugin) {\n const syntaxPluginInfo = getNameURLCombination(syntaxPlugin);\n if (transformPlugin) {\n const transformPluginInfo = getNameURLCombination(transformPlugin);\n const sectionType = transformPlugin.name.startsWith(\"@babel/plugin\")\n ? \"plugins\"\n : \"presets\";\n helpMessage += `\\n\\nAdd ${transformPluginInfo} to the '${sectionType}' section of your Babel config to enable transformation.\nIf you want to leave it as-is, add ${syntaxPluginInfo} to the 'plugins' section to enable parsing.`;\n } else {\n helpMessage +=\n `\\n\\nAdd ${syntaxPluginInfo} to the 'plugins' section of your Babel config ` +\n `to enable parsing.`;\n }\n }\n }\n return helpMessage;\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["pluginNameMap","asyncDoExpressions","syntax","name","url","decimal","decorators","transform","doExpressions","exportDefaultFrom","flow","functionBind","functionSent","jsx","importAttributes","pipelineOperator","recordAndTuple","throwExpressions","typescript","Object","assign","asyncGenerators","classProperties","classPrivateProperties","classPrivateMethods","classStaticBlock","dynamicImport","exportNamespaceFrom","importAssertions","importMeta","logicalAssignment","moduleStringNames","numericSeparator","nullishCoalescingOperator","objectRestSpread","optionalCatchBinding","optionalChaining","privateIn","regexpUnicodeSets","getNameURLCombination","generateMissingPluginMessage","missingPluginName","loc","codeFrame","helpMessage","line","column","pluginInfo","syntaxPlugin","transformPlugin","syntaxPluginInfo","transformPluginInfo","sectionType","startsWith"],"sources":["../../../src/parser/util/missing-plugin-helper.ts"],"sourcesContent":["const pluginNameMap: Record<\n string,\n Partial>>\n> = {\n asyncDoExpressions: {\n syntax: {\n name: \"@babel/plugin-syntax-async-do-expressions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-async-do-expressions\",\n },\n },\n decimal: {\n syntax: {\n name: \"@babel/plugin-syntax-decimal\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-decimal\",\n },\n },\n decorators: {\n syntax: {\n name: \"@babel/plugin-syntax-decorators\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-decorators\",\n },\n transform: {\n name: \"@babel/plugin-proposal-decorators\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-decorators\",\n },\n },\n doExpressions: {\n syntax: {\n name: \"@babel/plugin-syntax-do-expressions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-do-expressions\",\n },\n transform: {\n name: \"@babel/plugin-proposal-do-expressions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-do-expressions\",\n },\n },\n exportDefaultFrom: {\n syntax: {\n name: \"@babel/plugin-syntax-export-default-from\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-export-default-from\",\n },\n transform: {\n name: \"@babel/plugin-proposal-export-default-from\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-export-default-from\",\n },\n },\n flow: {\n syntax: {\n name: \"@babel/plugin-syntax-flow\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-flow\",\n },\n transform: {\n name: \"@babel/preset-flow\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-preset-flow\",\n },\n },\n functionBind: {\n syntax: {\n name: \"@babel/plugin-syntax-function-bind\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-function-bind\",\n },\n transform: {\n name: \"@babel/plugin-proposal-function-bind\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-function-bind\",\n },\n },\n functionSent: {\n syntax: {\n name: \"@babel/plugin-syntax-function-sent\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-function-sent\",\n },\n transform: {\n name: \"@babel/plugin-proposal-function-sent\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-function-sent\",\n },\n },\n jsx: {\n syntax: {\n name: \"@babel/plugin-syntax-jsx\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-jsx\",\n },\n transform: {\n name: \"@babel/preset-react\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-preset-react\",\n },\n },\n importAttributes: {\n syntax: {\n name: \"@babel/plugin-syntax-import-attributes\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-import-attributes\",\n },\n },\n pipelineOperator: {\n syntax: {\n name: \"@babel/plugin-syntax-pipeline-operator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-pipeline-operator\",\n },\n transform: {\n name: \"@babel/plugin-proposal-pipeline-operator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-pipeline-operator\",\n },\n },\n recordAndTuple: {\n syntax: {\n name: \"@babel/plugin-syntax-record-and-tuple\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-record-and-tuple\",\n },\n },\n throwExpressions: {\n syntax: {\n name: \"@babel/plugin-syntax-throw-expressions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-throw-expressions\",\n },\n transform: {\n name: \"@babel/plugin-proposal-throw-expressions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-throw-expressions\",\n },\n },\n typescript: {\n syntax: {\n name: \"@babel/plugin-syntax-typescript\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-typescript\",\n },\n transform: {\n name: \"@babel/preset-typescript\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-preset-typescript\",\n },\n },\n};\n\nif (!process.env.BABEL_8_BREAKING) {\n // TODO: This plugins are now supported by default by @babel/parser.\n Object.assign(pluginNameMap, {\n asyncGenerators: {\n syntax: {\n name: \"@babel/plugin-syntax-async-generators\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-async-generators\",\n },\n transform: {\n name: \"@babel/plugin-transform-async-generator-functions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-async-generator-functions\",\n },\n },\n classProperties: {\n syntax: {\n name: \"@babel/plugin-syntax-class-properties\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties\",\n },\n transform: {\n name: \"@babel/plugin-transform-class-properties\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-class-properties\",\n },\n },\n classPrivateProperties: {\n syntax: {\n name: \"@babel/plugin-syntax-class-properties\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties\",\n },\n transform: {\n name: \"@babel/plugin-transform-class-properties\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-class-properties\",\n },\n },\n classPrivateMethods: {\n syntax: {\n name: \"@babel/plugin-syntax-class-properties\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-class-properties\",\n },\n transform: {\n name: \"@babel/plugin-transform-private-methods\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-private-methods\",\n },\n },\n classStaticBlock: {\n syntax: {\n name: \"@babel/plugin-syntax-class-static-block\",\n url: \"https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-syntax-class-static-block\",\n },\n transform: {\n name: \"@babel/plugin-transform-class-static-block\",\n url: \"https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-class-static-block\",\n },\n },\n dynamicImport: {\n syntax: {\n name: \"@babel/plugin-syntax-dynamic-import\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-dynamic-import\",\n },\n },\n exportNamespaceFrom: {\n syntax: {\n name: \"@babel/plugin-syntax-export-namespace-from\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-export-namespace-from\",\n },\n transform: {\n name: \"@babel/plugin-transform-export-namespace-from\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-export-namespace-from\",\n },\n },\n // Will be removed\n importAssertions: {\n syntax: {\n name: \"@babel/plugin-syntax-import-assertions\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-import-assertions\",\n },\n },\n importMeta: {\n syntax: {\n name: \"@babel/plugin-syntax-import-meta\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-import-meta\",\n },\n },\n logicalAssignment: {\n syntax: {\n name: \"@babel/plugin-syntax-logical-assignment-operators\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-logical-assignment-operators\",\n },\n transform: {\n name: \"@babel/plugin-transform-logical-assignment-operators\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-logical-assignment-operators\",\n },\n },\n moduleStringNames: {\n syntax: {\n name: \"@babel/plugin-syntax-module-string-names\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-module-string-names\",\n },\n },\n numericSeparator: {\n syntax: {\n name: \"@babel/plugin-syntax-numeric-separator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-numeric-separator\",\n },\n transform: {\n name: \"@babel/plugin-transform-numeric-separator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-numeric-separator\",\n },\n },\n nullishCoalescingOperator: {\n syntax: {\n name: \"@babel/plugin-syntax-nullish-coalescing-operator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-nullish-coalescing-operator\",\n },\n transform: {\n name: \"@babel/plugin-transform-nullish-coalescing-operator\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-nullish-coalescing-opearator\",\n },\n },\n objectRestSpread: {\n syntax: {\n name: \"@babel/plugin-syntax-object-rest-spread\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-object-rest-spread\",\n },\n transform: {\n name: \"@babel/plugin-transform-object-rest-spread\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-object-rest-spread\",\n },\n },\n optionalCatchBinding: {\n syntax: {\n name: \"@babel/plugin-syntax-optional-catch-binding\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-optional-catch-binding\",\n },\n transform: {\n name: \"@babel/plugin-transform-optional-catch-binding\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-optional-catch-binding\",\n },\n },\n optionalChaining: {\n syntax: {\n name: \"@babel/plugin-syntax-optional-chaining\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-optional-chaining\",\n },\n transform: {\n name: \"@babel/plugin-transform-optional-chaining\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-optional-chaining\",\n },\n },\n privateIn: {\n syntax: {\n name: \"@babel/plugin-syntax-private-property-in-object\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-private-property-in-object\",\n },\n transform: {\n name: \"@babel/plugin-transform-private-property-in-object\",\n url: \"https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-private-property-in-object\",\n },\n },\n regexpUnicodeSets: {\n syntax: {\n name: \"@babel/plugin-syntax-unicode-sets-regex\",\n url: \"https://github.com/babel/babel/blob/main/packages/babel-plugin-syntax-unicode-sets-regex/README.md\",\n },\n transform: {\n name: \"@babel/plugin-transform-unicode-sets-regex\",\n url: \"https://github.com/babel/babel/blob/main/packages/babel-plugin-proposalunicode-sets-regex/README.md\",\n },\n },\n });\n}\n\nconst getNameURLCombination = ({ name, url }: { name: string; url: string }) =>\n `${name} (${url})`;\n\n/*\nReturns a string of the format:\nSupport for the experimental syntax [@babel/parser plugin name] isn't currently enabled ([loc]):\n\n[code frame]\n\nAdd [npm package name] ([url]) to the 'plugins' section of your Babel config\nto enable [parsing|transformation].\n*/\nexport default function generateMissingPluginMessage(\n missingPluginName: string,\n loc: {\n line: number;\n column: number;\n },\n codeFrame: string,\n): string {\n let helpMessage =\n `Support for the experimental syntax '${missingPluginName}' isn't currently enabled ` +\n `(${loc.line}:${loc.column + 1}):\\n\\n` +\n codeFrame;\n const pluginInfo = pluginNameMap[missingPluginName];\n if (pluginInfo) {\n const { syntax: syntaxPlugin, transform: transformPlugin } = pluginInfo;\n if (syntaxPlugin) {\n const syntaxPluginInfo = getNameURLCombination(syntaxPlugin);\n if (transformPlugin) {\n const transformPluginInfo = getNameURLCombination(transformPlugin);\n const sectionType = transformPlugin.name.startsWith(\"@babel/plugin\")\n ? \"plugins\"\n : \"presets\";\n helpMessage += `\\n\\nAdd ${transformPluginInfo} to the '${sectionType}' section of your Babel config to enable transformation.\nIf you want to leave it as-is, add ${syntaxPluginInfo} to the 'plugins' section to enable parsing.`;\n } else {\n helpMessage +=\n `\\n\\nAdd ${syntaxPluginInfo} to the 'plugins' section of your Babel config ` +\n `to enable parsing.`;\n }\n }\n }\n return helpMessage;\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/tools/build-external-helpers.js b/node_modules/@babel/core/lib/tools/build-external-helpers.js index 5ecbb6709ab4..6d7e62e6cee6 100644 --- a/node_modules/@babel/core/lib/tools/build-external-helpers.js +++ b/node_modules/@babel/core/lib/tools/build-external-helpers.js @@ -32,7 +32,7 @@ function _t() { }; return data; } -var _file = require("../transformation/file/file"); +var _file = require("../transformation/file/file.js"); const { arrayExpression, assignmentExpression, @@ -71,8 +71,7 @@ function buildGlobal(allowlist) { const namespace = identifier("babelHelpers"); const body = []; const container = functionExpression(null, [identifier("global")], blockStatement(body)); - const tree = program([expressionStatement(callExpression(container, [ - conditionalExpression(binaryExpression("===", unaryExpression("typeof", identifier("global")), stringLiteral("undefined")), identifier("self"), identifier("global"))]))]); + const tree = program([expressionStatement(callExpression(container, [conditionalExpression(binaryExpression("===", unaryExpression("typeof", identifier("global")), stringLiteral("undefined")), identifier("self"), identifier("global"))]))]); body.push(variableDeclaration("var", [variableDeclarator(namespace, assignmentExpression("=", memberExpression(identifier("global"), namespace), objectExpression([])))])); buildHelpers(body, namespace, allowlist); return tree; diff --git a/node_modules/@babel/core/lib/tools/build-external-helpers.js.map b/node_modules/@babel/core/lib/tools/build-external-helpers.js.map index 8fe76f55cbd1..34ea2dec8da8 100644 --- a/node_modules/@babel/core/lib/tools/build-external-helpers.js.map +++ b/node_modules/@babel/core/lib/tools/build-external-helpers.js.map @@ -1 +1 @@ -{"version":3,"names":["arrayExpression","assignmentExpression","binaryExpression","blockStatement","callExpression","cloneNode","conditionalExpression","exportNamedDeclaration","exportSpecifier","expressionStatement","functionExpression","identifier","memberExpression","objectExpression","program","stringLiteral","unaryExpression","variableDeclaration","variableDeclarator","buildUmdWrapper","replacements","template","statement","buildGlobal","allowlist","namespace","body","container","tree","push","buildHelpers","buildModule","refs","unshift","Object","keys","map","name","buildUmd","FACTORY_PARAMETERS","BROWSER_ARGUMENTS","COMMON_ARGUMENTS","AMD_ARGUMENTS","FACTORY_BODY","UMD_ROOT","buildVar","getHelperReference","helpers","list","forEach","indexOf","ref","ensure","File","nodes","get","outputType","build","global","module","umd","var","Error","generator","code"],"sources":["../../src/tools/build-external-helpers.ts"],"sourcesContent":["import * as helpers from \"@babel/helpers\";\nimport generator from \"@babel/generator\";\nimport template from \"@babel/template\";\nimport {\n arrayExpression,\n assignmentExpression,\n binaryExpression,\n blockStatement,\n callExpression,\n cloneNode,\n conditionalExpression,\n exportNamedDeclaration,\n exportSpecifier,\n expressionStatement,\n functionExpression,\n identifier,\n memberExpression,\n objectExpression,\n program,\n stringLiteral,\n unaryExpression,\n variableDeclaration,\n variableDeclarator,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport File from \"../transformation/file/file\";\nimport type { PublicReplacements } from \"@babel/template/src/options\";\n\n// Wrapped to avoid wasting time parsing this when almost no-one uses\n// build-external-helpers.\nconst buildUmdWrapper = (replacements: PublicReplacements) =>\n template.statement`\n (function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(AMD_ARGUMENTS, factory);\n } else if (typeof exports === \"object\") {\n factory(COMMON_ARGUMENTS);\n } else {\n factory(BROWSER_ARGUMENTS);\n }\n })(UMD_ROOT, function (FACTORY_PARAMETERS) {\n FACTORY_BODY\n });\n `(replacements);\n\nfunction buildGlobal(allowlist?: Array) {\n const namespace = identifier(\"babelHelpers\");\n\n const body: t.Statement[] = [];\n const container = functionExpression(\n null,\n [identifier(\"global\")],\n blockStatement(body),\n );\n const tree = program([\n expressionStatement(\n callExpression(container, [\n // typeof global === \"undefined\" ? self : global\n conditionalExpression(\n binaryExpression(\n \"===\",\n unaryExpression(\"typeof\", identifier(\"global\")),\n stringLiteral(\"undefined\"),\n ),\n identifier(\"self\"),\n identifier(\"global\"),\n ),\n ]),\n ),\n ]);\n\n body.push(\n variableDeclaration(\"var\", [\n variableDeclarator(\n namespace,\n assignmentExpression(\n \"=\",\n memberExpression(identifier(\"global\"), namespace),\n objectExpression([]),\n ),\n ),\n ]),\n );\n\n buildHelpers(body, namespace, allowlist);\n\n return tree;\n}\n\nfunction buildModule(allowlist?: Array) {\n const body: t.Statement[] = [];\n const refs = buildHelpers(body, null, allowlist);\n\n body.unshift(\n exportNamedDeclaration(\n null,\n Object.keys(refs).map(name => {\n return exportSpecifier(cloneNode(refs[name]), identifier(name));\n }),\n ),\n );\n\n return program(body, [], \"module\");\n}\n\nfunction buildUmd(allowlist?: Array) {\n const namespace = identifier(\"babelHelpers\");\n\n const body: t.Statement[] = [];\n body.push(\n variableDeclaration(\"var\", [\n variableDeclarator(namespace, identifier(\"global\")),\n ]),\n );\n\n buildHelpers(body, namespace, allowlist);\n\n return program([\n buildUmdWrapper({\n FACTORY_PARAMETERS: identifier(\"global\"),\n BROWSER_ARGUMENTS: assignmentExpression(\n \"=\",\n memberExpression(identifier(\"root\"), namespace),\n objectExpression([]),\n ),\n COMMON_ARGUMENTS: identifier(\"exports\"),\n AMD_ARGUMENTS: arrayExpression([stringLiteral(\"exports\")]),\n FACTORY_BODY: body,\n UMD_ROOT: identifier(\"this\"),\n }),\n ]);\n}\n\nfunction buildVar(allowlist?: Array) {\n const namespace = identifier(\"babelHelpers\");\n\n const body: t.Statement[] = [];\n body.push(\n variableDeclaration(\"var\", [\n variableDeclarator(namespace, objectExpression([])),\n ]),\n );\n const tree = program(body);\n buildHelpers(body, namespace, allowlist);\n body.push(expressionStatement(namespace));\n return tree;\n}\n\nfunction buildHelpers(\n body: t.Statement[],\n namespace: t.Expression,\n allowlist?: Array,\n): Record;\nfunction buildHelpers(\n body: t.Statement[],\n namespace: null,\n allowlist?: Array,\n): Record;\n\nfunction buildHelpers(\n body: t.Statement[],\n namespace: t.Expression | null,\n allowlist?: Array,\n) {\n const getHelperReference = (name: string) => {\n return namespace\n ? memberExpression(namespace, identifier(name))\n : identifier(`_${name}`);\n };\n\n const refs: { [key: string]: t.Identifier | t.MemberExpression } = {};\n helpers.list.forEach(function (name) {\n if (allowlist && allowlist.indexOf(name) < 0) return;\n\n const ref = (refs[name] = getHelperReference(name));\n\n helpers.ensure(name, File);\n const { nodes } = helpers.get(name, getHelperReference, ref);\n\n body.push(...nodes);\n });\n return refs;\n}\nexport default function (\n allowlist?: Array,\n outputType: \"global\" | \"module\" | \"umd\" | \"var\" = \"global\",\n) {\n let tree: t.Program;\n\n const build = {\n global: buildGlobal,\n module: buildModule,\n umd: buildUmd,\n var: buildVar,\n }[outputType];\n\n if (build) {\n tree = build(allowlist);\n } else {\n throw new Error(`Unsupported output type ${outputType}`);\n }\n\n return generator(tree).code;\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["helpers","data","require","_generator","_template","_t","_file","arrayExpression","assignmentExpression","binaryExpression","blockStatement","callExpression","cloneNode","conditionalExpression","exportNamedDeclaration","exportSpecifier","expressionStatement","functionExpression","identifier","memberExpression","objectExpression","program","stringLiteral","unaryExpression","variableDeclaration","variableDeclarator","buildUmdWrapper","replacements","template","statement","buildGlobal","allowlist","namespace","body","container","tree","push","buildHelpers","buildModule","refs","unshift","Object","keys","map","name","buildUmd","FACTORY_PARAMETERS","BROWSER_ARGUMENTS","COMMON_ARGUMENTS","AMD_ARGUMENTS","FACTORY_BODY","UMD_ROOT","buildVar","getHelperReference","list","forEach","indexOf","ref","ensure","File","nodes","get","_default","outputType","build","global","module","umd","var","Error","generator","code"],"sources":["../../src/tools/build-external-helpers.ts"],"sourcesContent":["import * as helpers from \"@babel/helpers\";\nimport generator from \"@babel/generator\";\nimport template from \"@babel/template\";\nimport {\n arrayExpression,\n assignmentExpression,\n binaryExpression,\n blockStatement,\n callExpression,\n cloneNode,\n conditionalExpression,\n exportNamedDeclaration,\n exportSpecifier,\n expressionStatement,\n functionExpression,\n identifier,\n memberExpression,\n objectExpression,\n program,\n stringLiteral,\n unaryExpression,\n variableDeclaration,\n variableDeclarator,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport File from \"../transformation/file/file.ts\";\nimport type { Replacements } from \"@babel/template\";\n\n// Wrapped to avoid wasting time parsing this when almost no-one uses\n// build-external-helpers.\nconst buildUmdWrapper = (replacements: Replacements) =>\n template.statement`\n (function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(AMD_ARGUMENTS, factory);\n } else if (typeof exports === \"object\") {\n factory(COMMON_ARGUMENTS);\n } else {\n factory(BROWSER_ARGUMENTS);\n }\n })(UMD_ROOT, function (FACTORY_PARAMETERS) {\n FACTORY_BODY\n });\n `(replacements);\n\nfunction buildGlobal(allowlist?: Array) {\n const namespace = identifier(\"babelHelpers\");\n\n const body: t.Statement[] = [];\n const container = functionExpression(\n null,\n [identifier(\"global\")],\n blockStatement(body),\n );\n const tree = program([\n expressionStatement(\n callExpression(container, [\n // typeof global === \"undefined\" ? self : global\n conditionalExpression(\n binaryExpression(\n \"===\",\n unaryExpression(\"typeof\", identifier(\"global\")),\n stringLiteral(\"undefined\"),\n ),\n identifier(\"self\"),\n identifier(\"global\"),\n ),\n ]),\n ),\n ]);\n\n body.push(\n variableDeclaration(\"var\", [\n variableDeclarator(\n namespace,\n assignmentExpression(\n \"=\",\n memberExpression(identifier(\"global\"), namespace),\n objectExpression([]),\n ),\n ),\n ]),\n );\n\n buildHelpers(body, namespace, allowlist);\n\n return tree;\n}\n\nfunction buildModule(allowlist?: Array) {\n const body: t.Statement[] = [];\n const refs = buildHelpers(body, null, allowlist);\n\n body.unshift(\n exportNamedDeclaration(\n null,\n Object.keys(refs).map(name => {\n return exportSpecifier(cloneNode(refs[name]), identifier(name));\n }),\n ),\n );\n\n return program(body, [], \"module\");\n}\n\nfunction buildUmd(allowlist?: Array) {\n const namespace = identifier(\"babelHelpers\");\n\n const body: t.Statement[] = [];\n body.push(\n variableDeclaration(\"var\", [\n variableDeclarator(namespace, identifier(\"global\")),\n ]),\n );\n\n buildHelpers(body, namespace, allowlist);\n\n return program([\n buildUmdWrapper({\n FACTORY_PARAMETERS: identifier(\"global\"),\n BROWSER_ARGUMENTS: assignmentExpression(\n \"=\",\n memberExpression(identifier(\"root\"), namespace),\n objectExpression([]),\n ),\n COMMON_ARGUMENTS: identifier(\"exports\"),\n AMD_ARGUMENTS: arrayExpression([stringLiteral(\"exports\")]),\n FACTORY_BODY: body,\n UMD_ROOT: identifier(\"this\"),\n }),\n ]);\n}\n\nfunction buildVar(allowlist?: Array) {\n const namespace = identifier(\"babelHelpers\");\n\n const body: t.Statement[] = [];\n body.push(\n variableDeclaration(\"var\", [\n variableDeclarator(namespace, objectExpression([])),\n ]),\n );\n const tree = program(body);\n buildHelpers(body, namespace, allowlist);\n body.push(expressionStatement(namespace));\n return tree;\n}\n\nfunction buildHelpers(\n body: t.Statement[],\n namespace: t.Expression,\n allowlist?: Array,\n): Record;\nfunction buildHelpers(\n body: t.Statement[],\n namespace: null,\n allowlist?: Array,\n): Record;\n\nfunction buildHelpers(\n body: t.Statement[],\n namespace: t.Expression | null,\n allowlist?: Array,\n) {\n const getHelperReference = (name: string) => {\n return namespace\n ? memberExpression(namespace, identifier(name))\n : identifier(`_${name}`);\n };\n\n const refs: { [key: string]: t.Identifier | t.MemberExpression } = {};\n helpers.list.forEach(function (name) {\n if (allowlist && allowlist.indexOf(name) < 0) return;\n\n const ref = (refs[name] = getHelperReference(name));\n\n helpers.ensure(name, File);\n const { nodes } = helpers.get(name, getHelperReference, ref);\n\n body.push(...nodes);\n });\n return refs;\n}\nexport default function (\n allowlist?: Array,\n outputType: \"global\" | \"module\" | \"umd\" | \"var\" = \"global\",\n) {\n let tree: t.Program;\n\n const build = {\n global: buildGlobal,\n module: buildModule,\n umd: buildUmd,\n var: buildVar,\n }[outputType];\n\n if (build) {\n tree = build(allowlist);\n } else {\n throw new Error(`Unsupported output type ${outputType}`);\n }\n\n return generator(tree).code;\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transform-ast.js b/node_modules/@babel/core/lib/transform-ast.js index ac9819b7adaf..0a86cd10d4dd 100644 --- a/node_modules/@babel/core/lib/transform-ast.js +++ b/node_modules/@babel/core/lib/transform-ast.js @@ -13,16 +13,16 @@ function _gensync() { }; return data; } -var _config = require("./config"); -var _transformation = require("./transformation"); -var _rewriteStackTrace = require("./errors/rewrite-stack-trace"); +var _index = require("./config/index.js"); +var _index2 = require("./transformation/index.js"); +var _rewriteStackTrace = require("./errors/rewrite-stack-trace.js"); const transformFromAstRunner = _gensync()(function* (ast, code, opts) { - const config = yield* (0, _config.default)(opts); + const config = yield* (0, _index.default)(opts); if (config === null) return null; if (!ast) throw new Error("No AST given"); - return yield* (0, _transformation.run)(config, code, ast); + return yield* (0, _index2.run)(config, code, ast); }); -const transformFromAst = function transformFromAst(ast, code, optsOrCallback, maybeCallback) { +const transformFromAst = exports.transformFromAst = function transformFromAst(ast, code, optsOrCallback, maybeCallback) { let opts; let callback; if (typeof optsOrCallback === "function") { @@ -39,7 +39,6 @@ const transformFromAst = function transformFromAst(ast, code, optsOrCallback, ma } (0, _rewriteStackTrace.beginHiddenCallStack)(transformFromAstRunner.errback)(ast, code, opts, callback); }; -exports.transformFromAst = transformFromAst; function transformFromAstSync(...args) { return (0, _rewriteStackTrace.beginHiddenCallStack)(transformFromAstRunner.sync)(...args); } diff --git a/node_modules/@babel/core/lib/transform-ast.js.map b/node_modules/@babel/core/lib/transform-ast.js.map index e4297a106a32..c73217c3be38 100644 --- a/node_modules/@babel/core/lib/transform-ast.js.map +++ b/node_modules/@babel/core/lib/transform-ast.js.map @@ -1 +1 @@ -{"version":3,"names":["transformFromAstRunner","gensync","ast","code","opts","config","loadConfig","Error","run","transformFromAst","optsOrCallback","maybeCallback","callback","undefined","beginHiddenCallStack","sync","errback","transformFromAstSync","args","transformFromAstAsync","async"],"sources":["../src/transform-ast.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\n\nimport loadConfig from \"./config\";\nimport type { InputOptions, ResolvedConfig } from \"./config\";\nimport { run } from \"./transformation\";\nimport type * as t from \"@babel/types\";\n\nimport { beginHiddenCallStack } from \"./errors/rewrite-stack-trace\";\n\nimport type { FileResult, FileResultCallback } from \"./transformation\";\ntype AstRoot = t.File | t.Program;\n\ntype TransformFromAst = {\n (ast: AstRoot, code: string, callback: FileResultCallback): void;\n (\n ast: AstRoot,\n code: string,\n opts: InputOptions | undefined | null,\n callback: FileResultCallback,\n ): void;\n (ast: AstRoot, code: string, opts?: InputOptions | null): FileResult | null;\n};\n\nconst transformFromAstRunner = gensync(function* (\n ast: AstRoot,\n code: string,\n opts: InputOptions | undefined | null,\n): Handler {\n const config: ResolvedConfig | null = yield* loadConfig(opts);\n if (config === null) return null;\n\n if (!ast) throw new Error(\"No AST given\");\n\n return yield* run(config, code, ast);\n});\n\nexport const transformFromAst: TransformFromAst = function transformFromAst(\n ast,\n code,\n optsOrCallback?: InputOptions | null | undefined | FileResultCallback,\n maybeCallback?: FileResultCallback,\n) {\n let opts: InputOptions | undefined | null;\n let callback: FileResultCallback | undefined;\n if (typeof optsOrCallback === \"function\") {\n callback = optsOrCallback;\n opts = undefined;\n } else {\n opts = optsOrCallback;\n callback = maybeCallback;\n }\n\n if (callback === undefined) {\n if (process.env.BABEL_8_BREAKING) {\n throw new Error(\n \"Starting from Babel 8.0.0, the 'transformFromAst' function expects a callback. If you need to call it synchronously, please use 'transformFromAstSync'.\",\n );\n } else {\n // console.warn(\n // \"Starting from Babel 8.0.0, the 'transformFromAst' function will expect a callback. If you need to call it synchronously, please use 'transformFromAstSync'.\",\n // );\n return beginHiddenCallStack(transformFromAstRunner.sync)(ast, code, opts);\n }\n }\n\n beginHiddenCallStack(transformFromAstRunner.errback)(\n ast,\n code,\n opts,\n callback,\n );\n};\n\nexport function transformFromAstSync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(transformFromAstRunner.sync)(...args);\n}\n\nexport function transformFromAstAsync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(transformFromAstRunner.async)(...args);\n}\n"],"mappings":";;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;AAEA;AAGA;AAgBA,MAAMA,sBAAsB,GAAGC,UAAO,CAAC,WACrCC,GAAY,EACZC,IAAY,EACZC,IAAqC,EACT;EAC5B,MAAMC,MAA6B,GAAG,OAAO,IAAAC,eAAU,EAACF,IAAI,CAAC;EAC7D,IAAIC,MAAM,KAAK,IAAI,EAAE,OAAO,IAAI;EAEhC,IAAI,CAACH,GAAG,EAAE,MAAM,IAAIK,KAAK,CAAC,cAAc,CAAC;EAEzC,OAAO,OAAO,IAAAC,mBAAG,EAACH,MAAM,EAAEF,IAAI,EAAED,GAAG,CAAC;AACtC,CAAC,CAAC;AAEK,MAAMO,gBAAkC,GAAG,SAASA,gBAAgB,CACzEP,GAAG,EACHC,IAAI,EACJO,cAAqE,EACrEC,aAAkC,EAClC;EACA,IAAIP,IAAqC;EACzC,IAAIQ,QAAwC;EAC5C,IAAI,OAAOF,cAAc,KAAK,UAAU,EAAE;IACxCE,QAAQ,GAAGF,cAAc;IACzBN,IAAI,GAAGS,SAAS;EAClB,CAAC,MAAM;IACLT,IAAI,GAAGM,cAAc;IACrBE,QAAQ,GAAGD,aAAa;EAC1B;EAEA,IAAIC,QAAQ,KAAKC,SAAS,EAAE;IAKnB;MAIL,OAAO,IAAAC,uCAAoB,EAACd,sBAAsB,CAACe,IAAI,CAAC,CAACb,GAAG,EAAEC,IAAI,EAAEC,IAAI,CAAC;IAC3E;EACF;EAEA,IAAAU,uCAAoB,EAACd,sBAAsB,CAACgB,OAAO,CAAC,CAClDd,GAAG,EACHC,IAAI,EACJC,IAAI,EACJQ,QAAQ,CACT;AACH,CAAC;AAAC;AAEK,SAASK,oBAAoB,CAClC,GAAGC,IAAoD,EACvD;EACA,OAAO,IAAAJ,uCAAoB,EAACd,sBAAsB,CAACe,IAAI,CAAC,CAAC,GAAGG,IAAI,CAAC;AACnE;AAEO,SAASC,qBAAqB,CACnC,GAAGD,IAAqD,EACxD;EACA,OAAO,IAAAJ,uCAAoB,EAACd,sBAAsB,CAACoB,KAAK,CAAC,CAAC,GAAGF,IAAI,CAAC;AACpE;AAAC"} \ No newline at end of file +{"version":3,"names":["_gensync","data","require","_index","_index2","_rewriteStackTrace","transformFromAstRunner","gensync","ast","code","opts","config","loadConfig","Error","run","transformFromAst","exports","optsOrCallback","maybeCallback","callback","undefined","beginHiddenCallStack","sync","errback","transformFromAstSync","args","transformFromAstAsync","async"],"sources":["../src/transform-ast.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\n\nimport loadConfig from \"./config/index.ts\";\nimport type { InputOptions, ResolvedConfig } from \"./config/index.ts\";\nimport { run } from \"./transformation/index.ts\";\nimport type * as t from \"@babel/types\";\n\nimport { beginHiddenCallStack } from \"./errors/rewrite-stack-trace.ts\";\n\nimport type { FileResult, FileResultCallback } from \"./transformation/index.ts\";\ntype AstRoot = t.File | t.Program;\n\ntype TransformFromAst = {\n (ast: AstRoot, code: string, callback: FileResultCallback): void;\n (\n ast: AstRoot,\n code: string,\n opts: InputOptions | undefined | null,\n callback: FileResultCallback,\n ): void;\n (ast: AstRoot, code: string, opts?: InputOptions | null): FileResult | null;\n};\n\nconst transformFromAstRunner = gensync(function* (\n ast: AstRoot,\n code: string,\n opts: InputOptions | undefined | null,\n): Handler {\n const config: ResolvedConfig | null = yield* loadConfig(opts);\n if (config === null) return null;\n\n if (!ast) throw new Error(\"No AST given\");\n\n return yield* run(config, code, ast);\n});\n\nexport const transformFromAst: TransformFromAst = function transformFromAst(\n ast,\n code,\n optsOrCallback?: InputOptions | null | undefined | FileResultCallback,\n maybeCallback?: FileResultCallback,\n) {\n let opts: InputOptions | undefined | null;\n let callback: FileResultCallback | undefined;\n if (typeof optsOrCallback === \"function\") {\n callback = optsOrCallback;\n opts = undefined;\n } else {\n opts = optsOrCallback;\n callback = maybeCallback;\n }\n\n if (callback === undefined) {\n if (process.env.BABEL_8_BREAKING) {\n throw new Error(\n \"Starting from Babel 8.0.0, the 'transformFromAst' function expects a callback. If you need to call it synchronously, please use 'transformFromAstSync'.\",\n );\n } else {\n // console.warn(\n // \"Starting from Babel 8.0.0, the 'transformFromAst' function will expect a callback. If you need to call it synchronously, please use 'transformFromAstSync'.\",\n // );\n return beginHiddenCallStack(transformFromAstRunner.sync)(ast, code, opts);\n }\n }\n\n beginHiddenCallStack(transformFromAstRunner.errback)(\n ast,\n code,\n opts,\n callback,\n );\n};\n\nexport function transformFromAstSync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(transformFromAstRunner.sync)(...args);\n}\n\nexport function transformFromAstAsync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(transformFromAstRunner.async)(...args);\n}\n"],"mappings":";;;;;;;;AAAA,SAAAA,SAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,QAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,IAAAE,MAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AAGA,IAAAG,kBAAA,GAAAH,OAAA;AAgBA,MAAMI,sBAAsB,GAAGC,SAAMA,CAAC,CAAC,WACrCC,GAAY,EACZC,IAAY,EACZC,IAAqC,EACT;EAC5B,MAAMC,MAA6B,GAAG,OAAO,IAAAC,cAAU,EAACF,IAAI,CAAC;EAC7D,IAAIC,MAAM,KAAK,IAAI,EAAE,OAAO,IAAI;EAEhC,IAAI,CAACH,GAAG,EAAE,MAAM,IAAIK,KAAK,CAAC,cAAc,CAAC;EAEzC,OAAO,OAAO,IAAAC,WAAG,EAACH,MAAM,EAAEF,IAAI,EAAED,GAAG,CAAC;AACtC,CAAC,CAAC;AAEK,MAAMO,gBAAkC,GAAAC,OAAA,CAAAD,gBAAA,GAAG,SAASA,gBAAgBA,CACzEP,GAAG,EACHC,IAAI,EACJQ,cAAqE,EACrEC,aAAkC,EAClC;EACA,IAAIR,IAAqC;EACzC,IAAIS,QAAwC;EAC5C,IAAI,OAAOF,cAAc,KAAK,UAAU,EAAE;IACxCE,QAAQ,GAAGF,cAAc;IACzBP,IAAI,GAAGU,SAAS;EAClB,CAAC,MAAM;IACLV,IAAI,GAAGO,cAAc;IACrBE,QAAQ,GAAGD,aAAa;EAC1B;EAEA,IAAIC,QAAQ,KAAKC,SAAS,EAAE;IAKnB;MAIL,OAAO,IAAAC,uCAAoB,EAACf,sBAAsB,CAACgB,IAAI,CAAC,CAACd,GAAG,EAAEC,IAAI,EAAEC,IAAI,CAAC;IAC3E;EACF;EAEA,IAAAW,uCAAoB,EAACf,sBAAsB,CAACiB,OAAO,CAAC,CAClDf,GAAG,EACHC,IAAI,EACJC,IAAI,EACJS,QACF,CAAC;AACH,CAAC;AAEM,SAASK,oBAAoBA,CAClC,GAAGC,IAAoD,EACvD;EACA,OAAO,IAAAJ,uCAAoB,EAACf,sBAAsB,CAACgB,IAAI,CAAC,CAAC,GAAGG,IAAI,CAAC;AACnE;AAEO,SAASC,qBAAqBA,CACnC,GAAGD,IAAqD,EACxD;EACA,OAAO,IAAAJ,uCAAoB,EAACf,sBAAsB,CAACqB,KAAK,CAAC,CAAC,GAAGF,IAAI,CAAC;AACpE;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transform-file-browser.js b/node_modules/@babel/core/lib/transform-file-browser.js index a14110f1cec7..857680979278 100644 --- a/node_modules/@babel/core/lib/transform-file-browser.js +++ b/node_modules/@babel/core/lib/transform-file-browser.js @@ -6,14 +6,12 @@ Object.defineProperty(exports, "__esModule", { exports.transformFile = void 0; exports.transformFileAsync = transformFileAsync; exports.transformFileSync = transformFileSync; - -const transformFile = function transformFile(filename, opts, callback) { +const transformFile = exports.transformFile = function transformFile(filename, opts, callback) { if (typeof opts === "function") { callback = opts; } callback(new Error("Transforming files is not supported in browsers"), null); }; -exports.transformFile = transformFile; function transformFileSync() { throw new Error("Transforming files is not supported in browsers"); } diff --git a/node_modules/@babel/core/lib/transform-file-browser.js.map b/node_modules/@babel/core/lib/transform-file-browser.js.map index 9f800ed4af48..9d43573bd51f 100644 --- a/node_modules/@babel/core/lib/transform-file-browser.js.map +++ b/node_modules/@babel/core/lib/transform-file-browser.js.map @@ -1 +1 @@ -{"version":3,"names":["transformFile","filename","opts","callback","Error","transformFileSync","transformFileAsync","Promise","reject"],"sources":["../src/transform-file-browser.ts"],"sourcesContent":["// duplicated from transform-file so we do not have to import anything here\ntype TransformFile = {\n (filename: string, callback: (error: Error, file: null) => void): void;\n (\n filename: string,\n opts: any,\n callback: (error: Error, file: null) => void,\n ): void;\n};\n\nexport const transformFile: TransformFile = function transformFile(\n filename,\n opts,\n callback?: (error: Error, file: null) => void,\n) {\n if (typeof opts === \"function\") {\n callback = opts;\n }\n\n callback(new Error(\"Transforming files is not supported in browsers\"), null);\n};\n\nexport function transformFileSync(): never {\n throw new Error(\"Transforming files is not supported in browsers\");\n}\n\nexport function transformFileAsync() {\n return Promise.reject(\n new Error(\"Transforming files is not supported in browsers\"),\n );\n}\n"],"mappings":";;;;;;;;;AAUO,MAAMA,aAA4B,GAAG,SAASA,aAAa,CAChEC,QAAQ,EACRC,IAAI,EACJC,QAA6C,EAC7C;EACA,IAAI,OAAOD,IAAI,KAAK,UAAU,EAAE;IAC9BC,QAAQ,GAAGD,IAAI;EACjB;EAEAC,QAAQ,CAAC,IAAIC,KAAK,CAAC,iDAAiD,CAAC,EAAE,IAAI,CAAC;AAC9E,CAAC;AAAC;AAEK,SAASC,iBAAiB,GAAU;EACzC,MAAM,IAAID,KAAK,CAAC,iDAAiD,CAAC;AACpE;AAEO,SAASE,kBAAkB,GAAG;EACnC,OAAOC,OAAO,CAACC,MAAM,CACnB,IAAIJ,KAAK,CAAC,iDAAiD,CAAC,CAC7D;AACH;AAAC"} \ No newline at end of file +{"version":3,"names":["transformFile","exports","filename","opts","callback","Error","transformFileSync","transformFileAsync","Promise","reject"],"sources":["../src/transform-file-browser.ts"],"sourcesContent":["// duplicated from transform-file so we do not have to import anything here\ntype TransformFile = {\n (filename: string, callback: (error: Error, file: null) => void): void;\n (\n filename: string,\n opts: any,\n callback: (error: Error, file: null) => void,\n ): void;\n};\n\nexport const transformFile: TransformFile = function transformFile(\n filename,\n opts,\n callback?: (error: Error, file: null) => void,\n) {\n if (typeof opts === \"function\") {\n callback = opts;\n }\n\n callback(new Error(\"Transforming files is not supported in browsers\"), null);\n};\n\nexport function transformFileSync(): never {\n throw new Error(\"Transforming files is not supported in browsers\");\n}\n\nexport function transformFileAsync() {\n return Promise.reject(\n new Error(\"Transforming files is not supported in browsers\"),\n );\n}\n"],"mappings":";;;;;;;;AAUO,MAAMA,aAA4B,GAAAC,OAAA,CAAAD,aAAA,GAAG,SAASA,aAAaA,CAChEE,QAAQ,EACRC,IAAI,EACJC,QAA6C,EAC7C;EACA,IAAI,OAAOD,IAAI,KAAK,UAAU,EAAE;IAC9BC,QAAQ,GAAGD,IAAI;EACjB;EAEAC,QAAQ,CAAC,IAAIC,KAAK,CAAC,iDAAiD,CAAC,EAAE,IAAI,CAAC;AAC9E,CAAC;AAEM,SAASC,iBAAiBA,CAAA,EAAU;EACzC,MAAM,IAAID,KAAK,CAAC,iDAAiD,CAAC;AACpE;AAEO,SAASE,kBAAkBA,CAAA,EAAG;EACnC,OAAOC,OAAO,CAACC,MAAM,CACnB,IAAIJ,KAAK,CAAC,iDAAiD,CAC7D,CAAC;AACH;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transform-file.js b/node_modules/@babel/core/lib/transform-file.js index 6d8730761f9d..ce7f9f97c025 100644 --- a/node_modules/@babel/core/lib/transform-file.js +++ b/node_modules/@babel/core/lib/transform-file.js @@ -13,22 +13,21 @@ function _gensync() { }; return data; } -var _config = require("./config"); -var _transformation = require("./transformation"); -var fs = require("./gensync-utils/fs"); +var _index = require("./config/index.js"); +var _index2 = require("./transformation/index.js"); +var fs = require("./gensync-utils/fs.js"); ({}); const transformFileRunner = _gensync()(function* (filename, opts) { const options = Object.assign({}, opts, { filename }); - const config = yield* (0, _config.default)(options); + const config = yield* (0, _index.default)(options); if (config === null) return null; const code = yield* fs.readFile(filename, "utf8"); - return yield* (0, _transformation.run)(config, code); + return yield* (0, _index2.run)(config, code); }); - function transformFile(...args) { - return transformFileRunner.errback(...args); + transformFileRunner.errback(...args); } function transformFileSync(...args) { return transformFileRunner.sync(...args); diff --git a/node_modules/@babel/core/lib/transform-file.js.map b/node_modules/@babel/core/lib/transform-file.js.map index 88e32a666a71..3539ee3379a5 100644 --- a/node_modules/@babel/core/lib/transform-file.js.map +++ b/node_modules/@babel/core/lib/transform-file.js.map @@ -1 +1 @@ -{"version":3,"names":["transformFileRunner","gensync","filename","opts","options","config","loadConfig","code","fs","readFile","run","transformFile","args","errback","transformFileSync","sync","transformFileAsync","async"],"sources":["../src/transform-file.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\n\nimport loadConfig from \"./config\";\nimport type { InputOptions, ResolvedConfig } from \"./config\";\nimport { run } from \"./transformation\";\nimport type { FileResult, FileResultCallback } from \"./transformation\";\nimport * as fs from \"./gensync-utils/fs\";\n\ntype transformFileBrowserType = typeof import(\"./transform-file-browser\");\ntype transformFileType = typeof import(\"./transform-file\");\n\n// Kind of gross, but essentially asserting that the exports of this module are the same as the\n// exports of transform-file-browser, since this file may be replaced at bundle time with\n// transform-file-browser.\n({} as any as transformFileBrowserType as transformFileType);\n\nconst transformFileRunner = gensync(function* (\n filename: string,\n opts?: InputOptions,\n): Handler {\n const options = { ...opts, filename };\n\n const config: ResolvedConfig | null = yield* loadConfig(options);\n if (config === null) return null;\n\n const code = yield* fs.readFile(filename, \"utf8\");\n return yield* run(config, code);\n});\n\n// @ts-expect-error TS doesn't detect that this signature is compatible\nexport function transformFile(\n filename: string,\n callback: FileResultCallback,\n): void;\nexport function transformFile(\n filename: string,\n opts: InputOptions | undefined | null,\n callback: FileResultCallback,\n): void;\nexport function transformFile(\n ...args: Parameters\n) {\n return transformFileRunner.errback(...args);\n}\n\nexport function transformFileSync(\n ...args: Parameters\n) {\n return transformFileRunner.sync(...args);\n}\nexport function transformFileAsync(\n ...args: Parameters\n) {\n return transformFileRunner.async(...args);\n}\n"],"mappings":";;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;AAEA;AAEA;AAQA,CAAC,CAAC,CAAC;AAEH,MAAMA,mBAAmB,GAAGC,UAAO,CAAC,WAClCC,QAAgB,EAChBC,IAAmB,EACS;EAC5B,MAAMC,OAAO,qBAAQD,IAAI;IAAED;EAAQ,EAAE;EAErC,MAAMG,MAA6B,GAAG,OAAO,IAAAC,eAAU,EAACF,OAAO,CAAC;EAChE,IAAIC,MAAM,KAAK,IAAI,EAAE,OAAO,IAAI;EAEhC,MAAME,IAAI,GAAG,OAAOC,EAAE,CAACC,QAAQ,CAACP,QAAQ,EAAE,MAAM,CAAC;EACjD,OAAO,OAAO,IAAAQ,mBAAG,EAACL,MAAM,EAAEE,IAAI,CAAC;AACjC,CAAC,CAAC;;AAYK,SAASI,aAAa,CAC3B,GAAGC,IAAoD,EACvD;EACA,OAAOZ,mBAAmB,CAACa,OAAO,CAAC,GAAGD,IAAI,CAAC;AAC7C;AAEO,SAASE,iBAAiB,CAC/B,GAAGF,IAAiD,EACpD;EACA,OAAOZ,mBAAmB,CAACe,IAAI,CAAC,GAAGH,IAAI,CAAC;AAC1C;AACO,SAASI,kBAAkB,CAChC,GAAGJ,IAAkD,EACrD;EACA,OAAOZ,mBAAmB,CAACiB,KAAK,CAAC,GAAGL,IAAI,CAAC;AAC3C;AAAC"} \ No newline at end of file +{"version":3,"names":["_gensync","data","require","_index","_index2","fs","transformFileRunner","gensync","filename","opts","options","Object","assign","config","loadConfig","code","readFile","run","transformFile","args","errback","transformFileSync","sync","transformFileAsync","async"],"sources":["../src/transform-file.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\n\nimport loadConfig from \"./config/index.ts\";\nimport type { InputOptions, ResolvedConfig } from \"./config/index.ts\";\nimport { run } from \"./transformation/index.ts\";\nimport type { FileResult, FileResultCallback } from \"./transformation/index.ts\";\nimport * as fs from \"./gensync-utils/fs.ts\";\n\ntype transformFileBrowserType = typeof import(\"./transform-file-browser\");\ntype transformFileType = typeof import(\"./transform-file\");\n\n// Kind of gross, but essentially asserting that the exports of this module are the same as the\n// exports of transform-file-browser, since this file may be replaced at bundle time with\n// transform-file-browser.\n({}) as any as transformFileBrowserType as transformFileType;\n\nconst transformFileRunner = gensync(function* (\n filename: string,\n opts?: InputOptions,\n): Handler {\n const options = { ...opts, filename };\n\n const config: ResolvedConfig | null = yield* loadConfig(options);\n if (config === null) return null;\n\n const code = yield* fs.readFile(filename, \"utf8\");\n return yield* run(config, code);\n});\n\n// @ts-expect-error TS doesn't detect that this signature is compatible\nexport function transformFile(\n filename: string,\n callback: FileResultCallback,\n): void;\nexport function transformFile(\n filename: string,\n opts: InputOptions | undefined | null,\n callback: FileResultCallback,\n): void;\nexport function transformFile(\n ...args: Parameters\n) {\n transformFileRunner.errback(...args);\n}\n\nexport function transformFileSync(\n ...args: Parameters\n) {\n return transformFileRunner.sync(...args);\n}\nexport function transformFileAsync(\n ...args: Parameters\n) {\n return transformFileRunner.async(...args);\n}\n"],"mappings":";;;;;;;;AAAA,SAAAA,SAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,QAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,IAAAE,MAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AAEA,IAAAG,EAAA,GAAAH,OAAA;AAQA,CAAC,CAAC,CAAC;AAEH,MAAMI,mBAAmB,GAAGC,SAAMA,CAAC,CAAC,WAClCC,QAAgB,EAChBC,IAAmB,EACS;EAC5B,MAAMC,OAAO,GAAAC,MAAA,CAAAC,MAAA,KAAQH,IAAI;IAAED;EAAQ,EAAE;EAErC,MAAMK,MAA6B,GAAG,OAAO,IAAAC,cAAU,EAACJ,OAAO,CAAC;EAChE,IAAIG,MAAM,KAAK,IAAI,EAAE,OAAO,IAAI;EAEhC,MAAME,IAAI,GAAG,OAAOV,EAAE,CAACW,QAAQ,CAACR,QAAQ,EAAE,MAAM,CAAC;EACjD,OAAO,OAAO,IAAAS,WAAG,EAACJ,MAAM,EAAEE,IAAI,CAAC;AACjC,CAAC,CAAC;AAYK,SAASG,aAAaA,CAC3B,GAAGC,IAAoD,EACvD;EACAb,mBAAmB,CAACc,OAAO,CAAC,GAAGD,IAAI,CAAC;AACtC;AAEO,SAASE,iBAAiBA,CAC/B,GAAGF,IAAiD,EACpD;EACA,OAAOb,mBAAmB,CAACgB,IAAI,CAAC,GAAGH,IAAI,CAAC;AAC1C;AACO,SAASI,kBAAkBA,CAChC,GAAGJ,IAAkD,EACrD;EACA,OAAOb,mBAAmB,CAACkB,KAAK,CAAC,GAAGL,IAAI,CAAC;AAC3C;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transform.js b/node_modules/@babel/core/lib/transform.js index e523a533734b..be5570553dac 100644 --- a/node_modules/@babel/core/lib/transform.js +++ b/node_modules/@babel/core/lib/transform.js @@ -13,15 +13,15 @@ function _gensync() { }; return data; } -var _config = require("./config"); -var _transformation = require("./transformation"); -var _rewriteStackTrace = require("./errors/rewrite-stack-trace"); +var _index = require("./config/index.js"); +var _index2 = require("./transformation/index.js"); +var _rewriteStackTrace = require("./errors/rewrite-stack-trace.js"); const transformRunner = _gensync()(function* transform(code, opts) { - const config = yield* (0, _config.default)(opts); + const config = yield* (0, _index.default)(opts); if (config === null) return null; - return yield* (0, _transformation.run)(config, code); + return yield* (0, _index2.run)(config, code); }); -const transform = function transform(code, optsOrCallback, maybeCallback) { +const transform = exports.transform = function transform(code, optsOrCallback, maybeCallback) { let opts; let callback; if (typeof optsOrCallback === "function") { @@ -38,7 +38,6 @@ const transform = function transform(code, optsOrCallback, maybeCallback) { } (0, _rewriteStackTrace.beginHiddenCallStack)(transformRunner.errback)(code, opts, callback); }; -exports.transform = transform; function transformSync(...args) { return (0, _rewriteStackTrace.beginHiddenCallStack)(transformRunner.sync)(...args); } diff --git a/node_modules/@babel/core/lib/transform.js.map b/node_modules/@babel/core/lib/transform.js.map index cc6a8109b80f..f0d79184f6f5 100644 --- a/node_modules/@babel/core/lib/transform.js.map +++ b/node_modules/@babel/core/lib/transform.js.map @@ -1 +1 @@ -{"version":3,"names":["transformRunner","gensync","transform","code","opts","config","loadConfig","run","optsOrCallback","maybeCallback","callback","undefined","beginHiddenCallStack","sync","errback","transformSync","args","transformAsync","async"],"sources":["../src/transform.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\n\nimport loadConfig from \"./config\";\nimport type { InputOptions, ResolvedConfig } from \"./config\";\nimport { run } from \"./transformation\";\n\nimport type { FileResult, FileResultCallback } from \"./transformation\";\nimport { beginHiddenCallStack } from \"./errors/rewrite-stack-trace\";\n\nexport type { FileResult } from \"./transformation\";\n\ntype Transform = {\n (code: string, callback: FileResultCallback): void;\n (\n code: string,\n opts: InputOptions | undefined | null,\n callback: FileResultCallback,\n ): void;\n (code: string, opts?: InputOptions | null): FileResult | null;\n};\n\nconst transformRunner = gensync(function* transform(\n code: string,\n opts?: InputOptions,\n): Handler {\n const config: ResolvedConfig | null = yield* loadConfig(opts);\n if (config === null) return null;\n\n return yield* run(config, code);\n});\n\nexport const transform: Transform = function transform(\n code,\n optsOrCallback?: InputOptions | null | undefined | FileResultCallback,\n maybeCallback?: FileResultCallback,\n) {\n let opts: InputOptions | undefined | null;\n let callback: FileResultCallback | undefined;\n if (typeof optsOrCallback === \"function\") {\n callback = optsOrCallback;\n opts = undefined;\n } else {\n opts = optsOrCallback;\n callback = maybeCallback;\n }\n\n if (callback === undefined) {\n if (process.env.BABEL_8_BREAKING) {\n throw new Error(\n \"Starting from Babel 8.0.0, the 'transform' function expects a callback. If you need to call it synchronously, please use 'transformSync'.\",\n );\n } else {\n // console.warn(\n // \"Starting from Babel 8.0.0, the 'transform' function will expect a callback. If you need to call it synchronously, please use 'transformSync'.\",\n // );\n return beginHiddenCallStack(transformRunner.sync)(code, opts);\n }\n }\n\n beginHiddenCallStack(transformRunner.errback)(code, opts, callback);\n};\n\nexport function transformSync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(transformRunner.sync)(...args);\n}\nexport function transformAsync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(transformRunner.async)(...args);\n}\n"],"mappings":";;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;AAEA;AAGA;AAcA,MAAMA,eAAe,GAAGC,UAAO,CAAC,UAAUC,SAAS,CACjDC,IAAY,EACZC,IAAmB,EACS;EAC5B,MAAMC,MAA6B,GAAG,OAAO,IAAAC,eAAU,EAACF,IAAI,CAAC;EAC7D,IAAIC,MAAM,KAAK,IAAI,EAAE,OAAO,IAAI;EAEhC,OAAO,OAAO,IAAAE,mBAAG,EAACF,MAAM,EAAEF,IAAI,CAAC;AACjC,CAAC,CAAC;AAEK,MAAMD,SAAoB,GAAG,SAASA,SAAS,CACpDC,IAAI,EACJK,cAAqE,EACrEC,aAAkC,EAClC;EACA,IAAIL,IAAqC;EACzC,IAAIM,QAAwC;EAC5C,IAAI,OAAOF,cAAc,KAAK,UAAU,EAAE;IACxCE,QAAQ,GAAGF,cAAc;IACzBJ,IAAI,GAAGO,SAAS;EAClB,CAAC,MAAM;IACLP,IAAI,GAAGI,cAAc;IACrBE,QAAQ,GAAGD,aAAa;EAC1B;EAEA,IAAIC,QAAQ,KAAKC,SAAS,EAAE;IAKnB;MAIL,OAAO,IAAAC,uCAAoB,EAACZ,eAAe,CAACa,IAAI,CAAC,CAACV,IAAI,EAAEC,IAAI,CAAC;IAC/D;EACF;EAEA,IAAAQ,uCAAoB,EAACZ,eAAe,CAACc,OAAO,CAAC,CAACX,IAAI,EAAEC,IAAI,EAAEM,QAAQ,CAAC;AACrE,CAAC;AAAC;AAEK,SAASK,aAAa,CAC3B,GAAGC,IAA6C,EAChD;EACA,OAAO,IAAAJ,uCAAoB,EAACZ,eAAe,CAACa,IAAI,CAAC,CAAC,GAAGG,IAAI,CAAC;AAC5D;AACO,SAASC,cAAc,CAC5B,GAAGD,IAA8C,EACjD;EACA,OAAO,IAAAJ,uCAAoB,EAACZ,eAAe,CAACkB,KAAK,CAAC,CAAC,GAAGF,IAAI,CAAC;AAC7D;AAAC"} \ No newline at end of file +{"version":3,"names":["_gensync","data","require","_index","_index2","_rewriteStackTrace","transformRunner","gensync","transform","code","opts","config","loadConfig","run","exports","optsOrCallback","maybeCallback","callback","undefined","beginHiddenCallStack","sync","errback","transformSync","args","transformAsync","async"],"sources":["../src/transform.ts"],"sourcesContent":["import gensync, { type Handler } from \"gensync\";\n\nimport loadConfig from \"./config/index.ts\";\nimport type { InputOptions, ResolvedConfig } from \"./config/index.ts\";\nimport { run } from \"./transformation/index.ts\";\n\nimport type { FileResult, FileResultCallback } from \"./transformation/index.ts\";\nimport { beginHiddenCallStack } from \"./errors/rewrite-stack-trace.ts\";\n\nexport type { FileResult } from \"./transformation/index.ts\";\n\ntype Transform = {\n (code: string, callback: FileResultCallback): void;\n (\n code: string,\n opts: InputOptions | undefined | null,\n callback: FileResultCallback,\n ): void;\n (code: string, opts?: InputOptions | null): FileResult | null;\n};\n\nconst transformRunner = gensync(function* transform(\n code: string,\n opts?: InputOptions,\n): Handler {\n const config: ResolvedConfig | null = yield* loadConfig(opts);\n if (config === null) return null;\n\n return yield* run(config, code);\n});\n\nexport const transform: Transform = function transform(\n code,\n optsOrCallback?: InputOptions | null | undefined | FileResultCallback,\n maybeCallback?: FileResultCallback,\n) {\n let opts: InputOptions | undefined | null;\n let callback: FileResultCallback | undefined;\n if (typeof optsOrCallback === \"function\") {\n callback = optsOrCallback;\n opts = undefined;\n } else {\n opts = optsOrCallback;\n callback = maybeCallback;\n }\n\n if (callback === undefined) {\n if (process.env.BABEL_8_BREAKING) {\n throw new Error(\n \"Starting from Babel 8.0.0, the 'transform' function expects a callback. If you need to call it synchronously, please use 'transformSync'.\",\n );\n } else {\n // console.warn(\n // \"Starting from Babel 8.0.0, the 'transform' function will expect a callback. If you need to call it synchronously, please use 'transformSync'.\",\n // );\n return beginHiddenCallStack(transformRunner.sync)(code, opts);\n }\n }\n\n beginHiddenCallStack(transformRunner.errback)(code, opts, callback);\n};\n\nexport function transformSync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(transformRunner.sync)(...args);\n}\nexport function transformAsync(\n ...args: Parameters\n) {\n return beginHiddenCallStack(transformRunner.async)(...args);\n}\n"],"mappings":";;;;;;;;AAAA,SAAAA,SAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,QAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,IAAAE,MAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AAGA,IAAAG,kBAAA,GAAAH,OAAA;AAcA,MAAMI,eAAe,GAAGC,SAAMA,CAAC,CAAC,UAAUC,SAASA,CACjDC,IAAY,EACZC,IAAmB,EACS;EAC5B,MAAMC,MAA6B,GAAG,OAAO,IAAAC,cAAU,EAACF,IAAI,CAAC;EAC7D,IAAIC,MAAM,KAAK,IAAI,EAAE,OAAO,IAAI;EAEhC,OAAO,OAAO,IAAAE,WAAG,EAACF,MAAM,EAAEF,IAAI,CAAC;AACjC,CAAC,CAAC;AAEK,MAAMD,SAAoB,GAAAM,OAAA,CAAAN,SAAA,GAAG,SAASA,SAASA,CACpDC,IAAI,EACJM,cAAqE,EACrEC,aAAkC,EAClC;EACA,IAAIN,IAAqC;EACzC,IAAIO,QAAwC;EAC5C,IAAI,OAAOF,cAAc,KAAK,UAAU,EAAE;IACxCE,QAAQ,GAAGF,cAAc;IACzBL,IAAI,GAAGQ,SAAS;EAClB,CAAC,MAAM;IACLR,IAAI,GAAGK,cAAc;IACrBE,QAAQ,GAAGD,aAAa;EAC1B;EAEA,IAAIC,QAAQ,KAAKC,SAAS,EAAE;IAKnB;MAIL,OAAO,IAAAC,uCAAoB,EAACb,eAAe,CAACc,IAAI,CAAC,CAACX,IAAI,EAAEC,IAAI,CAAC;IAC/D;EACF;EAEA,IAAAS,uCAAoB,EAACb,eAAe,CAACe,OAAO,CAAC,CAACZ,IAAI,EAAEC,IAAI,EAAEO,QAAQ,CAAC;AACrE,CAAC;AAEM,SAASK,aAAaA,CAC3B,GAAGC,IAA6C,EAChD;EACA,OAAO,IAAAJ,uCAAoB,EAACb,eAAe,CAACc,IAAI,CAAC,CAAC,GAAGG,IAAI,CAAC;AAC5D;AACO,SAASC,cAAcA,CAC5B,GAAGD,IAA8C,EACjD;EACA,OAAO,IAAAJ,uCAAoB,EAACb,eAAe,CAACmB,KAAK,CAAC,CAAC,GAAGF,IAAI,CAAC;AAC7D;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transformation/block-hoist-plugin.js b/node_modules/@babel/core/lib/transformation/block-hoist-plugin.js index 0f0d35005e97..227b07e46acc 100644 --- a/node_modules/@babel/core/lib/transformation/block-hoist-plugin.js +++ b/node_modules/@babel/core/lib/transformation/block-hoist-plugin.js @@ -11,10 +11,9 @@ function _traverse() { }; return data; } -var _plugin = require("../config/plugin"); +var _plugin = require("../config/plugin.js"); let LOADED_PLUGIN; const blockHoistPlugin = { - name: "internal.blockHoist", visitor: { Block: { @@ -24,7 +23,6 @@ const blockHoistPlugin = { const { body } = node; - let max = Math.pow(2, 30) - 1; let hasChange = false; for (let i = 0; i < body.length; i++) { @@ -37,7 +35,6 @@ const blockHoistPlugin = { max = p; } if (!hasChange) return; - node.body = stableSort(body.slice()); } } @@ -59,15 +56,12 @@ function priority(bodyNode) { } function stableSort(body) { const buckets = Object.create(null); - for (let i = 0; i < body.length; i++) { const n = body[i]; const p = priority(n); - const bucket = buckets[p] || (buckets[p] = []); bucket.push(n); } - const keys = Object.keys(buckets).map(k => +k).sort((a, b) => b - a); let index = 0; for (const key of keys) { diff --git a/node_modules/@babel/core/lib/transformation/block-hoist-plugin.js.map b/node_modules/@babel/core/lib/transformation/block-hoist-plugin.js.map index 231cadde0b1f..8a3f1532a2be 100644 --- a/node_modules/@babel/core/lib/transformation/block-hoist-plugin.js.map +++ b/node_modules/@babel/core/lib/transformation/block-hoist-plugin.js.map @@ -1 +1 @@ -{"version":3,"names":["LOADED_PLUGIN","blockHoistPlugin","name","visitor","Block","exit","node","body","max","hasChange","i","length","n","p","priority","stableSort","slice","loadBlockHoistPlugin","Plugin","traverse","explode","bodyNode","_blockHoist","buckets","Object","create","bucket","push","keys","map","k","sort","a","b","index","key"],"sources":["../../src/transformation/block-hoist-plugin.ts"],"sourcesContent":["import traverse from \"@babel/traverse\";\nimport type { Statement } from \"@babel/types\";\nimport type { PluginObject } from \"../config\";\nimport Plugin from \"../config/plugin\";\n\nlet LOADED_PLUGIN: Plugin | void;\n\nconst blockHoistPlugin: PluginObject = {\n /**\n * [Please add a description.]\n *\n * Priority:\n *\n * - 0 We want this to be at the **very** bottom\n * - 1 Default node position\n * - 2 Priority over normal nodes\n * - 3 We want this to be at the **very** top\n * - 4 Reserved for the helpers used to implement module imports.\n */\n\n name: \"internal.blockHoist\",\n\n visitor: {\n Block: {\n exit({ node }) {\n const { body } = node;\n\n // Largest SMI\n let max = 2 ** 30 - 1;\n let hasChange = false;\n for (let i = 0; i < body.length; i++) {\n const n = body[i];\n const p = priority(n);\n if (p > max) {\n hasChange = true;\n break;\n }\n max = p;\n }\n if (!hasChange) return;\n\n // My kingdom for a stable sort!\n node.body = stableSort(body.slice());\n },\n },\n },\n};\n\nexport default function loadBlockHoistPlugin(): Plugin {\n if (!LOADED_PLUGIN) {\n // cache the loaded blockHoist plugin plugin\n LOADED_PLUGIN = new Plugin(\n {\n ...blockHoistPlugin,\n visitor: traverse.explode(blockHoistPlugin.visitor),\n },\n {},\n );\n }\n\n return LOADED_PLUGIN;\n}\n\nfunction priority(bodyNode: Statement & { _blockHoist?: number | true }) {\n const priority = bodyNode?._blockHoist;\n if (priority == null) return 1;\n if (priority === true) return 2;\n return priority;\n}\n\nfunction stableSort(body: Statement[]) {\n // By default, we use priorities of 0-4.\n const buckets = Object.create(null);\n\n // By collecting into buckets, we can guarantee a stable sort.\n for (let i = 0; i < body.length; i++) {\n const n = body[i];\n const p = priority(n);\n\n // In case some plugin is setting an unexpected priority.\n const bucket = buckets[p] || (buckets[p] = []);\n bucket.push(n);\n }\n\n // Sort our keys in descending order. Keys are unique, so we don't have to\n // worry about stability.\n const keys = Object.keys(buckets)\n .map(k => +k)\n .sort((a, b) => b - a);\n\n let index = 0;\n for (const key of keys) {\n const bucket = buckets[key];\n for (const n of bucket) {\n body[index++] = n;\n }\n }\n return body;\n}\n"],"mappings":";;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAGA;AAEA,IAAIA,aAA4B;AAEhC,MAAMC,gBAA8B,GAAG;;EAarCC,IAAI,EAAE,qBAAqB;EAE3BC,OAAO,EAAE;IACPC,KAAK,EAAE;MACLC,IAAI,CAAC;QAAEC;MAAK,CAAC,EAAE;QACb,MAAM;UAAEC;QAAK,CAAC,GAAGD,IAAI;;QAGrB,IAAIE,GAAG,GAAG,UAAC,EAAI,EAAE,IAAG,CAAC;QACrB,IAAIC,SAAS,GAAG,KAAK;QACrB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,IAAI,CAACI,MAAM,EAAED,CAAC,EAAE,EAAE;UACpC,MAAME,CAAC,GAAGL,IAAI,CAACG,CAAC,CAAC;UACjB,MAAMG,CAAC,GAAGC,QAAQ,CAACF,CAAC,CAAC;UACrB,IAAIC,CAAC,GAAGL,GAAG,EAAE;YACXC,SAAS,GAAG,IAAI;YAChB;UACF;UACAD,GAAG,GAAGK,CAAC;QACT;QACA,IAAI,CAACJ,SAAS,EAAE;;QAGhBH,IAAI,CAACC,IAAI,GAAGQ,UAAU,CAACR,IAAI,CAACS,KAAK,EAAE,CAAC;MACtC;IACF;EACF;AACF,CAAC;AAEc,SAASC,oBAAoB,GAAW;EACrD,IAAI,CAACjB,aAAa,EAAE;IAElBA,aAAa,GAAG,IAAIkB,eAAM,mBAEnBjB,gBAAgB;MACnBE,OAAO,EAAEgB,mBAAQ,CAACC,OAAO,CAACnB,gBAAgB,CAACE,OAAO;IAAC,IAErD,CAAC,CAAC,CACH;EACH;EAEA,OAAOH,aAAa;AACtB;AAEA,SAASc,QAAQ,CAACO,QAAqD,EAAE;EACvE,MAAMP,QAAQ,GAAGO,QAAQ,oBAARA,QAAQ,CAAEC,WAAW;EACtC,IAAIR,QAAQ,IAAI,IAAI,EAAE,OAAO,CAAC;EAC9B,IAAIA,QAAQ,KAAK,IAAI,EAAE,OAAO,CAAC;EAC/B,OAAOA,QAAQ;AACjB;AAEA,SAASC,UAAU,CAACR,IAAiB,EAAE;EAErC,MAAMgB,OAAO,GAAGC,MAAM,CAACC,MAAM,CAAC,IAAI,CAAC;;EAGnC,KAAK,IAAIf,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,IAAI,CAACI,MAAM,EAAED,CAAC,EAAE,EAAE;IACpC,MAAME,CAAC,GAAGL,IAAI,CAACG,CAAC,CAAC;IACjB,MAAMG,CAAC,GAAGC,QAAQ,CAACF,CAAC,CAAC;;IAGrB,MAAMc,MAAM,GAAGH,OAAO,CAACV,CAAC,CAAC,KAAKU,OAAO,CAACV,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9Ca,MAAM,CAACC,IAAI,CAACf,CAAC,CAAC;EAChB;;EAIA,MAAMgB,IAAI,GAAGJ,MAAM,CAACI,IAAI,CAACL,OAAO,CAAC,CAC9BM,GAAG,CAACC,CAAC,IAAI,CAACA,CAAC,CAAC,CACZC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,GAAGD,CAAC,CAAC;EAExB,IAAIE,KAAK,GAAG,CAAC;EACb,KAAK,MAAMC,GAAG,IAAIP,IAAI,EAAE;IACtB,MAAMF,MAAM,GAAGH,OAAO,CAACY,GAAG,CAAC;IAC3B,KAAK,MAAMvB,CAAC,IAAIc,MAAM,EAAE;MACtBnB,IAAI,CAAC2B,KAAK,EAAE,CAAC,GAAGtB,CAAC;IACnB;EACF;EACA,OAAOL,IAAI;AACb;AAAC"} \ No newline at end of file +{"version":3,"names":["_traverse","data","require","_plugin","LOADED_PLUGIN","blockHoistPlugin","name","visitor","Block","exit","node","body","max","Math","pow","hasChange","i","length","n","p","priority","stableSort","slice","loadBlockHoistPlugin","Plugin","Object","assign","traverse","explode","bodyNode","_blockHoist","buckets","create","bucket","push","keys","map","k","sort","a","b","index","key"],"sources":["../../src/transformation/block-hoist-plugin.ts"],"sourcesContent":["import traverse from \"@babel/traverse\";\nimport type { Statement } from \"@babel/types\";\nimport type { PluginObject } from \"../config/index.ts\";\nimport Plugin from \"../config/plugin.ts\";\n\nlet LOADED_PLUGIN: Plugin | void;\n\nconst blockHoistPlugin: PluginObject = {\n /**\n * [Please add a description.]\n *\n * Priority:\n *\n * - 0 We want this to be at the **very** bottom\n * - 1 Default node position\n * - 2 Priority over normal nodes\n * - 3 We want this to be at the **very** top\n * - 4 Reserved for the helpers used to implement module imports.\n */\n\n name: \"internal.blockHoist\",\n\n visitor: {\n Block: {\n exit({ node }) {\n const { body } = node;\n\n // Largest SMI\n let max = 2 ** 30 - 1;\n let hasChange = false;\n for (let i = 0; i < body.length; i++) {\n const n = body[i];\n const p = priority(n);\n if (p > max) {\n hasChange = true;\n break;\n }\n max = p;\n }\n if (!hasChange) return;\n\n // My kingdom for a stable sort!\n node.body = stableSort(body.slice());\n },\n },\n },\n};\n\nexport default function loadBlockHoistPlugin(): Plugin {\n if (!LOADED_PLUGIN) {\n // cache the loaded blockHoist plugin plugin\n LOADED_PLUGIN = new Plugin(\n {\n ...blockHoistPlugin,\n visitor: traverse.explode(blockHoistPlugin.visitor),\n },\n {},\n );\n }\n\n return LOADED_PLUGIN;\n}\n\nfunction priority(bodyNode: Statement & { _blockHoist?: number | true }) {\n const priority = bodyNode?._blockHoist;\n if (priority == null) return 1;\n if (priority === true) return 2;\n return priority;\n}\n\nfunction stableSort(body: Statement[]) {\n // By default, we use priorities of 0-4.\n const buckets = Object.create(null);\n\n // By collecting into buckets, we can guarantee a stable sort.\n for (let i = 0; i < body.length; i++) {\n const n = body[i];\n const p = priority(n);\n\n // In case some plugin is setting an unexpected priority.\n const bucket = buckets[p] || (buckets[p] = []);\n bucket.push(n);\n }\n\n // Sort our keys in descending order. Keys are unique, so we don't have to\n // worry about stability.\n const keys = Object.keys(buckets)\n .map(k => +k)\n .sort((a, b) => b - a);\n\n let index = 0;\n for (const key of keys) {\n const bucket = buckets[key];\n for (const n of bucket) {\n body[index++] = n;\n }\n }\n return body;\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transformation/file/file.js b/node_modules/@babel/core/lib/transformation/file/file.js index 77d941fc277d..eea4fd4bec16 100644 --- a/node_modules/@babel/core/lib/transformation/file/file.js +++ b/node_modules/@babel/core/lib/transformation/file/file.js @@ -94,7 +94,6 @@ class File { }).setContext(); this.scope = this.path.scope; } - get shebang() { const { interpreter @@ -126,7 +125,6 @@ class File { addImport() { throw new Error("This API has been removed. If you're looking for this " + "functionality in Babel 7, you should import the " + "'@babel/helper-module-imports' module and use the functions exposed " + " from that module, such as 'addNamed' or 'addDefault'."); } - availableHelper(name, versionRange) { let minVersion; try { @@ -136,7 +134,6 @@ class File { return false; } if (typeof versionRange !== "string") return true; - if (_semver().valid(versionRange)) versionRange = `^${versionRange}`; return !_semver().intersects(`<${minVersion}`, versionRange) && !_semver().intersects(`>=8.0.0`, versionRange); } @@ -148,7 +145,6 @@ class File { const res = generator(name); if (res) return res; } - helpers().ensure(name, File); const uid = this.declarations[name] = this.scope.generateUidIdentifier(name); const dependencies = {}; diff --git a/node_modules/@babel/core/lib/transformation/file/file.js.map b/node_modules/@babel/core/lib/transformation/file/file.js.map index 30438781fc84..0cd01de0195d 100644 --- a/node_modules/@babel/core/lib/transformation/file/file.js.map +++ b/node_modules/@babel/core/lib/transformation/file/file.js.map @@ -1 +1 @@ -{"version":3,"names":["cloneNode","interpreterDirective","errorVisitor","enter","path","state","loc","node","stop","File","constructor","options","code","ast","inputMap","_map","Map","opts","declarations","scope","metadata","hub","file","getCode","getScope","addHelper","bind","buildError","buildCodeFrameError","NodePath","get","parentPath","parent","container","key","setContext","shebang","interpreter","value","replaceWith","remove","set","val","Error","has","getModuleName","addImport","availableHelper","name","versionRange","minVersion","helpers","err","semver","valid","intersects","declar","generator","res","ensure","uid","generateUidIdentifier","dependencies","dep","getDependencies","nodes","globals","Object","keys","getAllBindings","forEach","hasBinding","rename","_compact","unshiftContainer","indexOf","isVariableDeclaration","registerDeclaration","addTemplateObject","msg","_Error","SyntaxError","_loc","traverse","txt","highlightCode","codeFrameColumns","start","line","column","end","undefined"],"sources":["../../../src/transformation/file/file.ts"],"sourcesContent":["import * as helpers from \"@babel/helpers\";\nimport { NodePath } from \"@babel/traverse\";\nimport type { HubInterface, Visitor, Scope } from \"@babel/traverse\";\nimport { codeFrameColumns } from \"@babel/code-frame\";\nimport traverse from \"@babel/traverse\";\nimport { cloneNode, interpreterDirective } from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport { getModuleName } from \"@babel/helper-module-transforms\";\nimport semver from \"semver\";\n\nimport type { NormalizedFile } from \"../normalize-file\";\n\nconst errorVisitor: Visitor<{ loc: NodeLocation[\"loc\"] | null }> = {\n enter(path, state) {\n const loc = path.node.loc;\n if (loc) {\n state.loc = loc;\n path.stop();\n }\n },\n};\n\nexport type NodeLocation = {\n loc?: {\n end?: {\n line: number;\n column: number;\n };\n start: {\n line: number;\n column: number;\n };\n };\n _loc?: {\n end?: {\n line: number;\n column: number;\n };\n start: {\n line: number;\n column: number;\n };\n };\n};\n\nexport default class File {\n _map: Map = new Map();\n opts: { [key: string]: any };\n declarations: { [key: string]: t.Identifier } = {};\n path: NodePath;\n ast: t.File;\n scope: Scope;\n metadata: { [key: string]: any } = {};\n code: string = \"\";\n inputMap: any;\n\n hub: HubInterface & { file: File } = {\n // keep it for the usage in babel-core, ex: path.hub.file.opts.filename\n file: this,\n getCode: () => this.code,\n getScope: () => this.scope,\n addHelper: this.addHelper.bind(this),\n buildError: this.buildCodeFrameError.bind(this),\n };\n\n constructor(options: {}, { code, ast, inputMap }: NormalizedFile) {\n this.opts = options;\n this.code = code;\n this.ast = ast;\n this.inputMap = inputMap;\n\n this.path = NodePath.get({\n hub: this.hub,\n parentPath: null,\n parent: this.ast,\n container: this.ast,\n key: \"program\",\n }).setContext() as NodePath;\n this.scope = this.path.scope;\n }\n\n /**\n * Provide backward-compatible access to the interpreter directive handling\n * in Babel 6.x. If you are writing a plugin for Babel 7.x, it would be\n * best to use 'program.interpreter' directly.\n */\n get shebang(): string {\n const { interpreter } = this.path.node;\n return interpreter ? interpreter.value : \"\";\n }\n set shebang(value: string) {\n if (value) {\n this.path.get(\"interpreter\").replaceWith(interpreterDirective(value));\n } else {\n this.path.get(\"interpreter\").remove();\n }\n }\n\n set(key: unknown, val: unknown) {\n if (key === \"helpersNamespace\") {\n throw new Error(\n \"Babel 7.0.0-beta.56 has dropped support for the 'helpersNamespace' utility.\" +\n \"If you are using @babel/plugin-external-helpers you will need to use a newer \" +\n \"version than the one you currently have installed. \" +\n \"If you have your own implementation, you'll want to explore using 'helperGenerator' \" +\n \"alongside 'file.availableHelper()'.\",\n );\n }\n\n this._map.set(key, val);\n }\n\n get(key: unknown): any {\n return this._map.get(key);\n }\n\n has(key: unknown): boolean {\n return this._map.has(key);\n }\n\n getModuleName(): string | undefined | null {\n return getModuleName(this.opts, this.opts);\n }\n\n addImport() {\n throw new Error(\n \"This API has been removed. If you're looking for this \" +\n \"functionality in Babel 7, you should import the \" +\n \"'@babel/helper-module-imports' module and use the functions exposed \" +\n \" from that module, such as 'addNamed' or 'addDefault'.\",\n );\n }\n\n /**\n * Check if a given helper is available in @babel/core's helper list.\n *\n * This _also_ allows you to pass a Babel version specifically. If the\n * helper exists, but was not available for the full given range, it will be\n * considered unavailable.\n */\n availableHelper(name: string, versionRange?: string | null): boolean {\n let minVersion;\n try {\n minVersion = helpers.minVersion(name);\n } catch (err) {\n if (err.code !== \"BABEL_HELPER_UNKNOWN\") throw err;\n\n return false;\n }\n\n if (typeof versionRange !== \"string\") return true;\n\n // semver.intersects() has some surprising behavior with comparing ranges\n // with pre-release versions. We add '^' to ensure that we are always\n // comparing ranges with ranges, which sidesteps this logic.\n // For example:\n //\n // semver.intersects(`<7.0.1`, \"7.0.0-beta.0\") // false - surprising\n // semver.intersects(`<7.0.1`, \"^7.0.0-beta.0\") // true - expected\n //\n // This is because the first falls back to\n //\n // semver.satisfies(\"7.0.0-beta.0\", `<7.0.1`) // false - surprising\n //\n // and this fails because a prerelease version can only satisfy a range\n // if it is a prerelease within the same major/minor/patch range.\n //\n // Note: If this is found to have issues, please also revisit the logic in\n // transform-runtime's definitions.js file.\n if (semver.valid(versionRange)) versionRange = `^${versionRange}`;\n\n return (\n !semver.intersects(`<${minVersion}`, versionRange) &&\n !semver.intersects(`>=8.0.0`, versionRange)\n );\n }\n\n addHelper(name: string): t.Identifier {\n const declar = this.declarations[name];\n if (declar) return cloneNode(declar);\n\n const generator = this.get(\"helperGenerator\");\n if (generator) {\n const res = generator(name);\n if (res) return res;\n }\n\n // make sure that the helper exists\n helpers.ensure(name, File);\n\n const uid = (this.declarations[name] =\n this.scope.generateUidIdentifier(name));\n\n const dependencies: { [key: string]: t.Identifier } = {};\n for (const dep of helpers.getDependencies(name)) {\n dependencies[dep] = this.addHelper(dep);\n }\n\n const { nodes, globals } = helpers.get(\n name,\n dep => dependencies[dep],\n uid,\n Object.keys(this.scope.getAllBindings()),\n );\n\n globals.forEach(name => {\n if (this.path.scope.hasBinding(name, true /* noGlobals */)) {\n this.path.scope.rename(name);\n }\n });\n\n nodes.forEach(node => {\n // @ts-expect-error Fixeme: document _compact node property\n node._compact = true;\n });\n\n this.path.unshiftContainer(\"body\", nodes);\n // TODO: NodePath#unshiftContainer should automatically register new\n // bindings.\n this.path.get(\"body\").forEach(path => {\n if (nodes.indexOf(path.node) === -1) return;\n if (path.isVariableDeclaration()) this.scope.registerDeclaration(path);\n });\n\n return uid;\n }\n\n addTemplateObject() {\n throw new Error(\n \"This function has been moved into the template literal transform itself.\",\n );\n }\n\n buildCodeFrameError(\n node: NodeLocation | undefined | null,\n msg: string,\n _Error: typeof Error = SyntaxError,\n ): Error {\n let loc = node && (node.loc || node._loc);\n\n if (!loc && node) {\n const state: { loc?: NodeLocation[\"loc\"] | null } = {\n loc: null,\n };\n traverse(node as t.Node, errorVisitor, this.scope, state);\n loc = state.loc;\n\n let txt =\n \"This is an error on an internal node. Probably an internal error.\";\n if (loc) txt += \" Location has been estimated.\";\n\n msg += ` (${txt})`;\n }\n\n if (loc) {\n const { highlightCode = true } = this.opts;\n\n msg +=\n \"\\n\" +\n codeFrameColumns(\n this.code,\n {\n start: {\n line: loc.start.line,\n column: loc.start.column + 1,\n },\n end:\n loc.end && loc.start.line === loc.end.line\n ? {\n line: loc.end.line,\n column: loc.end.column + 1,\n }\n : undefined,\n },\n { highlightCode },\n );\n }\n\n return new _Error(msg);\n }\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["helpers","data","require","_traverse","_codeFrame","_t","_helperModuleTransforms","_semver","cloneNode","interpreterDirective","errorVisitor","enter","path","state","loc","node","stop","File","constructor","options","code","ast","inputMap","_map","Map","opts","declarations","scope","metadata","hub","file","getCode","getScope","addHelper","bind","buildError","buildCodeFrameError","NodePath","get","parentPath","parent","container","key","setContext","shebang","interpreter","value","replaceWith","remove","set","val","Error","has","getModuleName","addImport","availableHelper","name","versionRange","minVersion","err","semver","valid","intersects","declar","generator","res","ensure","uid","generateUidIdentifier","dependencies","dep","getDependencies","nodes","globals","Object","keys","getAllBindings","forEach","hasBinding","rename","_compact","unshiftContainer","indexOf","isVariableDeclaration","registerDeclaration","addTemplateObject","msg","_Error","SyntaxError","_loc","traverse","txt","highlightCode","codeFrameColumns","start","line","column","end","undefined","exports","default"],"sources":["../../../src/transformation/file/file.ts"],"sourcesContent":["import * as helpers from \"@babel/helpers\";\nimport { NodePath } from \"@babel/traverse\";\nimport type { HubInterface, Visitor, Scope } from \"@babel/traverse\";\nimport { codeFrameColumns } from \"@babel/code-frame\";\nimport traverse from \"@babel/traverse\";\nimport { cloneNode, interpreterDirective } from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport { getModuleName } from \"@babel/helper-module-transforms\";\nimport semver from \"semver\";\n\nimport type { NormalizedFile } from \"../normalize-file.ts\";\n\nconst errorVisitor: Visitor<{ loc: NodeLocation[\"loc\"] | null }> = {\n enter(path, state) {\n const loc = path.node.loc;\n if (loc) {\n state.loc = loc;\n path.stop();\n }\n },\n};\n\nexport type NodeLocation = {\n loc?: {\n end?: {\n line: number;\n column: number;\n };\n start: {\n line: number;\n column: number;\n };\n };\n _loc?: {\n end?: {\n line: number;\n column: number;\n };\n start: {\n line: number;\n column: number;\n };\n };\n};\n\nexport default class File {\n _map: Map = new Map();\n opts: { [key: string]: any };\n declarations: { [key: string]: t.Identifier } = {};\n path: NodePath;\n ast: t.File;\n scope: Scope;\n metadata: { [key: string]: any } = {};\n code: string = \"\";\n inputMap: any;\n\n hub: HubInterface & { file: File } = {\n // keep it for the usage in babel-core, ex: path.hub.file.opts.filename\n file: this,\n getCode: () => this.code,\n getScope: () => this.scope,\n addHelper: this.addHelper.bind(this),\n buildError: this.buildCodeFrameError.bind(this),\n };\n\n constructor(options: {}, { code, ast, inputMap }: NormalizedFile) {\n this.opts = options;\n this.code = code;\n this.ast = ast;\n this.inputMap = inputMap;\n\n this.path = NodePath.get({\n hub: this.hub,\n parentPath: null,\n parent: this.ast,\n container: this.ast,\n key: \"program\",\n }).setContext() as NodePath;\n this.scope = this.path.scope;\n }\n\n /**\n * Provide backward-compatible access to the interpreter directive handling\n * in Babel 6.x. If you are writing a plugin for Babel 7.x, it would be\n * best to use 'program.interpreter' directly.\n */\n get shebang(): string {\n const { interpreter } = this.path.node;\n return interpreter ? interpreter.value : \"\";\n }\n set shebang(value: string) {\n if (value) {\n this.path.get(\"interpreter\").replaceWith(interpreterDirective(value));\n } else {\n this.path.get(\"interpreter\").remove();\n }\n }\n\n set(key: unknown, val: unknown) {\n if (key === \"helpersNamespace\") {\n throw new Error(\n \"Babel 7.0.0-beta.56 has dropped support for the 'helpersNamespace' utility.\" +\n \"If you are using @babel/plugin-external-helpers you will need to use a newer \" +\n \"version than the one you currently have installed. \" +\n \"If you have your own implementation, you'll want to explore using 'helperGenerator' \" +\n \"alongside 'file.availableHelper()'.\",\n );\n }\n\n this._map.set(key, val);\n }\n\n get(key: unknown): any {\n return this._map.get(key);\n }\n\n has(key: unknown): boolean {\n return this._map.has(key);\n }\n\n getModuleName(): string | undefined | null {\n return getModuleName(this.opts, this.opts);\n }\n\n addImport() {\n throw new Error(\n \"This API has been removed. If you're looking for this \" +\n \"functionality in Babel 7, you should import the \" +\n \"'@babel/helper-module-imports' module and use the functions exposed \" +\n \" from that module, such as 'addNamed' or 'addDefault'.\",\n );\n }\n\n /**\n * Check if a given helper is available in @babel/core's helper list.\n *\n * This _also_ allows you to pass a Babel version specifically. If the\n * helper exists, but was not available for the full given range, it will be\n * considered unavailable.\n */\n availableHelper(name: string, versionRange?: string | null): boolean {\n let minVersion;\n try {\n minVersion = helpers.minVersion(name);\n } catch (err) {\n if (err.code !== \"BABEL_HELPER_UNKNOWN\") throw err;\n\n return false;\n }\n\n if (typeof versionRange !== \"string\") return true;\n\n // semver.intersects() has some surprising behavior with comparing ranges\n // with pre-release versions. We add '^' to ensure that we are always\n // comparing ranges with ranges, which sidesteps this logic.\n // For example:\n //\n // semver.intersects(`<7.0.1`, \"7.0.0-beta.0\") // false - surprising\n // semver.intersects(`<7.0.1`, \"^7.0.0-beta.0\") // true - expected\n //\n // This is because the first falls back to\n //\n // semver.satisfies(\"7.0.0-beta.0\", `<7.0.1`) // false - surprising\n //\n // and this fails because a prerelease version can only satisfy a range\n // if it is a prerelease within the same major/minor/patch range.\n //\n // Note: If this is found to have issues, please also revisit the logic in\n // transform-runtime's definitions.js file.\n if (semver.valid(versionRange)) versionRange = `^${versionRange}`;\n\n return (\n !semver.intersects(`<${minVersion}`, versionRange) &&\n !semver.intersects(`>=8.0.0`, versionRange)\n );\n }\n\n addHelper(name: string): t.Identifier {\n const declar = this.declarations[name];\n if (declar) return cloneNode(declar);\n\n const generator = this.get(\"helperGenerator\");\n if (generator) {\n const res = generator(name);\n if (res) return res;\n }\n\n // make sure that the helper exists\n helpers.ensure(name, File);\n\n const uid = (this.declarations[name] =\n this.scope.generateUidIdentifier(name));\n\n const dependencies: { [key: string]: t.Identifier } = {};\n for (const dep of helpers.getDependencies(name)) {\n dependencies[dep] = this.addHelper(dep);\n }\n\n const { nodes, globals } = helpers.get(\n name,\n dep => dependencies[dep],\n uid,\n Object.keys(this.scope.getAllBindings()),\n );\n\n globals.forEach(name => {\n if (this.path.scope.hasBinding(name, true /* noGlobals */)) {\n this.path.scope.rename(name);\n }\n });\n\n nodes.forEach(node => {\n // @ts-expect-error Fixme: document _compact node property\n node._compact = true;\n });\n\n this.path.unshiftContainer(\"body\", nodes);\n // TODO: NodePath#unshiftContainer should automatically register new\n // bindings.\n this.path.get(\"body\").forEach(path => {\n if (nodes.indexOf(path.node) === -1) return;\n if (path.isVariableDeclaration()) this.scope.registerDeclaration(path);\n });\n\n return uid;\n }\n\n addTemplateObject() {\n throw new Error(\n \"This function has been moved into the template literal transform itself.\",\n );\n }\n\n buildCodeFrameError(\n node: NodeLocation | undefined | null,\n msg: string,\n _Error: typeof Error = SyntaxError,\n ): Error {\n let loc = node && (node.loc || node._loc);\n\n if (!loc && node) {\n const state: { loc?: NodeLocation[\"loc\"] | null } = {\n loc: null,\n };\n traverse(node as t.Node, errorVisitor, this.scope, state);\n loc = state.loc;\n\n let txt =\n \"This is an error on an internal node. Probably an internal error.\";\n if (loc) txt += \" Location has been estimated.\";\n\n msg += ` (${txt})`;\n }\n\n if (loc) {\n const { highlightCode = true } = this.opts;\n\n msg +=\n \"\\n\" +\n codeFrameColumns(\n this.code,\n {\n start: {\n line: loc.start.line,\n column: loc.start.column + 1,\n },\n end:\n loc.end && loc.start.line === loc.end.line\n ? {\n line: loc.end.line,\n column: loc.end.column + 1,\n }\n : undefined,\n },\n { highlightCode },\n );\n }\n\n return new _Error(msg);\n }\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transformation/file/generate.js b/node_modules/@babel/core/lib/transformation/file/generate.js index b711469093c4..10b5b29fb7c1 100644 --- a/node_modules/@babel/core/lib/transformation/file/generate.js +++ b/node_modules/@babel/core/lib/transformation/file/generate.js @@ -18,7 +18,7 @@ function _generator() { }; return data; } -var _mergeMap = require("./merge-map"); +var _mergeMap = require("./merge-map.js"); function generateCode(pluginPasses, file) { const { opts, @@ -29,6 +29,7 @@ function generateCode(pluginPasses, file) { const { generatorOpts } = opts; + generatorOpts.inputSourceMap = inputMap == null ? void 0 : inputMap.toObject(); const results = []; for (const plugins of pluginPasses) { for (const plugin of plugins) { @@ -52,16 +53,19 @@ function generateCode(pluginPasses, file) { } else { throw new Error("More than one plugin attempted to override codegen."); } - let { code: outputCode, decodedMap: outputMap = result.map } = result; - if (outputMap) { - if (inputMap) { - outputMap = (0, _mergeMap.default)(inputMap.toObject(), outputMap, generatorOpts.sourceFileName); - } else { - outputMap = result.map; + if (result.__mergedMap) { + outputMap = Object.assign({}, result.map); + } else { + if (outputMap) { + if (inputMap) { + outputMap = (0, _mergeMap.default)(inputMap.toObject(), outputMap, generatorOpts.sourceFileName); + } else { + outputMap = result.map; + } } } if (opts.sourceMaps === "inline" || opts.sourceMaps === "both") { diff --git a/node_modules/@babel/core/lib/transformation/file/generate.js.map b/node_modules/@babel/core/lib/transformation/file/generate.js.map index c9fa3fd480c9..ae4e28cacc6b 100644 --- a/node_modules/@babel/core/lib/transformation/file/generate.js.map +++ b/node_modules/@babel/core/lib/transformation/file/generate.js.map @@ -1 +1 @@ -{"version":3,"names":["generateCode","pluginPasses","file","opts","ast","code","inputMap","generatorOpts","results","plugins","plugin","generatorOverride","result","generate","undefined","push","length","then","Error","outputCode","decodedMap","outputMap","map","mergeSourceMap","toObject","sourceFileName","sourceMaps","convertSourceMap","fromObject","toComment"],"sources":["../../../src/transformation/file/generate.ts"],"sourcesContent":["import type { PluginPasses } from \"../../config\";\nimport convertSourceMap from \"convert-source-map\";\ntype SourceMap = any;\nimport generate from \"@babel/generator\";\n\nimport type File from \"./file\";\nimport mergeSourceMap from \"./merge-map\";\n\nexport default function generateCode(\n pluginPasses: PluginPasses,\n file: File,\n): {\n outputCode: string;\n outputMap: SourceMap | null;\n} {\n const { opts, ast, code, inputMap } = file;\n const { generatorOpts } = opts;\n\n const results = [];\n for (const plugins of pluginPasses) {\n for (const plugin of plugins) {\n const { generatorOverride } = plugin;\n if (generatorOverride) {\n const result = generatorOverride(ast, generatorOpts, code, generate);\n\n if (result !== undefined) results.push(result);\n }\n }\n }\n\n let result;\n if (results.length === 0) {\n result = generate(ast, generatorOpts, code);\n } else if (results.length === 1) {\n result = results[0];\n\n if (typeof result.then === \"function\") {\n throw new Error(\n `You appear to be using an async codegen plugin, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, ` +\n `you may need to upgrade your @babel/core version.`,\n );\n }\n } else {\n throw new Error(\"More than one plugin attempted to override codegen.\");\n }\n\n // Decoded maps are faster to merge, so we attempt to get use the decodedMap\n // first. But to preserve backwards compat with older Generator, we'll fall\n // back to the encoded map.\n let { code: outputCode, decodedMap: outputMap = result.map } = result;\n\n if (outputMap) {\n if (inputMap) {\n // mergeSourceMap returns an encoded map\n outputMap = mergeSourceMap(\n inputMap.toObject(),\n outputMap,\n generatorOpts.sourceFileName,\n );\n } else {\n // We cannot output a decoded map, so retrieve the encoded form. Because\n // the decoded form is free, it's fine to prioritize decoded first.\n outputMap = result.map;\n }\n }\n\n if (opts.sourceMaps === \"inline\" || opts.sourceMaps === \"both\") {\n outputCode += \"\\n\" + convertSourceMap.fromObject(outputMap).toComment();\n }\n\n if (opts.sourceMaps === \"inline\") {\n outputMap = null;\n }\n\n return { outputCode, outputMap };\n}\n"],"mappings":";;;;;;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAGA;AAEe,SAASA,YAAY,CAClCC,YAA0B,EAC1BC,IAAU,EAIV;EACA,MAAM;IAAEC,IAAI;IAAEC,GAAG;IAAEC,IAAI;IAAEC;EAAS,CAAC,GAAGJ,IAAI;EAC1C,MAAM;IAAEK;EAAc,CAAC,GAAGJ,IAAI;EAE9B,MAAMK,OAAO,GAAG,EAAE;EAClB,KAAK,MAAMC,OAAO,IAAIR,YAAY,EAAE;IAClC,KAAK,MAAMS,MAAM,IAAID,OAAO,EAAE;MAC5B,MAAM;QAAEE;MAAkB,CAAC,GAAGD,MAAM;MACpC,IAAIC,iBAAiB,EAAE;QACrB,MAAMC,MAAM,GAAGD,iBAAiB,CAACP,GAAG,EAAEG,aAAa,EAAEF,IAAI,EAAEQ,oBAAQ,CAAC;QAEpE,IAAID,MAAM,KAAKE,SAAS,EAAEN,OAAO,CAACO,IAAI,CAACH,MAAM,CAAC;MAChD;IACF;EACF;EAEA,IAAIA,MAAM;EACV,IAAIJ,OAAO,CAACQ,MAAM,KAAK,CAAC,EAAE;IACxBJ,MAAM,GAAG,IAAAC,oBAAQ,EAACT,GAAG,EAAEG,aAAa,EAAEF,IAAI,CAAC;EAC7C,CAAC,MAAM,IAAIG,OAAO,CAACQ,MAAM,KAAK,CAAC,EAAE;IAC/BJ,MAAM,GAAGJ,OAAO,CAAC,CAAC,CAAC;IAEnB,IAAI,OAAOI,MAAM,CAACK,IAAI,KAAK,UAAU,EAAE;MACrC,MAAM,IAAIC,KAAK,CACZ,kDAAiD,GAC/C,wDAAuD,GACvD,sCAAqC,GACrC,mDAAkD,CACtD;IACH;EACF,CAAC,MAAM;IACL,MAAM,IAAIA,KAAK,CAAC,qDAAqD,CAAC;EACxE;;EAKA,IAAI;IAAEb,IAAI,EAAEc,UAAU;IAAEC,UAAU,EAAEC,SAAS,GAAGT,MAAM,CAACU;EAAI,CAAC,GAAGV,MAAM;EAErE,IAAIS,SAAS,EAAE;IACb,IAAIf,QAAQ,EAAE;MAEZe,SAAS,GAAG,IAAAE,iBAAc,EACxBjB,QAAQ,CAACkB,QAAQ,EAAE,EACnBH,SAAS,EACTd,aAAa,CAACkB,cAAc,CAC7B;IACH,CAAC,MAAM;MAGLJ,SAAS,GAAGT,MAAM,CAACU,GAAG;IACxB;EACF;EAEA,IAAInB,IAAI,CAACuB,UAAU,KAAK,QAAQ,IAAIvB,IAAI,CAACuB,UAAU,KAAK,MAAM,EAAE;IAC9DP,UAAU,IAAI,IAAI,GAAGQ,mBAAgB,CAACC,UAAU,CAACP,SAAS,CAAC,CAACQ,SAAS,EAAE;EACzE;EAEA,IAAI1B,IAAI,CAACuB,UAAU,KAAK,QAAQ,EAAE;IAChCL,SAAS,GAAG,IAAI;EAClB;EAEA,OAAO;IAAEF,UAAU;IAAEE;EAAU,CAAC;AAClC;AAAC"} \ No newline at end of file +{"version":3,"names":["_convertSourceMap","data","require","_generator","_mergeMap","generateCode","pluginPasses","file","opts","ast","code","inputMap","generatorOpts","inputSourceMap","toObject","results","plugins","plugin","generatorOverride","result","generate","undefined","push","length","then","Error","outputCode","decodedMap","outputMap","map","__mergedMap","Object","assign","mergeSourceMap","sourceFileName","sourceMaps","convertSourceMap","fromObject","toComment"],"sources":["../../../src/transformation/file/generate.ts"],"sourcesContent":["import type { PluginPasses } from \"../../config/index.ts\";\nimport convertSourceMap from \"convert-source-map\";\nimport type { GeneratorResult } from \"@babel/generator\";\nimport generate from \"@babel/generator\";\n\nimport type File from \"./file.ts\";\nimport mergeSourceMap from \"./merge-map.ts\";\n\nexport default function generateCode(\n pluginPasses: PluginPasses,\n file: File,\n): {\n outputCode: string;\n outputMap: GeneratorResult[\"map\"] | null;\n} {\n const { opts, ast, code, inputMap } = file;\n const { generatorOpts } = opts;\n\n generatorOpts.inputSourceMap = inputMap?.toObject();\n\n const results = [];\n for (const plugins of pluginPasses) {\n for (const plugin of plugins) {\n const { generatorOverride } = plugin;\n if (generatorOverride) {\n const result = generatorOverride(ast, generatorOpts, code, generate);\n\n if (result !== undefined) results.push(result);\n }\n }\n }\n\n let result;\n if (results.length === 0) {\n result = generate(ast, generatorOpts, code);\n } else if (results.length === 1) {\n result = results[0];\n\n if (typeof result.then === \"function\") {\n throw new Error(\n `You appear to be using an async codegen plugin, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, ` +\n `you may need to upgrade your @babel/core version.`,\n );\n }\n } else {\n throw new Error(\"More than one plugin attempted to override codegen.\");\n }\n\n // Decoded maps are faster to merge, so we attempt to get use the decodedMap\n // first. But to preserve backwards compat with older Generator, we'll fall\n // back to the encoded map.\n let { code: outputCode, decodedMap: outputMap = result.map } = result;\n\n // For backwards compat.\n if (result.__mergedMap) {\n /**\n * @see mergeSourceMap\n */\n outputMap = { ...result.map };\n } else {\n if (outputMap) {\n if (inputMap) {\n // mergeSourceMap returns an encoded map\n outputMap = mergeSourceMap(\n inputMap.toObject(),\n outputMap,\n generatorOpts.sourceFileName,\n );\n } else {\n // We cannot output a decoded map, so retrieve the encoded form. Because\n // the decoded form is free, it's fine to prioritize decoded first.\n outputMap = result.map;\n }\n }\n }\n\n if (opts.sourceMaps === \"inline\" || opts.sourceMaps === \"both\") {\n outputCode += \"\\n\" + convertSourceMap.fromObject(outputMap).toComment();\n }\n\n if (opts.sourceMaps === \"inline\") {\n outputMap = null;\n }\n\n return { outputCode, outputMap };\n}\n"],"mappings":";;;;;;AACA,SAAAA,kBAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,iBAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,SAAAE,WAAA;EAAA,MAAAF,IAAA,GAAAC,OAAA;EAAAC,UAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAGA,IAAAG,SAAA,GAAAF,OAAA;AAEe,SAASG,YAAYA,CAClCC,YAA0B,EAC1BC,IAAU,EAIV;EACA,MAAM;IAAEC,IAAI;IAAEC,GAAG;IAAEC,IAAI;IAAEC;EAAS,CAAC,GAAGJ,IAAI;EAC1C,MAAM;IAAEK;EAAc,CAAC,GAAGJ,IAAI;EAE9BI,aAAa,CAACC,cAAc,GAAGF,QAAQ,oBAARA,QAAQ,CAAEG,QAAQ,CAAC,CAAC;EAEnD,MAAMC,OAAO,GAAG,EAAE;EAClB,KAAK,MAAMC,OAAO,IAAIV,YAAY,EAAE;IAClC,KAAK,MAAMW,MAAM,IAAID,OAAO,EAAE;MAC5B,MAAM;QAAEE;MAAkB,CAAC,GAAGD,MAAM;MACpC,IAAIC,iBAAiB,EAAE;QACrB,MAAMC,MAAM,GAAGD,iBAAiB,CAACT,GAAG,EAAEG,aAAa,EAAEF,IAAI,EAAEU,oBAAQ,CAAC;QAEpE,IAAID,MAAM,KAAKE,SAAS,EAAEN,OAAO,CAACO,IAAI,CAACH,MAAM,CAAC;MAChD;IACF;EACF;EAEA,IAAIA,MAAM;EACV,IAAIJ,OAAO,CAACQ,MAAM,KAAK,CAAC,EAAE;IACxBJ,MAAM,GAAG,IAAAC,oBAAQ,EAACX,GAAG,EAAEG,aAAa,EAAEF,IAAI,CAAC;EAC7C,CAAC,MAAM,IAAIK,OAAO,CAACQ,MAAM,KAAK,CAAC,EAAE;IAC/BJ,MAAM,GAAGJ,OAAO,CAAC,CAAC,CAAC;IAEnB,IAAI,OAAOI,MAAM,CAACK,IAAI,KAAK,UAAU,EAAE;MACrC,MAAM,IAAIC,KAAK,CACZ,kDAAiD,GAC/C,wDAAuD,GACvD,sCAAqC,GACrC,mDACL,CAAC;IACH;EACF,CAAC,MAAM;IACL,MAAM,IAAIA,KAAK,CAAC,qDAAqD,CAAC;EACxE;EAKA,IAAI;IAAEf,IAAI,EAAEgB,UAAU;IAAEC,UAAU,EAAEC,SAAS,GAAGT,MAAM,CAACU;EAAI,CAAC,GAAGV,MAAM;EAGrE,IAAIA,MAAM,CAACW,WAAW,EAAE;IAItBF,SAAS,GAAAG,MAAA,CAAAC,MAAA,KAAQb,MAAM,CAACU,GAAG,CAAE;EAC/B,CAAC,MAAM;IACL,IAAID,SAAS,EAAE;MACb,IAAIjB,QAAQ,EAAE;QAEZiB,SAAS,GAAG,IAAAK,iBAAc,EACxBtB,QAAQ,CAACG,QAAQ,CAAC,CAAC,EACnBc,SAAS,EACThB,aAAa,CAACsB,cAChB,CAAC;MACH,CAAC,MAAM;QAGLN,SAAS,GAAGT,MAAM,CAACU,GAAG;MACxB;IACF;EACF;EAEA,IAAIrB,IAAI,CAAC2B,UAAU,KAAK,QAAQ,IAAI3B,IAAI,CAAC2B,UAAU,KAAK,MAAM,EAAE;IAC9DT,UAAU,IAAI,IAAI,GAAGU,kBAAeA,CAAC,CAACC,UAAU,CAACT,SAAS,CAAC,CAACU,SAAS,CAAC,CAAC;EACzE;EAEA,IAAI9B,IAAI,CAAC2B,UAAU,KAAK,QAAQ,EAAE;IAChCP,SAAS,GAAG,IAAI;EAClB;EAEA,OAAO;IAAEF,UAAU;IAAEE;EAAU,CAAC;AAClC;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transformation/file/merge-map.js b/node_modules/@babel/core/lib/transformation/file/merge-map.js index 62fab307ec76..cf3971b2acac 100644 --- a/node_modules/@babel/core/lib/transformation/file/merge-map.js +++ b/node_modules/@babel/core/lib/transformation/file/merge-map.js @@ -13,7 +13,6 @@ function _remapping() { } function mergeSourceMap(inputMap, map, sourceFileName) { const source = sourceFileName.replace(/\\/g, "/"); - let found = false; const result = _remapping()(rootless(map), (s, ctx) => { if (s === source && !found) { @@ -26,7 +25,6 @@ function mergeSourceMap(inputMap, map, sourceFileName) { if (typeof inputMap.sourceRoot === "string") { result.sourceRoot = inputMap.sourceRoot; } - return Object.assign({}, result); } function rootless(map) { diff --git a/node_modules/@babel/core/lib/transformation/file/merge-map.js.map b/node_modules/@babel/core/lib/transformation/file/merge-map.js.map index 208fd32333df..d2877a3f3695 100644 --- a/node_modules/@babel/core/lib/transformation/file/merge-map.js.map +++ b/node_modules/@babel/core/lib/transformation/file/merge-map.js.map @@ -1 +1 @@ -{"version":3,"names":["mergeSourceMap","inputMap","map","sourceFileName","source","replace","found","result","remapping","rootless","s","ctx","sourceRoot"],"sources":["../../../src/transformation/file/merge-map.ts"],"sourcesContent":["type SourceMap = any;\nimport remapping from \"@ampproject/remapping\";\n\nexport default function mergeSourceMap(\n inputMap: SourceMap,\n map: SourceMap,\n sourceFileName: string,\n): SourceMap {\n // On win32 machines, the sourceFileName uses backslash paths like\n // `C:\\foo\\bar.js`. But sourcemaps are always posix paths, so we need to\n // normalize to regular slashes before we can merge (else we won't find the\n // source associated with our input map).\n // This mirrors code done while generating the output map at\n // https://github.com/babel/babel/blob/5c2fcadc9ae34fd20dd72b1111d5cf50476d700d/packages/babel-generator/src/source-map.ts#L102\n const source = sourceFileName.replace(/\\\\/g, \"/\");\n\n // Prevent an infinite recursion if one of the input map's sources has the\n // same resolved path as the input map. In the case, it would keep find the\n // input map, then get it's sources which will include a path like the input\n // map, on and on.\n let found = false;\n const result = remapping(rootless(map), (s, ctx) => {\n if (s === source && !found) {\n found = true;\n // We empty the source location, which will prevent the sourcemap from\n // becoming relative to the input's location. Eg, if we're transforming a\n // file 'foo/bar.js', and it is a transformation of a `baz.js` file in the\n // same directory, the expected output is just `baz.js`. Without this step,\n // it would become `foo/baz.js`.\n ctx.source = \"\";\n\n return rootless(inputMap);\n }\n\n return null;\n });\n\n if (typeof inputMap.sourceRoot === \"string\") {\n result.sourceRoot = inputMap.sourceRoot;\n }\n\n // remapping returns a SourceMap class type, but this breaks code downstream in\n // @babel/traverse and @babel/types that relies on data being plain objects.\n // When it encounters the sourcemap type it outputs a \"don't know how to turn\n // this value into a node\" error. As a result, we are converting the merged\n // sourcemap to a plain js object.\n return { ...result };\n}\n\nfunction rootless(map: SourceMap): SourceMap {\n return {\n ...map,\n\n // This is a bit hack. Remapping will create absolute sources in our\n // sourcemap, but we want to maintain sources relative to the sourceRoot.\n // We'll re-add the sourceRoot after remapping.\n sourceRoot: null,\n };\n}\n"],"mappings":";;;;;;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEe,SAASA,cAAc,CACpCC,QAAmB,EACnBC,GAAc,EACdC,cAAsB,EACX;EAOX,MAAMC,MAAM,GAAGD,cAAc,CAACE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;;EAMjD,IAAIC,KAAK,GAAG,KAAK;EACjB,MAAMC,MAAM,GAAGC,YAAS,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE,CAACQ,CAAC,EAAEC,GAAG,KAAK;IAClD,IAAID,CAAC,KAAKN,MAAM,IAAI,CAACE,KAAK,EAAE;MAC1BA,KAAK,GAAG,IAAI;MAMZK,GAAG,CAACP,MAAM,GAAG,EAAE;MAEf,OAAOK,QAAQ,CAACR,QAAQ,CAAC;IAC3B;IAEA,OAAO,IAAI;EACb,CAAC,CAAC;EAEF,IAAI,OAAOA,QAAQ,CAACW,UAAU,KAAK,QAAQ,EAAE;IAC3CL,MAAM,CAACK,UAAU,GAAGX,QAAQ,CAACW,UAAU;EACzC;;EAOA,yBAAYL,MAAM;AACpB;AAEA,SAASE,QAAQ,CAACP,GAAc,EAAa;EAC3C,yBACKA,GAAG;IAKNU,UAAU,EAAE;EAAI;AAEpB;AAAC"} \ No newline at end of file +{"version":3,"names":["_remapping","data","require","mergeSourceMap","inputMap","map","sourceFileName","source","replace","found","result","remapping","rootless","s","ctx","sourceRoot","Object","assign"],"sources":["../../../src/transformation/file/merge-map.ts"],"sourcesContent":["type SourceMap = any;\nimport remapping from \"@ampproject/remapping\";\n\nexport default function mergeSourceMap(\n inputMap: SourceMap,\n map: SourceMap,\n sourceFileName: string,\n): SourceMap {\n // On win32 machines, the sourceFileName uses backslash paths like\n // `C:\\foo\\bar.js`. But sourcemaps are always posix paths, so we need to\n // normalize to regular slashes before we can merge (else we won't find the\n // source associated with our input map).\n // This mirrors code done while generating the output map at\n // https://github.com/babel/babel/blob/5c2fcadc9ae34fd20dd72b1111d5cf50476d700d/packages/babel-generator/src/source-map.ts#L102\n const source = sourceFileName.replace(/\\\\/g, \"/\");\n\n // Prevent an infinite recursion if one of the input map's sources has the\n // same resolved path as the input map. In the case, it would keep find the\n // input map, then get it's sources which will include a path like the input\n // map, on and on.\n let found = false;\n const result = remapping(rootless(map), (s, ctx) => {\n if (s === source && !found) {\n found = true;\n // We empty the source location, which will prevent the sourcemap from\n // becoming relative to the input's location. Eg, if we're transforming a\n // file 'foo/bar.js', and it is a transformation of a `baz.js` file in the\n // same directory, the expected output is just `baz.js`. Without this step,\n // it would become `foo/baz.js`.\n ctx.source = \"\";\n\n return rootless(inputMap);\n }\n\n return null;\n });\n\n if (typeof inputMap.sourceRoot === \"string\") {\n result.sourceRoot = inputMap.sourceRoot;\n }\n\n // remapping returns a SourceMap class type, but this breaks code downstream in\n // @babel/traverse and @babel/types that relies on data being plain objects.\n // When it encounters the sourcemap type it outputs a \"don't know how to turn\n // this value into a node\" error. As a result, we are converting the merged\n // sourcemap to a plain js object.\n return { ...result };\n}\n\nfunction rootless(map: SourceMap): SourceMap {\n return {\n ...map,\n\n // This is a bit hack. Remapping will create absolute sources in our\n // sourcemap, but we want to maintain sources relative to the sourceRoot.\n // We'll re-add the sourceRoot after remapping.\n sourceRoot: null,\n };\n}\n"],"mappings":";;;;;;AACA,SAAAA,WAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,UAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEe,SAASE,cAAcA,CACpCC,QAAmB,EACnBC,GAAc,EACdC,cAAsB,EACX;EAOX,MAAMC,MAAM,GAAGD,cAAc,CAACE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;EAMjD,IAAIC,KAAK,GAAG,KAAK;EACjB,MAAMC,MAAM,GAAGC,WAAQA,CAAC,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE,CAACQ,CAAC,EAAEC,GAAG,KAAK;IAClD,IAAID,CAAC,KAAKN,MAAM,IAAI,CAACE,KAAK,EAAE;MAC1BA,KAAK,GAAG,IAAI;MAMZK,GAAG,CAACP,MAAM,GAAG,EAAE;MAEf,OAAOK,QAAQ,CAACR,QAAQ,CAAC;IAC3B;IAEA,OAAO,IAAI;EACb,CAAC,CAAC;EAEF,IAAI,OAAOA,QAAQ,CAACW,UAAU,KAAK,QAAQ,EAAE;IAC3CL,MAAM,CAACK,UAAU,GAAGX,QAAQ,CAACW,UAAU;EACzC;EAOA,OAAAC,MAAA,CAAAC,MAAA,KAAYP,MAAM;AACpB;AAEA,SAASE,QAAQA,CAACP,GAAc,EAAa;EAC3C,OAAAW,MAAA,CAAAC,MAAA,KACKZ,GAAG;IAKNU,UAAU,EAAE;EAAI;AAEpB;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transformation/index.js b/node_modules/@babel/core/lib/transformation/index.js index 8eaf3b3be2a3..7d3247fc8a93 100644 --- a/node_modules/@babel/core/lib/transformation/index.js +++ b/node_modules/@babel/core/lib/transformation/index.js @@ -11,12 +11,12 @@ function _traverse() { }; return data; } -var _pluginPass = require("./plugin-pass"); -var _blockHoistPlugin = require("./block-hoist-plugin"); -var _normalizeOpts = require("./normalize-opts"); -var _normalizeFile = require("./normalize-file"); -var _generate = require("./file/generate"); -var _deepArray = require("../config/helpers/deep-array"); +var _pluginPass = require("./plugin-pass.js"); +var _blockHoistPlugin = require("./block-hoist-plugin.js"); +var _normalizeOpts = require("./normalize-opts.js"); +var _normalizeFile = require("./normalize-file.js"); +var _generate = require("./file/generate.js"); +var _deepArray = require("../config/helpers/deep-array.js"); function* run(config, code, ast) { const file = yield* (0, _normalizeFile.default)(config.passes, (0, _normalizeOpts.default)(config), code, ast); const opts = file.opts; @@ -71,21 +71,20 @@ function* transformFile(file, pluginPasses) { const fn = plugin.pre; if (fn) { const result = fn.call(pass, file); - yield* []; if (isThenable(result)) { throw new Error(`You appear to be using an plugin with an async .pre, ` + `which your current version of Babel does not support. ` + `If you're using a published plugin, you may need to upgrade ` + `your @babel/core version.`); } } } - const visitor = _traverse().default.visitors.merge(visitors, passes, file.opts.wrapPluginVisitorMethod); - (0, _traverse().default)(file.ast, visitor, file.scope); + { + (0, _traverse().default)(file.ast, visitor, file.scope); + } for (const [plugin, pass] of passPairs) { const fn = plugin.post; if (fn) { const result = fn.call(pass, file); - yield* []; if (isThenable(result)) { throw new Error(`You appear to be using an plugin with an async .post, ` + `which your current version of Babel does not support. ` + `If you're using a published plugin, you may need to upgrade ` + `your @babel/core version.`); diff --git a/node_modules/@babel/core/lib/transformation/index.js.map b/node_modules/@babel/core/lib/transformation/index.js.map index 289f93b152c8..41b4d7f8c103 100644 --- a/node_modules/@babel/core/lib/transformation/index.js.map +++ b/node_modules/@babel/core/lib/transformation/index.js.map @@ -1 +1 @@ -{"version":3,"names":["run","config","code","ast","file","normalizeFile","passes","normalizeOptions","opts","transformFile","e","message","filename","outputCode","outputMap","generateCode","metadata","options","undefined","map","sourceType","program","externalDependencies","flattenToSet","pluginPasses","pluginPairs","passPairs","visitors","plugin","concat","loadBlockHoistPlugin","pass","PluginPass","key","push","visitor","fn","pre","result","call","isThenable","Error","traverse","merge","wrapPluginVisitorMethod","scope","post","val","then"],"sources":["../../src/transformation/index.ts"],"sourcesContent":["import traverse from \"@babel/traverse\";\nimport type * as t from \"@babel/types\";\ntype SourceMap = any;\nimport type { Handler } from \"gensync\";\n\nimport type { ResolvedConfig, Plugin, PluginPasses } from \"../config\";\n\nimport PluginPass from \"./plugin-pass\";\nimport loadBlockHoistPlugin from \"./block-hoist-plugin\";\nimport normalizeOptions from \"./normalize-opts\";\nimport normalizeFile from \"./normalize-file\";\n\nimport generateCode from \"./file/generate\";\nimport type File from \"./file/file\";\n\nimport { flattenToSet } from \"../config/helpers/deep-array\";\n\nexport type FileResultCallback = {\n (err: Error, file: null): void;\n (err: null, file: FileResult | null): void;\n};\n\nexport type FileResult = {\n metadata: { [key: string]: any };\n options: { [key: string]: any };\n ast: t.File | null;\n code: string | null;\n map: SourceMap | null;\n sourceType: \"script\" | \"module\";\n externalDependencies: Set;\n};\n\nexport function* run(\n config: ResolvedConfig,\n code: string,\n ast?: t.File | t.Program | null,\n): Handler {\n const file = yield* normalizeFile(\n config.passes,\n normalizeOptions(config),\n code,\n ast,\n );\n\n const opts = file.opts;\n try {\n yield* transformFile(file, config.passes);\n } catch (e) {\n e.message = `${opts.filename ?? \"unknown file\"}: ${e.message}`;\n if (!e.code) {\n e.code = \"BABEL_TRANSFORM_ERROR\";\n }\n throw e;\n }\n\n let outputCode, outputMap;\n try {\n if (opts.code !== false) {\n ({ outputCode, outputMap } = generateCode(config.passes, file));\n }\n } catch (e) {\n e.message = `${opts.filename ?? \"unknown file\"}: ${e.message}`;\n if (!e.code) {\n e.code = \"BABEL_GENERATE_ERROR\";\n }\n throw e;\n }\n\n return {\n metadata: file.metadata,\n options: opts,\n ast: opts.ast === true ? file.ast : null,\n code: outputCode === undefined ? null : outputCode,\n map: outputMap === undefined ? null : outputMap,\n sourceType: file.ast.program.sourceType,\n externalDependencies: flattenToSet(config.externalDependencies),\n };\n}\n\nfunction* transformFile(file: File, pluginPasses: PluginPasses): Handler {\n for (const pluginPairs of pluginPasses) {\n const passPairs: [Plugin, PluginPass][] = [];\n const passes = [];\n const visitors = [];\n\n for (const plugin of pluginPairs.concat([loadBlockHoistPlugin()])) {\n const pass = new PluginPass(file, plugin.key, plugin.options);\n\n passPairs.push([plugin, pass]);\n passes.push(pass);\n visitors.push(plugin.visitor);\n }\n\n for (const [plugin, pass] of passPairs) {\n const fn = plugin.pre;\n if (fn) {\n const result = fn.call(pass, file);\n\n // @ts-expect-error - If we want to support async .pre\n yield* [];\n\n if (isThenable(result)) {\n throw new Error(\n `You appear to be using an plugin with an async .pre, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, you may need to upgrade ` +\n `your @babel/core version.`,\n );\n }\n }\n }\n\n // merge all plugin visitors into a single visitor\n const visitor = traverse.visitors.merge(\n visitors,\n passes,\n file.opts.wrapPluginVisitorMethod,\n );\n traverse(file.ast, visitor, file.scope);\n\n for (const [plugin, pass] of passPairs) {\n const fn = plugin.post;\n if (fn) {\n const result = fn.call(pass, file);\n\n // @ts-expect-error - If we want to support async .post\n yield* [];\n\n if (isThenable(result)) {\n throw new Error(\n `You appear to be using an plugin with an async .post, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, you may need to upgrade ` +\n `your @babel/core version.`,\n );\n }\n }\n }\n }\n}\n\nfunction isThenable>(val: any): val is T {\n return (\n !!val &&\n (typeof val === \"object\" || typeof val === \"function\") &&\n !!val.then &&\n typeof val.then === \"function\"\n );\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_traverse","data","require","_pluginPass","_blockHoistPlugin","_normalizeOpts","_normalizeFile","_generate","_deepArray","run","config","code","ast","file","normalizeFile","passes","normalizeOptions","opts","transformFile","e","_opts$filename","message","filename","outputCode","outputMap","generateCode","_opts$filename2","metadata","options","undefined","map","sourceType","program","externalDependencies","flattenToSet","pluginPasses","pluginPairs","passPairs","visitors","plugin","concat","loadBlockHoistPlugin","pass","PluginPass","key","push","visitor","fn","pre","result","call","isThenable","Error","traverse","merge","wrapPluginVisitorMethod","scope","post","val","then"],"sources":["../../src/transformation/index.ts"],"sourcesContent":["import traverse from \"@babel/traverse\";\nimport type * as t from \"@babel/types\";\nimport type { GeneratorResult } from \"@babel/generator\";\n\nimport type { Handler } from \"gensync\";\n\nimport type { ResolvedConfig, Plugin, PluginPasses } from \"../config/index.ts\";\n\nimport PluginPass from \"./plugin-pass.ts\";\nimport loadBlockHoistPlugin from \"./block-hoist-plugin.ts\";\nimport normalizeOptions from \"./normalize-opts.ts\";\nimport normalizeFile from \"./normalize-file.ts\";\n\nimport generateCode from \"./file/generate.ts\";\nimport type File from \"./file/file.ts\";\n\nimport { flattenToSet } from \"../config/helpers/deep-array.ts\";\n\nexport type FileResultCallback = {\n (err: Error, file: null): void;\n (err: null, file: FileResult | null): void;\n};\n\nexport type FileResult = {\n metadata: { [key: string]: any };\n options: { [key: string]: any };\n ast: t.File | null;\n code: string | null;\n map: GeneratorResult[\"map\"] | null;\n sourceType: \"script\" | \"module\";\n externalDependencies: Set;\n};\n\nexport function* run(\n config: ResolvedConfig,\n code: string,\n ast?: t.File | t.Program | null,\n): Handler {\n const file = yield* normalizeFile(\n config.passes,\n normalizeOptions(config),\n code,\n ast,\n );\n\n const opts = file.opts;\n try {\n yield* transformFile(file, config.passes);\n } catch (e) {\n e.message = `${opts.filename ?? \"unknown file\"}: ${e.message}`;\n if (!e.code) {\n e.code = \"BABEL_TRANSFORM_ERROR\";\n }\n throw e;\n }\n\n let outputCode, outputMap;\n try {\n if (opts.code !== false) {\n ({ outputCode, outputMap } = generateCode(config.passes, file));\n }\n } catch (e) {\n e.message = `${opts.filename ?? \"unknown file\"}: ${e.message}`;\n if (!e.code) {\n e.code = \"BABEL_GENERATE_ERROR\";\n }\n throw e;\n }\n\n return {\n metadata: file.metadata,\n options: opts,\n ast: opts.ast === true ? file.ast : null,\n code: outputCode === undefined ? null : outputCode,\n map: outputMap === undefined ? null : outputMap,\n sourceType: file.ast.program.sourceType,\n externalDependencies: flattenToSet(config.externalDependencies),\n };\n}\n\nfunction* transformFile(file: File, pluginPasses: PluginPasses): Handler {\n for (const pluginPairs of pluginPasses) {\n const passPairs: [Plugin, PluginPass][] = [];\n const passes = [];\n const visitors = [];\n\n for (const plugin of pluginPairs.concat([loadBlockHoistPlugin()])) {\n const pass = new PluginPass(file, plugin.key, plugin.options);\n\n passPairs.push([plugin, pass]);\n passes.push(pass);\n visitors.push(plugin.visitor);\n }\n\n for (const [plugin, pass] of passPairs) {\n const fn = plugin.pre;\n if (fn) {\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n const result = fn.call(pass, file);\n\n // @ts-expect-error - If we want to support async .pre\n yield* [];\n\n if (isThenable(result)) {\n throw new Error(\n `You appear to be using an plugin with an async .pre, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, you may need to upgrade ` +\n `your @babel/core version.`,\n );\n }\n }\n }\n\n // merge all plugin visitors into a single visitor\n const visitor = traverse.visitors.merge(\n visitors,\n passes,\n file.opts.wrapPluginVisitorMethod,\n );\n if (process.env.BABEL_8_BREAKING) {\n traverse(file.ast.program, visitor, file.scope, null, file.path, true);\n } else {\n traverse(file.ast, visitor, file.scope);\n }\n\n for (const [plugin, pass] of passPairs) {\n const fn = plugin.post;\n if (fn) {\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n const result = fn.call(pass, file);\n\n // @ts-expect-error - If we want to support async .post\n yield* [];\n\n if (isThenable(result)) {\n throw new Error(\n `You appear to be using an plugin with an async .post, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, you may need to upgrade ` +\n `your @babel/core version.`,\n );\n }\n }\n }\n }\n}\n\nfunction isThenable>(val: any): val is T {\n return (\n !!val &&\n (typeof val === \"object\" || typeof val === \"function\") &&\n !!val.then &&\n typeof val.then === \"function\"\n );\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transformation/normalize-file.js b/node_modules/@babel/core/lib/transformation/normalize-file.js index dd3cc8dc847d..74986d9b6499 100644 --- a/node_modules/@babel/core/lib/transformation/normalize-file.js +++ b/node_modules/@babel/core/lib/transformation/normalize-file.js @@ -39,16 +39,14 @@ function _convertSourceMap() { }; return data; } -var _file = require("./file/file"); -var _parser = require("../parser"); -var _cloneDeep = require("./util/clone-deep"); +var _file = require("./file/file.js"); +var _index = require("../parser/index.js"); +var _cloneDeep = require("./util/clone-deep.js"); const { file, traverseFast } = _t(); const debug = _debug()("babel:transform:file"); -const LARGE_INPUT_SOURCEMAP_THRESHOLD = 3000000; - const INLINE_SOURCEMAP_REGEX = /^[@#]\s+sourceMappingURL=data:(?:application|text)\/json;(?:charset[:=]\S+?;)?base64,(?:.*)$/; const EXTERNAL_SOURCEMAP_REGEX = /^[@#][ \t]+sourceMappingURL=([^\s'"`]+)[ \t]*$/; function* normalizeFile(pluginPasses, options, code, ast) { @@ -63,7 +61,7 @@ function* normalizeFile(pluginPasses, options, code, ast) { ast = (0, _cloneDeep.default)(ast); } } else { - ast = yield* (0, _parser.default)(pluginPasses, options, code); + ast = yield* (0, _index.default)(pluginPasses, options, code); } let inputMap = null; if (options.inputSourceMap !== false) { @@ -74,9 +72,11 @@ function* normalizeFile(pluginPasses, options, code, ast) { const lastComment = extractComments(INLINE_SOURCEMAP_REGEX, ast); if (lastComment) { try { - inputMap = _convertSourceMap().fromComment(lastComment); + inputMap = _convertSourceMap().fromComment("//" + lastComment); } catch (err) { - debug("discarding unknown inline input sourcemap", err); + { + debug("discarding unknown inline input sourcemap"); + } } } } @@ -85,13 +85,8 @@ function* normalizeFile(pluginPasses, options, code, ast) { if (typeof options.filename === "string" && lastComment) { try { const match = EXTERNAL_SOURCEMAP_REGEX.exec(lastComment); - const inputMapContent = _fs().readFileSync(_path().resolve(_path().dirname(options.filename), match[1])); - if (inputMapContent.length > LARGE_INPUT_SOURCEMAP_THRESHOLD) { - debug("skip merging input map > 1 MB"); - } else { - inputMap = _convertSourceMap().fromJSON( - inputMapContent); - } + const inputMapContent = _fs().readFileSync(_path().resolve(_path().dirname(options.filename), match[1]), "utf8"); + inputMap = _convertSourceMap().fromJSON(inputMapContent); } catch (err) { debug("discarding unknown file input sourcemap", err); } diff --git a/node_modules/@babel/core/lib/transformation/normalize-file.js.map b/node_modules/@babel/core/lib/transformation/normalize-file.js.map index 745351bc79a1..029a76ad7e04 100644 --- a/node_modules/@babel/core/lib/transformation/normalize-file.js.map +++ b/node_modules/@babel/core/lib/transformation/normalize-file.js.map @@ -1 +1 @@ -{"version":3,"names":["file","traverseFast","debug","buildDebug","LARGE_INPUT_SOURCEMAP_THRESHOLD","INLINE_SOURCEMAP_REGEX","EXTERNAL_SOURCEMAP_REGEX","normalizeFile","pluginPasses","options","code","ast","type","Error","cloneInputAst","cloneDeep","parser","inputMap","inputSourceMap","convertSourceMap","fromObject","lastComment","extractComments","fromComment","err","filename","match","exec","inputMapContent","fs","readFileSync","path","resolve","dirname","length","fromJSON","File","extractCommentsFromList","regex","comments","filter","value","test","node","leadingComments","innerComments","trailingComments"],"sources":["../../src/transformation/normalize-file.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport buildDebug from \"debug\";\nimport type { Handler } from \"gensync\";\nimport { file, traverseFast } from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport type { PluginPasses } from \"../config\";\nimport convertSourceMap from \"convert-source-map\";\nimport type { SourceMapConverter as Converter } from \"convert-source-map\";\nimport File from \"./file/file\";\nimport parser from \"../parser\";\nimport cloneDeep from \"./util/clone-deep\";\n\nconst debug = buildDebug(\"babel:transform:file\");\nconst LARGE_INPUT_SOURCEMAP_THRESHOLD = 3_000_000;\n\n// These regexps are copied from the convert-source-map package,\n// but without // or /* at the beginning of the comment.\n\n// eslint-disable-next-line max-len\nconst INLINE_SOURCEMAP_REGEX =\n /^[@#]\\s+sourceMappingURL=data:(?:application|text)\\/json;(?:charset[:=]\\S+?;)?base64,(?:.*)$/;\nconst EXTERNAL_SOURCEMAP_REGEX =\n /^[@#][ \\t]+sourceMappingURL=([^\\s'\"`]+)[ \\t]*$/;\n\nexport type NormalizedFile = {\n code: string;\n ast: t.File;\n inputMap: Converter | null;\n};\n\nexport default function* normalizeFile(\n pluginPasses: PluginPasses,\n options: { [key: string]: any },\n code: string,\n ast?: t.File | t.Program | null,\n): Handler {\n code = `${code || \"\"}`;\n\n if (ast) {\n if (ast.type === \"Program\") {\n ast = file(ast, [], []);\n } else if (ast.type !== \"File\") {\n throw new Error(\"AST root must be a Program or File node\");\n }\n\n if (options.cloneInputAst) {\n ast = cloneDeep(ast) as t.File;\n }\n } else {\n // @ts-expect-error todo: use babel-types ast typings in Babel parser\n ast = yield* parser(pluginPasses, options, code);\n }\n\n let inputMap = null;\n if (options.inputSourceMap !== false) {\n // If an explicit object is passed in, it overrides the processing of\n // source maps that may be in the file itself.\n if (typeof options.inputSourceMap === \"object\") {\n inputMap = convertSourceMap.fromObject(options.inputSourceMap);\n }\n\n if (!inputMap) {\n const lastComment = extractComments(INLINE_SOURCEMAP_REGEX, ast);\n if (lastComment) {\n try {\n inputMap = convertSourceMap.fromComment(lastComment);\n } catch (err) {\n debug(\"discarding unknown inline input sourcemap\", err);\n }\n }\n }\n\n if (!inputMap) {\n const lastComment = extractComments(EXTERNAL_SOURCEMAP_REGEX, ast);\n if (typeof options.filename === \"string\" && lastComment) {\n try {\n // when `lastComment` is non-null, EXTERNAL_SOURCEMAP_REGEX must have matches\n const match: [string, string] = EXTERNAL_SOURCEMAP_REGEX.exec(\n lastComment,\n ) as any;\n const inputMapContent = fs.readFileSync(\n path.resolve(path.dirname(options.filename), match[1]),\n );\n if (inputMapContent.length > LARGE_INPUT_SOURCEMAP_THRESHOLD) {\n debug(\"skip merging input map > 1 MB\");\n } else {\n inputMap = convertSourceMap.fromJSON(\n // todo:\n inputMapContent as unknown as string,\n );\n }\n } catch (err) {\n debug(\"discarding unknown file input sourcemap\", err);\n }\n } else if (lastComment) {\n debug(\"discarding un-loadable file input sourcemap\");\n }\n }\n }\n\n return new File(options, {\n code,\n ast: ast as t.File,\n inputMap,\n });\n}\n\nfunction extractCommentsFromList(\n regex: RegExp,\n comments: t.Comment[],\n lastComment: string | null,\n): [t.Comment[], string | null] {\n if (comments) {\n comments = comments.filter(({ value }) => {\n if (regex.test(value)) {\n lastComment = value;\n return false;\n }\n return true;\n });\n }\n return [comments, lastComment];\n}\n\nfunction extractComments(regex: RegExp, ast: t.Node) {\n let lastComment: string = null;\n traverseFast(ast, node => {\n [node.leadingComments, lastComment] = extractCommentsFromList(\n regex,\n node.leadingComments,\n lastComment,\n );\n [node.innerComments, lastComment] = extractCommentsFromList(\n regex,\n node.innerComments,\n lastComment,\n );\n [node.trailingComments, lastComment] = extractCommentsFromList(\n regex,\n node.trailingComments,\n lastComment,\n );\n });\n return lastComment;\n}\n"],"mappings":";;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAGA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;AACA;AACA;AAA0C;EAPjCA,IAAI;EAAEC;AAAY;AAS3B,MAAMC,KAAK,GAAGC,QAAU,CAAC,sBAAsB,CAAC;AAChD,MAAMC,+BAA+B,GAAG,OAAS;;AAMjD,MAAMC,sBAAsB,GAC1B,8FAA8F;AAChG,MAAMC,wBAAwB,GAC5B,gDAAgD;AAQnC,UAAUC,aAAa,CACpCC,YAA0B,EAC1BC,OAA+B,EAC/BC,IAAY,EACZC,GAA+B,EAChB;EACfD,IAAI,GAAI,GAAEA,IAAI,IAAI,EAAG,EAAC;EAEtB,IAAIC,GAAG,EAAE;IACP,IAAIA,GAAG,CAACC,IAAI,KAAK,SAAS,EAAE;MAC1BD,GAAG,GAAGX,IAAI,CAACW,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC,MAAM,IAAIA,GAAG,CAACC,IAAI,KAAK,MAAM,EAAE;MAC9B,MAAM,IAAIC,KAAK,CAAC,yCAAyC,CAAC;IAC5D;IAEA,IAAIJ,OAAO,CAACK,aAAa,EAAE;MACzBH,GAAG,GAAG,IAAAI,kBAAS,EAACJ,GAAG,CAAW;IAChC;EACF,CAAC,MAAM;IAELA,GAAG,GAAG,OAAO,IAAAK,eAAM,EAACR,YAAY,EAAEC,OAAO,EAAEC,IAAI,CAAC;EAClD;EAEA,IAAIO,QAAQ,GAAG,IAAI;EACnB,IAAIR,OAAO,CAACS,cAAc,KAAK,KAAK,EAAE;IAGpC,IAAI,OAAOT,OAAO,CAACS,cAAc,KAAK,QAAQ,EAAE;MAC9CD,QAAQ,GAAGE,mBAAgB,CAACC,UAAU,CAACX,OAAO,CAACS,cAAc,CAAC;IAChE;IAEA,IAAI,CAACD,QAAQ,EAAE;MACb,MAAMI,WAAW,GAAGC,eAAe,CAACjB,sBAAsB,EAAEM,GAAG,CAAC;MAChE,IAAIU,WAAW,EAAE;QACf,IAAI;UACFJ,QAAQ,GAAGE,mBAAgB,CAACI,WAAW,CAACF,WAAW,CAAC;QACtD,CAAC,CAAC,OAAOG,GAAG,EAAE;UACZtB,KAAK,CAAC,2CAA2C,EAAEsB,GAAG,CAAC;QACzD;MACF;IACF;IAEA,IAAI,CAACP,QAAQ,EAAE;MACb,MAAMI,WAAW,GAAGC,eAAe,CAAChB,wBAAwB,EAAEK,GAAG,CAAC;MAClE,IAAI,OAAOF,OAAO,CAACgB,QAAQ,KAAK,QAAQ,IAAIJ,WAAW,EAAE;QACvD,IAAI;UAEF,MAAMK,KAAuB,GAAGpB,wBAAwB,CAACqB,IAAI,CAC3DN,WAAW,CACL;UACR,MAAMO,eAAe,GAAGC,KAAE,CAACC,YAAY,CACrCC,OAAI,CAACC,OAAO,CAACD,OAAI,CAACE,OAAO,CAACxB,OAAO,CAACgB,QAAQ,CAAC,EAAEC,KAAK,CAAC,CAAC,CAAC,CAAC,CACvD;UACD,IAAIE,eAAe,CAACM,MAAM,GAAG9B,+BAA+B,EAAE;YAC5DF,KAAK,CAAC,+BAA+B,CAAC;UACxC,CAAC,MAAM;YACLe,QAAQ,GAAGE,mBAAgB,CAACgB,QAAQ;YAElCP,eAAe,CAChB;UACH;QACF,CAAC,CAAC,OAAOJ,GAAG,EAAE;UACZtB,KAAK,CAAC,yCAAyC,EAAEsB,GAAG,CAAC;QACvD;MACF,CAAC,MAAM,IAAIH,WAAW,EAAE;QACtBnB,KAAK,CAAC,6CAA6C,CAAC;MACtD;IACF;EACF;EAEA,OAAO,IAAIkC,aAAI,CAAC3B,OAAO,EAAE;IACvBC,IAAI;IACJC,GAAG,EAAEA,GAAa;IAClBM;EACF,CAAC,CAAC;AACJ;AAEA,SAASoB,uBAAuB,CAC9BC,KAAa,EACbC,QAAqB,EACrBlB,WAA0B,EACI;EAC9B,IAAIkB,QAAQ,EAAE;IACZA,QAAQ,GAAGA,QAAQ,CAACC,MAAM,CAAC,CAAC;MAAEC;IAAM,CAAC,KAAK;MACxC,IAAIH,KAAK,CAACI,IAAI,CAACD,KAAK,CAAC,EAAE;QACrBpB,WAAW,GAAGoB,KAAK;QACnB,OAAO,KAAK;MACd;MACA,OAAO,IAAI;IACb,CAAC,CAAC;EACJ;EACA,OAAO,CAACF,QAAQ,EAAElB,WAAW,CAAC;AAChC;AAEA,SAASC,eAAe,CAACgB,KAAa,EAAE3B,GAAW,EAAE;EACnD,IAAIU,WAAmB,GAAG,IAAI;EAC9BpB,YAAY,CAACU,GAAG,EAAEgC,IAAI,IAAI;IACxB,CAACA,IAAI,CAACC,eAAe,EAAEvB,WAAW,CAAC,GAAGgB,uBAAuB,CAC3DC,KAAK,EACLK,IAAI,CAACC,eAAe,EACpBvB,WAAW,CACZ;IACD,CAACsB,IAAI,CAACE,aAAa,EAAExB,WAAW,CAAC,GAAGgB,uBAAuB,CACzDC,KAAK,EACLK,IAAI,CAACE,aAAa,EAClBxB,WAAW,CACZ;IACD,CAACsB,IAAI,CAACG,gBAAgB,EAAEzB,WAAW,CAAC,GAAGgB,uBAAuB,CAC5DC,KAAK,EACLK,IAAI,CAACG,gBAAgB,EACrBzB,WAAW,CACZ;EACH,CAAC,CAAC;EACF,OAAOA,WAAW;AACpB;AAAC"} \ No newline at end of file +{"version":3,"names":["_fs","data","require","_path","_debug","_t","_convertSourceMap","_file","_index","_cloneDeep","file","traverseFast","debug","buildDebug","INLINE_SOURCEMAP_REGEX","EXTERNAL_SOURCEMAP_REGEX","normalizeFile","pluginPasses","options","code","ast","type","Error","cloneInputAst","cloneDeep","parser","inputMap","inputSourceMap","convertSourceMap","fromObject","lastComment","extractComments","fromComment","err","filename","match","exec","inputMapContent","fs","readFileSync","path","resolve","dirname","fromJSON","File","extractCommentsFromList","regex","comments","filter","value","test","node","leadingComments","innerComments","trailingComments"],"sources":["../../src/transformation/normalize-file.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport buildDebug from \"debug\";\nimport type { Handler } from \"gensync\";\nimport { file, traverseFast } from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport type { PluginPasses } from \"../config/index.ts\";\nimport convertSourceMap from \"convert-source-map\";\nimport type { SourceMapConverter as Converter } from \"convert-source-map\";\nimport File from \"./file/file.ts\";\nimport parser from \"../parser/index.ts\";\nimport cloneDeep from \"./util/clone-deep.ts\";\n\nconst debug = buildDebug(\"babel:transform:file\");\n\n// These regexps are copied from the convert-source-map package,\n// but without // or /* at the beginning of the comment.\n\nconst INLINE_SOURCEMAP_REGEX =\n /^[@#]\\s+sourceMappingURL=data:(?:application|text)\\/json;(?:charset[:=]\\S+?;)?base64,(?:.*)$/;\nconst EXTERNAL_SOURCEMAP_REGEX =\n /^[@#][ \\t]+sourceMappingURL=([^\\s'\"`]+)[ \\t]*$/;\n\nexport type NormalizedFile = {\n code: string;\n ast: t.File;\n inputMap: Converter | null;\n};\n\nexport default function* normalizeFile(\n pluginPasses: PluginPasses,\n options: { [key: string]: any },\n code: string,\n ast?: t.File | t.Program | null,\n): Handler {\n code = `${code || \"\"}`;\n\n if (ast) {\n if (ast.type === \"Program\") {\n ast = file(ast, [], []);\n } else if (ast.type !== \"File\") {\n throw new Error(\"AST root must be a Program or File node\");\n }\n\n if (options.cloneInputAst) {\n ast = cloneDeep(ast);\n }\n } else {\n // @ts-expect-error todo: use babel-types ast typings in Babel parser\n ast = yield* parser(pluginPasses, options, code);\n }\n\n let inputMap = null;\n if (options.inputSourceMap !== false) {\n // If an explicit object is passed in, it overrides the processing of\n // source maps that may be in the file itself.\n if (typeof options.inputSourceMap === \"object\") {\n inputMap = convertSourceMap.fromObject(options.inputSourceMap);\n }\n\n if (!inputMap) {\n const lastComment = extractComments(INLINE_SOURCEMAP_REGEX, ast);\n if (lastComment) {\n try {\n inputMap = convertSourceMap.fromComment(\"//\" + lastComment);\n } catch (err) {\n if (process.env.BABEL_8_BREAKING) {\n console.warn(\n \"discarding unknown inline input sourcemap\",\n options.filename,\n err,\n );\n } else {\n debug(\"discarding unknown inline input sourcemap\");\n }\n }\n }\n }\n\n if (!inputMap) {\n const lastComment = extractComments(EXTERNAL_SOURCEMAP_REGEX, ast);\n if (typeof options.filename === \"string\" && lastComment) {\n try {\n // when `lastComment` is non-null, EXTERNAL_SOURCEMAP_REGEX must have matches\n const match: [string, string] = EXTERNAL_SOURCEMAP_REGEX.exec(\n lastComment,\n ) as any;\n const inputMapContent = fs.readFileSync(\n path.resolve(path.dirname(options.filename), match[1]),\n \"utf8\",\n );\n inputMap = convertSourceMap.fromJSON(inputMapContent);\n } catch (err) {\n debug(\"discarding unknown file input sourcemap\", err);\n }\n } else if (lastComment) {\n debug(\"discarding un-loadable file input sourcemap\");\n }\n }\n }\n\n return new File(options, {\n code,\n ast: ast as t.File,\n inputMap,\n });\n}\n\nfunction extractCommentsFromList(\n regex: RegExp,\n comments: t.Comment[],\n lastComment: string | null,\n): [t.Comment[], string | null] {\n if (comments) {\n comments = comments.filter(({ value }) => {\n if (regex.test(value)) {\n lastComment = value;\n return false;\n }\n return true;\n });\n }\n return [comments, lastComment];\n}\n\nfunction extractComments(regex: RegExp, ast: t.Node) {\n let lastComment: string = null;\n traverseFast(ast, node => {\n [node.leadingComments, lastComment] = extractCommentsFromList(\n regex,\n node.leadingComments,\n lastComment,\n );\n [node.innerComments, lastComment] = extractCommentsFromList(\n regex,\n node.innerComments,\n lastComment,\n );\n [node.trailingComments, lastComment] = extractCommentsFromList(\n regex,\n node.trailingComments,\n lastComment,\n );\n });\n return lastComment;\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transformation/normalize-opts.js.map b/node_modules/@babel/core/lib/transformation/normalize-opts.js.map index 7ff0d99ca8fd..e4099bf49d01 100644 --- a/node_modules/@babel/core/lib/transformation/normalize-opts.js.map +++ b/node_modules/@babel/core/lib/transformation/normalize-opts.js.map @@ -1 +1 @@ -{"version":3,"names":["normalizeOptions","config","filename","cwd","filenameRelative","path","relative","sourceType","inputSourceMap","sourceMaps","sourceRoot","options","moduleRoot","sourceFileName","basename","comments","compact","opts","parserOpts","extname","plugins","generatorOpts","auxiliaryCommentBefore","auxiliaryCommentAfter","retainLines","shouldPrintComment","minified","passes","plugin","manipulateOptions"],"sources":["../../src/transformation/normalize-opts.ts"],"sourcesContent":["import path from \"path\";\nimport type { ResolvedConfig } from \"../config\";\n\nexport default function normalizeOptions(config: ResolvedConfig): {} {\n const {\n filename,\n cwd,\n filenameRelative = typeof filename === \"string\"\n ? path.relative(cwd, filename)\n : \"unknown\",\n sourceType = \"module\",\n inputSourceMap,\n sourceMaps = !!inputSourceMap,\n sourceRoot = process.env.BABEL_8_BREAKING\n ? undefined\n : config.options.moduleRoot,\n\n sourceFileName = path.basename(filenameRelative),\n\n comments = true,\n compact = \"auto\",\n } = config.options;\n\n const opts = config.options;\n\n const options = {\n ...opts,\n\n parserOpts: {\n sourceType:\n path.extname(filenameRelative) === \".mjs\" ? \"module\" : sourceType,\n\n sourceFileName: filename,\n plugins: [],\n ...opts.parserOpts,\n },\n\n generatorOpts: {\n // General generator flags.\n filename,\n\n auxiliaryCommentBefore: opts.auxiliaryCommentBefore,\n auxiliaryCommentAfter: opts.auxiliaryCommentAfter,\n retainLines: opts.retainLines,\n comments,\n shouldPrintComment: opts.shouldPrintComment,\n compact,\n minified: opts.minified,\n\n // Source-map generation flags.\n sourceMaps,\n\n sourceRoot,\n sourceFileName,\n ...opts.generatorOpts,\n },\n };\n\n for (const plugins of config.passes) {\n for (const plugin of plugins) {\n if (plugin.manipulateOptions) {\n plugin.manipulateOptions(options, options.parserOpts);\n }\n }\n }\n\n return options;\n}\n"],"mappings":";;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAGe,SAASA,gBAAgB,CAACC,MAAsB,EAAM;EACnE,MAAM;IACJC,QAAQ;IACRC,GAAG;IACHC,gBAAgB,GAAG,OAAOF,QAAQ,KAAK,QAAQ,GAC3CG,OAAI,CAACC,QAAQ,CAACH,GAAG,EAAED,QAAQ,CAAC,GAC5B,SAAS;IACbK,UAAU,GAAG,QAAQ;IACrBC,cAAc;IACdC,UAAU,GAAG,CAAC,CAACD,cAAc;IAC7BE,UAAU,GAENT,MAAM,CAACU,OAAO,CAACC,UAAU;IAE7BC,cAAc,GAAGR,OAAI,CAACS,QAAQ,CAACV,gBAAgB,CAAC;IAEhDW,QAAQ,GAAG,IAAI;IACfC,OAAO,GAAG;EACZ,CAAC,GAAGf,MAAM,CAACU,OAAO;EAElB,MAAMM,IAAI,GAAGhB,MAAM,CAACU,OAAO;EAE3B,MAAMA,OAAO,qBACRM,IAAI;IAEPC,UAAU;MACRX,UAAU,EACRF,OAAI,CAACc,OAAO,CAACf,gBAAgB,CAAC,KAAK,MAAM,GAAG,QAAQ,GAAGG,UAAU;MAEnEM,cAAc,EAAEX,QAAQ;MACxBkB,OAAO,EAAE;IAAE,GACRH,IAAI,CAACC,UAAU,CACnB;IAEDG,aAAa;MAEXnB,QAAQ;MAERoB,sBAAsB,EAAEL,IAAI,CAACK,sBAAsB;MACnDC,qBAAqB,EAAEN,IAAI,CAACM,qBAAqB;MACjDC,WAAW,EAAEP,IAAI,CAACO,WAAW;MAC7BT,QAAQ;MACRU,kBAAkB,EAAER,IAAI,CAACQ,kBAAkB;MAC3CT,OAAO;MACPU,QAAQ,EAAET,IAAI,CAACS,QAAQ;MAGvBjB,UAAU;MAEVC,UAAU;MACVG;IAAc,GACXI,IAAI,CAACI,aAAa;EACtB,EACF;EAED,KAAK,MAAMD,OAAO,IAAInB,MAAM,CAAC0B,MAAM,EAAE;IACnC,KAAK,MAAMC,MAAM,IAAIR,OAAO,EAAE;MAC5B,IAAIQ,MAAM,CAACC,iBAAiB,EAAE;QAC5BD,MAAM,CAACC,iBAAiB,CAAClB,OAAO,EAAEA,OAAO,CAACO,UAAU,CAAC;MACvD;IACF;EACF;EAEA,OAAOP,OAAO;AAChB;AAAC"} \ No newline at end of file +{"version":3,"names":["_path","data","require","normalizeOptions","config","filename","cwd","filenameRelative","path","relative","sourceType","inputSourceMap","sourceMaps","sourceRoot","options","moduleRoot","sourceFileName","basename","comments","compact","opts","Object","assign","parserOpts","extname","plugins","generatorOpts","auxiliaryCommentBefore","auxiliaryCommentAfter","retainLines","shouldPrintComment","minified","passes","plugin","manipulateOptions"],"sources":["../../src/transformation/normalize-opts.ts"],"sourcesContent":["import path from \"path\";\nimport type { ResolvedConfig } from \"../config/index.ts\";\n\nexport default function normalizeOptions(config: ResolvedConfig): {} {\n const {\n filename,\n cwd,\n filenameRelative = typeof filename === \"string\"\n ? path.relative(cwd, filename)\n : \"unknown\",\n sourceType = \"module\",\n inputSourceMap,\n sourceMaps = !!inputSourceMap,\n sourceRoot = process.env.BABEL_8_BREAKING\n ? undefined\n : config.options.moduleRoot,\n\n sourceFileName = path.basename(filenameRelative),\n\n comments = true,\n compact = \"auto\",\n } = config.options;\n\n const opts = config.options;\n\n const options = {\n ...opts,\n\n parserOpts: {\n sourceType:\n path.extname(filenameRelative) === \".mjs\" ? \"module\" : sourceType,\n\n sourceFileName: filename,\n plugins: [],\n ...opts.parserOpts,\n },\n\n generatorOpts: {\n // General generator flags.\n filename,\n\n auxiliaryCommentBefore: opts.auxiliaryCommentBefore,\n auxiliaryCommentAfter: opts.auxiliaryCommentAfter,\n retainLines: opts.retainLines,\n comments,\n shouldPrintComment: opts.shouldPrintComment,\n compact,\n minified: opts.minified,\n\n // Source-map generation flags.\n sourceMaps,\n\n sourceRoot,\n sourceFileName,\n ...opts.generatorOpts,\n },\n };\n\n for (const plugins of config.passes) {\n for (const plugin of plugins) {\n if (plugin.manipulateOptions) {\n plugin.manipulateOptions(options, options.parserOpts);\n }\n }\n }\n\n return options;\n}\n"],"mappings":";;;;;;AAAA,SAAAA,MAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,KAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAGe,SAASE,gBAAgBA,CAACC,MAAsB,EAAM;EACnE,MAAM;IACJC,QAAQ;IACRC,GAAG;IACHC,gBAAgB,GAAG,OAAOF,QAAQ,KAAK,QAAQ,GAC3CG,MAAGA,CAAC,CAACC,QAAQ,CAACH,GAAG,EAAED,QAAQ,CAAC,GAC5B,SAAS;IACbK,UAAU,GAAG,QAAQ;IACrBC,cAAc;IACdC,UAAU,GAAG,CAAC,CAACD,cAAc;IAC7BE,UAAU,GAENT,MAAM,CAACU,OAAO,CAACC,UAAU;IAE7BC,cAAc,GAAGR,MAAGA,CAAC,CAACS,QAAQ,CAACV,gBAAgB,CAAC;IAEhDW,QAAQ,GAAG,IAAI;IACfC,OAAO,GAAG;EACZ,CAAC,GAAGf,MAAM,CAACU,OAAO;EAElB,MAAMM,IAAI,GAAGhB,MAAM,CAACU,OAAO;EAE3B,MAAMA,OAAO,GAAAO,MAAA,CAAAC,MAAA,KACRF,IAAI;IAEPG,UAAU,EAAAF,MAAA,CAAAC,MAAA;MACRZ,UAAU,EACRF,MAAGA,CAAC,CAACgB,OAAO,CAACjB,gBAAgB,CAAC,KAAK,MAAM,GAAG,QAAQ,GAAGG,UAAU;MAEnEM,cAAc,EAAEX,QAAQ;MACxBoB,OAAO,EAAE;IAAE,GACRL,IAAI,CAACG,UAAU,CACnB;IAEDG,aAAa,EAAAL,MAAA,CAAAC,MAAA;MAEXjB,QAAQ;MAERsB,sBAAsB,EAAEP,IAAI,CAACO,sBAAsB;MACnDC,qBAAqB,EAAER,IAAI,CAACQ,qBAAqB;MACjDC,WAAW,EAAET,IAAI,CAACS,WAAW;MAC7BX,QAAQ;MACRY,kBAAkB,EAAEV,IAAI,CAACU,kBAAkB;MAC3CX,OAAO;MACPY,QAAQ,EAAEX,IAAI,CAACW,QAAQ;MAGvBnB,UAAU;MAEVC,UAAU;MACVG;IAAc,GACXI,IAAI,CAACM,aAAa;EACtB,EACF;EAED,KAAK,MAAMD,OAAO,IAAIrB,MAAM,CAAC4B,MAAM,EAAE;IACnC,KAAK,MAAMC,MAAM,IAAIR,OAAO,EAAE;MAC5B,IAAIQ,MAAM,CAACC,iBAAiB,EAAE;QAC5BD,MAAM,CAACC,iBAAiB,CAACpB,OAAO,EAAEA,OAAO,CAACS,UAAU,CAAC;MACvD;IACF;EACF;EAEA,OAAOT,OAAO;AAChB;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transformation/plugin-pass.js b/node_modules/@babel/core/lib/transformation/plugin-pass.js index 90b3e847ff46..e39c8854288d 100644 --- a/node_modules/@babel/core/lib/transformation/plugin-pass.js +++ b/node_modules/@babel/core/lib/transformation/plugin-pass.js @@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; class PluginPass { - constructor(file, key, options) { this._map = new Map(); this.key = void 0; @@ -31,9 +30,6 @@ class PluginPass { addHelper(name) { return this.file.addHelper(name); } - addImport() { - return this.file.addImport(); - } buildCodeFrameError(node, msg, _Error) { return this.file.buildCodeFrameError(node, msg, _Error); } @@ -43,6 +39,9 @@ exports.default = PluginPass; PluginPass.prototype.getModuleName = function getModuleName() { return this.file.getModuleName(); }; + PluginPass.prototype.addImport = function addImport() { + this.file.addImport(); + }; } 0 && 0; diff --git a/node_modules/@babel/core/lib/transformation/plugin-pass.js.map b/node_modules/@babel/core/lib/transformation/plugin-pass.js.map index b31b8c77e4dd..fcb82596c19a 100644 --- a/node_modules/@babel/core/lib/transformation/plugin-pass.js.map +++ b/node_modules/@babel/core/lib/transformation/plugin-pass.js.map @@ -1 +1 @@ -{"version":3,"names":["PluginPass","constructor","file","key","options","_map","Map","opts","cwd","filename","set","val","get","availableHelper","name","versionRange","addHelper","addImport","buildCodeFrameError","node","msg","_Error","prototype","getModuleName"],"sources":["../../src/transformation/plugin-pass.ts"],"sourcesContent":["import type File from \"./file/file\";\nimport type { NodeLocation } from \"./file/file\";\n\nexport default class PluginPass {\n _map: Map = new Map();\n key: string | undefined | null;\n file: File;\n opts: any;\n\n // The working directory that Babel's programmatic options are loaded\n // relative to.\n cwd: string;\n\n // The absolute path of the file being compiled.\n filename: string | void;\n\n constructor(file: File, key?: string | null, options?: any | null) {\n this.key = key;\n this.file = file;\n this.opts = options || {};\n this.cwd = file.opts.cwd;\n this.filename = file.opts.filename;\n }\n\n set(key: unknown, val: unknown) {\n this._map.set(key, val);\n }\n\n get(key: unknown): any {\n return this._map.get(key);\n }\n\n availableHelper(name: string, versionRange?: string | null) {\n return this.file.availableHelper(name, versionRange);\n }\n\n addHelper(name: string) {\n return this.file.addHelper(name);\n }\n\n addImport() {\n return this.file.addImport();\n }\n\n buildCodeFrameError(\n node: NodeLocation | undefined | null,\n msg: string,\n _Error?: typeof Error,\n ) {\n return this.file.buildCodeFrameError(node, msg, _Error);\n }\n}\n\nif (!process.env.BABEL_8_BREAKING) {\n (PluginPass as any).prototype.getModuleName = function getModuleName():\n | string\n | undefined {\n return this.file.getModuleName();\n };\n}\n"],"mappings":";;;;;;AAGe,MAAMA,UAAU,CAAC;;EAa9BC,WAAW,CAACC,IAAU,EAAEC,GAAmB,EAAEC,OAAoB,EAAE;IAAA,KAZnEC,IAAI,GAA0B,IAAIC,GAAG,EAAE;IAAA,KACvCH,GAAG;IAAA,KACHD,IAAI;IAAA,KACJK,IAAI;IAAA,KAIJC,GAAG;IAAA,KAGHC,QAAQ;IAGN,IAAI,CAACN,GAAG,GAAGA,GAAG;IACd,IAAI,CAACD,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACK,IAAI,GAAGH,OAAO,IAAI,CAAC,CAAC;IACzB,IAAI,CAACI,GAAG,GAAGN,IAAI,CAACK,IAAI,CAACC,GAAG;IACxB,IAAI,CAACC,QAAQ,GAAGP,IAAI,CAACK,IAAI,CAACE,QAAQ;EACpC;EAEAC,GAAG,CAACP,GAAY,EAAEQ,GAAY,EAAE;IAC9B,IAAI,CAACN,IAAI,CAACK,GAAG,CAACP,GAAG,EAAEQ,GAAG,CAAC;EACzB;EAEAC,GAAG,CAACT,GAAY,EAAO;IACrB,OAAO,IAAI,CAACE,IAAI,CAACO,GAAG,CAACT,GAAG,CAAC;EAC3B;EAEAU,eAAe,CAACC,IAAY,EAAEC,YAA4B,EAAE;IAC1D,OAAO,IAAI,CAACb,IAAI,CAACW,eAAe,CAACC,IAAI,EAAEC,YAAY,CAAC;EACtD;EAEAC,SAAS,CAACF,IAAY,EAAE;IACtB,OAAO,IAAI,CAACZ,IAAI,CAACc,SAAS,CAACF,IAAI,CAAC;EAClC;EAEAG,SAAS,GAAG;IACV,OAAO,IAAI,CAACf,IAAI,CAACe,SAAS,EAAE;EAC9B;EAEAC,mBAAmB,CACjBC,IAAqC,EACrCC,GAAW,EACXC,MAAqB,EACrB;IACA,OAAO,IAAI,CAACnB,IAAI,CAACgB,mBAAmB,CAACC,IAAI,EAAEC,GAAG,EAAEC,MAAM,CAAC;EACzD;AACF;AAAC;AAEkC;EAChCrB,UAAU,CAASsB,SAAS,CAACC,aAAa,GAAG,SAASA,aAAa,GAEtD;IACZ,OAAO,IAAI,CAACrB,IAAI,CAACqB,aAAa,EAAE;EAClC,CAAC;AACH;AAAC"} \ No newline at end of file +{"version":3,"names":["PluginPass","constructor","file","key","options","_map","Map","opts","cwd","filename","set","val","get","availableHelper","name","versionRange","addHelper","buildCodeFrameError","node","msg","_Error","exports","default","prototype","getModuleName","addImport"],"sources":["../../src/transformation/plugin-pass.ts"],"sourcesContent":["import type File from \"./file/file.ts\";\nimport type { NodeLocation } from \"./file/file.ts\";\n\nexport default class PluginPass {\n _map: Map = new Map();\n key: string | undefined | null;\n file: File;\n opts: Partial;\n\n // The working directory that Babel's programmatic options are loaded\n // relative to.\n cwd: string;\n\n // The absolute path of the file being compiled.\n filename: string | void;\n\n constructor(file: File, key?: string | null, options?: Options) {\n this.key = key;\n this.file = file;\n this.opts = options || {};\n this.cwd = file.opts.cwd;\n this.filename = file.opts.filename;\n }\n\n set(key: unknown, val: unknown) {\n this._map.set(key, val);\n }\n\n get(key: unknown): any {\n return this._map.get(key);\n }\n\n availableHelper(name: string, versionRange?: string | null) {\n return this.file.availableHelper(name, versionRange);\n }\n\n addHelper(name: string) {\n return this.file.addHelper(name);\n }\n\n buildCodeFrameError(\n node: NodeLocation | undefined | null,\n msg: string,\n _Error?: typeof Error,\n ) {\n return this.file.buildCodeFrameError(node, msg, _Error);\n }\n}\n\nif (!process.env.BABEL_8_BREAKING) {\n (PluginPass as any).prototype.getModuleName = function getModuleName(\n this: PluginPass,\n ): string | undefined {\n return this.file.getModuleName();\n };\n (PluginPass as any).prototype.addImport = function addImport(\n this: PluginPass,\n ): void {\n this.file.addImport();\n };\n}\n"],"mappings":";;;;;;AAGe,MAAMA,UAAU,CAAe;EAa5CC,WAAWA,CAACC,IAAU,EAAEC,GAAmB,EAAEC,OAAiB,EAAE;IAAA,KAZhEC,IAAI,GAA0B,IAAIC,GAAG,CAAC,CAAC;IAAA,KACvCH,GAAG;IAAA,KACHD,IAAI;IAAA,KACJK,IAAI;IAAA,KAIJC,GAAG;IAAA,KAGHC,QAAQ;IAGN,IAAI,CAACN,GAAG,GAAGA,GAAG;IACd,IAAI,CAACD,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACK,IAAI,GAAGH,OAAO,IAAI,CAAC,CAAC;IACzB,IAAI,CAACI,GAAG,GAAGN,IAAI,CAACK,IAAI,CAACC,GAAG;IACxB,IAAI,CAACC,QAAQ,GAAGP,IAAI,CAACK,IAAI,CAACE,QAAQ;EACpC;EAEAC,GAAGA,CAACP,GAAY,EAAEQ,GAAY,EAAE;IAC9B,IAAI,CAACN,IAAI,CAACK,GAAG,CAACP,GAAG,EAAEQ,GAAG,CAAC;EACzB;EAEAC,GAAGA,CAACT,GAAY,EAAO;IACrB,OAAO,IAAI,CAACE,IAAI,CAACO,GAAG,CAACT,GAAG,CAAC;EAC3B;EAEAU,eAAeA,CAACC,IAAY,EAAEC,YAA4B,EAAE;IAC1D,OAAO,IAAI,CAACb,IAAI,CAACW,eAAe,CAACC,IAAI,EAAEC,YAAY,CAAC;EACtD;EAEAC,SAASA,CAACF,IAAY,EAAE;IACtB,OAAO,IAAI,CAACZ,IAAI,CAACc,SAAS,CAACF,IAAI,CAAC;EAClC;EAEAG,mBAAmBA,CACjBC,IAAqC,EACrCC,GAAW,EACXC,MAAqB,EACrB;IACA,OAAO,IAAI,CAAClB,IAAI,CAACe,mBAAmB,CAACC,IAAI,EAAEC,GAAG,EAAEC,MAAM,CAAC;EACzD;AACF;AAACC,OAAA,CAAAC,OAAA,GAAAtB,UAAA;AAEkC;EAChCA,UAAU,CAASuB,SAAS,CAACC,aAAa,GAAG,SAASA,aAAaA,CAAA,EAE9C;IACpB,OAAO,IAAI,CAACtB,IAAI,CAACsB,aAAa,CAAC,CAAC;EAClC,CAAC;EACAxB,UAAU,CAASuB,SAAS,CAACE,SAAS,GAAG,SAASA,SAASA,CAAA,EAEpD;IACN,IAAI,CAACvB,IAAI,CAACuB,SAAS,CAAC,CAAC;EACvB,CAAC;AACH;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/transformation/util/clone-deep.js b/node_modules/@babel/core/lib/transformation/util/clone-deep.js index 94d0101b2e50..fc4148fc6ad6 100644 --- a/node_modules/@babel/core/lib/transformation/util/clone-deep.js +++ b/node_modules/@babel/core/lib/transformation/util/clone-deep.js @@ -10,18 +10,19 @@ function deepClone(value, cache) { let cloned; if (Array.isArray(value)) { cloned = new Array(value.length); + cache.set(value, cloned); for (let i = 0; i < value.length; i++) { cloned[i] = typeof value[i] !== "object" ? value[i] : deepClone(value[i], cache); } } else { cloned = {}; + cache.set(value, cloned); const keys = Object.keys(value); for (let i = 0; i < keys.length; i++) { const key = keys[i]; cloned[key] = typeof value[key] !== "object" ? value[key] : deepClone(value[key], cache); } } - cache.set(value, cloned); return cloned; } return value; diff --git a/node_modules/@babel/core/lib/transformation/util/clone-deep.js.map b/node_modules/@babel/core/lib/transformation/util/clone-deep.js.map index 8eda50867fc1..a36bb6daca38 100644 --- a/node_modules/@babel/core/lib/transformation/util/clone-deep.js.map +++ b/node_modules/@babel/core/lib/transformation/util/clone-deep.js.map @@ -1 +1 @@ -{"version":3,"names":["deepClone","value","cache","has","get","cloned","Array","isArray","length","i","keys","Object","key","set","Map"],"sources":["../../../src/transformation/util/clone-deep.ts"],"sourcesContent":["//https://github.com/babel/babel/pull/14583#discussion_r882828856\nfunction deepClone(value: any, cache: Map): any {\n if (value !== null) {\n if (cache.has(value)) return cache.get(value);\n let cloned: any;\n if (Array.isArray(value)) {\n cloned = new Array(value.length);\n for (let i = 0; i < value.length; i++) {\n cloned[i] =\n typeof value[i] !== \"object\" ? value[i] : deepClone(value[i], cache);\n }\n } else {\n cloned = {};\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n cloned[key] =\n typeof value[key] !== \"object\"\n ? value[key]\n : deepClone(value[key], cache);\n }\n }\n cache.set(value, cloned);\n return cloned;\n }\n return value;\n}\n\nexport default function (value: T): T {\n if (typeof value !== \"object\") return value;\n return deepClone(value, new Map());\n}\n"],"mappings":";;;;;;AACA,SAASA,SAAS,CAACC,KAAU,EAAEC,KAAoB,EAAO;EACxD,IAAID,KAAK,KAAK,IAAI,EAAE;IAClB,IAAIC,KAAK,CAACC,GAAG,CAACF,KAAK,CAAC,EAAE,OAAOC,KAAK,CAACE,GAAG,CAACH,KAAK,CAAC;IAC7C,IAAII,MAAW;IACf,IAAIC,KAAK,CAACC,OAAO,CAACN,KAAK,CAAC,EAAE;MACxBI,MAAM,GAAG,IAAIC,KAAK,CAACL,KAAK,CAACO,MAAM,CAAC;MAChC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGR,KAAK,CAACO,MAAM,EAAEC,CAAC,EAAE,EAAE;QACrCJ,MAAM,CAACI,CAAC,CAAC,GACP,OAAOR,KAAK,CAACQ,CAAC,CAAC,KAAK,QAAQ,GAAGR,KAAK,CAACQ,CAAC,CAAC,GAAGT,SAAS,CAACC,KAAK,CAACQ,CAAC,CAAC,EAAEP,KAAK,CAAC;MACxE;IACF,CAAC,MAAM;MACLG,MAAM,GAAG,CAAC,CAAC;MACX,MAAMK,IAAI,GAAGC,MAAM,CAACD,IAAI,CAACT,KAAK,CAAC;MAC/B,KAAK,IAAIQ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGC,IAAI,CAACF,MAAM,EAAEC,CAAC,EAAE,EAAE;QACpC,MAAMG,GAAG,GAAGF,IAAI,CAACD,CAAC,CAAC;QACnBJ,MAAM,CAACO,GAAG,CAAC,GACT,OAAOX,KAAK,CAACW,GAAG,CAAC,KAAK,QAAQ,GAC1BX,KAAK,CAACW,GAAG,CAAC,GACVZ,SAAS,CAACC,KAAK,CAACW,GAAG,CAAC,EAAEV,KAAK,CAAC;MACpC;IACF;IACAA,KAAK,CAACW,GAAG,CAACZ,KAAK,EAAEI,MAAM,CAAC;IACxB,OAAOA,MAAM;EACf;EACA,OAAOJ,KAAK;AACd;AAEe,kBAAaA,KAAQ,EAAK;EACvC,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOA,KAAK;EAC3C,OAAOD,SAAS,CAACC,KAAK,EAAE,IAAIa,GAAG,EAAE,CAAC;AACpC;AAAC"} \ No newline at end of file +{"version":3,"names":["deepClone","value","cache","has","get","cloned","Array","isArray","length","set","i","keys","Object","key","_default","Map"],"sources":["../../../src/transformation/util/clone-deep.ts"],"sourcesContent":["//https://github.com/babel/babel/pull/14583#discussion_r882828856\nfunction deepClone(value: any, cache: Map): any {\n if (value !== null) {\n if (cache.has(value)) return cache.get(value);\n let cloned: any;\n if (Array.isArray(value)) {\n cloned = new Array(value.length);\n cache.set(value, cloned);\n for (let i = 0; i < value.length; i++) {\n cloned[i] =\n typeof value[i] !== \"object\" ? value[i] : deepClone(value[i], cache);\n }\n } else {\n cloned = {};\n cache.set(value, cloned);\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n cloned[key] =\n typeof value[key] !== \"object\"\n ? value[key]\n : deepClone(value[key], cache);\n }\n }\n return cloned;\n }\n return value;\n}\n\nexport default function (value: T): T {\n if (typeof value !== \"object\") return value;\n return deepClone(value, new Map());\n}\n"],"mappings":";;;;;;AACA,SAASA,SAASA,CAACC,KAAU,EAAEC,KAAoB,EAAO;EACxD,IAAID,KAAK,KAAK,IAAI,EAAE;IAClB,IAAIC,KAAK,CAACC,GAAG,CAACF,KAAK,CAAC,EAAE,OAAOC,KAAK,CAACE,GAAG,CAACH,KAAK,CAAC;IAC7C,IAAII,MAAW;IACf,IAAIC,KAAK,CAACC,OAAO,CAACN,KAAK,CAAC,EAAE;MACxBI,MAAM,GAAG,IAAIC,KAAK,CAACL,KAAK,CAACO,MAAM,CAAC;MAChCN,KAAK,CAACO,GAAG,CAACR,KAAK,EAAEI,MAAM,CAAC;MACxB,KAAK,IAAIK,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGT,KAAK,CAACO,MAAM,EAAEE,CAAC,EAAE,EAAE;QACrCL,MAAM,CAACK,CAAC,CAAC,GACP,OAAOT,KAAK,CAACS,CAAC,CAAC,KAAK,QAAQ,GAAGT,KAAK,CAACS,CAAC,CAAC,GAAGV,SAAS,CAACC,KAAK,CAACS,CAAC,CAAC,EAAER,KAAK,CAAC;MACxE;IACF,CAAC,MAAM;MACLG,MAAM,GAAG,CAAC,CAAC;MACXH,KAAK,CAACO,GAAG,CAACR,KAAK,EAAEI,MAAM,CAAC;MACxB,MAAMM,IAAI,GAAGC,MAAM,CAACD,IAAI,CAACV,KAAK,CAAC;MAC/B,KAAK,IAAIS,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGC,IAAI,CAACH,MAAM,EAAEE,CAAC,EAAE,EAAE;QACpC,MAAMG,GAAG,GAAGF,IAAI,CAACD,CAAC,CAAC;QACnBL,MAAM,CAACQ,GAAG,CAAC,GACT,OAAOZ,KAAK,CAACY,GAAG,CAAC,KAAK,QAAQ,GAC1BZ,KAAK,CAACY,GAAG,CAAC,GACVb,SAAS,CAACC,KAAK,CAACY,GAAG,CAAC,EAAEX,KAAK,CAAC;MACpC;IACF;IACA,OAAOG,MAAM;EACf;EACA,OAAOJ,KAAK;AACd;AAEe,SAAAa,SAAab,KAAQ,EAAK;EACvC,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOA,KAAK;EAC3C,OAAOD,SAAS,CAACC,KAAK,EAAE,IAAIc,GAAG,CAAC,CAAC,CAAC;AACpC;AAAC"} \ No newline at end of file diff --git a/node_modules/@babel/core/lib/vendor/import-meta-resolve.js b/node_modules/@babel/core/lib/vendor/import-meta-resolve.js index 475bdcbe8b2d..eae3148cef36 100644 --- a/node_modules/@babel/core/lib/vendor/import-meta-resolve.js +++ b/node_modules/@babel/core/lib/vendor/import-meta-resolve.js @@ -5,2255 +5,134 @@ Object.defineProperty(exports, "__esModule", { }); exports.moduleResolve = moduleResolve; exports.resolve = resolve; -function _url() { - const data = require("url"); - _url = function () { - return data; - }; - return data; -} -function _fs() { - const data = _interopRequireWildcard(require("fs"), true); - _fs = function () { - return data; - }; - return data; -} -function _path() { - const data = require("path"); - _path = function () { - return data; - }; - return data; -} function _assert() { const data = require("assert"); _assert = function () { - return data; - }; - return data; -} -function _util() { - const data = require("util"); - _util = function () { - return data; - }; - return data; -} -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } -var re$3 = { - exports: {} -}; - -const SEMVER_SPEC_VERSION = '2.0.0'; -const MAX_LENGTH$2 = 256; -const MAX_SAFE_INTEGER$1 = Number.MAX_SAFE_INTEGER || 9007199254740991; - -const MAX_SAFE_COMPONENT_LENGTH = 16; -var constants = { - SEMVER_SPEC_VERSION, - MAX_LENGTH: MAX_LENGTH$2, - MAX_SAFE_INTEGER: MAX_SAFE_INTEGER$1, - MAX_SAFE_COMPONENT_LENGTH -}; -const debug$1 = typeof process === 'object' && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error('SEMVER', ...args) : () => {}; -var debug_1 = debug$1; -(function (module, exports) { - const { - MAX_SAFE_COMPONENT_LENGTH - } = constants; - const debug = debug_1; - exports = module.exports = {}; - - const re = exports.re = []; - const src = exports.src = []; - const t = exports.t = {}; - let R = 0; - const createToken = (name, value, isGlobal) => { - const index = R++; - debug(name, index, value); - t[name] = index; - src[index] = value; - re[index] = new RegExp(value, isGlobal ? 'g' : undefined); - }; - - createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*'); - createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+'); - - createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*'); - - createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})`); - createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})`); - - createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]}|${src[t.NONNUMERICIDENTIFIER]})`); - createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]}|${src[t.NONNUMERICIDENTIFIER]})`); - - createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`); - createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`); - - createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+'); - - createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`); - - createToken('FULLPLAIN', `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`); - createToken('FULL', `^${src[t.FULLPLAIN]}$`); - - createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`); - createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`); - createToken('GTLT', '((?:<|>)?=?)'); - - createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`); - createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`); - createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?` + `)?)?`); - createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?` + `)?)?`); - createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`); - createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`); - - createToken('COERCE', `${'(^|[^\\d])' + '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:$|[^\\d])`); - createToken('COERCERTL', src[t.COERCE], true); - - createToken('LONETILDE', '(?:~>?)'); - createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true); - exports.tildeTrimReplace = '$1~'; - createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`); - createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`); - - createToken('LONECARET', '(?:\\^)'); - createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true); - exports.caretTrimReplace = '$1^'; - createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`); - createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`); - - createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`); - createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`); - - createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true); - exports.comparatorTrimReplace = '$1$2$3'; - - createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAIN]})` + `\\s*$`); - createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAINLOOSE]})` + `\\s*$`); - - createToken('STAR', '(<|>)?=?\\s*\\*'); - createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$'); - createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$'); -})(re$3, re$3.exports); - -const opts = ['includePrerelease', 'loose', 'rtl']; -const parseOptions$2 = options => !options ? {} : typeof options !== 'object' ? { - loose: true -} : opts.filter(k => options[k]).reduce((o, k) => { - o[k] = true; - return o; -}, {}); -var parseOptions_1 = parseOptions$2; -const numeric = /^[0-9]+$/; -const compareIdentifiers$1 = (a, b) => { - const anum = numeric.test(a); - const bnum = numeric.test(b); - if (anum && bnum) { - a = +a; - b = +b; - } - return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1; -}; -const rcompareIdentifiers = (a, b) => compareIdentifiers$1(b, a); -var identifiers = { - compareIdentifiers: compareIdentifiers$1, - rcompareIdentifiers -}; -const debug = debug_1; -const { - MAX_LENGTH: MAX_LENGTH$1, - MAX_SAFE_INTEGER -} = constants; -const { - re: re$2, - t: t$2 -} = re$3.exports; -const parseOptions$1 = parseOptions_1; -const { - compareIdentifiers -} = identifiers; -class SemVer$c { - constructor(version, options) { - options = parseOptions$1(options); - if (version instanceof SemVer$c) { - if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) { - return version; - } else { - version = version.version; - } - } else if (typeof version !== 'string') { - throw new TypeError(`Invalid Version: ${version}`); - } - if (version.length > MAX_LENGTH$1) { - throw new TypeError(`version is longer than ${MAX_LENGTH$1} characters`); - } - debug('SemVer', version, options); - this.options = options; - this.loose = !!options.loose; - this.includePrerelease = !!options.includePrerelease; - const m = version.trim().match(options.loose ? re$2[t$2.LOOSE] : re$2[t$2.FULL]); - if (!m) { - throw new TypeError(`Invalid Version: ${version}`); - } - this.raw = version; - - this.major = +m[1]; - this.minor = +m[2]; - this.patch = +m[3]; - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version'); - } - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version'); - } - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version'); - } - - if (!m[4]) { - this.prerelease = []; - } else { - this.prerelease = m[4].split('.').map(id => { - if (/^[0-9]+$/.test(id)) { - const num = +id; - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num; - } - } - return id; - }); - } - this.build = m[5] ? m[5].split('.') : []; - this.format(); - } - format() { - this.version = `${this.major}.${this.minor}.${this.patch}`; - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}`; - } - return this.version; - } - toString() { - return this.version; - } - compare(other) { - debug('SemVer.compare', this.version, this.options, other); - if (!(other instanceof SemVer$c)) { - if (typeof other === 'string' && other === this.version) { - return 0; - } - other = new SemVer$c(other, this.options); - } - if (other.version === this.version) { - return 0; - } - return this.compareMain(other) || this.comparePre(other); - } - compareMain(other) { - if (!(other instanceof SemVer$c)) { - other = new SemVer$c(other, this.options); - } - return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch); - } - comparePre(other) { - if (!(other instanceof SemVer$c)) { - other = new SemVer$c(other, this.options); - } - - if (this.prerelease.length && !other.prerelease.length) { - return -1; - } else if (!this.prerelease.length && other.prerelease.length) { - return 1; - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0; - } - let i = 0; - do { - const a = this.prerelease[i]; - const b = other.prerelease[i]; - debug('prerelease compare', i, a, b); - if (a === undefined && b === undefined) { - return 0; - } else if (b === undefined) { - return 1; - } else if (a === undefined) { - return -1; - } else if (a === b) { - continue; - } else { - return compareIdentifiers(a, b); - } - } while (++i); - } - compareBuild(other) { - if (!(other instanceof SemVer$c)) { - other = new SemVer$c(other, this.options); - } - let i = 0; - do { - const a = this.build[i]; - const b = other.build[i]; - debug('prerelease compare', i, a, b); - if (a === undefined && b === undefined) { - return 0; - } else if (b === undefined) { - return 1; - } else if (a === undefined) { - return -1; - } else if (a === b) { - continue; - } else { - return compareIdentifiers(a, b); - } - } while (++i); - } - - inc(release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0; - this.patch = 0; - this.minor = 0; - this.major++; - this.inc('pre', identifier); - break; - case 'preminor': - this.prerelease.length = 0; - this.patch = 0; - this.minor++; - this.inc('pre', identifier); - break; - case 'prepatch': - this.prerelease.length = 0; - this.inc('patch', identifier); - this.inc('pre', identifier); - break; - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier); - } - this.inc('pre', identifier); - break; - case 'major': - if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) { - this.major++; - } - this.minor = 0; - this.patch = 0; - this.prerelease = []; - break; - case 'minor': - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++; - } - this.patch = 0; - this.prerelease = []; - break; - case 'patch': - if (this.prerelease.length === 0) { - this.patch++; - } - this.prerelease = []; - break; - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0]; - } else { - let i = this.prerelease.length; - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++; - i = -2; - } - } - if (i === -1) { - this.prerelease.push(0); - } - } - if (identifier) { - if (compareIdentifiers(this.prerelease[0], identifier) === 0) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0]; - } - } else { - this.prerelease = [identifier, 0]; - } - } - break; - default: - throw new Error(`invalid increment argument: ${release}`); - } - this.format(); - this.raw = this.version; - return this; - } -} -var semver$2 = SemVer$c; -const { - MAX_LENGTH -} = constants; -const { - re: re$1, - t: t$1 -} = re$3.exports; -const SemVer$b = semver$2; -const parseOptions = parseOptions_1; -const parse$5 = (version, options) => { - options = parseOptions(options); - if (version instanceof SemVer$b) { - return version; - } - if (typeof version !== 'string') { - return null; - } - if (version.length > MAX_LENGTH) { - return null; - } - const r = options.loose ? re$1[t$1.LOOSE] : re$1[t$1.FULL]; - if (!r.test(version)) { - return null; - } - try { - return new SemVer$b(version, options); - } catch (er) { - return null; - } -}; -var parse_1 = parse$5; -const parse$4 = parse_1; -const valid$1 = (version, options) => { - const v = parse$4(version, options); - return v ? v.version : null; -}; -var valid_1 = valid$1; -const parse$3 = parse_1; -const clean = (version, options) => { - const s = parse$3(version.trim().replace(/^[=v]+/, ''), options); - return s ? s.version : null; -}; -var clean_1 = clean; -const SemVer$a = semver$2; -const inc = (version, release, options, identifier) => { - if (typeof options === 'string') { - identifier = options; - options = undefined; - } - try { - return new SemVer$a(version instanceof SemVer$a ? version.version : version, options).inc(release, identifier).version; - } catch (er) { - return null; - } -}; -var inc_1 = inc; -const SemVer$9 = semver$2; -const compare$a = (a, b, loose) => new SemVer$9(a, loose).compare(new SemVer$9(b, loose)); -var compare_1 = compare$a; -const compare$9 = compare_1; -const eq$2 = (a, b, loose) => compare$9(a, b, loose) === 0; -var eq_1 = eq$2; -const parse$2 = parse_1; -const eq$1 = eq_1; -const diff = (version1, version2) => { - if (eq$1(version1, version2)) { - return null; - } else { - const v1 = parse$2(version1); - const v2 = parse$2(version2); - const hasPre = v1.prerelease.length || v2.prerelease.length; - const prefix = hasPre ? 'pre' : ''; - const defaultResult = hasPre ? 'prerelease' : ''; - for (const key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return prefix + key; - } - } - } - return defaultResult; - } -}; - -var diff_1 = diff; -const SemVer$8 = semver$2; -const major = (a, loose) => new SemVer$8(a, loose).major; -var major_1 = major; -const SemVer$7 = semver$2; -const minor = (a, loose) => new SemVer$7(a, loose).minor; -var minor_1 = minor; -const SemVer$6 = semver$2; -const patch = (a, loose) => new SemVer$6(a, loose).patch; -var patch_1 = patch; -const parse$1 = parse_1; -const prerelease = (version, options) => { - const parsed = parse$1(version, options); - return parsed && parsed.prerelease.length ? parsed.prerelease : null; -}; -var prerelease_1 = prerelease; -const compare$8 = compare_1; -const rcompare = (a, b, loose) => compare$8(b, a, loose); -var rcompare_1 = rcompare; -const compare$7 = compare_1; -const compareLoose = (a, b) => compare$7(a, b, true); -var compareLoose_1 = compareLoose; -const SemVer$5 = semver$2; -const compareBuild$2 = (a, b, loose) => { - const versionA = new SemVer$5(a, loose); - const versionB = new SemVer$5(b, loose); - return versionA.compare(versionB) || versionA.compareBuild(versionB); -}; -var compareBuild_1 = compareBuild$2; -const compareBuild$1 = compareBuild_1; -const sort = (list, loose) => list.sort((a, b) => compareBuild$1(a, b, loose)); -var sort_1 = sort; -const compareBuild = compareBuild_1; -const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)); -var rsort_1 = rsort; -const compare$6 = compare_1; -const gt$3 = (a, b, loose) => compare$6(a, b, loose) > 0; -var gt_1 = gt$3; -const compare$5 = compare_1; -const lt$2 = (a, b, loose) => compare$5(a, b, loose) < 0; -var lt_1 = lt$2; -const compare$4 = compare_1; -const neq$1 = (a, b, loose) => compare$4(a, b, loose) !== 0; -var neq_1 = neq$1; -const compare$3 = compare_1; -const gte$2 = (a, b, loose) => compare$3(a, b, loose) >= 0; -var gte_1 = gte$2; -const compare$2 = compare_1; -const lte$2 = (a, b, loose) => compare$2(a, b, loose) <= 0; -var lte_1 = lte$2; -const eq = eq_1; -const neq = neq_1; -const gt$2 = gt_1; -const gte$1 = gte_1; -const lt$1 = lt_1; -const lte$1 = lte_1; -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') { - a = a.version; - } - if (typeof b === 'object') { - b = b.version; - } - return a === b; - case '!==': - if (typeof a === 'object') { - a = a.version; - } - if (typeof b === 'object') { - b = b.version; - } - return a !== b; - case '': - case '=': - case '==': - return eq(a, b, loose); - case '!=': - return neq(a, b, loose); - case '>': - return gt$2(a, b, loose); - case '>=': - return gte$1(a, b, loose); - case '<': - return lt$1(a, b, loose); - case '<=': - return lte$1(a, b, loose); - default: - throw new TypeError(`Invalid operator: ${op}`); - } -}; -var cmp_1 = cmp; -const SemVer$4 = semver$2; -const parse = parse_1; -const { - re, - t -} = re$3.exports; -const coerce = (version, options) => { - if (version instanceof SemVer$4) { - return version; - } - if (typeof version === 'number') { - version = String(version); - } - if (typeof version !== 'string') { - return null; - } - options = options || {}; - let match = null; - if (!options.rtl) { - match = version.match(re[t.COERCE]); - } else { - let next; - while ((next = re[t.COERCERTL].exec(version)) && (!match || match.index + match[0].length !== version.length)) { - if (!match || next.index + next[0].length !== match.index + match[0].length) { - match = next; - } - re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length; - } - re[t.COERCERTL].lastIndex = -1; - } - if (match === null) { - return null; - } - return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options); -}; -var coerce_1 = coerce; -var iterator; -var hasRequiredIterator; -function requireIterator() { - if (hasRequiredIterator) return iterator; - hasRequiredIterator = 1; - iterator = function (Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value; - } - }; - }; - return iterator; -} -var yallist; -var hasRequiredYallist; -function requireYallist() { - if (hasRequiredYallist) return yallist; - hasRequiredYallist = 1; - yallist = Yallist; - Yallist.Node = Node; - Yallist.create = Yallist; - function Yallist(list) { - var self = this; - if (!(self instanceof Yallist)) { - self = new Yallist(); - } - self.tail = null; - self.head = null; - self.length = 0; - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item); - }); - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]); - } - } - return self; - } - Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list'); - } - var next = node.next; - var prev = node.prev; - if (next) { - next.prev = prev; - } - if (prev) { - prev.next = next; - } - if (node === this.head) { - this.head = next; - } - if (node === this.tail) { - this.tail = prev; - } - node.list.length--; - node.next = null; - node.prev = null; - node.list = null; - return next; - }; - Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return; - } - if (node.list) { - node.list.removeNode(node); - } - var head = this.head; - node.list = this; - node.next = head; - if (head) { - head.prev = node; - } - this.head = node; - if (!this.tail) { - this.tail = node; - } - this.length++; - }; - Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return; - } - if (node.list) { - node.list.removeNode(node); - } - var tail = this.tail; - node.list = this; - node.prev = tail; - if (tail) { - tail.next = node; - } - this.tail = node; - if (!this.head) { - this.head = node; - } - this.length++; - }; - Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]); - } - return this.length; - }; - Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]); - } - return this.length; - }; - Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined; - } - var res = this.tail.value; - this.tail = this.tail.prev; - if (this.tail) { - this.tail.next = null; - } else { - this.head = null; - } - this.length--; - return res; - }; - Yallist.prototype.shift = function () { - if (!this.head) { - return undefined; - } - var res = this.head.value; - this.head = this.head.next; - if (this.head) { - this.head.prev = null; - } else { - this.tail = null; - } - this.length--; - return res; - }; - Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this; - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this); - walker = walker.next; - } - }; - Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this; - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this); - walker = walker.prev; - } - }; - Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - walker = walker.next; - } - if (i === n && walker !== null) { - return walker.value; - } - }; - Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - walker = walker.prev; - } - if (i === n && walker !== null) { - return walker.value; - } - }; - Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this; - var res = new Yallist(); - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)); - walker = walker.next; - } - return res; - }; - Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this; - var res = new Yallist(); - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)); - walker = walker.prev; - } - return res; - }; - Yallist.prototype.reduce = function (fn, initial) { - var acc; - var walker = this.head; - if (arguments.length > 1) { - acc = initial; - } else if (this.head) { - walker = this.head.next; - acc = this.head.value; - } else { - throw new TypeError('Reduce of empty list with no initial value'); - } - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i); - walker = walker.next; - } - return acc; - }; - Yallist.prototype.reduceReverse = function (fn, initial) { - var acc; - var walker = this.tail; - if (arguments.length > 1) { - acc = initial; - } else if (this.tail) { - walker = this.tail.prev; - acc = this.tail.value; - } else { - throw new TypeError('Reduce of empty list with no initial value'); - } - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i); - walker = walker.prev; - } - return acc; - }; - Yallist.prototype.toArray = function () { - var arr = new Array(this.length); - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value; - walker = walker.next; - } - return arr; - }; - Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length); - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value; - walker = walker.prev; - } - return arr; - }; - Yallist.prototype.slice = function (from, to) { - to = to || this.length; - if (to < 0) { - to += this.length; - } - from = from || 0; - if (from < 0) { - from += this.length; - } - var ret = new Yallist(); - if (to < from || to < 0) { - return ret; - } - if (from < 0) { - from = 0; - } - if (to > this.length) { - to = this.length; - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next; - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value); - } - return ret; - }; - Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length; - if (to < 0) { - to += this.length; - } - from = from || 0; - if (from < 0) { - from += this.length; - } - var ret = new Yallist(); - if (to < from || to < 0) { - return ret; - } - if (from < 0) { - from = 0; - } - if (to > this.length) { - to = this.length; - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev; - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value); - } - return ret; - }; - Yallist.prototype.splice = function (start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1; - } - if (start < 0) { - start = this.length + start; - } - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next; - } - var ret = []; - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value); - walker = this.removeNode(walker); - } - if (walker === null) { - walker = this.tail; - } - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev; - } - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]); - } - return ret; - }; - Yallist.prototype.reverse = function () { - var head = this.head; - var tail = this.tail; - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev; - walker.prev = walker.next; - walker.next = p; - } - this.head = tail; - this.tail = head; - return this; - }; - function insert(self, node, value) { - var inserted = node === self.head ? new Node(value, null, node, self) : new Node(value, node, node.next, self); - if (inserted.next === null) { - self.tail = inserted; - } - if (inserted.prev === null) { - self.head = inserted; - } - self.length++; - return inserted; - } - function push(self, item) { - self.tail = new Node(item, self.tail, null, self); - if (!self.head) { - self.head = self.tail; - } - self.length++; - } - function unshift(self, item) { - self.head = new Node(item, null, self.head, self); - if (!self.tail) { - self.tail = self.head; - } - self.length++; - } - function Node(value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list); - } - this.list = list; - this.value = value; - if (prev) { - prev.next = this; - this.prev = prev; - } else { - this.prev = null; - } - if (next) { - next.prev = this; - this.next = next; - } else { - this.next = null; - } - } - try { - requireIterator()(Yallist); - } catch (er) {} - return yallist; -} -var lruCache; -var hasRequiredLruCache; -function requireLruCache() { - if (hasRequiredLruCache) return lruCache; - hasRequiredLruCache = 1; - - const Yallist = requireYallist(); - const MAX = Symbol('max'); - const LENGTH = Symbol('length'); - const LENGTH_CALCULATOR = Symbol('lengthCalculator'); - const ALLOW_STALE = Symbol('allowStale'); - const MAX_AGE = Symbol('maxAge'); - const DISPOSE = Symbol('dispose'); - const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet'); - const LRU_LIST = Symbol('lruList'); - const CACHE = Symbol('cache'); - const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet'); - const naiveLength = () => 1; - - class LRUCache { - constructor(options) { - if (typeof options === 'number') options = { - max: options - }; - if (!options) options = {}; - if (options.max && (typeof options.max !== 'number' || options.max < 0)) throw new TypeError('max must be a non-negative number'); - this[MAX] = options.max || Infinity; - const lc = options.length || naiveLength; - this[LENGTH_CALCULATOR] = typeof lc !== 'function' ? naiveLength : lc; - this[ALLOW_STALE] = options.stale || false; - if (options.maxAge && typeof options.maxAge !== 'number') throw new TypeError('maxAge must be a number'); - this[MAX_AGE] = options.maxAge || 0; - this[DISPOSE] = options.dispose; - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false; - this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false; - this.reset(); - } - - set max(mL) { - if (typeof mL !== 'number' || mL < 0) throw new TypeError('max must be a non-negative number'); - this[MAX] = mL || Infinity; - trim(this); - } - get max() { - return this[MAX]; - } - set allowStale(allowStale) { - this[ALLOW_STALE] = !!allowStale; - } - get allowStale() { - return this[ALLOW_STALE]; - } - set maxAge(mA) { - if (typeof mA !== 'number') throw new TypeError('maxAge must be a non-negative number'); - this[MAX_AGE] = mA; - trim(this); - } - get maxAge() { - return this[MAX_AGE]; - } - - set lengthCalculator(lC) { - if (typeof lC !== 'function') lC = naiveLength; - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC; - this[LENGTH] = 0; - this[LRU_LIST].forEach(hit => { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key); - this[LENGTH] += hit.length; - }); - } - trim(this); - } - get lengthCalculator() { - return this[LENGTH_CALCULATOR]; - } - get length() { - return this[LENGTH]; - } - get itemCount() { - return this[LRU_LIST].length; - } - rforEach(fn, thisp) { - thisp = thisp || this; - for (let walker = this[LRU_LIST].tail; walker !== null;) { - const prev = walker.prev; - forEachStep(this, fn, walker, thisp); - walker = prev; - } - } - forEach(fn, thisp) { - thisp = thisp || this; - for (let walker = this[LRU_LIST].head; walker !== null;) { - const next = walker.next; - forEachStep(this, fn, walker, thisp); - walker = next; - } - } - keys() { - return this[LRU_LIST].toArray().map(k => k.key); - } - values() { - return this[LRU_LIST].toArray().map(k => k.value); - } - reset() { - if (this[DISPOSE] && this[LRU_LIST] && this[LRU_LIST].length) { - this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)); - } - this[CACHE] = new Map(); - this[LRU_LIST] = new Yallist(); - this[LENGTH] = 0; - } - - dump() { - return this[LRU_LIST].map(hit => isStale(this, hit) ? false : { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - }).toArray().filter(h => h); - } - dumpLru() { - return this[LRU_LIST]; - } - set(key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE]; - if (maxAge && typeof maxAge !== 'number') throw new TypeError('maxAge must be a number'); - const now = maxAge ? Date.now() : 0; - const len = this[LENGTH_CALCULATOR](value, key); - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)); - return false; - } - const node = this[CACHE].get(key); - const item = node.value; - - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) this[DISPOSE](key, item.value); - } - item.now = now; - item.maxAge = maxAge; - item.value = value; - this[LENGTH] += len - item.length; - item.length = len; - this.get(key); - trim(this); - return true; - } - const hit = new Entry(key, value, len, now, maxAge); - - if (hit.length > this[MAX]) { - if (this[DISPOSE]) this[DISPOSE](key, value); - return false; - } - this[LENGTH] += hit.length; - this[LRU_LIST].unshift(hit); - this[CACHE].set(key, this[LRU_LIST].head); - trim(this); - return true; - } - has(key) { - if (!this[CACHE].has(key)) return false; - const hit = this[CACHE].get(key).value; - return !isStale(this, hit); - } - get(key) { - return get(this, key, true); - } - peek(key) { - return get(this, key, false); - } - pop() { - const node = this[LRU_LIST].tail; - if (!node) return null; - del(this, node); - return node.value; - } - del(key) { - del(this, this[CACHE].get(key)); - } - load(arr) { - this.reset(); - const now = Date.now(); - for (let l = arr.length - 1; l >= 0; l--) { - const hit = arr[l]; - const expiresAt = hit.e || 0; - if (expiresAt === 0) - this.set(hit.k, hit.v);else { - const maxAge = expiresAt - now; - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge); - } - } - } - } - prune() { - this[CACHE].forEach((value, key) => get(this, key, false)); - } - } - const get = (self, key, doUse) => { - const node = self[CACHE].get(key); - if (node) { - const hit = node.value; - if (isStale(self, hit)) { - del(self, node); - if (!self[ALLOW_STALE]) return undefined; - } else { - if (doUse) { - if (self[UPDATE_AGE_ON_GET]) node.value.now = Date.now(); - self[LRU_LIST].unshiftNode(node); - } - } - return hit.value; - } - }; - const isStale = (self, hit) => { - if (!hit || !hit.maxAge && !self[MAX_AGE]) return false; - const diff = Date.now() - hit.now; - return hit.maxAge ? diff > hit.maxAge : self[MAX_AGE] && diff > self[MAX_AGE]; - }; - const trim = self => { - if (self[LENGTH] > self[MAX]) { - for (let walker = self[LRU_LIST].tail; self[LENGTH] > self[MAX] && walker !== null;) { - const prev = walker.prev; - del(self, walker); - walker = prev; - } - } - }; - const del = (self, node) => { - if (node) { - const hit = node.value; - if (self[DISPOSE]) self[DISPOSE](hit.key, hit.value); - self[LENGTH] -= hit.length; - self[CACHE].delete(hit.key); - self[LRU_LIST].removeNode(node); - } - }; - class Entry { - constructor(key, value, length, now, maxAge) { - this.key = key; - this.value = value; - this.length = length; - this.now = now; - this.maxAge = maxAge || 0; - } - } - const forEachStep = (self, fn, node, thisp) => { - let hit = node.value; - if (isStale(self, hit)) { - del(self, node); - if (!self[ALLOW_STALE]) hit = undefined; - } - if (hit) fn.call(thisp, hit.value, hit.key, self); - }; - lruCache = LRUCache; - return lruCache; -} -var range; -var hasRequiredRange; -function requireRange() { - if (hasRequiredRange) return range; - hasRequiredRange = 1; - class Range { - constructor(range, options) { - options = parseOptions(options); - if (range instanceof Range) { - if (range.loose === !!options.loose && range.includePrerelease === !!options.includePrerelease) { - return range; - } else { - return new Range(range.raw, options); - } - } - if (range instanceof Comparator) { - this.raw = range.value; - this.set = [[range]]; - this.format(); - return this; - } - this.options = options; - this.loose = !!options.loose; - this.includePrerelease = !!options.includePrerelease; - - this.raw = range; - this.set = range.split('||') - .map(r => this.parseRange(r.trim())) - .filter(c => c.length); - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${range}`); - } - - if (this.set.length > 1) { - const first = this.set[0]; - this.set = this.set.filter(c => !isNullSet(c[0])); - if (this.set.length === 0) { - this.set = [first]; - } else if (this.set.length > 1) { - for (const c of this.set) { - if (c.length === 1 && isAny(c[0])) { - this.set = [c]; - break; - } - } - } - } - this.format(); - } - format() { - this.range = this.set.map(comps => { - return comps.join(' ').trim(); - }).join('||').trim(); - return this.range; - } - toString() { - return this.range; - } - parseRange(range) { - range = range.trim(); - - const memoOpts = Object.keys(this.options).join(','); - const memoKey = `parseRange:${memoOpts}:${range}`; - const cached = cache.get(memoKey); - if (cached) { - return cached; - } - const loose = this.options.loose; - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]; - range = range.replace(hr, hyphenReplace(this.options.includePrerelease)); - debug('hyphen replace', range); - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace); - debug('comparator trim', range); - - range = range.replace(re[t.TILDETRIM], tildeTrimReplace); - - range = range.replace(re[t.CARETTRIM], caretTrimReplace); - - range = range.split(/\s+/).join(' '); - - let rangeList = range.split(' ').map(comp => parseComparator(comp, this.options)).join(' ').split(/\s+/) - .map(comp => replaceGTE0(comp, this.options)); - if (loose) { - rangeList = rangeList.filter(comp => { - debug('loose invalid filter', comp, this.options); - return !!comp.match(re[t.COMPARATORLOOSE]); - }); - } - debug('range list', rangeList); - - const rangeMap = new Map(); - const comparators = rangeList.map(comp => new Comparator(comp, this.options)); - for (const comp of comparators) { - if (isNullSet(comp)) { - return [comp]; - } - rangeMap.set(comp.value, comp); - } - if (rangeMap.size > 1 && rangeMap.has('')) { - rangeMap.delete(''); - } - const result = [...rangeMap.values()]; - cache.set(memoKey, result); - return result; - } - intersects(range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required'); - } - return this.set.some(thisComparators => { - return isSatisfiable(thisComparators, options) && range.set.some(rangeComparators => { - return isSatisfiable(rangeComparators, options) && thisComparators.every(thisComparator => { - return rangeComparators.every(rangeComparator => { - return thisComparator.intersects(rangeComparator, options); - }); - }); - }); - }); - } - - test(version) { - if (!version) { - return false; - } - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options); - } catch (er) { - return false; - } - } - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true; - } - } - return false; - } - } - range = Range; - const LRU = requireLruCache(); - const cache = new LRU({ - max: 1000 - }); - const parseOptions = parseOptions_1; - const Comparator = requireComparator(); - const debug = debug_1; - const SemVer = semver$2; - const { - re, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace - } = re$3.exports; - const isNullSet = c => c.value === '<0.0.0-0'; - const isAny = c => c.value === ''; - - const isSatisfiable = (comparators, options) => { - let result = true; - const remainingComparators = comparators.slice(); - let testComparator = remainingComparators.pop(); - while (result && remainingComparators.length) { - result = remainingComparators.every(otherComparator => { - return testComparator.intersects(otherComparator, options); - }); - testComparator = remainingComparators.pop(); - } - return result; - }; - - const parseComparator = (comp, options) => { - debug('comp', comp, options); - comp = replaceCarets(comp, options); - debug('caret', comp); - comp = replaceTildes(comp, options); - debug('tildes', comp); - comp = replaceXRanges(comp, options); - debug('xrange', comp); - comp = replaceStars(comp, options); - debug('stars', comp); - return comp; - }; - const isX = id => !id || id.toLowerCase() === 'x' || id === '*'; - - const replaceTildes = (comp, options) => comp.trim().split(/\s+/).map(c => { - return replaceTilde(c, options); - }).join(' '); - const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]; - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr); - let ret; - if (isX(M)) { - ret = ''; - } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0`; - } else if (isX(p)) { - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`; - } else if (pr) { - debug('replaceTilde pr', pr); - ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`; - } else { - ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`; - } - debug('tilde return', ret); - return ret; - }); + return data; }; - - const replaceCarets = (comp, options) => comp.trim().split(/\s+/).map(c => { - return replaceCaret(c, options); - }).join(' '); - const replaceCaret = (comp, options) => { - debug('caret', comp, options); - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]; - const z = options.includePrerelease ? '-0' : ''; - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr); - let ret; - if (isX(M)) { - ret = ''; - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`; - } else if (isX(p)) { - if (M === '0') { - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`; - } else { - ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`; - } - } else if (pr) { - debug('replaceCaret pr', pr); - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`; - } else { - ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`; - } - } else { - ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`; - } - } else { - debug('no pr'); - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`; - } else { - ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`; - } - } else { - ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`; - } - } - debug('caret return', ret); - return ret; - }); + return data; +} +function _fs() { + const data = _interopRequireWildcard(require("fs"), true); + _fs = function () { + return data; }; - const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options); - return comp.split(/\s+/).map(c => { - return replaceXRange(c, options); - }).join(' '); + return data; +} +function _process() { + const data = require("process"); + _process = function () { + return data; }; - const replaceXRange = (comp, options) => { - comp = comp.trim(); - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]; - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr); - const xM = isX(M); - const xm = xM || isX(m); - const xp = xm || isX(p); - const anyX = xp; - if (gtlt === '=' && anyX) { - gtlt = ''; - } - - pr = options.includePrerelease ? '-0' : ''; - if (xM) { - if (gtlt === '>' || gtlt === '<') { - ret = '<0.0.0-0'; - } else { - ret = '*'; - } - } else if (gtlt && anyX) { - if (xm) { - m = 0; - } - p = 0; - if (gtlt === '>') { - gtlt = '>='; - if (xm) { - M = +M + 1; - m = 0; - p = 0; - } else { - m = +m + 1; - p = 0; - } - } else if (gtlt === '<=') { - gtlt = '<'; - if (xm) { - M = +M + 1; - } else { - m = +m + 1; - } - } - if (gtlt === '<') { - pr = '-0'; - } - ret = `${gtlt + M}.${m}.${p}${pr}`; - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`; - } else if (xp) { - ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`; - } - debug('xRange return', ret); - return ret; - }); + return data; +} +function _url() { + const data = require("url"); + _url = function () { + return data; }; - - const replaceStars = (comp, options) => { - debug('replaceStars', comp, options); - return comp.trim().replace(re[t.STAR], ''); + return data; +} +function _path() { + const data = require("path"); + _path = function () { + return data; }; - const replaceGTE0 = (comp, options) => { - debug('replaceGTE0', comp, options); - return comp.trim().replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], ''); + return data; +} +function _module() { + const data = require("module"); + _module = function () { + return data; }; - - const hyphenReplace = incPr => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr, tb) => { - if (isX(fM)) { - from = ''; - } else if (isX(fm)) { - from = `>=${fM}.0.0${incPr ? '-0' : ''}`; - } else if (isX(fp)) { - from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`; - } else if (fpr) { - from = `>=${from}`; - } else { - from = `>=${from}${incPr ? '-0' : ''}`; - } - if (isX(tM)) { - to = ''; - } else if (isX(tm)) { - to = `<${+tM + 1}.0.0-0`; - } else if (isX(tp)) { - to = `<${tM}.${+tm + 1}.0-0`; - } else if (tpr) { - to = `<=${tM}.${tm}.${tp}-${tpr}`; - } else if (incPr) { - to = `<${tM}.${tm}.${+tp + 1}-0`; - } else { - to = `<=${to}`; - } - return `${from} ${to}`.trim(); + return data; +} +function _v() { + const data = require("v8"); + _v = function () { + return data; }; - const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false; - } - } - if (version.prerelease.length && !options.includePrerelease) { - for (let i = 0; i < set.length; i++) { - debug(set[i].semver); - if (set[i].semver === Comparator.ANY) { - continue; - } - if (set[i].semver.prerelease.length > 0) { - const allowed = set[i].semver; - if (allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch) { - return true; - } - } - } - - return false; - } - return true; + return data; +} +function _util() { + const data = require("util"); + _util = function () { + return data; }; - return range; + return data; } -var comparator; -var hasRequiredComparator; -function requireComparator() { - if (hasRequiredComparator) return comparator; - hasRequiredComparator = 1; - const ANY = Symbol('SemVer ANY'); - class Comparator { - static get ANY() { - return ANY; - } - constructor(comp, options) { - options = parseOptions(options); - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp; - } else { - comp = comp.value; - } - } - debug('comparator', comp, options); - this.options = options; - this.loose = !!options.loose; - this.parse(comp); - if (this.semver === ANY) { - this.value = ''; - } else { - this.value = this.operator + this.semver.version; - } - debug('comp', this); - } - parse(comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]; - const m = comp.match(r); - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`); - } - this.operator = m[1] !== undefined ? m[1] : ''; - if (this.operator === '=') { - this.operator = ''; - } - - if (!m[2]) { - this.semver = ANY; - } else { - this.semver = new SemVer(m[2], this.options.loose); - } - } - toString() { - return this.value; - } - test(version) { - debug('Comparator.test', version, this.options.loose); - if (this.semver === ANY || version === ANY) { - return true; - } - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options); - } catch (er) { - return false; - } - } - return cmp(version, this.operator, this.semver, this.options); - } - intersects(comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required'); - } - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - }; - } - if (this.operator === '') { - if (this.value === '') { - return true; - } - return new Range(comp.value, options).test(this.value); - } else if (comp.operator === '') { - if (comp.value === '') { - return true; - } - return new Range(this.value, options).test(comp.semver); - } - const sameDirectionIncreasing = (this.operator === '>=' || this.operator === '>') && (comp.operator === '>=' || comp.operator === '>'); - const sameDirectionDecreasing = (this.operator === '<=' || this.operator === '<') && (comp.operator === '<=' || comp.operator === '<'); - const sameSemVer = this.semver.version === comp.semver.version; - const differentDirectionsInclusive = (this.operator === '>=' || this.operator === '<=') && (comp.operator === '>=' || comp.operator === '<='); - const oppositeDirectionsLessThan = cmp(this.semver, '<', comp.semver, options) && (this.operator === '>=' || this.operator === '>') && (comp.operator === '<=' || comp.operator === '<'); - const oppositeDirectionsGreaterThan = cmp(this.semver, '>', comp.semver, options) && (this.operator === '<=' || this.operator === '<') && (comp.operator === '>=' || comp.operator === '>'); - return sameDirectionIncreasing || sameDirectionDecreasing || sameSemVer && differentDirectionsInclusive || oppositeDirectionsLessThan || oppositeDirectionsGreaterThan; - } - } - comparator = Comparator; - const parseOptions = parseOptions_1; - const { - re, - t - } = re$3.exports; - const cmp = cmp_1; - const debug = debug_1; - const SemVer = semver$2; - const Range = requireRange(); - return comparator; +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +const own$1 = {}.hasOwnProperty; +const classRegExp = /^([A-Z][a-z\d]*)+$/; +const kTypes = new Set(['string', 'function', 'number', 'object', 'Function', 'Object', 'boolean', 'bigint', 'symbol']); +const codes = {}; +function formatList(array, type = 'and') { + return array.length < 3 ? array.join(` ${type} `) : `${array.slice(0, -1).join(', ')}, ${type} ${array[array.length - 1]}`; } -const Range$8 = requireRange(); -const satisfies$3 = (version, range, options) => { - try { - range = new Range$8(range, options); - } catch (er) { - return false; - } - return range.test(version); -}; -var satisfies_1 = satisfies$3; -const Range$7 = requireRange(); - -const toComparators = (range, options) => new Range$7(range, options).set.map(comp => comp.map(c => c.value).join(' ').trim().split(' ')); -var toComparators_1 = toComparators; -const SemVer$3 = semver$2; -const Range$6 = requireRange(); -const maxSatisfying = (versions, range, options) => { - let max = null; - let maxSV = null; - let rangeObj = null; - try { - rangeObj = new Range$6(range, options); - } catch (er) { - return null; - } - versions.forEach(v => { - if (rangeObj.test(v)) { - if (!max || maxSV.compare(v) === -1) { - max = v; - maxSV = new SemVer$3(max, options); - } - } - }); - return max; -}; -var maxSatisfying_1 = maxSatisfying; -const SemVer$2 = semver$2; -const Range$5 = requireRange(); -const minSatisfying = (versions, range, options) => { - let min = null; - let minSV = null; - let rangeObj = null; - try { - rangeObj = new Range$5(range, options); - } catch (er) { - return null; - } - versions.forEach(v => { - if (rangeObj.test(v)) { - if (!min || minSV.compare(v) === 1) { - min = v; - minSV = new SemVer$2(min, options); - } - } - }); - return min; -}; -var minSatisfying_1 = minSatisfying; -const SemVer$1 = semver$2; -const Range$4 = requireRange(); -const gt$1 = gt_1; -const minVersion = (range, loose) => { - range = new Range$4(range, loose); - let minver = new SemVer$1('0.0.0'); - if (range.test(minver)) { - return minver; - } - minver = new SemVer$1('0.0.0-0'); - if (range.test(minver)) { - return minver; - } - minver = null; - for (let i = 0; i < range.set.length; ++i) { - const comparators = range.set[i]; - let setMin = null; - comparators.forEach(comparator => { - const compver = new SemVer$1(comparator.semver.version); - switch (comparator.operator) { - case '>': - if (compver.prerelease.length === 0) { - compver.patch++; - } else { - compver.prerelease.push(0); - } - compver.raw = compver.format(); - case '': - case '>=': - if (!setMin || gt$1(compver, setMin)) { - setMin = compver; - } - break; - case '<': - case '<=': - break; - default: - throw new Error(`Unexpected operation: ${comparator.operator}`); - } - }); - if (setMin && (!minver || gt$1(minver, setMin))) { - minver = setMin; - } - } - if (minver && range.test(minver)) { - return minver; - } - return null; -}; -var minVersion_1 = minVersion; -const Range$3 = requireRange(); -const validRange = (range, options) => { - try { - return new Range$3(range, options).range || '*'; - } catch (er) { - return null; - } -}; -var valid = validRange; -const SemVer = semver$2; -const Comparator$1 = requireComparator(); -const { - ANY: ANY$1 -} = Comparator$1; -const Range$2 = requireRange(); -const satisfies$2 = satisfies_1; -const gt = gt_1; -const lt = lt_1; -const lte = lte_1; -const gte = gte_1; -const outside$2 = (version, range, hilo, options) => { - version = new SemVer(version, options); - range = new Range$2(range, options); - let gtfn, ltefn, ltfn, comp, ecomp; - switch (hilo) { - case '>': - gtfn = gt; - ltefn = lte; - ltfn = lt; - comp = '>'; - ecomp = '>='; - break; - case '<': - gtfn = lt; - ltefn = gte; - ltfn = gt; - comp = '<'; - ecomp = '<='; - break; - default: - throw new TypeError('Must provide a hilo val of "<" or ">"'); - } - - if (satisfies$2(version, range, options)) { - return false; - } - - for (let i = 0; i < range.set.length; ++i) { - const comparators = range.set[i]; - let high = null; - let low = null; - comparators.forEach(comparator => { - if (comparator.semver === ANY$1) { - comparator = new Comparator$1('>=0.0.0'); - } - high = high || comparator; - low = low || comparator; - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator; - } else if (ltfn(comparator.semver, low.semver, options)) { - low = comparator; - } - }); - - if (high.operator === comp || high.operator === ecomp) { - return false; - } - - if ((!low.operator || low.operator === comp) && ltefn(version, low.semver)) { - return false; - } else if (low.operator === ecomp && ltfn(version, low.semver)) { - return false; - } - } - return true; -}; -var outside_1 = outside$2; - -const outside$1 = outside_1; -const gtr = (version, range, options) => outside$1(version, range, '>', options); -var gtr_1 = gtr; -const outside = outside_1; -const ltr = (version, range, options) => outside(version, range, '<', options); -var ltr_1 = ltr; -const Range$1 = requireRange(); -const intersects = (r1, r2, options) => { - r1 = new Range$1(r1, options); - r2 = new Range$1(r2, options); - return r1.intersects(r2); -}; -var intersects_1 = intersects; - -const satisfies$1 = satisfies_1; -const compare$1 = compare_1; -var simplify = (versions, range, options) => { - const set = []; - let first = null; - let prev = null; - const v = versions.sort((a, b) => compare$1(a, b, options)); - for (const version of v) { - const included = satisfies$1(version, range, options); - if (included) { - prev = version; - if (!first) { - first = version; - } - } else { - if (prev) { - set.push([first, prev]); - } - prev = null; - first = null; - } - } - if (first) { - set.push([first, null]); - } - const ranges = []; - for (const [min, max] of set) { - if (min === max) { - ranges.push(min); - } else if (!max && min === v[0]) { - ranges.push('*'); - } else if (!max) { - ranges.push(`>=${min}`); - } else if (min === v[0]) { - ranges.push(`<=${max}`); +const messages = new Map(); +const nodeInternalPrefix = '__node_internal_'; +let userStackTraceLimit; +codes.ERR_INVALID_ARG_TYPE = createError('ERR_INVALID_ARG_TYPE', (name, expected, actual) => { + _assert()(typeof name === 'string', "'name' must be a string"); + if (!Array.isArray(expected)) { + expected = [expected]; + } + let message = 'The '; + if (name.endsWith(' argument')) { + message += `${name} `; + } else { + const type = name.includes('.') ? 'property' : 'argument'; + message += `"${name}" ${type} `; + } + message += 'must be '; + const types = []; + const instances = []; + const other = []; + for (const value of expected) { + _assert()(typeof value === 'string', 'All expected entries have to be of type string'); + if (kTypes.has(value)) { + types.push(value.toLowerCase()); + } else if (classRegExp.exec(value) === null) { + _assert()(value !== 'object', 'The value "object" should be written as "Object"'); + other.push(value); } else { - ranges.push(`${min} - ${max}`); + instances.push(value); } } - const simplified = ranges.join(' || '); - const original = typeof range.raw === 'string' ? range.raw : String(range); - return simplified.length < original.length ? simplified : range; -}; -const Range = requireRange(); -const Comparator = requireComparator(); -const { - ANY -} = Comparator; -const satisfies = satisfies_1; -const compare = compare_1; - -const subset = (sub, dom, options = {}) => { - if (sub === dom) { - return true; - } - sub = new Range(sub, options); - dom = new Range(dom, options); - let sawNonNull = false; - OUTER: for (const simpleSub of sub.set) { - for (const simpleDom of dom.set) { - const isSub = simpleSubset(simpleSub, simpleDom, options); - sawNonNull = sawNonNull || isSub !== null; - if (isSub) { - continue OUTER; - } - } - if (sawNonNull) { - return false; + if (instances.length > 0) { + const pos = types.indexOf('object'); + if (pos !== -1) { + types.slice(pos, 1); + instances.push('Object'); } } - return true; -}; -const simpleSubset = (sub, dom, options) => { - if (sub === dom) { - return true; - } - if (sub.length === 1 && sub[0].semver === ANY) { - if (dom.length === 1 && dom[0].semver === ANY) { - return true; - } else if (options.includePrerelease) { - sub = [new Comparator('>=0.0.0-0')]; - } else { - sub = [new Comparator('>=0.0.0')]; - } + if (types.length > 0) { + message += `${types.length > 1 ? 'one of type' : 'of type'} ${formatList(types, 'or')}`; + if (instances.length > 0 || other.length > 0) message += ' or '; } - if (dom.length === 1 && dom[0].semver === ANY) { - if (options.includePrerelease) { - return true; - } else { - dom = [new Comparator('>=0.0.0')]; - } + if (instances.length > 0) { + message += `an instance of ${formatList(instances, 'or')}`; + if (other.length > 0) message += ' or '; } - const eqSet = new Set(); - let gt, lt; - for (const c of sub) { - if (c.operator === '>' || c.operator === '>=') { - gt = higherGT(gt, c, options); - } else if (c.operator === '<' || c.operator === '<=') { - lt = lowerLT(lt, c, options); + if (other.length > 0) { + if (other.length > 1) { + message += `one of ${formatList(other, 'or')}`; } else { - eqSet.add(c.semver); - } - } - if (eqSet.size > 1) { - return null; - } - let gtltComp; - if (gt && lt) { - gtltComp = compare(gt.semver, lt.semver, options); - if (gtltComp > 0) { - return null; - } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) { - return null; - } - } - - for (const eq of eqSet) { - if (gt && !satisfies(eq, String(gt), options)) { - return null; - } - if (lt && !satisfies(eq, String(lt), options)) { - return null; - } - for (const c of dom) { - if (!satisfies(eq, String(c), options)) { - return false; - } - } - return true; - } - let higher, lower; - let hasDomLT, hasDomGT; - let needDomLTPre = lt && !options.includePrerelease && lt.semver.prerelease.length ? lt.semver : false; - let needDomGTPre = gt && !options.includePrerelease && gt.semver.prerelease.length ? gt.semver : false; - if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt.operator === '<' && needDomLTPre.prerelease[0] === 0) { - needDomLTPre = false; - } - for (const c of dom) { - hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='; - hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='; - if (gt) { - if (needDomGTPre) { - if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) { - needDomGTPre = false; - } - } - if (c.operator === '>' || c.operator === '>=') { - higher = higherGT(gt, c, options); - if (higher === c && higher !== gt) { - return false; - } - } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) { - return false; - } + if (other[0].toLowerCase() !== other[0]) message += 'an '; + message += `${other[0]}`; } - if (lt) { - if (needDomLTPre) { - if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomLTPre.major && c.semver.minor === needDomLTPre.minor && c.semver.patch === needDomLTPre.patch) { - needDomLTPre = false; - } - } - if (c.operator === '<' || c.operator === '<=') { - lower = lowerLT(lt, c, options); - if (lower === c && lower !== lt) { - return false; - } - } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) { - return false; - } - } - if (!c.operator && (lt || gt) && gtltComp !== 0) { - return false; - } - } - - if (gt && hasDomLT && !lt && gtltComp !== 0) { - return false; - } - if (lt && hasDomGT && !gt && gtltComp !== 0) { - return false; - } - - if (needDomGTPre || needDomLTPre) { - return false; - } - return true; -}; - -const higherGT = (a, b, options) => { - if (!a) { - return b; - } - const comp = compare(a.semver, b.semver, options); - return comp > 0 ? a : comp < 0 ? b : b.operator === '>' && a.operator === '>=' ? b : a; -}; - -const lowerLT = (a, b, options) => { - if (!a) { - return b; - } - const comp = compare(a.semver, b.semver, options); - return comp < 0 ? a : comp > 0 ? b : b.operator === '<' && a.operator === '<=' ? b : a; -}; -var subset_1 = subset; - -const internalRe = re$3.exports; -var semver$1 = { - re: internalRe.re, - src: internalRe.src, - tokens: internalRe.t, - SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION, - SemVer: semver$2, - compareIdentifiers: identifiers.compareIdentifiers, - rcompareIdentifiers: identifiers.rcompareIdentifiers, - parse: parse_1, - valid: valid_1, - clean: clean_1, - inc: inc_1, - diff: diff_1, - major: major_1, - minor: minor_1, - patch: patch_1, - prerelease: prerelease_1, - compare: compare_1, - rcompare: rcompare_1, - compareLoose: compareLoose_1, - compareBuild: compareBuild_1, - sort: sort_1, - rsort: rsort_1, - gt: gt_1, - lt: lt_1, - eq: eq_1, - neq: neq_1, - gte: gte_1, - lte: lte_1, - cmp: cmp_1, - coerce: coerce_1, - Comparator: requireComparator(), - Range: requireRange(), - satisfies: satisfies_1, - toComparators: toComparators_1, - maxSatisfying: maxSatisfying_1, - minSatisfying: minSatisfying_1, - minVersion: minVersion_1, - validRange: valid, - outside: outside_1, - gtr: gtr_1, - ltr: ltr_1, - intersects: intersects_1, - simplifyRange: simplify, - subset: subset_1 -}; -var semver = semver$1; -var builtins = function ({ - version = process.version, - experimental = false -} = {}) { - var coreModules = ['assert', 'buffer', 'child_process', 'cluster', 'console', 'constants', 'crypto', 'dgram', 'dns', 'domain', 'events', 'fs', 'http', 'https', 'module', 'net', 'os', 'path', 'punycode', 'querystring', 'readline', 'repl', 'stream', 'string_decoder', 'sys', 'timers', 'tls', 'tty', 'url', 'util', 'vm', 'zlib']; - if (semver.lt(version, '6.0.0')) coreModules.push('freelist'); - if (semver.gte(version, '1.0.0')) coreModules.push('v8'); - if (semver.gte(version, '1.1.0')) coreModules.push('process'); - if (semver.gte(version, '8.0.0')) coreModules.push('inspector'); - if (semver.gte(version, '8.1.0')) coreModules.push('async_hooks'); - if (semver.gte(version, '8.4.0')) coreModules.push('http2'); - if (semver.gte(version, '8.5.0')) coreModules.push('perf_hooks'); - if (semver.gte(version, '10.0.0')) coreModules.push('trace_events'); - if (semver.gte(version, '10.5.0') && (experimental || semver.gte(version, '12.0.0'))) { - coreModules.push('worker_threads'); - } - if (semver.gte(version, '12.16.0') && experimental) { - coreModules.push('wasi'); - } - return coreModules; -}; - -const reader = { - read -}; - -function read(jsonPath) { - return find(_path().dirname(jsonPath)); -} - -function find(dir) { - try { - const string = _fs().default.readFileSync(_path().toNamespacedPath(_path().join(dir, 'package.json')), 'utf8'); - return { - string - }; - } catch (error) { - if (error.code === 'ENOENT') { - const parent = _path().dirname(dir); - if (dir !== parent) return find(parent); - return { - string: undefined - }; - } - - throw error; } -} - -const isWindows = process.platform === 'win32'; -const own$1 = {}.hasOwnProperty; -const codes = {}; - -const messages = new Map(); -const nodeInternalPrefix = '__node_internal_'; -let userStackTraceLimit; -codes.ERR_INVALID_MODULE_SPECIFIER = createError('ERR_INVALID_MODULE_SPECIFIER', -(request, reason, base = undefined) => { + message += `. Received ${determineSpecificType(actual)}`; + return message; +}, TypeError); +codes.ERR_INVALID_MODULE_SPECIFIER = createError('ERR_INVALID_MODULE_SPECIFIER', (request, reason, base = undefined) => { return `Invalid module "${request}" ${reason}${base ? ` imported from ${base}` : ''}`; }, TypeError); -codes.ERR_INVALID_PACKAGE_CONFIG = createError('ERR_INVALID_PACKAGE_CONFIG', -(path, base, message) => { +codes.ERR_INVALID_PACKAGE_CONFIG = createError('ERR_INVALID_PACKAGE_CONFIG', (path, base, message) => { return `Invalid package config ${path}${base ? ` while importing ${base}` : ''}${message ? `. ${message}` : ''}`; }, Error); -codes.ERR_INVALID_PACKAGE_TARGET = createError('ERR_INVALID_PACKAGE_TARGET', -(pkgPath, key, target, isImport = false, base = undefined) => { +codes.ERR_INVALID_PACKAGE_TARGET = createError('ERR_INVALID_PACKAGE_TARGET', (pkgPath, key, target, isImport = false, base = undefined) => { const relError = typeof target === 'string' && !isImport && target.length > 0 && !target.startsWith('./'); if (key === '.') { _assert()(isImport === false); @@ -2261,47 +140,33 @@ codes.ERR_INVALID_PACKAGE_TARGET = createError('ERR_INVALID_PACKAGE_TARGET', } return `Invalid "${isImport ? 'imports' : 'exports'}" target ${JSON.stringify(target)} defined for '${key}' in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ''}${relError ? '; targets must start with "./"' : ''}`; }, Error); -codes.ERR_MODULE_NOT_FOUND = createError('ERR_MODULE_NOT_FOUND', -(path, base, type = 'package') => { - return `Cannot find ${type} '${path}' imported from ${base}`; +codes.ERR_MODULE_NOT_FOUND = createError('ERR_MODULE_NOT_FOUND', (path, base, exactUrl = false) => { + return `Cannot find ${exactUrl ? 'module' : 'package'} '${path}' imported from ${base}`; }, Error); -codes.ERR_PACKAGE_IMPORT_NOT_DEFINED = createError('ERR_PACKAGE_IMPORT_NOT_DEFINED', -(specifier, packagePath, base) => { +codes.ERR_NETWORK_IMPORT_DISALLOWED = createError('ERR_NETWORK_IMPORT_DISALLOWED', "import of '%s' by %s is not supported: %s", Error); +codes.ERR_PACKAGE_IMPORT_NOT_DEFINED = createError('ERR_PACKAGE_IMPORT_NOT_DEFINED', (specifier, packagePath, base) => { return `Package import specifier "${specifier}" is not defined${packagePath ? ` in package ${packagePath}package.json` : ''} imported from ${base}`; }, TypeError); -codes.ERR_PACKAGE_PATH_NOT_EXPORTED = createError('ERR_PACKAGE_PATH_NOT_EXPORTED', -(pkgPath, subpath, base = undefined) => { +codes.ERR_PACKAGE_PATH_NOT_EXPORTED = createError('ERR_PACKAGE_PATH_NOT_EXPORTED', (pkgPath, subpath, base = undefined) => { if (subpath === '.') return `No "exports" main defined in ${pkgPath}package.json${base ? ` imported from ${base}` : ''}`; return `Package subpath '${subpath}' is not defined by "exports" in ${pkgPath}package.json${base ? ` imported from ${base}` : ''}`; }, Error); codes.ERR_UNSUPPORTED_DIR_IMPORT = createError('ERR_UNSUPPORTED_DIR_IMPORT', "Directory import '%s' is not supported " + 'resolving ES modules imported from %s', Error); -codes.ERR_UNKNOWN_FILE_EXTENSION = createError('ERR_UNKNOWN_FILE_EXTENSION', 'Unknown file extension "%s" for %s', TypeError); -codes.ERR_INVALID_ARG_VALUE = createError('ERR_INVALID_ARG_VALUE', -(name, value, reason = 'is invalid') => { +codes.ERR_UNKNOWN_FILE_EXTENSION = createError('ERR_UNKNOWN_FILE_EXTENSION', (ext, path) => { + return `Unknown file extension "${ext}" for ${path}`; +}, TypeError); +codes.ERR_INVALID_ARG_VALUE = createError('ERR_INVALID_ARG_VALUE', (name, value, reason = 'is invalid') => { let inspected = (0, _util().inspect)(value); if (inspected.length > 128) { inspected = `${inspected.slice(0, 128)}...`; } const type = name.includes('.') ? 'property' : 'argument'; return `The ${type} '${name}' ${reason}. Received ${inspected}`; -}, TypeError -); - -codes.ERR_UNSUPPORTED_ESM_URL_SCHEME = createError('ERR_UNSUPPORTED_ESM_URL_SCHEME', -url => { - let message = 'Only file and data URLs are supported by the default ESM loader'; - if (isWindows && url.protocol.length === 2) { - message += '. On Windows, absolute paths must be valid file:// URLs'; - } - message += `. Received protocol '${url.protocol}'`; - return message; -}, Error); - +}, TypeError); function createError(sym, value, def) { messages.set(sym, value); return makeNodeErrorWithCode(def, sym); } - function makeNodeErrorWithCode(Base, key) { return NodeError; function NodeError(...args) { @@ -2310,50 +175,39 @@ function makeNodeErrorWithCode(Base, key) { const error = new Base(); if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = limit; const message = getMessage(key, args, error); - Object.defineProperty(error, 'message', { - value: message, - enumerable: false, - writable: true, - configurable: true - }); - Object.defineProperty(error, 'toString', { - value() { - return `${this.name} [${key}]: ${this.message}`; + Object.defineProperties(error, { + message: { + value: message, + enumerable: false, + writable: true, + configurable: true }, - enumerable: false, - writable: true, - configurable: true + toString: { + value() { + return `${this.name} [${key}]: ${this.message}`; + }, + enumerable: false, + writable: true, + configurable: true + } }); - addCodeToName(error, Base.name, key); + captureLargerStackTrace(error); error.code = key; return error; } } -const addCodeToName = hideStackFrames( -function (error, name, code) { - error = captureLargerStackTrace(error); - error.name = `${name} [${code}]`; - error.stack; - if (name === 'SystemError') { - Object.defineProperty(error, 'name', { - value: name, - enumerable: false, - writable: true, - configurable: true - }); - } else { - delete error.name; - } -}); - function isErrorStackTraceLimitWritable() { + try { + if (_v().startupSnapshot.isBuildingSnapshot()) { + return false; + } + } catch (_unused) {} const desc = Object.getOwnPropertyDescriptor(Error, 'stackTraceLimit'); if (desc === undefined) { return Object.isExtensible(Error); } - return own$1.call(desc, 'writable') ? desc.writable : desc.set !== undefined; + return own$1.call(desc, 'writable') && desc.writable !== undefined ? desc.writable : desc.set !== undefined; } - function hideStackFrames(fn) { const hidden = nodeInternalPrefix + fn.name; Object.defineProperty(fn, 'name', { @@ -2361,217 +215,313 @@ function hideStackFrames(fn) { }); return fn; } -const captureLargerStackTrace = hideStackFrames( -function (error) { +const captureLargerStackTrace = hideStackFrames(function (error) { const stackTraceLimitIsWritable = isErrorStackTraceLimitWritable(); if (stackTraceLimitIsWritable) { userStackTraceLimit = Error.stackTraceLimit; Error.stackTraceLimit = Number.POSITIVE_INFINITY; } Error.captureStackTrace(error); - if (stackTraceLimitIsWritable) Error.stackTraceLimit = userStackTraceLimit; return error; }); - function getMessage(key, args, self) { const message = messages.get(key); + _assert()(message !== undefined, 'expected `message` to be found'); if (typeof message === 'function') { - _assert()(message.length <= args.length, - `Code: ${key}; The provided arguments length (${args.length}) does not ` + `match the required ones (${message.length}).`); + _assert()(message.length <= args.length, `Code: ${key}; The provided arguments length (${args.length}) does not ` + `match the required ones (${message.length}).`); return Reflect.apply(message, self, args); } - const expectedLength = (message.match(/%[dfijoOs]/g) || []).length; + const regex = /%[dfijoOs]/g; + let expectedLength = 0; + while (regex.exec(message) !== null) expectedLength++; _assert()(expectedLength === args.length, `Code: ${key}; The provided arguments length (${args.length}) does not ` + `match the required ones (${expectedLength}).`); if (args.length === 0) return message; args.unshift(message); return Reflect.apply(_util().format, null, args); } - +function determineSpecificType(value) { + if (value === null || value === undefined) { + return String(value); + } + if (typeof value === 'function' && value.name) { + return `function ${value.name}`; + } + if (typeof value === 'object') { + if (value.constructor && value.constructor.name) { + return `an instance of ${value.constructor.name}`; + } + return `${(0, _util().inspect)(value, { + depth: -1 + })}`; + } + let inspected = (0, _util().inspect)(value, { + colors: false + }); + if (inspected.length > 28) { + inspected = `${inspected.slice(0, 25)}...`; + } + return `type ${typeof value} (${inspected})`; +} +const hasOwnProperty$1 = {}.hasOwnProperty; +const { + ERR_INVALID_PACKAGE_CONFIG: ERR_INVALID_PACKAGE_CONFIG$1 +} = codes; +const cache = new Map(); +const reader = { + read +}; +var packageJsonReader = reader; +function read(jsonPath, { + base, + specifier +}) { + const existing = cache.get(jsonPath); + if (existing) { + return existing; + } + let string; + try { + string = _fs().default.readFileSync(_path().toNamespacedPath(jsonPath), 'utf8'); + } catch (error) { + const exception = error; + if (exception.code !== 'ENOENT') { + throw exception; + } + } + const result = { + exists: false, + pjsonPath: jsonPath, + main: undefined, + name: undefined, + type: 'none', + exports: undefined, + imports: undefined + }; + if (string !== undefined) { + let parsed; + try { + parsed = JSON.parse(string); + } catch (error_) { + const cause = error_; + const error = new ERR_INVALID_PACKAGE_CONFIG$1(jsonPath, (base ? `"${specifier}" from ` : '') + (0, _url().fileURLToPath)(base || specifier), cause.message); + error.cause = cause; + throw error; + } + result.exists = true; + if (hasOwnProperty$1.call(parsed, 'name') && typeof parsed.name === 'string') { + result.name = parsed.name; + } + if (hasOwnProperty$1.call(parsed, 'main') && typeof parsed.main === 'string') { + result.main = parsed.main; + } + if (hasOwnProperty$1.call(parsed, 'exports')) { + result.exports = parsed.exports; + } + if (hasOwnProperty$1.call(parsed, 'imports')) { + result.imports = parsed.imports; + } + if (hasOwnProperty$1.call(parsed, 'type') && (parsed.type === 'commonjs' || parsed.type === 'module')) { + result.type = parsed.type; + } + } + cache.set(jsonPath, result); + return result; +} +function getPackageScopeConfig(resolved) { + let packageJSONUrl = new (_url().URL)('package.json', resolved); + while (true) { + const packageJSONPath = packageJSONUrl.pathname; + if (packageJSONPath.endsWith('node_modules/package.json')) { + break; + } + const packageConfig = packageJsonReader.read((0, _url().fileURLToPath)(packageJSONUrl), { + specifier: resolved + }); + if (packageConfig.exists) { + return packageConfig; + } + const lastPackageJSONUrl = packageJSONUrl; + packageJSONUrl = new (_url().URL)('../package.json', packageJSONUrl); + if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) { + break; + } + } + const packageJSONPath = (0, _url().fileURLToPath)(packageJSONUrl); + return { + pjsonPath: packageJSONPath, + exists: false, + main: undefined, + name: undefined, + type: 'none', + exports: undefined, + imports: undefined + }; +} +function getPackageType(url) { + const packageConfig = getPackageScopeConfig(url); + return packageConfig.type; +} const { ERR_UNKNOWN_FILE_EXTENSION } = codes; +const hasOwnProperty = {}.hasOwnProperty; const extensionFormatMap = { __proto__: null, '.cjs': 'commonjs', '.js': 'module', + '.json': 'json', '.mjs': 'module' }; - -function defaultGetFormat(url) { - if (url.startsWith('node:')) { - return { - format: 'builtin' - }; +function mimeToFormat(mime) { + if (mime && /\s*(text|application)\/javascript\s*(;\s*charset=utf-?8\s*)?/i.test(mime)) return 'module'; + if (mime === 'application/json') return 'json'; + return null; +} +const protocolHandlers = { + __proto__: null, + 'data:': getDataProtocolModuleFormat, + 'file:': getFileProtocolModuleFormat, + 'http:': getHttpProtocolModuleFormat, + 'https:': getHttpProtocolModuleFormat, + 'node:'() { + return 'builtin'; } - const parsed = new (_url().URL)(url); - if (parsed.protocol === 'data:') { - const { - 1: mime - } = /^([^/]+\/[^;,]+)[^,]*?(;base64)?,/.exec(parsed.pathname) || [null, null]; - const format = mime === 'text/javascript' ? 'module' : null; - return { - format - }; +}; +function getDataProtocolModuleFormat(parsed) { + const { + 1: mime + } = /^([^/]+\/[^;,]+)[^,]*?(;base64)?,/.exec(parsed.pathname) || [null, null, null]; + return mimeToFormat(mime); +} +function extname(url) { + const pathname = url.pathname; + let index = pathname.length; + while (index--) { + const code = pathname.codePointAt(index); + if (code === 47) { + return ''; + } + if (code === 46) { + return pathname.codePointAt(index - 1) === 47 ? '' : pathname.slice(index); + } } - if (parsed.protocol === 'file:') { - const ext = _path().extname(parsed.pathname); - let format; - if (ext === '.js') { - format = getPackageType(parsed.href) === 'module' ? 'module' : 'commonjs'; - } else { - format = extensionFormatMap[ext]; + return ''; +} +function getFileProtocolModuleFormat(url, _context, ignoreErrors) { + const ext = extname(url); + if (ext === '.js') { + const packageType = getPackageType(url); + if (packageType !== 'none') { + return packageType; } - if (!format) { - throw new ERR_UNKNOWN_FILE_EXTENSION(ext, (0, _url().fileURLToPath)(url)); + return 'commonjs'; + } + if (ext === '') { + const packageType = getPackageType(url); + if (packageType === 'none' || packageType === 'commonjs') { + return 'commonjs'; } - return { - format: format || null - }; + return 'module'; } - return { - format: null - }; + const format = extensionFormatMap[ext]; + if (format) return format; + if (ignoreErrors) { + return undefined; + } + const filepath = (0, _url().fileURLToPath)(url); + throw new ERR_UNKNOWN_FILE_EXTENSION(ext, filepath); } - -const listOfBuiltins = builtins(); +function getHttpProtocolModuleFormat() {} +function defaultGetFormatWithoutErrors(url, context) { + const protocol = url.protocol; + if (!hasOwnProperty.call(protocolHandlers, protocol)) { + return null; + } + return protocolHandlers[protocol](url, context, true) || null; +} +const { + ERR_INVALID_ARG_VALUE +} = codes; +const DEFAULT_CONDITIONS = Object.freeze(['node', 'import']); +const DEFAULT_CONDITIONS_SET = new Set(DEFAULT_CONDITIONS); +function getDefaultConditions() { + return DEFAULT_CONDITIONS; +} +function getDefaultConditionsSet() { + return DEFAULT_CONDITIONS_SET; +} +function getConditionsSet(conditions) { + if (conditions !== undefined && conditions !== getDefaultConditions()) { + if (!Array.isArray(conditions)) { + throw new ERR_INVALID_ARG_VALUE('conditions', conditions, 'expected an array'); + } + return new Set(conditions); + } + return getDefaultConditionsSet(); +} +const RegExpPrototypeSymbolReplace = RegExp.prototype[Symbol.replace]; const { + ERR_NETWORK_IMPORT_DISALLOWED, ERR_INVALID_MODULE_SPECIFIER, ERR_INVALID_PACKAGE_CONFIG, ERR_INVALID_PACKAGE_TARGET, ERR_MODULE_NOT_FOUND, ERR_PACKAGE_IMPORT_NOT_DEFINED, ERR_PACKAGE_PATH_NOT_EXPORTED, - ERR_UNSUPPORTED_DIR_IMPORT, - ERR_UNSUPPORTED_ESM_URL_SCHEME, - ERR_INVALID_ARG_VALUE + ERR_UNSUPPORTED_DIR_IMPORT } = codes; const own = {}.hasOwnProperty; -const DEFAULT_CONDITIONS = Object.freeze(['node', 'import']); -const DEFAULT_CONDITIONS_SET = new Set(DEFAULT_CONDITIONS); -const invalidSegmentRegEx = /(^|\\|\/)(\.\.?|node_modules)(\\|\/|$)/; +const invalidSegmentRegEx = /(^|\\|\/)((\.|%2e)(\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))?(\\|\/|$)/i; +const deprecatedInvalidSegmentRegEx = /(^|\\|\/)((\.|%2e)(\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\|\/|$)/i; +const invalidPackageNameRegEx = /^\.|%|\\/; const patternRegEx = /\*/g; -const encodedSepRegEx = /%2f|%2c/i; +const encodedSepRegEx = /%2f|%5c/i; const emittedPackageWarnings = new Set(); -const packageJsonCache = new Map(); - -function emitFolderMapDeprecation(match, pjsonUrl, isExports, base) { - const pjsonPath = (0, _url().fileURLToPath)(pjsonUrl); - if (emittedPackageWarnings.has(pjsonPath + '|' + match)) return; - emittedPackageWarnings.add(pjsonPath + '|' + match); - process.emitWarning(`Use of deprecated folder mapping "${match}" in the ${isExports ? '"exports"' : '"imports"'} field module resolution of the package at ${pjsonPath}${base ? ` imported from ${(0, _url().fileURLToPath)(base)}` : ''}.\n` + `Update this package.json to use a subpath pattern like "${match}*".`, 'DeprecationWarning', 'DEP0148'); +const doubleSlashRegEx = /[/\\]{2}/; +function emitInvalidSegmentDeprecation(target, request, match, packageJsonUrl, internal, base, isTarget) { + if (_process().noDeprecation) { + return; + } + const pjsonPath = (0, _url().fileURLToPath)(packageJsonUrl); + const double = doubleSlashRegEx.exec(isTarget ? target : request) !== null; + _process().emitWarning(`Use of deprecated ${double ? 'double slash' : 'leading or trailing slash matching'} resolving "${target}" for module ` + `request "${request}" ${request === match ? '' : `matched to "${match}" `}in the "${internal ? 'imports' : 'exports'}" field module resolution of the package at ${pjsonPath}${base ? ` imported from ${(0, _url().fileURLToPath)(base)}` : ''}.`, 'DeprecationWarning', 'DEP0166'); } - function emitLegacyIndexDeprecation(url, packageJsonUrl, base, main) { - const { - format - } = defaultGetFormat(url.href); + if (_process().noDeprecation) { + return; + } + const format = defaultGetFormatWithoutErrors(url, { + parentURL: base.href + }); if (format !== 'module') return; - const path = (0, _url().fileURLToPath)(url.href); + const urlPath = (0, _url().fileURLToPath)(url.href); const pkgPath = (0, _url().fileURLToPath)(new (_url().URL)('.', packageJsonUrl)); const basePath = (0, _url().fileURLToPath)(base); - if (main) process.emitWarning(`Package ${pkgPath} has a "main" field set to ${JSON.stringify(main)}, ` + `excluding the full filename and extension to the resolved file at "${path.slice(pkgPath.length)}", imported from ${basePath}.\n Automatic extension resolution of the "main" field is` + 'deprecated for ES modules.', 'DeprecationWarning', 'DEP0151');else process.emitWarning(`No "main" or "exports" field defined in the package.json for ${pkgPath} resolving the main entry point "${path.slice(pkgPath.length)}", imported from ${basePath}.\nDefault "index" lookups for the main are deprecated for ES modules.`, 'DeprecationWarning', 'DEP0151'); -} - -function getConditionsSet(conditions) { - if (conditions !== undefined && conditions !== DEFAULT_CONDITIONS) { - if (!Array.isArray(conditions)) { - throw new ERR_INVALID_ARG_VALUE('conditions', conditions, 'expected an array'); - } - return new Set(conditions); + if (!main) { + _process().emitWarning(`No "main" or "exports" field defined in the package.json for ${pkgPath} resolving the main entry point "${urlPath.slice(pkgPath.length)}", imported from ${basePath}.\nDefault "index" lookups for the main are deprecated for ES modules.`, 'DeprecationWarning', 'DEP0151'); + } else if (_path().resolve(pkgPath, main) !== urlPath) { + _process().emitWarning(`Package ${pkgPath} has a "main" field set to "${main}", ` + `excluding the full filename and extension to the resolved file at "${urlPath.slice(pkgPath.length)}", imported from ${basePath}.\n Automatic extension resolution of the "main" field is ` + 'deprecated for ES modules.', 'DeprecationWarning', 'DEP0151'); } - return DEFAULT_CONDITIONS_SET; } - function tryStatSync(path) { try { return (0, _fs().statSync)(path); - } catch (_unused) { + } catch (_unused2) { return new (_fs().Stats)(); } } - -function getPackageConfig(path, specifier, base) { - const existing = packageJsonCache.get(path); - if (existing !== undefined) { - return existing; - } - const source = reader.read(path).string; - if (source === undefined) { - const packageConfig = { - pjsonPath: path, - exists: false, - main: undefined, - name: undefined, - type: 'none', - exports: undefined, - imports: undefined - }; - packageJsonCache.set(path, packageConfig); - return packageConfig; - } - - let packageJson; - try { - packageJson = JSON.parse(source); - } catch (error) { - throw new ERR_INVALID_PACKAGE_CONFIG(path, (base ? `"${specifier}" from ` : '') + (0, _url().fileURLToPath)(base || specifier), error.message); - } - const { - exports, - imports, - main, - name, - type - } = packageJson; - - const packageConfig = { - pjsonPath: path, - exists: true, - main: typeof main === 'string' ? main : undefined, - name: typeof name === 'string' ? name : undefined, - type: type === 'module' || type === 'commonjs' ? type : 'none', - exports, - imports: imports && typeof imports === 'object' ? imports : undefined - }; - packageJsonCache.set(path, packageConfig); - return packageConfig; -} - -function getPackageScopeConfig(resolved) { - let packageJsonUrl = new (_url().URL)('./package.json', resolved); - while (true) { - const packageJsonPath = packageJsonUrl.pathname; - if (packageJsonPath.endsWith('node_modules/package.json')) break; - const packageConfig = getPackageConfig((0, _url().fileURLToPath)(packageJsonUrl), resolved); - if (packageConfig.exists) return packageConfig; - const lastPackageJsonUrl = packageJsonUrl; - packageJsonUrl = new (_url().URL)('../package.json', packageJsonUrl); - - if (packageJsonUrl.pathname === lastPackageJsonUrl.pathname) break; - } - const packageJsonPath = (0, _url().fileURLToPath)(packageJsonUrl); - const packageConfig = { - pjsonPath: packageJsonPath, - exists: false, - main: undefined, - name: undefined, - type: 'none', - exports: undefined, - imports: undefined - }; - packageJsonCache.set(packageJsonPath, packageConfig); - return packageConfig; -} - function fileExists(url) { - return tryStatSync((0, _url().fileURLToPath)(url)).isFile(); + const stats = (0, _fs().statSync)(url, { + throwIfNoEntry: false + }); + const isFile = stats ? stats.isFile() : undefined; + return isFile === null || isFile === undefined ? false : isFile; } - function legacyMainResolve(packageJsonUrl, packageConfig, base) { let guess; if (packageConfig.main !== undefined) { - guess = new (_url().URL)(`./${packageConfig.main}`, packageJsonUrl); + guess = new (_url().URL)(packageConfig.main, packageJsonUrl); if (fileExists(guess)) return guess; const tries = [`./${packageConfig.main}.js`, `./${packageConfig.main}.json`, `./${packageConfig.main}.node`, `./${packageConfig.main}/index.js`, `./${packageConfig.main}/index.json`, `./${packageConfig.main}/index.node`]; let i = -1; @@ -2585,7 +535,6 @@ function legacyMainResolve(packageJsonUrl, packageConfig, base) { return guess; } } - const tries = ['./index.js', './index.json', './index.node']; let i = -1; while (++i < tries.length) { @@ -2597,105 +546,144 @@ function legacyMainResolve(packageJsonUrl, packageConfig, base) { emitLegacyIndexDeprecation(guess, packageJsonUrl, base, packageConfig.main); return guess; } - throw new ERR_MODULE_NOT_FOUND((0, _url().fileURLToPath)(new (_url().URL)('.', packageJsonUrl)), (0, _url().fileURLToPath)(base)); } - -function finalizeResolution(resolved, base) { - if (encodedSepRegEx.test(resolved.pathname)) throw new ERR_INVALID_MODULE_SPECIFIER(resolved.pathname, 'must not include encoded "/" or "\\" characters', (0, _url().fileURLToPath)(base)); - const path = (0, _url().fileURLToPath)(resolved); - const stats = tryStatSync(path.endsWith('/') ? path.slice(-1) : path); +function finalizeResolution(resolved, base, preserveSymlinks) { + if (encodedSepRegEx.exec(resolved.pathname) !== null) { + throw new ERR_INVALID_MODULE_SPECIFIER(resolved.pathname, 'must not include encoded "/" or "\\" characters', (0, _url().fileURLToPath)(base)); + } + let filePath; + try { + filePath = (0, _url().fileURLToPath)(resolved); + } catch (error) { + const cause = error; + Object.defineProperty(cause, 'input', { + value: String(resolved) + }); + Object.defineProperty(cause, 'module', { + value: String(base) + }); + throw cause; + } + const stats = tryStatSync(filePath.endsWith('/') ? filePath.slice(-1) : filePath); if (stats.isDirectory()) { - const error = new ERR_UNSUPPORTED_DIR_IMPORT(path, (0, _url().fileURLToPath)(base)); + const error = new ERR_UNSUPPORTED_DIR_IMPORT(filePath, (0, _url().fileURLToPath)(base)); error.url = String(resolved); throw error; } if (!stats.isFile()) { - throw new ERR_MODULE_NOT_FOUND(path || resolved.pathname, base && (0, _url().fileURLToPath)(base), 'module'); + const error = new ERR_MODULE_NOT_FOUND(filePath || resolved.pathname, base && (0, _url().fileURLToPath)(base), true); + error.url = String(resolved); + throw error; + } + if (!preserveSymlinks) { + const real = (0, _fs().realpathSync)(filePath); + const { + search, + hash + } = resolved; + resolved = (0, _url().pathToFileURL)(real + (filePath.endsWith(_path().sep) ? '/' : '')); + resolved.search = search; + resolved.hash = hash; } return resolved; } - -function throwImportNotDefined(specifier, packageJsonUrl, base) { - throw new ERR_PACKAGE_IMPORT_NOT_DEFINED(specifier, packageJsonUrl && (0, _url().fileURLToPath)(new (_url().URL)('.', packageJsonUrl)), (0, _url().fileURLToPath)(base)); +function importNotDefined(specifier, packageJsonUrl, base) { + return new ERR_PACKAGE_IMPORT_NOT_DEFINED(specifier, packageJsonUrl && (0, _url().fileURLToPath)(new (_url().URL)('.', packageJsonUrl)), (0, _url().fileURLToPath)(base)); } - -function throwExportsNotFound(subpath, packageJsonUrl, base) { - throw new ERR_PACKAGE_PATH_NOT_EXPORTED((0, _url().fileURLToPath)(new (_url().URL)('.', packageJsonUrl)), subpath, base && (0, _url().fileURLToPath)(base)); +function exportsNotFound(subpath, packageJsonUrl, base) { + return new ERR_PACKAGE_PATH_NOT_EXPORTED((0, _url().fileURLToPath)(new (_url().URL)('.', packageJsonUrl)), subpath, base && (0, _url().fileURLToPath)(base)); } - -function throwInvalidSubpath(subpath, packageJsonUrl, internal, base) { - const reason = `request is not a valid subpath for the "${internal ? 'imports' : 'exports'}" resolution of ${(0, _url().fileURLToPath)(packageJsonUrl)}`; - throw new ERR_INVALID_MODULE_SPECIFIER(subpath, reason, base && (0, _url().fileURLToPath)(base)); +function throwInvalidSubpath(request, match, packageJsonUrl, internal, base) { + const reason = `request is not a valid match in pattern "${match}" for the "${internal ? 'imports' : 'exports'}" resolution of ${(0, _url().fileURLToPath)(packageJsonUrl)}`; + throw new ERR_INVALID_MODULE_SPECIFIER(request, reason, base && (0, _url().fileURLToPath)(base)); } - -function throwInvalidPackageTarget(subpath, target, packageJsonUrl, internal, base) { +function invalidPackageTarget(subpath, target, packageJsonUrl, internal, base) { target = typeof target === 'object' && target !== null ? JSON.stringify(target, null, '') : `${target}`; - throw new ERR_INVALID_PACKAGE_TARGET((0, _url().fileURLToPath)(new (_url().URL)('.', packageJsonUrl)), subpath, target, internal, base && (0, _url().fileURLToPath)(base)); + return new ERR_INVALID_PACKAGE_TARGET((0, _url().fileURLToPath)(new (_url().URL)('.', packageJsonUrl)), subpath, target, internal, base && (0, _url().fileURLToPath)(base)); } - -function resolvePackageTargetString(target, subpath, match, packageJsonUrl, base, pattern, internal, conditions) { - if (subpath !== '' && !pattern && target[target.length - 1] !== '/') throwInvalidPackageTarget(match, target, packageJsonUrl, internal, base); +function resolvePackageTargetString(target, subpath, match, packageJsonUrl, base, pattern, internal, isPathMap, conditions) { + if (subpath !== '' && !pattern && target[target.length - 1] !== '/') throw invalidPackageTarget(match, target, packageJsonUrl, internal, base); if (!target.startsWith('./')) { if (internal && !target.startsWith('../') && !target.startsWith('/')) { let isURL = false; try { new (_url().URL)(target); isURL = true; - } catch (_unused2) {} + } catch (_unused3) {} if (!isURL) { - const exportTarget = pattern ? target.replace(patternRegEx, subpath) : target + subpath; + const exportTarget = pattern ? RegExpPrototypeSymbolReplace.call(patternRegEx, target, () => subpath) : target + subpath; return packageResolve(exportTarget, packageJsonUrl, conditions); } } - throwInvalidPackageTarget(match, target, packageJsonUrl, internal, base); + throw invalidPackageTarget(match, target, packageJsonUrl, internal, base); + } + if (invalidSegmentRegEx.exec(target.slice(2)) !== null) { + if (deprecatedInvalidSegmentRegEx.exec(target.slice(2)) === null) { + if (!isPathMap) { + const request = pattern ? match.replace('*', () => subpath) : match + subpath; + const resolvedTarget = pattern ? RegExpPrototypeSymbolReplace.call(patternRegEx, target, () => subpath) : target; + emitInvalidSegmentDeprecation(resolvedTarget, request, match, packageJsonUrl, internal, base, true); + } + } else { + throw invalidPackageTarget(match, target, packageJsonUrl, internal, base); + } } - if (invalidSegmentRegEx.test(target.slice(2))) throwInvalidPackageTarget(match, target, packageJsonUrl, internal, base); const resolved = new (_url().URL)(target, packageJsonUrl); const resolvedPath = resolved.pathname; const packagePath = new (_url().URL)('.', packageJsonUrl).pathname; - if (!resolvedPath.startsWith(packagePath)) throwInvalidPackageTarget(match, target, packageJsonUrl, internal, base); + if (!resolvedPath.startsWith(packagePath)) throw invalidPackageTarget(match, target, packageJsonUrl, internal, base); if (subpath === '') return resolved; - if (invalidSegmentRegEx.test(subpath)) throwInvalidSubpath(match + subpath, packageJsonUrl, internal, base); - if (pattern) return new (_url().URL)(resolved.href.replace(patternRegEx, subpath)); + if (invalidSegmentRegEx.exec(subpath) !== null) { + const request = pattern ? match.replace('*', () => subpath) : match + subpath; + if (deprecatedInvalidSegmentRegEx.exec(subpath) === null) { + if (!isPathMap) { + const resolvedTarget = pattern ? RegExpPrototypeSymbolReplace.call(patternRegEx, target, () => subpath) : target; + emitInvalidSegmentDeprecation(resolvedTarget, request, match, packageJsonUrl, internal, base, false); + } + } else { + throwInvalidSubpath(request, match, packageJsonUrl, internal, base); + } + } + if (pattern) { + return new (_url().URL)(RegExpPrototypeSymbolReplace.call(patternRegEx, resolved.href, () => subpath)); + } return new (_url().URL)(subpath, resolved); } - function isArrayIndex(key) { const keyNumber = Number(key); if (`${keyNumber}` !== key) return false; return keyNumber >= 0 && keyNumber < 0xffffffff; } - -function resolvePackageTarget(packageJsonUrl, target, subpath, packageSubpath, base, pattern, internal, conditions) { +function resolvePackageTarget(packageJsonUrl, target, subpath, packageSubpath, base, pattern, internal, isPathMap, conditions) { if (typeof target === 'string') { - return resolvePackageTargetString(target, subpath, packageSubpath, packageJsonUrl, base, pattern, internal, conditions); + return resolvePackageTargetString(target, subpath, packageSubpath, packageJsonUrl, base, pattern, internal, isPathMap, conditions); } if (Array.isArray(target)) { const targetList = target; if (targetList.length === 0) return null; - let lastException; let i = -1; while (++i < targetList.length) { const targetItem = targetList[i]; - let resolved; + let resolveResult; try { - resolved = resolvePackageTarget(packageJsonUrl, targetItem, subpath, packageSubpath, base, pattern, internal, conditions); + resolveResult = resolvePackageTarget(packageJsonUrl, targetItem, subpath, packageSubpath, base, pattern, internal, isPathMap, conditions); } catch (error) { - lastException = error; - if (error.code === 'ERR_INVALID_PACKAGE_TARGET') continue; + const exception = error; + lastException = exception; + if (exception.code === 'ERR_INVALID_PACKAGE_TARGET') continue; throw error; } - if (resolved === undefined) continue; - if (resolved === null) { + if (resolveResult === undefined) continue; + if (resolveResult === null) { lastException = null; continue; } - return resolved; + return resolveResult; } if (lastException === undefined || lastException === null) { - return lastException; + return null; } throw lastException; } @@ -2713,19 +701,18 @@ function resolvePackageTarget(packageJsonUrl, target, subpath, packageSubpath, b const key = keys[i]; if (key === 'default' || conditions && conditions.has(key)) { const conditionalTarget = target[key]; - const resolved = resolvePackageTarget(packageJsonUrl, conditionalTarget, subpath, packageSubpath, base, pattern, internal, conditions); - if (resolved === undefined) continue; - return resolved; + const resolveResult = resolvePackageTarget(packageJsonUrl, conditionalTarget, subpath, packageSubpath, base, pattern, internal, isPathMap, conditions); + if (resolveResult === undefined) continue; + return resolveResult; } } - return undefined; + return null; } if (target === null) { return null; } - throwInvalidPackageTarget(packageSubpath, target, packageJsonUrl, internal, base); + throw invalidPackageTarget(packageSubpath, target, packageJsonUrl, internal, base); } - function isConditionalExportsMainSugar(exports, packageJsonUrl, base) { if (typeof exports === 'string' || Array.isArray(exports)) return true; if (typeof exports !== 'object' || exports === null) return false; @@ -2744,101 +731,115 @@ function isConditionalExportsMainSugar(exports, packageJsonUrl, base) { } return isConditionalSugar; } - +function emitTrailingSlashPatternDeprecation(match, pjsonUrl, base) { + if (_process().noDeprecation) { + return; + } + const pjsonPath = (0, _url().fileURLToPath)(pjsonUrl); + if (emittedPackageWarnings.has(pjsonPath + '|' + match)) return; + emittedPackageWarnings.add(pjsonPath + '|' + match); + _process().emitWarning(`Use of deprecated trailing slash pattern mapping "${match}" in the ` + `"exports" field module resolution of the package at ${pjsonPath}${base ? ` imported from ${(0, _url().fileURLToPath)(base)}` : ''}. Mapping specifiers ending in "/" is no longer supported.`, 'DeprecationWarning', 'DEP0155'); +} function packageExportsResolve(packageJsonUrl, packageSubpath, packageConfig, base, conditions) { let exports = packageConfig.exports; - if (isConditionalExportsMainSugar(exports, packageJsonUrl, base)) exports = { - '.': exports - }; - if (own.call(exports, packageSubpath)) { - const target = exports[packageSubpath]; - const resolved = resolvePackageTarget(packageJsonUrl, target, '', packageSubpath, base, false, false, conditions); - if (resolved === null || resolved === undefined) throwExportsNotFound(packageSubpath, packageJsonUrl, base); - return { - resolved, - exact: true + if (isConditionalExportsMainSugar(exports, packageJsonUrl, base)) { + exports = { + '.': exports }; } + if (own.call(exports, packageSubpath) && !packageSubpath.includes('*') && !packageSubpath.endsWith('/')) { + const target = exports[packageSubpath]; + const resolveResult = resolvePackageTarget(packageJsonUrl, target, '', packageSubpath, base, false, false, false, conditions); + if (resolveResult === null || resolveResult === undefined) { + throw exportsNotFound(packageSubpath, packageJsonUrl, base); + } + return resolveResult; + } let bestMatch = ''; + let bestMatchSubpath = ''; const keys = Object.getOwnPropertyNames(exports); let i = -1; while (++i < keys.length) { const key = keys[i]; - if (key[key.length - 1] === '*' && packageSubpath.startsWith(key.slice(0, -1)) && packageSubpath.length >= key.length && key.length > bestMatch.length) { - bestMatch = key; - } else if (key[key.length - 1] === '/' && packageSubpath.startsWith(key) && key.length > bestMatch.length) { - bestMatch = key; + const patternIndex = key.indexOf('*'); + if (patternIndex !== -1 && packageSubpath.startsWith(key.slice(0, patternIndex))) { + if (packageSubpath.endsWith('/')) { + emitTrailingSlashPatternDeprecation(packageSubpath, packageJsonUrl, base); + } + const patternTrailer = key.slice(patternIndex + 1); + if (packageSubpath.length >= key.length && packageSubpath.endsWith(patternTrailer) && patternKeyCompare(bestMatch, key) === 1 && key.lastIndexOf('*') === patternIndex) { + bestMatch = key; + bestMatchSubpath = packageSubpath.slice(patternIndex, packageSubpath.length - patternTrailer.length); + } } } if (bestMatch) { const target = exports[bestMatch]; - const pattern = bestMatch[bestMatch.length - 1] === '*'; - const subpath = packageSubpath.slice(bestMatch.length - (pattern ? 1 : 0)); - const resolved = resolvePackageTarget(packageJsonUrl, target, subpath, bestMatch, base, pattern, false, conditions); - if (resolved === null || resolved === undefined) throwExportsNotFound(packageSubpath, packageJsonUrl, base); - if (!pattern) emitFolderMapDeprecation(bestMatch, packageJsonUrl, true, base); - return { - resolved, - exact: pattern - }; + const resolveResult = resolvePackageTarget(packageJsonUrl, target, bestMatchSubpath, bestMatch, base, true, false, packageSubpath.endsWith('/'), conditions); + if (resolveResult === null || resolveResult === undefined) { + throw exportsNotFound(packageSubpath, packageJsonUrl, base); + } + return resolveResult; } - throwExportsNotFound(packageSubpath, packageJsonUrl, base); + throw exportsNotFound(packageSubpath, packageJsonUrl, base); +} +function patternKeyCompare(a, b) { + const aPatternIndex = a.indexOf('*'); + const bPatternIndex = b.indexOf('*'); + const baseLengthA = aPatternIndex === -1 ? a.length : aPatternIndex + 1; + const baseLengthB = bPatternIndex === -1 ? b.length : bPatternIndex + 1; + if (baseLengthA > baseLengthB) return -1; + if (baseLengthB > baseLengthA) return 1; + if (aPatternIndex === -1) return 1; + if (bPatternIndex === -1) return -1; + if (a.length > b.length) return -1; + if (b.length > a.length) return 1; + return 0; } - function packageImportsResolve(name, base, conditions) { - if (name === '#' || name.startsWith('#/')) { + if (name === '#' || name.startsWith('#/') || name.endsWith('/')) { const reason = 'is not a valid internal imports specifier name'; throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, (0, _url().fileURLToPath)(base)); } - let packageJsonUrl; const packageConfig = getPackageScopeConfig(base); if (packageConfig.exists) { packageJsonUrl = (0, _url().pathToFileURL)(packageConfig.pjsonPath); const imports = packageConfig.imports; if (imports) { - if (own.call(imports, name)) { - const resolved = resolvePackageTarget(packageJsonUrl, imports[name], '', name, base, false, true, conditions); - if (resolved !== null) return { - resolved, - exact: true - }; + if (own.call(imports, name) && !name.includes('*')) { + const resolveResult = resolvePackageTarget(packageJsonUrl, imports[name], '', name, base, false, true, false, conditions); + if (resolveResult !== null && resolveResult !== undefined) { + return resolveResult; + } } else { let bestMatch = ''; + let bestMatchSubpath = ''; const keys = Object.getOwnPropertyNames(imports); let i = -1; while (++i < keys.length) { const key = keys[i]; - if (key[key.length - 1] === '*' && name.startsWith(key.slice(0, -1)) && name.length >= key.length && key.length > bestMatch.length) { - bestMatch = key; - } else if (key[key.length - 1] === '/' && name.startsWith(key) && key.length > bestMatch.length) { - bestMatch = key; + const patternIndex = key.indexOf('*'); + if (patternIndex !== -1 && name.startsWith(key.slice(0, -1))) { + const patternTrailer = key.slice(patternIndex + 1); + if (name.length >= key.length && name.endsWith(patternTrailer) && patternKeyCompare(bestMatch, key) === 1 && key.lastIndexOf('*') === patternIndex) { + bestMatch = key; + bestMatchSubpath = name.slice(patternIndex, name.length - patternTrailer.length); + } } } if (bestMatch) { const target = imports[bestMatch]; - const pattern = bestMatch[bestMatch.length - 1] === '*'; - const subpath = name.slice(bestMatch.length - (pattern ? 1 : 0)); - const resolved = resolvePackageTarget(packageJsonUrl, target, subpath, bestMatch, base, pattern, true, conditions); - if (resolved !== null) { - if (!pattern) emitFolderMapDeprecation(bestMatch, packageJsonUrl, false, base); - return { - resolved, - exact: pattern - }; + const resolveResult = resolvePackageTarget(packageJsonUrl, target, bestMatchSubpath, bestMatch, base, true, true, false, conditions); + if (resolveResult !== null && resolveResult !== undefined) { + return resolveResult; } } } } } - throwImportNotDefined(name, packageJsonUrl, base); -} - -function getPackageType(url) { - const packageConfig = getPackageScopeConfig(url); - return packageConfig.type; + throw importNotDefined(name, packageJsonUrl, base); } - function parsePackageName(specifier, base) { let separatorIndex = specifier.indexOf('/'); let validPackageName = true; @@ -2852,13 +853,8 @@ function parsePackageName(specifier, base) { } } const packageName = separatorIndex === -1 ? specifier : specifier.slice(0, separatorIndex); - - let i = -1; - while (++i < packageName.length) { - if (packageName[i] === '%' || packageName[i] === '\\') { - validPackageName = false; - break; - } + if (invalidPackageNameRegEx.exec(packageName) !== null) { + validPackageName = false; } if (!validPackageName) { throw new ERR_INVALID_MODULE_SPECIFIER(specifier, 'is not a valid package name', (0, _url().fileURLToPath)(base)); @@ -2870,20 +866,20 @@ function parsePackageName(specifier, base) { isScoped }; } - function packageResolve(specifier, base, conditions) { + if (_module().builtinModules.includes(specifier)) { + return new (_url().URL)('node:' + specifier); + } const { packageName, packageSubpath, isScoped } = parsePackageName(specifier, base); - const packageConfig = getPackageScopeConfig(base); - if (packageConfig.exists) { const packageJsonUrl = (0, _url().pathToFileURL)(packageConfig.pjsonPath); if (packageConfig.name === packageName && packageConfig.exports !== undefined && packageConfig.exports !== null) { - return packageExportsResolve(packageJsonUrl, packageSubpath, packageConfig, base, conditions).resolved; + return packageExportsResolve(packageJsonUrl, packageSubpath, packageConfig, base, conditions); } } let packageJsonUrl = new (_url().URL)('./node_modules/' + packageName + '/package.json', base); @@ -2897,15 +893,20 @@ function packageResolve(specifier, base, conditions) { packageJsonPath = (0, _url().fileURLToPath)(packageJsonUrl); continue; } - - const packageConfig = getPackageConfig(packageJsonPath, specifier, base); - if (packageConfig.exports !== undefined && packageConfig.exports !== null) return packageExportsResolve(packageJsonUrl, packageSubpath, packageConfig, base, conditions).resolved; - if (packageSubpath === '.') return legacyMainResolve(packageJsonUrl, packageConfig, base); + const packageConfig = packageJsonReader.read(packageJsonPath, { + base, + specifier + }); + if (packageConfig.exports !== undefined && packageConfig.exports !== null) { + return packageExportsResolve(packageJsonUrl, packageSubpath, packageConfig, base, conditions); + } + if (packageSubpath === '.') { + return legacyMainResolve(packageJsonUrl, packageConfig, base); + } return new (_url().URL)(packageSubpath, packageJsonUrl); } while (packageJsonPath.length !== lastPath.length); - throw new ERR_MODULE_NOT_FOUND(packageName, (0, _url().fileURLToPath)(base)); + throw new ERR_MODULE_NOT_FOUND(packageName, (0, _url().fileURLToPath)(base), false); } - function isRelativeSpecifier(specifier) { if (specifier[0] === '.') { if (specifier.length === 1 || specifier[1] === '/') return true; @@ -2915,86 +916,117 @@ function isRelativeSpecifier(specifier) { } return false; } - function shouldBeTreatedAsRelativeOrAbsolutePath(specifier) { if (specifier === '') return false; if (specifier[0] === '/') return true; return isRelativeSpecifier(specifier); } - -function moduleResolve(specifier, base, conditions) { +function moduleResolve(specifier, base, conditions, preserveSymlinks) { + const protocol = base.protocol; + const isRemote = protocol === 'http:' || protocol === 'https:'; let resolved; if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) { resolved = new (_url().URL)(specifier, base); - } else if (specifier[0] === '#') { - ({ - resolved - } = packageImportsResolve(specifier, base, conditions)); + } else if (!isRemote && specifier[0] === '#') { + resolved = packageImportsResolve(specifier, base, conditions); } else { try { resolved = new (_url().URL)(specifier); - } catch (_unused3) { - resolved = packageResolve(specifier, base, conditions); + } catch (_unused4) { + if (!isRemote) { + resolved = packageResolve(specifier, base, conditions); + } } } - return finalizeResolution(resolved, base); + _assert()(resolved !== undefined, 'expected to be defined'); + if (resolved.protocol !== 'file:') { + return resolved; + } + return finalizeResolution(resolved, base, preserveSymlinks); +} +function checkIfDisallowedImport(specifier, parsed, parsedParentURL) { + if (parsedParentURL) { + const parentProtocol = parsedParentURL.protocol; + if (parentProtocol === 'http:' || parentProtocol === 'https:') { + if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) { + const parsedProtocol = parsed == null ? void 0 : parsed.protocol; + if (parsedProtocol && parsedProtocol !== 'https:' && parsedProtocol !== 'http:') { + throw new ERR_NETWORK_IMPORT_DISALLOWED(specifier, parsedParentURL, 'remote imports cannot import from a local location.'); + } + return { + url: (parsed == null ? void 0 : parsed.href) || '' + }; + } + if (_module().builtinModules.includes(specifier)) { + throw new ERR_NETWORK_IMPORT_DISALLOWED(specifier, parsedParentURL, 'remote imports cannot import from a local location.'); + } + throw new ERR_NETWORK_IMPORT_DISALLOWED(specifier, parsedParentURL, 'only relative and absolute specifiers are supported.'); + } + } +} +function isURL(self) { + return Boolean(self && typeof self === 'object' && 'href' in self && typeof self.href === 'string' && 'protocol' in self && typeof self.protocol === 'string' && self.href && self.protocol); +} +function throwIfInvalidParentURL(parentURL) { + if (parentURL === undefined) { + return; + } + if (typeof parentURL !== 'string' && !isURL(parentURL)) { + throw new codes.ERR_INVALID_ARG_TYPE('parentURL', ['string', 'URL'], parentURL); + } } - function defaultResolve(specifier, context = {}) { const { parentURL } = context; + _assert()(parentURL !== undefined, 'expected `parentURL` to be defined'); + throwIfInvalidParentURL(parentURL); + let parsedParentURL; + if (parentURL) { + try { + parsedParentURL = new (_url().URL)(parentURL); + } catch (_unused5) {} + } let parsed; try { - parsed = new (_url().URL)(specifier); - if (parsed.protocol === 'data:') { + parsed = shouldBeTreatedAsRelativeOrAbsolutePath(specifier) ? new (_url().URL)(specifier, parsedParentURL) : new (_url().URL)(specifier); + const protocol = parsed.protocol; + if (protocol === 'data:') { return { - url: specifier + url: parsed.href, + format: null }; } - } catch (_unused4) {} + } catch (_unused6) {} + const maybeReturn = checkIfDisallowedImport(specifier, parsed, parsedParentURL); + if (maybeReturn) return maybeReturn; if (parsed && parsed.protocol === 'node:') return { url: specifier }; - if (parsed && parsed.protocol !== 'file:' && parsed.protocol !== 'data:') throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(parsed); - if (listOfBuiltins.includes(specifier)) { - return { - url: 'node:' + specifier - }; - } - if (parentURL.startsWith('data:')) { - new (_url().URL)(specifier, parentURL); - } const conditions = getConditionsSet(context.conditions); - let url = moduleResolve(specifier, new (_url().URL)(parentURL), conditions); - const urlPath = (0, _url().fileURLToPath)(url); - const real = (0, _fs().realpathSync)(urlPath); - const old = url; - url = (0, _url().pathToFileURL)(real + (urlPath.endsWith(_path().sep) ? '/' : '')); - url.search = old.search; - url.hash = old.hash; + const url = moduleResolve(specifier, new (_url().URL)(parentURL), conditions, false); return { - url: `${url}` + url: url.href, + format: defaultGetFormatWithoutErrors(url, { + parentURL + }) }; } - -function resolve(_x, _x2) { - return _resolve.apply(this, arguments); -} -function _resolve() { - _resolve = _asyncToGenerator(function* (specifier, parent) { - if (!parent) { - throw new Error('Please pass `parent`: `import-meta-resolve` cannot ponyfill that'); - } - try { - return defaultResolve(specifier, { - parentURL: parent - }).url; - } catch (error) { - return error.code === 'ERR_UNSUPPORTED_DIR_IMPORT' ? error.url : Promise.reject(error); +function resolve(specifier, parent) { + if (!parent) { + throw new Error('Please pass `parent`: `import-meta-resolve` cannot ponyfill that'); + } + try { + return defaultResolve(specifier, { + parentURL: parent + }).url; + } catch (error) { + const exception = error; + if ((exception.code === 'ERR_UNSUPPORTED_DIR_IMPORT' || exception.code === 'ERR_MODULE_NOT_FOUND') && typeof exception.url === 'string') { + return exception.url; } - }); - return _resolve.apply(this, arguments); + throw error; + } } 0 && 0; diff --git a/node_modules/@babel/core/lib/vendor/import-meta-resolve.js.map b/node_modules/@babel/core/lib/vendor/import-meta-resolve.js.map index bfb7c5628e77..093d01b00004 100644 --- a/node_modules/@babel/core/lib/vendor/import-meta-resolve.js.map +++ b/node_modules/@babel/core/lib/vendor/import-meta-resolve.js.map @@ -1 +1 @@ -{"version":3,"names":["re$3","exports","SEMVER_SPEC_VERSION","MAX_LENGTH$2","MAX_SAFE_INTEGER$1","Number","MAX_SAFE_INTEGER","MAX_SAFE_COMPONENT_LENGTH","constants","MAX_LENGTH","debug$1","process","env","NODE_DEBUG","test","args","console","error","debug_1","module","debug","re","src","t","R","createToken","name","value","isGlobal","index","RegExp","undefined","NUMERICIDENTIFIER","NUMERICIDENTIFIERLOOSE","NONNUMERICIDENTIFIER","PRERELEASEIDENTIFIER","PRERELEASEIDENTIFIERLOOSE","BUILDIDENTIFIER","MAINVERSION","PRERELEASE","BUILD","FULLPLAIN","MAINVERSIONLOOSE","PRERELEASELOOSE","LOOSEPLAIN","XRANGEIDENTIFIER","XRANGEIDENTIFIERLOOSE","GTLT","XRANGEPLAIN","XRANGEPLAINLOOSE","COERCE","LONETILDE","tildeTrimReplace","LONECARET","caretTrimReplace","comparatorTrimReplace","opts","parseOptions$2","options","loose","filter","k","reduce","o","parseOptions_1","numeric","compareIdentifiers$1","a","b","anum","bnum","rcompareIdentifiers","identifiers","compareIdentifiers","MAX_LENGTH$1","re$2","t$2","parseOptions$1","SemVer$c","constructor","version","includePrerelease","TypeError","length","m","trim","match","LOOSE","FULL","raw","major","minor","patch","prerelease","split","map","id","num","build","format","join","toString","compare","other","compareMain","comparePre","i","compareBuild","inc","release","identifier","push","isNaN","Error","semver$2","re$1","t$1","SemVer$b","parseOptions","parse$5","r","er","parse_1","parse$4","valid$1","v","valid_1","parse$3","clean","s","replace","clean_1","SemVer$a","inc_1","SemVer$9","compare$a","compare_1","compare$9","eq$2","eq_1","parse$2","eq$1","diff","version1","version2","v1","v2","hasPre","prefix","defaultResult","key","diff_1","SemVer$8","major_1","SemVer$7","minor_1","SemVer$6","patch_1","parse$1","parsed","prerelease_1","compare$8","rcompare","rcompare_1","compare$7","compareLoose","compareLoose_1","SemVer$5","compareBuild$2","versionA","versionB","compareBuild_1","compareBuild$1","sort","list","sort_1","rsort","rsort_1","compare$6","gt$3","gt_1","compare$5","lt$2","lt_1","compare$4","neq$1","neq_1","compare$3","gte$2","gte_1","compare$2","lte$2","lte_1","eq","neq","gt$2","gte$1","lt$1","lte$1","cmp","op","cmp_1","SemVer$4","parse","coerce","String","rtl","next","COERCERTL","exec","lastIndex","coerce_1","iterator","hasRequiredIterator","requireIterator","Yallist","prototype","Symbol","walker","head","yallist","hasRequiredYallist","requireYallist","Node","create","self","tail","forEach","item","arguments","l","removeNode","node","prev","unshiftNode","pushNode","unshift","pop","res","shift","fn","thisp","call","forEachReverse","get","n","getReverse","mapReverse","initial","acc","reduceReverse","toArray","arr","Array","toArrayReverse","slice","from","to","ret","sliceReverse","splice","start","deleteCount","nodes","insert","reverse","p","inserted","lruCache","hasRequiredLruCache","requireLruCache","MAX","LENGTH","LENGTH_CALCULATOR","ALLOW_STALE","MAX_AGE","DISPOSE","NO_DISPOSE_ON_SET","LRU_LIST","CACHE","UPDATE_AGE_ON_GET","naiveLength","LRUCache","max","Infinity","lc","stale","maxAge","dispose","noDisposeOnSet","updateAgeOnGet","reset","mL","allowStale","mA","lengthCalculator","lC","hit","itemCount","rforEach","forEachStep","keys","values","Map","dump","isStale","e","now","h","dumpLru","set","Date","len","has","del","Entry","peek","load","expiresAt","prune","doUse","delete","range","hasRequiredRange","requireRange","Range","Comparator","parseRange","c","first","isNullSet","isAny","comps","memoOpts","Object","memoKey","cached","cache","hr","HYPHENRANGELOOSE","HYPHENRANGE","hyphenReplace","COMPARATORTRIM","TILDETRIM","CARETTRIM","rangeList","comp","parseComparator","replaceGTE0","COMPARATORLOOSE","rangeMap","comparators","size","result","intersects","some","thisComparators","isSatisfiable","rangeComparators","every","thisComparator","rangeComparator","SemVer","testSet","LRU","requireComparator","remainingComparators","testComparator","otherComparator","replaceCarets","replaceTildes","replaceXRanges","replaceStars","isX","toLowerCase","replaceTilde","TILDELOOSE","TILDE","_","M","pr","replaceCaret","CARETLOOSE","CARET","z","replaceXRange","XRANGELOOSE","XRANGE","gtlt","xM","xm","xp","anyX","STAR","GTE0PRE","GTE0","incPr","$0","fM","fm","fp","fpr","fb","tM","tm","tp","tpr","tb","semver","ANY","allowed","comparator","hasRequiredComparator","operator","COMPARATOR","sameDirectionIncreasing","sameDirectionDecreasing","sameSemVer","differentDirectionsInclusive","oppositeDirectionsLessThan","oppositeDirectionsGreaterThan","Range$8","satisfies$3","satisfies_1","Range$7","toComparators","toComparators_1","SemVer$3","Range$6","maxSatisfying","versions","maxSV","rangeObj","maxSatisfying_1","SemVer$2","Range$5","minSatisfying","min","minSV","minSatisfying_1","SemVer$1","Range$4","gt$1","minVersion","minver","setMin","compver","minVersion_1","Range$3","validRange","valid","Comparator$1","ANY$1","Range$2","satisfies$2","gt","lt","lte","gte","outside$2","hilo","gtfn","ltefn","ltfn","ecomp","high","low","outside_1","outside$1","gtr","gtr_1","outside","ltr","ltr_1","Range$1","r1","r2","intersects_1","satisfies$1","compare$1","simplify","included","ranges","simplified","original","satisfies","subset","sub","dom","sawNonNull","OUTER","simpleSub","simpleDom","isSub","simpleSubset","eqSet","Set","higherGT","lowerLT","add","gtltComp","higher","lower","hasDomLT","hasDomGT","needDomLTPre","needDomGTPre","subset_1","internalRe","semver$1","tokens","simplifyRange","builtins","experimental","coreModules","reader","read","jsonPath","find","path","dirname","dir","string","fs","readFileSync","toNamespacedPath","code","parent","isWindows","platform","own$1","hasOwnProperty","codes","messages","nodeInternalPrefix","userStackTraceLimit","ERR_INVALID_MODULE_SPECIFIER","createError","request","reason","base","ERR_INVALID_PACKAGE_CONFIG","message","ERR_INVALID_PACKAGE_TARGET","pkgPath","target","isImport","relError","startsWith","assert","JSON","stringify","ERR_MODULE_NOT_FOUND","type","ERR_PACKAGE_IMPORT_NOT_DEFINED","specifier","packagePath","ERR_PACKAGE_PATH_NOT_EXPORTED","subpath","ERR_UNSUPPORTED_DIR_IMPORT","ERR_UNKNOWN_FILE_EXTENSION","ERR_INVALID_ARG_VALUE","inspected","inspect","includes","ERR_UNSUPPORTED_ESM_URL_SCHEME","url","protocol","sym","def","makeNodeErrorWithCode","Base","NodeError","limit","stackTraceLimit","isErrorStackTraceLimitWritable","getMessage","defineProperty","enumerable","writable","configurable","addCodeToName","hideStackFrames","captureLargerStackTrace","stack","desc","getOwnPropertyDescriptor","isExtensible","hidden","stackTraceLimitIsWritable","POSITIVE_INFINITY","captureStackTrace","Reflect","apply","expectedLength","extensionFormatMap","__proto__","defaultGetFormat","URL","mime","pathname","ext","extname","getPackageType","href","fileURLToPath","listOfBuiltins","own","DEFAULT_CONDITIONS","freeze","DEFAULT_CONDITIONS_SET","invalidSegmentRegEx","patternRegEx","encodedSepRegEx","emittedPackageWarnings","packageJsonCache","emitFolderMapDeprecation","pjsonUrl","isExports","pjsonPath","emitWarning","emitLegacyIndexDeprecation","packageJsonUrl","main","basePath","getConditionsSet","conditions","isArray","tryStatSync","statSync","Stats","getPackageConfig","existing","source","packageConfig","exists","imports","packageJson","getPackageScopeConfig","resolved","packageJsonPath","endsWith","lastPackageJsonUrl","fileExists","isFile","legacyMainResolve","guess","tries","finalizeResolution","stats","isDirectory","throwImportNotDefined","throwExportsNotFound","throwInvalidSubpath","internal","throwInvalidPackageTarget","resolvePackageTargetString","pattern","isURL","exportTarget","packageResolve","resolvedPath","isArrayIndex","keyNumber","resolvePackageTarget","packageSubpath","targetList","lastException","targetItem","getOwnPropertyNames","conditionalTarget","isConditionalExportsMainSugar","isConditionalSugar","j","curIsConditionalSugar","packageExportsResolve","exact","bestMatch","packageImportsResolve","pathToFileURL","parsePackageName","separatorIndex","indexOf","validPackageName","isScoped","packageName","lastPath","stat","isRelativeSpecifier","shouldBeTreatedAsRelativeOrAbsolutePath","moduleResolve","defaultResolve","context","parentURL","urlPath","real","realpathSync","old","sep","search","hash","resolve","Promise","reject"],"sources":["../../src/vendor/import-meta-resolve.js"],"sourcesContent":["\n/****************************************************************************\\\n * NOTE FROM BABEL AUTHORS *\n * This file is inlined from https://github.com/wooorm/import-meta-resolve, *\n * because we need to compile it to CommonJS. *\n\\****************************************************************************/\n\n/*\n(The MIT License)\n\nCopyright (c) 2021 Titus Wormer \n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---\n\nThis is a derivative work based on:\n.\nWhich is licensed:\n\n\"\"\"\nCopyright Node.js contributors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n\nThis license applies to parts of Node.js originating from the\nhttps://github.com/joyent/node repository:\n\n\"\"\"\nCopyright Joyent, Inc. and other Node contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n*/\n\nimport { URL, fileURLToPath, pathToFileURL } from 'url';\nimport fs, { realpathSync, statSync, Stats } from 'fs';\nimport path from 'path';\nimport assert from 'assert';\nimport { format, inspect } from 'util';\n\nvar re$3 = {exports: {}};\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0';\n\nconst MAX_LENGTH$2 = 256;\nconst MAX_SAFE_INTEGER$1 = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991;\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16;\n\nvar constants = {\n SEMVER_SPEC_VERSION,\n MAX_LENGTH: MAX_LENGTH$2,\n MAX_SAFE_INTEGER: MAX_SAFE_INTEGER$1,\n MAX_SAFE_COMPONENT_LENGTH,\n};\n\nconst debug$1 = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {};\n\nvar debug_1 = debug$1;\n\n(function (module, exports) {\n\tconst { MAX_SAFE_COMPONENT_LENGTH } = constants;\n\tconst debug = debug_1;\n\texports = module.exports = {};\n\n\t// The actual regexps go on exports.re\n\tconst re = exports.re = [];\n\tconst src = exports.src = [];\n\tconst t = exports.t = {};\n\tlet R = 0;\n\n\tconst createToken = (name, value, isGlobal) => {\n\t const index = R++;\n\t debug(name, index, value);\n\t t[name] = index;\n\t src[index] = value;\n\t re[index] = new RegExp(value, isGlobal ? 'g' : undefined);\n\t};\n\n\t// The following Regular Expressions can be used for tokenizing,\n\t// validating, and parsing SemVer version strings.\n\n\t// ## Numeric Identifier\n\t// A single `0`, or a non-zero digit followed by zero or more digits.\n\n\tcreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*');\n\tcreateToken('NUMERICIDENTIFIERLOOSE', '[0-9]+');\n\n\t// ## Non-numeric Identifier\n\t// Zero or more digits, followed by a letter or hyphen, and then zero or\n\t// more letters, digits, or hyphens.\n\n\tcreateToken('NONNUMERICIDENTIFIER', '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*');\n\n\t// ## Main Version\n\t// Three dot-separated numeric identifiers.\n\n\tcreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n\t `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n\t `(${src[t.NUMERICIDENTIFIER]})`);\n\n\tcreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n\t `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n\t `(${src[t.NUMERICIDENTIFIERLOOSE]})`);\n\n\t// ## Pre-release Version Identifier\n\t// A numeric identifier, or a non-numeric identifier.\n\n\tcreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]\n\t}|${src[t.NONNUMERICIDENTIFIER]})`);\n\n\tcreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]\n\t}|${src[t.NONNUMERICIDENTIFIER]})`);\n\n\t// ## Pre-release Version\n\t// Hyphen, followed by one or more dot-separated pre-release version\n\t// identifiers.\n\n\tcreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n\t}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`);\n\n\tcreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n\t}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);\n\n\t// ## Build Metadata Identifier\n\t// Any combination of digits, letters, or hyphens.\n\n\tcreateToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+');\n\n\t// ## Build Metadata\n\t// Plus sign, followed by one or more period-separated build metadata\n\t// identifiers.\n\n\tcreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n\t}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`);\n\n\t// ## Full Version String\n\t// A main version, followed optionally by a pre-release version and\n\t// build metadata.\n\n\t// Note that the only major, minor, patch, and pre-release sections of\n\t// the version string are capturing groups. The build metadata is not a\n\t// capturing group, because it should not ever be used in version\n\t// comparison.\n\n\tcreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n\t}${src[t.PRERELEASE]}?${\n\t src[t.BUILD]}?`);\n\n\tcreateToken('FULL', `^${src[t.FULLPLAIN]}$`);\n\n\t// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n\t// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n\t// common in the npm registry.\n\tcreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n\t}${src[t.PRERELEASELOOSE]}?${\n\t src[t.BUILD]}?`);\n\n\tcreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`);\n\n\tcreateToken('GTLT', '((?:<|>)?=?)');\n\n\t// Something like \"2.*\" or \"1.2.x\".\n\t// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n\t// Only the first item is strictly required.\n\tcreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`);\n\tcreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`);\n\n\tcreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n\t `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n\t `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n\t `(?:${src[t.PRERELEASE]})?${\n\t src[t.BUILD]}?` +\n\t `)?)?`);\n\n\tcreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n\t `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n\t `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n\t `(?:${src[t.PRERELEASELOOSE]})?${\n\t src[t.BUILD]}?` +\n\t `)?)?`);\n\n\tcreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`);\n\tcreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`);\n\n\t// Coercion.\n\t// Extract anything that could conceivably be a part of a valid semver\n\tcreateToken('COERCE', `${'(^|[^\\\\d])' +\n\t '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n\t `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n\t `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n\t `(?:$|[^\\\\d])`);\n\tcreateToken('COERCERTL', src[t.COERCE], true);\n\n\t// Tilde ranges.\n\t// Meaning is \"reasonably at or greater than\"\n\tcreateToken('LONETILDE', '(?:~>?)');\n\n\tcreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true);\n\texports.tildeTrimReplace = '$1~';\n\n\tcreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);\n\tcreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);\n\n\t// Caret ranges.\n\t// Meaning is \"at least and backwards compatible with\"\n\tcreateToken('LONECARET', '(?:\\\\^)');\n\n\tcreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true);\n\texports.caretTrimReplace = '$1^';\n\n\tcreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);\n\tcreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);\n\n\t// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\n\tcreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`);\n\tcreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`);\n\n\t// An expression to strip any whitespace between the gtlt and the thing\n\t// it modifies, so that `> 1.2.3` ==> `>1.2.3`\n\tcreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n\t}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);\n\texports.comparatorTrimReplace = '$1$2$3';\n\n\t// Something like `1.2.3 - 1.2.4`\n\t// Note that these all use the loose form, because they'll be\n\t// checked against either the strict or loose comparator form\n\t// later.\n\tcreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n\t `\\\\s+-\\\\s+` +\n\t `(${src[t.XRANGEPLAIN]})` +\n\t `\\\\s*$`);\n\n\tcreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n\t `\\\\s+-\\\\s+` +\n\t `(${src[t.XRANGEPLAINLOOSE]})` +\n\t `\\\\s*$`);\n\n\t// Star ranges basically just allow anything at all.\n\tcreateToken('STAR', '(<|>)?=?\\\\s*\\\\*');\n\t// >=0.0.0 is like a star\n\tcreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$');\n\tcreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$');\n} (re$3, re$3.exports));\n\n// parse out just the options we care about so we always get a consistent\n// obj with keys in a consistent order.\nconst opts = ['includePrerelease', 'loose', 'rtl'];\nconst parseOptions$2 = options =>\n !options ? {}\n : typeof options !== 'object' ? { loose: true }\n : opts.filter(k => options[k]).reduce((o, k) => {\n o[k] = true;\n return o\n }, {});\nvar parseOptions_1 = parseOptions$2;\n\nconst numeric = /^[0-9]+$/;\nconst compareIdentifiers$1 = (a, b) => {\n const anum = numeric.test(a);\n const bnum = numeric.test(b);\n\n if (anum && bnum) {\n a = +a;\n b = +b;\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n};\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers$1(b, a);\n\nvar identifiers = {\n compareIdentifiers: compareIdentifiers$1,\n rcompareIdentifiers,\n};\n\nconst debug = debug_1;\nconst { MAX_LENGTH: MAX_LENGTH$1, MAX_SAFE_INTEGER } = constants;\nconst { re: re$2, t: t$2 } = re$3.exports;\n\nconst parseOptions$1 = parseOptions_1;\nconst { compareIdentifiers } = identifiers;\nclass SemVer$c {\n constructor (version, options) {\n options = parseOptions$1(options);\n\n if (version instanceof SemVer$c) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version;\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n if (version.length > MAX_LENGTH$1) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH$1} characters`\n )\n }\n\n debug('SemVer', version, options);\n this.options = options;\n this.loose = !!options.loose;\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease;\n\n const m = version.trim().match(options.loose ? re$2[t$2.LOOSE] : re$2[t$2.FULL]);\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version;\n\n // these are actually numbers\n this.major = +m[1];\n this.minor = +m[2];\n this.patch = +m[3];\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = [];\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id;\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n });\n }\n\n this.build = m[5] ? m[5].split('.') : [];\n this.format();\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`;\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`;\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other);\n if (!(other instanceof SemVer$c)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer$c(other, this.options);\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer$c)) {\n other = new SemVer$c(other, this.options);\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer$c)) {\n other = new SemVer$c(other, this.options);\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0;\n do {\n const a = this.prerelease[i];\n const b = other.prerelease[i];\n debug('prerelease compare', i, a, b);\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer$c)) {\n other = new SemVer$c(other, this.options);\n }\n\n let i = 0;\n do {\n const a = this.build[i];\n const b = other.build[i];\n debug('prerelease compare', i, a, b);\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0;\n this.patch = 0;\n this.minor = 0;\n this.major++;\n this.inc('pre', identifier);\n break\n case 'preminor':\n this.prerelease.length = 0;\n this.patch = 0;\n this.minor++;\n this.inc('pre', identifier);\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0;\n this.inc('patch', identifier);\n this.inc('pre', identifier);\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier);\n }\n this.inc('pre', identifier);\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++;\n }\n this.minor = 0;\n this.patch = 0;\n this.prerelease = [];\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++;\n }\n this.patch = 0;\n this.prerelease = [];\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++;\n }\n this.prerelease = [];\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre':\n if (this.prerelease.length === 0) {\n this.prerelease = [0];\n } else {\n let i = this.prerelease.length;\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++;\n i = -2;\n }\n }\n if (i === -1) {\n // didn't increment anything\n this.prerelease.push(0);\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = [identifier, 0];\n }\n } else {\n this.prerelease = [identifier, 0];\n }\n }\n break\n\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.format();\n this.raw = this.version;\n return this\n }\n}\n\nvar semver$2 = SemVer$c;\n\nconst { MAX_LENGTH } = constants;\nconst { re: re$1, t: t$1 } = re$3.exports;\nconst SemVer$b = semver$2;\n\nconst parseOptions = parseOptions_1;\nconst parse$5 = (version, options) => {\n options = parseOptions(options);\n\n if (version instanceof SemVer$b) {\n return version\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n if (version.length > MAX_LENGTH) {\n return null\n }\n\n const r = options.loose ? re$1[t$1.LOOSE] : re$1[t$1.FULL];\n if (!r.test(version)) {\n return null\n }\n\n try {\n return new SemVer$b(version, options)\n } catch (er) {\n return null\n }\n};\n\nvar parse_1 = parse$5;\n\nconst parse$4 = parse_1;\nconst valid$1 = (version, options) => {\n const v = parse$4(version, options);\n return v ? v.version : null\n};\nvar valid_1 = valid$1;\n\nconst parse$3 = parse_1;\nconst clean = (version, options) => {\n const s = parse$3(version.trim().replace(/^[=v]+/, ''), options);\n return s ? s.version : null\n};\nvar clean_1 = clean;\n\nconst SemVer$a = semver$2;\n\nconst inc = (version, release, options, identifier) => {\n if (typeof (options) === 'string') {\n identifier = options;\n options = undefined;\n }\n\n try {\n return new SemVer$a(\n version instanceof SemVer$a ? version.version : version,\n options\n ).inc(release, identifier).version\n } catch (er) {\n return null\n }\n};\nvar inc_1 = inc;\n\nconst SemVer$9 = semver$2;\nconst compare$a = (a, b, loose) =>\n new SemVer$9(a, loose).compare(new SemVer$9(b, loose));\n\nvar compare_1 = compare$a;\n\nconst compare$9 = compare_1;\nconst eq$2 = (a, b, loose) => compare$9(a, b, loose) === 0;\nvar eq_1 = eq$2;\n\nconst parse$2 = parse_1;\nconst eq$1 = eq_1;\n\nconst diff = (version1, version2) => {\n if (eq$1(version1, version2)) {\n return null\n } else {\n const v1 = parse$2(version1);\n const v2 = parse$2(version2);\n const hasPre = v1.prerelease.length || v2.prerelease.length;\n const prefix = hasPre ? 'pre' : '';\n const defaultResult = hasPre ? 'prerelease' : '';\n for (const key in v1) {\n if (key === 'major' || key === 'minor' || key === 'patch') {\n if (v1[key] !== v2[key]) {\n return prefix + key\n }\n }\n }\n return defaultResult // may be undefined\n }\n};\nvar diff_1 = diff;\n\nconst SemVer$8 = semver$2;\nconst major = (a, loose) => new SemVer$8(a, loose).major;\nvar major_1 = major;\n\nconst SemVer$7 = semver$2;\nconst minor = (a, loose) => new SemVer$7(a, loose).minor;\nvar minor_1 = minor;\n\nconst SemVer$6 = semver$2;\nconst patch = (a, loose) => new SemVer$6(a, loose).patch;\nvar patch_1 = patch;\n\nconst parse$1 = parse_1;\nconst prerelease = (version, options) => {\n const parsed = parse$1(version, options);\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n};\nvar prerelease_1 = prerelease;\n\nconst compare$8 = compare_1;\nconst rcompare = (a, b, loose) => compare$8(b, a, loose);\nvar rcompare_1 = rcompare;\n\nconst compare$7 = compare_1;\nconst compareLoose = (a, b) => compare$7(a, b, true);\nvar compareLoose_1 = compareLoose;\n\nconst SemVer$5 = semver$2;\nconst compareBuild$2 = (a, b, loose) => {\n const versionA = new SemVer$5(a, loose);\n const versionB = new SemVer$5(b, loose);\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n};\nvar compareBuild_1 = compareBuild$2;\n\nconst compareBuild$1 = compareBuild_1;\nconst sort = (list, loose) => list.sort((a, b) => compareBuild$1(a, b, loose));\nvar sort_1 = sort;\n\nconst compareBuild = compareBuild_1;\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));\nvar rsort_1 = rsort;\n\nconst compare$6 = compare_1;\nconst gt$3 = (a, b, loose) => compare$6(a, b, loose) > 0;\nvar gt_1 = gt$3;\n\nconst compare$5 = compare_1;\nconst lt$2 = (a, b, loose) => compare$5(a, b, loose) < 0;\nvar lt_1 = lt$2;\n\nconst compare$4 = compare_1;\nconst neq$1 = (a, b, loose) => compare$4(a, b, loose) !== 0;\nvar neq_1 = neq$1;\n\nconst compare$3 = compare_1;\nconst gte$2 = (a, b, loose) => compare$3(a, b, loose) >= 0;\nvar gte_1 = gte$2;\n\nconst compare$2 = compare_1;\nconst lte$2 = (a, b, loose) => compare$2(a, b, loose) <= 0;\nvar lte_1 = lte$2;\n\nconst eq = eq_1;\nconst neq = neq_1;\nconst gt$2 = gt_1;\nconst gte$1 = gte_1;\nconst lt$1 = lt_1;\nconst lte$1 = lte_1;\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version;\n }\n if (typeof b === 'object') {\n b = b.version;\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version;\n }\n if (typeof b === 'object') {\n b = b.version;\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt$2(a, b, loose)\n\n case '>=':\n return gte$1(a, b, loose)\n\n case '<':\n return lt$1(a, b, loose)\n\n case '<=':\n return lte$1(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n};\nvar cmp_1 = cmp;\n\nconst SemVer$4 = semver$2;\nconst parse = parse_1;\nconst { re, t } = re$3.exports;\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer$4) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version);\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {};\n\n let match = null;\n if (!options.rtl) {\n match = version.match(re[t.COERCE]);\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n let next;\n while ((next = re[t.COERCERTL].exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next;\n }\n re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length;\n }\n // leave it in a clean state\n re[t.COERCERTL].lastIndex = -1;\n }\n\n if (match === null) {\n return null\n }\n\n return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options)\n};\nvar coerce_1 = coerce;\n\nvar iterator;\nvar hasRequiredIterator;\n\nfunction requireIterator () {\n\tif (hasRequiredIterator) return iterator;\n\thasRequiredIterator = 1;\n\titerator = function (Yallist) {\n\t Yallist.prototype[Symbol.iterator] = function* () {\n\t for (let walker = this.head; walker; walker = walker.next) {\n\t yield walker.value;\n\t }\n\t };\n\t};\n\treturn iterator;\n}\n\nvar yallist;\nvar hasRequiredYallist;\n\nfunction requireYallist () {\n\tif (hasRequiredYallist) return yallist;\n\thasRequiredYallist = 1;\n\tyallist = Yallist;\n\n\tYallist.Node = Node;\n\tYallist.create = Yallist;\n\n\tfunction Yallist (list) {\n\t var self = this;\n\t if (!(self instanceof Yallist)) {\n\t self = new Yallist();\n\t }\n\n\t self.tail = null;\n\t self.head = null;\n\t self.length = 0;\n\n\t if (list && typeof list.forEach === 'function') {\n\t list.forEach(function (item) {\n\t self.push(item);\n\t });\n\t } else if (arguments.length > 0) {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t self.push(arguments[i]);\n\t }\n\t }\n\n\t return self\n\t}\n\n\tYallist.prototype.removeNode = function (node) {\n\t if (node.list !== this) {\n\t throw new Error('removing node which does not belong to this list')\n\t }\n\n\t var next = node.next;\n\t var prev = node.prev;\n\n\t if (next) {\n\t next.prev = prev;\n\t }\n\n\t if (prev) {\n\t prev.next = next;\n\t }\n\n\t if (node === this.head) {\n\t this.head = next;\n\t }\n\t if (node === this.tail) {\n\t this.tail = prev;\n\t }\n\n\t node.list.length--;\n\t node.next = null;\n\t node.prev = null;\n\t node.list = null;\n\n\t return next\n\t};\n\n\tYallist.prototype.unshiftNode = function (node) {\n\t if (node === this.head) {\n\t return\n\t }\n\n\t if (node.list) {\n\t node.list.removeNode(node);\n\t }\n\n\t var head = this.head;\n\t node.list = this;\n\t node.next = head;\n\t if (head) {\n\t head.prev = node;\n\t }\n\n\t this.head = node;\n\t if (!this.tail) {\n\t this.tail = node;\n\t }\n\t this.length++;\n\t};\n\n\tYallist.prototype.pushNode = function (node) {\n\t if (node === this.tail) {\n\t return\n\t }\n\n\t if (node.list) {\n\t node.list.removeNode(node);\n\t }\n\n\t var tail = this.tail;\n\t node.list = this;\n\t node.prev = tail;\n\t if (tail) {\n\t tail.next = node;\n\t }\n\n\t this.tail = node;\n\t if (!this.head) {\n\t this.head = node;\n\t }\n\t this.length++;\n\t};\n\n\tYallist.prototype.push = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t push(this, arguments[i]);\n\t }\n\t return this.length\n\t};\n\n\tYallist.prototype.unshift = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t unshift(this, arguments[i]);\n\t }\n\t return this.length\n\t};\n\n\tYallist.prototype.pop = function () {\n\t if (!this.tail) {\n\t return undefined\n\t }\n\n\t var res = this.tail.value;\n\t this.tail = this.tail.prev;\n\t if (this.tail) {\n\t this.tail.next = null;\n\t } else {\n\t this.head = null;\n\t }\n\t this.length--;\n\t return res\n\t};\n\n\tYallist.prototype.shift = function () {\n\t if (!this.head) {\n\t return undefined\n\t }\n\n\t var res = this.head.value;\n\t this.head = this.head.next;\n\t if (this.head) {\n\t this.head.prev = null;\n\t } else {\n\t this.tail = null;\n\t }\n\t this.length--;\n\t return res\n\t};\n\n\tYallist.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this;\n\t for (var walker = this.head, i = 0; walker !== null; i++) {\n\t fn.call(thisp, walker.value, i, this);\n\t walker = walker.next;\n\t }\n\t};\n\n\tYallist.prototype.forEachReverse = function (fn, thisp) {\n\t thisp = thisp || this;\n\t for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n\t fn.call(thisp, walker.value, i, this);\n\t walker = walker.prev;\n\t }\n\t};\n\n\tYallist.prototype.get = function (n) {\n\t for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.next;\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t};\n\n\tYallist.prototype.getReverse = function (n) {\n\t for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.prev;\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t};\n\n\tYallist.prototype.map = function (fn, thisp) {\n\t thisp = thisp || this;\n\t var res = new Yallist();\n\t for (var walker = this.head; walker !== null;) {\n\t res.push(fn.call(thisp, walker.value, this));\n\t walker = walker.next;\n\t }\n\t return res\n\t};\n\n\tYallist.prototype.mapReverse = function (fn, thisp) {\n\t thisp = thisp || this;\n\t var res = new Yallist();\n\t for (var walker = this.tail; walker !== null;) {\n\t res.push(fn.call(thisp, walker.value, this));\n\t walker = walker.prev;\n\t }\n\t return res\n\t};\n\n\tYallist.prototype.reduce = function (fn, initial) {\n\t var acc;\n\t var walker = this.head;\n\t if (arguments.length > 1) {\n\t acc = initial;\n\t } else if (this.head) {\n\t walker = this.head.next;\n\t acc = this.head.value;\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\n\t for (var i = 0; walker !== null; i++) {\n\t acc = fn(acc, walker.value, i);\n\t walker = walker.next;\n\t }\n\n\t return acc\n\t};\n\n\tYallist.prototype.reduceReverse = function (fn, initial) {\n\t var acc;\n\t var walker = this.tail;\n\t if (arguments.length > 1) {\n\t acc = initial;\n\t } else if (this.tail) {\n\t walker = this.tail.prev;\n\t acc = this.tail.value;\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\n\t for (var i = this.length - 1; walker !== null; i--) {\n\t acc = fn(acc, walker.value, i);\n\t walker = walker.prev;\n\t }\n\n\t return acc\n\t};\n\n\tYallist.prototype.toArray = function () {\n\t var arr = new Array(this.length);\n\t for (var i = 0, walker = this.head; walker !== null; i++) {\n\t arr[i] = walker.value;\n\t walker = walker.next;\n\t }\n\t return arr\n\t};\n\n\tYallist.prototype.toArrayReverse = function () {\n\t var arr = new Array(this.length);\n\t for (var i = 0, walker = this.tail; walker !== null; i++) {\n\t arr[i] = walker.value;\n\t walker = walker.prev;\n\t }\n\t return arr\n\t};\n\n\tYallist.prototype.slice = function (from, to) {\n\t to = to || this.length;\n\t if (to < 0) {\n\t to += this.length;\n\t }\n\t from = from || 0;\n\t if (from < 0) {\n\t from += this.length;\n\t }\n\t var ret = new Yallist();\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0;\n\t }\n\t if (to > this.length) {\n\t to = this.length;\n\t }\n\t for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n\t walker = walker.next;\n\t }\n\t for (; walker !== null && i < to; i++, walker = walker.next) {\n\t ret.push(walker.value);\n\t }\n\t return ret\n\t};\n\n\tYallist.prototype.sliceReverse = function (from, to) {\n\t to = to || this.length;\n\t if (to < 0) {\n\t to += this.length;\n\t }\n\t from = from || 0;\n\t if (from < 0) {\n\t from += this.length;\n\t }\n\t var ret = new Yallist();\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0;\n\t }\n\t if (to > this.length) {\n\t to = this.length;\n\t }\n\t for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n\t walker = walker.prev;\n\t }\n\t for (; walker !== null && i > from; i--, walker = walker.prev) {\n\t ret.push(walker.value);\n\t }\n\t return ret\n\t};\n\n\tYallist.prototype.splice = function (start, deleteCount, ...nodes) {\n\t if (start > this.length) {\n\t start = this.length - 1;\n\t }\n\t if (start < 0) {\n\t start = this.length + start;\n\t }\n\n\t for (var i = 0, walker = this.head; walker !== null && i < start; i++) {\n\t walker = walker.next;\n\t }\n\n\t var ret = [];\n\t for (var i = 0; walker && i < deleteCount; i++) {\n\t ret.push(walker.value);\n\t walker = this.removeNode(walker);\n\t }\n\t if (walker === null) {\n\t walker = this.tail;\n\t }\n\n\t if (walker !== this.head && walker !== this.tail) {\n\t walker = walker.prev;\n\t }\n\n\t for (var i = 0; i < nodes.length; i++) {\n\t walker = insert(this, walker, nodes[i]);\n\t }\n\t return ret;\n\t};\n\n\tYallist.prototype.reverse = function () {\n\t var head = this.head;\n\t var tail = this.tail;\n\t for (var walker = head; walker !== null; walker = walker.prev) {\n\t var p = walker.prev;\n\t walker.prev = walker.next;\n\t walker.next = p;\n\t }\n\t this.head = tail;\n\t this.tail = head;\n\t return this\n\t};\n\n\tfunction insert (self, node, value) {\n\t var inserted = node === self.head ?\n\t new Node(value, null, node, self) :\n\t new Node(value, node, node.next, self);\n\n\t if (inserted.next === null) {\n\t self.tail = inserted;\n\t }\n\t if (inserted.prev === null) {\n\t self.head = inserted;\n\t }\n\n\t self.length++;\n\n\t return inserted\n\t}\n\n\tfunction push (self, item) {\n\t self.tail = new Node(item, self.tail, null, self);\n\t if (!self.head) {\n\t self.head = self.tail;\n\t }\n\t self.length++;\n\t}\n\n\tfunction unshift (self, item) {\n\t self.head = new Node(item, null, self.head, self);\n\t if (!self.tail) {\n\t self.tail = self.head;\n\t }\n\t self.length++;\n\t}\n\n\tfunction Node (value, prev, next, list) {\n\t if (!(this instanceof Node)) {\n\t return new Node(value, prev, next, list)\n\t }\n\n\t this.list = list;\n\t this.value = value;\n\n\t if (prev) {\n\t prev.next = this;\n\t this.prev = prev;\n\t } else {\n\t this.prev = null;\n\t }\n\n\t if (next) {\n\t next.prev = this;\n\t this.next = next;\n\t } else {\n\t this.next = null;\n\t }\n\t}\n\n\ttry {\n\t // add if support for Symbol.iterator is present\n\t requireIterator()(Yallist);\n\t} catch (er) {}\n\treturn yallist;\n}\n\nvar lruCache;\nvar hasRequiredLruCache;\n\nfunction requireLruCache () {\n\tif (hasRequiredLruCache) return lruCache;\n\thasRequiredLruCache = 1;\n\n\t// A linked list to keep track of recently-used-ness\n\tconst Yallist = requireYallist();\n\n\tconst MAX = Symbol('max');\n\tconst LENGTH = Symbol('length');\n\tconst LENGTH_CALCULATOR = Symbol('lengthCalculator');\n\tconst ALLOW_STALE = Symbol('allowStale');\n\tconst MAX_AGE = Symbol('maxAge');\n\tconst DISPOSE = Symbol('dispose');\n\tconst NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet');\n\tconst LRU_LIST = Symbol('lruList');\n\tconst CACHE = Symbol('cache');\n\tconst UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet');\n\n\tconst naiveLength = () => 1;\n\n\t// lruList is a yallist where the head is the youngest\n\t// item, and the tail is the oldest. the list contains the Hit\n\t// objects as the entries.\n\t// Each Hit object has a reference to its Yallist.Node. This\n\t// never changes.\n\t//\n\t// cache is a Map (or PseudoMap) that matches the keys to\n\t// the Yallist.Node object.\n\tclass LRUCache {\n\t constructor (options) {\n\t if (typeof options === 'number')\n\t options = { max: options };\n\n\t if (!options)\n\t options = {};\n\n\t if (options.max && (typeof options.max !== 'number' || options.max < 0))\n\t throw new TypeError('max must be a non-negative number')\n\t // Kind of weird to have a default max of Infinity, but oh well.\n\t this[MAX] = options.max || Infinity;\n\n\t const lc = options.length || naiveLength;\n\t this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc;\n\t this[ALLOW_STALE] = options.stale || false;\n\t if (options.maxAge && typeof options.maxAge !== 'number')\n\t throw new TypeError('maxAge must be a number')\n\t this[MAX_AGE] = options.maxAge || 0;\n\t this[DISPOSE] = options.dispose;\n\t this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false;\n\t this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false;\n\t this.reset();\n\t }\n\n\t // resize the cache when the max changes.\n\t set max (mL) {\n\t if (typeof mL !== 'number' || mL < 0)\n\t throw new TypeError('max must be a non-negative number')\n\n\t this[MAX] = mL || Infinity;\n\t trim(this);\n\t }\n\t get max () {\n\t return this[MAX]\n\t }\n\n\t set allowStale (allowStale) {\n\t this[ALLOW_STALE] = !!allowStale;\n\t }\n\t get allowStale () {\n\t return this[ALLOW_STALE]\n\t }\n\n\t set maxAge (mA) {\n\t if (typeof mA !== 'number')\n\t throw new TypeError('maxAge must be a non-negative number')\n\n\t this[MAX_AGE] = mA;\n\t trim(this);\n\t }\n\t get maxAge () {\n\t return this[MAX_AGE]\n\t }\n\n\t // resize the cache when the lengthCalculator changes.\n\t set lengthCalculator (lC) {\n\t if (typeof lC !== 'function')\n\t lC = naiveLength;\n\n\t if (lC !== this[LENGTH_CALCULATOR]) {\n\t this[LENGTH_CALCULATOR] = lC;\n\t this[LENGTH] = 0;\n\t this[LRU_LIST].forEach(hit => {\n\t hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key);\n\t this[LENGTH] += hit.length;\n\t });\n\t }\n\t trim(this);\n\t }\n\t get lengthCalculator () { return this[LENGTH_CALCULATOR] }\n\n\t get length () { return this[LENGTH] }\n\t get itemCount () { return this[LRU_LIST].length }\n\n\t rforEach (fn, thisp) {\n\t thisp = thisp || this;\n\t for (let walker = this[LRU_LIST].tail; walker !== null;) {\n\t const prev = walker.prev;\n\t forEachStep(this, fn, walker, thisp);\n\t walker = prev;\n\t }\n\t }\n\n\t forEach (fn, thisp) {\n\t thisp = thisp || this;\n\t for (let walker = this[LRU_LIST].head; walker !== null;) {\n\t const next = walker.next;\n\t forEachStep(this, fn, walker, thisp);\n\t walker = next;\n\t }\n\t }\n\n\t keys () {\n\t return this[LRU_LIST].toArray().map(k => k.key)\n\t }\n\n\t values () {\n\t return this[LRU_LIST].toArray().map(k => k.value)\n\t }\n\n\t reset () {\n\t if (this[DISPOSE] &&\n\t this[LRU_LIST] &&\n\t this[LRU_LIST].length) {\n\t this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value));\n\t }\n\n\t this[CACHE] = new Map(); // hash of items by key\n\t this[LRU_LIST] = new Yallist(); // list of items in order of use recency\n\t this[LENGTH] = 0; // length of items in the list\n\t }\n\n\t dump () {\n\t return this[LRU_LIST].map(hit =>\n\t isStale(this, hit) ? false : {\n\t k: hit.key,\n\t v: hit.value,\n\t e: hit.now + (hit.maxAge || 0)\n\t }).toArray().filter(h => h)\n\t }\n\n\t dumpLru () {\n\t return this[LRU_LIST]\n\t }\n\n\t set (key, value, maxAge) {\n\t maxAge = maxAge || this[MAX_AGE];\n\n\t if (maxAge && typeof maxAge !== 'number')\n\t throw new TypeError('maxAge must be a number')\n\n\t const now = maxAge ? Date.now() : 0;\n\t const len = this[LENGTH_CALCULATOR](value, key);\n\n\t if (this[CACHE].has(key)) {\n\t if (len > this[MAX]) {\n\t del(this, this[CACHE].get(key));\n\t return false\n\t }\n\n\t const node = this[CACHE].get(key);\n\t const item = node.value;\n\n\t // dispose of the old one before overwriting\n\t // split out into 2 ifs for better coverage tracking\n\t if (this[DISPOSE]) {\n\t if (!this[NO_DISPOSE_ON_SET])\n\t this[DISPOSE](key, item.value);\n\t }\n\n\t item.now = now;\n\t item.maxAge = maxAge;\n\t item.value = value;\n\t this[LENGTH] += len - item.length;\n\t item.length = len;\n\t this.get(key);\n\t trim(this);\n\t return true\n\t }\n\n\t const hit = new Entry(key, value, len, now, maxAge);\n\n\t // oversized objects fall out of cache automatically.\n\t if (hit.length > this[MAX]) {\n\t if (this[DISPOSE])\n\t this[DISPOSE](key, value);\n\n\t return false\n\t }\n\n\t this[LENGTH] += hit.length;\n\t this[LRU_LIST].unshift(hit);\n\t this[CACHE].set(key, this[LRU_LIST].head);\n\t trim(this);\n\t return true\n\t }\n\n\t has (key) {\n\t if (!this[CACHE].has(key)) return false\n\t const hit = this[CACHE].get(key).value;\n\t return !isStale(this, hit)\n\t }\n\n\t get (key) {\n\t return get(this, key, true)\n\t }\n\n\t peek (key) {\n\t return get(this, key, false)\n\t }\n\n\t pop () {\n\t const node = this[LRU_LIST].tail;\n\t if (!node)\n\t return null\n\n\t del(this, node);\n\t return node.value\n\t }\n\n\t del (key) {\n\t del(this, this[CACHE].get(key));\n\t }\n\n\t load (arr) {\n\t // reset the cache\n\t this.reset();\n\n\t const now = Date.now();\n\t // A previous serialized cache has the most recent items first\n\t for (let l = arr.length - 1; l >= 0; l--) {\n\t const hit = arr[l];\n\t const expiresAt = hit.e || 0;\n\t if (expiresAt === 0)\n\t // the item was created without expiration in a non aged cache\n\t this.set(hit.k, hit.v);\n\t else {\n\t const maxAge = expiresAt - now;\n\t // dont add already expired items\n\t if (maxAge > 0) {\n\t this.set(hit.k, hit.v, maxAge);\n\t }\n\t }\n\t }\n\t }\n\n\t prune () {\n\t this[CACHE].forEach((value, key) => get(this, key, false));\n\t }\n\t}\n\n\tconst get = (self, key, doUse) => {\n\t const node = self[CACHE].get(key);\n\t if (node) {\n\t const hit = node.value;\n\t if (isStale(self, hit)) {\n\t del(self, node);\n\t if (!self[ALLOW_STALE])\n\t return undefined\n\t } else {\n\t if (doUse) {\n\t if (self[UPDATE_AGE_ON_GET])\n\t node.value.now = Date.now();\n\t self[LRU_LIST].unshiftNode(node);\n\t }\n\t }\n\t return hit.value\n\t }\n\t};\n\n\tconst isStale = (self, hit) => {\n\t if (!hit || (!hit.maxAge && !self[MAX_AGE]))\n\t return false\n\n\t const diff = Date.now() - hit.now;\n\t return hit.maxAge ? diff > hit.maxAge\n\t : self[MAX_AGE] && (diff > self[MAX_AGE])\n\t};\n\n\tconst trim = self => {\n\t if (self[LENGTH] > self[MAX]) {\n\t for (let walker = self[LRU_LIST].tail;\n\t self[LENGTH] > self[MAX] && walker !== null;) {\n\t // We know that we're about to delete this one, and also\n\t // what the next least recently used key will be, so just\n\t // go ahead and set it now.\n\t const prev = walker.prev;\n\t del(self, walker);\n\t walker = prev;\n\t }\n\t }\n\t};\n\n\tconst del = (self, node) => {\n\t if (node) {\n\t const hit = node.value;\n\t if (self[DISPOSE])\n\t self[DISPOSE](hit.key, hit.value);\n\n\t self[LENGTH] -= hit.length;\n\t self[CACHE].delete(hit.key);\n\t self[LRU_LIST].removeNode(node);\n\t }\n\t};\n\n\tclass Entry {\n\t constructor (key, value, length, now, maxAge) {\n\t this.key = key;\n\t this.value = value;\n\t this.length = length;\n\t this.now = now;\n\t this.maxAge = maxAge || 0;\n\t }\n\t}\n\n\tconst forEachStep = (self, fn, node, thisp) => {\n\t let hit = node.value;\n\t if (isStale(self, hit)) {\n\t del(self, node);\n\t if (!self[ALLOW_STALE])\n\t hit = undefined;\n\t }\n\t if (hit)\n\t fn.call(thisp, hit.value, hit.key, self);\n\t};\n\n\tlruCache = LRUCache;\n\treturn lruCache;\n}\n\nvar range;\nvar hasRequiredRange;\n\nfunction requireRange () {\n\tif (hasRequiredRange) return range;\n\thasRequiredRange = 1;\n\t// hoisted class for cyclic dependency\n\tclass Range {\n\t constructor (range, options) {\n\t options = parseOptions(options);\n\n\t if (range instanceof Range) {\n\t if (\n\t range.loose === !!options.loose &&\n\t range.includePrerelease === !!options.includePrerelease\n\t ) {\n\t return range\n\t } else {\n\t return new Range(range.raw, options)\n\t }\n\t }\n\n\t if (range instanceof Comparator) {\n\t // just put it in the set and return\n\t this.raw = range.value;\n\t this.set = [[range]];\n\t this.format();\n\t return this\n\t }\n\n\t this.options = options;\n\t this.loose = !!options.loose;\n\t this.includePrerelease = !!options.includePrerelease;\n\n\t // First, split based on boolean or ||\n\t this.raw = range;\n\t this.set = range\n\t .split('||')\n\t // map the range to a 2d array of comparators\n\t .map(r => this.parseRange(r.trim()))\n\t // throw out any comparator lists that are empty\n\t // this generally means that it was not a valid range, which is allowed\n\t // in loose mode, but will still throw if the WHOLE range is invalid.\n\t .filter(c => c.length);\n\n\t if (!this.set.length) {\n\t throw new TypeError(`Invalid SemVer Range: ${range}`)\n\t }\n\n\t // if we have any that are not the null set, throw out null sets.\n\t if (this.set.length > 1) {\n\t // keep the first one, in case they're all null sets\n\t const first = this.set[0];\n\t this.set = this.set.filter(c => !isNullSet(c[0]));\n\t if (this.set.length === 0) {\n\t this.set = [first];\n\t } else if (this.set.length > 1) {\n\t // if we have any that are *, then the range is just *\n\t for (const c of this.set) {\n\t if (c.length === 1 && isAny(c[0])) {\n\t this.set = [c];\n\t break\n\t }\n\t }\n\t }\n\t }\n\n\t this.format();\n\t }\n\n\t format () {\n\t this.range = this.set\n\t .map((comps) => {\n\t return comps.join(' ').trim()\n\t })\n\t .join('||')\n\t .trim();\n\t return this.range\n\t }\n\n\t toString () {\n\t return this.range\n\t }\n\n\t parseRange (range) {\n\t range = range.trim();\n\n\t // memoize range parsing for performance.\n\t // this is a very hot path, and fully deterministic.\n\t const memoOpts = Object.keys(this.options).join(',');\n\t const memoKey = `parseRange:${memoOpts}:${range}`;\n\t const cached = cache.get(memoKey);\n\t if (cached) {\n\t return cached\n\t }\n\n\t const loose = this.options.loose;\n\t // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n\t const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];\n\t range = range.replace(hr, hyphenReplace(this.options.includePrerelease));\n\t debug('hyphen replace', range);\n\t // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n\t range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);\n\t debug('comparator trim', range);\n\n\t // `~ 1.2.3` => `~1.2.3`\n\t range = range.replace(re[t.TILDETRIM], tildeTrimReplace);\n\n\t // `^ 1.2.3` => `^1.2.3`\n\t range = range.replace(re[t.CARETTRIM], caretTrimReplace);\n\n\t // normalize spaces\n\t range = range.split(/\\s+/).join(' ');\n\n\t // At this point, the range is completely trimmed and\n\t // ready to be split into comparators.\n\n\t let rangeList = range\n\t .split(' ')\n\t .map(comp => parseComparator(comp, this.options))\n\t .join(' ')\n\t .split(/\\s+/)\n\t // >=0.0.0 is equivalent to *\n\t .map(comp => replaceGTE0(comp, this.options));\n\n\t if (loose) {\n\t // in loose mode, throw out any that are not valid comparators\n\t rangeList = rangeList.filter(comp => {\n\t debug('loose invalid filter', comp, this.options);\n\t return !!comp.match(re[t.COMPARATORLOOSE])\n\t });\n\t }\n\t debug('range list', rangeList);\n\n\t // if any comparators are the null set, then replace with JUST null set\n\t // if more than one comparator, remove any * comparators\n\t // also, don't include the same comparator more than once\n\t const rangeMap = new Map();\n\t const comparators = rangeList.map(comp => new Comparator(comp, this.options));\n\t for (const comp of comparators) {\n\t if (isNullSet(comp)) {\n\t return [comp]\n\t }\n\t rangeMap.set(comp.value, comp);\n\t }\n\t if (rangeMap.size > 1 && rangeMap.has('')) {\n\t rangeMap.delete('');\n\t }\n\n\t const result = [...rangeMap.values()];\n\t cache.set(memoKey, result);\n\t return result\n\t }\n\n\t intersects (range, options) {\n\t if (!(range instanceof Range)) {\n\t throw new TypeError('a Range is required')\n\t }\n\n\t return this.set.some((thisComparators) => {\n\t return (\n\t isSatisfiable(thisComparators, options) &&\n\t range.set.some((rangeComparators) => {\n\t return (\n\t isSatisfiable(rangeComparators, options) &&\n\t thisComparators.every((thisComparator) => {\n\t return rangeComparators.every((rangeComparator) => {\n\t return thisComparator.intersects(rangeComparator, options)\n\t })\n\t })\n\t )\n\t })\n\t )\n\t })\n\t }\n\n\t // if ANY of the sets match ALL of its comparators, then pass\n\t test (version) {\n\t if (!version) {\n\t return false\n\t }\n\n\t if (typeof version === 'string') {\n\t try {\n\t version = new SemVer(version, this.options);\n\t } catch (er) {\n\t return false\n\t }\n\t }\n\n\t for (let i = 0; i < this.set.length; i++) {\n\t if (testSet(this.set[i], version, this.options)) {\n\t return true\n\t }\n\t }\n\t return false\n\t }\n\t}\n\trange = Range;\n\n\tconst LRU = requireLruCache();\n\tconst cache = new LRU({ max: 1000 });\n\n\tconst parseOptions = parseOptions_1;\n\tconst Comparator = requireComparator();\n\tconst debug = debug_1;\n\tconst SemVer = semver$2;\n\tconst {\n\t re,\n\t t,\n\t comparatorTrimReplace,\n\t tildeTrimReplace,\n\t caretTrimReplace,\n\t} = re$3.exports;\n\n\tconst isNullSet = c => c.value === '<0.0.0-0';\n\tconst isAny = c => c.value === '';\n\n\t// take a set of comparators and determine whether there\n\t// exists a version which can satisfy it\n\tconst isSatisfiable = (comparators, options) => {\n\t let result = true;\n\t const remainingComparators = comparators.slice();\n\t let testComparator = remainingComparators.pop();\n\n\t while (result && remainingComparators.length) {\n\t result = remainingComparators.every((otherComparator) => {\n\t return testComparator.intersects(otherComparator, options)\n\t });\n\n\t testComparator = remainingComparators.pop();\n\t }\n\n\t return result\n\t};\n\n\t// comprised of xranges, tildes, stars, and gtlt's at this point.\n\t// already replaced the hyphen ranges\n\t// turn into a set of JUST comparators.\n\tconst parseComparator = (comp, options) => {\n\t debug('comp', comp, options);\n\t comp = replaceCarets(comp, options);\n\t debug('caret', comp);\n\t comp = replaceTildes(comp, options);\n\t debug('tildes', comp);\n\t comp = replaceXRanges(comp, options);\n\t debug('xrange', comp);\n\t comp = replaceStars(comp, options);\n\t debug('stars', comp);\n\t return comp\n\t};\n\n\tconst isX = id => !id || id.toLowerCase() === 'x' || id === '*';\n\n\t// ~, ~> --> * (any, kinda silly)\n\t// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n\t// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n\t// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n\t// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n\t// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n\tconst replaceTildes = (comp, options) =>\n\t comp.trim().split(/\\s+/).map((c) => {\n\t return replaceTilde(c, options)\n\t }).join(' ');\n\n\tconst replaceTilde = (comp, options) => {\n\t const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];\n\t return comp.replace(r, (_, M, m, p, pr) => {\n\t debug('tilde', comp, _, M, m, p, pr);\n\t let ret;\n\n\t if (isX(M)) {\n\t ret = '';\n\t } else if (isX(m)) {\n\t ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;\n\t } else if (isX(p)) {\n\t // ~1.2 == >=1.2.0 <1.3.0-0\n\t ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;\n\t } else if (pr) {\n\t debug('replaceTilde pr', pr);\n\t ret = `>=${M}.${m}.${p}-${pr\n\t } <${M}.${+m + 1}.0-0`;\n\t } else {\n\t // ~1.2.3 == >=1.2.3 <1.3.0-0\n\t ret = `>=${M}.${m}.${p\n\t } <${M}.${+m + 1}.0-0`;\n\t }\n\n\t debug('tilde return', ret);\n\t return ret\n\t })\n\t};\n\n\t// ^ --> * (any, kinda silly)\n\t// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n\t// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n\t// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n\t// ^1.2.3 --> >=1.2.3 <2.0.0-0\n\t// ^1.2.0 --> >=1.2.0 <2.0.0-0\n\tconst replaceCarets = (comp, options) =>\n\t comp.trim().split(/\\s+/).map((c) => {\n\t return replaceCaret(c, options)\n\t }).join(' ');\n\n\tconst replaceCaret = (comp, options) => {\n\t debug('caret', comp, options);\n\t const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET];\n\t const z = options.includePrerelease ? '-0' : '';\n\t return comp.replace(r, (_, M, m, p, pr) => {\n\t debug('caret', comp, _, M, m, p, pr);\n\t let ret;\n\n\t if (isX(M)) {\n\t ret = '';\n\t } else if (isX(m)) {\n\t ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;\n\t } else if (isX(p)) {\n\t if (M === '0') {\n\t ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;\n\t } else {\n\t ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;\n\t }\n\t } else if (pr) {\n\t debug('replaceCaret pr', pr);\n\t if (M === '0') {\n\t if (m === '0') {\n\t ret = `>=${M}.${m}.${p}-${pr\n\t } <${M}.${m}.${+p + 1}-0`;\n\t } else {\n\t ret = `>=${M}.${m}.${p}-${pr\n\t } <${M}.${+m + 1}.0-0`;\n\t }\n\t } else {\n\t ret = `>=${M}.${m}.${p}-${pr\n\t } <${+M + 1}.0.0-0`;\n\t }\n\t } else {\n\t debug('no pr');\n\t if (M === '0') {\n\t if (m === '0') {\n\t ret = `>=${M}.${m}.${p\n\t }${z} <${M}.${m}.${+p + 1}-0`;\n\t } else {\n\t ret = `>=${M}.${m}.${p\n\t }${z} <${M}.${+m + 1}.0-0`;\n\t }\n\t } else {\n\t ret = `>=${M}.${m}.${p\n\t } <${+M + 1}.0.0-0`;\n\t }\n\t }\n\n\t debug('caret return', ret);\n\t return ret\n\t })\n\t};\n\n\tconst replaceXRanges = (comp, options) => {\n\t debug('replaceXRanges', comp, options);\n\t return comp.split(/\\s+/).map((c) => {\n\t return replaceXRange(c, options)\n\t }).join(' ')\n\t};\n\n\tconst replaceXRange = (comp, options) => {\n\t comp = comp.trim();\n\t const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];\n\t return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n\t debug('xRange', comp, ret, gtlt, M, m, p, pr);\n\t const xM = isX(M);\n\t const xm = xM || isX(m);\n\t const xp = xm || isX(p);\n\t const anyX = xp;\n\n\t if (gtlt === '=' && anyX) {\n\t gtlt = '';\n\t }\n\n\t // if we're including prereleases in the match, then we need\n\t // to fix this to -0, the lowest possible prerelease value\n\t pr = options.includePrerelease ? '-0' : '';\n\n\t if (xM) {\n\t if (gtlt === '>' || gtlt === '<') {\n\t // nothing is allowed\n\t ret = '<0.0.0-0';\n\t } else {\n\t // nothing is forbidden\n\t ret = '*';\n\t }\n\t } else if (gtlt && anyX) {\n\t // we know patch is an x, because we have any x at all.\n\t // replace X with 0\n\t if (xm) {\n\t m = 0;\n\t }\n\t p = 0;\n\n\t if (gtlt === '>') {\n\t // >1 => >=2.0.0\n\t // >1.2 => >=1.3.0\n\t gtlt = '>=';\n\t if (xm) {\n\t M = +M + 1;\n\t m = 0;\n\t p = 0;\n\t } else {\n\t m = +m + 1;\n\t p = 0;\n\t }\n\t } else if (gtlt === '<=') {\n\t // <=0.7.x is actually <0.8.0, since any 0.7.x should\n\t // pass. Similarly, <=7.x is actually <8.0.0, etc.\n\t gtlt = '<';\n\t if (xm) {\n\t M = +M + 1;\n\t } else {\n\t m = +m + 1;\n\t }\n\t }\n\n\t if (gtlt === '<') {\n\t pr = '-0';\n\t }\n\n\t ret = `${gtlt + M}.${m}.${p}${pr}`;\n\t } else if (xm) {\n\t ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;\n\t } else if (xp) {\n\t ret = `>=${M}.${m}.0${pr\n\t } <${M}.${+m + 1}.0-0`;\n\t }\n\n\t debug('xRange return', ret);\n\n\t return ret\n\t })\n\t};\n\n\t// Because * is AND-ed with everything else in the comparator,\n\t// and '' means \"any version\", just remove the *s entirely.\n\tconst replaceStars = (comp, options) => {\n\t debug('replaceStars', comp, options);\n\t // Looseness is ignored here. star is always as loose as it gets!\n\t return comp.trim().replace(re[t.STAR], '')\n\t};\n\n\tconst replaceGTE0 = (comp, options) => {\n\t debug('replaceGTE0', comp, options);\n\t return comp.trim()\n\t .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n\t};\n\n\t// This function is passed to string.replace(re[t.HYPHENRANGE])\n\t// M, m, patch, prerelease, build\n\t// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n\t// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n\t// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n\tconst hyphenReplace = incPr => ($0,\n\t from, fM, fm, fp, fpr, fb,\n\t to, tM, tm, tp, tpr, tb) => {\n\t if (isX(fM)) {\n\t from = '';\n\t } else if (isX(fm)) {\n\t from = `>=${fM}.0.0${incPr ? '-0' : ''}`;\n\t } else if (isX(fp)) {\n\t from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`;\n\t } else if (fpr) {\n\t from = `>=${from}`;\n\t } else {\n\t from = `>=${from}${incPr ? '-0' : ''}`;\n\t }\n\n\t if (isX(tM)) {\n\t to = '';\n\t } else if (isX(tm)) {\n\t to = `<${+tM + 1}.0.0-0`;\n\t } else if (isX(tp)) {\n\t to = `<${tM}.${+tm + 1}.0-0`;\n\t } else if (tpr) {\n\t to = `<=${tM}.${tm}.${tp}-${tpr}`;\n\t } else if (incPr) {\n\t to = `<${tM}.${tm}.${+tp + 1}-0`;\n\t } else {\n\t to = `<=${to}`;\n\t }\n\n\t return (`${from} ${to}`).trim()\n\t};\n\n\tconst testSet = (set, version, options) => {\n\t for (let i = 0; i < set.length; i++) {\n\t if (!set[i].test(version)) {\n\t return false\n\t }\n\t }\n\n\t if (version.prerelease.length && !options.includePrerelease) {\n\t // Find the set of versions that are allowed to have prereleases\n\t // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n\t // That should allow `1.2.3-pr.2` to pass.\n\t // However, `1.2.4-alpha.notready` should NOT be allowed,\n\t // even though it's within the range set by the comparators.\n\t for (let i = 0; i < set.length; i++) {\n\t debug(set[i].semver);\n\t if (set[i].semver === Comparator.ANY) {\n\t continue\n\t }\n\n\t if (set[i].semver.prerelease.length > 0) {\n\t const allowed = set[i].semver;\n\t if (allowed.major === version.major &&\n\t allowed.minor === version.minor &&\n\t allowed.patch === version.patch) {\n\t return true\n\t }\n\t }\n\t }\n\n\t // Version has a -pre, but it's not one of the ones we like.\n\t return false\n\t }\n\n\t return true\n\t};\n\treturn range;\n}\n\nvar comparator;\nvar hasRequiredComparator;\n\nfunction requireComparator () {\n\tif (hasRequiredComparator) return comparator;\n\thasRequiredComparator = 1;\n\tconst ANY = Symbol('SemVer ANY');\n\t// hoisted class for cyclic dependency\n\tclass Comparator {\n\t static get ANY () {\n\t return ANY\n\t }\n\n\t constructor (comp, options) {\n\t options = parseOptions(options);\n\n\t if (comp instanceof Comparator) {\n\t if (comp.loose === !!options.loose) {\n\t return comp\n\t } else {\n\t comp = comp.value;\n\t }\n\t }\n\n\t debug('comparator', comp, options);\n\t this.options = options;\n\t this.loose = !!options.loose;\n\t this.parse(comp);\n\n\t if (this.semver === ANY) {\n\t this.value = '';\n\t } else {\n\t this.value = this.operator + this.semver.version;\n\t }\n\n\t debug('comp', this);\n\t }\n\n\t parse (comp) {\n\t const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];\n\t const m = comp.match(r);\n\n\t if (!m) {\n\t throw new TypeError(`Invalid comparator: ${comp}`)\n\t }\n\n\t this.operator = m[1] !== undefined ? m[1] : '';\n\t if (this.operator === '=') {\n\t this.operator = '';\n\t }\n\n\t // if it literally is just '>' or '' then allow anything.\n\t if (!m[2]) {\n\t this.semver = ANY;\n\t } else {\n\t this.semver = new SemVer(m[2], this.options.loose);\n\t }\n\t }\n\n\t toString () {\n\t return this.value\n\t }\n\n\t test (version) {\n\t debug('Comparator.test', version, this.options.loose);\n\n\t if (this.semver === ANY || version === ANY) {\n\t return true\n\t }\n\n\t if (typeof version === 'string') {\n\t try {\n\t version = new SemVer(version, this.options);\n\t } catch (er) {\n\t return false\n\t }\n\t }\n\n\t return cmp(version, this.operator, this.semver, this.options)\n\t }\n\n\t intersects (comp, options) {\n\t if (!(comp instanceof Comparator)) {\n\t throw new TypeError('a Comparator is required')\n\t }\n\n\t if (!options || typeof options !== 'object') {\n\t options = {\n\t loose: !!options,\n\t includePrerelease: false,\n\t };\n\t }\n\n\t if (this.operator === '') {\n\t if (this.value === '') {\n\t return true\n\t }\n\t return new Range(comp.value, options).test(this.value)\n\t } else if (comp.operator === '') {\n\t if (comp.value === '') {\n\t return true\n\t }\n\t return new Range(this.value, options).test(comp.semver)\n\t }\n\n\t const sameDirectionIncreasing =\n\t (this.operator === '>=' || this.operator === '>') &&\n\t (comp.operator === '>=' || comp.operator === '>');\n\t const sameDirectionDecreasing =\n\t (this.operator === '<=' || this.operator === '<') &&\n\t (comp.operator === '<=' || comp.operator === '<');\n\t const sameSemVer = this.semver.version === comp.semver.version;\n\t const differentDirectionsInclusive =\n\t (this.operator === '>=' || this.operator === '<=') &&\n\t (comp.operator === '>=' || comp.operator === '<=');\n\t const oppositeDirectionsLessThan =\n\t cmp(this.semver, '<', comp.semver, options) &&\n\t (this.operator === '>=' || this.operator === '>') &&\n\t (comp.operator === '<=' || comp.operator === '<');\n\t const oppositeDirectionsGreaterThan =\n\t cmp(this.semver, '>', comp.semver, options) &&\n\t (this.operator === '<=' || this.operator === '<') &&\n\t (comp.operator === '>=' || comp.operator === '>');\n\n\t return (\n\t sameDirectionIncreasing ||\n\t sameDirectionDecreasing ||\n\t (sameSemVer && differentDirectionsInclusive) ||\n\t oppositeDirectionsLessThan ||\n\t oppositeDirectionsGreaterThan\n\t )\n\t }\n\t}\n\n\tcomparator = Comparator;\n\n\tconst parseOptions = parseOptions_1;\n\tconst { re, t } = re$3.exports;\n\tconst cmp = cmp_1;\n\tconst debug = debug_1;\n\tconst SemVer = semver$2;\n\tconst Range = requireRange();\n\treturn comparator;\n}\n\nconst Range$8 = requireRange();\nconst satisfies$3 = (version, range, options) => {\n try {\n range = new Range$8(range, options);\n } catch (er) {\n return false\n }\n return range.test(version)\n};\nvar satisfies_1 = satisfies$3;\n\nconst Range$7 = requireRange();\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range$7(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '));\n\nvar toComparators_1 = toComparators;\n\nconst SemVer$3 = semver$2;\nconst Range$6 = requireRange();\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null;\n let maxSV = null;\n let rangeObj = null;\n try {\n rangeObj = new Range$6(range, options);\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v;\n maxSV = new SemVer$3(max, options);\n }\n }\n });\n return max\n};\nvar maxSatisfying_1 = maxSatisfying;\n\nconst SemVer$2 = semver$2;\nconst Range$5 = requireRange();\nconst minSatisfying = (versions, range, options) => {\n let min = null;\n let minSV = null;\n let rangeObj = null;\n try {\n rangeObj = new Range$5(range, options);\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v;\n minSV = new SemVer$2(min, options);\n }\n }\n });\n return min\n};\nvar minSatisfying_1 = minSatisfying;\n\nconst SemVer$1 = semver$2;\nconst Range$4 = requireRange();\nconst gt$1 = gt_1;\n\nconst minVersion = (range, loose) => {\n range = new Range$4(range, loose);\n\n let minver = new SemVer$1('0.0.0');\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer$1('0.0.0-0');\n if (range.test(minver)) {\n return minver\n }\n\n minver = null;\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i];\n\n let setMin = null;\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer$1(comparator.semver.version);\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++;\n } else {\n compver.prerelease.push(0);\n }\n compver.raw = compver.format();\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt$1(compver, setMin)) {\n setMin = compver;\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n });\n if (setMin && (!minver || gt$1(minver, setMin))) {\n minver = setMin;\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n};\nvar minVersion_1 = minVersion;\n\nconst Range$3 = requireRange();\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range$3(range, options).range || '*'\n } catch (er) {\n return null\n }\n};\nvar valid = validRange;\n\nconst SemVer = semver$2;\nconst Comparator$1 = requireComparator();\nconst { ANY: ANY$1 } = Comparator$1;\nconst Range$2 = requireRange();\nconst satisfies$2 = satisfies_1;\nconst gt = gt_1;\nconst lt = lt_1;\nconst lte = lte_1;\nconst gte = gte_1;\n\nconst outside$2 = (version, range, hilo, options) => {\n version = new SemVer(version, options);\n range = new Range$2(range, options);\n\n let gtfn, ltefn, ltfn, comp, ecomp;\n switch (hilo) {\n case '>':\n gtfn = gt;\n ltefn = lte;\n ltfn = lt;\n comp = '>';\n ecomp = '>=';\n break\n case '<':\n gtfn = lt;\n ltefn = gte;\n ltfn = gt;\n comp = '<';\n ecomp = '<=';\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies$2(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i];\n\n let high = null;\n let low = null;\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY$1) {\n comparator = new Comparator$1('>=0.0.0');\n }\n high = high || comparator;\n low = low || comparator;\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator;\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator;\n }\n });\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n};\n\nvar outside_1 = outside$2;\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside$1 = outside_1;\nconst gtr = (version, range, options) => outside$1(version, range, '>', options);\nvar gtr_1 = gtr;\n\nconst outside = outside_1;\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options);\nvar ltr_1 = ltr;\n\nconst Range$1 = requireRange();\nconst intersects = (r1, r2, options) => {\n r1 = new Range$1(r1, options);\n r2 = new Range$1(r2, options);\n return r1.intersects(r2)\n};\nvar intersects_1 = intersects;\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies$1 = satisfies_1;\nconst compare$1 = compare_1;\nvar simplify = (versions, range, options) => {\n const set = [];\n let first = null;\n let prev = null;\n const v = versions.sort((a, b) => compare$1(a, b, options));\n for (const version of v) {\n const included = satisfies$1(version, range, options);\n if (included) {\n prev = version;\n if (!first) {\n first = version;\n }\n } else {\n if (prev) {\n set.push([first, prev]);\n }\n prev = null;\n first = null;\n }\n }\n if (first) {\n set.push([first, null]);\n }\n\n const ranges = [];\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min);\n } else if (!max && min === v[0]) {\n ranges.push('*');\n } else if (!max) {\n ranges.push(`>=${min}`);\n } else if (min === v[0]) {\n ranges.push(`<=${max}`);\n } else {\n ranges.push(`${min} - ${max}`);\n }\n }\n const simplified = ranges.join(' || ');\n const original = typeof range.raw === 'string' ? range.raw : String(range);\n return simplified.length < original.length ? simplified : range\n};\n\nconst Range = requireRange();\nconst Comparator = requireComparator();\nconst { ANY } = Comparator;\nconst satisfies = satisfies_1;\nconst compare = compare_1;\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options);\n dom = new Range(dom, options);\n let sawNonNull = false;\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options);\n sawNonNull = sawNonNull || isSub !== null;\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n};\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = [new Comparator('>=0.0.0-0')];\n } else {\n sub = [new Comparator('>=0.0.0')];\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = [new Comparator('>=0.0.0')];\n }\n }\n\n const eqSet = new Set();\n let gt, lt;\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options);\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options);\n } else {\n eqSet.add(c.semver);\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp;\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options);\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower;\n let hasDomLT, hasDomGT;\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false;\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false;\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false;\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>=';\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<=';\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false;\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options);\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false;\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options);\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n};\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options);\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n};\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options);\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n};\n\nvar subset_1 = subset;\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = re$3.exports;\nvar semver$1 = {\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n SemVer: semver$2,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n parse: parse_1,\n valid: valid_1,\n clean: clean_1,\n inc: inc_1,\n diff: diff_1,\n major: major_1,\n minor: minor_1,\n patch: patch_1,\n prerelease: prerelease_1,\n compare: compare_1,\n rcompare: rcompare_1,\n compareLoose: compareLoose_1,\n compareBuild: compareBuild_1,\n sort: sort_1,\n rsort: rsort_1,\n gt: gt_1,\n lt: lt_1,\n eq: eq_1,\n neq: neq_1,\n gte: gte_1,\n lte: lte_1,\n cmp: cmp_1,\n coerce: coerce_1,\n Comparator: requireComparator(),\n Range: requireRange(),\n satisfies: satisfies_1,\n toComparators: toComparators_1,\n maxSatisfying: maxSatisfying_1,\n minSatisfying: minSatisfying_1,\n minVersion: minVersion_1,\n validRange: valid,\n outside: outside_1,\n gtr: gtr_1,\n ltr: ltr_1,\n intersects: intersects_1,\n simplifyRange: simplify,\n subset: subset_1,\n};\n\nvar semver = semver$1;\n\nvar builtins = function ({\n version = process.version,\n experimental = false\n} = {}) {\n var coreModules = [\n 'assert',\n 'buffer',\n 'child_process',\n 'cluster',\n 'console',\n 'constants',\n 'crypto',\n 'dgram',\n 'dns',\n 'domain',\n 'events',\n 'fs',\n 'http',\n 'https',\n 'module',\n 'net',\n 'os',\n 'path',\n 'punycode',\n 'querystring',\n 'readline',\n 'repl',\n 'stream',\n 'string_decoder',\n 'sys',\n 'timers',\n 'tls',\n 'tty',\n 'url',\n 'util',\n 'vm',\n 'zlib'\n ];\n\n if (semver.lt(version, '6.0.0')) coreModules.push('freelist');\n if (semver.gte(version, '1.0.0')) coreModules.push('v8');\n if (semver.gte(version, '1.1.0')) coreModules.push('process');\n if (semver.gte(version, '8.0.0')) coreModules.push('inspector');\n if (semver.gte(version, '8.1.0')) coreModules.push('async_hooks');\n if (semver.gte(version, '8.4.0')) coreModules.push('http2');\n if (semver.gte(version, '8.5.0')) coreModules.push('perf_hooks');\n if (semver.gte(version, '10.0.0')) coreModules.push('trace_events');\n\n if (\n semver.gte(version, '10.5.0') &&\n (experimental || semver.gte(version, '12.0.0'))\n ) {\n coreModules.push('worker_threads');\n }\n if (semver.gte(version, '12.16.0') && experimental) {\n coreModules.push('wasi');\n }\n \n return coreModules\n};\n\n// Manually “tree shaken” from:\n\nconst reader = {read};\n\n/**\n * @param {string} jsonPath\n * @returns {{string: string}}\n */\nfunction read(jsonPath) {\n return find(path.dirname(jsonPath))\n}\n\n/**\n * @param {string} dir\n * @returns {{string: string}}\n */\nfunction find(dir) {\n try {\n const string = fs.readFileSync(\n path.toNamespacedPath(path.join(dir, 'package.json')),\n 'utf8'\n );\n return {string}\n } catch (error) {\n if (error.code === 'ENOENT') {\n const parent = path.dirname(dir);\n if (dir !== parent) return find(parent)\n return {string: undefined}\n // Throw all other errors.\n /* c8 ignore next 4 */\n }\n\n throw error\n }\n}\n\n// Manually “tree shaken” from:\n\nconst isWindows = process.platform === 'win32';\n\nconst own$1 = {}.hasOwnProperty;\n\nconst codes = {};\n\n/**\n * @typedef {(...args: unknown[]) => string} MessageFunction\n */\n\n/** @type {Map} */\nconst messages = new Map();\nconst nodeInternalPrefix = '__node_internal_';\n/** @type {number} */\nlet userStackTraceLimit;\n\ncodes.ERR_INVALID_MODULE_SPECIFIER = createError(\n 'ERR_INVALID_MODULE_SPECIFIER',\n /**\n * @param {string} request\n * @param {string} reason\n * @param {string} [base]\n */\n (request, reason, base = undefined) => {\n return `Invalid module \"${request}\" ${reason}${\n base ? ` imported from ${base}` : ''\n }`\n },\n TypeError\n);\n\ncodes.ERR_INVALID_PACKAGE_CONFIG = createError(\n 'ERR_INVALID_PACKAGE_CONFIG',\n /**\n * @param {string} path\n * @param {string} [base]\n * @param {string} [message]\n */\n (path, base, message) => {\n return `Invalid package config ${path}${\n base ? ` while importing ${base}` : ''\n }${message ? `. ${message}` : ''}`\n },\n Error\n);\n\ncodes.ERR_INVALID_PACKAGE_TARGET = createError(\n 'ERR_INVALID_PACKAGE_TARGET',\n /**\n * @param {string} pkgPath\n * @param {string} key\n * @param {unknown} target\n * @param {boolean} [isImport=false]\n * @param {string} [base]\n */\n (pkgPath, key, target, isImport = false, base = undefined) => {\n const relError =\n typeof target === 'string' &&\n !isImport &&\n target.length > 0 &&\n !target.startsWith('./');\n if (key === '.') {\n assert(isImport === false);\n return (\n `Invalid \"exports\" main target ${JSON.stringify(target)} defined ` +\n `in the package config ${pkgPath}package.json${\n base ? ` imported from ${base}` : ''\n }${relError ? '; targets must start with \"./\"' : ''}`\n )\n }\n\n return `Invalid \"${\n isImport ? 'imports' : 'exports'\n }\" target ${JSON.stringify(\n target\n )} defined for '${key}' in the package config ${pkgPath}package.json${\n base ? ` imported from ${base}` : ''\n }${relError ? '; targets must start with \"./\"' : ''}`\n },\n Error\n);\n\ncodes.ERR_MODULE_NOT_FOUND = createError(\n 'ERR_MODULE_NOT_FOUND',\n /**\n * @param {string} path\n * @param {string} base\n * @param {string} [type]\n */\n (path, base, type = 'package') => {\n return `Cannot find ${type} '${path}' imported from ${base}`\n },\n Error\n);\n\ncodes.ERR_PACKAGE_IMPORT_NOT_DEFINED = createError(\n 'ERR_PACKAGE_IMPORT_NOT_DEFINED',\n /**\n * @param {string} specifier\n * @param {string} packagePath\n * @param {string} base\n */\n (specifier, packagePath, base) => {\n return `Package import specifier \"${specifier}\" is not defined${\n packagePath ? ` in package ${packagePath}package.json` : ''\n } imported from ${base}`\n },\n TypeError\n);\n\ncodes.ERR_PACKAGE_PATH_NOT_EXPORTED = createError(\n 'ERR_PACKAGE_PATH_NOT_EXPORTED',\n /**\n * @param {string} pkgPath\n * @param {string} subpath\n * @param {string} [base]\n */\n (pkgPath, subpath, base = undefined) => {\n if (subpath === '.')\n return `No \"exports\" main defined in ${pkgPath}package.json${\n base ? ` imported from ${base}` : ''\n }`\n return `Package subpath '${subpath}' is not defined by \"exports\" in ${pkgPath}package.json${\n base ? ` imported from ${base}` : ''\n }`\n },\n Error\n);\n\ncodes.ERR_UNSUPPORTED_DIR_IMPORT = createError(\n 'ERR_UNSUPPORTED_DIR_IMPORT',\n \"Directory import '%s' is not supported \" +\n 'resolving ES modules imported from %s',\n Error\n);\n\ncodes.ERR_UNKNOWN_FILE_EXTENSION = createError(\n 'ERR_UNKNOWN_FILE_EXTENSION',\n 'Unknown file extension \"%s\" for %s',\n TypeError\n);\n\ncodes.ERR_INVALID_ARG_VALUE = createError(\n 'ERR_INVALID_ARG_VALUE',\n /**\n * @param {string} name\n * @param {unknown} value\n * @param {string} [reason='is invalid']\n */\n (name, value, reason = 'is invalid') => {\n let inspected = inspect(value);\n\n if (inspected.length > 128) {\n inspected = `${inspected.slice(0, 128)}...`;\n }\n\n const type = name.includes('.') ? 'property' : 'argument';\n\n return `The ${type} '${name}' ${reason}. Received ${inspected}`\n },\n TypeError\n // Note: extra classes have been shaken out.\n // , RangeError\n);\n\ncodes.ERR_UNSUPPORTED_ESM_URL_SCHEME = createError(\n 'ERR_UNSUPPORTED_ESM_URL_SCHEME',\n /**\n * @param {URL} url\n */\n (url) => {\n let message =\n 'Only file and data URLs are supported by the default ESM loader';\n\n if (isWindows && url.protocol.length === 2) {\n message += '. On Windows, absolute paths must be valid file:// URLs';\n }\n\n message += `. Received protocol '${url.protocol}'`;\n return message\n },\n Error\n);\n\n/**\n * Utility function for registering the error codes. Only used here. Exported\n * *only* to allow for testing.\n * @param {string} sym\n * @param {MessageFunction|string} value\n * @param {ErrorConstructor} def\n * @returns {new (...args: unknown[]) => Error}\n */\nfunction createError(sym, value, def) {\n // Special case for SystemError that formats the error message differently\n // The SystemErrors only have SystemError as their base classes.\n messages.set(sym, value);\n\n return makeNodeErrorWithCode(def, sym)\n}\n\n/**\n * @param {ErrorConstructor} Base\n * @param {string} key\n * @returns {ErrorConstructor}\n */\nfunction makeNodeErrorWithCode(Base, key) {\n // @ts-expect-error It’s a Node error.\n return NodeError\n /**\n * @param {unknown[]} args\n */\n function NodeError(...args) {\n const limit = Error.stackTraceLimit;\n if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = 0;\n const error = new Base();\n // Reset the limit and setting the name property.\n if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = limit;\n const message = getMessage(key, args, error);\n Object.defineProperty(error, 'message', {\n value: message,\n enumerable: false,\n writable: true,\n configurable: true\n });\n Object.defineProperty(error, 'toString', {\n /** @this {Error} */\n value() {\n return `${this.name} [${key}]: ${this.message}`\n },\n enumerable: false,\n writable: true,\n configurable: true\n });\n addCodeToName(error, Base.name, key);\n // @ts-expect-error It’s a Node error.\n error.code = key;\n return error\n }\n}\n\nconst addCodeToName = hideStackFrames(\n /**\n * @param {Error} error\n * @param {string} name\n * @param {string} code\n * @returns {void}\n */\n function (error, name, code) {\n // Set the stack\n error = captureLargerStackTrace(error);\n // Add the error code to the name to include it in the stack trace.\n error.name = `${name} [${code}]`;\n // Access the stack to generate the error message including the error code\n // from the name.\n error.stack; // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n if (name === 'SystemError') {\n Object.defineProperty(error, 'name', {\n value: name,\n enumerable: false,\n writable: true,\n configurable: true\n });\n } else {\n delete error.name;\n }\n }\n);\n\n/**\n * @returns {boolean}\n */\nfunction isErrorStackTraceLimitWritable() {\n const desc = Object.getOwnPropertyDescriptor(Error, 'stackTraceLimit');\n if (desc === undefined) {\n return Object.isExtensible(Error)\n }\n\n return own$1.call(desc, 'writable') ? desc.writable : desc.set !== undefined\n}\n\n/**\n * This function removes unnecessary frames from Node.js core errors.\n * @template {(...args: unknown[]) => unknown} T\n * @type {(fn: T) => T}\n */\nfunction hideStackFrames(fn) {\n // We rename the functions that will be hidden to cut off the stacktrace\n // at the outermost one\n const hidden = nodeInternalPrefix + fn.name;\n Object.defineProperty(fn, 'name', {value: hidden});\n return fn\n}\n\nconst captureLargerStackTrace = hideStackFrames(\n /**\n * @param {Error} error\n * @returns {Error}\n */\n function (error) {\n const stackTraceLimitIsWritable = isErrorStackTraceLimitWritable();\n if (stackTraceLimitIsWritable) {\n userStackTraceLimit = Error.stackTraceLimit;\n Error.stackTraceLimit = Number.POSITIVE_INFINITY;\n }\n\n Error.captureStackTrace(error);\n\n // Reset the limit\n if (stackTraceLimitIsWritable) Error.stackTraceLimit = userStackTraceLimit;\n\n return error\n }\n);\n\n/**\n * @param {string} key\n * @param {unknown[]} args\n * @param {Error} self\n * @returns {string}\n */\nfunction getMessage(key, args, self) {\n const message = messages.get(key);\n\n if (typeof message === 'function') {\n assert(\n message.length <= args.length, // Default options do not count.\n `Code: ${key}; The provided arguments length (${args.length}) does not ` +\n `match the required ones (${message.length}).`\n );\n return Reflect.apply(message, self, args)\n }\n\n const expectedLength = (message.match(/%[dfijoOs]/g) || []).length;\n assert(\n expectedLength === args.length,\n `Code: ${key}; The provided arguments length (${args.length}) does not ` +\n `match the required ones (${expectedLength}).`\n );\n if (args.length === 0) return message\n\n args.unshift(message);\n return Reflect.apply(format, null, args)\n}\n\n// Manually “tree shaken” from:\n\nconst {ERR_UNKNOWN_FILE_EXTENSION} = codes;\n\nconst extensionFormatMap = {\n __proto__: null,\n '.cjs': 'commonjs',\n '.js': 'module',\n '.mjs': 'module'\n};\n\n/**\n * @param {string} url\n * @returns {{format: string|null}}\n */\nfunction defaultGetFormat(url) {\n if (url.startsWith('node:')) {\n return {format: 'builtin'}\n }\n\n const parsed = new URL(url);\n\n if (parsed.protocol === 'data:') {\n const {1: mime} = /^([^/]+\\/[^;,]+)[^,]*?(;base64)?,/.exec(\n parsed.pathname\n ) || [null, null];\n const format = mime === 'text/javascript' ? 'module' : null;\n return {format}\n }\n\n if (parsed.protocol === 'file:') {\n const ext = path.extname(parsed.pathname);\n /** @type {string} */\n let format;\n if (ext === '.js') {\n format = getPackageType(parsed.href) === 'module' ? 'module' : 'commonjs';\n } else {\n format = extensionFormatMap[ext];\n }\n\n if (!format) {\n throw new ERR_UNKNOWN_FILE_EXTENSION(ext, fileURLToPath(url))\n }\n\n return {format: format || null}\n }\n\n return {format: null}\n}\n\n// Manually “tree shaken” from:\n\nconst listOfBuiltins = builtins();\n\nconst {\n ERR_INVALID_MODULE_SPECIFIER,\n ERR_INVALID_PACKAGE_CONFIG,\n ERR_INVALID_PACKAGE_TARGET,\n ERR_MODULE_NOT_FOUND,\n ERR_PACKAGE_IMPORT_NOT_DEFINED,\n ERR_PACKAGE_PATH_NOT_EXPORTED,\n ERR_UNSUPPORTED_DIR_IMPORT,\n ERR_UNSUPPORTED_ESM_URL_SCHEME,\n ERR_INVALID_ARG_VALUE\n} = codes;\n\nconst own = {}.hasOwnProperty;\n\nconst DEFAULT_CONDITIONS = Object.freeze(['node', 'import']);\nconst DEFAULT_CONDITIONS_SET = new Set(DEFAULT_CONDITIONS);\n\nconst invalidSegmentRegEx = /(^|\\\\|\\/)(\\.\\.?|node_modules)(\\\\|\\/|$)/;\nconst patternRegEx = /\\*/g;\nconst encodedSepRegEx = /%2f|%2c/i;\n/** @type {Set} */\nconst emittedPackageWarnings = new Set();\n/** @type {Map} */\nconst packageJsonCache = new Map();\n\n/**\n * @param {string} match\n * @param {URL} pjsonUrl\n * @param {boolean} isExports\n * @param {URL} base\n * @returns {void}\n */\nfunction emitFolderMapDeprecation(match, pjsonUrl, isExports, base) {\n const pjsonPath = fileURLToPath(pjsonUrl);\n\n if (emittedPackageWarnings.has(pjsonPath + '|' + match)) return\n emittedPackageWarnings.add(pjsonPath + '|' + match);\n process.emitWarning(\n `Use of deprecated folder mapping \"${match}\" in the ${\n isExports ? '\"exports\"' : '\"imports\"'\n } field module resolution of the package at ${pjsonPath}${\n base ? ` imported from ${fileURLToPath(base)}` : ''\n }.\\n` +\n `Update this package.json to use a subpath pattern like \"${match}*\".`,\n 'DeprecationWarning',\n 'DEP0148'\n );\n}\n\n/**\n * @param {URL} url\n * @param {URL} packageJsonUrl\n * @param {URL} base\n * @param {unknown} [main]\n * @returns {void}\n */\nfunction emitLegacyIndexDeprecation(url, packageJsonUrl, base, main) {\n const {format} = defaultGetFormat(url.href);\n if (format !== 'module') return\n const path = fileURLToPath(url.href);\n const pkgPath = fileURLToPath(new URL('.', packageJsonUrl));\n const basePath = fileURLToPath(base);\n if (main)\n process.emitWarning(\n `Package ${pkgPath} has a \"main\" field set to ${JSON.stringify(main)}, ` +\n `excluding the full filename and extension to the resolved file at \"${path.slice(\n pkgPath.length\n )}\", imported from ${basePath}.\\n Automatic extension resolution of the \"main\" field is` +\n 'deprecated for ES modules.',\n 'DeprecationWarning',\n 'DEP0151'\n );\n else\n process.emitWarning(\n `No \"main\" or \"exports\" field defined in the package.json for ${pkgPath} resolving the main entry point \"${path.slice(\n pkgPath.length\n )}\", imported from ${basePath}.\\nDefault \"index\" lookups for the main are deprecated for ES modules.`,\n 'DeprecationWarning',\n 'DEP0151'\n );\n}\n\n/**\n * @param {string[]} [conditions]\n * @returns {Set}\n */\nfunction getConditionsSet(conditions) {\n if (conditions !== undefined && conditions !== DEFAULT_CONDITIONS) {\n if (!Array.isArray(conditions)) {\n throw new ERR_INVALID_ARG_VALUE(\n 'conditions',\n conditions,\n 'expected an array'\n )\n }\n\n return new Set(conditions)\n }\n\n return DEFAULT_CONDITIONS_SET\n}\n\n/**\n * @param {string} path\n * @returns {Stats}\n */\nfunction tryStatSync(path) {\n // Note: from Node 15 onwards we can use `throwIfNoEntry: false` instead.\n try {\n return statSync(path)\n } catch {\n return new Stats()\n }\n}\n\n/**\n * @param {string} path\n * @param {string|URL} specifier Note: `specifier` is actually optional, not base.\n * @param {URL} [base]\n * @returns {PackageConfig}\n */\nfunction getPackageConfig(path, specifier, base) {\n const existing = packageJsonCache.get(path);\n if (existing !== undefined) {\n return existing\n }\n\n const source = reader.read(path).string;\n\n if (source === undefined) {\n /** @type {PackageConfig} */\n const packageConfig = {\n pjsonPath: path,\n exists: false,\n main: undefined,\n name: undefined,\n type: 'none',\n exports: undefined,\n imports: undefined\n };\n packageJsonCache.set(path, packageConfig);\n return packageConfig\n }\n\n /** @type {Object.} */\n let packageJson;\n try {\n packageJson = JSON.parse(source);\n } catch (error) {\n throw new ERR_INVALID_PACKAGE_CONFIG(\n path,\n (base ? `\"${specifier}\" from ` : '') + fileURLToPath(base || specifier),\n error.message\n )\n }\n\n const {exports, imports, main, name, type} = packageJson;\n\n /** @type {PackageConfig} */\n const packageConfig = {\n pjsonPath: path,\n exists: true,\n main: typeof main === 'string' ? main : undefined,\n name: typeof name === 'string' ? name : undefined,\n type: type === 'module' || type === 'commonjs' ? type : 'none',\n // @ts-expect-error Assume `Object.`.\n exports,\n // @ts-expect-error Assume `Object.`.\n imports: imports && typeof imports === 'object' ? imports : undefined\n };\n packageJsonCache.set(path, packageConfig);\n return packageConfig\n}\n\n/**\n * @param {URL|string} resolved\n * @returns {PackageConfig}\n */\nfunction getPackageScopeConfig(resolved) {\n let packageJsonUrl = new URL('./package.json', resolved);\n\n while (true) {\n const packageJsonPath = packageJsonUrl.pathname;\n\n if (packageJsonPath.endsWith('node_modules/package.json')) break\n\n const packageConfig = getPackageConfig(\n fileURLToPath(packageJsonUrl),\n resolved\n );\n if (packageConfig.exists) return packageConfig\n\n const lastPackageJsonUrl = packageJsonUrl;\n packageJsonUrl = new URL('../package.json', packageJsonUrl);\n\n // Terminates at root where ../package.json equals ../../package.json\n // (can't just check \"/package.json\" for Windows support).\n if (packageJsonUrl.pathname === lastPackageJsonUrl.pathname) break\n }\n\n const packageJsonPath = fileURLToPath(packageJsonUrl);\n /** @type {PackageConfig} */\n const packageConfig = {\n pjsonPath: packageJsonPath,\n exists: false,\n main: undefined,\n name: undefined,\n type: 'none',\n exports: undefined,\n imports: undefined\n };\n packageJsonCache.set(packageJsonPath, packageConfig);\n return packageConfig\n}\n\n/**\n * Legacy CommonJS main resolution:\n * 1. let M = pkg_url + (json main field)\n * 2. TRY(M, M.js, M.json, M.node)\n * 3. TRY(M/index.js, M/index.json, M/index.node)\n * 4. TRY(pkg_url/index.js, pkg_url/index.json, pkg_url/index.node)\n * 5. NOT_FOUND\n *\n * @param {URL} url\n * @returns {boolean}\n */\nfunction fileExists(url) {\n return tryStatSync(fileURLToPath(url)).isFile()\n}\n\n/**\n * @param {URL} packageJsonUrl\n * @param {PackageConfig} packageConfig\n * @param {URL} base\n * @returns {URL}\n */\nfunction legacyMainResolve(packageJsonUrl, packageConfig, base) {\n /** @type {URL} */\n let guess;\n if (packageConfig.main !== undefined) {\n guess = new URL(`./${packageConfig.main}`, packageJsonUrl);\n // Note: fs check redundances will be handled by Descriptor cache here.\n if (fileExists(guess)) return guess\n\n const tries = [\n `./${packageConfig.main}.js`,\n `./${packageConfig.main}.json`,\n `./${packageConfig.main}.node`,\n `./${packageConfig.main}/index.js`,\n `./${packageConfig.main}/index.json`,\n `./${packageConfig.main}/index.node`\n ];\n let i = -1;\n\n while (++i < tries.length) {\n guess = new URL(tries[i], packageJsonUrl);\n if (fileExists(guess)) break\n guess = undefined;\n }\n\n if (guess) {\n emitLegacyIndexDeprecation(\n guess,\n packageJsonUrl,\n base,\n packageConfig.main\n );\n return guess\n }\n // Fallthrough.\n }\n\n const tries = ['./index.js', './index.json', './index.node'];\n let i = -1;\n\n while (++i < tries.length) {\n guess = new URL(tries[i], packageJsonUrl);\n if (fileExists(guess)) break\n guess = undefined;\n }\n\n if (guess) {\n emitLegacyIndexDeprecation(guess, packageJsonUrl, base, packageConfig.main);\n return guess\n }\n\n // Not found.\n throw new ERR_MODULE_NOT_FOUND(\n fileURLToPath(new URL('.', packageJsonUrl)),\n fileURLToPath(base)\n )\n}\n\n/**\n * @param {URL} resolved\n * @param {URL} base\n * @returns {URL}\n */\nfunction finalizeResolution(resolved, base) {\n if (encodedSepRegEx.test(resolved.pathname))\n throw new ERR_INVALID_MODULE_SPECIFIER(\n resolved.pathname,\n 'must not include encoded \"/\" or \"\\\\\" characters',\n fileURLToPath(base)\n )\n\n const path = fileURLToPath(resolved);\n\n const stats = tryStatSync(path.endsWith('/') ? path.slice(-1) : path);\n\n if (stats.isDirectory()) {\n const error = new ERR_UNSUPPORTED_DIR_IMPORT(path, fileURLToPath(base));\n // @ts-expect-error Add this for `import.meta.resolve`.\n error.url = String(resolved);\n throw error\n }\n\n if (!stats.isFile()) {\n throw new ERR_MODULE_NOT_FOUND(\n path || resolved.pathname,\n base && fileURLToPath(base),\n 'module'\n )\n }\n\n return resolved\n}\n\n/**\n * @param {string} specifier\n * @param {URL?} packageJsonUrl\n * @param {URL} base\n * @returns {never}\n */\nfunction throwImportNotDefined(specifier, packageJsonUrl, base) {\n throw new ERR_PACKAGE_IMPORT_NOT_DEFINED(\n specifier,\n packageJsonUrl && fileURLToPath(new URL('.', packageJsonUrl)),\n fileURLToPath(base)\n )\n}\n\n/**\n * @param {string} subpath\n * @param {URL} packageJsonUrl\n * @param {URL} base\n * @returns {never}\n */\nfunction throwExportsNotFound(subpath, packageJsonUrl, base) {\n throw new ERR_PACKAGE_PATH_NOT_EXPORTED(\n fileURLToPath(new URL('.', packageJsonUrl)),\n subpath,\n base && fileURLToPath(base)\n )\n}\n\n/**\n * @param {string} subpath\n * @param {URL} packageJsonUrl\n * @param {boolean} internal\n * @param {URL} [base]\n * @returns {never}\n */\nfunction throwInvalidSubpath(subpath, packageJsonUrl, internal, base) {\n const reason = `request is not a valid subpath for the \"${\n internal ? 'imports' : 'exports'\n }\" resolution of ${fileURLToPath(packageJsonUrl)}`;\n\n throw new ERR_INVALID_MODULE_SPECIFIER(\n subpath,\n reason,\n base && fileURLToPath(base)\n )\n}\n\n/**\n * @param {string} subpath\n * @param {unknown} target\n * @param {URL} packageJsonUrl\n * @param {boolean} internal\n * @param {URL} [base]\n * @returns {never}\n */\nfunction throwInvalidPackageTarget(\n subpath,\n target,\n packageJsonUrl,\n internal,\n base\n) {\n target =\n typeof target === 'object' && target !== null\n ? JSON.stringify(target, null, '')\n : `${target}`;\n\n throw new ERR_INVALID_PACKAGE_TARGET(\n fileURLToPath(new URL('.', packageJsonUrl)),\n subpath,\n target,\n internal,\n base && fileURLToPath(base)\n )\n}\n\n/**\n * @param {string} target\n * @param {string} subpath\n * @param {string} match\n * @param {URL} packageJsonUrl\n * @param {URL} base\n * @param {boolean} pattern\n * @param {boolean} internal\n * @param {Set} conditions\n * @returns {URL}\n */\nfunction resolvePackageTargetString(\n target,\n subpath,\n match,\n packageJsonUrl,\n base,\n pattern,\n internal,\n conditions\n) {\n if (subpath !== '' && !pattern && target[target.length - 1] !== '/')\n throwInvalidPackageTarget(match, target, packageJsonUrl, internal, base);\n\n if (!target.startsWith('./')) {\n if (internal && !target.startsWith('../') && !target.startsWith('/')) {\n let isURL = false;\n\n try {\n new URL(target);\n isURL = true;\n } catch {}\n\n if (!isURL) {\n const exportTarget = pattern\n ? target.replace(patternRegEx, subpath)\n : target + subpath;\n\n return packageResolve(exportTarget, packageJsonUrl, conditions)\n }\n }\n\n throwInvalidPackageTarget(match, target, packageJsonUrl, internal, base);\n }\n\n if (invalidSegmentRegEx.test(target.slice(2)))\n throwInvalidPackageTarget(match, target, packageJsonUrl, internal, base);\n\n const resolved = new URL(target, packageJsonUrl);\n const resolvedPath = resolved.pathname;\n const packagePath = new URL('.', packageJsonUrl).pathname;\n\n if (!resolvedPath.startsWith(packagePath))\n throwInvalidPackageTarget(match, target, packageJsonUrl, internal, base);\n\n if (subpath === '') return resolved\n\n if (invalidSegmentRegEx.test(subpath))\n throwInvalidSubpath(match + subpath, packageJsonUrl, internal, base);\n\n if (pattern) return new URL(resolved.href.replace(patternRegEx, subpath))\n return new URL(subpath, resolved)\n}\n\n/**\n * @param {string} key\n * @returns {boolean}\n */\nfunction isArrayIndex(key) {\n const keyNumber = Number(key);\n if (`${keyNumber}` !== key) return false\n return keyNumber >= 0 && keyNumber < 0xffff_ffff\n}\n\n/**\n * @param {URL} packageJsonUrl\n * @param {unknown} target\n * @param {string} subpath\n * @param {string} packageSubpath\n * @param {URL} base\n * @param {boolean} pattern\n * @param {boolean} internal\n * @param {Set} conditions\n * @returns {URL}\n */\nfunction resolvePackageTarget(\n packageJsonUrl,\n target,\n subpath,\n packageSubpath,\n base,\n pattern,\n internal,\n conditions\n) {\n if (typeof target === 'string') {\n return resolvePackageTargetString(\n target,\n subpath,\n packageSubpath,\n packageJsonUrl,\n base,\n pattern,\n internal,\n conditions\n )\n }\n\n if (Array.isArray(target)) {\n /** @type {unknown[]} */\n const targetList = target;\n if (targetList.length === 0) return null\n\n /** @type {Error} */\n let lastException;\n let i = -1;\n\n while (++i < targetList.length) {\n const targetItem = targetList[i];\n /** @type {URL} */\n let resolved;\n try {\n resolved = resolvePackageTarget(\n packageJsonUrl,\n targetItem,\n subpath,\n packageSubpath,\n base,\n pattern,\n internal,\n conditions\n );\n } catch (error) {\n lastException = error;\n if (error.code === 'ERR_INVALID_PACKAGE_TARGET') continue\n throw error\n }\n\n if (resolved === undefined) continue\n\n if (resolved === null) {\n lastException = null;\n continue\n }\n\n return resolved\n }\n\n if (lastException === undefined || lastException === null) {\n // @ts-expect-error The diff between `undefined` and `null` seems to be\n // intentional\n return lastException\n }\n\n throw lastException\n }\n\n if (typeof target === 'object' && target !== null) {\n const keys = Object.getOwnPropertyNames(target);\n let i = -1;\n\n while (++i < keys.length) {\n const key = keys[i];\n if (isArrayIndex(key)) {\n throw new ERR_INVALID_PACKAGE_CONFIG(\n fileURLToPath(packageJsonUrl),\n base,\n '\"exports\" cannot contain numeric property keys.'\n )\n }\n }\n\n i = -1;\n\n while (++i < keys.length) {\n const key = keys[i];\n if (key === 'default' || (conditions && conditions.has(key))) {\n /** @type {unknown} */\n const conditionalTarget = target[key];\n const resolved = resolvePackageTarget(\n packageJsonUrl,\n conditionalTarget,\n subpath,\n packageSubpath,\n base,\n pattern,\n internal,\n conditions\n );\n if (resolved === undefined) continue\n return resolved\n }\n }\n\n return undefined\n }\n\n if (target === null) {\n return null\n }\n\n throwInvalidPackageTarget(\n packageSubpath,\n target,\n packageJsonUrl,\n internal,\n base\n );\n}\n\n/**\n * @param {unknown} exports\n * @param {URL} packageJsonUrl\n * @param {URL} base\n * @returns {boolean}\n */\nfunction isConditionalExportsMainSugar(exports, packageJsonUrl, base) {\n if (typeof exports === 'string' || Array.isArray(exports)) return true\n if (typeof exports !== 'object' || exports === null) return false\n\n const keys = Object.getOwnPropertyNames(exports);\n let isConditionalSugar = false;\n let i = 0;\n let j = -1;\n while (++j < keys.length) {\n const key = keys[j];\n const curIsConditionalSugar = key === '' || key[0] !== '.';\n if (i++ === 0) {\n isConditionalSugar = curIsConditionalSugar;\n } else if (isConditionalSugar !== curIsConditionalSugar) {\n throw new ERR_INVALID_PACKAGE_CONFIG(\n fileURLToPath(packageJsonUrl),\n base,\n '\"exports\" cannot contain some keys starting with \\'.\\' and some not.' +\n ' The exports object must either be an object of package subpath keys' +\n ' or an object of main entry condition name keys only.'\n )\n }\n }\n\n return isConditionalSugar\n}\n\n/**\n * @param {URL} packageJsonUrl\n * @param {string} packageSubpath\n * @param {Object.} packageConfig\n * @param {URL} base\n * @param {Set} conditions\n * @returns {ResolveObject}\n */\nfunction packageExportsResolve(\n packageJsonUrl,\n packageSubpath,\n packageConfig,\n base,\n conditions\n) {\n let exports = packageConfig.exports;\n if (isConditionalExportsMainSugar(exports, packageJsonUrl, base))\n exports = {'.': exports};\n\n if (own.call(exports, packageSubpath)) {\n const target = exports[packageSubpath];\n const resolved = resolvePackageTarget(\n packageJsonUrl,\n target,\n '',\n packageSubpath,\n base,\n false,\n false,\n conditions\n );\n if (resolved === null || resolved === undefined)\n throwExportsNotFound(packageSubpath, packageJsonUrl, base);\n return {resolved, exact: true}\n }\n\n let bestMatch = '';\n const keys = Object.getOwnPropertyNames(exports);\n let i = -1;\n\n while (++i < keys.length) {\n const key = keys[i];\n if (\n key[key.length - 1] === '*' &&\n packageSubpath.startsWith(key.slice(0, -1)) &&\n packageSubpath.length >= key.length &&\n key.length > bestMatch.length\n ) {\n bestMatch = key;\n } else if (\n key[key.length - 1] === '/' &&\n packageSubpath.startsWith(key) &&\n key.length > bestMatch.length\n ) {\n bestMatch = key;\n }\n }\n\n if (bestMatch) {\n const target = exports[bestMatch];\n const pattern = bestMatch[bestMatch.length - 1] === '*';\n const subpath = packageSubpath.slice(bestMatch.length - (pattern ? 1 : 0));\n const resolved = resolvePackageTarget(\n packageJsonUrl,\n target,\n subpath,\n bestMatch,\n base,\n pattern,\n false,\n conditions\n );\n if (resolved === null || resolved === undefined)\n throwExportsNotFound(packageSubpath, packageJsonUrl, base);\n if (!pattern)\n emitFolderMapDeprecation(bestMatch, packageJsonUrl, true, base);\n return {resolved, exact: pattern}\n }\n\n throwExportsNotFound(packageSubpath, packageJsonUrl, base);\n}\n\n/**\n * @param {string} name\n * @param {URL} base\n * @param {Set} [conditions]\n * @returns {ResolveObject}\n */\nfunction packageImportsResolve(name, base, conditions) {\n if (name === '#' || name.startsWith('#/')) {\n const reason = 'is not a valid internal imports specifier name';\n throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base))\n }\n\n /** @type {URL} */\n let packageJsonUrl;\n\n const packageConfig = getPackageScopeConfig(base);\n\n if (packageConfig.exists) {\n packageJsonUrl = pathToFileURL(packageConfig.pjsonPath);\n const imports = packageConfig.imports;\n if (imports) {\n if (own.call(imports, name)) {\n const resolved = resolvePackageTarget(\n packageJsonUrl,\n imports[name],\n '',\n name,\n base,\n false,\n true,\n conditions\n );\n if (resolved !== null) return {resolved, exact: true}\n } else {\n let bestMatch = '';\n const keys = Object.getOwnPropertyNames(imports);\n let i = -1;\n\n while (++i < keys.length) {\n const key = keys[i];\n\n if (\n key[key.length - 1] === '*' &&\n name.startsWith(key.slice(0, -1)) &&\n name.length >= key.length &&\n key.length > bestMatch.length\n ) {\n bestMatch = key;\n } else if (\n key[key.length - 1] === '/' &&\n name.startsWith(key) &&\n key.length > bestMatch.length\n ) {\n bestMatch = key;\n }\n }\n\n if (bestMatch) {\n const target = imports[bestMatch];\n const pattern = bestMatch[bestMatch.length - 1] === '*';\n const subpath = name.slice(bestMatch.length - (pattern ? 1 : 0));\n const resolved = resolvePackageTarget(\n packageJsonUrl,\n target,\n subpath,\n bestMatch,\n base,\n pattern,\n true,\n conditions\n );\n if (resolved !== null) {\n if (!pattern)\n emitFolderMapDeprecation(bestMatch, packageJsonUrl, false, base);\n return {resolved, exact: pattern}\n }\n }\n }\n }\n }\n\n throwImportNotDefined(name, packageJsonUrl, base);\n}\n\n/**\n * @param {string} url\n * @returns {PackageType}\n */\nfunction getPackageType(url) {\n const packageConfig = getPackageScopeConfig(url);\n return packageConfig.type\n}\n\n/**\n * @param {string} specifier\n * @param {URL} base\n */\nfunction parsePackageName(specifier, base) {\n let separatorIndex = specifier.indexOf('/');\n let validPackageName = true;\n let isScoped = false;\n if (specifier[0] === '@') {\n isScoped = true;\n if (separatorIndex === -1 || specifier.length === 0) {\n validPackageName = false;\n } else {\n separatorIndex = specifier.indexOf('/', separatorIndex + 1);\n }\n }\n\n const packageName =\n separatorIndex === -1 ? specifier : specifier.slice(0, separatorIndex);\n\n // Package name cannot have leading . and cannot have percent-encoding or\n // separators.\n let i = -1;\n while (++i < packageName.length) {\n if (packageName[i] === '%' || packageName[i] === '\\\\') {\n validPackageName = false;\n break\n }\n }\n\n if (!validPackageName) {\n throw new ERR_INVALID_MODULE_SPECIFIER(\n specifier,\n 'is not a valid package name',\n fileURLToPath(base)\n )\n }\n\n const packageSubpath =\n '.' + (separatorIndex === -1 ? '' : specifier.slice(separatorIndex));\n\n return {packageName, packageSubpath, isScoped}\n}\n\n/**\n * @param {string} specifier\n * @param {URL} base\n * @param {Set} conditions\n * @returns {URL}\n */\nfunction packageResolve(specifier, base, conditions) {\n const {packageName, packageSubpath, isScoped} = parsePackageName(\n specifier,\n base\n );\n\n // ResolveSelf\n const packageConfig = getPackageScopeConfig(base);\n\n // Can’t test.\n /* c8 ignore next 16 */\n if (packageConfig.exists) {\n const packageJsonUrl = pathToFileURL(packageConfig.pjsonPath);\n if (\n packageConfig.name === packageName &&\n packageConfig.exports !== undefined &&\n packageConfig.exports !== null\n ) {\n return packageExportsResolve(\n packageJsonUrl,\n packageSubpath,\n packageConfig,\n base,\n conditions\n ).resolved\n }\n }\n\n let packageJsonUrl = new URL(\n './node_modules/' + packageName + '/package.json',\n base\n );\n let packageJsonPath = fileURLToPath(packageJsonUrl);\n /** @type {string} */\n let lastPath;\n do {\n const stat = tryStatSync(packageJsonPath.slice(0, -13));\n if (!stat.isDirectory()) {\n lastPath = packageJsonPath;\n packageJsonUrl = new URL(\n (isScoped ? '../../../../node_modules/' : '../../../node_modules/') +\n packageName +\n '/package.json',\n packageJsonUrl\n );\n packageJsonPath = fileURLToPath(packageJsonUrl);\n continue\n }\n\n // Package match.\n const packageConfig = getPackageConfig(packageJsonPath, specifier, base);\n if (packageConfig.exports !== undefined && packageConfig.exports !== null)\n return packageExportsResolve(\n packageJsonUrl,\n packageSubpath,\n packageConfig,\n base,\n conditions\n ).resolved\n if (packageSubpath === '.')\n return legacyMainResolve(packageJsonUrl, packageConfig, base)\n return new URL(packageSubpath, packageJsonUrl)\n // Cross-platform root check.\n } while (packageJsonPath.length !== lastPath.length)\n\n throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base))\n}\n\n/**\n * @param {string} specifier\n * @returns {boolean}\n */\nfunction isRelativeSpecifier(specifier) {\n if (specifier[0] === '.') {\n if (specifier.length === 1 || specifier[1] === '/') return true\n if (\n specifier[1] === '.' &&\n (specifier.length === 2 || specifier[2] === '/')\n ) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * @param {string} specifier\n * @returns {boolean}\n */\nfunction shouldBeTreatedAsRelativeOrAbsolutePath(specifier) {\n if (specifier === '') return false\n if (specifier[0] === '/') return true\n return isRelativeSpecifier(specifier)\n}\n\n/**\n * The “Resolver Algorithm Specification” as detailed in the Node docs (which is\n * sync and slightly lower-level than `resolve`).\n *\n *\n *\n * @param {string} specifier\n * @param {URL} base\n * @param {Set} [conditions]\n * @returns {URL}\n */\nfunction moduleResolve(specifier, base, conditions) {\n // Order swapped from spec for minor perf gain.\n // Ok since relative URLs cannot parse as URLs.\n /** @type {URL} */\n let resolved;\n\n if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) {\n resolved = new URL(specifier, base);\n } else if (specifier[0] === '#') {\n({resolved} = packageImportsResolve(specifier, base, conditions));\n } else {\n try {\n resolved = new URL(specifier);\n } catch {\n resolved = packageResolve(specifier, base, conditions);\n }\n }\n\n return finalizeResolution(resolved, base)\n}\n\n/**\n * @param {string} specifier\n * @param {{parentURL?: string, conditions?: string[]}} context\n * @returns {{url: string}}\n */\nfunction defaultResolve(specifier, context = {}) {\n const {parentURL} = context;\n /** @type {URL} */\n let parsed;\n\n try {\n parsed = new URL(specifier);\n if (parsed.protocol === 'data:') {\n return {url: specifier}\n }\n } catch {}\n\n if (parsed && parsed.protocol === 'node:') return {url: specifier}\n if (parsed && parsed.protocol !== 'file:' && parsed.protocol !== 'data:')\n throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(parsed)\n\n if (listOfBuiltins.includes(specifier)) {\n return {url: 'node:' + specifier}\n }\n\n if (parentURL.startsWith('data:')) {\n // This is gonna blow up, we want the error\n new URL(specifier, parentURL);\n }\n\n const conditions = getConditionsSet(context.conditions);\n let url = moduleResolve(specifier, new URL(parentURL), conditions);\n\n const urlPath = fileURLToPath(url);\n const real = realpathSync(urlPath);\n const old = url;\n url = pathToFileURL(real + (urlPath.endsWith(path.sep) ? '/' : ''));\n url.search = old.search;\n url.hash = old.hash;\n\n return {url: `${url}`}\n}\n\n/**\n * Provides a module-relative resolution function scoped to each module,\n * returning the URL string.\n * `import.meta.resolve` also accepts a second argument which is the parent\n * module from which to resolve from.\n *\n * This function is asynchronous because the ES module resolver in Node.js is\n * allowed to be asynchronous.\n *\n * @param {string} specifier The module specifier to resolve relative to parent.\n * @param {string} parent The absolute parent module URL to resolve from.\n * You should pass `import.meta.url` or something else\n * @returns {Promise}\n */\nasync function resolve(specifier, parent) {\n if (!parent) {\n throw new Error(\n 'Please pass `parent`: `import-meta-resolve` cannot ponyfill that'\n )\n }\n\n try {\n return defaultResolve(specifier, {parentURL: parent}).url\n } catch (error) {\n return error.code === 'ERR_UNSUPPORTED_DIR_IMPORT'\n ? error.url\n : Promise.reject(error)\n }\n}\n\nexport { moduleResolve, resolve };\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_assert","data","require","_fs","_interopRequireWildcard","_process","_url","_path","_module","_v","_util","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","own$1","classRegExp","kTypes","Set","codes","formatList","array","type","length","join","slice","messages","Map","nodeInternalPrefix","userStackTraceLimit","ERR_INVALID_ARG_TYPE","createError","name","expected","actual","assert","Array","isArray","message","endsWith","includes","types","instances","other","value","push","toLowerCase","exec","pos","indexOf","determineSpecificType","TypeError","ERR_INVALID_MODULE_SPECIFIER","request","reason","base","undefined","ERR_INVALID_PACKAGE_CONFIG","path","Error","ERR_INVALID_PACKAGE_TARGET","pkgPath","key","target","isImport","relError","startsWith","JSON","stringify","ERR_MODULE_NOT_FOUND","exactUrl","ERR_NETWORK_IMPORT_DISALLOWED","ERR_PACKAGE_IMPORT_NOT_DEFINED","specifier","packagePath","ERR_PACKAGE_PATH_NOT_EXPORTED","subpath","ERR_UNSUPPORTED_DIR_IMPORT","ERR_UNKNOWN_FILE_EXTENSION","ext","ERR_INVALID_ARG_VALUE","inspected","inspect","sym","def","makeNodeErrorWithCode","Base","NodeError","args","limit","stackTraceLimit","isErrorStackTraceLimitWritable","error","getMessage","defineProperties","enumerable","writable","configurable","toString","captureLargerStackTrace","code","v8","startupSnapshot","isBuildingSnapshot","_unused","desc","isExtensible","hideStackFrames","fn","hidden","stackTraceLimitIsWritable","Number","POSITIVE_INFINITY","captureStackTrace","self","Reflect","apply","regex","expectedLength","unshift","format","String","constructor","depth","colors","hasOwnProperty$1","ERR_INVALID_PACKAGE_CONFIG$1","cache","reader","read","packageJsonReader","jsonPath","existing","string","fs","readFileSync","toNamespacedPath","exception","result","exists","pjsonPath","main","exports","imports","parsed","parse","error_","cause","fileURLToPath","getPackageScopeConfig","resolved","packageJSONUrl","URL","packageJSONPath","pathname","packageConfig","lastPackageJSONUrl","getPackageType","url","extensionFormatMap","mimeToFormat","mime","test","protocolHandlers","getDataProtocolModuleFormat","getFileProtocolModuleFormat","getHttpProtocolModuleFormat","node:","extname","index","codePointAt","_context","ignoreErrors","packageType","filepath","defaultGetFormatWithoutErrors","context","protocol","DEFAULT_CONDITIONS","freeze","DEFAULT_CONDITIONS_SET","getDefaultConditions","getDefaultConditionsSet","getConditionsSet","conditions","RegExpPrototypeSymbolReplace","RegExp","Symbol","replace","own","invalidSegmentRegEx","deprecatedInvalidSegmentRegEx","invalidPackageNameRegEx","patternRegEx","encodedSepRegEx","emittedPackageWarnings","doubleSlashRegEx","emitInvalidSegmentDeprecation","match","packageJsonUrl","internal","isTarget","process","noDeprecation","double","emitWarning","emitLegacyIndexDeprecation","parentURL","href","urlPath","basePath","resolve","tryStatSync","statSync","_unused2","Stats","fileExists","stats","throwIfNoEntry","isFile","legacyMainResolve","guess","tries","finalizeResolution","preserveSymlinks","filePath","isDirectory","real","realpathSync","search","hash","pathToFileURL","sep","importNotDefined","exportsNotFound","throwInvalidSubpath","invalidPackageTarget","resolvePackageTargetString","pattern","isPathMap","isURL","_unused3","exportTarget","packageResolve","resolvedTarget","resolvedPath","isArrayIndex","keyNumber","resolvePackageTarget","packageSubpath","targetList","lastException","targetItem","resolveResult","keys","getOwnPropertyNames","conditionalTarget","isConditionalExportsMainSugar","isConditionalSugar","j","curIsConditionalSugar","emitTrailingSlashPatternDeprecation","pjsonUrl","add","packageExportsResolve","bestMatch","bestMatchSubpath","patternIndex","patternTrailer","patternKeyCompare","lastIndexOf","b","aPatternIndex","bPatternIndex","baseLengthA","baseLengthB","packageImportsResolve","parsePackageName","separatorIndex","validPackageName","isScoped","packageName","builtinModules","packageJsonPath","lastPath","stat","isRelativeSpecifier","shouldBeTreatedAsRelativeOrAbsolutePath","moduleResolve","isRemote","_unused4","checkIfDisallowedImport","parsedParentURL","parentProtocol","parsedProtocol","Boolean","throwIfInvalidParentURL","defaultResolve","_unused5","_unused6","maybeReturn","parent"],"sources":["../../src/vendor/import-meta-resolve.js"],"sourcesContent":["\n/****************************************************************************\\\n * NOTE FROM BABEL AUTHORS *\n * This file is inlined from https://github.com/wooorm/import-meta-resolve, *\n * because we need to compile it to CommonJS. *\n\\****************************************************************************/\n\n/*\n(The MIT License)\n\nCopyright (c) 2021 Titus Wormer \n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---\n\nThis is a derivative work based on:\n.\nWhich is licensed:\n\n\"\"\"\nCopyright Node.js contributors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n\nThis license applies to parts of Node.js originating from the\nhttps://github.com/joyent/node repository:\n\n\"\"\"\nCopyright Joyent, Inc. and other Node contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n*/\n\nimport assert from 'assert';\nimport fs, { realpathSync, statSync, Stats } from 'fs';\nimport process from 'process';\nimport { fileURLToPath, URL, pathToFileURL } from 'url';\nimport path from 'path';\nimport { builtinModules } from 'module';\nimport v8 from 'v8';\nimport { format, inspect } from 'util';\n\n/**\n * @typedef ErrnoExceptionFields\n * @property {number | undefined} [errnode]\n * @property {string | undefined} [code]\n * @property {string | undefined} [path]\n * @property {string | undefined} [syscall]\n * @property {string | undefined} [url]\n *\n * @typedef {Error & ErrnoExceptionFields} ErrnoException\n */\n\n\nconst own$1 = {}.hasOwnProperty;\n\nconst classRegExp = /^([A-Z][a-z\\d]*)+$/;\n// Sorted by a rough estimate on most frequently used entries.\nconst kTypes = new Set([\n 'string',\n 'function',\n 'number',\n 'object',\n // Accept 'Function' and 'Object' as alternative to the lower cased version.\n 'Function',\n 'Object',\n 'boolean',\n 'bigint',\n 'symbol'\n]);\n\nconst codes = {};\n\n/**\n * Create a list string in the form like 'A and B' or 'A, B, ..., and Z'.\n * We cannot use Intl.ListFormat because it's not available in\n * --without-intl builds.\n *\n * @param {Array} array\n * An array of strings.\n * @param {string} [type]\n * The list type to be inserted before the last element.\n * @returns {string}\n */\nfunction formatList(array, type = 'and') {\n return array.length < 3\n ? array.join(` ${type} `)\n : `${array.slice(0, -1).join(', ')}, ${type} ${array[array.length - 1]}`\n}\n\n/** @type {Map} */\nconst messages = new Map();\nconst nodeInternalPrefix = '__node_internal_';\n/** @type {number} */\nlet userStackTraceLimit;\n\ncodes.ERR_INVALID_ARG_TYPE = createError(\n 'ERR_INVALID_ARG_TYPE',\n /**\n * @param {string} name\n * @param {Array | string} expected\n * @param {unknown} actual\n */\n (name, expected, actual) => {\n assert(typeof name === 'string', \"'name' must be a string\");\n if (!Array.isArray(expected)) {\n expected = [expected];\n }\n\n let message = 'The ';\n if (name.endsWith(' argument')) {\n // For cases like 'first argument'\n message += `${name} `;\n } else {\n const type = name.includes('.') ? 'property' : 'argument';\n message += `\"${name}\" ${type} `;\n }\n\n message += 'must be ';\n\n /** @type {Array} */\n const types = [];\n /** @type {Array} */\n const instances = [];\n /** @type {Array} */\n const other = [];\n\n for (const value of expected) {\n assert(\n typeof value === 'string',\n 'All expected entries have to be of type string'\n );\n\n if (kTypes.has(value)) {\n types.push(value.toLowerCase());\n } else if (classRegExp.exec(value) === null) {\n assert(\n value !== 'object',\n 'The value \"object\" should be written as \"Object\"'\n );\n other.push(value);\n } else {\n instances.push(value);\n }\n }\n\n // Special handle `object` in case other instances are allowed to outline\n // the differences between each other.\n if (instances.length > 0) {\n const pos = types.indexOf('object');\n if (pos !== -1) {\n types.slice(pos, 1);\n instances.push('Object');\n }\n }\n\n if (types.length > 0) {\n message += `${types.length > 1 ? 'one of type' : 'of type'} ${formatList(\n types,\n 'or'\n )}`;\n if (instances.length > 0 || other.length > 0) message += ' or ';\n }\n\n if (instances.length > 0) {\n message += `an instance of ${formatList(instances, 'or')}`;\n if (other.length > 0) message += ' or ';\n }\n\n if (other.length > 0) {\n if (other.length > 1) {\n message += `one of ${formatList(other, 'or')}`;\n } else {\n if (other[0].toLowerCase() !== other[0]) message += 'an ';\n message += `${other[0]}`;\n }\n }\n\n message += `. Received ${determineSpecificType(actual)}`;\n\n return message\n },\n TypeError\n);\n\ncodes.ERR_INVALID_MODULE_SPECIFIER = createError(\n 'ERR_INVALID_MODULE_SPECIFIER',\n /**\n * @param {string} request\n * @param {string} reason\n * @param {string} [base]\n */\n (request, reason, base = undefined) => {\n return `Invalid module \"${request}\" ${reason}${\n base ? ` imported from ${base}` : ''\n }`\n },\n TypeError\n);\n\ncodes.ERR_INVALID_PACKAGE_CONFIG = createError(\n 'ERR_INVALID_PACKAGE_CONFIG',\n /**\n * @param {string} path\n * @param {string} [base]\n * @param {string} [message]\n */\n (path, base, message) => {\n return `Invalid package config ${path}${\n base ? ` while importing ${base}` : ''\n }${message ? `. ${message}` : ''}`\n },\n Error\n);\n\ncodes.ERR_INVALID_PACKAGE_TARGET = createError(\n 'ERR_INVALID_PACKAGE_TARGET',\n /**\n * @param {string} pkgPath\n * @param {string} key\n * @param {unknown} target\n * @param {boolean} [isImport=false]\n * @param {string} [base]\n */\n (pkgPath, key, target, isImport = false, base = undefined) => {\n const relError =\n typeof target === 'string' &&\n !isImport &&\n target.length > 0 &&\n !target.startsWith('./');\n if (key === '.') {\n assert(isImport === false);\n return (\n `Invalid \"exports\" main target ${JSON.stringify(target)} defined ` +\n `in the package config ${pkgPath}package.json${\n base ? ` imported from ${base}` : ''\n }${relError ? '; targets must start with \"./\"' : ''}`\n )\n }\n\n return `Invalid \"${\n isImport ? 'imports' : 'exports'\n }\" target ${JSON.stringify(\n target\n )} defined for '${key}' in the package config ${pkgPath}package.json${\n base ? ` imported from ${base}` : ''\n }${relError ? '; targets must start with \"./\"' : ''}`\n },\n Error\n);\n\ncodes.ERR_MODULE_NOT_FOUND = createError(\n 'ERR_MODULE_NOT_FOUND',\n /**\n * @param {string} path\n * @param {string} base\n * @param {boolean} [exactUrl]\n */\n (path, base, exactUrl = false) => {\n return `Cannot find ${\n exactUrl ? 'module' : 'package'\n } '${path}' imported from ${base}`\n },\n Error\n);\n\ncodes.ERR_NETWORK_IMPORT_DISALLOWED = createError(\n 'ERR_NETWORK_IMPORT_DISALLOWED',\n \"import of '%s' by %s is not supported: %s\",\n Error\n);\n\ncodes.ERR_PACKAGE_IMPORT_NOT_DEFINED = createError(\n 'ERR_PACKAGE_IMPORT_NOT_DEFINED',\n /**\n * @param {string} specifier\n * @param {string} packagePath\n * @param {string} base\n */\n (specifier, packagePath, base) => {\n return `Package import specifier \"${specifier}\" is not defined${\n packagePath ? ` in package ${packagePath}package.json` : ''\n } imported from ${base}`\n },\n TypeError\n);\n\ncodes.ERR_PACKAGE_PATH_NOT_EXPORTED = createError(\n 'ERR_PACKAGE_PATH_NOT_EXPORTED',\n /**\n * @param {string} pkgPath\n * @param {string} subpath\n * @param {string} [base]\n */\n (pkgPath, subpath, base = undefined) => {\n if (subpath === '.')\n return `No \"exports\" main defined in ${pkgPath}package.json${\n base ? ` imported from ${base}` : ''\n }`\n return `Package subpath '${subpath}' is not defined by \"exports\" in ${pkgPath}package.json${\n base ? ` imported from ${base}` : ''\n }`\n },\n Error\n);\n\ncodes.ERR_UNSUPPORTED_DIR_IMPORT = createError(\n 'ERR_UNSUPPORTED_DIR_IMPORT',\n \"Directory import '%s' is not supported \" +\n 'resolving ES modules imported from %s',\n Error\n);\n\ncodes.ERR_UNKNOWN_FILE_EXTENSION = createError(\n 'ERR_UNKNOWN_FILE_EXTENSION',\n /**\n * @param {string} ext\n * @param {string} path\n */\n (ext, path) => {\n return `Unknown file extension \"${ext}\" for ${path}`\n },\n TypeError\n);\n\ncodes.ERR_INVALID_ARG_VALUE = createError(\n 'ERR_INVALID_ARG_VALUE',\n /**\n * @param {string} name\n * @param {unknown} value\n * @param {string} [reason='is invalid']\n */\n (name, value, reason = 'is invalid') => {\n let inspected = inspect(value);\n\n if (inspected.length > 128) {\n inspected = `${inspected.slice(0, 128)}...`;\n }\n\n const type = name.includes('.') ? 'property' : 'argument';\n\n return `The ${type} '${name}' ${reason}. Received ${inspected}`\n },\n TypeError\n // Note: extra classes have been shaken out.\n // , RangeError\n);\n\n/**\n * Utility function for registering the error codes. Only used here. Exported\n * *only* to allow for testing.\n * @param {string} sym\n * @param {MessageFunction | string} value\n * @param {ErrorConstructor} def\n * @returns {new (...args: Array) => Error}\n */\nfunction createError(sym, value, def) {\n // Special case for SystemError that formats the error message differently\n // The SystemErrors only have SystemError as their base classes.\n messages.set(sym, value);\n\n return makeNodeErrorWithCode(def, sym)\n}\n\n/**\n * @param {ErrorConstructor} Base\n * @param {string} key\n * @returns {ErrorConstructor}\n */\nfunction makeNodeErrorWithCode(Base, key) {\n // @ts-expect-error It’s a Node error.\n return NodeError\n /**\n * @param {Array} args\n */\n function NodeError(...args) {\n const limit = Error.stackTraceLimit;\n if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = 0;\n const error = new Base();\n // Reset the limit and setting the name property.\n if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = limit;\n const message = getMessage(key, args, error);\n Object.defineProperties(error, {\n // Note: no need to implement `kIsNodeError` symbol, would be hard,\n // probably.\n message: {\n value: message,\n enumerable: false,\n writable: true,\n configurable: true\n },\n toString: {\n /** @this {Error} */\n value() {\n return `${this.name} [${key}]: ${this.message}`\n },\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n\n captureLargerStackTrace(error);\n // @ts-expect-error It’s a Node error.\n error.code = key;\n return error\n }\n}\n\n/**\n * @returns {boolean}\n */\nfunction isErrorStackTraceLimitWritable() {\n // Do no touch Error.stackTraceLimit as V8 would attempt to install\n // it again during deserialization.\n try {\n // @ts-expect-error: not in types?\n if (v8.startupSnapshot.isBuildingSnapshot()) {\n return false\n }\n } catch {}\n\n const desc = Object.getOwnPropertyDescriptor(Error, 'stackTraceLimit');\n if (desc === undefined) {\n return Object.isExtensible(Error)\n }\n\n return own$1.call(desc, 'writable') && desc.writable !== undefined\n ? desc.writable\n : desc.set !== undefined\n}\n\n/**\n * This function removes unnecessary frames from Node.js core errors.\n * @template {(...args: unknown[]) => unknown} T\n * @param {T} fn\n * @returns {T}\n */\nfunction hideStackFrames(fn) {\n // We rename the functions that will be hidden to cut off the stacktrace\n // at the outermost one\n const hidden = nodeInternalPrefix + fn.name;\n Object.defineProperty(fn, 'name', {value: hidden});\n return fn\n}\n\nconst captureLargerStackTrace = hideStackFrames(\n /**\n * @param {Error} error\n * @returns {Error}\n */\n // @ts-expect-error: fine\n function (error) {\n const stackTraceLimitIsWritable = isErrorStackTraceLimitWritable();\n if (stackTraceLimitIsWritable) {\n userStackTraceLimit = Error.stackTraceLimit;\n Error.stackTraceLimit = Number.POSITIVE_INFINITY;\n }\n\n Error.captureStackTrace(error);\n\n // Reset the limit\n if (stackTraceLimitIsWritable) Error.stackTraceLimit = userStackTraceLimit;\n\n return error\n }\n);\n\n/**\n * @param {string} key\n * @param {Array} args\n * @param {Error} self\n * @returns {string}\n */\nfunction getMessage(key, args, self) {\n const message = messages.get(key);\n assert(message !== undefined, 'expected `message` to be found');\n\n if (typeof message === 'function') {\n assert(\n message.length <= args.length, // Default options do not count.\n `Code: ${key}; The provided arguments length (${args.length}) does not ` +\n `match the required ones (${message.length}).`\n );\n return Reflect.apply(message, self, args)\n }\n\n const regex = /%[dfijoOs]/g;\n let expectedLength = 0;\n while (regex.exec(message) !== null) expectedLength++;\n assert(\n expectedLength === args.length,\n `Code: ${key}; The provided arguments length (${args.length}) does not ` +\n `match the required ones (${expectedLength}).`\n );\n if (args.length === 0) return message\n\n args.unshift(message);\n return Reflect.apply(format, null, args)\n}\n\n/**\n * Determine the specific type of a value for type-mismatch errors.\n * @param {unknown} value\n * @returns {string}\n */\nfunction determineSpecificType(value) {\n if (value === null || value === undefined) {\n return String(value)\n }\n\n if (typeof value === 'function' && value.name) {\n return `function ${value.name}`\n }\n\n if (typeof value === 'object') {\n if (value.constructor && value.constructor.name) {\n return `an instance of ${value.constructor.name}`\n }\n\n return `${inspect(value, {depth: -1})}`\n }\n\n let inspected = inspect(value, {colors: false});\n\n if (inspected.length > 28) {\n inspected = `${inspected.slice(0, 25)}...`;\n }\n\n return `type ${typeof value} (${inspected})`\n}\n\n// Manually “tree shaken” from:\n// \n// Last checked on: Nov 2, 2023.\n// Removed the native dependency.\n// Also: no need to cache, we do that in resolve already.\n\n\nconst hasOwnProperty$1 = {}.hasOwnProperty;\n\nconst {ERR_INVALID_PACKAGE_CONFIG: ERR_INVALID_PACKAGE_CONFIG$1} = codes;\n\n/** @type {Map} */\nconst cache = new Map();\n\nconst reader = {read};\nvar packageJsonReader = reader;\n\n/**\n * @param {string} jsonPath\n * @param {{specifier: URL | string, base?: URL}} options\n * @returns {PackageConfig}\n */\nfunction read(jsonPath, {base, specifier}) {\n const existing = cache.get(jsonPath);\n\n if (existing) {\n return existing\n }\n\n /** @type {string | undefined} */\n let string;\n\n try {\n string = fs.readFileSync(path.toNamespacedPath(jsonPath), 'utf8');\n } catch (error) {\n const exception = /** @type {ErrnoException} */ (error);\n\n if (exception.code !== 'ENOENT') {\n throw exception\n }\n }\n\n /** @type {PackageConfig} */\n const result = {\n exists: false,\n pjsonPath: jsonPath,\n main: undefined,\n name: undefined,\n type: 'none', // Ignore unknown types for forwards compatibility\n exports: undefined,\n imports: undefined\n };\n\n if (string !== undefined) {\n /** @type {Record} */\n let parsed;\n\n try {\n parsed = JSON.parse(string);\n } catch (error_) {\n const cause = /** @type {ErrnoException} */ (error_);\n const error = new ERR_INVALID_PACKAGE_CONFIG$1(\n jsonPath,\n (base ? `\"${specifier}\" from ` : '') + fileURLToPath(base || specifier),\n cause.message\n );\n // @ts-expect-error: fine.\n error.cause = cause;\n throw error\n }\n\n result.exists = true;\n\n if (\n hasOwnProperty$1.call(parsed, 'name') &&\n typeof parsed.name === 'string'\n ) {\n result.name = parsed.name;\n }\n\n if (\n hasOwnProperty$1.call(parsed, 'main') &&\n typeof parsed.main === 'string'\n ) {\n result.main = parsed.main;\n }\n\n if (hasOwnProperty$1.call(parsed, 'exports')) {\n // @ts-expect-error: assume valid.\n result.exports = parsed.exports;\n }\n\n if (hasOwnProperty$1.call(parsed, 'imports')) {\n // @ts-expect-error: assume valid.\n result.imports = parsed.imports;\n }\n\n // Ignore unknown types for forwards compatibility\n if (\n hasOwnProperty$1.call(parsed, 'type') &&\n (parsed.type === 'commonjs' || parsed.type === 'module')\n ) {\n result.type = parsed.type;\n }\n }\n\n cache.set(jsonPath, result);\n\n return result\n}\n\n// Manually “tree shaken” from:\n// \n// Last checked on: Nov 2, 2023.\n\n\n/**\n * @param {URL | string} resolved\n * @returns {PackageConfig}\n */\nfunction getPackageScopeConfig(resolved) {\n let packageJSONUrl = new URL('package.json', resolved);\n\n while (true) {\n const packageJSONPath = packageJSONUrl.pathname;\n if (packageJSONPath.endsWith('node_modules/package.json')) {\n break\n }\n\n const packageConfig = packageJsonReader.read(\n fileURLToPath(packageJSONUrl),\n {specifier: resolved}\n );\n\n if (packageConfig.exists) {\n return packageConfig\n }\n\n const lastPackageJSONUrl = packageJSONUrl;\n packageJSONUrl = new URL('../package.json', packageJSONUrl);\n\n // Terminates at root where ../package.json equals ../../package.json\n // (can't just check \"/package.json\" for Windows support).\n if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) {\n break\n }\n }\n\n const packageJSONPath = fileURLToPath(packageJSONUrl);\n\n return {\n pjsonPath: packageJSONPath,\n exists: false,\n main: undefined,\n name: undefined,\n type: 'none',\n exports: undefined,\n imports: undefined\n }\n}\n\n// Manually “tree shaken” from:\n// \n// Last checked on: Nov 2, 2023.\n//\n// This file solves a circular dependency.\n// In Node.js, `getPackageType` is in `resolve.js`.\n// `resolve.js` imports `get-format.js`, which needs `getPackageType`.\n// We split that up so that bundlers don’t fail.\n\n\n/**\n * @param {URL} url\n * @returns {PackageType}\n */\nfunction getPackageType(url) {\n const packageConfig = getPackageScopeConfig(url);\n return packageConfig.type\n}\n\n// Manually “tree shaken” from:\n// \n// Last checked on: Nov 2, 2023.\n\n\nconst {ERR_UNKNOWN_FILE_EXTENSION} = codes;\n\nconst hasOwnProperty = {}.hasOwnProperty;\n\n/** @type {Record} */\nconst extensionFormatMap = {\n // @ts-expect-error: hush.\n __proto__: null,\n '.cjs': 'commonjs',\n '.js': 'module',\n '.json': 'json',\n '.mjs': 'module'\n};\n\n/**\n * @param {string | null} mime\n * @returns {string | null}\n */\nfunction mimeToFormat(mime) {\n if (\n mime &&\n /\\s*(text|application)\\/javascript\\s*(;\\s*charset=utf-?8\\s*)?/i.test(mime)\n )\n return 'module'\n if (mime === 'application/json') return 'json'\n return null\n}\n\n/**\n * @callback ProtocolHandler\n * @param {URL} parsed\n * @param {{parentURL: string, source?: Buffer}} context\n * @param {boolean} ignoreErrors\n * @returns {string | null | void}\n */\n\n/**\n * @type {Record}\n */\nconst protocolHandlers = {\n // @ts-expect-error: hush.\n __proto__: null,\n 'data:': getDataProtocolModuleFormat,\n 'file:': getFileProtocolModuleFormat,\n 'http:': getHttpProtocolModuleFormat,\n 'https:': getHttpProtocolModuleFormat,\n 'node:'() {\n return 'builtin'\n }\n};\n\n/**\n * @param {URL} parsed\n */\nfunction getDataProtocolModuleFormat(parsed) {\n const {1: mime} = /^([^/]+\\/[^;,]+)[^,]*?(;base64)?,/.exec(\n parsed.pathname\n ) || [null, null, null];\n return mimeToFormat(mime)\n}\n\n/**\n * Returns the file extension from a URL.\n *\n * Should give similar result to\n * `require('node:path').extname(require('node:url').fileURLToPath(url))`\n * when used with a `file:` URL.\n *\n * @param {URL} url\n * @returns {string}\n */\nfunction extname(url) {\n const pathname = url.pathname;\n let index = pathname.length;\n\n while (index--) {\n const code = pathname.codePointAt(index);\n\n if (code === 47 /* `/` */) {\n return ''\n }\n\n if (code === 46 /* `.` */) {\n return pathname.codePointAt(index - 1) === 47 /* `/` */\n ? ''\n : pathname.slice(index)\n }\n }\n\n return ''\n}\n\n/**\n * @type {ProtocolHandler}\n */\nfunction getFileProtocolModuleFormat(url, _context, ignoreErrors) {\n const ext = extname(url);\n\n if (ext === '.js') {\n const packageType = getPackageType(url);\n\n if (packageType !== 'none') {\n return packageType\n }\n\n return 'commonjs'\n }\n\n if (ext === '') {\n const packageType = getPackageType(url);\n\n // Legacy behavior\n if (packageType === 'none' || packageType === 'commonjs') {\n return 'commonjs'\n }\n\n // Note: we don’t implement WASM, so we don’t need\n // `getFormatOfExtensionlessFile` from `formats`.\n return 'module'\n }\n\n const format = extensionFormatMap[ext];\n if (format) return format\n\n // Explicit undefined return indicates load hook should rerun format check\n if (ignoreErrors) {\n return undefined\n }\n\n const filepath = fileURLToPath(url);\n throw new ERR_UNKNOWN_FILE_EXTENSION(ext, filepath)\n}\n\nfunction getHttpProtocolModuleFormat() {\n // To do: HTTPS imports.\n}\n\n/**\n * @param {URL} url\n * @param {{parentURL: string}} context\n * @returns {string | null}\n */\nfunction defaultGetFormatWithoutErrors(url, context) {\n const protocol = url.protocol;\n\n if (!hasOwnProperty.call(protocolHandlers, protocol)) {\n return null\n }\n\n return protocolHandlers[protocol](url, context, true) || null\n}\n\n// Manually “tree shaken” from:\n// \n// Last checked on: Nov 2, 2023.\n\n\nconst {ERR_INVALID_ARG_VALUE} = codes;\n\n// In Node itself these values are populated from CLI arguments, before any\n// user code runs.\n// Here we just define the defaults.\nconst DEFAULT_CONDITIONS = Object.freeze(['node', 'import']);\nconst DEFAULT_CONDITIONS_SET = new Set(DEFAULT_CONDITIONS);\n\n/**\n * Returns the default conditions for ES module loading.\n */\nfunction getDefaultConditions() {\n return DEFAULT_CONDITIONS\n}\n\n/**\n * Returns the default conditions for ES module loading, as a Set.\n */\nfunction getDefaultConditionsSet() {\n return DEFAULT_CONDITIONS_SET\n}\n\n/**\n * @param {Array} [conditions]\n * @returns {Set}\n */\nfunction getConditionsSet(conditions) {\n if (conditions !== undefined && conditions !== getDefaultConditions()) {\n if (!Array.isArray(conditions)) {\n throw new ERR_INVALID_ARG_VALUE(\n 'conditions',\n conditions,\n 'expected an array'\n )\n }\n\n return new Set(conditions)\n }\n\n return getDefaultConditionsSet()\n}\n\n// Manually “tree shaken” from:\n// \n// Last checked on: Nov 2, 2023.\n\n\nconst RegExpPrototypeSymbolReplace = RegExp.prototype[Symbol.replace];\n\nconst {\n ERR_NETWORK_IMPORT_DISALLOWED,\n ERR_INVALID_MODULE_SPECIFIER,\n ERR_INVALID_PACKAGE_CONFIG,\n ERR_INVALID_PACKAGE_TARGET,\n ERR_MODULE_NOT_FOUND,\n ERR_PACKAGE_IMPORT_NOT_DEFINED,\n ERR_PACKAGE_PATH_NOT_EXPORTED,\n ERR_UNSUPPORTED_DIR_IMPORT\n} = codes;\n\nconst own = {}.hasOwnProperty;\n\nconst invalidSegmentRegEx =\n /(^|\\\\|\\/)((\\.|%2e)(\\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))?(\\\\|\\/|$)/i;\nconst deprecatedInvalidSegmentRegEx =\n /(^|\\\\|\\/)((\\.|%2e)(\\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\\\|\\/|$)/i;\nconst invalidPackageNameRegEx = /^\\.|%|\\\\/;\nconst patternRegEx = /\\*/g;\nconst encodedSepRegEx = /%2f|%5c/i;\n/** @type {Set} */\nconst emittedPackageWarnings = new Set();\n\nconst doubleSlashRegEx = /[/\\\\]{2}/;\n\n/**\n *\n * @param {string} target\n * @param {string} request\n * @param {string} match\n * @param {URL} packageJsonUrl\n * @param {boolean} internal\n * @param {URL} base\n * @param {boolean} isTarget\n */\nfunction emitInvalidSegmentDeprecation(\n target,\n request,\n match,\n packageJsonUrl,\n internal,\n base,\n isTarget\n) {\n // @ts-expect-error: apparently it does exist, TS.\n if (process.noDeprecation) {\n return\n }\n\n const pjsonPath = fileURLToPath(packageJsonUrl);\n const double = doubleSlashRegEx.exec(isTarget ? target : request) !== null;\n process.emitWarning(\n `Use of deprecated ${\n double ? 'double slash' : 'leading or trailing slash matching'\n } resolving \"${target}\" for module ` +\n `request \"${request}\" ${\n request === match ? '' : `matched to \"${match}\" `\n }in the \"${\n internal ? 'imports' : 'exports'\n }\" field module resolution of the package at ${pjsonPath}${\n base ? ` imported from ${fileURLToPath(base)}` : ''\n }.`,\n 'DeprecationWarning',\n 'DEP0166'\n );\n}\n\n/**\n * @param {URL} url\n * @param {URL} packageJsonUrl\n * @param {URL} base\n * @param {string} [main]\n * @returns {void}\n */\nfunction emitLegacyIndexDeprecation(url, packageJsonUrl, base, main) {\n // @ts-expect-error: apparently it does exist, TS.\n if (process.noDeprecation) {\n return\n }\n\n const format = defaultGetFormatWithoutErrors(url, {parentURL: base.href});\n if (format !== 'module') return\n const urlPath = fileURLToPath(url.href);\n const pkgPath = fileURLToPath(new URL('.', packageJsonUrl));\n const basePath = fileURLToPath(base);\n if (!main) {\n process.emitWarning(\n `No \"main\" or \"exports\" field defined in the package.json for ${pkgPath} resolving the main entry point \"${urlPath.slice(\n pkgPath.length\n )}\", imported from ${basePath}.\\nDefault \"index\" lookups for the main are deprecated for ES modules.`,\n 'DeprecationWarning',\n 'DEP0151'\n );\n } else if (path.resolve(pkgPath, main) !== urlPath) {\n process.emitWarning(\n `Package ${pkgPath} has a \"main\" field set to \"${main}\", ` +\n `excluding the full filename and extension to the resolved file at \"${urlPath.slice(\n pkgPath.length\n )}\", imported from ${basePath}.\\n Automatic extension resolution of the \"main\" field is ` +\n 'deprecated for ES modules.',\n 'DeprecationWarning',\n 'DEP0151'\n );\n }\n}\n\n/**\n * @param {string} path\n * @returns {Stats}\n */\nfunction tryStatSync(path) {\n // Note: from Node 15 onwards we can use `throwIfNoEntry: false` instead.\n try {\n return statSync(path)\n } catch {\n return new Stats()\n }\n}\n\n/**\n * Legacy CommonJS main resolution:\n * 1. let M = pkg_url + (json main field)\n * 2. TRY(M, M.js, M.json, M.node)\n * 3. TRY(M/index.js, M/index.json, M/index.node)\n * 4. TRY(pkg_url/index.js, pkg_url/index.json, pkg_url/index.node)\n * 5. NOT_FOUND\n *\n * @param {URL} url\n * @returns {boolean}\n */\nfunction fileExists(url) {\n const stats = statSync(url, {throwIfNoEntry: false});\n const isFile = stats ? stats.isFile() : undefined;\n return isFile === null || isFile === undefined ? false : isFile\n}\n\n/**\n * @param {URL} packageJsonUrl\n * @param {PackageConfig} packageConfig\n * @param {URL} base\n * @returns {URL}\n */\nfunction legacyMainResolve(packageJsonUrl, packageConfig, base) {\n /** @type {URL | undefined} */\n let guess;\n if (packageConfig.main !== undefined) {\n guess = new URL(packageConfig.main, packageJsonUrl);\n // Note: fs check redundances will be handled by Descriptor cache here.\n if (fileExists(guess)) return guess\n\n const tries = [\n `./${packageConfig.main}.js`,\n `./${packageConfig.main}.json`,\n `./${packageConfig.main}.node`,\n `./${packageConfig.main}/index.js`,\n `./${packageConfig.main}/index.json`,\n `./${packageConfig.main}/index.node`\n ];\n let i = -1;\n\n while (++i < tries.length) {\n guess = new URL(tries[i], packageJsonUrl);\n if (fileExists(guess)) break\n guess = undefined;\n }\n\n if (guess) {\n emitLegacyIndexDeprecation(\n guess,\n packageJsonUrl,\n base,\n packageConfig.main\n );\n return guess\n }\n // Fallthrough.\n }\n\n const tries = ['./index.js', './index.json', './index.node'];\n let i = -1;\n\n while (++i < tries.length) {\n guess = new URL(tries[i], packageJsonUrl);\n if (fileExists(guess)) break\n guess = undefined;\n }\n\n if (guess) {\n emitLegacyIndexDeprecation(guess, packageJsonUrl, base, packageConfig.main);\n return guess\n }\n\n // Not found.\n throw new ERR_MODULE_NOT_FOUND(\n fileURLToPath(new URL('.', packageJsonUrl)),\n fileURLToPath(base)\n )\n}\n\n/**\n * @param {URL} resolved\n * @param {URL} base\n * @param {boolean} [preserveSymlinks]\n * @returns {URL}\n */\nfunction finalizeResolution(resolved, base, preserveSymlinks) {\n if (encodedSepRegEx.exec(resolved.pathname) !== null) {\n throw new ERR_INVALID_MODULE_SPECIFIER(\n resolved.pathname,\n 'must not include encoded \"/\" or \"\\\\\" characters',\n fileURLToPath(base)\n )\n }\n\n /** @type {string} */\n let filePath;\n\n try {\n filePath = fileURLToPath(resolved);\n } catch (error) {\n const cause = /** @type {ErrnoException} */ (error);\n Object.defineProperty(cause, 'input', {value: String(resolved)});\n Object.defineProperty(cause, 'module', {value: String(base)});\n throw cause\n }\n\n const stats = tryStatSync(\n filePath.endsWith('/') ? filePath.slice(-1) : filePath\n );\n\n if (stats.isDirectory()) {\n const error = new ERR_UNSUPPORTED_DIR_IMPORT(filePath, fileURLToPath(base));\n // @ts-expect-error Add this for `import.meta.resolve`.\n error.url = String(resolved);\n throw error\n }\n\n if (!stats.isFile()) {\n const error = new ERR_MODULE_NOT_FOUND(\n filePath || resolved.pathname,\n base && fileURLToPath(base),\n true\n );\n // @ts-expect-error Add this for `import.meta.resolve`.\n error.url = String(resolved);\n throw error\n }\n\n if (!preserveSymlinks) {\n const real = realpathSync(filePath);\n const {search, hash} = resolved;\n resolved = pathToFileURL(real + (filePath.endsWith(path.sep) ? '/' : ''));\n resolved.search = search;\n resolved.hash = hash;\n }\n\n return resolved\n}\n\n/**\n * @param {string} specifier\n * @param {URL | undefined} packageJsonUrl\n * @param {URL} base\n * @returns {Error}\n */\nfunction importNotDefined(specifier, packageJsonUrl, base) {\n return new ERR_PACKAGE_IMPORT_NOT_DEFINED(\n specifier,\n packageJsonUrl && fileURLToPath(new URL('.', packageJsonUrl)),\n fileURLToPath(base)\n )\n}\n\n/**\n * @param {string} subpath\n * @param {URL} packageJsonUrl\n * @param {URL} base\n * @returns {Error}\n */\nfunction exportsNotFound(subpath, packageJsonUrl, base) {\n return new ERR_PACKAGE_PATH_NOT_EXPORTED(\n fileURLToPath(new URL('.', packageJsonUrl)),\n subpath,\n base && fileURLToPath(base)\n )\n}\n\n/**\n * @param {string} request\n * @param {string} match\n * @param {URL} packageJsonUrl\n * @param {boolean} internal\n * @param {URL} [base]\n * @returns {never}\n */\nfunction throwInvalidSubpath(request, match, packageJsonUrl, internal, base) {\n const reason = `request is not a valid match in pattern \"${match}\" for the \"${\n internal ? 'imports' : 'exports'\n }\" resolution of ${fileURLToPath(packageJsonUrl)}`;\n throw new ERR_INVALID_MODULE_SPECIFIER(\n request,\n reason,\n base && fileURLToPath(base)\n )\n}\n\n/**\n * @param {string} subpath\n * @param {unknown} target\n * @param {URL} packageJsonUrl\n * @param {boolean} internal\n * @param {URL} [base]\n * @returns {Error}\n */\nfunction invalidPackageTarget(subpath, target, packageJsonUrl, internal, base) {\n target =\n typeof target === 'object' && target !== null\n ? JSON.stringify(target, null, '')\n : `${target}`;\n\n return new ERR_INVALID_PACKAGE_TARGET(\n fileURLToPath(new URL('.', packageJsonUrl)),\n subpath,\n target,\n internal,\n base && fileURLToPath(base)\n )\n}\n\n/**\n * @param {string} target\n * @param {string} subpath\n * @param {string} match\n * @param {URL} packageJsonUrl\n * @param {URL} base\n * @param {boolean} pattern\n * @param {boolean} internal\n * @param {boolean} isPathMap\n * @param {Set | undefined} conditions\n * @returns {URL}\n */\nfunction resolvePackageTargetString(\n target,\n subpath,\n match,\n packageJsonUrl,\n base,\n pattern,\n internal,\n isPathMap,\n conditions\n) {\n if (subpath !== '' && !pattern && target[target.length - 1] !== '/')\n throw invalidPackageTarget(match, target, packageJsonUrl, internal, base)\n\n if (!target.startsWith('./')) {\n if (internal && !target.startsWith('../') && !target.startsWith('/')) {\n let isURL = false;\n\n try {\n new URL(target);\n isURL = true;\n } catch {\n // Continue regardless of error.\n }\n\n if (!isURL) {\n const exportTarget = pattern\n ? RegExpPrototypeSymbolReplace.call(\n patternRegEx,\n target,\n () => subpath\n )\n : target + subpath;\n\n return packageResolve(exportTarget, packageJsonUrl, conditions)\n }\n }\n\n throw invalidPackageTarget(match, target, packageJsonUrl, internal, base)\n }\n\n if (invalidSegmentRegEx.exec(target.slice(2)) !== null) {\n if (deprecatedInvalidSegmentRegEx.exec(target.slice(2)) === null) {\n if (!isPathMap) {\n const request = pattern\n ? match.replace('*', () => subpath)\n : match + subpath;\n const resolvedTarget = pattern\n ? RegExpPrototypeSymbolReplace.call(\n patternRegEx,\n target,\n () => subpath\n )\n : target;\n emitInvalidSegmentDeprecation(\n resolvedTarget,\n request,\n match,\n packageJsonUrl,\n internal,\n base,\n true\n );\n }\n } else {\n throw invalidPackageTarget(match, target, packageJsonUrl, internal, base)\n }\n }\n\n const resolved = new URL(target, packageJsonUrl);\n const resolvedPath = resolved.pathname;\n const packagePath = new URL('.', packageJsonUrl).pathname;\n\n if (!resolvedPath.startsWith(packagePath))\n throw invalidPackageTarget(match, target, packageJsonUrl, internal, base)\n\n if (subpath === '') return resolved\n\n if (invalidSegmentRegEx.exec(subpath) !== null) {\n const request = pattern\n ? match.replace('*', () => subpath)\n : match + subpath;\n if (deprecatedInvalidSegmentRegEx.exec(subpath) === null) {\n if (!isPathMap) {\n const resolvedTarget = pattern\n ? RegExpPrototypeSymbolReplace.call(\n patternRegEx,\n target,\n () => subpath\n )\n : target;\n emitInvalidSegmentDeprecation(\n resolvedTarget,\n request,\n match,\n packageJsonUrl,\n internal,\n base,\n false\n );\n }\n } else {\n throwInvalidSubpath(request, match, packageJsonUrl, internal, base);\n }\n }\n\n if (pattern) {\n return new URL(\n RegExpPrototypeSymbolReplace.call(\n patternRegEx,\n resolved.href,\n () => subpath\n )\n )\n }\n\n return new URL(subpath, resolved)\n}\n\n/**\n * @param {string} key\n * @returns {boolean}\n */\nfunction isArrayIndex(key) {\n const keyNumber = Number(key);\n if (`${keyNumber}` !== key) return false\n return keyNumber >= 0 && keyNumber < 0xff_ff_ff_ff\n}\n\n/**\n * @param {URL} packageJsonUrl\n * @param {unknown} target\n * @param {string} subpath\n * @param {string} packageSubpath\n * @param {URL} base\n * @param {boolean} pattern\n * @param {boolean} internal\n * @param {boolean} isPathMap\n * @param {Set | undefined} conditions\n * @returns {URL | null}\n */\nfunction resolvePackageTarget(\n packageJsonUrl,\n target,\n subpath,\n packageSubpath,\n base,\n pattern,\n internal,\n isPathMap,\n conditions\n) {\n if (typeof target === 'string') {\n return resolvePackageTargetString(\n target,\n subpath,\n packageSubpath,\n packageJsonUrl,\n base,\n pattern,\n internal,\n isPathMap,\n conditions\n )\n }\n\n if (Array.isArray(target)) {\n /** @type {Array} */\n const targetList = target;\n if (targetList.length === 0) return null\n\n /** @type {ErrnoException | null | undefined} */\n let lastException;\n let i = -1;\n\n while (++i < targetList.length) {\n const targetItem = targetList[i];\n /** @type {URL | null} */\n let resolveResult;\n try {\n resolveResult = resolvePackageTarget(\n packageJsonUrl,\n targetItem,\n subpath,\n packageSubpath,\n base,\n pattern,\n internal,\n isPathMap,\n conditions\n );\n } catch (error) {\n const exception = /** @type {ErrnoException} */ (error);\n lastException = exception;\n if (exception.code === 'ERR_INVALID_PACKAGE_TARGET') continue\n throw error\n }\n\n if (resolveResult === undefined) continue\n\n if (resolveResult === null) {\n lastException = null;\n continue\n }\n\n return resolveResult\n }\n\n if (lastException === undefined || lastException === null) {\n return null\n }\n\n throw lastException\n }\n\n if (typeof target === 'object' && target !== null) {\n const keys = Object.getOwnPropertyNames(target);\n let i = -1;\n\n while (++i < keys.length) {\n const key = keys[i];\n if (isArrayIndex(key)) {\n throw new ERR_INVALID_PACKAGE_CONFIG(\n fileURLToPath(packageJsonUrl),\n base,\n '\"exports\" cannot contain numeric property keys.'\n )\n }\n }\n\n i = -1;\n\n while (++i < keys.length) {\n const key = keys[i];\n if (key === 'default' || (conditions && conditions.has(key))) {\n // @ts-expect-error: indexable.\n const conditionalTarget = /** @type {unknown} */ (target[key]);\n const resolveResult = resolvePackageTarget(\n packageJsonUrl,\n conditionalTarget,\n subpath,\n packageSubpath,\n base,\n pattern,\n internal,\n isPathMap,\n conditions\n );\n if (resolveResult === undefined) continue\n return resolveResult\n }\n }\n\n return null\n }\n\n if (target === null) {\n return null\n }\n\n throw invalidPackageTarget(\n packageSubpath,\n target,\n packageJsonUrl,\n internal,\n base\n )\n}\n\n/**\n * @param {unknown} exports\n * @param {URL} packageJsonUrl\n * @param {URL} base\n * @returns {boolean}\n */\nfunction isConditionalExportsMainSugar(exports, packageJsonUrl, base) {\n if (typeof exports === 'string' || Array.isArray(exports)) return true\n if (typeof exports !== 'object' || exports === null) return false\n\n const keys = Object.getOwnPropertyNames(exports);\n let isConditionalSugar = false;\n let i = 0;\n let j = -1;\n while (++j < keys.length) {\n const key = keys[j];\n const curIsConditionalSugar = key === '' || key[0] !== '.';\n if (i++ === 0) {\n isConditionalSugar = curIsConditionalSugar;\n } else if (isConditionalSugar !== curIsConditionalSugar) {\n throw new ERR_INVALID_PACKAGE_CONFIG(\n fileURLToPath(packageJsonUrl),\n base,\n '\"exports\" cannot contain some keys starting with \\'.\\' and some not.' +\n ' The exports object must either be an object of package subpath keys' +\n ' or an object of main entry condition name keys only.'\n )\n }\n }\n\n return isConditionalSugar\n}\n\n/**\n * @param {string} match\n * @param {URL} pjsonUrl\n * @param {URL} base\n */\nfunction emitTrailingSlashPatternDeprecation(match, pjsonUrl, base) {\n // @ts-expect-error: apparently it does exist, TS.\n if (process.noDeprecation) {\n return\n }\n\n const pjsonPath = fileURLToPath(pjsonUrl);\n if (emittedPackageWarnings.has(pjsonPath + '|' + match)) return\n emittedPackageWarnings.add(pjsonPath + '|' + match);\n process.emitWarning(\n `Use of deprecated trailing slash pattern mapping \"${match}\" in the ` +\n `\"exports\" field module resolution of the package at ${pjsonPath}${\n base ? ` imported from ${fileURLToPath(base)}` : ''\n }. Mapping specifiers ending in \"/\" is no longer supported.`,\n 'DeprecationWarning',\n 'DEP0155'\n );\n}\n\n/**\n * @param {URL} packageJsonUrl\n * @param {string} packageSubpath\n * @param {Record} packageConfig\n * @param {URL} base\n * @param {Set | undefined} conditions\n * @returns {URL}\n */\nfunction packageExportsResolve(\n packageJsonUrl,\n packageSubpath,\n packageConfig,\n base,\n conditions\n) {\n let exports = packageConfig.exports;\n\n if (isConditionalExportsMainSugar(exports, packageJsonUrl, base)) {\n exports = {'.': exports};\n }\n\n if (\n own.call(exports, packageSubpath) &&\n !packageSubpath.includes('*') &&\n !packageSubpath.endsWith('/')\n ) {\n // @ts-expect-error: indexable.\n const target = exports[packageSubpath];\n const resolveResult = resolvePackageTarget(\n packageJsonUrl,\n target,\n '',\n packageSubpath,\n base,\n false,\n false,\n false,\n conditions\n );\n if (resolveResult === null || resolveResult === undefined) {\n throw exportsNotFound(packageSubpath, packageJsonUrl, base)\n }\n\n return resolveResult\n }\n\n let bestMatch = '';\n let bestMatchSubpath = '';\n const keys = Object.getOwnPropertyNames(exports);\n let i = -1;\n\n while (++i < keys.length) {\n const key = keys[i];\n const patternIndex = key.indexOf('*');\n\n if (\n patternIndex !== -1 &&\n packageSubpath.startsWith(key.slice(0, patternIndex))\n ) {\n // When this reaches EOL, this can throw at the top of the whole function:\n //\n // if (StringPrototypeEndsWith(packageSubpath, '/'))\n // throwInvalidSubpath(packageSubpath)\n //\n // To match \"imports\" and the spec.\n if (packageSubpath.endsWith('/')) {\n emitTrailingSlashPatternDeprecation(\n packageSubpath,\n packageJsonUrl,\n base\n );\n }\n\n const patternTrailer = key.slice(patternIndex + 1);\n\n if (\n packageSubpath.length >= key.length &&\n packageSubpath.endsWith(patternTrailer) &&\n patternKeyCompare(bestMatch, key) === 1 &&\n key.lastIndexOf('*') === patternIndex\n ) {\n bestMatch = key;\n bestMatchSubpath = packageSubpath.slice(\n patternIndex,\n packageSubpath.length - patternTrailer.length\n );\n }\n }\n }\n\n if (bestMatch) {\n // @ts-expect-error: indexable.\n const target = /** @type {unknown} */ (exports[bestMatch]);\n const resolveResult = resolvePackageTarget(\n packageJsonUrl,\n target,\n bestMatchSubpath,\n bestMatch,\n base,\n true,\n false,\n packageSubpath.endsWith('/'),\n conditions\n );\n\n if (resolveResult === null || resolveResult === undefined) {\n throw exportsNotFound(packageSubpath, packageJsonUrl, base)\n }\n\n return resolveResult\n }\n\n throw exportsNotFound(packageSubpath, packageJsonUrl, base)\n}\n\n/**\n * @param {string} a\n * @param {string} b\n */\nfunction patternKeyCompare(a, b) {\n const aPatternIndex = a.indexOf('*');\n const bPatternIndex = b.indexOf('*');\n const baseLengthA = aPatternIndex === -1 ? a.length : aPatternIndex + 1;\n const baseLengthB = bPatternIndex === -1 ? b.length : bPatternIndex + 1;\n if (baseLengthA > baseLengthB) return -1\n if (baseLengthB > baseLengthA) return 1\n if (aPatternIndex === -1) return 1\n if (bPatternIndex === -1) return -1\n if (a.length > b.length) return -1\n if (b.length > a.length) return 1\n return 0\n}\n\n/**\n * @param {string} name\n * @param {URL} base\n * @param {Set} [conditions]\n * @returns {URL}\n */\nfunction packageImportsResolve(name, base, conditions) {\n if (name === '#' || name.startsWith('#/') || name.endsWith('/')) {\n const reason = 'is not a valid internal imports specifier name';\n throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base))\n }\n\n /** @type {URL | undefined} */\n let packageJsonUrl;\n\n const packageConfig = getPackageScopeConfig(base);\n\n if (packageConfig.exists) {\n packageJsonUrl = pathToFileURL(packageConfig.pjsonPath);\n const imports = packageConfig.imports;\n if (imports) {\n if (own.call(imports, name) && !name.includes('*')) {\n const resolveResult = resolvePackageTarget(\n packageJsonUrl,\n imports[name],\n '',\n name,\n base,\n false,\n true,\n false,\n conditions\n );\n if (resolveResult !== null && resolveResult !== undefined) {\n return resolveResult\n }\n } else {\n let bestMatch = '';\n let bestMatchSubpath = '';\n const keys = Object.getOwnPropertyNames(imports);\n let i = -1;\n\n while (++i < keys.length) {\n const key = keys[i];\n const patternIndex = key.indexOf('*');\n\n if (patternIndex !== -1 && name.startsWith(key.slice(0, -1))) {\n const patternTrailer = key.slice(patternIndex + 1);\n if (\n name.length >= key.length &&\n name.endsWith(patternTrailer) &&\n patternKeyCompare(bestMatch, key) === 1 &&\n key.lastIndexOf('*') === patternIndex\n ) {\n bestMatch = key;\n bestMatchSubpath = name.slice(\n patternIndex,\n name.length - patternTrailer.length\n );\n }\n }\n }\n\n if (bestMatch) {\n const target = imports[bestMatch];\n const resolveResult = resolvePackageTarget(\n packageJsonUrl,\n target,\n bestMatchSubpath,\n bestMatch,\n base,\n true,\n true,\n false,\n conditions\n );\n\n if (resolveResult !== null && resolveResult !== undefined) {\n return resolveResult\n }\n }\n }\n }\n }\n\n throw importNotDefined(name, packageJsonUrl, base)\n}\n\n// Note: In Node.js, `getPackageType` is here.\n// To prevent a circular dependency, we move it to\n// `resolve-get-package-type.js`.\n\n/**\n * @param {string} specifier\n * @param {URL} base\n */\nfunction parsePackageName(specifier, base) {\n let separatorIndex = specifier.indexOf('/');\n let validPackageName = true;\n let isScoped = false;\n if (specifier[0] === '@') {\n isScoped = true;\n if (separatorIndex === -1 || specifier.length === 0) {\n validPackageName = false;\n } else {\n separatorIndex = specifier.indexOf('/', separatorIndex + 1);\n }\n }\n\n const packageName =\n separatorIndex === -1 ? specifier : specifier.slice(0, separatorIndex);\n\n // Package name cannot have leading . and cannot have percent-encoding or\n // \\\\ separators.\n if (invalidPackageNameRegEx.exec(packageName) !== null) {\n validPackageName = false;\n }\n\n if (!validPackageName) {\n throw new ERR_INVALID_MODULE_SPECIFIER(\n specifier,\n 'is not a valid package name',\n fileURLToPath(base)\n )\n }\n\n const packageSubpath =\n '.' + (separatorIndex === -1 ? '' : specifier.slice(separatorIndex));\n\n return {packageName, packageSubpath, isScoped}\n}\n\n/**\n * @param {string} specifier\n * @param {URL} base\n * @param {Set | undefined} conditions\n * @returns {URL}\n */\nfunction packageResolve(specifier, base, conditions) {\n if (builtinModules.includes(specifier)) {\n return new URL('node:' + specifier)\n }\n\n const {packageName, packageSubpath, isScoped} = parsePackageName(\n specifier,\n base\n );\n\n // ResolveSelf\n const packageConfig = getPackageScopeConfig(base);\n\n // Can’t test.\n /* c8 ignore next 16 */\n if (packageConfig.exists) {\n const packageJsonUrl = pathToFileURL(packageConfig.pjsonPath);\n if (\n packageConfig.name === packageName &&\n packageConfig.exports !== undefined &&\n packageConfig.exports !== null\n ) {\n return packageExportsResolve(\n packageJsonUrl,\n packageSubpath,\n packageConfig,\n base,\n conditions\n )\n }\n }\n\n let packageJsonUrl = new URL(\n './node_modules/' + packageName + '/package.json',\n base\n );\n let packageJsonPath = fileURLToPath(packageJsonUrl);\n /** @type {string} */\n let lastPath;\n do {\n const stat = tryStatSync(packageJsonPath.slice(0, -13));\n if (!stat.isDirectory()) {\n lastPath = packageJsonPath;\n packageJsonUrl = new URL(\n (isScoped ? '../../../../node_modules/' : '../../../node_modules/') +\n packageName +\n '/package.json',\n packageJsonUrl\n );\n packageJsonPath = fileURLToPath(packageJsonUrl);\n continue\n }\n\n // Package match.\n const packageConfig = packageJsonReader.read(packageJsonPath, {\n base,\n specifier\n });\n if (packageConfig.exports !== undefined && packageConfig.exports !== null) {\n return packageExportsResolve(\n packageJsonUrl,\n packageSubpath,\n packageConfig,\n base,\n conditions\n )\n }\n\n if (packageSubpath === '.') {\n return legacyMainResolve(packageJsonUrl, packageConfig, base)\n }\n\n return new URL(packageSubpath, packageJsonUrl)\n // Cross-platform root check.\n } while (packageJsonPath.length !== lastPath.length)\n\n throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base), false)\n}\n\n/**\n * @param {string} specifier\n * @returns {boolean}\n */\nfunction isRelativeSpecifier(specifier) {\n if (specifier[0] === '.') {\n if (specifier.length === 1 || specifier[1] === '/') return true\n if (\n specifier[1] === '.' &&\n (specifier.length === 2 || specifier[2] === '/')\n ) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * @param {string} specifier\n * @returns {boolean}\n */\nfunction shouldBeTreatedAsRelativeOrAbsolutePath(specifier) {\n if (specifier === '') return false\n if (specifier[0] === '/') return true\n return isRelativeSpecifier(specifier)\n}\n\n/**\n * The “Resolver Algorithm Specification” as detailed in the Node docs (which is\n * sync and slightly lower-level than `resolve`).\n *\n * @param {string} specifier\n * `/example.js`, `./example.js`, `../example.js`, `some-package`, `fs`, etc.\n * @param {URL} base\n * Full URL (to a file) that `specifier` is resolved relative from.\n * @param {Set} [conditions]\n * Conditions.\n * @param {boolean} [preserveSymlinks]\n * Keep symlinks instead of resolving them.\n * @returns {URL}\n * A URL object to the found thing.\n */\nfunction moduleResolve(specifier, base, conditions, preserveSymlinks) {\n const protocol = base.protocol;\n const isRemote = protocol === 'http:' || protocol === 'https:';\n // Order swapped from spec for minor perf gain.\n // Ok since relative URLs cannot parse as URLs.\n /** @type {URL | undefined} */\n let resolved;\n\n if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) {\n resolved = new URL(specifier, base);\n } else if (!isRemote && specifier[0] === '#') {\n resolved = packageImportsResolve(specifier, base, conditions);\n } else {\n try {\n resolved = new URL(specifier);\n } catch {\n if (!isRemote) {\n resolved = packageResolve(specifier, base, conditions);\n }\n }\n }\n\n assert(resolved !== undefined, 'expected to be defined');\n\n if (resolved.protocol !== 'file:') {\n return resolved\n }\n\n return finalizeResolution(resolved, base, preserveSymlinks)\n}\n\n/**\n * @param {string} specifier\n * @param {URL | undefined} parsed\n * @param {URL | undefined} parsedParentURL\n */\nfunction checkIfDisallowedImport(specifier, parsed, parsedParentURL) {\n if (parsedParentURL) {\n // Avoid accessing the `protocol` property due to the lazy getters.\n const parentProtocol = parsedParentURL.protocol;\n\n if (parentProtocol === 'http:' || parentProtocol === 'https:') {\n if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) {\n // Avoid accessing the `protocol` property due to the lazy getters.\n const parsedProtocol = parsed?.protocol;\n\n // `data:` and `blob:` disallowed due to allowing file: access via\n // indirection\n if (\n parsedProtocol &&\n parsedProtocol !== 'https:' &&\n parsedProtocol !== 'http:'\n ) {\n throw new ERR_NETWORK_IMPORT_DISALLOWED(\n specifier,\n parsedParentURL,\n 'remote imports cannot import from a local location.'\n )\n }\n\n return {url: parsed?.href || ''}\n }\n\n if (builtinModules.includes(specifier)) {\n throw new ERR_NETWORK_IMPORT_DISALLOWED(\n specifier,\n parsedParentURL,\n 'remote imports cannot import from a local location.'\n )\n }\n\n throw new ERR_NETWORK_IMPORT_DISALLOWED(\n specifier,\n parsedParentURL,\n 'only relative and absolute specifiers are supported.'\n )\n }\n }\n}\n\n// Note: this is from:\n// \n/**\n * Checks if a value has the shape of a WHATWG URL object.\n *\n * Using a symbol or instanceof would not be able to recognize URL objects\n * coming from other implementations (e.g. in Electron), so instead we are\n * checking some well known properties for a lack of a better test.\n *\n * We use `href` and `protocol` as they are the only properties that are\n * easy to retrieve and calculate due to the lazy nature of the getters.\n *\n * @template {unknown} Value\n * @param {Value} self\n * @returns {Value is URL}\n */\nfunction isURL(self) {\n return Boolean(\n self &&\n typeof self === 'object' &&\n 'href' in self &&\n typeof self.href === 'string' &&\n 'protocol' in self &&\n typeof self.protocol === 'string' &&\n self.href &&\n self.protocol\n )\n}\n\n/**\n * Validate user-input in `context` supplied by a custom loader.\n *\n * @param {unknown} parentURL\n * @returns {asserts parentURL is URL | string | undefined}\n */\nfunction throwIfInvalidParentURL(parentURL) {\n if (parentURL === undefined) {\n return // Main entry point, so no parent\n }\n\n if (typeof parentURL !== 'string' && !isURL(parentURL)) {\n throw new codes.ERR_INVALID_ARG_TYPE(\n 'parentURL',\n ['string', 'URL'],\n parentURL\n )\n }\n}\n\n/**\n * @param {string} specifier\n * @param {{parentURL?: string, conditions?: Array}} context\n * @returns {{url: string, format?: string | null}}\n */\nfunction defaultResolve(specifier, context = {}) {\n const {parentURL} = context;\n assert(parentURL !== undefined, 'expected `parentURL` to be defined');\n throwIfInvalidParentURL(parentURL);\n\n /** @type {URL | undefined} */\n let parsedParentURL;\n if (parentURL) {\n try {\n parsedParentURL = new URL(parentURL);\n } catch {\n // Ignore exception\n }\n }\n\n /** @type {URL | undefined} */\n let parsed;\n try {\n parsed = shouldBeTreatedAsRelativeOrAbsolutePath(specifier)\n ? new URL(specifier, parsedParentURL)\n : new URL(specifier);\n\n // Avoid accessing the `protocol` property due to the lazy getters.\n const protocol = parsed.protocol;\n\n if (protocol === 'data:') {\n return {url: parsed.href, format: null}\n }\n } catch {\n // Ignore exception\n }\n\n // There are multiple deep branches that can either throw or return; instead\n // of duplicating that deeply nested logic for the possible returns, DRY and\n // check for a return. This seems the least gnarly.\n const maybeReturn = checkIfDisallowedImport(\n specifier,\n parsed,\n parsedParentURL\n );\n\n if (maybeReturn) return maybeReturn\n\n // This must come after checkIfDisallowedImport\n if (parsed && parsed.protocol === 'node:') return {url: specifier}\n\n const conditions = getConditionsSet(context.conditions);\n\n const url = moduleResolve(specifier, new URL(parentURL), conditions, false);\n\n return {\n // Do NOT cast `url` to a string: that will work even when there are real\n // problems, silencing them\n url: url.href,\n format: defaultGetFormatWithoutErrors(url, {parentURL})\n }\n}\n\n/**\n * @typedef {import('./lib/errors.js').ErrnoException} ErrnoException\n */\n\n\n/**\n * Match `import.meta.resolve` except that `parent` is required (you can pass\n * `import.meta.url`).\n *\n * @param {string} specifier\n * The module specifier to resolve relative to parent\n * (`/example.js`, `./example.js`, `../example.js`, `some-package`, `fs`,\n * etc).\n * @param {string} parent\n * The absolute parent module URL to resolve from.\n * You must pass `import.meta.url` or something else.\n * @returns {string}\n * Returns a string to a full `file:`, `data:`, or `node:` URL\n * to the found thing.\n */\nfunction resolve(specifier, parent) {\n if (!parent) {\n throw new Error(\n 'Please pass `parent`: `import-meta-resolve` cannot ponyfill that'\n )\n }\n\n try {\n return defaultResolve(specifier, {parentURL: parent}).url\n } catch (error) {\n // See: \n const exception = /** @type {ErrnoException} */ (error);\n\n if (\n (exception.code === 'ERR_UNSUPPORTED_DIR_IMPORT' ||\n exception.code === 'ERR_MODULE_NOT_FOUND') &&\n typeof exception.url === 'string'\n ) {\n return exception.url\n }\n\n throw error\n }\n}\n\nexport { moduleResolve, resolve };\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/core/node_modules/semver/CHANGELOG.md b/node_modules/@babel/core/node_modules/semver/CHANGELOG.md deleted file mode 100644 index f567dd3fe7f2..000000000000 --- a/node_modules/@babel/core/node_modules/semver/CHANGELOG.md +++ /dev/null @@ -1,70 +0,0 @@ -# changes log - -## 6.2.0 - -* Coerce numbers to strings when passed to semver.coerce() -* Add `rtl` option to coerce from right to left - -## 6.1.3 - -* Handle X-ranges properly in includePrerelease mode - -## 6.1.2 - -* Do not throw when testing invalid version strings - -## 6.1.1 - -* Add options support for semver.coerce() -* Handle undefined version passed to Range.test - -## 6.1.0 - -* Add semver.compareBuild function -* Support `*` in semver.intersects - -## 6.0 - -* Fix `intersects` logic. - - This is technically a bug fix, but since it is also a change to behavior - that may require users updating their code, it is marked as a major - version increment. - -## 5.7 - -* Add `minVersion` method - -## 5.6 - -* Move boolean `loose` param to an options object, with - backwards-compatibility protection. -* Add ability to opt out of special prerelease version handling with - the `includePrerelease` option flag. - -## 5.5 - -* Add version coercion capabilities - -## 5.4 - -* Add intersection checking - -## 5.3 - -* Add `minSatisfying` method - -## 5.2 - -* Add `prerelease(v)` that returns prerelease components - -## 5.1 - -* Add Backus-Naur for ranges -* Remove excessively cute inspection methods - -## 5.0 - -* Remove AMD/Browserified build artifacts -* Fix ltr and gtr when using the `*` range -* Fix for range `*` with a prerelease identifier diff --git a/node_modules/@babel/core/node_modules/semver/package.json b/node_modules/@babel/core/node_modules/semver/package.json index bdd442f50022..6b970a629ffe 100644 --- a/node_modules/@babel/core/node_modules/semver/package.json +++ b/node_modules/@babel/core/node_modules/semver/package.json @@ -1,19 +1,26 @@ { "name": "semver", - "version": "6.3.0", + "version": "6.3.1", "description": "The semantic version parser used by npm.", "main": "semver.js", "scripts": { - "test": "tap", - "preversion": "npm test", - "postversion": "npm publish", - "postpublish": "git push origin --follow-tags" + "test": "tap test/ --100 --timeout=30", + "lint": "echo linting disabled", + "postlint": "template-oss-check", + "template-oss-apply": "template-oss-apply --force", + "lintfix": "npm run lint -- --fix", + "snap": "tap test/ --100 --timeout=30", + "posttest": "npm run lint" }, "devDependencies": { - "tap": "^14.3.1" + "@npmcli/template-oss": "4.17.0", + "tap": "^12.7.0" }, "license": "ISC", - "repository": "https://github.com/npm/node-semver", + "repository": { + "type": "git", + "url": "https://github.com/npm/node-semver.git" + }, "bin": { "semver": "./bin/semver.js" }, @@ -22,7 +29,10 @@ "range.bnf", "semver.js" ], - "tap": { - "check-coverage": true + "author": "GitHub Inc.", + "templateOSS": { + "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", + "content": "./scripts/template-oss", + "version": "4.17.0" } } diff --git a/node_modules/@babel/core/node_modules/semver/semver.js b/node_modules/@babel/core/node_modules/semver/semver.js index 636fa4365a17..39319c13cac2 100644 --- a/node_modules/@babel/core/node_modules/semver/semver.js +++ b/node_modules/@babel/core/node_modules/semver/semver.js @@ -26,8 +26,11 @@ var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || // Max safe segment length for coercion. var MAX_SAFE_COMPONENT_LENGTH = 16 +var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6 + // The actual regexps go on exports.re var re = exports.re = [] +var safeRe = exports.safeRe = [] var src = exports.src = [] var t = exports.tokens = {} var R = 0 @@ -36,6 +39,31 @@ function tok (n) { t[n] = R++ } +var LETTERDASHNUMBER = '[a-zA-Z0-9-]' + +// Replace some greedy regex tokens to prevent regex dos issues. These regex are +// used internally via the safeRe object since all inputs in this library get +// normalized first to trim and collapse all extra whitespace. The original +// regexes are exported for userland consumption and lower level usage. A +// future breaking change could export the safer regex only with a note that +// all input should have extra whitespace removed. +var safeRegexReplacements = [ + ['\\s', 1], + ['\\d', MAX_LENGTH], + [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH], +] + +function makeSafeRe (value) { + for (var i = 0; i < safeRegexReplacements.length; i++) { + var token = safeRegexReplacements[i][0] + var max = safeRegexReplacements[i][1] + value = value + .split(token + '*').join(token + '{0,' + max + '}') + .split(token + '+').join(token + '{1,' + max + '}') + } + return value +} + // The following Regular Expressions can be used for tokenizing, // validating, and parsing SemVer version strings. @@ -45,14 +73,14 @@ function tok (n) { tok('NUMERICIDENTIFIER') src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*' tok('NUMERICIDENTIFIERLOOSE') -src[t.NUMERICIDENTIFIERLOOSE] = '[0-9]+' +src[t.NUMERICIDENTIFIERLOOSE] = '\\d+' // ## Non-numeric Identifier // Zero or more digits, followed by a letter or hyphen, and then zero or // more letters, digits, or hyphens. tok('NONNUMERICIDENTIFIER') -src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' +src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-]' + LETTERDASHNUMBER + '*' // ## Main Version // Three dot-separated numeric identifiers. @@ -94,7 +122,7 @@ src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] + // Any combination of digits, letters, or hyphens. tok('BUILDIDENTIFIER') -src[t.BUILDIDENTIFIER] = '[0-9A-Za-z-]+' +src[t.BUILDIDENTIFIER] = LETTERDASHNUMBER + '+' // ## Build Metadata // Plus sign, followed by one or more period-separated build metadata @@ -174,6 +202,7 @@ src[t.COERCE] = '(^|[^\\d])' + '(?:$|[^\\d])' tok('COERCERTL') re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g') +safeRe[t.COERCERTL] = new RegExp(makeSafeRe(src[t.COERCE]), 'g') // Tilde ranges. // Meaning is "reasonably at or greater than" @@ -183,6 +212,7 @@ src[t.LONETILDE] = '(?:~>?)' tok('TILDETRIM') src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+' re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g') +safeRe[t.TILDETRIM] = new RegExp(makeSafeRe(src[t.TILDETRIM]), 'g') var tildeTrimReplace = '$1~' tok('TILDE') @@ -198,6 +228,7 @@ src[t.LONECARET] = '(?:\\^)' tok('CARETTRIM') src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+' re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g') +safeRe[t.CARETTRIM] = new RegExp(makeSafeRe(src[t.CARETTRIM]), 'g') var caretTrimReplace = '$1^' tok('CARET') @@ -219,6 +250,7 @@ src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] + // this one has to use the /g flag re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g') +safeRe[t.COMPARATORTRIM] = new RegExp(makeSafeRe(src[t.COMPARATORTRIM]), 'g') var comparatorTrimReplace = '$1$2$3' // Something like `1.2.3 - 1.2.4` @@ -247,6 +279,14 @@ for (var i = 0; i < R; i++) { debug(i, src[i]) if (!re[i]) { re[i] = new RegExp(src[i]) + + // Replace all greedy whitespace to prevent regex dos issues. These regex are + // used internally via the safeRe object since all inputs in this library get + // normalized first to trim and collapse all extra whitespace. The original + // regexes are exported for userland consumption and lower level usage. A + // future breaking change could export the safer regex only with a note that + // all input should have extra whitespace removed. + safeRe[i] = new RegExp(makeSafeRe(src[i])) } } @@ -271,7 +311,7 @@ function parse (version, options) { return null } - var r = options.loose ? re[t.LOOSE] : re[t.FULL] + var r = options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL] if (!r.test(version)) { return null } @@ -326,7 +366,7 @@ function SemVer (version, options) { this.options = options this.loose = !!options.loose - var m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) + var m = version.trim().match(options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]) if (!m) { throw new TypeError('Invalid Version: ' + version) @@ -771,6 +811,7 @@ function Comparator (comp, options) { return new Comparator(comp, options) } + comp = comp.trim().split(/\s+/).join(' ') debug('comparator', comp, options) this.options = options this.loose = !!options.loose @@ -787,7 +828,7 @@ function Comparator (comp, options) { var ANY = {} Comparator.prototype.parse = function (comp) { - var r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] + var r = this.options.loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR] var m = comp.match(r) if (!m) { @@ -911,9 +952,16 @@ function Range (range, options) { this.loose = !!options.loose this.includePrerelease = !!options.includePrerelease - // First, split based on boolean or || + // First reduce all whitespace as much as possible so we do not have to rely + // on potentially slow regexes like \s*. This is then stored and used for + // future error messages as well. this.raw = range - this.set = range.split(/\s*\|\|\s*/).map(function (range) { + .trim() + .split(/\s+/) + .join(' ') + + // First, split based on boolean or || + this.set = this.raw.split('||').map(function (range) { return this.parseRange(range.trim()) }, this).filter(function (c) { // throw out any that are not relevant for whatever reason @@ -921,7 +969,7 @@ function Range (range, options) { }) if (!this.set.length) { - throw new TypeError('Invalid SemVer Range: ' + range) + throw new TypeError('Invalid SemVer Range: ' + this.raw) } this.format() @@ -940,20 +988,19 @@ Range.prototype.toString = function () { Range.prototype.parseRange = function (range) { var loose = this.options.loose - range = range.trim() // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - var hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] + var hr = loose ? safeRe[t.HYPHENRANGELOOSE] : safeRe[t.HYPHENRANGE] range = range.replace(hr, hyphenReplace) debug('hyphen replace', range) // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[t.COMPARATORTRIM]) + range = range.replace(safeRe[t.COMPARATORTRIM], comparatorTrimReplace) + debug('comparator trim', range, safeRe[t.COMPARATORTRIM]) // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) + range = range.replace(safeRe[t.TILDETRIM], tildeTrimReplace) // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) + range = range.replace(safeRe[t.CARETTRIM], caretTrimReplace) // normalize spaces range = range.split(/\s+/).join(' ') @@ -961,7 +1008,7 @@ Range.prototype.parseRange = function (range) { // At this point, the range is completely trimmed and // ready to be split into comparators. - var compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] + var compRe = loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR] var set = range.split(' ').map(function (comp) { return parseComparator(comp, this.options) }, this).join(' ').split(/\s+/) @@ -1061,7 +1108,7 @@ function replaceTildes (comp, options) { } function replaceTilde (comp, options) { - var r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] + var r = options.loose ? safeRe[t.TILDELOOSE] : safeRe[t.TILDE] return comp.replace(r, function (_, M, m, p, pr) { debug('tilde', comp, _, M, m, p, pr) var ret @@ -1102,7 +1149,7 @@ function replaceCarets (comp, options) { function replaceCaret (comp, options) { debug('caret', comp, options) - var r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] + var r = options.loose ? safeRe[t.CARETLOOSE] : safeRe[t.CARET] return comp.replace(r, function (_, M, m, p, pr) { debug('caret', comp, _, M, m, p, pr) var ret @@ -1161,7 +1208,7 @@ function replaceXRanges (comp, options) { function replaceXRange (comp, options) { comp = comp.trim() - var r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] + var r = options.loose ? safeRe[t.XRANGELOOSE] : safeRe[t.XRANGE] return comp.replace(r, function (ret, gtlt, M, m, p, pr) { debug('xRange', comp, ret, gtlt, M, m, p, pr) var xM = isX(M) @@ -1236,7 +1283,7 @@ function replaceXRange (comp, options) { function replaceStars (comp, options) { debug('replaceStars', comp, options) // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[t.STAR], '') + return comp.trim().replace(safeRe[t.STAR], '') } // This function is passed to string.replace(re[t.HYPHENRANGE]) @@ -1562,7 +1609,7 @@ function coerce (version, options) { var match = null if (!options.rtl) { - match = version.match(re[t.COERCE]) + match = version.match(safeRe[t.COERCE]) } else { // Find the right-most coercible string that does not share // a terminus with a more left-ward coercible string. @@ -1573,17 +1620,17 @@ function coerce (version, options) { // Stop when we get a match that ends at the string end, since no // coercible string can be more right-ward without the same terminus. var next - while ((next = re[t.COERCERTL].exec(version)) && + while ((next = safeRe[t.COERCERTL].exec(version)) && (!match || match.index + match[0].length !== version.length) ) { if (!match || next.index + next[0].length !== match.index + match[0].length) { match = next } - re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length + safeRe[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length } // leave it in a clean state - re[t.COERCERTL].lastIndex = -1 + safeRe[t.COERCERTL].lastIndex = -1 } if (match === null) { diff --git a/node_modules/@babel/core/package.json b/node_modules/@babel/core/package.json index 42ee7aaa4a41..f8b1da02155f 100644 --- a/node_modules/@babel/core/package.json +++ b/node_modules/@babel/core/package.json @@ -1,6 +1,6 @@ { "name": "@babel/core", - "version": "7.20.5", + "version": "7.23.9", "description": "Babel compiler core.", "main": "./lib/index.js", "author": "The Babel Team (https://babel.dev/team)", @@ -46,35 +46,37 @@ "./src/transform-file.ts": "./src/transform-file-browser.ts" }, "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.5", - "@babel/parser": "^7.20.5", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5", - "convert-source-map": "^1.7.0", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "devDependencies": { - "@babel/helper-transform-fixture-test-runner": "^7.19.4", - "@babel/plugin-syntax-flow": "^7.18.6", - "@babel/plugin-transform-flow-strip-types": "^7.19.0", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/preset-env": "^7.20.2", - "@jridgewell/trace-mapping": "^0.3.8", - "@types/convert-source-map": "^1.5.1", + "@babel/helper-transform-fixture-test-runner": "^7.23.9", + "@babel/plugin-syntax-flow": "^7.23.3", + "@babel/plugin-transform-flow-strip-types": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/preset-env": "^7.23.9", + "@babel/preset-typescript": "^7.23.3", + "@jridgewell/trace-mapping": "^0.3.17", + "@types/convert-source-map": "^2.0.0", "@types/debug": "^4.1.0", "@types/gensync": "^1.0.0", "@types/resolve": "^1.3.2", "@types/semver": "^5.4.0", - "rimraf": "^3.0.0" + "rimraf": "^3.0.0", + "ts-node": "^10.9.1" }, "type": "commonjs" } \ No newline at end of file diff --git a/node_modules/@babel/core/src/config/files/index-browser.ts b/node_modules/@babel/core/src/config/files/index-browser.ts index 08f91f6a6751..d25736325575 100644 --- a/node_modules/@babel/core/src/config/files/index-browser.ts +++ b/node_modules/@babel/core/src/config/files/index-browser.ts @@ -5,9 +5,9 @@ import type { IgnoreFile, RelativeConfig, FilePackageData, -} from "./types"; +} from "./types.ts"; -import type { CallerMetadata } from "../validation/options"; +import type { CallerMetadata } from "../validation/options.ts"; export type { ConfigFile, IgnoreFile, RelativeConfig, FilePackageData }; diff --git a/node_modules/@babel/core/src/config/files/index.ts b/node_modules/@babel/core/src/config/files/index.ts index 31e856027e59..b138e8da9a7c 100644 --- a/node_modules/@babel/core/src/config/files/index.ts +++ b/node_modules/@babel/core/src/config/files/index.ts @@ -3,9 +3,9 @@ type indexType = typeof import("./index"); // Kind of gross, but essentially asserting that the exports of this module are the same as the // exports of index-browser, since this file may be replaced at bundle time with index-browser. -({} as any as indexBrowserType as indexType); +({}) as any as indexBrowserType as indexType; -export { findPackageData } from "./package"; +export { findPackageData } from "./package.ts"; export { findConfigUpwards, @@ -14,17 +14,16 @@ export { loadConfig, resolveShowConfigPath, ROOT_CONFIG_FILENAMES, -} from "./configuration"; +} from "./configuration.ts"; export type { ConfigFile, IgnoreFile, RelativeConfig, FilePackageData, -} from "./types"; -export { loadPlugin, loadPreset } from "./plugins"; - -import gensync from "gensync"; -import * as plugins from "./plugins"; - -export const resolvePlugin = gensync(plugins.resolvePlugin).sync; -export const resolvePreset = gensync(plugins.resolvePreset).sync; +} from "./types.ts"; +export { + loadPlugin, + loadPreset, + resolvePlugin, + resolvePreset, +} from "./plugins.ts"; diff --git a/node_modules/@babel/core/src/config/resolve-targets-browser.ts b/node_modules/@babel/core/src/config/resolve-targets-browser.ts index 60745dd7dca6..f93294d29814 100644 --- a/node_modules/@babel/core/src/config/resolve-targets-browser.ts +++ b/node_modules/@babel/core/src/config/resolve-targets-browser.ts @@ -1,4 +1,4 @@ -import type { ValidatedOptions } from "./validation/options"; +import type { ValidatedOptions } from "./validation/options.ts"; import getTargets, { type InputTargets, } from "@babel/helper-compilation-targets"; diff --git a/node_modules/@babel/core/src/config/resolve-targets.ts b/node_modules/@babel/core/src/config/resolve-targets.ts index a7d9a790e99a..6271c9f42dec 100644 --- a/node_modules/@babel/core/src/config/resolve-targets.ts +++ b/node_modules/@babel/core/src/config/resolve-targets.ts @@ -3,9 +3,9 @@ type nodeType = typeof import("./resolve-targets"); // Kind of gross, but essentially asserting that the exports of this module are the same as the // exports of index-browser, since this file may be replaced at bundle time with index-browser. -({} as any as browserType as nodeType); +({}) as any as browserType as nodeType; -import type { ValidatedOptions } from "./validation/options"; +import type { ValidatedOptions } from "./validation/options.ts"; import path from "path"; import getTargets, { type InputTargets, diff --git a/node_modules/@babel/core/src/transform-file.ts b/node_modules/@babel/core/src/transform-file.ts index c493425db86b..6bc2f8369d45 100644 --- a/node_modules/@babel/core/src/transform-file.ts +++ b/node_modules/@babel/core/src/transform-file.ts @@ -1,10 +1,10 @@ import gensync, { type Handler } from "gensync"; -import loadConfig from "./config"; -import type { InputOptions, ResolvedConfig } from "./config"; -import { run } from "./transformation"; -import type { FileResult, FileResultCallback } from "./transformation"; -import * as fs from "./gensync-utils/fs"; +import loadConfig from "./config/index.ts"; +import type { InputOptions, ResolvedConfig } from "./config/index.ts"; +import { run } from "./transformation/index.ts"; +import type { FileResult, FileResultCallback } from "./transformation/index.ts"; +import * as fs from "./gensync-utils/fs.ts"; type transformFileBrowserType = typeof import("./transform-file-browser"); type transformFileType = typeof import("./transform-file"); @@ -12,7 +12,7 @@ type transformFileType = typeof import("./transform-file"); // Kind of gross, but essentially asserting that the exports of this module are the same as the // exports of transform-file-browser, since this file may be replaced at bundle time with // transform-file-browser. -({} as any as transformFileBrowserType as transformFileType); +({}) as any as transformFileBrowserType as transformFileType; const transformFileRunner = gensync(function* ( filename: string, @@ -40,7 +40,7 @@ export function transformFile( export function transformFile( ...args: Parameters ) { - return transformFileRunner.errback(...args); + transformFileRunner.errback(...args); } export function transformFileSync( diff --git a/node_modules/@babel/generator/lib/buffer.js b/node_modules/@babel/generator/lib/buffer.js index b9574f87de88..aad6c0bf36cb 100644 --- a/node_modules/@babel/generator/lib/buffer.js +++ b/node_modules/@babel/generator/lib/buffer.js @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; class Buffer { - constructor(map) { + constructor(map, indentChar) { this._map = null; this._buf = ""; this._str = ""; @@ -14,6 +14,8 @@ class Buffer { this._queue = []; this._queueCursor = 0; this._canMarkIdName = true; + this._indentChar = ""; + this._fastIndentations = []; this._position = { line: 1, column: 0 @@ -26,6 +28,10 @@ class Buffer { filename: undefined }; this._map = map; + this._indentChar = indentChar; + for (let i = 0; i < 64; i++) { + this._fastIndentations.push(indentChar.repeat(i)); + } this._allocQueue(); } _allocQueue() { @@ -116,8 +122,9 @@ class Buffer { const sourcePosition = this._sourcePosition; this._pushQueue(char, 1, sourcePosition.line, sourcePosition.column, sourcePosition.filename); } - queueIndentation(char, repeat) { - this._pushQueue(char, repeat, undefined, undefined, undefined); + queueIndentation(repeat) { + if (repeat === 0) return; + this._pushQueue(-1, repeat, undefined, undefined, undefined); } _flush() { const queueCursor = this._queueCursor; @@ -130,7 +137,16 @@ class Buffer { } _appendChar(char, repeat, sourcePos) { this._last = char; - this._str += repeat > 1 ? String.fromCharCode(char).repeat(repeat) : String.fromCharCode(char); + if (char === -1) { + const fastIndentation = this._fastIndentations[repeat]; + if (fastIndentation !== undefined) { + this._str += fastIndentation; + } else { + this._str += repeat > 1 ? this._indentChar.repeat(repeat) : this._indentChar; + } + } else { + this._str += repeat > 1 ? String.fromCharCode(char).repeat(repeat) : String.fromCharCode(char); + } if (char !== 10) { this._mark(sourcePos.line, sourcePos.column, sourcePos.identifierName, sourcePos.identifierNamePos, sourcePos.filename); this._position.column += repeat; @@ -188,7 +204,7 @@ class Buffer { } _mark(line, column, identifierName, identifierNamePos, filename) { var _this$_map; - (_this$_map = this._map) == null ? void 0 : _this$_map.mark(this._position, line, column, identifierName, identifierNamePos, filename); + (_this$_map = this._map) == null || _this$_map.mark(this._position, line, column, identifierName, identifierNamePos, filename); } removeTrailingNewline() { const queueCursor = this._queueCursor; diff --git a/node_modules/@babel/generator/lib/buffer.js.map b/node_modules/@babel/generator/lib/buffer.js.map index 6bc916be030b..3605a0589f8f 100644 --- a/node_modules/@babel/generator/lib/buffer.js.map +++ b/node_modules/@babel/generator/lib/buffer.js.map @@ -1 +1 @@ -{"version":3,"names":["Buffer","constructor","map","_map","_buf","_str","_appendCount","_last","_queue","_queueCursor","_canMarkIdName","_position","line","column","_sourcePosition","identifierName","undefined","identifierNamePos","filename","_allocQueue","queue","i","push","char","repeat","_pushQueue","cursor","length","item","_popQueue","Error","get","_flush","result","code","trimRight","decodedMap","getDecoded","__mergedMap","resultMap","value","Object","defineProperty","writable","rawMappings","mappings","getRawMappings","append","str","maybeNewline","_append","appendChar","_appendChar","sourcePosition","queueIndentation","queueCursor","sourcePos","String","fromCharCode","_mark","len","position","charCodeAt","indexOf","last","_this$_map","mark","removeTrailingNewline","removeLastSemicolon","getLastChar","getNewlineCount","count","endsWithCharAndNewline","lastCp","hasContent","exactSource","loc","cb","source","prop","_normalizePosition","sourceWithOffset","columnOffset","withSource","pos","target","Math","max","getCurrentColumn","lastIndex","getCurrentLine","exports","default"],"sources":["../src/buffer.ts"],"sourcesContent":["import type SourceMap from \"./source-map.ts\";\nimport * as charcodes from \"charcodes\";\n\nexport type Pos = {\n line: number;\n column: number;\n};\nexport type Loc = {\n start?: Pos;\n end?: Pos;\n filename?: string;\n};\ntype SourcePos = {\n line: number | undefined;\n column: number | undefined;\n identifierName: string | undefined;\n filename: string | undefined;\n};\ntype InternalSourcePos = SourcePos & { identifierNamePos: Pos };\n\ntype QueueItem = {\n char: number;\n repeat: number;\n line: number | undefined;\n column: number | undefined;\n identifierName: undefined; // Not used, it always undefined.\n identifierNamePos: undefined; // Not used, it always undefined.\n filename: string | undefined;\n};\n\nexport default class Buffer {\n constructor(map?: SourceMap | null) {\n this._map = map;\n\n this._allocQueue();\n }\n\n _map: SourceMap = null;\n _buf = \"\";\n _str = \"\";\n _appendCount = 0;\n _last = 0;\n _queue: QueueItem[] = [];\n _queueCursor = 0;\n _canMarkIdName = true;\n\n _position = {\n line: 1,\n column: 0,\n };\n _sourcePosition: InternalSourcePos = {\n identifierName: undefined,\n identifierNamePos: undefined,\n line: undefined,\n column: undefined,\n filename: undefined,\n };\n\n _allocQueue() {\n const queue = this._queue;\n\n for (let i = 0; i < 16; i++) {\n queue.push({\n char: 0,\n repeat: 1,\n line: undefined,\n column: undefined,\n identifierName: undefined,\n identifierNamePos: undefined,\n filename: \"\",\n });\n }\n }\n\n _pushQueue(\n char: number,\n repeat: number,\n line: number | undefined,\n column: number | undefined,\n filename: string | undefined,\n ) {\n const cursor = this._queueCursor;\n if (cursor === this._queue.length) {\n this._allocQueue();\n }\n const item = this._queue[cursor];\n item.char = char;\n item.repeat = repeat;\n item.line = line;\n item.column = column;\n item.filename = filename;\n\n this._queueCursor++;\n }\n\n _popQueue(): QueueItem {\n if (this._queueCursor === 0) {\n throw new Error(\"Cannot pop from empty queue\");\n }\n return this._queue[--this._queueCursor];\n }\n\n /**\n * Get the final string output from the buffer, along with the sourcemap if one exists.\n */\n\n get() {\n this._flush();\n\n const map = this._map;\n const result = {\n // Whatever trim is used here should not execute a regex against the\n // source string since it may be arbitrarily large after all transformations\n code: (this._buf + this._str).trimRight(),\n // Decoded sourcemap is free to generate.\n decodedMap: map?.getDecoded(),\n // Used as a marker for backwards compatibility. We moved input map merging\n // into the generator. We cannot merge the input map a second time, so the\n // presence of this field tells us we've already done the work.\n get __mergedMap() {\n return this.map;\n },\n // Encoding the sourcemap is moderately CPU expensive.\n get map() {\n const resultMap = map ? map.get() : null;\n result.map = resultMap;\n return resultMap;\n },\n set map(value) {\n Object.defineProperty(result, \"map\", { value, writable: true });\n },\n // Retrieving the raw mappings is very memory intensive.\n get rawMappings() {\n const mappings = map?.getRawMappings();\n result.rawMappings = mappings;\n return mappings;\n },\n set rawMappings(value) {\n Object.defineProperty(result, \"rawMappings\", { value, writable: true });\n },\n };\n\n return result;\n }\n\n /**\n * Add a string to the buffer that cannot be reverted.\n */\n\n append(str: string, maybeNewline: boolean): void {\n this._flush();\n\n this._append(str, this._sourcePosition, maybeNewline);\n }\n\n appendChar(char: number): void {\n this._flush();\n this._appendChar(char, 1, this._sourcePosition);\n }\n\n /**\n * Add a string to the buffer than can be reverted.\n */\n queue(char: number): void {\n // Drop trailing spaces when a newline is inserted.\n if (char === charcodes.lineFeed) {\n while (this._queueCursor !== 0) {\n const char = this._queue[this._queueCursor - 1].char;\n if (char !== charcodes.space && char !== charcodes.tab) {\n break;\n }\n\n this._queueCursor--;\n }\n }\n\n const sourcePosition = this._sourcePosition;\n this._pushQueue(\n char,\n 1,\n sourcePosition.line,\n sourcePosition.column,\n sourcePosition.filename,\n );\n }\n\n /**\n * Same as queue, but this indentation will never have a sourcemap marker.\n */\n queueIndentation(char: number, repeat: number): void {\n this._pushQueue(char, repeat, undefined, undefined, undefined);\n }\n\n _flush(): void {\n const queueCursor = this._queueCursor;\n const queue = this._queue;\n for (let i = 0; i < queueCursor; i++) {\n const item: QueueItem = queue[i];\n this._appendChar(item.char, item.repeat, item);\n }\n this._queueCursor = 0;\n }\n\n _appendChar(\n char: number,\n repeat: number,\n sourcePos: InternalSourcePos,\n ): void {\n this._last = char;\n\n this._str +=\n repeat > 1\n ? String.fromCharCode(char).repeat(repeat)\n : String.fromCharCode(char);\n\n if (char !== charcodes.lineFeed) {\n this._mark(\n sourcePos.line,\n sourcePos.column,\n sourcePos.identifierName,\n sourcePos.identifierNamePos,\n sourcePos.filename,\n );\n this._position.column += repeat;\n } else {\n this._position.line++;\n this._position.column = 0;\n }\n\n if (this._canMarkIdName) {\n sourcePos.identifierName = undefined;\n sourcePos.identifierNamePos = undefined;\n }\n }\n\n _append(\n str: string,\n sourcePos: InternalSourcePos,\n maybeNewline: boolean,\n ): void {\n const len = str.length;\n const position = this._position;\n\n this._last = str.charCodeAt(len - 1);\n\n if (++this._appendCount > 4096) {\n +this._str; // Unexplainable huge performance boost. Ref: https://github.com/davidmarkclements/flatstr License: MIT\n this._buf += this._str;\n this._str = str;\n this._appendCount = 0;\n } else {\n this._str += str;\n }\n\n if (!maybeNewline && !this._map) {\n position.column += len;\n return;\n }\n\n const { column, identifierName, identifierNamePos, filename } = sourcePos;\n let line = sourcePos.line;\n\n if (\n (identifierName != null || identifierNamePos != null) &&\n this._canMarkIdName\n ) {\n sourcePos.identifierName = undefined;\n sourcePos.identifierNamePos = undefined;\n }\n\n // Search for newline chars. We search only for `\\n`, since both `\\r` and\n // `\\r\\n` are normalized to `\\n` during parse. We exclude `\\u2028` and\n // `\\u2029` for performance reasons, they're so uncommon that it's probably\n // ok. It's also unclear how other sourcemap utilities handle them...\n let i = str.indexOf(\"\\n\");\n let last = 0;\n\n // If the string starts with a newline char, then adding a mark is redundant.\n // This catches both \"no newlines\" and \"newline after several chars\".\n if (i !== 0) {\n this._mark(line, column, identifierName, identifierNamePos, filename);\n }\n\n // Now, find each remaining newline char in the string.\n while (i !== -1) {\n position.line++;\n position.column = 0;\n last = i + 1;\n\n // We mark the start of each line, which happens directly after this newline char\n // unless this is the last char.\n // When manually adding multi-line content (such as a comment), `line` will be `undefined`.\n if (last < len && line !== undefined) {\n this._mark(++line, 0, null, null, filename);\n }\n i = str.indexOf(\"\\n\", last);\n }\n position.column += len - last;\n }\n\n _mark(\n line: number | undefined,\n column: number | undefined,\n identifierName: string | undefined,\n identifierNamePos: Pos | undefined,\n filename: string | undefined,\n ): void {\n this._map?.mark(\n this._position,\n line,\n column,\n identifierName,\n identifierNamePos,\n filename,\n );\n }\n\n removeTrailingNewline(): void {\n const queueCursor = this._queueCursor;\n if (\n queueCursor !== 0 &&\n this._queue[queueCursor - 1].char === charcodes.lineFeed\n ) {\n this._queueCursor--;\n }\n }\n\n removeLastSemicolon(): void {\n const queueCursor = this._queueCursor;\n if (\n queueCursor !== 0 &&\n this._queue[queueCursor - 1].char === charcodes.semicolon\n ) {\n this._queueCursor--;\n }\n }\n\n getLastChar(): number {\n const queueCursor = this._queueCursor;\n return queueCursor !== 0 ? this._queue[queueCursor - 1].char : this._last;\n }\n\n /**\n * This will only detect at most 1 newline after a call to `flush()`,\n * but this has not been found so far, and an accurate count can be achieved if needed later.\n */\n getNewlineCount(): number {\n const queueCursor = this._queueCursor;\n let count = 0;\n if (queueCursor === 0) return this._last === charcodes.lineFeed ? 1 : 0;\n for (let i = queueCursor - 1; i >= 0; i--) {\n if (this._queue[i].char !== charcodes.lineFeed) {\n break;\n }\n count++;\n }\n return count === queueCursor && this._last === charcodes.lineFeed\n ? count + 1\n : count;\n }\n\n /**\n * check if current _last + queue ends with newline, return the character before newline\n *\n * @param {*} ch\n * @memberof Buffer\n */\n endsWithCharAndNewline(): number {\n const queue = this._queue;\n const queueCursor = this._queueCursor;\n if (queueCursor !== 0) {\n // every element in queue is one-length whitespace string\n const lastCp = queue[queueCursor - 1].char;\n if (lastCp !== charcodes.lineFeed) return;\n if (queueCursor > 1) {\n return queue[queueCursor - 2].char;\n } else {\n return this._last;\n }\n }\n // We assume that everything being matched is at most a single token plus some whitespace,\n // which everything currently is, but otherwise we'd have to expand _last or check _buf.\n }\n\n hasContent(): boolean {\n return this._queueCursor !== 0 || !!this._last;\n }\n\n /**\n * Certain sourcemap usecases expect mappings to be more accurate than\n * Babel's generic sourcemap handling allows. For now, we special-case\n * identifiers to allow for the primary cases to work.\n * The goal of this line is to ensure that the map output from Babel will\n * have an exact range on identifiers in the output code. Without this\n * line, Babel would potentially include some number of trailing tokens\n * that are printed after the identifier, but before another location has\n * been assigned.\n * This allows tooling like Rollup and Webpack to more accurately perform\n * their own transformations. Most importantly, this allows the import/export\n * transformations performed by those tools to loose less information when\n * applying their own transformations on top of the code and map results\n * generated by Babel itself.\n *\n * The primary example of this is the snippet:\n *\n * import mod from \"mod\";\n * mod();\n *\n * With this line, there will be one mapping range over \"mod\" and another\n * over \"();\", where previously it would have been a single mapping.\n */\n exactSource(loc: Loc | undefined, cb: () => void) {\n if (!this._map) {\n cb();\n return;\n }\n\n this.source(\"start\", loc);\n // @ts-expect-error identifierName is not defined\n const identifierName = loc.identifierName;\n const sourcePos = this._sourcePosition;\n if (identifierName) {\n this._canMarkIdName = false;\n sourcePos.identifierName = identifierName;\n }\n cb();\n\n if (identifierName) {\n this._canMarkIdName = true;\n sourcePos.identifierName = undefined;\n sourcePos.identifierNamePos = undefined;\n }\n this.source(\"end\", loc);\n }\n\n /**\n * Sets a given position as the current source location so generated code after this call\n * will be given this position in the sourcemap.\n */\n\n source(prop: \"start\" | \"end\", loc: Loc | undefined): void {\n if (!this._map) return;\n\n // Since this is called extremely often, we reuse the same _sourcePosition\n // object for the whole lifetime of the buffer.\n this._normalizePosition(prop, loc, 0);\n }\n\n sourceWithOffset(\n prop: \"start\" | \"end\",\n loc: Loc | undefined,\n columnOffset: number,\n ): void {\n if (!this._map) return;\n\n this._normalizePosition(prop, loc, columnOffset);\n }\n\n /**\n * Call a callback with a specific source location\n */\n\n withSource(prop: \"start\" | \"end\", loc: Loc, cb: () => void): void {\n if (this._map) {\n this.source(prop, loc);\n }\n\n cb();\n }\n\n _normalizePosition(prop: \"start\" | \"end\", loc: Loc, columnOffset: number) {\n const pos = loc[prop];\n const target = this._sourcePosition;\n\n if (pos) {\n target.line = pos.line;\n // TODO: Fix https://github.com/babel/babel/issues/15712 in downstream\n target.column = Math.max(pos.column + columnOffset, 0);\n target.filename = loc.filename;\n }\n }\n\n getCurrentColumn(): number {\n const queue = this._queue;\n const queueCursor = this._queueCursor;\n\n let lastIndex = -1;\n let len = 0;\n for (let i = 0; i < queueCursor; i++) {\n const item = queue[i];\n if (item.char === charcodes.lineFeed) {\n lastIndex = len;\n }\n len += item.repeat;\n }\n\n return lastIndex === -1 ? this._position.column + len : len - 1 - lastIndex;\n }\n\n getCurrentLine(): number {\n let count = 0;\n\n const queue = this._queue;\n for (let i = 0; i < this._queueCursor; i++) {\n if (queue[i].char === charcodes.lineFeed) {\n count++;\n }\n }\n\n return this._position.line + count;\n }\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["Buffer","constructor","map","indentChar","_map","_buf","_str","_appendCount","_last","_queue","_queueCursor","_canMarkIdName","_indentChar","_fastIndentations","_position","line","column","_sourcePosition","identifierName","undefined","identifierNamePos","filename","i","push","repeat","_allocQueue","queue","char","_pushQueue","cursor","length","item","_popQueue","Error","get","_flush","result","code","trimRight","decodedMap","getDecoded","__mergedMap","resultMap","value","Object","defineProperty","writable","rawMappings","mappings","getRawMappings","append","str","maybeNewline","_append","appendChar","_appendChar","sourcePosition","queueIndentation","queueCursor","sourcePos","fastIndentation","String","fromCharCode","_mark","len","position","charCodeAt","indexOf","last","_this$_map","mark","removeTrailingNewline","removeLastSemicolon","getLastChar","getNewlineCount","count","endsWithCharAndNewline","lastCp","hasContent","exactSource","loc","cb","source","prop","_normalizePosition","sourceWithOffset","columnOffset","withSource","pos","target","Math","max","getCurrentColumn","lastIndex","getCurrentLine","exports","default"],"sources":["../src/buffer.ts"],"sourcesContent":["import type SourceMap from \"./source-map.ts\";\nimport * as charcodes from \"charcodes\";\n\nexport type Pos = {\n line: number;\n column: number;\n};\nexport type Loc = {\n start?: Pos;\n end?: Pos;\n filename?: string;\n};\ntype SourcePos = {\n line: number | undefined;\n column: number | undefined;\n identifierName: string | undefined;\n filename: string | undefined;\n};\ntype InternalSourcePos = SourcePos & { identifierNamePos: Pos };\n\ntype QueueItem = {\n char: number;\n repeat: number;\n line: number | undefined;\n column: number | undefined;\n identifierName: undefined; // Not used, it always undefined.\n identifierNamePos: undefined; // Not used, it always undefined.\n filename: string | undefined;\n};\n\nexport default class Buffer {\n constructor(map: SourceMap | null, indentChar: string) {\n this._map = map;\n this._indentChar = indentChar;\n\n for (let i = 0; i < 64; i++) {\n this._fastIndentations.push(indentChar.repeat(i));\n }\n\n this._allocQueue();\n }\n\n _map: SourceMap = null;\n _buf = \"\";\n _str = \"\";\n _appendCount = 0;\n _last = 0;\n _queue: QueueItem[] = [];\n _queueCursor = 0;\n _canMarkIdName = true;\n _indentChar = \"\";\n _fastIndentations: string[] = [];\n\n _position = {\n line: 1,\n column: 0,\n };\n _sourcePosition: InternalSourcePos = {\n identifierName: undefined,\n identifierNamePos: undefined,\n line: undefined,\n column: undefined,\n filename: undefined,\n };\n\n _allocQueue() {\n const queue = this._queue;\n\n for (let i = 0; i < 16; i++) {\n queue.push({\n char: 0,\n repeat: 1,\n line: undefined,\n column: undefined,\n identifierName: undefined,\n identifierNamePos: undefined,\n filename: \"\",\n });\n }\n }\n\n _pushQueue(\n char: number,\n repeat: number,\n line: number | undefined,\n column: number | undefined,\n filename: string | undefined,\n ) {\n const cursor = this._queueCursor;\n if (cursor === this._queue.length) {\n this._allocQueue();\n }\n const item = this._queue[cursor];\n item.char = char;\n item.repeat = repeat;\n item.line = line;\n item.column = column;\n item.filename = filename;\n\n this._queueCursor++;\n }\n\n _popQueue(): QueueItem {\n if (this._queueCursor === 0) {\n throw new Error(\"Cannot pop from empty queue\");\n }\n return this._queue[--this._queueCursor];\n }\n\n /**\n * Get the final string output from the buffer, along with the sourcemap if one exists.\n */\n\n get() {\n this._flush();\n\n const map = this._map;\n const result = {\n // Whatever trim is used here should not execute a regex against the\n // source string since it may be arbitrarily large after all transformations\n code: (this._buf + this._str).trimRight(),\n // Decoded sourcemap is free to generate.\n decodedMap: map?.getDecoded(),\n // Used as a marker for backwards compatibility. We moved input map merging\n // into the generator. We cannot merge the input map a second time, so the\n // presence of this field tells us we've already done the work.\n get __mergedMap() {\n return this.map;\n },\n // Encoding the sourcemap is moderately CPU expensive.\n get map() {\n const resultMap = map ? map.get() : null;\n result.map = resultMap;\n return resultMap;\n },\n set map(value) {\n Object.defineProperty(result, \"map\", { value, writable: true });\n },\n // Retrieving the raw mappings is very memory intensive.\n get rawMappings() {\n const mappings = map?.getRawMappings();\n result.rawMappings = mappings;\n return mappings;\n },\n set rawMappings(value) {\n Object.defineProperty(result, \"rawMappings\", { value, writable: true });\n },\n };\n\n return result;\n }\n\n /**\n * Add a string to the buffer that cannot be reverted.\n */\n\n append(str: string, maybeNewline: boolean): void {\n this._flush();\n\n this._append(str, this._sourcePosition, maybeNewline);\n }\n\n appendChar(char: number): void {\n this._flush();\n this._appendChar(char, 1, this._sourcePosition);\n }\n\n /**\n * Add a string to the buffer than can be reverted.\n */\n queue(char: number): void {\n // Drop trailing spaces when a newline is inserted.\n if (char === charcodes.lineFeed) {\n while (this._queueCursor !== 0) {\n const char = this._queue[this._queueCursor - 1].char;\n if (char !== charcodes.space && char !== charcodes.tab) {\n break;\n }\n\n this._queueCursor--;\n }\n }\n\n const sourcePosition = this._sourcePosition;\n this._pushQueue(\n char,\n 1,\n sourcePosition.line,\n sourcePosition.column,\n sourcePosition.filename,\n );\n }\n\n /**\n * Same as queue, but this indentation will never have a sourcemap marker.\n */\n queueIndentation(repeat: number): void {\n if (repeat === 0) return;\n this._pushQueue(-1, repeat, undefined, undefined, undefined);\n }\n\n _flush(): void {\n const queueCursor = this._queueCursor;\n const queue = this._queue;\n for (let i = 0; i < queueCursor; i++) {\n const item: QueueItem = queue[i];\n this._appendChar(item.char, item.repeat, item);\n }\n this._queueCursor = 0;\n }\n\n _appendChar(\n char: number,\n repeat: number,\n sourcePos: InternalSourcePos,\n ): void {\n this._last = char;\n\n if (char === -1) {\n const fastIndentation = this._fastIndentations[repeat];\n if (fastIndentation !== undefined) {\n this._str += fastIndentation;\n } else {\n this._str +=\n repeat > 1 ? this._indentChar.repeat(repeat) : this._indentChar;\n }\n } else {\n this._str +=\n repeat > 1\n ? String.fromCharCode(char).repeat(repeat)\n : String.fromCharCode(char);\n }\n\n if (char !== charcodes.lineFeed) {\n this._mark(\n sourcePos.line,\n sourcePos.column,\n sourcePos.identifierName,\n sourcePos.identifierNamePos,\n sourcePos.filename,\n );\n this._position.column += repeat;\n } else {\n this._position.line++;\n this._position.column = 0;\n }\n\n if (this._canMarkIdName) {\n sourcePos.identifierName = undefined;\n sourcePos.identifierNamePos = undefined;\n }\n }\n\n _append(\n str: string,\n sourcePos: InternalSourcePos,\n maybeNewline: boolean,\n ): void {\n const len = str.length;\n const position = this._position;\n\n this._last = str.charCodeAt(len - 1);\n\n if (++this._appendCount > 4096) {\n +this._str; // Unexplainable huge performance boost. Ref: https://github.com/davidmarkclements/flatstr License: MIT\n this._buf += this._str;\n this._str = str;\n this._appendCount = 0;\n } else {\n this._str += str;\n }\n\n if (!maybeNewline && !this._map) {\n position.column += len;\n return;\n }\n\n const { column, identifierName, identifierNamePos, filename } = sourcePos;\n let line = sourcePos.line;\n\n if (\n (identifierName != null || identifierNamePos != null) &&\n this._canMarkIdName\n ) {\n sourcePos.identifierName = undefined;\n sourcePos.identifierNamePos = undefined;\n }\n\n // Search for newline chars. We search only for `\\n`, since both `\\r` and\n // `\\r\\n` are normalized to `\\n` during parse. We exclude `\\u2028` and\n // `\\u2029` for performance reasons, they're so uncommon that it's probably\n // ok. It's also unclear how other sourcemap utilities handle them...\n let i = str.indexOf(\"\\n\");\n let last = 0;\n\n // If the string starts with a newline char, then adding a mark is redundant.\n // This catches both \"no newlines\" and \"newline after several chars\".\n if (i !== 0) {\n this._mark(line, column, identifierName, identifierNamePos, filename);\n }\n\n // Now, find each remaining newline char in the string.\n while (i !== -1) {\n position.line++;\n position.column = 0;\n last = i + 1;\n\n // We mark the start of each line, which happens directly after this newline char\n // unless this is the last char.\n // When manually adding multi-line content (such as a comment), `line` will be `undefined`.\n if (last < len && line !== undefined) {\n this._mark(++line, 0, null, null, filename);\n }\n i = str.indexOf(\"\\n\", last);\n }\n position.column += len - last;\n }\n\n _mark(\n line: number | undefined,\n column: number | undefined,\n identifierName: string | undefined,\n identifierNamePos: Pos | undefined,\n filename: string | undefined,\n ): void {\n this._map?.mark(\n this._position,\n line,\n column,\n identifierName,\n identifierNamePos,\n filename,\n );\n }\n\n removeTrailingNewline(): void {\n const queueCursor = this._queueCursor;\n if (\n queueCursor !== 0 &&\n this._queue[queueCursor - 1].char === charcodes.lineFeed\n ) {\n this._queueCursor--;\n }\n }\n\n removeLastSemicolon(): void {\n const queueCursor = this._queueCursor;\n if (\n queueCursor !== 0 &&\n this._queue[queueCursor - 1].char === charcodes.semicolon\n ) {\n this._queueCursor--;\n }\n }\n\n getLastChar(): number {\n const queueCursor = this._queueCursor;\n return queueCursor !== 0 ? this._queue[queueCursor - 1].char : this._last;\n }\n\n /**\n * This will only detect at most 1 newline after a call to `flush()`,\n * but this has not been found so far, and an accurate count can be achieved if needed later.\n */\n getNewlineCount(): number {\n const queueCursor = this._queueCursor;\n let count = 0;\n if (queueCursor === 0) return this._last === charcodes.lineFeed ? 1 : 0;\n for (let i = queueCursor - 1; i >= 0; i--) {\n if (this._queue[i].char !== charcodes.lineFeed) {\n break;\n }\n count++;\n }\n return count === queueCursor && this._last === charcodes.lineFeed\n ? count + 1\n : count;\n }\n\n /**\n * check if current _last + queue ends with newline, return the character before newline\n */\n endsWithCharAndNewline(): number {\n const queue = this._queue;\n const queueCursor = this._queueCursor;\n if (queueCursor !== 0) {\n // every element in queue is one-length whitespace string\n const lastCp = queue[queueCursor - 1].char;\n if (lastCp !== charcodes.lineFeed) return;\n if (queueCursor > 1) {\n return queue[queueCursor - 2].char;\n } else {\n return this._last;\n }\n }\n // We assume that everything being matched is at most a single token plus some whitespace,\n // which everything currently is, but otherwise we'd have to expand _last or check _buf.\n }\n\n hasContent(): boolean {\n return this._queueCursor !== 0 || !!this._last;\n }\n\n /**\n * Certain sourcemap usecases expect mappings to be more accurate than\n * Babel's generic sourcemap handling allows. For now, we special-case\n * identifiers to allow for the primary cases to work.\n * The goal of this line is to ensure that the map output from Babel will\n * have an exact range on identifiers in the output code. Without this\n * line, Babel would potentially include some number of trailing tokens\n * that are printed after the identifier, but before another location has\n * been assigned.\n * This allows tooling like Rollup and Webpack to more accurately perform\n * their own transformations. Most importantly, this allows the import/export\n * transformations performed by those tools to loose less information when\n * applying their own transformations on top of the code and map results\n * generated by Babel itself.\n *\n * The primary example of this is the snippet:\n *\n * import mod from \"mod\";\n * mod();\n *\n * With this line, there will be one mapping range over \"mod\" and another\n * over \"();\", where previously it would have been a single mapping.\n */\n exactSource(loc: Loc | undefined, cb: () => void) {\n if (!this._map) {\n cb();\n return;\n }\n\n this.source(\"start\", loc);\n // @ts-expect-error identifierName is not defined\n const identifierName = loc.identifierName;\n const sourcePos = this._sourcePosition;\n if (identifierName) {\n this._canMarkIdName = false;\n sourcePos.identifierName = identifierName;\n }\n cb();\n\n if (identifierName) {\n this._canMarkIdName = true;\n sourcePos.identifierName = undefined;\n sourcePos.identifierNamePos = undefined;\n }\n this.source(\"end\", loc);\n }\n\n /**\n * Sets a given position as the current source location so generated code after this call\n * will be given this position in the sourcemap.\n */\n\n source(prop: \"start\" | \"end\", loc: Loc | undefined): void {\n if (!this._map) return;\n\n // Since this is called extremely often, we reuse the same _sourcePosition\n // object for the whole lifetime of the buffer.\n this._normalizePosition(prop, loc, 0);\n }\n\n sourceWithOffset(\n prop: \"start\" | \"end\",\n loc: Loc | undefined,\n columnOffset: number,\n ): void {\n if (!this._map) return;\n\n this._normalizePosition(prop, loc, columnOffset);\n }\n\n /**\n * Call a callback with a specific source location\n */\n\n withSource(prop: \"start\" | \"end\", loc: Loc, cb: () => void): void {\n if (this._map) {\n this.source(prop, loc);\n }\n\n cb();\n }\n\n _normalizePosition(prop: \"start\" | \"end\", loc: Loc, columnOffset: number) {\n const pos = loc[prop];\n const target = this._sourcePosition;\n\n if (pos) {\n target.line = pos.line;\n // TODO: Fix https://github.com/babel/babel/issues/15712 in downstream\n target.column = Math.max(pos.column + columnOffset, 0);\n target.filename = loc.filename;\n }\n }\n\n getCurrentColumn(): number {\n const queue = this._queue;\n const queueCursor = this._queueCursor;\n\n let lastIndex = -1;\n let len = 0;\n for (let i = 0; i < queueCursor; i++) {\n const item = queue[i];\n if (item.char === charcodes.lineFeed) {\n lastIndex = len;\n }\n len += item.repeat;\n }\n\n return lastIndex === -1 ? this._position.column + len : len - 1 - lastIndex;\n }\n\n getCurrentLine(): number {\n let count = 0;\n\n const queue = this._queue;\n for (let i = 0; i < this._queueCursor; i++) {\n if (queue[i].char === charcodes.lineFeed) {\n count++;\n }\n }\n\n return this._position.line + count;\n }\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/generator/lib/generators/statements.js b/node_modules/@babel/generator/lib/generators/statements.js index dee0ad812e0d..4364c95100e2 100644 --- a/node_modules/@babel/generator/lib/generators/statements.js +++ b/node_modules/@babel/generator/lib/generators/statements.js @@ -117,10 +117,8 @@ function ForXStatement(node) { this.tokenChar(41); this.printBlock(node); } -const ForInStatement = ForXStatement; -exports.ForInStatement = ForInStatement; -const ForOfStatement = ForXStatement; -exports.ForOfStatement = ForOfStatement; +const ForInStatement = exports.ForInStatement = ForXStatement; +const ForOfStatement = exports.ForOfStatement = ForXStatement; function DoWhileStatement(node) { this.word("do"); this.space(); diff --git a/node_modules/@babel/generator/lib/generators/statements.js.map b/node_modules/@babel/generator/lib/generators/statements.js.map index 2055ed750572..1870309f76b5 100644 --- a/node_modules/@babel/generator/lib/generators/statements.js.map +++ b/node_modules/@babel/generator/lib/generators/statements.js.map @@ -1 +1 @@ -{"version":3,"names":["_t","require","isFor","isForStatement","isIfStatement","isStatement","WithStatement","node","word","space","token","print","object","printBlock","IfStatement","test","needsBlock","alternate","getLastStatement","consequent","newline","indent","printAndIndentOnComments","dedent","endsWith","statement","body","ForStatement","inForStatementInitCounter","init","update","WhileStatement","ForXStatement","isForOf","type","await","noIndentInnerCommentsHere","left","right","ForInStatement","exports","ForOfStatement","DoWhileStatement","semicolon","printStatementAfterKeyword","printer","parent","isLabel","printTerminatorless","BreakStatement","label","ContinueStatement","ReturnStatement","argument","ThrowStatement","LabeledStatement","TryStatement","block","handlers","handler","finalizer","CatchClause","param","typeAnnotation","SwitchStatement","discriminant","printSequence","cases","addNewlines","leading","cas","length","rightBrace","SwitchCase","DebuggerStatement","VariableDeclaration","declare","kind","hasInits","declar","declarations","printList","separator","undefined","VariableDeclarator","id","definite"],"sources":["../../src/generators/statements.ts"],"sourcesContent":["import type Printer from \"../printer.ts\";\nimport {\n isFor,\n isForStatement,\n isIfStatement,\n isStatement,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport * as charCodes from \"charcodes\";\n\nexport function WithStatement(this: Printer, node: t.WithStatement) {\n this.word(\"with\");\n this.space();\n this.token(\"(\");\n this.print(node.object, node);\n this.token(\")\");\n this.printBlock(node);\n}\n\nexport function IfStatement(this: Printer, node: t.IfStatement) {\n this.word(\"if\");\n this.space();\n this.token(\"(\");\n this.print(node.test, node);\n this.token(\")\");\n this.space();\n\n const needsBlock =\n node.alternate && isIfStatement(getLastStatement(node.consequent));\n if (needsBlock) {\n this.token(\"{\");\n this.newline();\n this.indent();\n }\n\n this.printAndIndentOnComments(node.consequent, node);\n\n if (needsBlock) {\n this.dedent();\n this.newline();\n this.token(\"}\");\n }\n\n if (node.alternate) {\n if (this.endsWith(charCodes.rightCurlyBrace)) this.space();\n this.word(\"else\");\n this.space();\n this.printAndIndentOnComments(node.alternate, node);\n }\n}\n\n// Recursively get the last statement.\nfunction getLastStatement(statement: t.Statement): t.Statement {\n // @ts-expect-error: If statement.body is empty or not a Node, isStatement will return false\n const { body } = statement;\n if (isStatement(body) === false) {\n return statement;\n }\n\n return getLastStatement(body);\n}\n\nexport function ForStatement(this: Printer, node: t.ForStatement) {\n this.word(\"for\");\n this.space();\n this.token(\"(\");\n\n this.inForStatementInitCounter++;\n this.print(node.init, node);\n this.inForStatementInitCounter--;\n this.token(\";\");\n\n if (node.test) {\n this.space();\n this.print(node.test, node);\n }\n this.token(\";\");\n\n if (node.update) {\n this.space();\n this.print(node.update, node);\n }\n\n this.token(\")\");\n this.printBlock(node);\n}\n\nexport function WhileStatement(this: Printer, node: t.WhileStatement) {\n this.word(\"while\");\n this.space();\n this.token(\"(\");\n this.print(node.test, node);\n this.token(\")\");\n this.printBlock(node);\n}\n\nfunction ForXStatement(this: Printer, node: t.ForXStatement) {\n this.word(\"for\");\n this.space();\n const isForOf = node.type === \"ForOfStatement\";\n if (isForOf && node.await) {\n this.word(\"await\");\n this.space();\n }\n this.noIndentInnerCommentsHere();\n this.token(\"(\");\n this.print(node.left, node);\n this.space();\n this.word(isForOf ? \"of\" : \"in\");\n this.space();\n this.print(node.right, node);\n this.token(\")\");\n this.printBlock(node);\n}\n\nexport const ForInStatement = ForXStatement;\nexport const ForOfStatement = ForXStatement;\n\nexport function DoWhileStatement(this: Printer, node: t.DoWhileStatement) {\n this.word(\"do\");\n this.space();\n this.print(node.body, node);\n this.space();\n this.word(\"while\");\n this.space();\n this.token(\"(\");\n this.print(node.test, node);\n this.token(\")\");\n this.semicolon();\n}\n\nfunction printStatementAfterKeyword(\n printer: Printer,\n node: t.Node,\n parent: t.Node,\n isLabel: boolean,\n) {\n if (node) {\n printer.space();\n printer.printTerminatorless(node, parent, isLabel);\n }\n\n printer.semicolon();\n}\n\nexport function BreakStatement(this: Printer, node: t.ContinueStatement) {\n this.word(\"break\");\n printStatementAfterKeyword(this, node.label, node, true);\n}\n\nexport function ContinueStatement(this: Printer, node: t.ContinueStatement) {\n this.word(\"continue\");\n printStatementAfterKeyword(this, node.label, node, true);\n}\n\nexport function ReturnStatement(this: Printer, node: t.ReturnStatement) {\n this.word(\"return\");\n printStatementAfterKeyword(this, node.argument, node, false);\n}\n\nexport function ThrowStatement(this: Printer, node: t.ThrowStatement) {\n this.word(\"throw\");\n printStatementAfterKeyword(this, node.argument, node, false);\n}\n\nexport function LabeledStatement(this: Printer, node: t.LabeledStatement) {\n this.print(node.label, node);\n this.token(\":\");\n this.space();\n this.print(node.body, node);\n}\n\nexport function TryStatement(this: Printer, node: t.TryStatement) {\n this.word(\"try\");\n this.space();\n this.print(node.block, node);\n this.space();\n\n // Esprima bug puts the catch clause in a `handlers` array.\n // see https://code.google.com/p/esprima/issues/detail?id=433\n // We run into this from regenerator generated ast.\n // @ts-expect-error todo(flow->ts) should ast node type be updated to support this?\n if (node.handlers) {\n // @ts-expect-error todo(flow->ts) should ast node type be updated to support this?\n this.print(node.handlers[0], node);\n } else {\n this.print(node.handler, node);\n }\n\n if (node.finalizer) {\n this.space();\n this.word(\"finally\");\n this.space();\n this.print(node.finalizer, node);\n }\n}\n\nexport function CatchClause(this: Printer, node: t.CatchClause) {\n this.word(\"catch\");\n this.space();\n if (node.param) {\n this.token(\"(\");\n this.print(node.param, node);\n this.print(node.param.typeAnnotation, node);\n this.token(\")\");\n this.space();\n }\n this.print(node.body, node);\n}\n\nexport function SwitchStatement(this: Printer, node: t.SwitchStatement) {\n this.word(\"switch\");\n this.space();\n this.token(\"(\");\n this.print(node.discriminant, node);\n this.token(\")\");\n this.space();\n this.token(\"{\");\n\n this.printSequence(node.cases, node, {\n indent: true,\n addNewlines(leading, cas) {\n if (!leading && node.cases[node.cases.length - 1] === cas) return -1;\n },\n });\n\n this.rightBrace(node);\n}\n\nexport function SwitchCase(this: Printer, node: t.SwitchCase) {\n if (node.test) {\n this.word(\"case\");\n this.space();\n this.print(node.test, node);\n this.token(\":\");\n } else {\n this.word(\"default\");\n this.token(\":\");\n }\n\n if (node.consequent.length) {\n this.newline();\n this.printSequence(node.consequent, node, { indent: true });\n }\n}\n\nexport function DebuggerStatement(this: Printer) {\n this.word(\"debugger\");\n this.semicolon();\n}\n\nexport function VariableDeclaration(\n this: Printer,\n node: t.VariableDeclaration,\n parent: t.Node,\n) {\n if (node.declare) {\n // TS\n this.word(\"declare\");\n this.space();\n }\n\n const { kind } = node;\n this.word(kind, kind === \"using\" || kind === \"await using\");\n this.space();\n\n let hasInits = false;\n // don't add whitespace to loop heads\n if (!isFor(parent)) {\n for (const declar of node.declarations) {\n if (declar.init) {\n // has an init so let's split it up over multiple lines\n hasInits = true;\n }\n }\n }\n\n //\n // use a pretty separator when we aren't in compact mode, have initializers and don't have retainLines on\n // this will format declarations like:\n //\n // let foo = \"bar\", bar = \"foo\";\n //\n // into\n //\n // let foo = \"bar\",\n // bar = \"foo\";\n //\n\n this.printList(node.declarations, node, {\n separator: hasInits\n ? function (this: Printer) {\n this.token(\",\");\n this.newline();\n }\n : undefined,\n indent: node.declarations.length > 1 ? true : false,\n });\n\n if (isFor(parent)) {\n // don't give semicolons to these nodes since they'll be inserted in the parent generator\n if (isForStatement(parent)) {\n if (parent.init === node) return;\n } else {\n if (parent.left === node) return;\n }\n }\n\n this.semicolon();\n}\n\nexport function VariableDeclarator(this: Printer, node: t.VariableDeclarator) {\n this.print(node.id, node);\n if (node.definite) this.token(\"!\"); // TS\n // @ts-expect-error todo(flow-ts) Property 'typeAnnotation' does not exist on type 'MemberExpression'.\n this.print(node.id.typeAnnotation, node);\n if (node.init) {\n this.space();\n this.token(\"=\");\n this.space();\n this.print(node.init, node);\n }\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_t","require","isFor","isForStatement","isIfStatement","isStatement","WithStatement","node","word","space","token","print","object","printBlock","IfStatement","test","needsBlock","alternate","getLastStatement","consequent","newline","indent","printAndIndentOnComments","dedent","endsWith","statement","body","ForStatement","inForStatementInitCounter","init","update","WhileStatement","ForXStatement","isForOf","type","await","noIndentInnerCommentsHere","left","right","ForInStatement","exports","ForOfStatement","DoWhileStatement","semicolon","printStatementAfterKeyword","printer","parent","isLabel","printTerminatorless","BreakStatement","label","ContinueStatement","ReturnStatement","argument","ThrowStatement","LabeledStatement","TryStatement","block","handlers","handler","finalizer","CatchClause","param","typeAnnotation","SwitchStatement","discriminant","printSequence","cases","addNewlines","leading","cas","length","rightBrace","SwitchCase","DebuggerStatement","VariableDeclaration","declare","kind","hasInits","declar","declarations","printList","separator","undefined","VariableDeclarator","id","definite"],"sources":["../../src/generators/statements.ts"],"sourcesContent":["import type Printer from \"../printer.ts\";\nimport {\n isFor,\n isForStatement,\n isIfStatement,\n isStatement,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport * as charCodes from \"charcodes\";\n\nexport function WithStatement(this: Printer, node: t.WithStatement) {\n this.word(\"with\");\n this.space();\n this.token(\"(\");\n this.print(node.object, node);\n this.token(\")\");\n this.printBlock(node);\n}\n\nexport function IfStatement(this: Printer, node: t.IfStatement) {\n this.word(\"if\");\n this.space();\n this.token(\"(\");\n this.print(node.test, node);\n this.token(\")\");\n this.space();\n\n const needsBlock =\n node.alternate && isIfStatement(getLastStatement(node.consequent));\n if (needsBlock) {\n this.token(\"{\");\n this.newline();\n this.indent();\n }\n\n this.printAndIndentOnComments(node.consequent, node);\n\n if (needsBlock) {\n this.dedent();\n this.newline();\n this.token(\"}\");\n }\n\n if (node.alternate) {\n if (this.endsWith(charCodes.rightCurlyBrace)) this.space();\n this.word(\"else\");\n this.space();\n this.printAndIndentOnComments(node.alternate, node);\n }\n}\n\n// Recursively get the last statement.\nfunction getLastStatement(statement: t.Statement): t.Statement {\n // @ts-expect-error: If statement.body is empty or not a Node, isStatement will return false\n const { body } = statement;\n if (isStatement(body) === false) {\n return statement;\n }\n\n return getLastStatement(body);\n}\n\nexport function ForStatement(this: Printer, node: t.ForStatement) {\n this.word(\"for\");\n this.space();\n this.token(\"(\");\n\n this.inForStatementInitCounter++;\n this.print(node.init, node);\n this.inForStatementInitCounter--;\n this.token(\";\");\n\n if (node.test) {\n this.space();\n this.print(node.test, node);\n }\n this.token(\";\");\n\n if (node.update) {\n this.space();\n this.print(node.update, node);\n }\n\n this.token(\")\");\n this.printBlock(node);\n}\n\nexport function WhileStatement(this: Printer, node: t.WhileStatement) {\n this.word(\"while\");\n this.space();\n this.token(\"(\");\n this.print(node.test, node);\n this.token(\")\");\n this.printBlock(node);\n}\n\nfunction ForXStatement(this: Printer, node: t.ForXStatement) {\n this.word(\"for\");\n this.space();\n const isForOf = node.type === \"ForOfStatement\";\n if (isForOf && node.await) {\n this.word(\"await\");\n this.space();\n }\n this.noIndentInnerCommentsHere();\n this.token(\"(\");\n this.print(node.left, node);\n this.space();\n this.word(isForOf ? \"of\" : \"in\");\n this.space();\n this.print(node.right, node);\n this.token(\")\");\n this.printBlock(node);\n}\n\nexport const ForInStatement = ForXStatement;\nexport const ForOfStatement = ForXStatement;\n\nexport function DoWhileStatement(this: Printer, node: t.DoWhileStatement) {\n this.word(\"do\");\n this.space();\n this.print(node.body, node);\n this.space();\n this.word(\"while\");\n this.space();\n this.token(\"(\");\n this.print(node.test, node);\n this.token(\")\");\n this.semicolon();\n}\n\nfunction printStatementAfterKeyword(\n printer: Printer,\n node: t.Node,\n parent: t.Node,\n isLabel: boolean,\n) {\n if (node) {\n printer.space();\n printer.printTerminatorless(node, parent, isLabel);\n }\n\n printer.semicolon();\n}\n\nexport function BreakStatement(this: Printer, node: t.ContinueStatement) {\n this.word(\"break\");\n printStatementAfterKeyword(this, node.label, node, true);\n}\n\nexport function ContinueStatement(this: Printer, node: t.ContinueStatement) {\n this.word(\"continue\");\n printStatementAfterKeyword(this, node.label, node, true);\n}\n\nexport function ReturnStatement(this: Printer, node: t.ReturnStatement) {\n this.word(\"return\");\n printStatementAfterKeyword(this, node.argument, node, false);\n}\n\nexport function ThrowStatement(this: Printer, node: t.ThrowStatement) {\n this.word(\"throw\");\n printStatementAfterKeyword(this, node.argument, node, false);\n}\n\nexport function LabeledStatement(this: Printer, node: t.LabeledStatement) {\n this.print(node.label, node);\n this.token(\":\");\n this.space();\n this.print(node.body, node);\n}\n\nexport function TryStatement(this: Printer, node: t.TryStatement) {\n this.word(\"try\");\n this.space();\n this.print(node.block, node);\n this.space();\n\n // Esprima bug puts the catch clause in a `handlers` array.\n // see https://code.google.com/p/esprima/issues/detail?id=433\n // We run into this from regenerator generated ast.\n // @ts-expect-error todo(flow->ts) should ast node type be updated to support this?\n if (node.handlers) {\n // @ts-expect-error todo(flow->ts) should ast node type be updated to support this?\n this.print(node.handlers[0], node);\n } else {\n this.print(node.handler, node);\n }\n\n if (node.finalizer) {\n this.space();\n this.word(\"finally\");\n this.space();\n this.print(node.finalizer, node);\n }\n}\n\nexport function CatchClause(this: Printer, node: t.CatchClause) {\n this.word(\"catch\");\n this.space();\n if (node.param) {\n this.token(\"(\");\n this.print(node.param, node);\n this.print(node.param.typeAnnotation, node);\n this.token(\")\");\n this.space();\n }\n this.print(node.body, node);\n}\n\nexport function SwitchStatement(this: Printer, node: t.SwitchStatement) {\n this.word(\"switch\");\n this.space();\n this.token(\"(\");\n this.print(node.discriminant, node);\n this.token(\")\");\n this.space();\n this.token(\"{\");\n\n this.printSequence(node.cases, node, {\n indent: true,\n addNewlines(leading, cas) {\n if (!leading && node.cases[node.cases.length - 1] === cas) return -1;\n },\n });\n\n this.rightBrace(node);\n}\n\nexport function SwitchCase(this: Printer, node: t.SwitchCase) {\n if (node.test) {\n this.word(\"case\");\n this.space();\n this.print(node.test, node);\n this.token(\":\");\n } else {\n this.word(\"default\");\n this.token(\":\");\n }\n\n if (node.consequent.length) {\n this.newline();\n this.printSequence(node.consequent, node, { indent: true });\n }\n}\n\nexport function DebuggerStatement(this: Printer) {\n this.word(\"debugger\");\n this.semicolon();\n}\n\nexport function VariableDeclaration(\n this: Printer,\n node: t.VariableDeclaration,\n parent: t.Node,\n) {\n if (node.declare) {\n // TS\n this.word(\"declare\");\n this.space();\n }\n\n const { kind } = node;\n this.word(kind, kind === \"using\" || kind === \"await using\");\n this.space();\n\n let hasInits = false;\n // don't add whitespace to loop heads\n if (!isFor(parent)) {\n for (const declar of node.declarations) {\n if (declar.init) {\n // has an init so let's split it up over multiple lines\n hasInits = true;\n }\n }\n }\n\n //\n // use a pretty separator when we aren't in compact mode, have initializers and don't have retainLines on\n // this will format declarations like:\n //\n // let foo = \"bar\", bar = \"foo\";\n //\n // into\n //\n // let foo = \"bar\",\n // bar = \"foo\";\n //\n\n this.printList(node.declarations, node, {\n separator: hasInits\n ? function (this: Printer) {\n this.token(\",\");\n this.newline();\n }\n : undefined,\n indent: node.declarations.length > 1 ? true : false,\n });\n\n if (isFor(parent)) {\n // don't give semicolons to these nodes since they'll be inserted in the parent generator\n if (isForStatement(parent)) {\n if (parent.init === node) return;\n } else {\n if (parent.left === node) return;\n }\n }\n\n this.semicolon();\n}\n\nexport function VariableDeclarator(this: Printer, node: t.VariableDeclarator) {\n this.print(node.id, node);\n if (node.definite) this.token(\"!\"); // TS\n // @ts-expect-error todo(flow-ts) Property 'typeAnnotation' does not exist on type 'MemberExpression'.\n this.print(node.id.typeAnnotation, node);\n if (node.init) {\n this.space();\n this.token(\"=\");\n this.space();\n this.print(node.init, node);\n }\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/generator/lib/generators/types.js b/node_modules/@babel/generator/lib/generators/types.js index a9ddea2ff170..191db56c7953 100644 --- a/node_modules/@babel/generator/lib/generators/types.js +++ b/node_modules/@babel/generator/lib/generators/types.js @@ -158,15 +158,16 @@ function NullLiteral() { function NumericLiteral(node) { const raw = this.getPossibleRaw(node); const opts = this.format.jsescOption; - const value = node.value + ""; + const value = node.value; + const str = value + ""; if (opts.numbers) { - this.number(_jsesc(node.value, opts)); + this.number(_jsesc(value, opts), value); } else if (raw == null) { - this.number(value); + this.number(str, value); } else if (this.format.minified) { - this.number(raw.length < value.length ? raw : value); + this.number(raw.length < str.length ? raw : str, value); } else { - this.number(raw); + this.number(raw, value); } } function StringLiteral(node) { diff --git a/node_modules/@babel/generator/lib/generators/types.js.map b/node_modules/@babel/generator/lib/generators/types.js.map index a75d08e15ac4..510a5f899021 100644 --- a/node_modules/@babel/generator/lib/generators/types.js.map +++ b/node_modules/@babel/generator/lib/generators/types.js.map @@ -1 +1 @@ -{"version":3,"names":["_t","require","_jsesc","isAssignmentPattern","isIdentifier","Identifier","node","_node$loc","sourceIdentifierName","loc","identifierName","name","word","ArgumentPlaceholder","token","RestElement","print","argument","ObjectExpression","props","properties","length","space","printList","indent","statement","sourceWithOffset","ObjectMethod","printJoin","decorators","_methodHead","body","ObjectProperty","computed","key","value","left","shorthand","ArrayExpression","elems","elements","len","i","elem","RecordExpression","startToken","endToken","format","recordAndTupleSyntaxType","Error","JSON","stringify","TupleExpression","RegExpLiteral","pattern","flags","BooleanLiteral","NullLiteral","NumericLiteral","raw","getPossibleRaw","opts","jsescOption","numbers","number","jsesc","minified","StringLiteral","undefined","val","BigIntLiteral","DecimalLiteral","validTopicTokenSet","Set","TopicReference","topicToken","has","givenTopicTokenJSON","validTopics","Array","from","v","join","PipelineTopicExpression","expression","PipelineBareFunction","callee","PipelinePrimaryTopicReference"],"sources":["../../src/generators/types.ts"],"sourcesContent":["import type Printer from \"../printer.ts\";\nimport { isAssignmentPattern, isIdentifier } from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport jsesc from \"jsesc\";\n\nexport function Identifier(this: Printer, node: t.Identifier) {\n this.sourceIdentifierName(node.loc?.identifierName || node.name);\n this.word(node.name);\n}\n\nexport function ArgumentPlaceholder(this: Printer) {\n this.token(\"?\");\n}\n\nexport function RestElement(this: Printer, node: t.RestElement) {\n this.token(\"...\");\n this.print(node.argument, node);\n}\n\nexport { RestElement as SpreadElement };\n\nexport function ObjectExpression(this: Printer, node: t.ObjectExpression) {\n const props = node.properties;\n\n this.token(\"{\");\n\n if (props.length) {\n this.space();\n this.printList(props, node, { indent: true, statement: true });\n this.space();\n }\n\n this.sourceWithOffset(\"end\", node.loc, -1);\n\n this.token(\"}\");\n}\n\nexport { ObjectExpression as ObjectPattern };\n\nexport function ObjectMethod(this: Printer, node: t.ObjectMethod) {\n this.printJoin(node.decorators, node);\n this._methodHead(node);\n this.space();\n this.print(node.body, node);\n}\n\nexport function ObjectProperty(this: Printer, node: t.ObjectProperty) {\n this.printJoin(node.decorators, node);\n\n if (node.computed) {\n this.token(\"[\");\n this.print(node.key, node);\n this.token(\"]\");\n } else {\n // print `({ foo: foo = 5 } = {})` as `({ foo = 5 } = {});`\n if (\n isAssignmentPattern(node.value) &&\n isIdentifier(node.key) &&\n // @ts-expect-error todo(flow->ts) `.name` does not exist on some types in union\n node.key.name === node.value.left.name\n ) {\n this.print(node.value, node);\n return;\n }\n\n this.print(node.key, node);\n\n // shorthand!\n if (\n node.shorthand &&\n isIdentifier(node.key) &&\n isIdentifier(node.value) &&\n node.key.name === node.value.name\n ) {\n return;\n }\n }\n\n this.token(\":\");\n this.space();\n this.print(node.value, node);\n}\n\nexport function ArrayExpression(this: Printer, node: t.ArrayExpression) {\n const elems = node.elements;\n const len = elems.length;\n\n this.token(\"[\");\n\n for (let i = 0; i < elems.length; i++) {\n const elem = elems[i];\n if (elem) {\n if (i > 0) this.space();\n this.print(elem, node);\n if (i < len - 1) this.token(\",\");\n } else {\n // If the array expression ends with a hole, that hole\n // will be ignored by the interpreter, but if it ends with\n // two (or more) holes, we need to write out two (or more)\n // commas so that the resulting code is interpreted with\n // both (all) of the holes.\n this.token(\",\");\n }\n }\n\n this.token(\"]\");\n}\n\nexport { ArrayExpression as ArrayPattern };\n\nexport function RecordExpression(this: Printer, node: t.RecordExpression) {\n const props = node.properties;\n\n let startToken;\n let endToken;\n if (this.format.recordAndTupleSyntaxType === \"bar\") {\n startToken = \"{|\";\n endToken = \"|}\";\n } else if (\n this.format.recordAndTupleSyntaxType !== \"hash\" &&\n this.format.recordAndTupleSyntaxType != null\n ) {\n throw new Error(\n `The \"recordAndTupleSyntaxType\" generator option must be \"bar\" or \"hash\" (${JSON.stringify(\n this.format.recordAndTupleSyntaxType,\n )} received).`,\n );\n } else {\n startToken = \"#{\";\n endToken = \"}\";\n }\n\n this.token(startToken);\n\n if (props.length) {\n this.space();\n this.printList(props, node, { indent: true, statement: true });\n this.space();\n }\n this.token(endToken);\n}\n\nexport function TupleExpression(this: Printer, node: t.TupleExpression) {\n const elems = node.elements;\n const len = elems.length;\n\n let startToken;\n let endToken;\n if (this.format.recordAndTupleSyntaxType === \"bar\") {\n startToken = \"[|\";\n endToken = \"|]\";\n } else if (this.format.recordAndTupleSyntaxType === \"hash\") {\n startToken = \"#[\";\n endToken = \"]\";\n } else {\n throw new Error(\n `${this.format.recordAndTupleSyntaxType} is not a valid recordAndTuple syntax type`,\n );\n }\n\n this.token(startToken);\n\n for (let i = 0; i < elems.length; i++) {\n const elem = elems[i];\n if (elem) {\n if (i > 0) this.space();\n this.print(elem, node);\n if (i < len - 1) this.token(\",\");\n }\n }\n\n this.token(endToken);\n}\n\nexport function RegExpLiteral(this: Printer, node: t.RegExpLiteral) {\n this.word(`/${node.pattern}/${node.flags}`);\n}\n\nexport function BooleanLiteral(this: Printer, node: t.BooleanLiteral) {\n this.word(node.value ? \"true\" : \"false\");\n}\n\nexport function NullLiteral(this: Printer) {\n this.word(\"null\");\n}\n\nexport function NumericLiteral(this: Printer, node: t.NumericLiteral) {\n const raw = this.getPossibleRaw(node);\n const opts = this.format.jsescOption;\n const value = node.value + \"\";\n if (opts.numbers) {\n this.number(jsesc(node.value, opts));\n } else if (raw == null) {\n this.number(value); // normalize\n } else if (this.format.minified) {\n this.number(raw.length < value.length ? raw : value);\n } else {\n this.number(raw);\n }\n}\n\nexport function StringLiteral(this: Printer, node: t.StringLiteral) {\n const raw = this.getPossibleRaw(node);\n if (!this.format.minified && raw !== undefined) {\n this.token(raw);\n return;\n }\n\n const val = jsesc(node.value, this.format.jsescOption);\n\n this.token(val);\n}\n\nexport function BigIntLiteral(this: Printer, node: t.BigIntLiteral) {\n const raw = this.getPossibleRaw(node);\n if (!this.format.minified && raw !== undefined) {\n this.word(raw);\n return;\n }\n this.word(node.value + \"n\");\n}\n\nexport function DecimalLiteral(this: Printer, node: t.DecimalLiteral) {\n const raw = this.getPossibleRaw(node);\n if (!this.format.minified && raw !== undefined) {\n this.word(raw);\n return;\n }\n this.word(node.value + \"m\");\n}\n\n// Hack pipe operator\nconst validTopicTokenSet = new Set([\"^^\", \"@@\", \"^\", \"%\", \"#\"]);\nexport function TopicReference(this: Printer) {\n const { topicToken } = this.format;\n\n if (validTopicTokenSet.has(topicToken)) {\n this.token(topicToken);\n } else {\n const givenTopicTokenJSON = JSON.stringify(topicToken);\n const validTopics = Array.from(validTopicTokenSet, v => JSON.stringify(v));\n throw new Error(\n `The \"topicToken\" generator option must be one of ` +\n `${validTopics.join(\", \")} (${givenTopicTokenJSON} received instead).`,\n );\n }\n}\n\n// Smart-mix pipe operator\nexport function PipelineTopicExpression(\n this: Printer,\n node: t.PipelineTopicExpression,\n) {\n this.print(node.expression, node);\n}\n\nexport function PipelineBareFunction(\n this: Printer,\n node: t.PipelineBareFunction,\n) {\n this.print(node.callee, node);\n}\n\nexport function PipelinePrimaryTopicReference(this: Printer) {\n this.token(\"#\");\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_t","require","_jsesc","isAssignmentPattern","isIdentifier","Identifier","node","_node$loc","sourceIdentifierName","loc","identifierName","name","word","ArgumentPlaceholder","token","RestElement","print","argument","ObjectExpression","props","properties","length","space","printList","indent","statement","sourceWithOffset","ObjectMethod","printJoin","decorators","_methodHead","body","ObjectProperty","computed","key","value","left","shorthand","ArrayExpression","elems","elements","len","i","elem","RecordExpression","startToken","endToken","format","recordAndTupleSyntaxType","Error","JSON","stringify","TupleExpression","RegExpLiteral","pattern","flags","BooleanLiteral","NullLiteral","NumericLiteral","raw","getPossibleRaw","opts","jsescOption","str","numbers","number","jsesc","minified","StringLiteral","undefined","val","BigIntLiteral","DecimalLiteral","validTopicTokenSet","Set","TopicReference","topicToken","has","givenTopicTokenJSON","validTopics","Array","from","v","join","PipelineTopicExpression","expression","PipelineBareFunction","callee","PipelinePrimaryTopicReference"],"sources":["../../src/generators/types.ts"],"sourcesContent":["import type Printer from \"../printer.ts\";\nimport { isAssignmentPattern, isIdentifier } from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport jsesc from \"jsesc\";\n\nexport function Identifier(this: Printer, node: t.Identifier) {\n this.sourceIdentifierName(node.loc?.identifierName || node.name);\n this.word(node.name);\n}\n\nexport function ArgumentPlaceholder(this: Printer) {\n this.token(\"?\");\n}\n\nexport function RestElement(this: Printer, node: t.RestElement) {\n this.token(\"...\");\n this.print(node.argument, node);\n}\n\nexport { RestElement as SpreadElement };\n\nexport function ObjectExpression(this: Printer, node: t.ObjectExpression) {\n const props = node.properties;\n\n this.token(\"{\");\n\n if (props.length) {\n this.space();\n this.printList(props, node, { indent: true, statement: true });\n this.space();\n }\n\n this.sourceWithOffset(\"end\", node.loc, -1);\n\n this.token(\"}\");\n}\n\nexport { ObjectExpression as ObjectPattern };\n\nexport function ObjectMethod(this: Printer, node: t.ObjectMethod) {\n this.printJoin(node.decorators, node);\n this._methodHead(node);\n this.space();\n this.print(node.body, node);\n}\n\nexport function ObjectProperty(this: Printer, node: t.ObjectProperty) {\n this.printJoin(node.decorators, node);\n\n if (node.computed) {\n this.token(\"[\");\n this.print(node.key, node);\n this.token(\"]\");\n } else {\n // print `({ foo: foo = 5 } = {})` as `({ foo = 5 } = {});`\n if (\n isAssignmentPattern(node.value) &&\n isIdentifier(node.key) &&\n // @ts-expect-error todo(flow->ts) `.name` does not exist on some types in union\n node.key.name === node.value.left.name\n ) {\n this.print(node.value, node);\n return;\n }\n\n this.print(node.key, node);\n\n // shorthand!\n if (\n node.shorthand &&\n isIdentifier(node.key) &&\n isIdentifier(node.value) &&\n node.key.name === node.value.name\n ) {\n return;\n }\n }\n\n this.token(\":\");\n this.space();\n this.print(node.value, node);\n}\n\nexport function ArrayExpression(this: Printer, node: t.ArrayExpression) {\n const elems = node.elements;\n const len = elems.length;\n\n this.token(\"[\");\n\n for (let i = 0; i < elems.length; i++) {\n const elem = elems[i];\n if (elem) {\n if (i > 0) this.space();\n this.print(elem, node);\n if (i < len - 1) this.token(\",\");\n } else {\n // If the array expression ends with a hole, that hole\n // will be ignored by the interpreter, but if it ends with\n // two (or more) holes, we need to write out two (or more)\n // commas so that the resulting code is interpreted with\n // both (all) of the holes.\n this.token(\",\");\n }\n }\n\n this.token(\"]\");\n}\n\nexport { ArrayExpression as ArrayPattern };\n\nexport function RecordExpression(this: Printer, node: t.RecordExpression) {\n const props = node.properties;\n\n let startToken;\n let endToken;\n if (this.format.recordAndTupleSyntaxType === \"bar\") {\n startToken = \"{|\";\n endToken = \"|}\";\n } else if (\n this.format.recordAndTupleSyntaxType !== \"hash\" &&\n this.format.recordAndTupleSyntaxType != null\n ) {\n throw new Error(\n `The \"recordAndTupleSyntaxType\" generator option must be \"bar\" or \"hash\" (${JSON.stringify(\n this.format.recordAndTupleSyntaxType,\n )} received).`,\n );\n } else {\n startToken = \"#{\";\n endToken = \"}\";\n }\n\n this.token(startToken);\n\n if (props.length) {\n this.space();\n this.printList(props, node, { indent: true, statement: true });\n this.space();\n }\n this.token(endToken);\n}\n\nexport function TupleExpression(this: Printer, node: t.TupleExpression) {\n const elems = node.elements;\n const len = elems.length;\n\n let startToken;\n let endToken;\n if (this.format.recordAndTupleSyntaxType === \"bar\") {\n startToken = \"[|\";\n endToken = \"|]\";\n } else if (this.format.recordAndTupleSyntaxType === \"hash\") {\n startToken = \"#[\";\n endToken = \"]\";\n } else {\n throw new Error(\n `${this.format.recordAndTupleSyntaxType} is not a valid recordAndTuple syntax type`,\n );\n }\n\n this.token(startToken);\n\n for (let i = 0; i < elems.length; i++) {\n const elem = elems[i];\n if (elem) {\n if (i > 0) this.space();\n this.print(elem, node);\n if (i < len - 1) this.token(\",\");\n }\n }\n\n this.token(endToken);\n}\n\nexport function RegExpLiteral(this: Printer, node: t.RegExpLiteral) {\n this.word(`/${node.pattern}/${node.flags}`);\n}\n\nexport function BooleanLiteral(this: Printer, node: t.BooleanLiteral) {\n this.word(node.value ? \"true\" : \"false\");\n}\n\nexport function NullLiteral(this: Printer) {\n this.word(\"null\");\n}\n\nexport function NumericLiteral(this: Printer, node: t.NumericLiteral) {\n const raw = this.getPossibleRaw(node);\n const opts = this.format.jsescOption;\n const value = node.value;\n const str = value + \"\";\n if (opts.numbers) {\n this.number(jsesc(value, opts), value);\n } else if (raw == null) {\n this.number(str, value); // normalize\n } else if (this.format.minified) {\n this.number(raw.length < str.length ? raw : str, value);\n } else {\n this.number(raw, value);\n }\n}\n\nexport function StringLiteral(this: Printer, node: t.StringLiteral) {\n const raw = this.getPossibleRaw(node);\n if (!this.format.minified && raw !== undefined) {\n this.token(raw);\n return;\n }\n\n const val = jsesc(node.value, this.format.jsescOption);\n\n this.token(val);\n}\n\nexport function BigIntLiteral(this: Printer, node: t.BigIntLiteral) {\n const raw = this.getPossibleRaw(node);\n if (!this.format.minified && raw !== undefined) {\n this.word(raw);\n return;\n }\n this.word(node.value + \"n\");\n}\n\nexport function DecimalLiteral(this: Printer, node: t.DecimalLiteral) {\n const raw = this.getPossibleRaw(node);\n if (!this.format.minified && raw !== undefined) {\n this.word(raw);\n return;\n }\n this.word(node.value + \"m\");\n}\n\n// Hack pipe operator\nconst validTopicTokenSet = new Set([\"^^\", \"@@\", \"^\", \"%\", \"#\"]);\nexport function TopicReference(this: Printer) {\n const { topicToken } = this.format;\n\n if (validTopicTokenSet.has(topicToken)) {\n this.token(topicToken);\n } else {\n const givenTopicTokenJSON = JSON.stringify(topicToken);\n const validTopics = Array.from(validTopicTokenSet, v => JSON.stringify(v));\n throw new Error(\n `The \"topicToken\" generator option must be one of ` +\n `${validTopics.join(\", \")} (${givenTopicTokenJSON} received instead).`,\n );\n }\n}\n\n// Smart-mix pipe operator\nexport function PipelineTopicExpression(\n this: Printer,\n node: t.PipelineTopicExpression,\n) {\n this.print(node.expression, node);\n}\n\nexport function PipelineBareFunction(\n this: Printer,\n node: t.PipelineBareFunction,\n) {\n this.print(node.callee, node);\n}\n\nexport function PipelinePrimaryTopicReference(this: Printer) {\n this.token(\"#\");\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/generator/lib/generators/typescript.js b/node_modules/@babel/generator/lib/generators/typescript.js index 9d621d2314da..2f04734c6bab 100644 --- a/node_modules/@babel/generator/lib/generators/typescript.js +++ b/node_modules/@babel/generator/lib/generators/typescript.js @@ -148,8 +148,7 @@ function TSConstructSignatureDeclaration(node) { } function TSPropertySignature(node) { const { - readonly, - initializer + readonly } = node; if (readonly) { this.word("readonly"); @@ -157,12 +156,6 @@ function TSPropertySignature(node) { } this.tsPrintPropertyOrMethodName(node); this.print(node.typeAnnotation, node); - if (initializer) { - this.space(); - this.tokenChar(61); - this.space(); - this.print(initializer, node); - } this.tokenChar(59); } function tsPrintPropertyOrMethodName(node) { diff --git a/node_modules/@babel/generator/lib/generators/typescript.js.map b/node_modules/@babel/generator/lib/generators/typescript.js.map index a0e2deb4cfda..db695abfd2b5 100644 --- a/node_modules/@babel/generator/lib/generators/typescript.js.map +++ b/node_modules/@babel/generator/lib/generators/typescript.js.map @@ -1 +1 @@ -{"version":3,"names":["TSTypeAnnotation","node","token","space","optional","print","typeAnnotation","TSTypeParameterInstantiation","parent","printList","params","type","length","TSTypeParameter","in","word","out","name","constraint","default","TSParameterProperty","accessibility","readonly","_param","parameter","TSDeclareFunction","declare","_functionHead","TSDeclareMethod","_classMethodHead","TSQualifiedName","left","right","TSCallSignatureDeclaration","tsPrintSignatureDeclarationBase","TSConstructSignatureDeclaration","TSPropertySignature","initializer","tsPrintPropertyOrMethodName","computed","key","TSMethodSignature","kind","TSIndexSignature","static","isStatic","_parameters","parameters","TSAnyKeyword","TSBigIntKeyword","TSUnknownKeyword","TSNumberKeyword","TSObjectKeyword","TSBooleanKeyword","TSStringKeyword","TSSymbolKeyword","TSVoidKeyword","TSUndefinedKeyword","TSNullKeyword","TSNeverKeyword","TSIntrinsicKeyword","TSThisType","TSFunctionType","tsPrintFunctionOrConstructorType","TSConstructorType","abstract","typeParameters","returnType","TSTypeReference","typeName","TSTypePredicate","asserts","parameterName","TSTypeQuery","exprName","TSTypeLiteral","tsPrintTypeLiteralOrInterfaceBody","members","tsPrintBraced","printer","indent","newline","member","dedent","rightBrace","TSArrayType","elementType","TSTupleType","elementTypes","TSOptionalType","TSRestType","TSNamedTupleMember","label","TSUnionType","tsPrintUnionOrIntersectionType","TSIntersectionType","sep","printJoin","types","separator","TSConditionalType","checkType","extendsType","trueType","falseType","TSInferType","typeParameter","TSParenthesizedType","TSTypeOperator","operator","TSIndexedAccessType","objectType","indexType","TSMappedType","nameType","tokenIfPlusMinus","self","tok","TSLiteralType","literal","TSExpressionWithTypeArguments","expression","TSInterfaceDeclaration","id","extends","extendz","body","TSInterfaceBody","TSTypeAliasDeclaration","TSTypeExpression","_expression$trailingC","forceParens","trailingComments","undefined","TSTypeAssertion","TSInstantiationExpression","TSEnumDeclaration","const","isConst","TSEnumMember","TSModuleDeclaration","global","TSModuleBlock","TSImportType","argument","qualifier","TSImportEqualsDeclaration","isExport","moduleReference","TSExternalModuleReference","TSNonNullExpression","TSExportAssignment","TSNamespaceExportDeclaration","tsPrintClassMemberModifiers","isField","override"],"sources":["../../src/generators/typescript.ts"],"sourcesContent":["import type Printer from \"../printer.ts\";\nimport type * as t from \"@babel/types\";\nimport type { NodePath } from \"@babel/traverse\";\n\nexport function TSTypeAnnotation(this: Printer, node: t.TSTypeAnnotation) {\n this.token(\":\");\n this.space();\n // @ts-expect-error todo(flow->ts) can this be removed? `.optional` looks to be not existing property\n if (node.optional) this.token(\"?\");\n this.print(node.typeAnnotation, node);\n}\n\nexport function TSTypeParameterInstantiation(\n this: Printer,\n node: t.TSTypeParameterInstantiation,\n parent: t.Node,\n): void {\n this.token(\"<\");\n this.printList(node.params, node, {});\n if (parent.type === \"ArrowFunctionExpression\" && node.params.length === 1) {\n this.token(\",\");\n }\n this.token(\">\");\n}\n\nexport { TSTypeParameterInstantiation as TSTypeParameterDeclaration };\n\nexport function TSTypeParameter(this: Printer, node: t.TSTypeParameter) {\n if (node.in) {\n this.word(\"in\");\n this.space();\n }\n\n if (node.out) {\n this.word(\"out\");\n this.space();\n }\n\n this.word(\n !process.env.BABEL_8_BREAKING\n ? (node.name as unknown as string)\n : (node.name as unknown as t.Identifier).name,\n );\n\n if (node.constraint) {\n this.space();\n this.word(\"extends\");\n this.space();\n this.print(node.constraint, node);\n }\n\n if (node.default) {\n this.space();\n this.token(\"=\");\n this.space();\n this.print(node.default, node);\n }\n}\n\nexport function TSParameterProperty(\n this: Printer,\n node: t.TSParameterProperty,\n) {\n if (node.accessibility) {\n this.word(node.accessibility);\n this.space();\n }\n\n if (node.readonly) {\n this.word(\"readonly\");\n this.space();\n }\n\n this._param(node.parameter);\n}\n\nexport function TSDeclareFunction(\n this: Printer,\n node: t.TSDeclareFunction,\n parent: NodePath[\"parent\"],\n) {\n if (node.declare) {\n this.word(\"declare\");\n this.space();\n }\n this._functionHead(node, parent);\n this.token(\";\");\n}\n\nexport function TSDeclareMethod(this: Printer, node: t.TSDeclareMethod) {\n this._classMethodHead(node);\n this.token(\";\");\n}\n\nexport function TSQualifiedName(this: Printer, node: t.TSQualifiedName) {\n this.print(node.left, node);\n this.token(\".\");\n this.print(node.right, node);\n}\n\nexport function TSCallSignatureDeclaration(\n this: Printer,\n node: t.TSCallSignatureDeclaration,\n) {\n this.tsPrintSignatureDeclarationBase(node);\n this.token(\";\");\n}\n\nexport function TSConstructSignatureDeclaration(\n this: Printer,\n node: t.TSConstructSignatureDeclaration,\n) {\n this.word(\"new\");\n this.space();\n this.tsPrintSignatureDeclarationBase(node);\n this.token(\";\");\n}\n\nexport function TSPropertySignature(\n this: Printer,\n node: t.TSPropertySignature,\n) {\n const { readonly, initializer } = node;\n if (readonly) {\n this.word(\"readonly\");\n this.space();\n }\n this.tsPrintPropertyOrMethodName(node);\n this.print(node.typeAnnotation, node);\n if (initializer) {\n this.space();\n this.token(\"=\");\n this.space();\n this.print(initializer, node);\n }\n this.token(\";\");\n}\n\nexport function tsPrintPropertyOrMethodName(\n this: Printer,\n node: t.TSPropertySignature | t.TSMethodSignature,\n) {\n if (node.computed) {\n this.token(\"[\");\n }\n this.print(node.key, node);\n if (node.computed) {\n this.token(\"]\");\n }\n if (node.optional) {\n this.token(\"?\");\n }\n}\n\nexport function TSMethodSignature(this: Printer, node: t.TSMethodSignature) {\n const { kind } = node;\n if (kind === \"set\" || kind === \"get\") {\n this.word(kind);\n this.space();\n }\n this.tsPrintPropertyOrMethodName(node);\n this.tsPrintSignatureDeclarationBase(node);\n this.token(\";\");\n}\n\nexport function TSIndexSignature(this: Printer, node: t.TSIndexSignature) {\n const { readonly, static: isStatic } = node;\n if (isStatic) {\n this.word(\"static\");\n this.space();\n }\n if (readonly) {\n this.word(\"readonly\");\n this.space();\n }\n this.token(\"[\");\n this._parameters(node.parameters, node);\n this.token(\"]\");\n this.print(node.typeAnnotation, node);\n this.token(\";\");\n}\n\nexport function TSAnyKeyword(this: Printer) {\n this.word(\"any\");\n}\nexport function TSBigIntKeyword(this: Printer) {\n this.word(\"bigint\");\n}\nexport function TSUnknownKeyword(this: Printer) {\n this.word(\"unknown\");\n}\nexport function TSNumberKeyword(this: Printer) {\n this.word(\"number\");\n}\nexport function TSObjectKeyword(this: Printer) {\n this.word(\"object\");\n}\nexport function TSBooleanKeyword(this: Printer) {\n this.word(\"boolean\");\n}\nexport function TSStringKeyword(this: Printer) {\n this.word(\"string\");\n}\nexport function TSSymbolKeyword(this: Printer) {\n this.word(\"symbol\");\n}\nexport function TSVoidKeyword(this: Printer) {\n this.word(\"void\");\n}\nexport function TSUndefinedKeyword(this: Printer) {\n this.word(\"undefined\");\n}\nexport function TSNullKeyword(this: Printer) {\n this.word(\"null\");\n}\nexport function TSNeverKeyword(this: Printer) {\n this.word(\"never\");\n}\nexport function TSIntrinsicKeyword(this: Printer) {\n this.word(\"intrinsic\");\n}\n\nexport function TSThisType(this: Printer) {\n this.word(\"this\");\n}\n\nexport function TSFunctionType(this: Printer, node: t.TSFunctionType) {\n this.tsPrintFunctionOrConstructorType(node);\n}\n\nexport function TSConstructorType(this: Printer, node: t.TSConstructorType) {\n if (node.abstract) {\n this.word(\"abstract\");\n this.space();\n }\n this.word(\"new\");\n this.space();\n this.tsPrintFunctionOrConstructorType(node);\n}\n\nexport function tsPrintFunctionOrConstructorType(\n this: Printer,\n node: t.TSFunctionType | t.TSConstructorType,\n) {\n const { typeParameters } = node;\n const parameters = process.env.BABEL_8_BREAKING\n ? // @ts-ignore(Babel 7 vs Babel 8) Babel 8 AST shape\n node.params\n : // @ts-ignore(Babel 7 vs Babel 8) Babel 7 AST shape\n node.parameters;\n this.print(typeParameters, node);\n this.token(\"(\");\n this._parameters(parameters, node);\n this.token(\")\");\n this.space();\n this.token(\"=>\");\n this.space();\n const returnType = process.env.BABEL_8_BREAKING\n ? // @ts-ignore(Babel 7 vs Babel 8) Babel 8 AST shape\n node.returnType\n : // @ts-ignore(Babel 7 vs Babel 8) Babel 7 AST shape\n node.typeAnnotation;\n this.print(returnType.typeAnnotation, node);\n}\n\nexport function TSTypeReference(this: Printer, node: t.TSTypeReference) {\n this.print(node.typeName, node, true);\n this.print(node.typeParameters, node, true);\n}\n\nexport function TSTypePredicate(this: Printer, node: t.TSTypePredicate) {\n if (node.asserts) {\n this.word(\"asserts\");\n this.space();\n }\n this.print(node.parameterName);\n if (node.typeAnnotation) {\n this.space();\n this.word(\"is\");\n this.space();\n this.print(node.typeAnnotation.typeAnnotation);\n }\n}\n\nexport function TSTypeQuery(this: Printer, node: t.TSTypeQuery) {\n this.word(\"typeof\");\n this.space();\n this.print(node.exprName);\n\n if (node.typeParameters) {\n this.print(node.typeParameters, node);\n }\n}\n\nexport function TSTypeLiteral(this: Printer, node: t.TSTypeLiteral) {\n this.tsPrintTypeLiteralOrInterfaceBody(node.members, node);\n}\n\nexport function tsPrintTypeLiteralOrInterfaceBody(\n this: Printer,\n members: t.TSTypeElement[],\n node: t.TSType | t.TSInterfaceBody,\n) {\n tsPrintBraced(this, members, node);\n}\n\nfunction tsPrintBraced(printer: Printer, members: t.Node[], node: t.Node) {\n printer.token(\"{\");\n if (members.length) {\n printer.indent();\n printer.newline();\n for (const member of members) {\n printer.print(member, node);\n //this.token(sep);\n printer.newline();\n }\n printer.dedent();\n }\n\n printer.rightBrace(node);\n}\n\nexport function TSArrayType(this: Printer, node: t.TSArrayType) {\n this.print(node.elementType, node, true);\n\n this.token(\"[]\");\n}\n\nexport function TSTupleType(this: Printer, node: t.TSTupleType) {\n this.token(\"[\");\n this.printList(node.elementTypes, node);\n this.token(\"]\");\n}\n\nexport function TSOptionalType(this: Printer, node: t.TSOptionalType) {\n this.print(node.typeAnnotation, node);\n this.token(\"?\");\n}\n\nexport function TSRestType(this: Printer, node: t.TSRestType) {\n this.token(\"...\");\n this.print(node.typeAnnotation, node);\n}\n\nexport function TSNamedTupleMember(this: Printer, node: t.TSNamedTupleMember) {\n this.print(node.label, node);\n if (node.optional) this.token(\"?\");\n this.token(\":\");\n this.space();\n this.print(node.elementType, node);\n}\n\nexport function TSUnionType(this: Printer, node: t.TSUnionType) {\n tsPrintUnionOrIntersectionType(this, node, \"|\");\n}\n\nexport function TSIntersectionType(this: Printer, node: t.TSIntersectionType) {\n tsPrintUnionOrIntersectionType(this, node, \"&\");\n}\n\nfunction tsPrintUnionOrIntersectionType(\n printer: Printer,\n node: t.TSUnionType | t.TSIntersectionType,\n sep: \"|\" | \"&\",\n) {\n printer.printJoin(node.types, node, {\n separator() {\n this.space();\n this.token(sep);\n this.space();\n },\n });\n}\n\nexport function TSConditionalType(this: Printer, node: t.TSConditionalType) {\n this.print(node.checkType);\n this.space();\n this.word(\"extends\");\n this.space();\n this.print(node.extendsType);\n this.space();\n this.token(\"?\");\n this.space();\n this.print(node.trueType);\n this.space();\n this.token(\":\");\n this.space();\n this.print(node.falseType);\n}\n\nexport function TSInferType(this: Printer, node: t.TSInferType) {\n this.token(\"infer\");\n this.space();\n this.print(node.typeParameter);\n}\n\nexport function TSParenthesizedType(\n this: Printer,\n node: t.TSParenthesizedType,\n) {\n this.token(\"(\");\n this.print(node.typeAnnotation, node);\n this.token(\")\");\n}\n\nexport function TSTypeOperator(this: Printer, node: t.TSTypeOperator) {\n this.word(node.operator);\n this.space();\n this.print(node.typeAnnotation, node);\n}\n\nexport function TSIndexedAccessType(\n this: Printer,\n node: t.TSIndexedAccessType,\n) {\n this.print(node.objectType, node, true);\n this.token(\"[\");\n this.print(node.indexType, node);\n this.token(\"]\");\n}\n\nexport function TSMappedType(this: Printer, node: t.TSMappedType) {\n const { nameType, optional, readonly, typeParameter } = node;\n this.token(\"{\");\n this.space();\n if (readonly) {\n tokenIfPlusMinus(this, readonly);\n this.word(\"readonly\");\n this.space();\n }\n\n this.token(\"[\");\n this.word(\n !process.env.BABEL_8_BREAKING\n ? (typeParameter.name as unknown as string)\n : (typeParameter.name as unknown as t.Identifier).name,\n );\n this.space();\n this.word(\"in\");\n this.space();\n this.print(typeParameter.constraint, typeParameter);\n\n if (nameType) {\n this.space();\n this.word(\"as\");\n this.space();\n this.print(nameType, node);\n }\n\n this.token(\"]\");\n\n if (optional) {\n tokenIfPlusMinus(this, optional);\n this.token(\"?\");\n }\n this.token(\":\");\n this.space();\n this.print(node.typeAnnotation, node);\n this.space();\n this.token(\"}\");\n}\n\nfunction tokenIfPlusMinus(self: Printer, tok: true | \"+\" | \"-\") {\n if (tok !== true) {\n self.token(tok);\n }\n}\n\nexport function TSLiteralType(this: Printer, node: t.TSLiteralType) {\n this.print(node.literal, node);\n}\n\nexport function TSExpressionWithTypeArguments(\n this: Printer,\n node: t.TSExpressionWithTypeArguments,\n) {\n this.print(node.expression, node);\n this.print(node.typeParameters, node);\n}\n\nexport function TSInterfaceDeclaration(\n this: Printer,\n node: t.TSInterfaceDeclaration,\n) {\n const { declare, id, typeParameters, extends: extendz, body } = node;\n if (declare) {\n this.word(\"declare\");\n this.space();\n }\n this.word(\"interface\");\n this.space();\n this.print(id, node);\n this.print(typeParameters, node);\n if (extendz?.length) {\n this.space();\n this.word(\"extends\");\n this.space();\n this.printList(extendz, node);\n }\n this.space();\n this.print(body, node);\n}\n\nexport function TSInterfaceBody(this: Printer, node: t.TSInterfaceBody) {\n this.tsPrintTypeLiteralOrInterfaceBody(node.body, node);\n}\n\nexport function TSTypeAliasDeclaration(\n this: Printer,\n node: t.TSTypeAliasDeclaration,\n) {\n const { declare, id, typeParameters, typeAnnotation } = node;\n if (declare) {\n this.word(\"declare\");\n this.space();\n }\n this.word(\"type\");\n this.space();\n this.print(id, node);\n this.print(typeParameters, node);\n this.space();\n this.token(\"=\");\n this.space();\n this.print(typeAnnotation, node);\n this.token(\";\");\n}\n\nfunction TSTypeExpression(\n this: Printer,\n node: t.TSAsExpression | t.TSSatisfiesExpression,\n) {\n const { type, expression, typeAnnotation } = node;\n const forceParens = !!expression.trailingComments?.length;\n this.print(expression, node, true, undefined, forceParens);\n this.space();\n this.word(type === \"TSAsExpression\" ? \"as\" : \"satisfies\");\n this.space();\n this.print(typeAnnotation, node);\n}\n\nexport {\n TSTypeExpression as TSAsExpression,\n TSTypeExpression as TSSatisfiesExpression,\n};\n\nexport function TSTypeAssertion(this: Printer, node: t.TSTypeAssertion) {\n const { typeAnnotation, expression } = node;\n this.token(\"<\");\n this.print(typeAnnotation, node);\n this.token(\">\");\n this.space();\n this.print(expression, node);\n}\n\nexport function TSInstantiationExpression(\n this: Printer,\n node: t.TSInstantiationExpression,\n) {\n this.print(node.expression, node);\n this.print(node.typeParameters, node);\n}\n\nexport function TSEnumDeclaration(this: Printer, node: t.TSEnumDeclaration) {\n const { declare, const: isConst, id, members } = node;\n if (declare) {\n this.word(\"declare\");\n this.space();\n }\n if (isConst) {\n this.word(\"const\");\n this.space();\n }\n this.word(\"enum\");\n this.space();\n this.print(id, node);\n this.space();\n tsPrintBraced(this, members, node);\n}\n\nexport function TSEnumMember(this: Printer, node: t.TSEnumMember) {\n const { id, initializer } = node;\n this.print(id, node);\n if (initializer) {\n this.space();\n this.token(\"=\");\n this.space();\n this.print(initializer, node);\n }\n this.token(\",\");\n}\n\nexport function TSModuleDeclaration(\n this: Printer,\n node: t.TSModuleDeclaration,\n) {\n const { declare, id } = node;\n\n if (declare) {\n this.word(\"declare\");\n this.space();\n }\n\n if (!node.global) {\n this.word(id.type === \"Identifier\" ? \"namespace\" : \"module\");\n this.space();\n }\n this.print(id, node);\n\n if (!node.body) {\n this.token(\";\");\n return;\n }\n\n let body = node.body;\n while (body.type === \"TSModuleDeclaration\") {\n this.token(\".\");\n this.print(body.id, body);\n body = body.body;\n }\n\n this.space();\n this.print(body, node);\n}\n\nexport function TSModuleBlock(this: Printer, node: t.TSModuleBlock) {\n tsPrintBraced(this, node.body, node);\n}\n\nexport function TSImportType(this: Printer, node: t.TSImportType) {\n const { argument, qualifier, typeParameters } = node;\n this.word(\"import\");\n this.token(\"(\");\n this.print(argument, node);\n this.token(\")\");\n if (qualifier) {\n this.token(\".\");\n this.print(qualifier, node);\n }\n if (typeParameters) {\n this.print(typeParameters, node);\n }\n}\n\nexport function TSImportEqualsDeclaration(\n this: Printer,\n node: t.TSImportEqualsDeclaration,\n) {\n const { isExport, id, moduleReference } = node;\n if (isExport) {\n this.word(\"export\");\n this.space();\n }\n this.word(\"import\");\n this.space();\n this.print(id, node);\n this.space();\n this.token(\"=\");\n this.space();\n this.print(moduleReference, node);\n this.token(\";\");\n}\n\nexport function TSExternalModuleReference(\n this: Printer,\n node: t.TSExternalModuleReference,\n) {\n this.token(\"require(\");\n this.print(node.expression, node);\n this.token(\")\");\n}\n\nexport function TSNonNullExpression(\n this: Printer,\n node: t.TSNonNullExpression,\n) {\n this.print(node.expression, node);\n this.token(\"!\");\n}\n\nexport function TSExportAssignment(this: Printer, node: t.TSExportAssignment) {\n this.word(\"export\");\n this.space();\n this.token(\"=\");\n this.space();\n this.print(node.expression, node);\n this.token(\";\");\n}\n\nexport function TSNamespaceExportDeclaration(\n this: Printer,\n node: t.TSNamespaceExportDeclaration,\n) {\n this.word(\"export\");\n this.space();\n this.word(\"as\");\n this.space();\n this.word(\"namespace\");\n this.space();\n this.print(node.id, node);\n}\n\nexport function tsPrintSignatureDeclarationBase(this: Printer, node: any) {\n const { typeParameters } = node;\n const parameters = process.env.BABEL_8_BREAKING\n ? node.params\n : node.parameters;\n this.print(typeParameters, node);\n this.token(\"(\");\n this._parameters(parameters, node);\n this.token(\")\");\n const returnType = process.env.BABEL_8_BREAKING\n ? node.returnType\n : node.typeAnnotation;\n this.print(returnType, node);\n}\n\nexport function tsPrintClassMemberModifiers(\n this: Printer,\n node:\n | t.ClassProperty\n | t.ClassAccessorProperty\n | t.ClassMethod\n | t.ClassPrivateMethod\n | t.TSDeclareMethod,\n) {\n const isField =\n node.type === \"ClassAccessorProperty\" || node.type === \"ClassProperty\";\n if (isField && node.declare) {\n this.word(\"declare\");\n this.space();\n }\n if (node.accessibility) {\n this.word(node.accessibility);\n this.space();\n }\n if (node.static) {\n this.word(\"static\");\n this.space();\n }\n if (node.override) {\n this.word(\"override\");\n this.space();\n }\n if (node.abstract) {\n this.word(\"abstract\");\n this.space();\n }\n if (isField && node.readonly) {\n this.word(\"readonly\");\n this.space();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAASA,gBAAgBA,CAAgBC,IAAwB,EAAE;EACxE,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI,CAACC,KAAK,CAAC,CAAC;EAEZ,IAAIF,IAAI,CAACG,QAAQ,EAAE,IAAI,CAACF,SAAK,GAAI,CAAC;EAClC,IAAI,CAACG,KAAK,CAACJ,IAAI,CAACK,cAAc,EAAEL,IAAI,CAAC;AACvC;AAEO,SAASM,4BAA4BA,CAE1CN,IAAoC,EACpCO,MAAc,EACR;EACN,IAAI,CAACN,SAAK,GAAI,CAAC;EACf,IAAI,CAACO,SAAS,CAACR,IAAI,CAACS,MAAM,EAAET,IAAI,EAAE,CAAC,CAAC,CAAC;EACrC,IAAIO,MAAM,CAACG,IAAI,KAAK,yBAAyB,IAAIV,IAAI,CAACS,MAAM,CAACE,MAAM,KAAK,CAAC,EAAE;IACzE,IAAI,CAACV,SAAK,GAAI,CAAC;EACjB;EACA,IAAI,CAACA,SAAK,GAAI,CAAC;AACjB;AAIO,SAASW,eAAeA,CAAgBZ,IAAuB,EAAE;EACtE,IAAIA,IAAI,CAACa,EAAE,EAAE;IACX,IAAI,CAACC,IAAI,CAAC,IAAI,CAAC;IACf,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EAEA,IAAIF,IAAI,CAACe,GAAG,EAAE;IACZ,IAAI,CAACD,IAAI,CAAC,KAAK,CAAC;IAChB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EAEA,IAAI,CAACY,IAAI,CAEFd,IAAI,CAACgB,IAEZ,CAAC;EAED,IAAIhB,IAAI,CAACiB,UAAU,EAAE;IACnB,IAAI,CAACf,KAAK,CAAC,CAAC;IACZ,IAAI,CAACY,IAAI,CAAC,SAAS,CAAC;IACpB,IAAI,CAACZ,KAAK,CAAC,CAAC;IACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACiB,UAAU,EAAEjB,IAAI,CAAC;EACnC;EAEA,IAAIA,IAAI,CAACkB,OAAO,EAAE;IAChB,IAAI,CAAChB,KAAK,CAAC,CAAC;IACZ,IAAI,CAACD,SAAK,GAAI,CAAC;IACf,IAAI,CAACC,KAAK,CAAC,CAAC;IACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACkB,OAAO,EAAElB,IAAI,CAAC;EAChC;AACF;AAEO,SAASmB,mBAAmBA,CAEjCnB,IAA2B,EAC3B;EACA,IAAIA,IAAI,CAACoB,aAAa,EAAE;IACtB,IAAI,CAACN,IAAI,CAACd,IAAI,CAACoB,aAAa,CAAC;IAC7B,IAAI,CAAClB,KAAK,CAAC,CAAC;EACd;EAEA,IAAIF,IAAI,CAACqB,QAAQ,EAAE;IACjB,IAAI,CAACP,IAAI,CAAC,UAAU,CAAC;IACrB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EAEA,IAAI,CAACoB,MAAM,CAACtB,IAAI,CAACuB,SAAS,CAAC;AAC7B;AAEO,SAASC,iBAAiBA,CAE/BxB,IAAyB,EACzBO,MAA+C,EAC/C;EACA,IAAIP,IAAI,CAACyB,OAAO,EAAE;IAChB,IAAI,CAACX,IAAI,CAAC,SAAS,CAAC;IACpB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAI,CAACwB,aAAa,CAAC1B,IAAI,EAAEO,MAAM,CAAC;EAChC,IAAI,CAACN,SAAK,GAAI,CAAC;AACjB;AAEO,SAAS0B,eAAeA,CAAgB3B,IAAuB,EAAE;EACtE,IAAI,CAAC4B,gBAAgB,CAAC5B,IAAI,CAAC;EAC3B,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAAS4B,eAAeA,CAAgB7B,IAAuB,EAAE;EACtE,IAAI,CAACI,KAAK,CAACJ,IAAI,CAAC8B,IAAI,EAAE9B,IAAI,CAAC;EAC3B,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI,CAACG,KAAK,CAACJ,IAAI,CAAC+B,KAAK,EAAE/B,IAAI,CAAC;AAC9B;AAEO,SAASgC,0BAA0BA,CAExChC,IAAkC,EAClC;EACA,IAAI,CAACiC,+BAA+B,CAACjC,IAAI,CAAC;EAC1C,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAASiC,+BAA+BA,CAE7ClC,IAAuC,EACvC;EACA,IAAI,CAACc,IAAI,CAAC,KAAK,CAAC;EAChB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAAC+B,+BAA+B,CAACjC,IAAI,CAAC;EAC1C,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAASkC,mBAAmBA,CAEjCnC,IAA2B,EAC3B;EACA,MAAM;IAAEqB,QAAQ;IAAEe;EAAY,CAAC,GAAGpC,IAAI;EACtC,IAAIqB,QAAQ,EAAE;IACZ,IAAI,CAACP,IAAI,CAAC,UAAU,CAAC;IACrB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAI,CAACmC,2BAA2B,CAACrC,IAAI,CAAC;EACtC,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACK,cAAc,EAAEL,IAAI,CAAC;EACrC,IAAIoC,WAAW,EAAE;IACf,IAAI,CAAClC,KAAK,CAAC,CAAC;IACZ,IAAI,CAACD,SAAK,GAAI,CAAC;IACf,IAAI,CAACC,KAAK,CAAC,CAAC;IACZ,IAAI,CAACE,KAAK,CAACgC,WAAW,EAAEpC,IAAI,CAAC;EAC/B;EACA,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAASoC,2BAA2BA,CAEzCrC,IAAiD,EACjD;EACA,IAAIA,IAAI,CAACsC,QAAQ,EAAE;IACjB,IAAI,CAACrC,SAAK,GAAI,CAAC;EACjB;EACA,IAAI,CAACG,KAAK,CAACJ,IAAI,CAACuC,GAAG,EAAEvC,IAAI,CAAC;EAC1B,IAAIA,IAAI,CAACsC,QAAQ,EAAE;IACjB,IAAI,CAACrC,SAAK,GAAI,CAAC;EACjB;EACA,IAAID,IAAI,CAACG,QAAQ,EAAE;IACjB,IAAI,CAACF,SAAK,GAAI,CAAC;EACjB;AACF;AAEO,SAASuC,iBAAiBA,CAAgBxC,IAAyB,EAAE;EAC1E,MAAM;IAAEyC;EAAK,CAAC,GAAGzC,IAAI;EACrB,IAAIyC,IAAI,KAAK,KAAK,IAAIA,IAAI,KAAK,KAAK,EAAE;IACpC,IAAI,CAAC3B,IAAI,CAAC2B,IAAI,CAAC;IACf,IAAI,CAACvC,KAAK,CAAC,CAAC;EACd;EACA,IAAI,CAACmC,2BAA2B,CAACrC,IAAI,CAAC;EACtC,IAAI,CAACiC,+BAA+B,CAACjC,IAAI,CAAC;EAC1C,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAASyC,gBAAgBA,CAAgB1C,IAAwB,EAAE;EACxE,MAAM;IAAEqB,QAAQ;IAAEsB,MAAM,EAAEC;EAAS,CAAC,GAAG5C,IAAI;EAC3C,IAAI4C,QAAQ,EAAE;IACZ,IAAI,CAAC9B,IAAI,CAAC,QAAQ,CAAC;IACnB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAImB,QAAQ,EAAE;IACZ,IAAI,CAACP,IAAI,CAAC,UAAU,CAAC;IACrB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAI,CAACD,SAAK,GAAI,CAAC;EACf,IAAI,CAAC4C,WAAW,CAAC7C,IAAI,CAAC8C,UAAU,EAAE9C,IAAI,CAAC;EACvC,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI,CAACG,KAAK,CAACJ,IAAI,CAACK,cAAc,EAAEL,IAAI,CAAC;EACrC,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAAS8C,YAAYA,CAAA,EAAgB;EAC1C,IAAI,CAACjC,IAAI,CAAC,KAAK,CAAC;AAClB;AACO,SAASkC,eAAeA,CAAA,EAAgB;EAC7C,IAAI,CAAClC,IAAI,CAAC,QAAQ,CAAC;AACrB;AACO,SAASmC,gBAAgBA,CAAA,EAAgB;EAC9C,IAAI,CAACnC,IAAI,CAAC,SAAS,CAAC;AACtB;AACO,SAASoC,eAAeA,CAAA,EAAgB;EAC7C,IAAI,CAACpC,IAAI,CAAC,QAAQ,CAAC;AACrB;AACO,SAASqC,eAAeA,CAAA,EAAgB;EAC7C,IAAI,CAACrC,IAAI,CAAC,QAAQ,CAAC;AACrB;AACO,SAASsC,gBAAgBA,CAAA,EAAgB;EAC9C,IAAI,CAACtC,IAAI,CAAC,SAAS,CAAC;AACtB;AACO,SAASuC,eAAeA,CAAA,EAAgB;EAC7C,IAAI,CAACvC,IAAI,CAAC,QAAQ,CAAC;AACrB;AACO,SAASwC,eAAeA,CAAA,EAAgB;EAC7C,IAAI,CAACxC,IAAI,CAAC,QAAQ,CAAC;AACrB;AACO,SAASyC,aAAaA,CAAA,EAAgB;EAC3C,IAAI,CAACzC,IAAI,CAAC,MAAM,CAAC;AACnB;AACO,SAAS0C,kBAAkBA,CAAA,EAAgB;EAChD,IAAI,CAAC1C,IAAI,CAAC,WAAW,CAAC;AACxB;AACO,SAAS2C,aAAaA,CAAA,EAAgB;EAC3C,IAAI,CAAC3C,IAAI,CAAC,MAAM,CAAC;AACnB;AACO,SAAS4C,cAAcA,CAAA,EAAgB;EAC5C,IAAI,CAAC5C,IAAI,CAAC,OAAO,CAAC;AACpB;AACO,SAAS6C,kBAAkBA,CAAA,EAAgB;EAChD,IAAI,CAAC7C,IAAI,CAAC,WAAW,CAAC;AACxB;AAEO,SAAS8C,UAAUA,CAAA,EAAgB;EACxC,IAAI,CAAC9C,IAAI,CAAC,MAAM,CAAC;AACnB;AAEO,SAAS+C,cAAcA,CAAgB7D,IAAsB,EAAE;EACpE,IAAI,CAAC8D,gCAAgC,CAAC9D,IAAI,CAAC;AAC7C;AAEO,SAAS+D,iBAAiBA,CAAgB/D,IAAyB,EAAE;EAC1E,IAAIA,IAAI,CAACgE,QAAQ,EAAE;IACjB,IAAI,CAAClD,IAAI,CAAC,UAAU,CAAC;IACrB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAI,CAACY,IAAI,CAAC,KAAK,CAAC;EAChB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAAC4D,gCAAgC,CAAC9D,IAAI,CAAC;AAC7C;AAEO,SAAS8D,gCAAgCA,CAE9C9D,IAA4C,EAC5C;EACA,MAAM;IAAEiE;EAAe,CAAC,GAAGjE,IAAI;EAC/B,MAAM8C,UAAU,GAIZ9C,IAAI,CAAC8C,UAAU;EACnB,IAAI,CAAC1C,KAAK,CAAC6D,cAAc,EAAEjE,IAAI,CAAC;EAChC,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI,CAAC4C,WAAW,CAACC,UAAU,EAAE9C,IAAI,CAAC;EAClC,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,IAAI,CAACD,KAAK,CAAC,IAAI,CAAC;EAChB,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,MAAMgE,UAAU,GAIZlE,IAAI,CAACK,cAAc;EACvB,IAAI,CAACD,KAAK,CAAC8D,UAAU,CAAC7D,cAAc,EAAEL,IAAI,CAAC;AAC7C;AAEO,SAASmE,eAAeA,CAAgBnE,IAAuB,EAAE;EACtE,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACoE,QAAQ,EAAEpE,IAAI,EAAE,IAAI,CAAC;EACrC,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACiE,cAAc,EAAEjE,IAAI,EAAE,IAAI,CAAC;AAC7C;AAEO,SAASqE,eAAeA,CAAgBrE,IAAuB,EAAE;EACtE,IAAIA,IAAI,CAACsE,OAAO,EAAE;IAChB,IAAI,CAACxD,IAAI,CAAC,SAAS,CAAC;IACpB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACuE,aAAa,CAAC;EAC9B,IAAIvE,IAAI,CAACK,cAAc,EAAE;IACvB,IAAI,CAACH,KAAK,CAAC,CAAC;IACZ,IAAI,CAACY,IAAI,CAAC,IAAI,CAAC;IACf,IAAI,CAACZ,KAAK,CAAC,CAAC;IACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACK,cAAc,CAACA,cAAc,CAAC;EAChD;AACF;AAEO,SAASmE,WAAWA,CAAgBxE,IAAmB,EAAE;EAC9D,IAAI,CAACc,IAAI,CAAC,QAAQ,CAAC;EACnB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACyE,QAAQ,CAAC;EAEzB,IAAIzE,IAAI,CAACiE,cAAc,EAAE;IACvB,IAAI,CAAC7D,KAAK,CAACJ,IAAI,CAACiE,cAAc,EAAEjE,IAAI,CAAC;EACvC;AACF;AAEO,SAAS0E,aAAaA,CAAgB1E,IAAqB,EAAE;EAClE,IAAI,CAAC2E,iCAAiC,CAAC3E,IAAI,CAAC4E,OAAO,EAAE5E,IAAI,CAAC;AAC5D;AAEO,SAAS2E,iCAAiCA,CAE/CC,OAA0B,EAC1B5E,IAAkC,EAClC;EACA6E,aAAa,CAAC,IAAI,EAAED,OAAO,EAAE5E,IAAI,CAAC;AACpC;AAEA,SAAS6E,aAAaA,CAACC,OAAgB,EAAEF,OAAiB,EAAE5E,IAAY,EAAE;EACxE8E,OAAO,CAAC7E,KAAK,CAAC,GAAG,CAAC;EAClB,IAAI2E,OAAO,CAACjE,MAAM,EAAE;IAClBmE,OAAO,CAACC,MAAM,CAAC,CAAC;IAChBD,OAAO,CAACE,OAAO,CAAC,CAAC;IACjB,KAAK,MAAMC,MAAM,IAAIL,OAAO,EAAE;MAC5BE,OAAO,CAAC1E,KAAK,CAAC6E,MAAM,EAAEjF,IAAI,CAAC;MAE3B8E,OAAO,CAACE,OAAO,CAAC,CAAC;IACnB;IACAF,OAAO,CAACI,MAAM,CAAC,CAAC;EAClB;EAEAJ,OAAO,CAACK,UAAU,CAACnF,IAAI,CAAC;AAC1B;AAEO,SAASoF,WAAWA,CAAgBpF,IAAmB,EAAE;EAC9D,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACqF,WAAW,EAAErF,IAAI,EAAE,IAAI,CAAC;EAExC,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC;AAClB;AAEO,SAASqF,WAAWA,CAAgBtF,IAAmB,EAAE;EAC9D,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI,CAACO,SAAS,CAACR,IAAI,CAACuF,YAAY,EAAEvF,IAAI,CAAC;EACvC,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAASuF,cAAcA,CAAgBxF,IAAsB,EAAE;EACpE,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACK,cAAc,EAAEL,IAAI,CAAC;EACrC,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAASwF,UAAUA,CAAgBzF,IAAkB,EAAE;EAC5D,IAAI,CAACC,KAAK,CAAC,KAAK,CAAC;EACjB,IAAI,CAACG,KAAK,CAACJ,IAAI,CAACK,cAAc,EAAEL,IAAI,CAAC;AACvC;AAEO,SAAS0F,kBAAkBA,CAAgB1F,IAA0B,EAAE;EAC5E,IAAI,CAACI,KAAK,CAACJ,IAAI,CAAC2F,KAAK,EAAE3F,IAAI,CAAC;EAC5B,IAAIA,IAAI,CAACG,QAAQ,EAAE,IAAI,CAACF,SAAK,GAAI,CAAC;EAClC,IAAI,CAACA,SAAK,GAAI,CAAC;EACf,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACqF,WAAW,EAAErF,IAAI,CAAC;AACpC;AAEO,SAAS4F,WAAWA,CAAgB5F,IAAmB,EAAE;EAC9D6F,8BAA8B,CAAC,IAAI,EAAE7F,IAAI,EAAE,GAAG,CAAC;AACjD;AAEO,SAAS8F,kBAAkBA,CAAgB9F,IAA0B,EAAE;EAC5E6F,8BAA8B,CAAC,IAAI,EAAE7F,IAAI,EAAE,GAAG,CAAC;AACjD;AAEA,SAAS6F,8BAA8BA,CACrCf,OAAgB,EAChB9E,IAA0C,EAC1C+F,GAAc,EACd;EACAjB,OAAO,CAACkB,SAAS,CAAChG,IAAI,CAACiG,KAAK,EAAEjG,IAAI,EAAE;IAClCkG,SAASA,CAAA,EAAG;MACV,IAAI,CAAChG,KAAK,CAAC,CAAC;MACZ,IAAI,CAACD,KAAK,CAAC8F,GAAG,CAAC;MACf,IAAI,CAAC7F,KAAK,CAAC,CAAC;IACd;EACF,CAAC,CAAC;AACJ;AAEO,SAASiG,iBAAiBA,CAAgBnG,IAAyB,EAAE;EAC1E,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACoG,SAAS,CAAC;EAC1B,IAAI,CAAClG,KAAK,CAAC,CAAC;EACZ,IAAI,CAACY,IAAI,CAAC,SAAS,CAAC;EACpB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACqG,WAAW,CAAC;EAC5B,IAAI,CAACnG,KAAK,CAAC,CAAC;EACZ,IAAI,CAACD,SAAK,GAAI,CAAC;EACf,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACsG,QAAQ,CAAC;EACzB,IAAI,CAACpG,KAAK,CAAC,CAAC;EACZ,IAAI,CAACD,SAAK,GAAI,CAAC;EACf,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACuG,SAAS,CAAC;AAC5B;AAEO,SAASC,WAAWA,CAAgBxG,IAAmB,EAAE;EAC9D,IAAI,CAACC,KAAK,CAAC,OAAO,CAAC;EACnB,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACyG,aAAa,CAAC;AAChC;AAEO,SAASC,mBAAmBA,CAEjC1G,IAA2B,EAC3B;EACA,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI,CAACG,KAAK,CAACJ,IAAI,CAACK,cAAc,EAAEL,IAAI,CAAC;EACrC,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAAS0G,cAAcA,CAAgB3G,IAAsB,EAAE;EACpE,IAAI,CAACc,IAAI,CAACd,IAAI,CAAC4G,QAAQ,CAAC;EACxB,IAAI,CAAC1G,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACK,cAAc,EAAEL,IAAI,CAAC;AACvC;AAEO,SAAS6G,mBAAmBA,CAEjC7G,IAA2B,EAC3B;EACA,IAAI,CAACI,KAAK,CAACJ,IAAI,CAAC8G,UAAU,EAAE9G,IAAI,EAAE,IAAI,CAAC;EACvC,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI,CAACG,KAAK,CAACJ,IAAI,CAAC+G,SAAS,EAAE/G,IAAI,CAAC;EAChC,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAAS+G,YAAYA,CAAgBhH,IAAoB,EAAE;EAChE,MAAM;IAAEiH,QAAQ;IAAE9G,QAAQ;IAAEkB,QAAQ;IAAEoF;EAAc,CAAC,GAAGzG,IAAI;EAC5D,IAAI,CAACC,SAAK,IAAI,CAAC;EACf,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,IAAImB,QAAQ,EAAE;IACZ6F,gBAAgB,CAAC,IAAI,EAAE7F,QAAQ,CAAC;IAChC,IAAI,CAACP,IAAI,CAAC,UAAU,CAAC;IACrB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EAEA,IAAI,CAACD,SAAK,GAAI,CAAC;EACf,IAAI,CAACa,IAAI,CAEF2F,aAAa,CAACzF,IAErB,CAAC;EACD,IAAI,CAACd,KAAK,CAAC,CAAC;EACZ,IAAI,CAACY,IAAI,CAAC,IAAI,CAAC;EACf,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACqG,aAAa,CAACxF,UAAU,EAAEwF,aAAa,CAAC;EAEnD,IAAIQ,QAAQ,EAAE;IACZ,IAAI,CAAC/G,KAAK,CAAC,CAAC;IACZ,IAAI,CAACY,IAAI,CAAC,IAAI,CAAC;IACf,IAAI,CAACZ,KAAK,CAAC,CAAC;IACZ,IAAI,CAACE,KAAK,CAAC6G,QAAQ,EAAEjH,IAAI,CAAC;EAC5B;EAEA,IAAI,CAACC,SAAK,GAAI,CAAC;EAEf,IAAIE,QAAQ,EAAE;IACZ+G,gBAAgB,CAAC,IAAI,EAAE/G,QAAQ,CAAC;IAChC,IAAI,CAACF,SAAK,GAAI,CAAC;EACjB;EACA,IAAI,CAACA,SAAK,GAAI,CAAC;EACf,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACK,cAAc,EAAEL,IAAI,CAAC;EACrC,IAAI,CAACE,KAAK,CAAC,CAAC;EACZ,IAAI,CAACD,SAAK,IAAI,CAAC;AACjB;AAEA,SAASiH,gBAAgBA,CAACC,IAAa,EAAEC,GAAqB,EAAE;EAC9D,IAAIA,GAAG,KAAK,IAAI,EAAE;IAChBD,IAAI,CAAClH,KAAK,CAACmH,GAAG,CAAC;EACjB;AACF;AAEO,SAASC,aAAaA,CAAgBrH,IAAqB,EAAE;EAClE,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACsH,OAAO,EAAEtH,IAAI,CAAC;AAChC;AAEO,SAASuH,6BAA6BA,CAE3CvH,IAAqC,EACrC;EACA,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACwH,UAAU,EAAExH,IAAI,CAAC;EACjC,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACiE,cAAc,EAAEjE,IAAI,CAAC;AACvC;AAEO,SAASyH,sBAAsBA,CAEpCzH,IAA8B,EAC9B;EACA,MAAM;IAAEyB,OAAO;IAAEiG,EAAE;IAAEzD,cAAc;IAAE0D,OAAO,EAAEC,OAAO;IAAEC;EAAK,CAAC,GAAG7H,IAAI;EACpE,IAAIyB,OAAO,EAAE;IACX,IAAI,CAACX,IAAI,CAAC,SAAS,CAAC;IACpB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAI,CAACY,IAAI,CAAC,WAAW,CAAC;EACtB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACsH,EAAE,EAAE1H,IAAI,CAAC;EACpB,IAAI,CAACI,KAAK,CAAC6D,cAAc,EAAEjE,IAAI,CAAC;EAChC,IAAI4H,OAAO,YAAPA,OAAO,CAAEjH,MAAM,EAAE;IACnB,IAAI,CAACT,KAAK,CAAC,CAAC;IACZ,IAAI,CAACY,IAAI,CAAC,SAAS,CAAC;IACpB,IAAI,CAACZ,KAAK,CAAC,CAAC;IACZ,IAAI,CAACM,SAAS,CAACoH,OAAO,EAAE5H,IAAI,CAAC;EAC/B;EACA,IAAI,CAACE,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACyH,IAAI,EAAE7H,IAAI,CAAC;AACxB;AAEO,SAAS8H,eAAeA,CAAgB9H,IAAuB,EAAE;EACtE,IAAI,CAAC2E,iCAAiC,CAAC3E,IAAI,CAAC6H,IAAI,EAAE7H,IAAI,CAAC;AACzD;AAEO,SAAS+H,sBAAsBA,CAEpC/H,IAA8B,EAC9B;EACA,MAAM;IAAEyB,OAAO;IAAEiG,EAAE;IAAEzD,cAAc;IAAE5D;EAAe,CAAC,GAAGL,IAAI;EAC5D,IAAIyB,OAAO,EAAE;IACX,IAAI,CAACX,IAAI,CAAC,SAAS,CAAC;IACpB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAI,CAACY,IAAI,CAAC,MAAM,CAAC;EACjB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACsH,EAAE,EAAE1H,IAAI,CAAC;EACpB,IAAI,CAACI,KAAK,CAAC6D,cAAc,EAAEjE,IAAI,CAAC;EAChC,IAAI,CAACE,KAAK,CAAC,CAAC;EACZ,IAAI,CAACD,SAAK,GAAI,CAAC;EACf,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACC,cAAc,EAAEL,IAAI,CAAC;EAChC,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEA,SAAS+H,gBAAgBA,CAEvBhI,IAAgD,EAChD;EAAA,IAAAiI,qBAAA;EACA,MAAM;IAAEvH,IAAI;IAAE8G,UAAU;IAAEnH;EAAe,CAAC,GAAGL,IAAI;EACjD,MAAMkI,WAAW,GAAG,CAAC,GAAAD,qBAAA,GAACT,UAAU,CAACW,gBAAgB,aAA3BF,qBAAA,CAA6BtH,MAAM;EACzD,IAAI,CAACP,KAAK,CAACoH,UAAU,EAAExH,IAAI,EAAE,IAAI,EAAEoI,SAAS,EAAEF,WAAW,CAAC;EAC1D,IAAI,CAAChI,KAAK,CAAC,CAAC;EACZ,IAAI,CAACY,IAAI,CAACJ,IAAI,KAAK,gBAAgB,GAAG,IAAI,GAAG,WAAW,CAAC;EACzD,IAAI,CAACR,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACC,cAAc,EAAEL,IAAI,CAAC;AAClC;AAOO,SAASqI,eAAeA,CAAgBrI,IAAuB,EAAE;EACtE,MAAM;IAAEK,cAAc;IAAEmH;EAAW,CAAC,GAAGxH,IAAI;EAC3C,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI,CAACG,KAAK,CAACC,cAAc,EAAEL,IAAI,CAAC;EAChC,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACoH,UAAU,EAAExH,IAAI,CAAC;AAC9B;AAEO,SAASsI,yBAAyBA,CAEvCtI,IAAiC,EACjC;EACA,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACwH,UAAU,EAAExH,IAAI,CAAC;EACjC,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACiE,cAAc,EAAEjE,IAAI,CAAC;AACvC;AAEO,SAASuI,iBAAiBA,CAAgBvI,IAAyB,EAAE;EAC1E,MAAM;IAAEyB,OAAO;IAAE+G,KAAK,EAAEC,OAAO;IAAEf,EAAE;IAAE9C;EAAQ,CAAC,GAAG5E,IAAI;EACrD,IAAIyB,OAAO,EAAE;IACX,IAAI,CAACX,IAAI,CAAC,SAAS,CAAC;IACpB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAIuI,OAAO,EAAE;IACX,IAAI,CAAC3H,IAAI,CAAC,OAAO,CAAC;IAClB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAI,CAACY,IAAI,CAAC,MAAM,CAAC;EACjB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACsH,EAAE,EAAE1H,IAAI,CAAC;EACpB,IAAI,CAACE,KAAK,CAAC,CAAC;EACZ2E,aAAa,CAAC,IAAI,EAAED,OAAO,EAAE5E,IAAI,CAAC;AACpC;AAEO,SAAS0I,YAAYA,CAAgB1I,IAAoB,EAAE;EAChE,MAAM;IAAE0H,EAAE;IAAEtF;EAAY,CAAC,GAAGpC,IAAI;EAChC,IAAI,CAACI,KAAK,CAACsH,EAAE,EAAE1H,IAAI,CAAC;EACpB,IAAIoC,WAAW,EAAE;IACf,IAAI,CAAClC,KAAK,CAAC,CAAC;IACZ,IAAI,CAACD,SAAK,GAAI,CAAC;IACf,IAAI,CAACC,KAAK,CAAC,CAAC;IACZ,IAAI,CAACE,KAAK,CAACgC,WAAW,EAAEpC,IAAI,CAAC;EAC/B;EACA,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAAS0I,mBAAmBA,CAEjC3I,IAA2B,EAC3B;EACA,MAAM;IAAEyB,OAAO;IAAEiG;EAAG,CAAC,GAAG1H,IAAI;EAE5B,IAAIyB,OAAO,EAAE;IACX,IAAI,CAACX,IAAI,CAAC,SAAS,CAAC;IACpB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EAEA,IAAI,CAACF,IAAI,CAAC4I,MAAM,EAAE;IAChB,IAAI,CAAC9H,IAAI,CAAC4G,EAAE,CAAChH,IAAI,KAAK,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC5D,IAAI,CAACR,KAAK,CAAC,CAAC;EACd;EACA,IAAI,CAACE,KAAK,CAACsH,EAAE,EAAE1H,IAAI,CAAC;EAEpB,IAAI,CAACA,IAAI,CAAC6H,IAAI,EAAE;IACd,IAAI,CAAC5H,SAAK,GAAI,CAAC;IACf;EACF;EAEA,IAAI4H,IAAI,GAAG7H,IAAI,CAAC6H,IAAI;EACpB,OAAOA,IAAI,CAACnH,IAAI,KAAK,qBAAqB,EAAE;IAC1C,IAAI,CAACT,SAAK,GAAI,CAAC;IACf,IAAI,CAACG,KAAK,CAACyH,IAAI,CAACH,EAAE,EAAEG,IAAI,CAAC;IACzBA,IAAI,GAAGA,IAAI,CAACA,IAAI;EAClB;EAEA,IAAI,CAAC3H,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACyH,IAAI,EAAE7H,IAAI,CAAC;AACxB;AAEO,SAAS6I,aAAaA,CAAgB7I,IAAqB,EAAE;EAClE6E,aAAa,CAAC,IAAI,EAAE7E,IAAI,CAAC6H,IAAI,EAAE7H,IAAI,CAAC;AACtC;AAEO,SAAS8I,YAAYA,CAAgB9I,IAAoB,EAAE;EAChE,MAAM;IAAE+I,QAAQ;IAAEC,SAAS;IAAE/E;EAAe,CAAC,GAAGjE,IAAI;EACpD,IAAI,CAACc,IAAI,CAAC,QAAQ,CAAC;EACnB,IAAI,CAACb,SAAK,GAAI,CAAC;EACf,IAAI,CAACG,KAAK,CAAC2I,QAAQ,EAAE/I,IAAI,CAAC;EAC1B,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI+I,SAAS,EAAE;IACb,IAAI,CAAC/I,SAAK,GAAI,CAAC;IACf,IAAI,CAACG,KAAK,CAAC4I,SAAS,EAAEhJ,IAAI,CAAC;EAC7B;EACA,IAAIiE,cAAc,EAAE;IAClB,IAAI,CAAC7D,KAAK,CAAC6D,cAAc,EAAEjE,IAAI,CAAC;EAClC;AACF;AAEO,SAASiJ,yBAAyBA,CAEvCjJ,IAAiC,EACjC;EACA,MAAM;IAAEkJ,QAAQ;IAAExB,EAAE;IAAEyB;EAAgB,CAAC,GAAGnJ,IAAI;EAC9C,IAAIkJ,QAAQ,EAAE;IACZ,IAAI,CAACpI,IAAI,CAAC,QAAQ,CAAC;IACnB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAI,CAACY,IAAI,CAAC,QAAQ,CAAC;EACnB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACsH,EAAE,EAAE1H,IAAI,CAAC;EACpB,IAAI,CAACE,KAAK,CAAC,CAAC;EACZ,IAAI,CAACD,SAAK,GAAI,CAAC;EACf,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAAC+I,eAAe,EAAEnJ,IAAI,CAAC;EACjC,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAASmJ,yBAAyBA,CAEvCpJ,IAAiC,EACjC;EACA,IAAI,CAACC,KAAK,CAAC,UAAU,CAAC;EACtB,IAAI,CAACG,KAAK,CAACJ,IAAI,CAACwH,UAAU,EAAExH,IAAI,CAAC;EACjC,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAASoJ,mBAAmBA,CAEjCrJ,IAA2B,EAC3B;EACA,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACwH,UAAU,EAAExH,IAAI,CAAC;EACjC,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAASqJ,kBAAkBA,CAAgBtJ,IAA0B,EAAE;EAC5E,IAAI,CAACc,IAAI,CAAC,QAAQ,CAAC;EACnB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAACD,SAAK,GAAI,CAAC;EACf,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAACwH,UAAU,EAAExH,IAAI,CAAC;EACjC,IAAI,CAACC,SAAK,GAAI,CAAC;AACjB;AAEO,SAASsJ,4BAA4BA,CAE1CvJ,IAAoC,EACpC;EACA,IAAI,CAACc,IAAI,CAAC,QAAQ,CAAC;EACnB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAACY,IAAI,CAAC,IAAI,CAAC;EACf,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAACY,IAAI,CAAC,WAAW,CAAC;EACtB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACZ,IAAI,CAACE,KAAK,CAACJ,IAAI,CAAC0H,EAAE,EAAE1H,IAAI,CAAC;AAC3B;AAEO,SAASiC,+BAA+BA,CAAgBjC,IAAS,EAAE;EACxE,MAAM;IAAEiE;EAAe,CAAC,GAAGjE,IAAI;EAC/B,MAAM8C,UAAU,GAEZ9C,IAAI,CAAC8C,UAAU;EACnB,IAAI,CAAC1C,KAAK,CAAC6D,cAAc,EAAEjE,IAAI,CAAC;EAChC,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,IAAI,CAAC4C,WAAW,CAACC,UAAU,EAAE9C,IAAI,CAAC;EAClC,IAAI,CAACC,SAAK,GAAI,CAAC;EACf,MAAMiE,UAAU,GAEZlE,IAAI,CAACK,cAAc;EACvB,IAAI,CAACD,KAAK,CAAC8D,UAAU,EAAElE,IAAI,CAAC;AAC9B;AAEO,SAASwJ,2BAA2BA,CAEzCxJ,IAKqB,EACrB;EACA,MAAMyJ,OAAO,GACXzJ,IAAI,CAACU,IAAI,KAAK,uBAAuB,IAAIV,IAAI,CAACU,IAAI,KAAK,eAAe;EACxE,IAAI+I,OAAO,IAAIzJ,IAAI,CAACyB,OAAO,EAAE;IAC3B,IAAI,CAACX,IAAI,CAAC,SAAS,CAAC;IACpB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAIF,IAAI,CAACoB,aAAa,EAAE;IACtB,IAAI,CAACN,IAAI,CAACd,IAAI,CAACoB,aAAa,CAAC;IAC7B,IAAI,CAAClB,KAAK,CAAC,CAAC;EACd;EACA,IAAIF,IAAI,CAAC2C,MAAM,EAAE;IACf,IAAI,CAAC7B,IAAI,CAAC,QAAQ,CAAC;IACnB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAIF,IAAI,CAAC0J,QAAQ,EAAE;IACjB,IAAI,CAAC5I,IAAI,CAAC,UAAU,CAAC;IACrB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAIF,IAAI,CAACgE,QAAQ,EAAE;IACjB,IAAI,CAAClD,IAAI,CAAC,UAAU,CAAC;IACrB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;EACA,IAAIuJ,OAAO,IAAIzJ,IAAI,CAACqB,QAAQ,EAAE;IAC5B,IAAI,CAACP,IAAI,CAAC,UAAU,CAAC;IACrB,IAAI,CAACZ,KAAK,CAAC,CAAC;EACd;AACF"} \ No newline at end of file +{"version":3,"names":["TSTypeAnnotation","node","token","space","optional","print","typeAnnotation","TSTypeParameterInstantiation","parent","printList","params","type","length","TSTypeParameter","in","word","out","name","constraint","default","TSParameterProperty","accessibility","readonly","_param","parameter","TSDeclareFunction","declare","_functionHead","TSDeclareMethod","_classMethodHead","TSQualifiedName","left","right","TSCallSignatureDeclaration","tsPrintSignatureDeclarationBase","TSConstructSignatureDeclaration","TSPropertySignature","tsPrintPropertyOrMethodName","computed","key","TSMethodSignature","kind","TSIndexSignature","static","isStatic","_parameters","parameters","TSAnyKeyword","TSBigIntKeyword","TSUnknownKeyword","TSNumberKeyword","TSObjectKeyword","TSBooleanKeyword","TSStringKeyword","TSSymbolKeyword","TSVoidKeyword","TSUndefinedKeyword","TSNullKeyword","TSNeverKeyword","TSIntrinsicKeyword","TSThisType","TSFunctionType","tsPrintFunctionOrConstructorType","TSConstructorType","abstract","typeParameters","returnType","TSTypeReference","typeName","TSTypePredicate","asserts","parameterName","TSTypeQuery","exprName","TSTypeLiteral","tsPrintTypeLiteralOrInterfaceBody","members","tsPrintBraced","printer","indent","newline","member","dedent","rightBrace","TSArrayType","elementType","TSTupleType","elementTypes","TSOptionalType","TSRestType","TSNamedTupleMember","label","TSUnionType","tsPrintUnionOrIntersectionType","TSIntersectionType","sep","printJoin","types","separator","TSConditionalType","checkType","extendsType","trueType","falseType","TSInferType","typeParameter","TSParenthesizedType","TSTypeOperator","operator","TSIndexedAccessType","objectType","indexType","TSMappedType","nameType","tokenIfPlusMinus","self","tok","TSLiteralType","literal","TSExpressionWithTypeArguments","expression","TSInterfaceDeclaration","id","extends","extendz","body","TSInterfaceBody","TSTypeAliasDeclaration","TSTypeExpression","_expression$trailingC","forceParens","trailingComments","undefined","TSTypeAssertion","TSInstantiationExpression","TSEnumDeclaration","const","isConst","TSEnumMember","initializer","TSModuleDeclaration","global","TSModuleBlock","TSImportType","argument","qualifier","TSImportEqualsDeclaration","isExport","moduleReference","TSExternalModuleReference","TSNonNullExpression","TSExportAssignment","TSNamespaceExportDeclaration","tsPrintClassMemberModifiers","isField","override"],"sources":["../../src/generators/typescript.ts"],"sourcesContent":["import type Printer from \"../printer.ts\";\nimport type * as t from \"@babel/types\";\nimport type { NodePath } from \"@babel/traverse\";\n\nexport function TSTypeAnnotation(this: Printer, node: t.TSTypeAnnotation) {\n this.token(\":\");\n this.space();\n // @ts-expect-error todo(flow->ts) can this be removed? `.optional` looks to be not existing property\n if (node.optional) this.token(\"?\");\n this.print(node.typeAnnotation, node);\n}\n\nexport function TSTypeParameterInstantiation(\n this: Printer,\n node: t.TSTypeParameterInstantiation,\n parent: t.Node,\n): void {\n this.token(\"<\");\n this.printList(node.params, node, {});\n if (parent.type === \"ArrowFunctionExpression\" && node.params.length === 1) {\n this.token(\",\");\n }\n this.token(\">\");\n}\n\nexport { TSTypeParameterInstantiation as TSTypeParameterDeclaration };\n\nexport function TSTypeParameter(this: Printer, node: t.TSTypeParameter) {\n if (node.in) {\n this.word(\"in\");\n this.space();\n }\n\n if (node.out) {\n this.word(\"out\");\n this.space();\n }\n\n this.word(\n !process.env.BABEL_8_BREAKING\n ? (node.name as unknown as string)\n : (node.name as unknown as t.Identifier).name,\n );\n\n if (node.constraint) {\n this.space();\n this.word(\"extends\");\n this.space();\n this.print(node.constraint, node);\n }\n\n if (node.default) {\n this.space();\n this.token(\"=\");\n this.space();\n this.print(node.default, node);\n }\n}\n\nexport function TSParameterProperty(\n this: Printer,\n node: t.TSParameterProperty,\n) {\n if (node.accessibility) {\n this.word(node.accessibility);\n this.space();\n }\n\n if (node.readonly) {\n this.word(\"readonly\");\n this.space();\n }\n\n this._param(node.parameter);\n}\n\nexport function TSDeclareFunction(\n this: Printer,\n node: t.TSDeclareFunction,\n parent: NodePath[\"parent\"],\n) {\n if (node.declare) {\n this.word(\"declare\");\n this.space();\n }\n this._functionHead(node, parent);\n this.token(\";\");\n}\n\nexport function TSDeclareMethod(this: Printer, node: t.TSDeclareMethod) {\n this._classMethodHead(node);\n this.token(\";\");\n}\n\nexport function TSQualifiedName(this: Printer, node: t.TSQualifiedName) {\n this.print(node.left, node);\n this.token(\".\");\n this.print(node.right, node);\n}\n\nexport function TSCallSignatureDeclaration(\n this: Printer,\n node: t.TSCallSignatureDeclaration,\n) {\n this.tsPrintSignatureDeclarationBase(node);\n this.token(\";\");\n}\n\nexport function TSConstructSignatureDeclaration(\n this: Printer,\n node: t.TSConstructSignatureDeclaration,\n) {\n this.word(\"new\");\n this.space();\n this.tsPrintSignatureDeclarationBase(node);\n this.token(\";\");\n}\n\nexport function TSPropertySignature(\n this: Printer,\n node: t.TSPropertySignature,\n) {\n const { readonly } = node;\n if (readonly) {\n this.word(\"readonly\");\n this.space();\n }\n this.tsPrintPropertyOrMethodName(node);\n this.print(node.typeAnnotation, node);\n this.token(\";\");\n}\n\nexport function tsPrintPropertyOrMethodName(\n this: Printer,\n node: t.TSPropertySignature | t.TSMethodSignature,\n) {\n if (node.computed) {\n this.token(\"[\");\n }\n this.print(node.key, node);\n if (node.computed) {\n this.token(\"]\");\n }\n if (node.optional) {\n this.token(\"?\");\n }\n}\n\nexport function TSMethodSignature(this: Printer, node: t.TSMethodSignature) {\n const { kind } = node;\n if (kind === \"set\" || kind === \"get\") {\n this.word(kind);\n this.space();\n }\n this.tsPrintPropertyOrMethodName(node);\n this.tsPrintSignatureDeclarationBase(node);\n this.token(\";\");\n}\n\nexport function TSIndexSignature(this: Printer, node: t.TSIndexSignature) {\n const { readonly, static: isStatic } = node;\n if (isStatic) {\n this.word(\"static\");\n this.space();\n }\n if (readonly) {\n this.word(\"readonly\");\n this.space();\n }\n this.token(\"[\");\n this._parameters(node.parameters, node);\n this.token(\"]\");\n this.print(node.typeAnnotation, node);\n this.token(\";\");\n}\n\nexport function TSAnyKeyword(this: Printer) {\n this.word(\"any\");\n}\nexport function TSBigIntKeyword(this: Printer) {\n this.word(\"bigint\");\n}\nexport function TSUnknownKeyword(this: Printer) {\n this.word(\"unknown\");\n}\nexport function TSNumberKeyword(this: Printer) {\n this.word(\"number\");\n}\nexport function TSObjectKeyword(this: Printer) {\n this.word(\"object\");\n}\nexport function TSBooleanKeyword(this: Printer) {\n this.word(\"boolean\");\n}\nexport function TSStringKeyword(this: Printer) {\n this.word(\"string\");\n}\nexport function TSSymbolKeyword(this: Printer) {\n this.word(\"symbol\");\n}\nexport function TSVoidKeyword(this: Printer) {\n this.word(\"void\");\n}\nexport function TSUndefinedKeyword(this: Printer) {\n this.word(\"undefined\");\n}\nexport function TSNullKeyword(this: Printer) {\n this.word(\"null\");\n}\nexport function TSNeverKeyword(this: Printer) {\n this.word(\"never\");\n}\nexport function TSIntrinsicKeyword(this: Printer) {\n this.word(\"intrinsic\");\n}\n\nexport function TSThisType(this: Printer) {\n this.word(\"this\");\n}\n\nexport function TSFunctionType(this: Printer, node: t.TSFunctionType) {\n this.tsPrintFunctionOrConstructorType(node);\n}\n\nexport function TSConstructorType(this: Printer, node: t.TSConstructorType) {\n if (node.abstract) {\n this.word(\"abstract\");\n this.space();\n }\n this.word(\"new\");\n this.space();\n this.tsPrintFunctionOrConstructorType(node);\n}\n\nexport function tsPrintFunctionOrConstructorType(\n this: Printer,\n node: t.TSFunctionType | t.TSConstructorType,\n) {\n const { typeParameters } = node;\n const parameters = process.env.BABEL_8_BREAKING\n ? // @ts-ignore(Babel 7 vs Babel 8) Babel 8 AST shape\n node.params\n : // @ts-ignore(Babel 7 vs Babel 8) Babel 7 AST shape\n node.parameters;\n this.print(typeParameters, node);\n this.token(\"(\");\n this._parameters(parameters, node);\n this.token(\")\");\n this.space();\n this.token(\"=>\");\n this.space();\n const returnType = process.env.BABEL_8_BREAKING\n ? // @ts-ignore(Babel 7 vs Babel 8) Babel 8 AST shape\n node.returnType\n : // @ts-ignore(Babel 7 vs Babel 8) Babel 7 AST shape\n node.typeAnnotation;\n this.print(returnType.typeAnnotation, node);\n}\n\nexport function TSTypeReference(this: Printer, node: t.TSTypeReference) {\n this.print(node.typeName, node, true);\n this.print(node.typeParameters, node, true);\n}\n\nexport function TSTypePredicate(this: Printer, node: t.TSTypePredicate) {\n if (node.asserts) {\n this.word(\"asserts\");\n this.space();\n }\n this.print(node.parameterName);\n if (node.typeAnnotation) {\n this.space();\n this.word(\"is\");\n this.space();\n this.print(node.typeAnnotation.typeAnnotation);\n }\n}\n\nexport function TSTypeQuery(this: Printer, node: t.TSTypeQuery) {\n this.word(\"typeof\");\n this.space();\n this.print(node.exprName);\n\n if (node.typeParameters) {\n this.print(node.typeParameters, node);\n }\n}\n\nexport function TSTypeLiteral(this: Printer, node: t.TSTypeLiteral) {\n this.tsPrintTypeLiteralOrInterfaceBody(node.members, node);\n}\n\nexport function tsPrintTypeLiteralOrInterfaceBody(\n this: Printer,\n members: t.TSTypeElement[],\n node: t.TSType | t.TSInterfaceBody,\n) {\n tsPrintBraced(this, members, node);\n}\n\nfunction tsPrintBraced(printer: Printer, members: t.Node[], node: t.Node) {\n printer.token(\"{\");\n if (members.length) {\n printer.indent();\n printer.newline();\n for (const member of members) {\n printer.print(member, node);\n //this.token(sep);\n printer.newline();\n }\n printer.dedent();\n }\n\n printer.rightBrace(node);\n}\n\nexport function TSArrayType(this: Printer, node: t.TSArrayType) {\n this.print(node.elementType, node, true);\n\n this.token(\"[]\");\n}\n\nexport function TSTupleType(this: Printer, node: t.TSTupleType) {\n this.token(\"[\");\n this.printList(node.elementTypes, node);\n this.token(\"]\");\n}\n\nexport function TSOptionalType(this: Printer, node: t.TSOptionalType) {\n this.print(node.typeAnnotation, node);\n this.token(\"?\");\n}\n\nexport function TSRestType(this: Printer, node: t.TSRestType) {\n this.token(\"...\");\n this.print(node.typeAnnotation, node);\n}\n\nexport function TSNamedTupleMember(this: Printer, node: t.TSNamedTupleMember) {\n this.print(node.label, node);\n if (node.optional) this.token(\"?\");\n this.token(\":\");\n this.space();\n this.print(node.elementType, node);\n}\n\nexport function TSUnionType(this: Printer, node: t.TSUnionType) {\n tsPrintUnionOrIntersectionType(this, node, \"|\");\n}\n\nexport function TSIntersectionType(this: Printer, node: t.TSIntersectionType) {\n tsPrintUnionOrIntersectionType(this, node, \"&\");\n}\n\nfunction tsPrintUnionOrIntersectionType(\n printer: Printer,\n node: t.TSUnionType | t.TSIntersectionType,\n sep: \"|\" | \"&\",\n) {\n printer.printJoin(node.types, node, {\n separator() {\n this.space();\n this.token(sep);\n this.space();\n },\n });\n}\n\nexport function TSConditionalType(this: Printer, node: t.TSConditionalType) {\n this.print(node.checkType);\n this.space();\n this.word(\"extends\");\n this.space();\n this.print(node.extendsType);\n this.space();\n this.token(\"?\");\n this.space();\n this.print(node.trueType);\n this.space();\n this.token(\":\");\n this.space();\n this.print(node.falseType);\n}\n\nexport function TSInferType(this: Printer, node: t.TSInferType) {\n this.token(\"infer\");\n this.space();\n this.print(node.typeParameter);\n}\n\nexport function TSParenthesizedType(\n this: Printer,\n node: t.TSParenthesizedType,\n) {\n this.token(\"(\");\n this.print(node.typeAnnotation, node);\n this.token(\")\");\n}\n\nexport function TSTypeOperator(this: Printer, node: t.TSTypeOperator) {\n this.word(node.operator);\n this.space();\n this.print(node.typeAnnotation, node);\n}\n\nexport function TSIndexedAccessType(\n this: Printer,\n node: t.TSIndexedAccessType,\n) {\n this.print(node.objectType, node, true);\n this.token(\"[\");\n this.print(node.indexType, node);\n this.token(\"]\");\n}\n\nexport function TSMappedType(this: Printer, node: t.TSMappedType) {\n const { nameType, optional, readonly, typeParameter } = node;\n this.token(\"{\");\n this.space();\n if (readonly) {\n tokenIfPlusMinus(this, readonly);\n this.word(\"readonly\");\n this.space();\n }\n\n this.token(\"[\");\n this.word(\n !process.env.BABEL_8_BREAKING\n ? (typeParameter.name as unknown as string)\n : (typeParameter.name as unknown as t.Identifier).name,\n );\n this.space();\n this.word(\"in\");\n this.space();\n this.print(typeParameter.constraint, typeParameter);\n\n if (nameType) {\n this.space();\n this.word(\"as\");\n this.space();\n this.print(nameType, node);\n }\n\n this.token(\"]\");\n\n if (optional) {\n tokenIfPlusMinus(this, optional);\n this.token(\"?\");\n }\n this.token(\":\");\n this.space();\n this.print(node.typeAnnotation, node);\n this.space();\n this.token(\"}\");\n}\n\nfunction tokenIfPlusMinus(self: Printer, tok: true | \"+\" | \"-\") {\n if (tok !== true) {\n self.token(tok);\n }\n}\n\nexport function TSLiteralType(this: Printer, node: t.TSLiteralType) {\n this.print(node.literal, node);\n}\n\nexport function TSExpressionWithTypeArguments(\n this: Printer,\n node: t.TSExpressionWithTypeArguments,\n) {\n this.print(node.expression, node);\n this.print(node.typeParameters, node);\n}\n\nexport function TSInterfaceDeclaration(\n this: Printer,\n node: t.TSInterfaceDeclaration,\n) {\n const { declare, id, typeParameters, extends: extendz, body } = node;\n if (declare) {\n this.word(\"declare\");\n this.space();\n }\n this.word(\"interface\");\n this.space();\n this.print(id, node);\n this.print(typeParameters, node);\n if (extendz?.length) {\n this.space();\n this.word(\"extends\");\n this.space();\n this.printList(extendz, node);\n }\n this.space();\n this.print(body, node);\n}\n\nexport function TSInterfaceBody(this: Printer, node: t.TSInterfaceBody) {\n this.tsPrintTypeLiteralOrInterfaceBody(node.body, node);\n}\n\nexport function TSTypeAliasDeclaration(\n this: Printer,\n node: t.TSTypeAliasDeclaration,\n) {\n const { declare, id, typeParameters, typeAnnotation } = node;\n if (declare) {\n this.word(\"declare\");\n this.space();\n }\n this.word(\"type\");\n this.space();\n this.print(id, node);\n this.print(typeParameters, node);\n this.space();\n this.token(\"=\");\n this.space();\n this.print(typeAnnotation, node);\n this.token(\";\");\n}\n\nfunction TSTypeExpression(\n this: Printer,\n node: t.TSAsExpression | t.TSSatisfiesExpression,\n) {\n const { type, expression, typeAnnotation } = node;\n const forceParens = !!expression.trailingComments?.length;\n this.print(expression, node, true, undefined, forceParens);\n this.space();\n this.word(type === \"TSAsExpression\" ? \"as\" : \"satisfies\");\n this.space();\n this.print(typeAnnotation, node);\n}\n\nexport {\n TSTypeExpression as TSAsExpression,\n TSTypeExpression as TSSatisfiesExpression,\n};\n\nexport function TSTypeAssertion(this: Printer, node: t.TSTypeAssertion) {\n const { typeAnnotation, expression } = node;\n this.token(\"<\");\n this.print(typeAnnotation, node);\n this.token(\">\");\n this.space();\n this.print(expression, node);\n}\n\nexport function TSInstantiationExpression(\n this: Printer,\n node: t.TSInstantiationExpression,\n) {\n this.print(node.expression, node);\n this.print(node.typeParameters, node);\n}\n\nexport function TSEnumDeclaration(this: Printer, node: t.TSEnumDeclaration) {\n const { declare, const: isConst, id, members } = node;\n if (declare) {\n this.word(\"declare\");\n this.space();\n }\n if (isConst) {\n this.word(\"const\");\n this.space();\n }\n this.word(\"enum\");\n this.space();\n this.print(id, node);\n this.space();\n tsPrintBraced(this, members, node);\n}\n\nexport function TSEnumMember(this: Printer, node: t.TSEnumMember) {\n const { id, initializer } = node;\n this.print(id, node);\n if (initializer) {\n this.space();\n this.token(\"=\");\n this.space();\n this.print(initializer, node);\n }\n this.token(\",\");\n}\n\nexport function TSModuleDeclaration(\n this: Printer,\n node: t.TSModuleDeclaration,\n) {\n const { declare, id } = node;\n\n if (declare) {\n this.word(\"declare\");\n this.space();\n }\n\n if (!node.global) {\n this.word(id.type === \"Identifier\" ? \"namespace\" : \"module\");\n this.space();\n }\n this.print(id, node);\n\n if (!node.body) {\n this.token(\";\");\n return;\n }\n\n let body = node.body;\n while (body.type === \"TSModuleDeclaration\") {\n this.token(\".\");\n this.print(body.id, body);\n body = body.body;\n }\n\n this.space();\n this.print(body, node);\n}\n\nexport function TSModuleBlock(this: Printer, node: t.TSModuleBlock) {\n tsPrintBraced(this, node.body, node);\n}\n\nexport function TSImportType(this: Printer, node: t.TSImportType) {\n const { argument, qualifier, typeParameters } = node;\n this.word(\"import\");\n this.token(\"(\");\n this.print(argument, node);\n this.token(\")\");\n if (qualifier) {\n this.token(\".\");\n this.print(qualifier, node);\n }\n if (typeParameters) {\n this.print(typeParameters, node);\n }\n}\n\nexport function TSImportEqualsDeclaration(\n this: Printer,\n node: t.TSImportEqualsDeclaration,\n) {\n const { isExport, id, moduleReference } = node;\n if (isExport) {\n this.word(\"export\");\n this.space();\n }\n this.word(\"import\");\n this.space();\n this.print(id, node);\n this.space();\n this.token(\"=\");\n this.space();\n this.print(moduleReference, node);\n this.token(\";\");\n}\n\nexport function TSExternalModuleReference(\n this: Printer,\n node: t.TSExternalModuleReference,\n) {\n this.token(\"require(\");\n this.print(node.expression, node);\n this.token(\")\");\n}\n\nexport function TSNonNullExpression(\n this: Printer,\n node: t.TSNonNullExpression,\n) {\n this.print(node.expression, node);\n this.token(\"!\");\n}\n\nexport function TSExportAssignment(this: Printer, node: t.TSExportAssignment) {\n this.word(\"export\");\n this.space();\n this.token(\"=\");\n this.space();\n this.print(node.expression, node);\n this.token(\";\");\n}\n\nexport function TSNamespaceExportDeclaration(\n this: Printer,\n node: t.TSNamespaceExportDeclaration,\n) {\n this.word(\"export\");\n this.space();\n this.word(\"as\");\n this.space();\n this.word(\"namespace\");\n this.space();\n this.print(node.id, node);\n}\n\nexport function tsPrintSignatureDeclarationBase(this: Printer, node: any) {\n const { typeParameters } = node;\n const parameters = process.env.BABEL_8_BREAKING\n ? node.params\n : node.parameters;\n this.print(typeParameters, node);\n this.token(\"(\");\n this._parameters(parameters, node);\n this.token(\")\");\n const returnType = process.env.BABEL_8_BREAKING\n ? node.returnType\n : node.typeAnnotation;\n this.print(returnType, node);\n}\n\nexport function tsPrintClassMemberModifiers(\n this: Printer,\n node:\n | t.ClassProperty\n | t.ClassAccessorProperty\n | t.ClassMethod\n | t.ClassPrivateMethod\n | t.TSDeclareMethod,\n) {\n const isField =\n node.type === \"ClassAccessorProperty\" || node.type === \"ClassProperty\";\n if (isField && node.declare) {\n this.word(\"declare\");\n this.space();\n }\n if (node.accessibility) {\n this.word(node.accessibility);\n this.space();\n }\n if (node.static) {\n this.word(\"static\");\n this.space();\n }\n if (node.override) {\n this.word(\"override\");\n this.space();\n }\n if (node.abstract) {\n this.word(\"abstract\");\n this.space();\n }\n if (isField && node.readonly) {\n this.word(\"readonly\");\n this.space();\n }\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/generator/lib/index.js b/node_modules/@babel/generator/lib/index.js index cf7d0b7b20a3..f49be786222c 100644 --- a/node_modules/@babel/generator/lib/index.js +++ b/node_modules/@babel/generator/lib/index.js @@ -3,22 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.CodeGenerator = void 0; exports.default = generate; var _sourceMap = require("./source-map.js"); var _printer = require("./printer.js"); -class Generator extends _printer.default { - constructor(ast, opts = {}, code) { - const format = normalizeOptions(code, opts); - const map = opts.sourceMaps ? new _sourceMap.default(opts, code) : null; - super(format, map); - this.ast = void 0; - this.ast = ast; - } - generate() { - return super.generate(this.ast); - } -} function normalizeOptions(code, opts) { var _opts$recordAndTupleS; const format = { @@ -76,19 +63,27 @@ function normalizeOptions(code, opts) { } return format; } -class CodeGenerator { - constructor(ast, opts, code) { - this._generator = void 0; - this._generator = new Generator(ast, opts, code); - } - generate() { - return this._generator.generate(); - } +{ + exports.CodeGenerator = class CodeGenerator { + constructor(ast, opts = {}, code) { + this._ast = void 0; + this._format = void 0; + this._map = void 0; + this._ast = ast; + this._format = normalizeOptions(code, opts); + this._map = opts.sourceMaps ? new _sourceMap.default(opts, code) : null; + } + generate() { + const printer = new _printer.default(this._format, this._map); + return printer.generate(this._ast); + } + }; } -exports.CodeGenerator = CodeGenerator; -function generate(ast, opts, code) { - const gen = new Generator(ast, opts, code); - return gen.generate(); +function generate(ast, opts = {}, code) { + const format = normalizeOptions(code, opts); + const map = opts.sourceMaps ? new _sourceMap.default(opts, code) : null; + const printer = new _printer.default(format, map); + return printer.generate(ast); } //# sourceMappingURL=index.js.map diff --git a/node_modules/@babel/generator/lib/index.js.map b/node_modules/@babel/generator/lib/index.js.map index b36ed14cf6da..de38d1b83fc8 100644 --- a/node_modules/@babel/generator/lib/index.js.map +++ b/node_modules/@babel/generator/lib/index.js.map @@ -1 +1 @@ -{"version":3,"names":["_sourceMap","require","_printer","Generator","Printer","constructor","ast","opts","code","format","normalizeOptions","map","sourceMaps","SourceMap","generate","_opts$recordAndTupleS","auxiliaryCommentBefore","auxiliaryCommentAfter","shouldPrintComment","retainLines","retainFunctionParens","comments","compact","minified","concise","indent","adjustMultilineComment","style","jsescOption","Object","assign","quotes","wrap","minimal","recordAndTupleSyntaxType","topicToken","importAttributesKeyword","decoratorsBeforeExport","json","jsonCompatibleStrings","value","includes","length","console","error","filename","undefined","CodeGenerator","_generator","exports","gen"],"sources":["../src/index.ts"],"sourcesContent":["import SourceMap from \"./source-map.ts\";\nimport Printer from \"./printer.ts\";\nimport type * as t from \"@babel/types\";\nimport type { Opts as jsescOptions } from \"jsesc\";\nimport type { Format } from \"./printer.ts\";\nimport type {\n RecordAndTuplePluginOptions,\n PipelineOperatorPluginOptions,\n} from \"@babel/parser\";\nimport type {\n EncodedSourceMap,\n DecodedSourceMap,\n Mapping,\n} from \"@jridgewell/gen-mapping\";\n\n/**\n * Babel's code generator, turns an ast into code, maintaining sourcemaps,\n * user preferences, and valid output.\n */\n\nclass Generator extends Printer {\n constructor(\n ast: t.Node,\n opts: GeneratorOptions = {},\n code: string | { [filename: string]: string },\n ) {\n const format = normalizeOptions(code, opts);\n const map = opts.sourceMaps ? new SourceMap(opts, code) : null;\n super(format, map);\n\n this.ast = ast;\n }\n\n ast: t.Node;\n\n /**\n * Generate code and sourcemap from ast.\n *\n * Appends comments that weren't attached to any node to the end of the generated output.\n */\n\n generate() {\n return super.generate(this.ast);\n }\n}\n\n/**\n * Normalize generator options, setting defaults.\n *\n * - Detects code indentation.\n * - If `opts.compact = \"auto\"` and the code is over 500KB, `compact` will be set to `true`.\n */\n\nfunction normalizeOptions(\n code: string | { [filename: string]: string },\n opts: GeneratorOptions,\n): Format {\n const format: Format = {\n auxiliaryCommentBefore: opts.auxiliaryCommentBefore,\n auxiliaryCommentAfter: opts.auxiliaryCommentAfter,\n shouldPrintComment: opts.shouldPrintComment,\n retainLines: opts.retainLines,\n retainFunctionParens: opts.retainFunctionParens,\n comments: opts.comments == null || opts.comments,\n compact: opts.compact,\n minified: opts.minified,\n concise: opts.concise,\n indent: {\n adjustMultilineComment: true,\n style: \" \",\n },\n jsescOption: {\n quotes: \"double\",\n wrap: true,\n minimal: process.env.BABEL_8_BREAKING ? true : false,\n ...opts.jsescOption,\n },\n recordAndTupleSyntaxType: opts.recordAndTupleSyntaxType ?? \"hash\",\n topicToken: opts.topicToken,\n importAttributesKeyword: opts.importAttributesKeyword,\n };\n\n if (!process.env.BABEL_8_BREAKING) {\n format.decoratorsBeforeExport = opts.decoratorsBeforeExport;\n format.jsescOption.json = opts.jsonCompatibleStrings;\n }\n\n if (format.minified) {\n format.compact = true;\n\n format.shouldPrintComment =\n format.shouldPrintComment || (() => format.comments);\n } else {\n format.shouldPrintComment =\n format.shouldPrintComment ||\n (value =>\n format.comments ||\n value.includes(\"@license\") ||\n value.includes(\"@preserve\"));\n }\n\n if (format.compact === \"auto\") {\n format.compact = typeof code === \"string\" && code.length > 500_000; // 500KB\n\n if (format.compact) {\n console.error(\n \"[BABEL] Note: The code generator has deoptimised the styling of \" +\n `${opts.filename} as it exceeds the max of ${\"500KB\"}.`,\n );\n }\n }\n\n if (format.compact) {\n format.indent.adjustMultilineComment = false;\n }\n\n const { auxiliaryCommentBefore, auxiliaryCommentAfter, shouldPrintComment } =\n format;\n\n if (auxiliaryCommentBefore && !shouldPrintComment(auxiliaryCommentBefore)) {\n format.auxiliaryCommentBefore = undefined;\n }\n if (auxiliaryCommentAfter && !shouldPrintComment(auxiliaryCommentAfter)) {\n format.auxiliaryCommentAfter = undefined;\n }\n\n return format;\n}\n\nexport interface GeneratorOptions {\n /**\n * Optional string to add as a block comment at the start of the output file.\n */\n auxiliaryCommentBefore?: string;\n\n /**\n * Optional string to add as a block comment at the end of the output file.\n */\n auxiliaryCommentAfter?: string;\n\n /**\n * Function that takes a comment (as a string) and returns true if the comment should be included in the output.\n * By default, comments are included if `opts.comments` is `true` or if `opts.minified` is `false` and the comment\n * contains `@preserve` or `@license`.\n */\n shouldPrintComment?(comment: string): boolean;\n\n /**\n * Attempt to use the same line numbers in the output code as in the source code (helps preserve stack traces).\n * Defaults to `false`.\n */\n retainLines?: boolean;\n\n /**\n * Retain parens around function expressions (could be used to change engine parsing behavior)\n * Defaults to `false`.\n */\n retainFunctionParens?: boolean;\n\n /**\n * Should comments be included in output? Defaults to `true`.\n */\n comments?: boolean;\n\n /**\n * Set to true to avoid adding whitespace for formatting. Defaults to the value of `opts.minified`.\n */\n compact?: boolean | \"auto\";\n\n /**\n * Should the output be minified. Defaults to `false`.\n */\n minified?: boolean;\n\n /**\n * Set to true to reduce whitespace (but not as much as opts.compact). Defaults to `false`.\n */\n concise?: boolean;\n\n /**\n * Used in warning messages\n */\n filename?: string;\n\n /**\n * Enable generating source maps. Defaults to `false`.\n */\n sourceMaps?: boolean;\n\n inputSourceMap?: any;\n\n /**\n * A root for all relative URLs in the source map.\n */\n sourceRoot?: string;\n\n /**\n * The filename for the source code (i.e. the code in the `code` argument).\n * This will only be used if `code` is a string.\n */\n sourceFileName?: string;\n\n /**\n * Set to true to run jsesc with \"json\": true to print \"\\u00A9\" vs. \"©\";\n * @deprecated use `jsescOptions: { json: true }` instead\n */\n jsonCompatibleStrings?: boolean;\n\n /**\n * Set to true to enable support for experimental decorators syntax before\n * module exports. If not specified, decorators will be printed in the same\n * position as they were in the input source code.\n * @deprecated Removed in Babel 8\n */\n decoratorsBeforeExport?: boolean;\n\n /**\n * Options for outputting jsesc representation.\n */\n jsescOption?: jsescOptions;\n\n /**\n * For use with the recordAndTuple token.\n */\n recordAndTupleSyntaxType?: RecordAndTuplePluginOptions[\"syntaxType\"];\n\n /**\n * For use with the Hack-style pipe operator.\n * Changes what token is used for pipe bodies’ topic references.\n */\n topicToken?: PipelineOperatorPluginOptions[\"topicToken\"];\n\n /**\n * The import attributes syntax style:\n * - \"with\" : `import { a } from \"b\" with { type: \"json\" };`\n * - \"assert\" : `import { a } from \"b\" assert { type: \"json\" };`\n * - \"with-legacy\" : `import { a } from \"b\" with type: \"json\";`\n */\n importAttributesKeyword?: \"with\" | \"assert\" | \"with-legacy\";\n}\n\nexport interface GeneratorResult {\n code: string;\n map: EncodedSourceMap | null;\n decodedMap: DecodedSourceMap | undefined;\n rawMappings: Mapping[] | undefined;\n}\n\n/**\n * We originally exported the Generator class above, but to make it extra clear that it is a private API,\n * we have moved that to an internal class instance and simplified the interface to the two public methods\n * that we wish to support.\n */\n\nexport class CodeGenerator {\n private _generator: Generator;\n constructor(ast: t.Node, opts?: GeneratorOptions, code?: string) {\n this._generator = new Generator(ast, opts, code);\n }\n generate(): GeneratorResult {\n return this._generator.generate();\n }\n}\n\n/**\n * Turns an AST into code, maintaining sourcemaps, user preferences, and valid output.\n * @param ast - the abstract syntax tree from which to generate output code.\n * @param opts - used for specifying options for code generation.\n * @param code - the original source code, used for source maps.\n * @returns - an object containing the output code and source map.\n */\nexport default function generate(\n ast: t.Node,\n opts?: GeneratorOptions,\n code?: string | { [filename: string]: string },\n) {\n const gen = new Generator(ast, opts, code);\n return gen.generate();\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_sourceMap","require","_printer","normalizeOptions","code","opts","_opts$recordAndTupleS","format","auxiliaryCommentBefore","auxiliaryCommentAfter","shouldPrintComment","retainLines","retainFunctionParens","comments","compact","minified","concise","indent","adjustMultilineComment","style","jsescOption","Object","assign","quotes","wrap","minimal","recordAndTupleSyntaxType","topicToken","importAttributesKeyword","decoratorsBeforeExport","json","jsonCompatibleStrings","value","includes","length","console","error","filename","undefined","exports","CodeGenerator","constructor","ast","_ast","_format","_map","sourceMaps","SourceMap","generate","printer","Printer","map"],"sources":["../src/index.ts"],"sourcesContent":["import SourceMap from \"./source-map.ts\";\nimport Printer from \"./printer.ts\";\nimport type * as t from \"@babel/types\";\nimport type { Opts as jsescOptions } from \"jsesc\";\nimport type { Format } from \"./printer.ts\";\nimport type {\n RecordAndTuplePluginOptions,\n PipelineOperatorPluginOptions,\n} from \"@babel/parser\";\nimport type {\n EncodedSourceMap,\n DecodedSourceMap,\n Mapping,\n} from \"@jridgewell/gen-mapping\";\n\n/**\n * Normalize generator options, setting defaults.\n *\n * - Detects code indentation.\n * - If `opts.compact = \"auto\"` and the code is over 500KB, `compact` will be set to `true`.\n */\n\nfunction normalizeOptions(\n code: string | { [filename: string]: string },\n opts: GeneratorOptions,\n): Format {\n const format: Format = {\n auxiliaryCommentBefore: opts.auxiliaryCommentBefore,\n auxiliaryCommentAfter: opts.auxiliaryCommentAfter,\n shouldPrintComment: opts.shouldPrintComment,\n retainLines: opts.retainLines,\n retainFunctionParens: opts.retainFunctionParens,\n comments: opts.comments == null || opts.comments,\n compact: opts.compact,\n minified: opts.minified,\n concise: opts.concise,\n indent: {\n adjustMultilineComment: true,\n style: \" \",\n },\n jsescOption: {\n quotes: \"double\",\n wrap: true,\n minimal: process.env.BABEL_8_BREAKING ? true : false,\n ...opts.jsescOption,\n },\n recordAndTupleSyntaxType: opts.recordAndTupleSyntaxType ?? \"hash\",\n topicToken: opts.topicToken,\n importAttributesKeyword: opts.importAttributesKeyword,\n };\n\n if (!process.env.BABEL_8_BREAKING) {\n format.decoratorsBeforeExport = opts.decoratorsBeforeExport;\n format.jsescOption.json = opts.jsonCompatibleStrings;\n }\n\n if (format.minified) {\n format.compact = true;\n\n format.shouldPrintComment =\n format.shouldPrintComment || (() => format.comments);\n } else {\n format.shouldPrintComment =\n format.shouldPrintComment ||\n (value =>\n format.comments ||\n value.includes(\"@license\") ||\n value.includes(\"@preserve\"));\n }\n\n if (format.compact === \"auto\") {\n format.compact = typeof code === \"string\" && code.length > 500_000; // 500KB\n\n if (format.compact) {\n console.error(\n \"[BABEL] Note: The code generator has deoptimised the styling of \" +\n `${opts.filename} as it exceeds the max of ${\"500KB\"}.`,\n );\n }\n }\n\n if (format.compact) {\n format.indent.adjustMultilineComment = false;\n }\n\n const { auxiliaryCommentBefore, auxiliaryCommentAfter, shouldPrintComment } =\n format;\n\n if (auxiliaryCommentBefore && !shouldPrintComment(auxiliaryCommentBefore)) {\n format.auxiliaryCommentBefore = undefined;\n }\n if (auxiliaryCommentAfter && !shouldPrintComment(auxiliaryCommentAfter)) {\n format.auxiliaryCommentAfter = undefined;\n }\n\n return format;\n}\n\nexport interface GeneratorOptions {\n /**\n * Optional string to add as a block comment at the start of the output file.\n */\n auxiliaryCommentBefore?: string;\n\n /**\n * Optional string to add as a block comment at the end of the output file.\n */\n auxiliaryCommentAfter?: string;\n\n /**\n * Function that takes a comment (as a string) and returns true if the comment should be included in the output.\n * By default, comments are included if `opts.comments` is `true` or if `opts.minified` is `false` and the comment\n * contains `@preserve` or `@license`.\n */\n shouldPrintComment?(comment: string): boolean;\n\n /**\n * Attempt to use the same line numbers in the output code as in the source code (helps preserve stack traces).\n * Defaults to `false`.\n */\n retainLines?: boolean;\n\n /**\n * Retain parens around function expressions (could be used to change engine parsing behavior)\n * Defaults to `false`.\n */\n retainFunctionParens?: boolean;\n\n /**\n * Should comments be included in output? Defaults to `true`.\n */\n comments?: boolean;\n\n /**\n * Set to true to avoid adding whitespace for formatting. Defaults to the value of `opts.minified`.\n */\n compact?: boolean | \"auto\";\n\n /**\n * Should the output be minified. Defaults to `false`.\n */\n minified?: boolean;\n\n /**\n * Set to true to reduce whitespace (but not as much as opts.compact). Defaults to `false`.\n */\n concise?: boolean;\n\n /**\n * Used in warning messages\n */\n filename?: string;\n\n /**\n * Enable generating source maps. Defaults to `false`.\n */\n sourceMaps?: boolean;\n\n inputSourceMap?: any;\n\n /**\n * A root for all relative URLs in the source map.\n */\n sourceRoot?: string;\n\n /**\n * The filename for the source code (i.e. the code in the `code` argument).\n * This will only be used if `code` is a string.\n */\n sourceFileName?: string;\n\n /**\n * Set to true to run jsesc with \"json\": true to print \"\\u00A9\" vs. \"©\";\n * @deprecated use `jsescOptions: { json: true }` instead\n */\n jsonCompatibleStrings?: boolean;\n\n /**\n * Set to true to enable support for experimental decorators syntax before\n * module exports. If not specified, decorators will be printed in the same\n * position as they were in the input source code.\n * @deprecated Removed in Babel 8\n */\n decoratorsBeforeExport?: boolean;\n\n /**\n * Options for outputting jsesc representation.\n */\n jsescOption?: jsescOptions;\n\n /**\n * For use with the recordAndTuple token.\n */\n recordAndTupleSyntaxType?: RecordAndTuplePluginOptions[\"syntaxType\"];\n\n /**\n * For use with the Hack-style pipe operator.\n * Changes what token is used for pipe bodies’ topic references.\n */\n topicToken?: PipelineOperatorPluginOptions[\"topicToken\"];\n\n /**\n * The import attributes syntax style:\n * - \"with\" : `import { a } from \"b\" with { type: \"json\" };`\n * - \"assert\" : `import { a } from \"b\" assert { type: \"json\" };`\n * - \"with-legacy\" : `import { a } from \"b\" with type: \"json\";`\n */\n importAttributesKeyword?: \"with\" | \"assert\" | \"with-legacy\";\n}\n\nexport interface GeneratorResult {\n code: string;\n map: EncodedSourceMap | null;\n decodedMap: DecodedSourceMap | undefined;\n rawMappings: Mapping[] | undefined;\n}\n\nif (!process.env.BABEL_8_BREAKING && !USE_ESM) {\n /**\n * We originally exported the Generator class above, but to make it extra clear that it is a private API,\n * we have moved that to an internal class instance and simplified the interface to the two public methods\n * that we wish to support.\n */\n\n // eslint-disable-next-line no-restricted-globals\n exports.CodeGenerator = class CodeGenerator {\n private _ast: t.Node;\n private _format: Format | undefined;\n private _map: SourceMap | null;\n constructor(ast: t.Node, opts: GeneratorOptions = {}, code?: string) {\n this._ast = ast;\n this._format = normalizeOptions(code, opts);\n this._map = opts.sourceMaps ? new SourceMap(opts, code) : null;\n }\n generate(): GeneratorResult {\n const printer = new Printer(this._format, this._map);\n\n return printer.generate(this._ast);\n }\n };\n}\n\n/**\n * Turns an AST into code, maintaining sourcemaps, user preferences, and valid output.\n * @param ast - the abstract syntax tree from which to generate output code.\n * @param opts - used for specifying options for code generation.\n * @param code - the original source code, used for source maps.\n * @returns - an object containing the output code and source map.\n */\nexport default function generate(\n ast: t.Node,\n opts: GeneratorOptions = {},\n code?: string | { [filename: string]: string },\n): GeneratorResult {\n const format = normalizeOptions(code, opts);\n const map = opts.sourceMaps ? new SourceMap(opts, code) : null;\n\n const printer = new Printer(format, map);\n\n return printer.generate(ast);\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/generator/lib/node/index.js b/node_modules/@babel/generator/lib/node/index.js index 70106ba099b4..385a7ad15f2d 100644 --- a/node_modules/@babel/generator/lib/node/index.js +++ b/node_modules/@babel/generator/lib/node/index.js @@ -18,13 +18,13 @@ const { isNewExpression } = _t; function expandAliases(obj) { - const newObj = {}; + const map = new Map(); function add(type, func) { - const fn = newObj[type]; - newObj[type] = fn ? function (node, parent, stack) { - const result = fn(node, parent, stack); - return result == null ? func(node, parent, stack) : result; - } : func; + const fn = map.get(type); + map.set(type, fn ? function (node, parent, stack) { + var _fn; + return (_fn = fn(node, parent, stack)) != null ? _fn : func(node, parent, stack); + } : func); } for (const type of Object.keys(obj)) { const aliases = FLIPPED_ALIAS_KEYS[type]; @@ -36,14 +36,10 @@ function expandAliases(obj) { add(type, obj[type]); } } - return newObj; + return map; } const expandedParens = expandAliases(parens); const expandedWhitespaceNodes = expandAliases(whitespace.nodes); -function find(obj, node, parent, printStack) { - const fn = obj[node.type]; - return fn ? fn(node, parent, printStack) : null; -} function isOrHasCallExpression(node) { if (isCallExpression(node)) { return true; @@ -51,11 +47,12 @@ function isOrHasCallExpression(node) { return isMemberExpression(node) && isOrHasCallExpression(node.object); } function needsWhitespace(node, parent, type) { + var _expandedWhitespaceNo; if (!node) return false; if (isExpressionStatement(node)) { node = node.expression; } - const flag = find(expandedWhitespaceNodes, node, parent); + const flag = (_expandedWhitespaceNo = expandedWhitespaceNodes.get(node.type)) == null ? void 0 : _expandedWhitespaceNo(node, parent); if (typeof flag === "number") { return (flag & type) !== 0; } @@ -68,11 +65,12 @@ function needsWhitespaceAfter(node, parent) { return needsWhitespace(node, parent, 2); } function needsParens(node, parent, printStack) { + var _expandedParens$get; if (!parent) return false; if (isNewExpression(parent) && parent.callee === node) { if (isOrHasCallExpression(node)) return true; } - return find(expandedParens, node, parent, printStack); + return (_expandedParens$get = expandedParens.get(node.type)) == null ? void 0 : _expandedParens$get(node, parent, printStack); } //# sourceMappingURL=index.js.map diff --git a/node_modules/@babel/generator/lib/node/index.js.map b/node_modules/@babel/generator/lib/node/index.js.map index 0d5683f1eec1..7a00e4ad2f85 100644 --- a/node_modules/@babel/generator/lib/node/index.js.map +++ b/node_modules/@babel/generator/lib/node/index.js.map @@ -1 +1 @@ -{"version":3,"names":["whitespace","require","parens","_t","FLIPPED_ALIAS_KEYS","isCallExpression","isExpressionStatement","isMemberExpression","isNewExpression","expandAliases","obj","newObj","add","type","func","fn","node","parent","stack","result","Object","keys","aliases","alias","expandedParens","expandedWhitespaceNodes","nodes","find","printStack","isOrHasCallExpression","object","needsWhitespace","expression","flag","needsWhitespaceBefore","needsWhitespaceAfter","needsParens","callee"],"sources":["../../src/node/index.ts"],"sourcesContent":["import * as whitespace from \"./whitespace.ts\";\nimport * as parens from \"./parentheses.ts\";\nimport {\n FLIPPED_ALIAS_KEYS,\n isCallExpression,\n isExpressionStatement,\n isMemberExpression,\n isNewExpression,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\n\nimport type { WhitespaceFlag } from \"./whitespace.ts\";\n\nexport type NodeHandlers = {\n [K in string]?: (\n node: K extends t.Node[\"type\"] ? Extract : t.Node,\n // todo:\n // node: K extends keyof typeof t\n // ? Extract\n // : t.Node,\n parent: t.Node,\n stack: t.Node[],\n ) => R;\n};\n\nfunction expandAliases(obj: NodeHandlers) {\n const newObj: NodeHandlers = {};\n\n function add(\n type: string,\n func: (node: t.Node, parent: t.Node, stack: t.Node[]) => R,\n ) {\n const fn = newObj[type];\n newObj[type] = fn\n ? function (node, parent, stack) {\n const result = fn(node, parent, stack);\n\n return result == null ? func(node, parent, stack) : result;\n }\n : func;\n }\n\n for (const type of Object.keys(obj)) {\n const aliases = FLIPPED_ALIAS_KEYS[type];\n if (aliases) {\n for (const alias of aliases) {\n add(alias, obj[type]);\n }\n } else {\n add(type, obj[type]);\n }\n }\n\n return newObj;\n}\n\n// Rather than using `t.is` on each object property, we pre-expand any type aliases\n// into concrete types so that the 'find' call below can be as fast as possible.\nconst expandedParens = expandAliases(parens);\nconst expandedWhitespaceNodes = expandAliases(whitespace.nodes);\n\nfunction find(\n obj: NodeHandlers,\n node: t.Node,\n parent: t.Node,\n printStack?: t.Node[],\n): R | null {\n const fn = obj[node.type];\n return fn ? fn(node, parent, printStack) : null;\n}\n\nfunction isOrHasCallExpression(node: t.Node): boolean {\n if (isCallExpression(node)) {\n return true;\n }\n\n return isMemberExpression(node) && isOrHasCallExpression(node.object);\n}\n\nexport function needsWhitespace(\n node: t.Node,\n parent: t.Node,\n type: WhitespaceFlag,\n): boolean {\n if (!node) return false;\n\n if (isExpressionStatement(node)) {\n node = node.expression;\n }\n\n const flag = find(expandedWhitespaceNodes, node, parent);\n\n if (typeof flag === \"number\") {\n return (flag & type) !== 0;\n }\n\n return false;\n}\n\nexport function needsWhitespaceBefore(node: t.Node, parent: t.Node) {\n return needsWhitespace(node, parent, 1);\n}\n\nexport function needsWhitespaceAfter(node: t.Node, parent: t.Node) {\n return needsWhitespace(node, parent, 2);\n}\n\nexport function needsParens(\n node: t.Node,\n parent: t.Node,\n printStack?: t.Node[],\n) {\n if (!parent) return false;\n\n if (isNewExpression(parent) && parent.callee === node) {\n if (isOrHasCallExpression(node)) return true;\n }\n\n return find(expandedParens, node, parent, printStack);\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["whitespace","require","parens","_t","FLIPPED_ALIAS_KEYS","isCallExpression","isExpressionStatement","isMemberExpression","isNewExpression","expandAliases","obj","map","Map","add","type","func","fn","get","set","node","parent","stack","_fn","Object","keys","aliases","alias","expandedParens","expandedWhitespaceNodes","nodes","isOrHasCallExpression","object","needsWhitespace","_expandedWhitespaceNo","expression","flag","needsWhitespaceBefore","needsWhitespaceAfter","needsParens","printStack","_expandedParens$get","callee"],"sources":["../../src/node/index.ts"],"sourcesContent":["import * as whitespace from \"./whitespace.ts\";\nimport * as parens from \"./parentheses.ts\";\nimport {\n FLIPPED_ALIAS_KEYS,\n isCallExpression,\n isExpressionStatement,\n isMemberExpression,\n isNewExpression,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\n\nimport type { WhitespaceFlag } from \"./whitespace.ts\";\n\ntype NodeHandler = (\n node: t.Node,\n // todo:\n // node: K extends keyof typeof t\n // ? Extract\n // : t.Node,\n parent: t.Node,\n stack?: t.Node[],\n) => R;\n\nexport type NodeHandlers = {\n [K in string]?: NodeHandler;\n};\n\nfunction expandAliases(obj: NodeHandlers) {\n const map = new Map>();\n\n function add(type: string, func: NodeHandler) {\n const fn = map.get(type);\n map.set(\n type,\n fn\n ? function (node, parent, stack) {\n return fn(node, parent, stack) ?? func(node, parent, stack);\n }\n : func,\n );\n }\n\n for (const type of Object.keys(obj)) {\n const aliases = FLIPPED_ALIAS_KEYS[type];\n if (aliases) {\n for (const alias of aliases) {\n add(alias, obj[type]);\n }\n } else {\n add(type, obj[type]);\n }\n }\n\n return map;\n}\n\n// Rather than using `t.is` on each object property, we pre-expand any type aliases\n// into concrete types so that the 'find' call below can be as fast as possible.\nconst expandedParens = expandAliases(parens);\nconst expandedWhitespaceNodes = expandAliases(whitespace.nodes);\n\nfunction isOrHasCallExpression(node: t.Node): boolean {\n if (isCallExpression(node)) {\n return true;\n }\n\n return isMemberExpression(node) && isOrHasCallExpression(node.object);\n}\n\nexport function needsWhitespace(\n node: t.Node,\n parent: t.Node,\n type: WhitespaceFlag,\n): boolean {\n if (!node) return false;\n\n if (isExpressionStatement(node)) {\n node = node.expression;\n }\n\n const flag = expandedWhitespaceNodes.get(node.type)?.(node, parent);\n\n if (typeof flag === \"number\") {\n return (flag & type) !== 0;\n }\n\n return false;\n}\n\nexport function needsWhitespaceBefore(node: t.Node, parent: t.Node) {\n return needsWhitespace(node, parent, 1);\n}\n\nexport function needsWhitespaceAfter(node: t.Node, parent: t.Node) {\n return needsWhitespace(node, parent, 2);\n}\n\nexport function needsParens(\n node: t.Node,\n parent: t.Node,\n printStack?: t.Node[],\n) {\n if (!parent) return false;\n\n if (isNewExpression(parent) && parent.callee === node) {\n if (isOrHasCallExpression(node)) return true;\n }\n\n return expandedParens.get(node.type)?.(node, parent, printStack);\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/generator/lib/node/parentheses.js b/node_modules/@babel/generator/lib/node/parentheses.js index 4656a67ce77f..475e33acc6e5 100644 --- a/node_modules/@babel/generator/lib/node/parentheses.js +++ b/node_modules/@babel/generator/lib/node/parentheses.js @@ -31,97 +31,35 @@ var _t = require("@babel/types"); const { isArrayTypeAnnotation, isArrowFunctionExpression, - isAssignmentExpression, - isAwaitExpression, - isBinary, isBinaryExpression, - isUpdateExpression, isCallExpression, - isClass, - isClassExpression, - isConditional, - isConditionalExpression, isExportDeclaration, - isExportDefaultDeclaration, - isExpressionStatement, - isFor, - isForInStatement, isForOfStatement, - isForStatement, - isFunctionExpression, - isIfStatement, isIndexedAccessType, - isIntersectionTypeAnnotation, - isLogicalExpression, isMemberExpression, - isNewExpression, - isNullableTypeAnnotation, isObjectPattern, - isOptionalCallExpression, isOptionalMemberExpression, - isReturnStatement, - isSequenceExpression, - isSwitchStatement, - isTSArrayType, - isTSAsExpression, - isTSInstantiationExpression, - isTSIntersectionType, - isTSNonNullExpression, - isTSOptionalType, - isTSRestType, - isTSTypeAssertion, - isTSUnionType, - isTaggedTemplateExpression, - isThrowStatement, - isTypeAnnotation, - isUnaryLike, - isUnionTypeAnnotation, - isVariableDeclarator, - isWhileStatement, - isYieldExpression, - isTSSatisfiesExpression + isYieldExpression } = _t; -const PRECEDENCE = { - "||": 0, - "??": 0, - "|>": 0, - "&&": 1, - "|": 2, - "^": 3, - "&": 4, - "==": 5, - "===": 5, - "!=": 5, - "!==": 5, - "<": 6, - ">": 6, - "<=": 6, - ">=": 6, - in: 6, - instanceof: 6, - ">>": 7, - "<<": 7, - ">>>": 7, - "+": 8, - "-": 8, - "*": 9, - "/": 9, - "%": 9, - "**": 10 -}; -function isTSTypeExpression(node) { - return isTSAsExpression(node) || isTSSatisfiesExpression(node) || isTSTypeAssertion(node); +const PRECEDENCE = new Map([["||", 0], ["??", 0], ["|>", 0], ["&&", 1], ["|", 2], ["^", 3], ["&", 4], ["==", 5], ["===", 5], ["!=", 5], ["!==", 5], ["<", 6], [">", 6], ["<=", 6], [">=", 6], ["in", 6], ["instanceof", 6], [">>", 7], ["<<", 7], [">>>", 7], ["+", 8], ["-", 8], ["*", 9], ["/", 9], ["%", 9], ["**", 10]]); +function isTSTypeExpression(nodeType) { + return nodeType === "TSAsExpression" || nodeType === "TSSatisfiesExpression" || nodeType === "TSTypeAssertion"; } -const isClassExtendsClause = (node, parent) => isClass(parent, { - superClass: node -}); -const hasPostfixPart = (node, parent) => (isMemberExpression(parent) || isOptionalMemberExpression(parent)) && parent.object === node || (isCallExpression(parent) || isOptionalCallExpression(parent) || isNewExpression(parent)) && parent.callee === node || isTaggedTemplateExpression(parent) && parent.tag === node || isTSNonNullExpression(parent); +const isClassExtendsClause = (node, parent) => { + const parentType = parent.type; + return (parentType === "ClassDeclaration" || parentType === "ClassExpression") && parent.superClass === node; +}; +const hasPostfixPart = (node, parent) => { + const parentType = parent.type; + return (parentType === "MemberExpression" || parentType === "OptionalMemberExpression") && parent.object === node || (parentType === "CallExpression" || parentType === "OptionalCallExpression" || parentType === "NewExpression") && parent.callee === node || parentType === "TaggedTemplateExpression" && parent.tag === node || parentType === "TSNonNullExpression"; +}; function NullableTypeAnnotation(node, parent) { return isArrayTypeAnnotation(parent); } function FunctionTypeAnnotation(node, parent, printStack) { if (printStack.length < 3) return; - return isUnionTypeAnnotation(parent) || isIntersectionTypeAnnotation(parent) || isArrayTypeAnnotation(parent) || isTypeAnnotation(parent) && isArrowFunctionExpression(printStack[printStack.length - 3]); + const parentType = parent.type; + return parentType === "UnionTypeAnnotation" || parentType === "IntersectionTypeAnnotation" || parentType === "ArrayTypeAnnotation" || parentType === "TypeAnnotation" && isArrowFunctionExpression(printStack[printStack.length - 3]); } function UpdateExpression(node, parent) { return hasPostfixPart(node, parent) || isClassExtendsClause(node, parent); @@ -133,67 +71,70 @@ function DoExpression(node, parent, printStack) { return !node.async && isFirstInContext(printStack, 1); } function Binary(node, parent) { - if (node.operator === "**" && isBinaryExpression(parent, { - operator: "**" - })) { + const parentType = parent.type; + if (node.operator === "**" && parentType === "BinaryExpression" && parent.operator === "**") { return parent.left === node; } if (isClassExtendsClause(node, parent)) { return true; } - if (hasPostfixPart(node, parent) || isUnaryLike(parent) || isAwaitExpression(parent)) { + if (hasPostfixPart(node, parent) || parentType === "UnaryExpression" || parentType === "SpreadElement" || parentType === "AwaitExpression") { return true; } - if (isBinary(parent)) { - const parentOp = parent.operator; - const parentPos = PRECEDENCE[parentOp]; - const nodeOp = node.operator; - const nodePos = PRECEDENCE[nodeOp]; - if (parentPos === nodePos && parent.right === node && !isLogicalExpression(parent) || parentPos > nodePos) { + if (parentType === "BinaryExpression" || parentType === "LogicalExpression") { + const parentPos = PRECEDENCE.get(parent.operator); + const nodePos = PRECEDENCE.get(node.operator); + if (parentPos === nodePos && parent.right === node && parentType !== "LogicalExpression" || parentPos > nodePos) { return true; } } + return undefined; } function UnionTypeAnnotation(node, parent) { - return isArrayTypeAnnotation(parent) || isNullableTypeAnnotation(parent) || isIntersectionTypeAnnotation(parent) || isUnionTypeAnnotation(parent); + const parentType = parent.type; + return parentType === "ArrayTypeAnnotation" || parentType === "NullableTypeAnnotation" || parentType === "IntersectionTypeAnnotation" || parentType === "UnionTypeAnnotation"; } function OptionalIndexedAccessType(node, parent) { - return isIndexedAccessType(parent, { - objectType: node - }); + return isIndexedAccessType(parent) && parent.objectType === node; } function TSAsExpression() { return true; } function TSUnionType(node, parent) { - return isTSArrayType(parent) || isTSOptionalType(parent) || isTSIntersectionType(parent) || isTSUnionType(parent) || isTSRestType(parent); + const parentType = parent.type; + return parentType === "TSArrayType" || parentType === "TSOptionalType" || parentType === "TSIntersectionType" || parentType === "TSUnionType" || parentType === "TSRestType"; } function TSInferType(node, parent) { - return isTSArrayType(parent) || isTSOptionalType(parent); + const parentType = parent.type; + return parentType === "TSArrayType" || parentType === "TSOptionalType"; } function TSInstantiationExpression(node, parent) { - return (isCallExpression(parent) || isOptionalCallExpression(parent) || isNewExpression(parent) || isTSInstantiationExpression(parent)) && !!parent.typeParameters; + const parentType = parent.type; + return (parentType === "CallExpression" || parentType === "OptionalCallExpression" || parentType === "NewExpression" || parentType === "TSInstantiationExpression") && !!parent.typeParameters; } function BinaryExpression(node, parent) { - return node.operator === "in" && (isVariableDeclarator(parent) || isFor(parent)); + if (node.operator === "in") { + const parentType = parent.type; + return parentType === "VariableDeclarator" || parentType === "ForStatement" || parentType === "ForInStatement" || parentType === "ForOfStatement"; + } + return false; } function SequenceExpression(node, parent) { - if (isForStatement(parent) || isThrowStatement(parent) || isReturnStatement(parent) || isIfStatement(parent) && parent.test === node || isWhileStatement(parent) && parent.test === node || isForInStatement(parent) && parent.right === node || isSwitchStatement(parent) && parent.discriminant === node || isExpressionStatement(parent) && parent.expression === node) { + const parentType = parent.type; + if (parentType === "ForStatement" || parentType === "ThrowStatement" || parentType === "ReturnStatement" || parentType === "IfStatement" && parent.test === node || parentType === "WhileStatement" && parent.test === node || parentType === "ForInStatement" && parent.right === node || parentType === "SwitchStatement" && parent.discriminant === node || parentType === "ExpressionStatement" && parent.expression === node) { return false; } return true; } function YieldExpression(node, parent) { - return isBinary(parent) || isUnaryLike(parent) || hasPostfixPart(node, parent) || isAwaitExpression(parent) && isYieldExpression(node) || isConditionalExpression(parent) && node === parent.test || isClassExtendsClause(node, parent); + const parentType = parent.type; + return parentType === "BinaryExpression" || parentType === "LogicalExpression" || parentType === "UnaryExpression" || parentType === "SpreadElement" || hasPostfixPart(node, parent) || parentType === "AwaitExpression" && isYieldExpression(node) || parentType === "ConditionalExpression" && node === parent.test || isClassExtendsClause(node, parent); } function ClassExpression(node, parent, printStack) { return isFirstInContext(printStack, 1 | 4); } function UnaryLike(node, parent) { - return hasPostfixPart(node, parent) || isBinaryExpression(parent, { - operator: "**", - left: node - }) || isClassExtendsClause(node, parent); + return hasPostfixPart(node, parent) || isBinaryExpression(parent) && parent.operator === "**" && parent.left === node || isClassExtendsClause(node, parent); } function FunctionExpression(node, parent, printStack) { return isFirstInContext(printStack, 1 | 4); @@ -202,19 +143,14 @@ function ArrowFunctionExpression(node, parent) { return isExportDeclaration(parent) || ConditionalExpression(node, parent); } function ConditionalExpression(node, parent) { - if (isUnaryLike(parent) || isBinary(parent) || isConditionalExpression(parent, { - test: node - }) || isAwaitExpression(parent) || isTSTypeExpression(parent)) { + const parentType = parent.type; + if (parentType === "UnaryExpression" || parentType === "SpreadElement" || parentType === "BinaryExpression" || parentType === "LogicalExpression" || parentType === "ConditionalExpression" && parent.test === node || parentType === "AwaitExpression" || isTSTypeExpression(parentType)) { return true; } return UnaryLike(node, parent); } function OptionalMemberExpression(node, parent) { - return isCallExpression(parent, { - callee: node - }) || isMemberExpression(parent, { - object: node - }); + return isCallExpression(parent) && parent.callee === node || isMemberExpression(parent) && parent.object === node; } function AssignmentExpression(node, parent) { if (isObjectPattern(node.left)) { @@ -224,25 +160,26 @@ function AssignmentExpression(node, parent) { } } function LogicalExpression(node, parent) { - if (isTSTypeExpression(parent)) return true; + const parentType = parent.type; + if (isTSTypeExpression(parentType)) return true; + if (parentType !== "LogicalExpression") return false; switch (node.operator) { case "||": - if (!isLogicalExpression(parent)) return false; return parent.operator === "??" || parent.operator === "&&"; case "&&": - return isLogicalExpression(parent, { - operator: "??" - }); + return parent.operator === "??"; case "??": - return isLogicalExpression(parent) && parent.operator !== "??"; + return parent.operator !== "??"; } } function Identifier(node, parent, printStack) { var _node$extra; - if ((_node$extra = node.extra) != null && _node$extra.parenthesized && isAssignmentExpression(parent, { - left: node - }) && (isFunctionExpression(parent.right) || isClassExpression(parent.right)) && parent.right.id == null) { - return true; + const parentType = parent.type; + if ((_node$extra = node.extra) != null && _node$extra.parenthesized && parentType === "AssignmentExpression" && parent.left === node) { + const rightType = parent.right.type; + if ((rightType === "FunctionExpression" || rightType === "ClassExpression") && parent.right.id == null) { + return true; + } } if (node.name === "let") { const isFollowedByBracket = isMemberExpression(parent, { @@ -270,28 +207,11 @@ function isFirstInContext(printStack, checkParam) { i--; let parent = printStack[i]; while (i >= 0) { - if (expressionStatement && isExpressionStatement(parent, { - expression: node - }) || exportDefault && isExportDefaultDeclaration(parent, { - declaration: node - }) || arrowBody && isArrowFunctionExpression(parent, { - body: node - }) || forHead && isForStatement(parent, { - init: node - }) || forInHead && isForInStatement(parent, { - left: node - }) || forOfHead && isForOfStatement(parent, { - left: node - })) { + const parentType = parent.type; + if (expressionStatement && parentType === "ExpressionStatement" && parent.expression === node || exportDefault && parentType === "ExportDefaultDeclaration" && node === parent.declaration || arrowBody && parentType === "ArrowFunctionExpression" && parent.body === node || forHead && parentType === "ForStatement" && parent.init === node || forInHead && parentType === "ForInStatement" && parent.left === node || forOfHead && parentType === "ForOfStatement" && parent.left === node) { return true; } - if (i > 0 && (hasPostfixPart(node, parent) && !isNewExpression(parent) || isSequenceExpression(parent) && parent.expressions[0] === node || isUpdateExpression(parent) && !parent.prefix || isConditional(parent, { - test: node - }) || isBinary(parent, { - left: node - }) || isAssignmentExpression(parent, { - left: node - }))) { + if (i > 0 && (hasPostfixPart(node, parent) && parentType !== "NewExpression" || parentType === "SequenceExpression" && parent.expressions[0] === node || parentType === "UpdateExpression" && !parent.prefix || parentType === "ConditionalExpression" && parent.test === node || (parentType === "BinaryExpression" || parentType === "LogicalExpression") && parent.left === node || parentType === "AssignmentExpression" && parent.left === node)) { node = parent; i--; parent = printStack[i]; diff --git a/node_modules/@babel/generator/lib/node/parentheses.js.map b/node_modules/@babel/generator/lib/node/parentheses.js.map index b300fc570f81..eb1d44e0f865 100644 --- a/node_modules/@babel/generator/lib/node/parentheses.js.map +++ b/node_modules/@babel/generator/lib/node/parentheses.js.map @@ -1 +1 @@ -{"version":3,"names":["_t","require","isArrayTypeAnnotation","isArrowFunctionExpression","isAssignmentExpression","isAwaitExpression","isBinary","isBinaryExpression","isUpdateExpression","isCallExpression","isClass","isClassExpression","isConditional","isConditionalExpression","isExportDeclaration","isExportDefaultDeclaration","isExpressionStatement","isFor","isForInStatement","isForOfStatement","isForStatement","isFunctionExpression","isIfStatement","isIndexedAccessType","isIntersectionTypeAnnotation","isLogicalExpression","isMemberExpression","isNewExpression","isNullableTypeAnnotation","isObjectPattern","isOptionalCallExpression","isOptionalMemberExpression","isReturnStatement","isSequenceExpression","isSwitchStatement","isTSArrayType","isTSAsExpression","isTSInstantiationExpression","isTSIntersectionType","isTSNonNullExpression","isTSOptionalType","isTSRestType","isTSTypeAssertion","isTSUnionType","isTaggedTemplateExpression","isThrowStatement","isTypeAnnotation","isUnaryLike","isUnionTypeAnnotation","isVariableDeclarator","isWhileStatement","isYieldExpression","isTSSatisfiesExpression","PRECEDENCE","in","instanceof","isTSTypeExpression","node","isClassExtendsClause","parent","superClass","hasPostfixPart","object","callee","tag","NullableTypeAnnotation","FunctionTypeAnnotation","printStack","length","UpdateExpression","ObjectExpression","isFirstInContext","DoExpression","async","Binary","operator","left","parentOp","parentPos","nodeOp","nodePos","right","UnionTypeAnnotation","OptionalIndexedAccessType","objectType","TSAsExpression","TSUnionType","TSInferType","TSInstantiationExpression","typeParameters","BinaryExpression","SequenceExpression","test","discriminant","expression","YieldExpression","ClassExpression","UnaryLike","FunctionExpression","ArrowFunctionExpression","ConditionalExpression","OptionalMemberExpression","AssignmentExpression","LogicalExpression","Identifier","_node$extra","extra","parenthesized","id","name","isFollowedByBracket","computed","optional","checkParam","expressionStatement","arrowBody","exportDefault","forHead","forInHead","forOfHead","i","declaration","body","init","expressions","prefix"],"sources":["../../src/node/parentheses.ts"],"sourcesContent":["import {\n isArrayTypeAnnotation,\n isArrowFunctionExpression,\n isAssignmentExpression,\n isAwaitExpression,\n isBinary,\n isBinaryExpression,\n isUpdateExpression,\n isCallExpression,\n isClass,\n isClassExpression,\n isConditional,\n isConditionalExpression,\n isExportDeclaration,\n isExportDefaultDeclaration,\n isExpressionStatement,\n isFor,\n isForInStatement,\n isForOfStatement,\n isForStatement,\n isFunctionExpression,\n isIfStatement,\n isIndexedAccessType,\n isIntersectionTypeAnnotation,\n isLogicalExpression,\n isMemberExpression,\n isNewExpression,\n isNullableTypeAnnotation,\n isObjectPattern,\n isOptionalCallExpression,\n isOptionalMemberExpression,\n isReturnStatement,\n isSequenceExpression,\n isSwitchStatement,\n isTSArrayType,\n isTSAsExpression,\n isTSInstantiationExpression,\n isTSIntersectionType,\n isTSNonNullExpression,\n isTSOptionalType,\n isTSRestType,\n isTSTypeAssertion,\n isTSUnionType,\n isTaggedTemplateExpression,\n isThrowStatement,\n isTypeAnnotation,\n isUnaryLike,\n isUnionTypeAnnotation,\n isVariableDeclarator,\n isWhileStatement,\n isYieldExpression,\n isTSSatisfiesExpression,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nconst PRECEDENCE = {\n \"||\": 0,\n \"??\": 0,\n \"|>\": 0,\n \"&&\": 1,\n \"|\": 2,\n \"^\": 3,\n \"&\": 4,\n \"==\": 5,\n \"===\": 5,\n \"!=\": 5,\n \"!==\": 5,\n \"<\": 6,\n \">\": 6,\n \"<=\": 6,\n \">=\": 6,\n in: 6,\n instanceof: 6,\n \">>\": 7,\n \"<<\": 7,\n \">>>\": 7,\n \"+\": 8,\n \"-\": 8,\n \"*\": 9,\n \"/\": 9,\n \"%\": 9,\n \"**\": 10,\n};\n\nconst enum CheckParam {\n expressionStatement = 1 << 0,\n arrowBody = 1 << 1,\n exportDefault = 1 << 2,\n forHead = 1 << 3,\n forInHead = 1 << 4,\n forOfHead = 1 << 5,\n}\n\nfunction isTSTypeExpression(node: t.Node) {\n return (\n isTSAsExpression(node) ||\n isTSSatisfiesExpression(node) ||\n isTSTypeAssertion(node)\n );\n}\n\nconst isClassExtendsClause = (\n node: t.Node,\n parent: t.Node,\n): parent is t.Class => isClass(parent, { superClass: node });\n\nconst hasPostfixPart = (node: t.Node, parent: t.Node) =>\n ((isMemberExpression(parent) || isOptionalMemberExpression(parent)) &&\n parent.object === node) ||\n ((isCallExpression(parent) ||\n isOptionalCallExpression(parent) ||\n isNewExpression(parent)) &&\n parent.callee === node) ||\n (isTaggedTemplateExpression(parent) && parent.tag === node) ||\n isTSNonNullExpression(parent);\n\nexport function NullableTypeAnnotation(\n node: t.NullableTypeAnnotation,\n parent: t.Node,\n): boolean {\n return isArrayTypeAnnotation(parent);\n}\n\nexport function FunctionTypeAnnotation(\n node: t.FunctionTypeAnnotation,\n parent: t.Node,\n printStack: Array,\n): boolean {\n if (printStack.length < 3) return;\n\n return (\n // (() => A) | (() => B)\n isUnionTypeAnnotation(parent) ||\n // (() => A) & (() => B)\n isIntersectionTypeAnnotation(parent) ||\n // (() => A)[]\n isArrayTypeAnnotation(parent) ||\n // (A: T): (T => T[]) => B => [A, B]\n (isTypeAnnotation(parent) &&\n // Check grandparent\n isArrowFunctionExpression(printStack[printStack.length - 3]))\n );\n}\n\nexport function UpdateExpression(\n node: t.UpdateExpression,\n parent: t.Node,\n): boolean {\n return hasPostfixPart(node, parent) || isClassExtendsClause(node, parent);\n}\n\nexport function ObjectExpression(\n node: t.ObjectExpression,\n parent: t.Node,\n printStack: Array,\n): boolean {\n return isFirstInContext(\n printStack,\n CheckParam.expressionStatement | CheckParam.arrowBody,\n );\n}\n\nexport function DoExpression(\n node: t.DoExpression,\n parent: t.Node,\n printStack: Array,\n): boolean {\n // `async do` can start an expression statement\n return (\n !node.async && isFirstInContext(printStack, CheckParam.expressionStatement)\n );\n}\n\nexport function Binary(node: t.BinaryExpression, parent: t.Node): boolean {\n if (\n node.operator === \"**\" &&\n isBinaryExpression(parent, { operator: \"**\" })\n ) {\n return parent.left === node;\n }\n\n if (isClassExtendsClause(node, parent)) {\n return true;\n }\n\n if (\n hasPostfixPart(node, parent) ||\n isUnaryLike(parent) ||\n isAwaitExpression(parent)\n ) {\n return true;\n }\n\n if (isBinary(parent)) {\n const parentOp = parent.operator;\n const parentPos = PRECEDENCE[parentOp];\n\n const nodeOp = node.operator;\n const nodePos = PRECEDENCE[nodeOp];\n\n if (\n // Logical expressions with the same precedence don't need parens.\n (parentPos === nodePos &&\n parent.right === node &&\n !isLogicalExpression(parent)) ||\n parentPos > nodePos\n ) {\n return true;\n }\n }\n}\n\nexport function UnionTypeAnnotation(\n node: t.UnionTypeAnnotation,\n parent: t.Node,\n): boolean {\n return (\n isArrayTypeAnnotation(parent) ||\n isNullableTypeAnnotation(parent) ||\n isIntersectionTypeAnnotation(parent) ||\n isUnionTypeAnnotation(parent)\n );\n}\n\nexport { UnionTypeAnnotation as IntersectionTypeAnnotation };\n\nexport function OptionalIndexedAccessType(\n node: t.OptionalIndexedAccessType,\n parent: t.Node,\n): boolean {\n return isIndexedAccessType(parent, { objectType: node });\n}\n\nexport function TSAsExpression() {\n return true;\n}\n\nexport {\n TSAsExpression as TSSatisfiesExpression,\n TSAsExpression as TSTypeAssertion,\n};\n\nexport function TSUnionType(node: t.TSUnionType, parent: t.Node): boolean {\n return (\n isTSArrayType(parent) ||\n isTSOptionalType(parent) ||\n isTSIntersectionType(parent) ||\n isTSUnionType(parent) ||\n isTSRestType(parent)\n );\n}\n\nexport { TSUnionType as TSIntersectionType };\n\nexport function TSInferType(node: t.TSInferType, parent: t.Node): boolean {\n return isTSArrayType(parent) || isTSOptionalType(parent);\n}\n\nexport function TSInstantiationExpression(\n node: t.TSInstantiationExpression,\n parent: t.Node,\n) {\n return (\n (isCallExpression(parent) ||\n isOptionalCallExpression(parent) ||\n isNewExpression(parent) ||\n isTSInstantiationExpression(parent)) &&\n !!parent.typeParameters\n );\n}\n\nexport function BinaryExpression(\n node: t.BinaryExpression,\n parent: t.Node,\n): boolean {\n // let i = (1 in []);\n // for ((1 in []);;);\n return (\n node.operator === \"in\" && (isVariableDeclarator(parent) || isFor(parent))\n );\n}\n\nexport function SequenceExpression(\n node: t.SequenceExpression,\n parent: t.Node,\n): boolean {\n if (\n // Although parentheses wouldn't hurt around sequence\n // expressions in the head of for loops, traditional style\n // dictates that e.g. i++, j++ should not be wrapped with\n // parentheses.\n isForStatement(parent) ||\n isThrowStatement(parent) ||\n isReturnStatement(parent) ||\n (isIfStatement(parent) && parent.test === node) ||\n (isWhileStatement(parent) && parent.test === node) ||\n (isForInStatement(parent) && parent.right === node) ||\n (isSwitchStatement(parent) && parent.discriminant === node) ||\n (isExpressionStatement(parent) && parent.expression === node)\n ) {\n return false;\n }\n\n // Otherwise err on the side of overparenthesization, adding\n // explicit exceptions above if this proves overzealous.\n return true;\n}\n\nexport function YieldExpression(\n node: t.YieldExpression,\n parent: t.Node,\n): boolean {\n return (\n isBinary(parent) ||\n isUnaryLike(parent) ||\n hasPostfixPart(node, parent) ||\n (isAwaitExpression(parent) && isYieldExpression(node)) ||\n (isConditionalExpression(parent) && node === parent.test) ||\n isClassExtendsClause(node, parent)\n );\n}\n\nexport { YieldExpression as AwaitExpression };\n\nexport function ClassExpression(\n node: t.ClassExpression,\n parent: t.Node,\n printStack: Array,\n): boolean {\n return isFirstInContext(\n printStack,\n CheckParam.expressionStatement | CheckParam.exportDefault,\n );\n}\n\nexport function UnaryLike(\n node:\n | t.UnaryLike\n | t.ArrowFunctionExpression\n | t.ConditionalExpression\n | t.AssignmentExpression,\n parent: t.Node,\n): boolean {\n return (\n hasPostfixPart(node, parent) ||\n isBinaryExpression(parent, { operator: \"**\", left: node }) ||\n isClassExtendsClause(node, parent)\n );\n}\n\nexport function FunctionExpression(\n node: t.FunctionExpression,\n parent: t.Node,\n printStack: Array,\n): boolean {\n return isFirstInContext(\n printStack,\n CheckParam.expressionStatement | CheckParam.exportDefault,\n );\n}\n\nexport function ArrowFunctionExpression(\n node: t.ArrowFunctionExpression,\n parent: t.Node,\n): boolean {\n return isExportDeclaration(parent) || ConditionalExpression(node, parent);\n}\n\nexport function ConditionalExpression(\n node:\n | t.ConditionalExpression\n | t.ArrowFunctionExpression\n | t.AssignmentExpression,\n parent?: t.Node,\n): boolean {\n if (\n isUnaryLike(parent) ||\n isBinary(parent) ||\n isConditionalExpression(parent, { test: node }) ||\n isAwaitExpression(parent) ||\n isTSTypeExpression(parent)\n ) {\n return true;\n }\n\n return UnaryLike(node, parent);\n}\n\nexport function OptionalMemberExpression(\n node: t.OptionalMemberExpression,\n parent: t.Node,\n): boolean {\n return (\n isCallExpression(parent, { callee: node }) ||\n isMemberExpression(parent, { object: node })\n );\n}\n\nexport { OptionalMemberExpression as OptionalCallExpression };\n\nexport function AssignmentExpression(\n node: t.AssignmentExpression,\n parent: t.Node,\n): boolean {\n if (isObjectPattern(node.left)) {\n return true;\n } else {\n return ConditionalExpression(node, parent);\n }\n}\n\nexport function LogicalExpression(\n node: t.LogicalExpression,\n parent: t.Node,\n): boolean {\n if (isTSTypeExpression(parent)) return true;\n switch (node.operator) {\n case \"||\":\n if (!isLogicalExpression(parent)) return false;\n return parent.operator === \"??\" || parent.operator === \"&&\";\n case \"&&\":\n return isLogicalExpression(parent, { operator: \"??\" });\n case \"??\":\n return isLogicalExpression(parent) && parent.operator !== \"??\";\n }\n}\n\nexport function Identifier(\n node: t.Identifier,\n parent: t.Node,\n printStack: Array,\n): boolean {\n // 13.15.2 AssignmentExpression RS: Evaluation\n // (fn) = function () {};\n if (\n node.extra?.parenthesized &&\n isAssignmentExpression(parent, { left: node }) &&\n (isFunctionExpression(parent.right) || isClassExpression(parent.right)) &&\n parent.right.id == null\n ) {\n return true;\n }\n // Non-strict code allows the identifier `let`, but it cannot occur as-is in\n // certain contexts to avoid ambiguity with contextual keyword `let`.\n if (node.name === \"let\") {\n // Some contexts only forbid `let [`, so check if the next token would\n // be the left bracket of a computed member expression.\n const isFollowedByBracket =\n isMemberExpression(parent, {\n object: node,\n computed: true,\n }) ||\n isOptionalMemberExpression(parent, {\n object: node,\n computed: true,\n optional: false,\n });\n return isFirstInContext(\n printStack,\n isFollowedByBracket\n ? CheckParam.expressionStatement |\n CheckParam.forHead |\n CheckParam.forInHead |\n CheckParam.forOfHead\n : CheckParam.forOfHead,\n );\n }\n\n // ECMAScript specifically forbids a for-of loop from starting with the\n // token sequence `for (async of`, because it would be ambiguous with\n // `for (async of => {};;)`, so we need to add extra parentheses.\n //\n // If the parent is a for-await-of loop (i.e. parent.await === true), the\n // parentheses aren't strictly needed, but we add them anyway because\n // some tools (including earlier Babel versions) can't parse\n // `for await (async of [])` without them.\n return (\n node.name === \"async\" && isForOfStatement(parent) && node === parent.left\n );\n}\n\n// Walk up the print stack to determine if our node can come first\n// in a particular context.\nfunction isFirstInContext(\n printStack: Array,\n checkParam: CheckParam,\n): boolean {\n const expressionStatement = checkParam & CheckParam.expressionStatement;\n const arrowBody = checkParam & CheckParam.arrowBody;\n const exportDefault = checkParam & CheckParam.exportDefault;\n const forHead = checkParam & CheckParam.forHead;\n const forInHead = checkParam & CheckParam.forInHead;\n const forOfHead = checkParam & CheckParam.forOfHead;\n\n let i = printStack.length - 1;\n if (i <= 0) return;\n let node = printStack[i];\n i--;\n let parent = printStack[i];\n while (i >= 0) {\n if (\n (expressionStatement &&\n isExpressionStatement(parent, { expression: node })) ||\n (exportDefault &&\n isExportDefaultDeclaration(parent, { declaration: node })) ||\n (arrowBody && isArrowFunctionExpression(parent, { body: node })) ||\n (forHead && isForStatement(parent, { init: node })) ||\n (forInHead && isForInStatement(parent, { left: node })) ||\n (forOfHead && isForOfStatement(parent, { left: node }))\n ) {\n return true;\n }\n\n if (\n i > 0 &&\n ((hasPostfixPart(node, parent) && !isNewExpression(parent)) ||\n (isSequenceExpression(parent) && parent.expressions[0] === node) ||\n (isUpdateExpression(parent) && !parent.prefix) ||\n isConditional(parent, { test: node }) ||\n isBinary(parent, { left: node }) ||\n isAssignmentExpression(parent, { left: node }))\n ) {\n node = parent;\n i--;\n parent = printStack[i];\n } else {\n return false;\n }\n }\n\n return false;\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_t","require","isArrayTypeAnnotation","isArrowFunctionExpression","isBinaryExpression","isCallExpression","isExportDeclaration","isForOfStatement","isIndexedAccessType","isMemberExpression","isObjectPattern","isOptionalMemberExpression","isYieldExpression","PRECEDENCE","Map","isTSTypeExpression","nodeType","isClassExtendsClause","node","parent","parentType","type","superClass","hasPostfixPart","object","callee","tag","NullableTypeAnnotation","FunctionTypeAnnotation","printStack","length","UpdateExpression","ObjectExpression","isFirstInContext","DoExpression","async","Binary","operator","left","parentPos","get","nodePos","right","undefined","UnionTypeAnnotation","OptionalIndexedAccessType","objectType","TSAsExpression","TSUnionType","TSInferType","TSInstantiationExpression","typeParameters","BinaryExpression","SequenceExpression","test","discriminant","expression","YieldExpression","ClassExpression","UnaryLike","FunctionExpression","ArrowFunctionExpression","ConditionalExpression","OptionalMemberExpression","AssignmentExpression","LogicalExpression","Identifier","_node$extra","extra","parenthesized","rightType","id","name","isFollowedByBracket","computed","optional","checkParam","expressionStatement","arrowBody","exportDefault","forHead","forInHead","forOfHead","i","declaration","body","init","expressions","prefix"],"sources":["../../src/node/parentheses.ts"],"sourcesContent":["import {\n isArrayTypeAnnotation,\n isArrowFunctionExpression,\n isBinaryExpression,\n isCallExpression,\n isExportDeclaration,\n isForOfStatement,\n isIndexedAccessType,\n isMemberExpression,\n isObjectPattern,\n isOptionalMemberExpression,\n isYieldExpression,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nconst PRECEDENCE = new Map([\n [\"||\", 0],\n [\"??\", 0],\n [\"|>\", 0],\n [\"&&\", 1],\n [\"|\", 2],\n [\"^\", 3],\n [\"&\", 4],\n [\"==\", 5],\n [\"===\", 5],\n [\"!=\", 5],\n [\"!==\", 5],\n [\"<\", 6],\n [\">\", 6],\n [\"<=\", 6],\n [\">=\", 6],\n [\"in\", 6],\n [\"instanceof\", 6],\n [\">>\", 7],\n [\"<<\", 7],\n [\">>>\", 7],\n [\"+\", 8],\n [\"-\", 8],\n [\"*\", 9],\n [\"/\", 9],\n [\"%\", 9],\n [\"**\", 10],\n]);\n\nconst enum CheckParam {\n expressionStatement = 1 << 0,\n arrowBody = 1 << 1,\n exportDefault = 1 << 2,\n forHead = 1 << 3,\n forInHead = 1 << 4,\n forOfHead = 1 << 5,\n}\n\nfunction isTSTypeExpression(nodeType: string) {\n return (\n nodeType === \"TSAsExpression\" ||\n nodeType === \"TSSatisfiesExpression\" ||\n nodeType === \"TSTypeAssertion\"\n );\n}\n\nconst isClassExtendsClause = (\n node: t.Node,\n parent: t.Node,\n): parent is t.Class => {\n const parentType = parent.type;\n return (\n (parentType === \"ClassDeclaration\" || parentType === \"ClassExpression\") &&\n parent.superClass === node\n );\n};\n\nconst hasPostfixPart = (node: t.Node, parent: t.Node) => {\n const parentType = parent.type;\n return (\n ((parentType === \"MemberExpression\" ||\n parentType === \"OptionalMemberExpression\") &&\n parent.object === node) ||\n ((parentType === \"CallExpression\" ||\n parentType === \"OptionalCallExpression\" ||\n parentType === \"NewExpression\") &&\n parent.callee === node) ||\n (parentType === \"TaggedTemplateExpression\" && parent.tag === node) ||\n parentType === \"TSNonNullExpression\"\n );\n};\n\nexport function NullableTypeAnnotation(\n node: t.NullableTypeAnnotation,\n parent: t.Node,\n): boolean {\n return isArrayTypeAnnotation(parent);\n}\n\nexport function FunctionTypeAnnotation(\n node: t.FunctionTypeAnnotation,\n parent: t.Node,\n printStack: Array,\n): boolean {\n if (printStack.length < 3) return;\n\n const parentType = parent.type;\n return (\n // (() => A) | (() => B)\n parentType === \"UnionTypeAnnotation\" ||\n // (() => A) & (() => B)\n parentType === \"IntersectionTypeAnnotation\" ||\n // (() => A)[]\n parentType === \"ArrayTypeAnnotation\" ||\n // (A: T): (T => T[]) => B => [A, B]\n (parentType === \"TypeAnnotation\" &&\n // Check grandparent\n isArrowFunctionExpression(printStack[printStack.length - 3]))\n );\n}\n\nexport function UpdateExpression(\n node: t.UpdateExpression,\n parent: t.Node,\n): boolean {\n return hasPostfixPart(node, parent) || isClassExtendsClause(node, parent);\n}\n\nexport function ObjectExpression(\n node: t.ObjectExpression,\n parent: t.Node,\n printStack: Array,\n): boolean {\n return isFirstInContext(\n printStack,\n CheckParam.expressionStatement | CheckParam.arrowBody,\n );\n}\n\nexport function DoExpression(\n node: t.DoExpression,\n parent: t.Node,\n printStack: Array,\n): boolean {\n // `async do` can start an expression statement\n return (\n !node.async && isFirstInContext(printStack, CheckParam.expressionStatement)\n );\n}\n\nexport function Binary(\n node: t.BinaryExpression,\n parent: t.Node,\n): boolean | undefined {\n const parentType = parent.type;\n if (\n node.operator === \"**\" &&\n parentType === \"BinaryExpression\" &&\n parent.operator === \"**\"\n ) {\n return parent.left === node;\n }\n\n if (isClassExtendsClause(node, parent)) {\n return true;\n }\n\n if (\n hasPostfixPart(node, parent) ||\n parentType === \"UnaryExpression\" ||\n parentType === \"SpreadElement\" ||\n parentType === \"AwaitExpression\"\n ) {\n return true;\n }\n\n if (parentType === \"BinaryExpression\" || parentType === \"LogicalExpression\") {\n const parentPos = PRECEDENCE.get(parent.operator);\n const nodePos = PRECEDENCE.get(node.operator);\n\n if (\n // Logical expressions with the same precedence don't need parens.\n (parentPos === nodePos &&\n parent.right === node &&\n parentType !== \"LogicalExpression\") ||\n parentPos > nodePos\n ) {\n return true;\n }\n }\n\n return undefined;\n}\n\nexport function UnionTypeAnnotation(\n node: t.UnionTypeAnnotation,\n parent: t.Node,\n): boolean {\n const parentType = parent.type;\n return (\n parentType === \"ArrayTypeAnnotation\" ||\n parentType === \"NullableTypeAnnotation\" ||\n parentType === \"IntersectionTypeAnnotation\" ||\n parentType === \"UnionTypeAnnotation\"\n );\n}\n\nexport { UnionTypeAnnotation as IntersectionTypeAnnotation };\n\nexport function OptionalIndexedAccessType(\n node: t.OptionalIndexedAccessType,\n parent: t.Node,\n): boolean {\n return isIndexedAccessType(parent) && parent.objectType === node;\n}\n\nexport function TSAsExpression() {\n return true;\n}\n\nexport {\n TSAsExpression as TSSatisfiesExpression,\n TSAsExpression as TSTypeAssertion,\n};\n\nexport function TSUnionType(node: t.TSUnionType, parent: t.Node): boolean {\n const parentType = parent.type;\n return (\n parentType === \"TSArrayType\" ||\n parentType === \"TSOptionalType\" ||\n parentType === \"TSIntersectionType\" ||\n parentType === \"TSUnionType\" ||\n parentType === \"TSRestType\"\n );\n}\n\nexport { TSUnionType as TSIntersectionType };\n\nexport function TSInferType(node: t.TSInferType, parent: t.Node): boolean {\n const parentType = parent.type;\n return parentType === \"TSArrayType\" || parentType === \"TSOptionalType\";\n}\n\nexport function TSInstantiationExpression(\n node: t.TSInstantiationExpression,\n parent: t.Node,\n) {\n const parentType = parent.type;\n return (\n (parentType === \"CallExpression\" ||\n parentType === \"OptionalCallExpression\" ||\n parentType === \"NewExpression\" ||\n parentType === \"TSInstantiationExpression\") &&\n !!parent.typeParameters\n );\n}\n\nexport function BinaryExpression(\n node: t.BinaryExpression,\n parent: t.Node,\n): boolean {\n // let i = (1 in []);\n // for ((1 in []);;);\n if (node.operator === \"in\") {\n const parentType = parent.type;\n return (\n parentType === \"VariableDeclarator\" ||\n parentType === \"ForStatement\" ||\n parentType === \"ForInStatement\" ||\n parentType === \"ForOfStatement\"\n );\n }\n return false;\n}\n\nexport function SequenceExpression(\n node: t.SequenceExpression,\n parent: t.Node,\n): boolean {\n const parentType = parent.type;\n if (\n // Although parentheses wouldn't hurt around sequence\n // expressions in the head of for loops, traditional style\n // dictates that e.g. i++, j++ should not be wrapped with\n // parentheses.\n parentType === \"ForStatement\" ||\n parentType === \"ThrowStatement\" ||\n parentType === \"ReturnStatement\" ||\n (parentType === \"IfStatement\" && parent.test === node) ||\n (parentType === \"WhileStatement\" && parent.test === node) ||\n (parentType === \"ForInStatement\" && parent.right === node) ||\n (parentType === \"SwitchStatement\" && parent.discriminant === node) ||\n (parentType === \"ExpressionStatement\" && parent.expression === node)\n ) {\n return false;\n }\n\n // Otherwise err on the side of overparenthesization, adding\n // explicit exceptions above if this proves overzealous.\n return true;\n}\n\nexport function YieldExpression(\n node: t.YieldExpression,\n parent: t.Node,\n): boolean {\n const parentType = parent.type;\n return (\n parentType === \"BinaryExpression\" ||\n parentType === \"LogicalExpression\" ||\n parentType === \"UnaryExpression\" ||\n parentType === \"SpreadElement\" ||\n hasPostfixPart(node, parent) ||\n (parentType === \"AwaitExpression\" && isYieldExpression(node)) ||\n (parentType === \"ConditionalExpression\" && node === parent.test) ||\n isClassExtendsClause(node, parent)\n );\n}\n\nexport { YieldExpression as AwaitExpression };\n\nexport function ClassExpression(\n node: t.ClassExpression,\n parent: t.Node,\n printStack: Array,\n): boolean {\n return isFirstInContext(\n printStack,\n CheckParam.expressionStatement | CheckParam.exportDefault,\n );\n}\n\nexport function UnaryLike(\n node:\n | t.UnaryLike\n | t.ArrowFunctionExpression\n | t.ConditionalExpression\n | t.AssignmentExpression,\n parent: t.Node,\n): boolean {\n return (\n hasPostfixPart(node, parent) ||\n (isBinaryExpression(parent) &&\n parent.operator === \"**\" &&\n parent.left === node) ||\n isClassExtendsClause(node, parent)\n );\n}\n\nexport function FunctionExpression(\n node: t.FunctionExpression,\n parent: t.Node,\n printStack: Array,\n): boolean {\n return isFirstInContext(\n printStack,\n CheckParam.expressionStatement | CheckParam.exportDefault,\n );\n}\n\nexport function ArrowFunctionExpression(\n node: t.ArrowFunctionExpression,\n parent: t.Node,\n): boolean {\n return isExportDeclaration(parent) || ConditionalExpression(node, parent);\n}\n\nexport function ConditionalExpression(\n node:\n | t.ConditionalExpression\n | t.ArrowFunctionExpression\n | t.AssignmentExpression,\n parent?: t.Node,\n): boolean {\n const parentType = parent.type;\n if (\n parentType === \"UnaryExpression\" ||\n parentType === \"SpreadElement\" ||\n parentType === \"BinaryExpression\" ||\n parentType === \"LogicalExpression\" ||\n (parentType === \"ConditionalExpression\" && parent.test === node) ||\n parentType === \"AwaitExpression\" ||\n isTSTypeExpression(parentType)\n ) {\n return true;\n }\n\n return UnaryLike(node, parent);\n}\n\nexport function OptionalMemberExpression(\n node: t.OptionalMemberExpression,\n parent: t.Node,\n): boolean {\n return (\n (isCallExpression(parent) && parent.callee === node) ||\n (isMemberExpression(parent) && parent.object === node)\n );\n}\n\nexport { OptionalMemberExpression as OptionalCallExpression };\n\nexport function AssignmentExpression(\n node: t.AssignmentExpression,\n parent: t.Node,\n): boolean {\n if (isObjectPattern(node.left)) {\n return true;\n } else {\n return ConditionalExpression(node, parent);\n }\n}\n\nexport function LogicalExpression(\n node: t.LogicalExpression,\n parent: t.Node,\n): boolean {\n const parentType = parent.type;\n if (isTSTypeExpression(parentType)) return true;\n if (parentType !== \"LogicalExpression\") return false;\n switch (node.operator) {\n case \"||\":\n return parent.operator === \"??\" || parent.operator === \"&&\";\n case \"&&\":\n return parent.operator === \"??\";\n case \"??\":\n return parent.operator !== \"??\";\n }\n}\n\nexport function Identifier(\n node: t.Identifier,\n parent: t.Node,\n printStack: Array,\n): boolean {\n const parentType = parent.type;\n // 13.15.2 AssignmentExpression RS: Evaluation\n // (fn) = function () {};\n if (\n node.extra?.parenthesized &&\n parentType === \"AssignmentExpression\" &&\n parent.left === node\n ) {\n const rightType = parent.right.type;\n if (\n (rightType === \"FunctionExpression\" || rightType === \"ClassExpression\") &&\n parent.right.id == null\n ) {\n return true;\n }\n }\n // Non-strict code allows the identifier `let`, but it cannot occur as-is in\n // certain contexts to avoid ambiguity with contextual keyword `let`.\n if (node.name === \"let\") {\n // Some contexts only forbid `let [`, so check if the next token would\n // be the left bracket of a computed member expression.\n const isFollowedByBracket =\n isMemberExpression(parent, {\n object: node,\n computed: true,\n }) ||\n isOptionalMemberExpression(parent, {\n object: node,\n computed: true,\n optional: false,\n });\n return isFirstInContext(\n printStack,\n isFollowedByBracket\n ? CheckParam.expressionStatement |\n CheckParam.forHead |\n CheckParam.forInHead |\n CheckParam.forOfHead\n : CheckParam.forOfHead,\n );\n }\n\n // ECMAScript specifically forbids a for-of loop from starting with the\n // token sequence `for (async of`, because it would be ambiguous with\n // `for (async of => {};;)`, so we need to add extra parentheses.\n //\n // If the parent is a for-await-of loop (i.e. parent.await === true), the\n // parentheses aren't strictly needed, but we add them anyway because\n // some tools (including earlier Babel versions) can't parse\n // `for await (async of [])` without them.\n return (\n node.name === \"async\" && isForOfStatement(parent) && node === parent.left\n );\n}\n\n// Walk up the print stack to determine if our node can come first\n// in a particular context.\nfunction isFirstInContext(\n printStack: Array,\n checkParam: CheckParam,\n): boolean {\n const expressionStatement = checkParam & CheckParam.expressionStatement;\n const arrowBody = checkParam & CheckParam.arrowBody;\n const exportDefault = checkParam & CheckParam.exportDefault;\n const forHead = checkParam & CheckParam.forHead;\n const forInHead = checkParam & CheckParam.forInHead;\n const forOfHead = checkParam & CheckParam.forOfHead;\n\n let i = printStack.length - 1;\n if (i <= 0) return;\n let node = printStack[i];\n i--;\n let parent = printStack[i];\n while (i >= 0) {\n const parentType = parent.type;\n if (\n (expressionStatement &&\n parentType === \"ExpressionStatement\" &&\n parent.expression === node) ||\n (exportDefault &&\n parentType === \"ExportDefaultDeclaration\" &&\n node === parent.declaration) ||\n (arrowBody &&\n parentType === \"ArrowFunctionExpression\" &&\n parent.body === node) ||\n (forHead && parentType === \"ForStatement\" && parent.init === node) ||\n (forInHead && parentType === \"ForInStatement\" && parent.left === node) ||\n (forOfHead && parentType === \"ForOfStatement\" && parent.left === node)\n ) {\n return true;\n }\n\n if (\n i > 0 &&\n ((hasPostfixPart(node, parent) && parentType !== \"NewExpression\") ||\n (parentType === \"SequenceExpression\" &&\n parent.expressions[0] === node) ||\n (parentType === \"UpdateExpression\" && !parent.prefix) ||\n (parentType === \"ConditionalExpression\" && parent.test === node) ||\n ((parentType === \"BinaryExpression\" ||\n parentType === \"LogicalExpression\") &&\n parent.left === node) ||\n (parentType === \"AssignmentExpression\" && parent.left === node))\n ) {\n node = parent;\n i--;\n parent = printStack[i];\n } else {\n return false;\n }\n }\n\n return false;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,EAAA,GAAAC,OAAA;AAYsB;EAXpBC,qBAAqB;EACrBC,yBAAyB;EACzBC,kBAAkB;EAClBC,gBAAgB;EAChBC,mBAAmB;EACnBC,gBAAgB;EAChBC,mBAAmB;EACnBC,kBAAkB;EAClBC,eAAe;EACfC,0BAA0B;EAC1BC;AAAiB,IAAAZ,EAAA;AAGnB,MAAMa,UAAU,GAAG,IAAIC,GAAG,CAAC,CACzB,CAAC,IAAI,EAAE,CAAC,CAAC,EACT,CAAC,IAAI,EAAE,CAAC,CAAC,EACT,CAAC,IAAI,EAAE,CAAC,CAAC,EACT,CAAC,IAAI,EAAE,CAAC,CAAC,EACT,CAAC,GAAG,EAAE,CAAC,CAAC,EACR,CAAC,GAAG,EAAE,CAAC,CAAC,EACR,CAAC,GAAG,EAAE,CAAC,CAAC,EACR,CAAC,IAAI,EAAE,CAAC,CAAC,EACT,CAAC,KAAK,EAAE,CAAC,CAAC,EACV,CAAC,IAAI,EAAE,CAAC,CAAC,EACT,CAAC,KAAK,EAAE,CAAC,CAAC,EACV,CAAC,GAAG,EAAE,CAAC,CAAC,EACR,CAAC,GAAG,EAAE,CAAC,CAAC,EACR,CAAC,IAAI,EAAE,CAAC,CAAC,EACT,CAAC,IAAI,EAAE,CAAC,CAAC,EACT,CAAC,IAAI,EAAE,CAAC,CAAC,EACT,CAAC,YAAY,EAAE,CAAC,CAAC,EACjB,CAAC,IAAI,EAAE,CAAC,CAAC,EACT,CAAC,IAAI,EAAE,CAAC,CAAC,EACT,CAAC,KAAK,EAAE,CAAC,CAAC,EACV,CAAC,GAAG,EAAE,CAAC,CAAC,EACR,CAAC,GAAG,EAAE,CAAC,CAAC,EACR,CAAC,GAAG,EAAE,CAAC,CAAC,EACR,CAAC,GAAG,EAAE,CAAC,CAAC,EACR,CAAC,GAAG,EAAE,CAAC,CAAC,EACR,CAAC,IAAI,EAAE,EAAE,CAAC,CACX,CAAC;AAWF,SAASC,kBAAkBA,CAACC,QAAgB,EAAE;EAC5C,OACEA,QAAQ,KAAK,gBAAgB,IAC7BA,QAAQ,KAAK,uBAAuB,IACpCA,QAAQ,KAAK,iBAAiB;AAElC;AAEA,MAAMC,oBAAoB,GAAGA,CAC3BC,IAAY,EACZC,MAAc,KACQ;EACtB,MAAMC,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,OACE,CAACD,UAAU,KAAK,kBAAkB,IAAIA,UAAU,KAAK,iBAAiB,KACtED,MAAM,CAACG,UAAU,KAAKJ,IAAI;AAE9B,CAAC;AAED,MAAMK,cAAc,GAAGA,CAACL,IAAY,EAAEC,MAAc,KAAK;EACvD,MAAMC,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,OACG,CAACD,UAAU,KAAK,kBAAkB,IACjCA,UAAU,KAAK,0BAA0B,KACzCD,MAAM,CAACK,MAAM,KAAKN,IAAI,IACvB,CAACE,UAAU,KAAK,gBAAgB,IAC/BA,UAAU,KAAK,wBAAwB,IACvCA,UAAU,KAAK,eAAe,KAC9BD,MAAM,CAACM,MAAM,KAAKP,IAAK,IACxBE,UAAU,KAAK,0BAA0B,IAAID,MAAM,CAACO,GAAG,KAAKR,IAAK,IAClEE,UAAU,KAAK,qBAAqB;AAExC,CAAC;AAEM,SAASO,sBAAsBA,CACpCT,IAA8B,EAC9BC,MAAc,EACL;EACT,OAAOjB,qBAAqB,CAACiB,MAAM,CAAC;AACtC;AAEO,SAASS,sBAAsBA,CACpCV,IAA8B,EAC9BC,MAAc,EACdU,UAAyB,EAChB;EACT,IAAIA,UAAU,CAACC,MAAM,GAAG,CAAC,EAAE;EAE3B,MAAMV,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,OAEED,UAAU,KAAK,qBAAqB,IAEpCA,UAAU,KAAK,4BAA4B,IAE3CA,UAAU,KAAK,qBAAqB,IAEnCA,UAAU,KAAK,gBAAgB,IAE9BjB,yBAAyB,CAAC0B,UAAU,CAACA,UAAU,CAACC,MAAM,GAAG,CAAC,CAAC,CAAE;AAEnE;AAEO,SAASC,gBAAgBA,CAC9Bb,IAAwB,EACxBC,MAAc,EACL;EACT,OAAOI,cAAc,CAACL,IAAI,EAAEC,MAAM,CAAC,IAAIF,oBAAoB,CAACC,IAAI,EAAEC,MAAM,CAAC;AAC3E;AAEO,SAASa,gBAAgBA,CAC9Bd,IAAwB,EACxBC,MAAc,EACdU,UAAyB,EAChB;EACT,OAAOI,gBAAgB,CACrBJ,UAAU,EACV,KACF,CAAC;AACH;AAEO,SAASK,YAAYA,CAC1BhB,IAAoB,EACpBC,MAAc,EACdU,UAAyB,EAChB;EAET,OACE,CAACX,IAAI,CAACiB,KAAK,IAAIF,gBAAgB,CAACJ,UAAU,GAAgC,CAAC;AAE/E;AAEO,SAASO,MAAMA,CACpBlB,IAAwB,EACxBC,MAAc,EACO;EACrB,MAAMC,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,IACEH,IAAI,CAACmB,QAAQ,KAAK,IAAI,IACtBjB,UAAU,KAAK,kBAAkB,IACjCD,MAAM,CAACkB,QAAQ,KAAK,IAAI,EACxB;IACA,OAAOlB,MAAM,CAACmB,IAAI,KAAKpB,IAAI;EAC7B;EAEA,IAAID,oBAAoB,CAACC,IAAI,EAAEC,MAAM,CAAC,EAAE;IACtC,OAAO,IAAI;EACb;EAEA,IACEI,cAAc,CAACL,IAAI,EAAEC,MAAM,CAAC,IAC5BC,UAAU,KAAK,iBAAiB,IAChCA,UAAU,KAAK,eAAe,IAC9BA,UAAU,KAAK,iBAAiB,EAChC;IACA,OAAO,IAAI;EACb;EAEA,IAAIA,UAAU,KAAK,kBAAkB,IAAIA,UAAU,KAAK,mBAAmB,EAAE;IAC3E,MAAMmB,SAAS,GAAG1B,UAAU,CAAC2B,GAAG,CAACrB,MAAM,CAACkB,QAAQ,CAAC;IACjD,MAAMI,OAAO,GAAG5B,UAAU,CAAC2B,GAAG,CAACtB,IAAI,CAACmB,QAAQ,CAAC;IAE7C,IAEGE,SAAS,KAAKE,OAAO,IACpBtB,MAAM,CAACuB,KAAK,KAAKxB,IAAI,IACrBE,UAAU,KAAK,mBAAmB,IACpCmB,SAAS,GAAGE,OAAO,EACnB;MACA,OAAO,IAAI;IACb;EACF;EAEA,OAAOE,SAAS;AAClB;AAEO,SAASC,mBAAmBA,CACjC1B,IAA2B,EAC3BC,MAAc,EACL;EACT,MAAMC,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,OACED,UAAU,KAAK,qBAAqB,IACpCA,UAAU,KAAK,wBAAwB,IACvCA,UAAU,KAAK,4BAA4B,IAC3CA,UAAU,KAAK,qBAAqB;AAExC;AAIO,SAASyB,yBAAyBA,CACvC3B,IAAiC,EACjCC,MAAc,EACL;EACT,OAAOX,mBAAmB,CAACW,MAAM,CAAC,IAAIA,MAAM,CAAC2B,UAAU,KAAK5B,IAAI;AAClE;AAEO,SAAS6B,cAAcA,CAAA,EAAG;EAC/B,OAAO,IAAI;AACb;AAOO,SAASC,WAAWA,CAAC9B,IAAmB,EAAEC,MAAc,EAAW;EACxE,MAAMC,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,OACED,UAAU,KAAK,aAAa,IAC5BA,UAAU,KAAK,gBAAgB,IAC/BA,UAAU,KAAK,oBAAoB,IACnCA,UAAU,KAAK,aAAa,IAC5BA,UAAU,KAAK,YAAY;AAE/B;AAIO,SAAS6B,WAAWA,CAAC/B,IAAmB,EAAEC,MAAc,EAAW;EACxE,MAAMC,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,OAAOD,UAAU,KAAK,aAAa,IAAIA,UAAU,KAAK,gBAAgB;AACxE;AAEO,SAAS8B,yBAAyBA,CACvChC,IAAiC,EACjCC,MAAc,EACd;EACA,MAAMC,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,OACE,CAACD,UAAU,KAAK,gBAAgB,IAC9BA,UAAU,KAAK,wBAAwB,IACvCA,UAAU,KAAK,eAAe,IAC9BA,UAAU,KAAK,2BAA2B,KAC5C,CAAC,CAACD,MAAM,CAACgC,cAAc;AAE3B;AAEO,SAASC,gBAAgBA,CAC9BlC,IAAwB,EACxBC,MAAc,EACL;EAGT,IAAID,IAAI,CAACmB,QAAQ,KAAK,IAAI,EAAE;IAC1B,MAAMjB,UAAU,GAAGD,MAAM,CAACE,IAAI;IAC9B,OACED,UAAU,KAAK,oBAAoB,IACnCA,UAAU,KAAK,cAAc,IAC7BA,UAAU,KAAK,gBAAgB,IAC/BA,UAAU,KAAK,gBAAgB;EAEnC;EACA,OAAO,KAAK;AACd;AAEO,SAASiC,kBAAkBA,CAChCnC,IAA0B,EAC1BC,MAAc,EACL;EACT,MAAMC,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,IAKED,UAAU,KAAK,cAAc,IAC7BA,UAAU,KAAK,gBAAgB,IAC/BA,UAAU,KAAK,iBAAiB,IAC/BA,UAAU,KAAK,aAAa,IAAID,MAAM,CAACmC,IAAI,KAAKpC,IAAK,IACrDE,UAAU,KAAK,gBAAgB,IAAID,MAAM,CAACmC,IAAI,KAAKpC,IAAK,IACxDE,UAAU,KAAK,gBAAgB,IAAID,MAAM,CAACuB,KAAK,KAAKxB,IAAK,IACzDE,UAAU,KAAK,iBAAiB,IAAID,MAAM,CAACoC,YAAY,KAAKrC,IAAK,IACjEE,UAAU,KAAK,qBAAqB,IAAID,MAAM,CAACqC,UAAU,KAAKtC,IAAK,EACpE;IACA,OAAO,KAAK;EACd;EAIA,OAAO,IAAI;AACb;AAEO,SAASuC,eAAeA,CAC7BvC,IAAuB,EACvBC,MAAc,EACL;EACT,MAAMC,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,OACED,UAAU,KAAK,kBAAkB,IACjCA,UAAU,KAAK,mBAAmB,IAClCA,UAAU,KAAK,iBAAiB,IAChCA,UAAU,KAAK,eAAe,IAC9BG,cAAc,CAACL,IAAI,EAAEC,MAAM,CAAC,IAC3BC,UAAU,KAAK,iBAAiB,IAAIR,iBAAiB,CAACM,IAAI,CAAE,IAC5DE,UAAU,KAAK,uBAAuB,IAAIF,IAAI,KAAKC,MAAM,CAACmC,IAAK,IAChErC,oBAAoB,CAACC,IAAI,EAAEC,MAAM,CAAC;AAEtC;AAIO,SAASuC,eAAeA,CAC7BxC,IAAuB,EACvBC,MAAc,EACdU,UAAyB,EAChB;EACT,OAAOI,gBAAgB,CACrBJ,UAAU,EACV,KACF,CAAC;AACH;AAEO,SAAS8B,SAASA,CACvBzC,IAI0B,EAC1BC,MAAc,EACL;EACT,OACEI,cAAc,CAACL,IAAI,EAAEC,MAAM,CAAC,IAC3Bf,kBAAkB,CAACe,MAAM,CAAC,IACzBA,MAAM,CAACkB,QAAQ,KAAK,IAAI,IACxBlB,MAAM,CAACmB,IAAI,KAAKpB,IAAK,IACvBD,oBAAoB,CAACC,IAAI,EAAEC,MAAM,CAAC;AAEtC;AAEO,SAASyC,kBAAkBA,CAChC1C,IAA0B,EAC1BC,MAAc,EACdU,UAAyB,EAChB;EACT,OAAOI,gBAAgB,CACrBJ,UAAU,EACV,KACF,CAAC;AACH;AAEO,SAASgC,uBAAuBA,CACrC3C,IAA+B,EAC/BC,MAAc,EACL;EACT,OAAOb,mBAAmB,CAACa,MAAM,CAAC,IAAI2C,qBAAqB,CAAC5C,IAAI,EAAEC,MAAM,CAAC;AAC3E;AAEO,SAAS2C,qBAAqBA,CACnC5C,IAG0B,EAC1BC,MAAe,EACN;EACT,MAAMC,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,IACED,UAAU,KAAK,iBAAiB,IAChCA,UAAU,KAAK,eAAe,IAC9BA,UAAU,KAAK,kBAAkB,IACjCA,UAAU,KAAK,mBAAmB,IACjCA,UAAU,KAAK,uBAAuB,IAAID,MAAM,CAACmC,IAAI,KAAKpC,IAAK,IAChEE,UAAU,KAAK,iBAAiB,IAChCL,kBAAkB,CAACK,UAAU,CAAC,EAC9B;IACA,OAAO,IAAI;EACb;EAEA,OAAOuC,SAAS,CAACzC,IAAI,EAAEC,MAAM,CAAC;AAChC;AAEO,SAAS4C,wBAAwBA,CACtC7C,IAAgC,EAChCC,MAAc,EACL;EACT,OACGd,gBAAgB,CAACc,MAAM,CAAC,IAAIA,MAAM,CAACM,MAAM,KAAKP,IAAI,IAClDT,kBAAkB,CAACU,MAAM,CAAC,IAAIA,MAAM,CAACK,MAAM,KAAKN,IAAK;AAE1D;AAIO,SAAS8C,oBAAoBA,CAClC9C,IAA4B,EAC5BC,MAAc,EACL;EACT,IAAIT,eAAe,CAACQ,IAAI,CAACoB,IAAI,CAAC,EAAE;IAC9B,OAAO,IAAI;EACb,CAAC,MAAM;IACL,OAAOwB,qBAAqB,CAAC5C,IAAI,EAAEC,MAAM,CAAC;EAC5C;AACF;AAEO,SAAS8C,iBAAiBA,CAC/B/C,IAAyB,EACzBC,MAAc,EACL;EACT,MAAMC,UAAU,GAAGD,MAAM,CAACE,IAAI;EAC9B,IAAIN,kBAAkB,CAACK,UAAU,CAAC,EAAE,OAAO,IAAI;EAC/C,IAAIA,UAAU,KAAK,mBAAmB,EAAE,OAAO,KAAK;EACpD,QAAQF,IAAI,CAACmB,QAAQ;IACnB,KAAK,IAAI;MACP,OAAOlB,MAAM,CAACkB,QAAQ,KAAK,IAAI,IAAIlB,MAAM,CAACkB,QAAQ,KAAK,IAAI;IAC7D,KAAK,IAAI;MACP,OAAOlB,MAAM,CAACkB,QAAQ,KAAK,IAAI;IACjC,KAAK,IAAI;MACP,OAAOlB,MAAM,CAACkB,QAAQ,KAAK,IAAI;EACnC;AACF;AAEO,SAAS6B,UAAUA,CACxBhD,IAAkB,EAClBC,MAAc,EACdU,UAAyB,EAChB;EAAA,IAAAsC,WAAA;EACT,MAAM/C,UAAU,GAAGD,MAAM,CAACE,IAAI;EAG9B,IACE,CAAA8C,WAAA,GAAAjD,IAAI,CAACkD,KAAK,aAAVD,WAAA,CAAYE,aAAa,IACzBjD,UAAU,KAAK,sBAAsB,IACrCD,MAAM,CAACmB,IAAI,KAAKpB,IAAI,EACpB;IACA,MAAMoD,SAAS,GAAGnD,MAAM,CAACuB,KAAK,CAACrB,IAAI;IACnC,IACE,CAACiD,SAAS,KAAK,oBAAoB,IAAIA,SAAS,KAAK,iBAAiB,KACtEnD,MAAM,CAACuB,KAAK,CAAC6B,EAAE,IAAI,IAAI,EACvB;MACA,OAAO,IAAI;IACb;EACF;EAGA,IAAIrD,IAAI,CAACsD,IAAI,KAAK,KAAK,EAAE;IAGvB,MAAMC,mBAAmB,GACvBhE,kBAAkB,CAACU,MAAM,EAAE;MACzBK,MAAM,EAAEN,IAAI;MACZwD,QAAQ,EAAE;IACZ,CAAC,CAAC,IACF/D,0BAA0B,CAACQ,MAAM,EAAE;MACjCK,MAAM,EAAEN,IAAI;MACZwD,QAAQ,EAAE,IAAI;MACdC,QAAQ,EAAE;IACZ,CAAC,CAAC;IACJ,OAAO1C,gBAAgB,CACrBJ,UAAU,EACV4C,mBAAmB,GACf,KACoB,KACE,KACA,KAE5B,CAAC;EACH;EAUA,OACEvD,IAAI,CAACsD,IAAI,KAAK,OAAO,IAAIjE,gBAAgB,CAACY,MAAM,CAAC,IAAID,IAAI,KAAKC,MAAM,CAACmB,IAAI;AAE7E;AAIA,SAASL,gBAAgBA,CACvBJ,UAAyB,EACzB+C,UAAsB,EACb;EACT,MAAMC,mBAAmB,GAAGD,UAAU,IAAiC;EACvE,MAAME,SAAS,GAAGF,UAAU,IAAuB;EACnD,MAAMG,aAAa,GAAGH,UAAU,IAA2B;EAC3D,MAAMI,OAAO,GAAGJ,UAAU,IAAqB;EAC/C,MAAMK,SAAS,GAAGL,UAAU,KAAuB;EACnD,MAAMM,SAAS,GAAGN,UAAU,KAAuB;EAEnD,IAAIO,CAAC,GAAGtD,UAAU,CAACC,MAAM,GAAG,CAAC;EAC7B,IAAIqD,CAAC,IAAI,CAAC,EAAE;EACZ,IAAIjE,IAAI,GAAGW,UAAU,CAACsD,CAAC,CAAC;EACxBA,CAAC,EAAE;EACH,IAAIhE,MAAM,GAAGU,UAAU,CAACsD,CAAC,CAAC;EAC1B,OAAOA,CAAC,IAAI,CAAC,EAAE;IACb,MAAM/D,UAAU,GAAGD,MAAM,CAACE,IAAI;IAC9B,IACGwD,mBAAmB,IAClBzD,UAAU,KAAK,qBAAqB,IACpCD,MAAM,CAACqC,UAAU,KAAKtC,IAAI,IAC3B6D,aAAa,IACZ3D,UAAU,KAAK,0BAA0B,IACzCF,IAAI,KAAKC,MAAM,CAACiE,WAAY,IAC7BN,SAAS,IACR1D,UAAU,KAAK,yBAAyB,IACxCD,MAAM,CAACkE,IAAI,KAAKnE,IAAK,IACtB8D,OAAO,IAAI5D,UAAU,KAAK,cAAc,IAAID,MAAM,CAACmE,IAAI,KAAKpE,IAAK,IACjE+D,SAAS,IAAI7D,UAAU,KAAK,gBAAgB,IAAID,MAAM,CAACmB,IAAI,KAAKpB,IAAK,IACrEgE,SAAS,IAAI9D,UAAU,KAAK,gBAAgB,IAAID,MAAM,CAACmB,IAAI,KAAKpB,IAAK,EACtE;MACA,OAAO,IAAI;IACb;IAEA,IACEiE,CAAC,GAAG,CAAC,KACH5D,cAAc,CAACL,IAAI,EAAEC,MAAM,CAAC,IAAIC,UAAU,KAAK,eAAe,IAC7DA,UAAU,KAAK,oBAAoB,IAClCD,MAAM,CAACoE,WAAW,CAAC,CAAC,CAAC,KAAKrE,IAAK,IAChCE,UAAU,KAAK,kBAAkB,IAAI,CAACD,MAAM,CAACqE,MAAO,IACpDpE,UAAU,KAAK,uBAAuB,IAAID,MAAM,CAACmC,IAAI,KAAKpC,IAAK,IAC/D,CAACE,UAAU,KAAK,kBAAkB,IACjCA,UAAU,KAAK,mBAAmB,KAClCD,MAAM,CAACmB,IAAI,KAAKpB,IAAK,IACtBE,UAAU,KAAK,sBAAsB,IAAID,MAAM,CAACmB,IAAI,KAAKpB,IAAK,CAAC,EAClE;MACAA,IAAI,GAAGC,MAAM;MACbgE,CAAC,EAAE;MACHhE,MAAM,GAAGU,UAAU,CAACsD,CAAC,CAAC;IACxB,CAAC,MAAM;MACL,OAAO,KAAK;IACd;EACF;EAEA,OAAO,KAAK;AACd"} \ No newline at end of file diff --git a/node_modules/@babel/generator/lib/node/whitespace.js b/node_modules/@babel/generator/lib/node/whitespace.js index 17daf359e426..181b9566099e 100644 --- a/node_modules/@babel/generator/lib/node/whitespace.js +++ b/node_modules/@babel/generator/lib/node/whitespace.js @@ -63,7 +63,7 @@ function isHelper(node) { function isType(node) { return isLiteral(node) || isObjectExpression(node) || isArrayExpression(node) || isIdentifier(node) || isMemberExpression(node); } -const nodes = { +const nodes = exports.nodes = { AssignmentExpression(node) { const state = crawl(node.right); if (state.hasCall && state.hasHelper || state.hasFunction) { @@ -112,7 +112,6 @@ const nodes = { } } }; -exports.nodes = nodes; nodes.ObjectProperty = nodes.ObjectTypeProperty = nodes.ObjectMethod = function (node, parent) { if (parent.properties[0] === node) { return 1; diff --git a/node_modules/@babel/generator/lib/node/whitespace.js.map b/node_modules/@babel/generator/lib/node/whitespace.js.map index 453ec99f9840..1c39f59154f9 100644 --- a/node_modules/@babel/generator/lib/node/whitespace.js.map +++ b/node_modules/@babel/generator/lib/node/whitespace.js.map @@ -1 +1 @@ -{"version":3,"names":["_t","require","FLIPPED_ALIAS_KEYS","isArrayExpression","isAssignmentExpression","isBinary","isBlockStatement","isCallExpression","isFunction","isIdentifier","isLiteral","isMemberExpression","isObjectExpression","isOptionalCallExpression","isOptionalMemberExpression","isStringLiteral","crawlInternal","node","state","object","computed","property","left","right","hasCall","callee","hasFunction","hasHelper","isHelper","crawl","name","charCodeAt","isType","nodes","AssignmentExpression","SwitchCase","parent","consequent","length","cases","LogicalExpression","Literal","value","CallExpression","OptionalCallExpression","VariableDeclaration","i","declarations","declar","enabled","id","init","IfStatement","exports","ObjectProperty","ObjectTypeProperty","ObjectMethod","properties","ObjectTypeCallProperty","_parent$properties","callProperties","ObjectTypeIndexer","_parent$properties2","_parent$callPropertie","indexers","ObjectTypeInternalSlot","_parent$properties3","_parent$callPropertie2","_parent$indexers","internalSlots","forEach","type","amounts","concat","ret"],"sources":["../../src/node/whitespace.ts"],"sourcesContent":["import {\n FLIPPED_ALIAS_KEYS,\n isArrayExpression,\n isAssignmentExpression,\n isBinary,\n isBlockStatement,\n isCallExpression,\n isFunction,\n isIdentifier,\n isLiteral,\n isMemberExpression,\n isObjectExpression,\n isOptionalCallExpression,\n isOptionalMemberExpression,\n isStringLiteral,\n} from \"@babel/types\";\nimport * as charCodes from \"charcodes\";\n\nimport type { NodeHandlers } from \"./index.ts\";\n\nimport type * as t from \"@babel/types\";\n\nconst enum WhitespaceFlag {\n before = 1 << 0,\n after = 1 << 1,\n}\n\nexport type { WhitespaceFlag };\n\nfunction crawlInternal(\n node: t.Node,\n state: { hasCall: boolean; hasFunction: boolean; hasHelper: boolean },\n) {\n if (!node) return state;\n\n if (isMemberExpression(node) || isOptionalMemberExpression(node)) {\n crawlInternal(node.object, state);\n if (node.computed) crawlInternal(node.property, state);\n } else if (isBinary(node) || isAssignmentExpression(node)) {\n crawlInternal(node.left, state);\n crawlInternal(node.right, state);\n } else if (isCallExpression(node) || isOptionalCallExpression(node)) {\n state.hasCall = true;\n crawlInternal(node.callee, state);\n } else if (isFunction(node)) {\n state.hasFunction = true;\n } else if (isIdentifier(node)) {\n state.hasHelper =\n // @ts-expect-error todo(flow->ts): node.callee is not really expected here…\n state.hasHelper || (node.callee && isHelper(node.callee));\n }\n\n return state;\n}\n\n/**\n * Crawl a node to test if it contains a CallExpression, a Function, or a Helper.\n *\n * @example\n * crawl(node)\n * // { hasCall: false, hasFunction: true, hasHelper: false }\n */\n\nfunction crawl(node: t.Node) {\n return crawlInternal(node, {\n hasCall: false,\n hasFunction: false,\n hasHelper: false,\n });\n}\n\n/**\n * Test if a node is or has a helper.\n */\n\nfunction isHelper(node: t.Node): boolean {\n if (!node) return false;\n\n if (isMemberExpression(node)) {\n return isHelper(node.object) || isHelper(node.property);\n } else if (isIdentifier(node)) {\n return (\n node.name === \"require\" ||\n node.name.charCodeAt(0) === charCodes.underscore\n );\n } else if (isCallExpression(node)) {\n return isHelper(node.callee);\n } else if (isBinary(node) || isAssignmentExpression(node)) {\n return (\n (isIdentifier(node.left) && isHelper(node.left)) || isHelper(node.right)\n );\n } else {\n return false;\n }\n}\n\nfunction isType(node: t.Node) {\n return (\n isLiteral(node) ||\n isObjectExpression(node) ||\n isArrayExpression(node) ||\n isIdentifier(node) ||\n isMemberExpression(node)\n );\n}\n\n/**\n * Tests for node types that need whitespace.\n */\n\nexport const nodes: NodeHandlers = {\n /**\n * Test if AssignmentExpression needs whitespace.\n */\n\n AssignmentExpression(node: t.AssignmentExpression): WhitespaceFlag {\n const state = crawl(node.right);\n if ((state.hasCall && state.hasHelper) || state.hasFunction) {\n return state.hasFunction\n ? WhitespaceFlag.before | WhitespaceFlag.after\n : WhitespaceFlag.after;\n }\n },\n\n /**\n * Test if SwitchCase needs whitespace.\n */\n\n SwitchCase(node: t.SwitchCase, parent: t.SwitchStatement): WhitespaceFlag {\n return (\n (!!node.consequent.length || parent.cases[0] === node\n ? WhitespaceFlag.before\n : 0) |\n (!node.consequent.length && parent.cases[parent.cases.length - 1] === node\n ? WhitespaceFlag.after\n : 0)\n );\n },\n\n /**\n * Test if LogicalExpression needs whitespace.\n */\n\n LogicalExpression(node: t.LogicalExpression): WhitespaceFlag {\n if (isFunction(node.left) || isFunction(node.right)) {\n return WhitespaceFlag.after;\n }\n },\n\n /**\n * Test if Literal needs whitespace.\n */\n\n Literal(node: t.Literal): WhitespaceFlag {\n if (isStringLiteral(node) && node.value === \"use strict\") {\n return WhitespaceFlag.after;\n }\n },\n\n /**\n * Test if CallExpressionish needs whitespace.\n */\n\n CallExpression(node: t.CallExpression): WhitespaceFlag {\n if (isFunction(node.callee) || isHelper(node)) {\n return WhitespaceFlag.before | WhitespaceFlag.after;\n }\n },\n\n OptionalCallExpression(node: t.OptionalCallExpression): WhitespaceFlag {\n if (isFunction(node.callee)) {\n return WhitespaceFlag.before | WhitespaceFlag.after;\n }\n },\n\n /**\n * Test if VariableDeclaration needs whitespace.\n */\n\n VariableDeclaration(node: t.VariableDeclaration): WhitespaceFlag {\n for (let i = 0; i < node.declarations.length; i++) {\n const declar = node.declarations[i];\n\n let enabled = isHelper(declar.id) && !isType(declar.init);\n if (!enabled && declar.init) {\n const state = crawl(declar.init);\n enabled = (isHelper(declar.init) && state.hasCall) || state.hasFunction;\n }\n\n if (enabled) {\n return WhitespaceFlag.before | WhitespaceFlag.after;\n }\n }\n },\n\n /**\n * Test if IfStatement needs whitespace.\n */\n\n IfStatement(node: t.IfStatement): WhitespaceFlag {\n if (isBlockStatement(node.consequent)) {\n return WhitespaceFlag.before | WhitespaceFlag.after;\n }\n },\n};\n\n/**\n * Test if Property needs whitespace.\n */\n\nnodes.ObjectProperty =\n nodes.ObjectTypeProperty =\n nodes.ObjectMethod =\n function (\n node: t.ObjectProperty | t.ObjectTypeProperty | t.ObjectMethod,\n parent: t.ObjectExpression,\n ): WhitespaceFlag {\n if (parent.properties[0] === node) {\n return WhitespaceFlag.before;\n }\n };\n\nnodes.ObjectTypeCallProperty = function (\n node: t.ObjectTypeCallProperty,\n parent: t.ObjectTypeAnnotation,\n): WhitespaceFlag {\n if (parent.callProperties[0] === node && !parent.properties?.length) {\n return WhitespaceFlag.before;\n }\n};\n\nnodes.ObjectTypeIndexer = function (\n node: t.ObjectTypeIndexer,\n parent: t.ObjectTypeAnnotation,\n): WhitespaceFlag {\n if (\n parent.indexers[0] === node &&\n !parent.properties?.length &&\n !parent.callProperties?.length\n ) {\n return WhitespaceFlag.before;\n }\n};\n\nnodes.ObjectTypeInternalSlot = function (\n node: t.ObjectTypeInternalSlot,\n parent: t.ObjectTypeAnnotation,\n): WhitespaceFlag {\n if (\n parent.internalSlots[0] === node &&\n !parent.properties?.length &&\n !parent.callProperties?.length &&\n !parent.indexers?.length\n ) {\n return WhitespaceFlag.before;\n }\n};\n\n/**\n * Add whitespace tests for nodes and their aliases.\n */\n\n(\n [\n [\"Function\", true],\n [\"Class\", true],\n [\"Loop\", true],\n [\"LabeledStatement\", true],\n [\"SwitchStatement\", true],\n [\"TryStatement\", true],\n ] as const\n).forEach(function ([type, amounts]) {\n [type as string]\n .concat(FLIPPED_ALIAS_KEYS[type] || [])\n .forEach(function (type) {\n const ret = amounts ? WhitespaceFlag.before | WhitespaceFlag.after : 0;\n nodes[type] = () => ret;\n });\n});\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["_t","require","FLIPPED_ALIAS_KEYS","isArrayExpression","isAssignmentExpression","isBinary","isBlockStatement","isCallExpression","isFunction","isIdentifier","isLiteral","isMemberExpression","isObjectExpression","isOptionalCallExpression","isOptionalMemberExpression","isStringLiteral","crawlInternal","node","state","object","computed","property","left","right","hasCall","callee","hasFunction","hasHelper","isHelper","crawl","name","charCodeAt","isType","nodes","exports","AssignmentExpression","SwitchCase","parent","consequent","length","cases","LogicalExpression","Literal","value","CallExpression","OptionalCallExpression","VariableDeclaration","i","declarations","declar","enabled","id","init","IfStatement","ObjectProperty","ObjectTypeProperty","ObjectMethod","properties","ObjectTypeCallProperty","_parent$properties","callProperties","ObjectTypeIndexer","_parent$properties2","_parent$callPropertie","indexers","ObjectTypeInternalSlot","_parent$properties3","_parent$callPropertie2","_parent$indexers","internalSlots","forEach","type","amounts","concat","ret"],"sources":["../../src/node/whitespace.ts"],"sourcesContent":["import {\n FLIPPED_ALIAS_KEYS,\n isArrayExpression,\n isAssignmentExpression,\n isBinary,\n isBlockStatement,\n isCallExpression,\n isFunction,\n isIdentifier,\n isLiteral,\n isMemberExpression,\n isObjectExpression,\n isOptionalCallExpression,\n isOptionalMemberExpression,\n isStringLiteral,\n} from \"@babel/types\";\nimport * as charCodes from \"charcodes\";\n\nimport type { NodeHandlers } from \"./index.ts\";\n\nimport type * as t from \"@babel/types\";\n\nconst enum WhitespaceFlag {\n before = 1 << 0,\n after = 1 << 1,\n}\n\nexport type { WhitespaceFlag };\n\nfunction crawlInternal(\n node: t.Node,\n state: { hasCall: boolean; hasFunction: boolean; hasHelper: boolean },\n) {\n if (!node) return state;\n\n if (isMemberExpression(node) || isOptionalMemberExpression(node)) {\n crawlInternal(node.object, state);\n if (node.computed) crawlInternal(node.property, state);\n } else if (isBinary(node) || isAssignmentExpression(node)) {\n crawlInternal(node.left, state);\n crawlInternal(node.right, state);\n } else if (isCallExpression(node) || isOptionalCallExpression(node)) {\n state.hasCall = true;\n crawlInternal(node.callee, state);\n } else if (isFunction(node)) {\n state.hasFunction = true;\n } else if (isIdentifier(node)) {\n state.hasHelper =\n // @ts-expect-error todo(flow->ts): node.callee is not really expected here…\n state.hasHelper || (node.callee && isHelper(node.callee));\n }\n\n return state;\n}\n\n/**\n * Crawl a node to test if it contains a CallExpression, a Function, or a Helper.\n *\n * @example\n * crawl(node)\n * // { hasCall: false, hasFunction: true, hasHelper: false }\n */\n\nfunction crawl(node: t.Node) {\n return crawlInternal(node, {\n hasCall: false,\n hasFunction: false,\n hasHelper: false,\n });\n}\n\n/**\n * Test if a node is or has a helper.\n */\n\nfunction isHelper(node: t.Node): boolean {\n if (!node) return false;\n\n if (isMemberExpression(node)) {\n return isHelper(node.object) || isHelper(node.property);\n } else if (isIdentifier(node)) {\n return (\n node.name === \"require\" ||\n node.name.charCodeAt(0) === charCodes.underscore\n );\n } else if (isCallExpression(node)) {\n return isHelper(node.callee);\n } else if (isBinary(node) || isAssignmentExpression(node)) {\n return (\n (isIdentifier(node.left) && isHelper(node.left)) || isHelper(node.right)\n );\n } else {\n return false;\n }\n}\n\nfunction isType(node: t.Node) {\n return (\n isLiteral(node) ||\n isObjectExpression(node) ||\n isArrayExpression(node) ||\n isIdentifier(node) ||\n isMemberExpression(node)\n );\n}\n\n/**\n * Tests for node types that need whitespace.\n */\n\nexport const nodes: NodeHandlers = {\n /**\n * Test if AssignmentExpression needs whitespace.\n */\n\n AssignmentExpression(node: t.AssignmentExpression): WhitespaceFlag {\n const state = crawl(node.right);\n if ((state.hasCall && state.hasHelper) || state.hasFunction) {\n return state.hasFunction\n ? WhitespaceFlag.before | WhitespaceFlag.after\n : WhitespaceFlag.after;\n }\n },\n\n /**\n * Test if SwitchCase needs whitespace.\n */\n\n SwitchCase(node: t.SwitchCase, parent: t.SwitchStatement): WhitespaceFlag {\n return (\n (!!node.consequent.length || parent.cases[0] === node\n ? WhitespaceFlag.before\n : 0) |\n (!node.consequent.length && parent.cases[parent.cases.length - 1] === node\n ? WhitespaceFlag.after\n : 0)\n );\n },\n\n /**\n * Test if LogicalExpression needs whitespace.\n */\n\n LogicalExpression(node: t.LogicalExpression): WhitespaceFlag {\n if (isFunction(node.left) || isFunction(node.right)) {\n return WhitespaceFlag.after;\n }\n },\n\n /**\n * Test if Literal needs whitespace.\n */\n\n Literal(node: t.Literal): WhitespaceFlag {\n if (isStringLiteral(node) && node.value === \"use strict\") {\n return WhitespaceFlag.after;\n }\n },\n\n /**\n * Test if CallExpressionish needs whitespace.\n */\n\n CallExpression(node: t.CallExpression): WhitespaceFlag {\n if (isFunction(node.callee) || isHelper(node)) {\n return WhitespaceFlag.before | WhitespaceFlag.after;\n }\n },\n\n OptionalCallExpression(node: t.OptionalCallExpression): WhitespaceFlag {\n if (isFunction(node.callee)) {\n return WhitespaceFlag.before | WhitespaceFlag.after;\n }\n },\n\n /**\n * Test if VariableDeclaration needs whitespace.\n */\n\n VariableDeclaration(node: t.VariableDeclaration): WhitespaceFlag {\n for (let i = 0; i < node.declarations.length; i++) {\n const declar = node.declarations[i];\n\n let enabled = isHelper(declar.id) && !isType(declar.init);\n if (!enabled && declar.init) {\n const state = crawl(declar.init);\n enabled = (isHelper(declar.init) && state.hasCall) || state.hasFunction;\n }\n\n if (enabled) {\n return WhitespaceFlag.before | WhitespaceFlag.after;\n }\n }\n },\n\n /**\n * Test if IfStatement needs whitespace.\n */\n\n IfStatement(node: t.IfStatement): WhitespaceFlag {\n if (isBlockStatement(node.consequent)) {\n return WhitespaceFlag.before | WhitespaceFlag.after;\n }\n },\n};\n\n/**\n * Test if Property needs whitespace.\n */\n\nnodes.ObjectProperty =\n nodes.ObjectTypeProperty =\n nodes.ObjectMethod =\n function (\n node: t.ObjectProperty | t.ObjectTypeProperty | t.ObjectMethod,\n parent: t.ObjectExpression,\n ): WhitespaceFlag {\n if (parent.properties[0] === node) {\n return WhitespaceFlag.before;\n }\n };\n\nnodes.ObjectTypeCallProperty = function (\n node: t.ObjectTypeCallProperty,\n parent: t.ObjectTypeAnnotation,\n): WhitespaceFlag {\n if (parent.callProperties[0] === node && !parent.properties?.length) {\n return WhitespaceFlag.before;\n }\n};\n\nnodes.ObjectTypeIndexer = function (\n node: t.ObjectTypeIndexer,\n parent: t.ObjectTypeAnnotation,\n): WhitespaceFlag {\n if (\n parent.indexers[0] === node &&\n !parent.properties?.length &&\n !parent.callProperties?.length\n ) {\n return WhitespaceFlag.before;\n }\n};\n\nnodes.ObjectTypeInternalSlot = function (\n node: t.ObjectTypeInternalSlot,\n parent: t.ObjectTypeAnnotation,\n): WhitespaceFlag {\n if (\n parent.internalSlots[0] === node &&\n !parent.properties?.length &&\n !parent.callProperties?.length &&\n !parent.indexers?.length\n ) {\n return WhitespaceFlag.before;\n }\n};\n\n/**\n * Add whitespace tests for nodes and their aliases.\n */\n\n(\n [\n [\"Function\", true],\n [\"Class\", true],\n [\"Loop\", true],\n [\"LabeledStatement\", true],\n [\"SwitchStatement\", true],\n [\"TryStatement\", true],\n ] as const\n).forEach(function ([type, amounts]) {\n [type as string]\n .concat(FLIPPED_ALIAS_KEYS[type] || [])\n .forEach(function (type) {\n const ret = amounts ? WhitespaceFlag.before | WhitespaceFlag.after : 0;\n nodes[type] = () => ret;\n });\n});\n"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/generator/lib/printer.js b/node_modules/@babel/generator/lib/printer.js index cc2faeb07c11..f137135dc792 100644 --- a/node_modules/@babel/generator/lib/printer.js +++ b/node_modules/@babel/generator/lib/printer.js @@ -17,10 +17,8 @@ const { } = _t; const SCIENTIFIC_NOTATION = /e/i; const ZERO_DECIMAL_INTEGER = /\.0+$/; -const NON_DECIMAL_LITERAL = /^0[box]/; -const PURE_ANNOTATION_RE = /^\s*[@#]__PURE__\s*$/; const HAS_NEWLINE = /[\n\r\u2028\u2029]/; -const HAS_BlOCK_COMMENT_END = /\*\//; +const HAS_NEWLINE_OR_BlOCK_COMMENT_END = /[\n\r\u2028\u2029]|\*\//; const { needsParens } = n; @@ -29,7 +27,6 @@ class Printer { this.inForStatementInitCounter = 0; this._printStack = []; this._indent = 0; - this._indentChar = 0; this._indentRepeat = 0; this._insideAux = false; this._parenPushNewlineState = null; @@ -42,10 +39,9 @@ class Printer { this._endsWithInnerRaw = false; this._indentInnerComments = true; this.format = format; - this._buf = new _buffer.default(map); - this._indentChar = format.indent.style.charCodeAt(0); this._indentRepeat = format.indent.style.length; this._inputMap = map == null ? void 0 : map._inputMap; + this._buf = new _buffer.default(map, format.indent.style[0]); } generate(ast) { this.print(ast); @@ -101,9 +97,16 @@ class Printer { this._endsWithWord = true; this._noLineTerminator = noLineTerminatorAfter; } - number(str) { + number(str, number) { + function isNonDecimalLiteral(str) { + if (str.length > 2 && str.charCodeAt(0) === 48) { + const secondChar = str.charCodeAt(1); + return secondChar === 98 || secondChar === 111 || secondChar === 120; + } + return false; + } this.word(str); - this._endsWithInteger = Number.isInteger(+str) && !NON_DECIMAL_LITERAL.test(str) && !SCIENTIFIC_NOTATION.test(str) && !ZERO_DECIMAL_INTEGER.test(str) && str.charCodeAt(str.length - 1) !== 46; + this._endsWithInteger = Number.isInteger(number) && !isNonDecimalLiteral(str) && !SCIENTIFIC_NOTATION.test(str) && !ZERO_DECIMAL_INTEGER.test(str) && str.charCodeAt(str.length - 1) !== 46; } token(str, maybeNewline = false) { this._maybePrintInnerComments(); @@ -215,7 +218,7 @@ class Printer { } _maybeIndent(firstChar) { if (this._indent && firstChar !== 10 && this.endsWith(10)) { - this._buf.queueIndentation(this._indentChar, this._getIndent()); + this._buf.queueIndentation(this._getIndent()); } } _shouldIndent(firstChar) { @@ -254,9 +257,7 @@ class Printer { } const chaPost = str.charCodeAt(i + 1); if (chaPost === 42) { - if (PURE_ANNOTATION_RE.test(str.slice(i + 2, len - 2))) { - return; - } + return; } else if (chaPost !== 47) { this._parenPushNewlineState = null; return; @@ -305,7 +306,7 @@ class Printer { } } print(node, parent, noLineTerminatorAfter, trailingCommentsLineOffset, forceParens) { - var _node$extra; + var _node$extra, _node$leadingComments; if (!node) return; this._endsWithInnerRaw = false; const nodeType = node.type; @@ -322,7 +323,24 @@ class Printer { const oldInAux = this._insideAux; this._insideAux = node.loc == undefined; this._maybeAddAuxComment(this._insideAux && !oldInAux); - const shouldPrintParens = forceParens || format.retainFunctionParens && nodeType === "FunctionExpression" && ((_node$extra = node.extra) == null ? void 0 : _node$extra.parenthesized) || needsParens(node, parent, this._printStack); + const parenthesized = (_node$extra = node.extra) == null ? void 0 : _node$extra.parenthesized; + let shouldPrintParens = forceParens || parenthesized && format.retainFunctionParens && nodeType === "FunctionExpression" || needsParens(node, parent, this._printStack); + if (!shouldPrintParens && parenthesized && (_node$leadingComments = node.leadingComments) != null && _node$leadingComments.length && node.leadingComments[0].type === "CommentBlock") { + const parentType = parent == null ? void 0 : parent.type; + switch (parentType) { + case "ExpressionStatement": + case "VariableDeclarator": + case "AssignmentExpression": + case "ReturnStatement": + break; + case "CallExpression": + case "OptionalCallExpression": + case "NewExpression": + if (parent.callee !== node) break; + default: + shouldPrintParens = true; + } + } if (shouldPrintParens) { this.tokenChar(40); this._endsWithInnerRaw = false; @@ -402,9 +420,13 @@ class Printer { if (!node) continue; if (opts.statement) this._printNewline(i === 0, newlineOpts); this.print(node, parent, undefined, opts.trailingCommentsLineOffset || 0); - opts.iterator == null ? void 0 : opts.iterator(node, i); - if (i < len - 1) separator == null ? void 0 : separator(); + opts.iterator == null || opts.iterator(node, i); + if (i < len - 1) separator == null || separator(); if (opts.statement) { + var _node$trailingComment; + if (!((_node$trailingComment = node.trailingComments) != null && _node$trailingComment.length)) { + this._lastCommentLine = 0; + } if (i + 1 === len) { this.newline(1); } else { @@ -507,7 +529,7 @@ class Printer { _shouldPrintComment(comment) { if (comment.ignore) return 0; if (this._printedComments.has(comment)) return 0; - if (this._noLineTerminator && (HAS_NEWLINE.test(comment.value) || HAS_BlOCK_COMMENT_END.test(comment.value))) { + if (this._noLineTerminator && HAS_NEWLINE_OR_BlOCK_COMMENT_END.test(comment.value)) { return 2; } this._printedComments.add(comment); @@ -529,6 +551,14 @@ class Printer { } let val; if (isBlockComment) { + const { + _parenPushNewlineState + } = this; + if ((_parenPushNewlineState == null ? void 0 : _parenPushNewlineState.printed) === false && HAS_NEWLINE.test(comment.value)) { + this.tokenChar(40); + this.indent(); + _parenPushNewlineState.printed = true; + } val = `/*${comment.value}*/`; if (this.format.indent.adjustMultilineComment) { var _comment$loc; @@ -537,11 +567,15 @@ class Printer { const newlineRegex = new RegExp("\\n\\s{1," + offset + "}", "g"); val = val.replace(newlineRegex, "\n"); } - let indentSize = this.format.retainLines ? 0 : this._buf.getCurrentColumn(); - if (this._shouldIndent(47) || this.format.retainLines) { - indentSize += this._getIndent(); + if (this.format.concise) { + val = val.replace(/\n(?!$)/g, `\n`); + } else { + let indentSize = this.format.retainLines ? 0 : this._buf.getCurrentColumn(); + if (this._shouldIndent(47) || this.format.retainLines) { + indentSize += this._getIndent(); + } + val = val.replace(/\n(?!$)/g, `\n${" ".repeat(indentSize)}`); } - val = val.replace(/\n(?!$)/g, `\n${" ".repeat(indentSize)}`); } } else if (!noLineTerminator) { val = `//${comment.value}`; @@ -641,8 +675,7 @@ Object.assign(Printer.prototype, generatorFunctions); { Printer.prototype.Noop = function Noop() {}; } -var _default = Printer; -exports.default = _default; +var _default = exports.default = Printer; function commaSeparator() { this.tokenChar(44); this.space(); diff --git a/node_modules/@babel/generator/lib/printer.js.map b/node_modules/@babel/generator/lib/printer.js.map index b74597324e7e..46e0b8738083 100644 --- a/node_modules/@babel/generator/lib/printer.js.map +++ b/node_modules/@babel/generator/lib/printer.js.map @@ -1 +1 @@ -{"version":3,"names":["_buffer","require","n","_t","generatorFunctions","isFunction","isStatement","isClassBody","isTSInterfaceBody","isTSEnumDeclaration","SCIENTIFIC_NOTATION","ZERO_DECIMAL_INTEGER","NON_DECIMAL_LITERAL","PURE_ANNOTATION_RE","HAS_NEWLINE","HAS_BlOCK_COMMENT_END","needsParens","Printer","constructor","format","map","inForStatementInitCounter","_printStack","_indent","_indentChar","_indentRepeat","_insideAux","_parenPushNewlineState","_noLineTerminator","_printAuxAfterOnNextUserNode","_printedComments","Set","_endsWithInteger","_endsWithWord","_lastCommentLine","_endsWithInnerRaw","_indentInnerComments","_buf","Buffer","indent","style","charCodeAt","length","_inputMap","generate","ast","print","_maybeAddAuxComment","get","compact","concise","dedent","semicolon","force","_appendChar","_queue","rightBrace","node","minified","removeLastSemicolon","sourceWithOffset","loc","token","rightParens","space","_space","hasContent","lastCp","getLastChar","word","str","noLineTerminatorAfter","_maybePrintInnerComments","endsWith","_append","number","Number","isInteger","test","maybeNewline","lastChar","strFirst","tokenChar","char","newline","i","retainLines","getNewlineCount","j","_newline","endsWithCharAndNewline","removeTrailingNewline","exactSource","cb","_catchUp","source","prop","columnOffset","withSource","sourceIdentifierName","identifierName","pos","_canMarkIdName","sourcePosition","_sourcePosition","identifierNamePos","_maybeAddParen","_maybeIndent","append","_maybeAddParenChar","appendChar","queue","firstChar","queueIndentation","_getIndent","_shouldIndent","parenPushNewlineState","printed","len","cha","chaPost","slice","catchUp","line","count","getCurrentLine","_loc$prop","printTerminatorless","parent","isLabel","terminatorState","trailingCommentsLineOffset","forceParens","_node$extra","nodeType","type","oldConcise","_compact","printMethod","undefined","ReferenceError","JSON","stringify","name","push","oldInAux","shouldPrintParens","retainFunctionParens","extra","parenthesized","_printLeadingComments","bind","_printTrailingComments","pop","enteredPositionlessNode","_printAuxBeforeComment","_printAuxAfterComment","comment","auxiliaryCommentBefore","_printComment","value","auxiliaryCommentAfter","getPossibleRaw","raw","rawValue","printJoin","nodes","opts","_nodes$0$loc","startLine","start","newlineOpts","addNewlines","nextNodeStartLine","separator","statement","_printNewline","iterator","_nextNode$loc","nextNode","printAndIndentOnComments","leadingComments","printBlock","body","lineOffset","innerComments","trailingComments","_printComments","comments","printInnerComments","hasSpace","printedCommentsCount","size","noIndentInnerCommentsHere","printSequence","_opts$indent","printList","items","commaSeparator","newLine","lastCommentLine","offset","_shouldPrintComment","ignore","has","add","shouldPrintComment","skipNewLines","noLineTerminator","isBlockComment","printNewLines","lastCharCode","val","adjustMultilineComment","_comment$loc","column","newlineRegex","RegExp","replace","indentSize","getCurrentColumn","repeat","nodeLoc","hasLoc","nodeStartLine","nodeEndLine","end","lastLine","leadingCommentNewline","shouldPrint","commentStartLine","commentEndLine","Math","max","min","singleLine","shouldSkipNewline","properties","Object","assign","prototype","Noop","_default","exports","default"],"sources":["../src/printer.ts"],"sourcesContent":["import Buffer, { type Pos } from \"./buffer.ts\";\nimport type { Loc } from \"./buffer.ts\";\nimport * as n from \"./node/index.ts\";\nimport type * as t from \"@babel/types\";\nimport {\n isFunction,\n isStatement,\n isClassBody,\n isTSInterfaceBody,\n isTSEnumDeclaration,\n} from \"@babel/types\";\nimport type {\n RecordAndTuplePluginOptions,\n PipelineOperatorPluginOptions,\n} from \"@babel/parser\";\nimport type { Opts as jsescOptions } from \"jsesc\";\n\nimport * as generatorFunctions from \"./generators/index.ts\";\nimport type SourceMap from \"./source-map.ts\";\nimport * as charCodes from \"charcodes\";\nimport type { TraceMap } from \"@jridgewell/trace-mapping\";\n\nconst SCIENTIFIC_NOTATION = /e/i;\nconst ZERO_DECIMAL_INTEGER = /\\.0+$/;\nconst NON_DECIMAL_LITERAL = /^0[box]/;\nconst PURE_ANNOTATION_RE = /^\\s*[@#]__PURE__\\s*$/;\nconst HAS_NEWLINE = /[\\n\\r\\u2028\\u2029]/;\nconst HAS_BlOCK_COMMENT_END = /\\*\\//;\n\nconst { needsParens } = n;\n\nconst enum COMMENT_TYPE {\n LEADING,\n INNER,\n TRAILING,\n}\n\nconst enum COMMENT_SKIP_NEWLINE {\n DEFAULT,\n ALL,\n LEADING,\n TRAILING,\n}\n\nconst enum PRINT_COMMENT_HINT {\n SKIP,\n ALLOW,\n DEFER,\n}\n\nexport type Format = {\n shouldPrintComment: (comment: string) => boolean;\n retainLines: boolean;\n retainFunctionParens: boolean;\n comments: boolean;\n auxiliaryCommentBefore: string;\n auxiliaryCommentAfter: string;\n compact: boolean | \"auto\";\n minified: boolean;\n concise: boolean;\n indent: {\n adjustMultilineComment: boolean;\n style: string;\n };\n recordAndTupleSyntaxType: RecordAndTuplePluginOptions[\"syntaxType\"];\n jsescOption: jsescOptions;\n /**\n * @deprecated Removed in Babel 8, use `jsescOption` instead\n */\n jsonCompatibleStrings?: boolean;\n /**\n * For use with the Hack-style pipe operator.\n * Changes what token is used for pipe bodies’ topic references.\n */\n topicToken?: PipelineOperatorPluginOptions[\"topicToken\"];\n /**\n * @deprecated Removed in Babel 8\n */\n decoratorsBeforeExport?: boolean;\n /**\n * The import attributes syntax style:\n * - \"with\" : `import { a } from \"b\" with { type: \"json\" };`\n * - \"assert\" : `import { a } from \"b\" assert { type: \"json\" };`\n * - \"with-legacy\" : `import { a } from \"b\" with type: \"json\";`\n */\n importAttributesKeyword?: \"with\" | \"assert\" | \"with-legacy\";\n};\n\ninterface AddNewlinesOptions {\n addNewlines(leading: boolean, node: t.Node): number;\n nextNodeStartLine: number;\n}\n\ninterface PrintSequenceOptions extends Partial {\n statement?: boolean;\n indent?: boolean;\n trailingCommentsLineOffset?: number;\n}\n\ninterface PrintListOptions {\n separator?: (this: Printer) => void;\n iterator?: (node: t.Node, index: number) => void;\n statement?: boolean;\n indent?: boolean;\n}\n\nexport type PrintJoinOptions = PrintListOptions & PrintSequenceOptions;\nclass Printer {\n constructor(format: Format, map: SourceMap) {\n this.format = format;\n this._buf = new Buffer(map);\n\n this._indentChar = format.indent.style.charCodeAt(0);\n this._indentRepeat = format.indent.style.length;\n\n this._inputMap = map?._inputMap;\n }\n declare _inputMap: TraceMap;\n\n declare format: Format;\n inForStatementInitCounter: number = 0;\n\n declare _buf: Buffer;\n _printStack: Array = [];\n _indent: number = 0;\n _indentChar: number = 0;\n _indentRepeat: number = 0;\n _insideAux: boolean = false;\n _parenPushNewlineState: { printed: boolean } | null = null;\n _noLineTerminator: boolean = false;\n _printAuxAfterOnNextUserNode: boolean = false;\n _printedComments = new Set();\n _endsWithInteger = false;\n _endsWithWord = false;\n _lastCommentLine = 0;\n _endsWithInnerRaw: boolean = false;\n _indentInnerComments: boolean = true;\n\n generate(ast: t.Node) {\n this.print(ast);\n this._maybeAddAuxComment();\n\n return this._buf.get();\n }\n\n /**\n * Increment indent size.\n */\n\n indent(): void {\n if (this.format.compact || this.format.concise) return;\n\n this._indent++;\n }\n\n /**\n * Decrement indent size.\n */\n\n dedent(): void {\n if (this.format.compact || this.format.concise) return;\n\n this._indent--;\n }\n\n /**\n * Add a semicolon to the buffer.\n */\n\n semicolon(force: boolean = false): void {\n this._maybeAddAuxComment();\n if (force) {\n this._appendChar(charCodes.semicolon);\n } else {\n this._queue(charCodes.semicolon);\n }\n this._noLineTerminator = false;\n }\n\n /**\n * Add a right brace to the buffer.\n */\n\n rightBrace(node: t.Node): void {\n if (this.format.minified) {\n this._buf.removeLastSemicolon();\n }\n this.sourceWithOffset(\"end\", node.loc, -1);\n this.token(\"}\");\n }\n\n rightParens(node: t.Node): void {\n this.sourceWithOffset(\"end\", node.loc, -1);\n this.token(\")\");\n }\n\n /**\n * Add a space to the buffer unless it is compact.\n */\n\n space(force: boolean = false): void {\n if (this.format.compact) return;\n\n if (force) {\n this._space();\n } else if (this._buf.hasContent()) {\n const lastCp = this.getLastChar();\n if (lastCp !== charCodes.space && lastCp !== charCodes.lineFeed) {\n this._space();\n }\n }\n }\n\n /**\n * Writes a token that can't be safely parsed without taking whitespace into account.\n */\n\n word(str: string, noLineTerminatorAfter: boolean = false): void {\n this._maybePrintInnerComments();\n\n // prevent concatenating words and creating // comment out of division and regex\n if (\n this._endsWithWord ||\n (str.charCodeAt(0) === charCodes.slash && this.endsWith(charCodes.slash))\n ) {\n this._space();\n }\n\n this._maybeAddAuxComment();\n this._append(str, false);\n\n this._endsWithWord = true;\n this._noLineTerminator = noLineTerminatorAfter;\n }\n\n /**\n * Writes a number token so that we can validate if it is an integer.\n */\n\n number(str: string): void {\n this.word(str);\n\n // Integer tokens need special handling because they cannot have '.'s inserted\n // immediately after them.\n this._endsWithInteger =\n Number.isInteger(+str) &&\n !NON_DECIMAL_LITERAL.test(str) &&\n !SCIENTIFIC_NOTATION.test(str) &&\n !ZERO_DECIMAL_INTEGER.test(str) &&\n str.charCodeAt(str.length - 1) !== charCodes.dot;\n }\n\n /**\n * Writes a simple token.\n */\n token(str: string, maybeNewline = false): void {\n this._maybePrintInnerComments();\n\n const lastChar = this.getLastChar();\n const strFirst = str.charCodeAt(0);\n if (\n (lastChar === charCodes.exclamationMark &&\n // space is mandatory to avoid outputting ` line comment\n const comment = this.skipLineComment(3);\n if (comment !== undefined) {\n this.addComment(comment);\n if (this.options.attachComment) comments.push(comment);\n }\n } else {\n break loop;\n }\n } else if (\n ch === charCodes.lessThan &&\n !this.inModule &&\n this.options.annexB\n ) {\n const pos = this.state.pos;\n if (\n this.input.charCodeAt(pos + 1) === charCodes.exclamationMark &&\n this.input.charCodeAt(pos + 2) === charCodes.dash &&\n this.input.charCodeAt(pos + 3) === charCodes.dash\n ) {\n // `` line comment\n const comment = this.skipLineComment(3);\n if (comment !== undefined) {\n this.addComment(comment);\n if (this.options.attachComment) comments.push(comment);\n }\n } else {\n break loop;\n }\n } else if (\n ch === charCodes.lessThan &&\n !this.inModule &&\n this.options.annexB\n ) {\n const pos = this.state.pos;\n if (\n this.input.charCodeAt(pos + 1) === charCodes.exclamationMark &&\n this.input.charCodeAt(pos + 2) === charCodes.dash &&\n this.input.charCodeAt(pos + 3) === charCodes.dash\n ) {\n // ` + ``` -This will create a global `JSON5` variable. +#### Modules +```html + +``` ## API The JSON5 API is compatible with the [JSON API]. @@ -195,18 +234,27 @@ run lint` before submitting pull requests. Please use an editor that supports [EditorConfig](http://editorconfig.org/). ### Issues -To report bugs or request features regarding the JSON5 data format, please -submit an issue to the [official specification -repository](https://github.com/json5/json5-spec). +To report bugs or request features regarding the JSON5 **data format**, +please submit an issue to the official +**[_specification_ repository](https://github.com/json5/json5-spec)**. + +Note that we will never add any features that make JSON5 incompatible with ES5; +that compatibility is a fundamental premise of JSON5. + +To report bugs or request features regarding this **JavaScript implementation** +of JSON5, please submit an issue to **_this_ repository**. -To report bugs or request features regarding the JavaScript implementation of -JSON5, please submit an issue to this repository. +### Security Vulnerabilities and Disclosures +To report a security vulnerability, please follow the follow the guidelines +described in our [security policy](./SECURITY.md). ## License MIT. See [LICENSE.md](./LICENSE.md) for details. ## Credits -[Assem Kishore](https://github.com/aseemk) founded this project. +[Aseem Kishore](https://github.com/aseemk) founded this project. +He wrote a [blog post](https://aseemk.substack.com/p/ignore-the-f-ing-haters-json5) +about the journey and lessons learned 10 years in. [Michael Bolin](http://bolinfest.com/) independently arrived at and published some of these same ideas with awesome explanations and detail. Recommended diff --git a/node_modules/json5/dist/index.js b/node_modules/json5/dist/index.js index 9f98eb39da13..bf86533e36ce 100644 --- a/node_modules/json5/dist/index.js +++ b/node_modules/json5/dist/index.js @@ -386,12 +386,34 @@ function internalize (holder, name, reviver) { var value = holder[name]; if (value != null && typeof value === 'object') { - for (var key in value) { - var replacement = internalize(value, key, reviver); - if (replacement === undefined) { - delete value[key]; - } else { - value[key] = replacement; + if (Array.isArray(value)) { + for (var i = 0; i < value.length; i++) { + var key = String(i); + var replacement = internalize(value, key, reviver); + if (replacement === undefined) { + delete value[key]; + } else { + Object.defineProperty(value, key, { + value: replacement, + writable: true, + enumerable: true, + configurable: true, + }); + } + } + } else { + for (var key$1 in value) { + var replacement$1 = internalize(value, key$1, reviver); + if (replacement$1 === undefined) { + delete value[key$1]; + } else { + Object.defineProperty(value, key$1, { + value: replacement$1, + writable: true, + enumerable: true, + configurable: true, + }); + } } } } @@ -1319,7 +1341,12 @@ if (Array.isArray(parent)) { parent.push(value); } else { - parent[key] = value; + Object.defineProperty(parent, key, { + value: value, + writable: true, + enumerable: true, + configurable: true, + }); } } diff --git a/node_modules/json5/dist/index.min.js b/node_modules/json5/dist/index.min.js index da63a9da38f4..ddce3e2d49c3 100644 --- a/node_modules/json5/dist/index.min.js +++ b/node_modules/json5/dist/index.min.js @@ -1 +1 @@ -!function(u,D){"object"==typeof exports&&"undefined"!=typeof module?module.exports=D():"function"==typeof define&&define.amd?define(D):u.JSON5=D()}(this,function(){"use strict";function u(u,D){return u(D={exports:{}},D.exports),D.exports}var D=u(function(u){var D=u.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=D)}),e=u(function(u){var D=u.exports={version:"2.6.5"};"number"==typeof __e&&(__e=D)}),t=(e.version,function(u){return"object"==typeof u?null!==u:"function"==typeof u}),r=function(u){if(!t(u))throw TypeError(u+" is not an object!");return u},F=function(u){try{return!!u()}catch(u){return!0}},n=!F(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),C=D.document,A=t(C)&&t(C.createElement),i=!n&&!F(function(){return 7!=Object.defineProperty((u="div",A?C.createElement(u):{}),"a",{get:function(){return 7}}).a;var u}),E=Object.defineProperty,o={f:n?Object.defineProperty:function(u,D,e){if(r(u),D=function(u,D){if(!t(u))return u;var e,r;if(D&&"function"==typeof(e=u.toString)&&!t(r=e.call(u)))return r;if("function"==typeof(e=u.valueOf)&&!t(r=e.call(u)))return r;if(!D&&"function"==typeof(e=u.toString)&&!t(r=e.call(u)))return r;throw TypeError("Can't convert object to primitive value")}(D,!0),r(e),i)try{return E(u,D,e)}catch(u){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(u[D]=e.value),u}},a=n?function(u,D,e){return o.f(u,D,function(u,D){return{enumerable:!(1&u),configurable:!(2&u),writable:!(4&u),value:D}}(1,e))}:function(u,D,e){return u[D]=e,u},c={}.hasOwnProperty,B=function(u,D){return c.call(u,D)},s=0,f=Math.random(),l=u(function(u){var t=D["__core-js_shared__"]||(D["__core-js_shared__"]={});(u.exports=function(u,D){return t[u]||(t[u]=void 0!==D?D:{})})("versions",[]).push({version:e.version,mode:"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})})("native-function-to-string",Function.toString),d=u(function(u){var t,r="Symbol(".concat(void 0===(t="src")?"":t,")_",(++s+f).toString(36)),F=(""+l).split("toString");e.inspectSource=function(u){return l.call(u)},(u.exports=function(u,e,t,n){var C="function"==typeof t;C&&(B(t,"name")||a(t,"name",e)),u[e]!==t&&(C&&(B(t,r)||a(t,r,u[e]?""+u[e]:F.join(String(e)))),u===D?u[e]=t:n?u[e]?u[e]=t:a(u,e,t):(delete u[e],a(u,e,t)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[r]||l.call(this)})}),v=function(u,D,e){if(function(u){if("function"!=typeof u)throw TypeError(u+" is not a function!")}(u),void 0===D)return u;switch(e){case 1:return function(e){return u.call(D,e)};case 2:return function(e,t){return u.call(D,e,t)};case 3:return function(e,t,r){return u.call(D,e,t,r)}}return function(){return u.apply(D,arguments)}},p=function(u,t,r){var F,n,C,A,i=u&p.F,E=u&p.G,o=u&p.S,c=u&p.P,B=u&p.B,s=E?D:o?D[t]||(D[t]={}):(D[t]||{}).prototype,f=E?e:e[t]||(e[t]={}),l=f.prototype||(f.prototype={});for(F in E&&(r=t),r)C=((n=!i&&s&&void 0!==s[F])?s:r)[F],A=B&&n?v(C,D):c&&"function"==typeof C?v(Function.call,C):C,s&&d(s,F,C,u&p.U),f[F]!=C&&a(f,F,A),c&&l[F]!=C&&(l[F]=C)};D.core=e,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,p.U=64,p.R=128;var h,m=p,g=Math.ceil,y=Math.floor,w=function(u){return isNaN(u=+u)?0:(u>0?y:g)(u)},S=(h=!1,function(u,D){var e,t,r=String(function(u){if(null==u)throw TypeError("Can't call method on "+u);return u}(u)),F=w(D),n=r.length;return F<0||F>=n?h?"":void 0:(e=r.charCodeAt(F))<55296||e>56319||F+1===n||(t=r.charCodeAt(F+1))<56320||t>57343?h?r.charAt(F):e:h?r.slice(F,F+2):t-56320+(e-55296<<10)+65536});m(m.P,"String",{codePointAt:function(u){return S(this,u)}});e.String.codePointAt;var b=Math.max,x=Math.min,N=String.fromCharCode,P=String.fromCodePoint;m(m.S+m.F*(!!P&&1!=P.length),"String",{fromCodePoint:function(u){for(var D,e,t,r=arguments,F=[],n=arguments.length,C=0;n>C;){if(D=+r[C++],t=1114111,((e=w(e=D))<0?b(e+t,0):x(e,t))!==D)throw RangeError(D+" is not a valid code point");F.push(D<65536?N(D):N(55296+((D-=65536)>>10),D%1024+56320))}return F.join("")}});e.String.fromCodePoint;var _,I,O,j,V,J,M,k,L,T,z,H,$,R,G={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},U={isSpaceSeparator:function(u){return"string"==typeof u&&G.Space_Separator.test(u)},isIdStartChar:function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||G.ID_Start.test(u))},isIdContinueChar:function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"‌"===u||"‍"===u||G.ID_Continue.test(u))},isDigit:function(u){return"string"==typeof u&&/[0-9]/.test(u)},isHexDigit:function(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};function Z(){for(T="default",z="",H=!1,$=1;;){R=q();var u=X[T]();if(u)return u}}function q(){if(_[j])return String.fromCodePoint(_.codePointAt(j))}function W(){var u=q();return"\n"===u?(V++,J=0):u?J+=u.length:J++,u&&(j+=u.length),u}var X={default:function(){switch(R){case"\t":case"\v":case"\f":case" ":case" ":case"\ufeff":case"\n":case"\r":case"\u2028":case"\u2029":return void W();case"/":return W(),void(T="comment");case void 0:return W(),K("eof")}if(!U.isSpaceSeparator(R))return X[I]();W()},comment:function(){switch(R){case"*":return W(),void(T="multiLineComment");case"/":return W(),void(T="singleLineComment")}throw tu(W())},multiLineComment:function(){switch(R){case"*":return W(),void(T="multiLineCommentAsterisk");case void 0:throw tu(W())}W()},multiLineCommentAsterisk:function(){switch(R){case"*":return void W();case"/":return W(),void(T="default");case void 0:throw tu(W())}W(),T="multiLineComment"},singleLineComment:function(){switch(R){case"\n":case"\r":case"\u2028":case"\u2029":return W(),void(T="default");case void 0:return W(),K("eof")}W()},value:function(){switch(R){case"{":case"[":return K("punctuator",W());case"n":return W(),Q("ull"),K("null",null);case"t":return W(),Q("rue"),K("boolean",!0);case"f":return W(),Q("alse"),K("boolean",!1);case"-":case"+":return"-"===W()&&($=-1),void(T="sign");case".":return z=W(),void(T="decimalPointLeading");case"0":return z=W(),void(T="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return z=W(),void(T="decimalInteger");case"I":return W(),Q("nfinity"),K("numeric",1/0);case"N":return W(),Q("aN"),K("numeric",NaN);case'"':case"'":return H='"'===W(),z="",void(T="string")}throw tu(W())},identifierNameStartEscape:function(){if("u"!==R)throw tu(W());W();var u=Y();switch(u){case"$":case"_":break;default:if(!U.isIdStartChar(u))throw Fu()}z+=u,T="identifierName"},identifierName:function(){switch(R){case"$":case"_":case"‌":case"‍":return void(z+=W());case"\\":return W(),void(T="identifierNameEscape")}if(!U.isIdContinueChar(R))return K("identifier",z);z+=W()},identifierNameEscape:function(){if("u"!==R)throw tu(W());W();var u=Y();switch(u){case"$":case"_":case"‌":case"‍":break;default:if(!U.isIdContinueChar(u))throw Fu()}z+=u,T="identifierName"},sign:function(){switch(R){case".":return z=W(),void(T="decimalPointLeading");case"0":return z=W(),void(T="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return z=W(),void(T="decimalInteger");case"I":return W(),Q("nfinity"),K("numeric",$*(1/0));case"N":return W(),Q("aN"),K("numeric",NaN)}throw tu(W())},zero:function(){switch(R){case".":return z+=W(),void(T="decimalPoint");case"e":case"E":return z+=W(),void(T="decimalExponent");case"x":case"X":return z+=W(),void(T="hexadecimal")}return K("numeric",0*$)},decimalInteger:function(){switch(R){case".":return z+=W(),void(T="decimalPoint");case"e":case"E":return z+=W(),void(T="decimalExponent")}if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},decimalPointLeading:function(){if(U.isDigit(R))return z+=W(),void(T="decimalFraction");throw tu(W())},decimalPoint:function(){switch(R){case"e":case"E":return z+=W(),void(T="decimalExponent")}return U.isDigit(R)?(z+=W(),void(T="decimalFraction")):K("numeric",$*Number(z))},decimalFraction:function(){switch(R){case"e":case"E":return z+=W(),void(T="decimalExponent")}if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},decimalExponent:function(){switch(R){case"+":case"-":return z+=W(),void(T="decimalExponentSign")}if(U.isDigit(R))return z+=W(),void(T="decimalExponentInteger");throw tu(W())},decimalExponentSign:function(){if(U.isDigit(R))return z+=W(),void(T="decimalExponentInteger");throw tu(W())},decimalExponentInteger:function(){if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},hexadecimal:function(){if(U.isHexDigit(R))return z+=W(),void(T="hexadecimalInteger");throw tu(W())},hexadecimalInteger:function(){if(!U.isHexDigit(R))return K("numeric",$*Number(z));z+=W()},string:function(){switch(R){case"\\":return W(),void(z+=function(){switch(q()){case"b":return W(),"\b";case"f":return W(),"\f";case"n":return W(),"\n";case"r":return W(),"\r";case"t":return W(),"\t";case"v":return W(),"\v";case"0":if(W(),U.isDigit(q()))throw tu(W());return"\0";case"x":return W(),function(){var u="",D=q();if(!U.isHexDigit(D))throw tu(W());if(u+=W(),D=q(),!U.isHexDigit(D))throw tu(W());return u+=W(),String.fromCodePoint(parseInt(u,16))}();case"u":return W(),Y();case"\n":case"\u2028":case"\u2029":return W(),"";case"\r":return W(),"\n"===q()&&W(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw tu(W())}return W()}());case'"':return H?(W(),K("string",z)):void(z+=W());case"'":return H?void(z+=W()):(W(),K("string",z));case"\n":case"\r":throw tu(W());case"\u2028":case"\u2029":!function(u){console.warn("JSON5: '"+nu(u)+"' in strings is not valid ECMAScript; consider escaping")}(R);break;case void 0:throw tu(W())}z+=W()},start:function(){switch(R){case"{":case"[":return K("punctuator",W())}T="value"},beforePropertyName:function(){switch(R){case"$":case"_":return z=W(),void(T="identifierName");case"\\":return W(),void(T="identifierNameStartEscape");case"}":return K("punctuator",W());case'"':case"'":return H='"'===W(),void(T="string")}if(U.isIdStartChar(R))return z+=W(),void(T="identifierName");throw tu(W())},afterPropertyName:function(){if(":"===R)return K("punctuator",W());throw tu(W())},beforePropertyValue:function(){T="value"},afterPropertyValue:function(){switch(R){case",":case"}":return K("punctuator",W())}throw tu(W())},beforeArrayValue:function(){if("]"===R)return K("punctuator",W());T="value"},afterArrayValue:function(){switch(R){case",":case"]":return K("punctuator",W())}throw tu(W())},end:function(){throw tu(W())}};function K(u,D){return{type:u,value:D,line:V,column:J}}function Q(u){for(var D=0,e=u;D0;){var e=q();if(!U.isHexDigit(e))throw tu(W());u+=W()}return String.fromCodePoint(parseInt(u,16))}var uu={start:function(){if("eof"===M.type)throw ru();Du()},beforePropertyName:function(){switch(M.type){case"identifier":case"string":return k=M.value,void(I="afterPropertyName");case"punctuator":return void eu();case"eof":throw ru()}},afterPropertyName:function(){if("eof"===M.type)throw ru();I="beforePropertyValue"},beforePropertyValue:function(){if("eof"===M.type)throw ru();Du()},beforeArrayValue:function(){if("eof"===M.type)throw ru();"punctuator"!==M.type||"]"!==M.value?Du():eu()},afterPropertyValue:function(){if("eof"===M.type)throw ru();switch(M.value){case",":return void(I="beforePropertyName");case"}":eu()}},afterArrayValue:function(){if("eof"===M.type)throw ru();switch(M.value){case",":return void(I="beforeArrayValue");case"]":eu()}},end:function(){}};function Du(){var u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}if(void 0===L)L=u;else{var D=O[O.length-1];Array.isArray(D)?D.push(u):D[k]=u}if(null!==u&&"object"==typeof u)O.push(u),I=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{var e=O[O.length-1];I=null==e?"end":Array.isArray(e)?"afterArrayValue":"afterPropertyValue"}}function eu(){O.pop();var u=O[O.length-1];I=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function tu(u){return Cu(void 0===u?"JSON5: invalid end of input at "+V+":"+J:"JSON5: invalid character '"+nu(u)+"' at "+V+":"+J)}function ru(){return Cu("JSON5: invalid end of input at "+V+":"+J)}function Fu(){return Cu("JSON5: invalid identifier character at "+V+":"+(J-=5))}function nu(u){var D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){var e=u.charCodeAt(0).toString(16);return"\\x"+("00"+e).substring(e.length)}return u}function Cu(u){var D=new SyntaxError(u);return D.lineNumber=V,D.columnNumber=J,D}return{parse:function(u,D){_=String(u),I="start",O=[],j=0,V=1,J=0,M=void 0,k=void 0,L=void 0;do{M=Z(),uu[I]()}while("eof"!==M.type);return"function"==typeof D?function u(D,e,t){var r=D[e];if(null!=r&&"object"==typeof r)for(var F in r){var n=u(r,F,t);void 0===n?delete r[F]:r[F]=n}return t.call(D,e,r)}({"":L},"",D):L},stringify:function(u,D,e){var t,r,F,n=[],C="",A="";if(null==D||"object"!=typeof D||Array.isArray(D)||(e=D.space,F=D.quote,D=D.replacer),"function"==typeof D)r=D;else if(Array.isArray(D)){t=[];for(var i=0,E=D;i0&&(e=Math.min(10,Math.floor(e)),A=" ".substr(0,e)):"string"==typeof e&&(A=e.substr(0,10)),c("",{"":u});function c(u,D){var e=D[u];switch(null!=e&&("function"==typeof e.toJSON5?e=e.toJSON5(u):"function"==typeof e.toJSON&&(e=e.toJSON(u))),r&&(e=r.call(D,u,e)),e instanceof Number?e=Number(e):e instanceof String?e=String(e):e instanceof Boolean&&(e=e.valueOf()),e){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof e?B(e):"number"==typeof e?String(e):"object"==typeof e?Array.isArray(e)?function(u){if(n.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");n.push(u);var D=C;C+=A;for(var e,t=[],r=0;r=0)throw TypeError("Converting circular structure to JSON5");n.push(u);var D=C;C+=A;for(var e,r,F=t||Object.keys(u),i=[],E=0,o=F;E0?y:g)(u)},b=(h=!1,function(u,D){var e,r,t=String(function(u){if(null==u)throw TypeError("Can't call method on "+u);return u}(u)),n=w(D),F=t.length;return n<0||n>=F?h?"":void 0:(e=t.charCodeAt(n))<55296||e>56319||n+1===F||(r=t.charCodeAt(n+1))<56320||r>57343?h?t.charAt(n):e:h?t.slice(n,n+2):r-56320+(e-55296<<10)+65536});m(m.P,"String",{codePointAt:function(u){return b(this,u)}});e.String.codePointAt;var S=Math.max,x=Math.min,N=String.fromCharCode,P=String.fromCodePoint;m(m.S+m.F*(!!P&&1!=P.length),"String",{fromCodePoint:function(u){for(var D,e,r,t=arguments,n=[],F=arguments.length,C=0;F>C;){if(D=+t[C++],r=1114111,((e=w(e=D))<0?S(e+r,0):x(e,r))!==D)throw RangeError(D+" is not a valid code point");n.push(D<65536?N(D):N(55296+((D-=65536)>>10),D%1024+56320))}return n.join("")}});e.String.fromCodePoint;var _,O,j,I,V,J,M,k,L,T,z,H,$,R,G={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},U={isSpaceSeparator:function(u){return"string"==typeof u&&G.Space_Separator.test(u)},isIdStartChar:function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||G.ID_Start.test(u))},isIdContinueChar:function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"‌"===u||"‍"===u||G.ID_Continue.test(u))},isDigit:function(u){return"string"==typeof u&&/[0-9]/.test(u)},isHexDigit:function(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};function Z(){for(T="default",z="",H=!1,$=1;;){R=q();var u=X[T]();if(u)return u}}function q(){if(_[I])return String.fromCodePoint(_.codePointAt(I))}function W(){var u=q();return"\n"===u?(V++,J=0):u?J+=u.length:J++,u&&(I+=u.length),u}var X={default:function(){switch(R){case"\t":case"\v":case"\f":case" ":case" ":case"\ufeff":case"\n":case"\r":case"\u2028":case"\u2029":return void W();case"/":return W(),void(T="comment");case void 0:return W(),K("eof")}if(!U.isSpaceSeparator(R))return X[O]();W()},comment:function(){switch(R){case"*":return W(),void(T="multiLineComment");case"/":return W(),void(T="singleLineComment")}throw ru(W())},multiLineComment:function(){switch(R){case"*":return W(),void(T="multiLineCommentAsterisk");case void 0:throw ru(W())}W()},multiLineCommentAsterisk:function(){switch(R){case"*":return void W();case"/":return W(),void(T="default");case void 0:throw ru(W())}W(),T="multiLineComment"},singleLineComment:function(){switch(R){case"\n":case"\r":case"\u2028":case"\u2029":return W(),void(T="default");case void 0:return W(),K("eof")}W()},value:function(){switch(R){case"{":case"[":return K("punctuator",W());case"n":return W(),Q("ull"),K("null",null);case"t":return W(),Q("rue"),K("boolean",!0);case"f":return W(),Q("alse"),K("boolean",!1);case"-":case"+":return"-"===W()&&($=-1),void(T="sign");case".":return z=W(),void(T="decimalPointLeading");case"0":return z=W(),void(T="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return z=W(),void(T="decimalInteger");case"I":return W(),Q("nfinity"),K("numeric",1/0);case"N":return W(),Q("aN"),K("numeric",NaN);case'"':case"'":return H='"'===W(),z="",void(T="string")}throw ru(W())},identifierNameStartEscape:function(){if("u"!==R)throw ru(W());W();var u=Y();switch(u){case"$":case"_":break;default:if(!U.isIdStartChar(u))throw nu()}z+=u,T="identifierName"},identifierName:function(){switch(R){case"$":case"_":case"‌":case"‍":return void(z+=W());case"\\":return W(),void(T="identifierNameEscape")}if(!U.isIdContinueChar(R))return K("identifier",z);z+=W()},identifierNameEscape:function(){if("u"!==R)throw ru(W());W();var u=Y();switch(u){case"$":case"_":case"‌":case"‍":break;default:if(!U.isIdContinueChar(u))throw nu()}z+=u,T="identifierName"},sign:function(){switch(R){case".":return z=W(),void(T="decimalPointLeading");case"0":return z=W(),void(T="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return z=W(),void(T="decimalInteger");case"I":return W(),Q("nfinity"),K("numeric",$*(1/0));case"N":return W(),Q("aN"),K("numeric",NaN)}throw ru(W())},zero:function(){switch(R){case".":return z+=W(),void(T="decimalPoint");case"e":case"E":return z+=W(),void(T="decimalExponent");case"x":case"X":return z+=W(),void(T="hexadecimal")}return K("numeric",0*$)},decimalInteger:function(){switch(R){case".":return z+=W(),void(T="decimalPoint");case"e":case"E":return z+=W(),void(T="decimalExponent")}if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},decimalPointLeading:function(){if(U.isDigit(R))return z+=W(),void(T="decimalFraction");throw ru(W())},decimalPoint:function(){switch(R){case"e":case"E":return z+=W(),void(T="decimalExponent")}return U.isDigit(R)?(z+=W(),void(T="decimalFraction")):K("numeric",$*Number(z))},decimalFraction:function(){switch(R){case"e":case"E":return z+=W(),void(T="decimalExponent")}if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},decimalExponent:function(){switch(R){case"+":case"-":return z+=W(),void(T="decimalExponentSign")}if(U.isDigit(R))return z+=W(),void(T="decimalExponentInteger");throw ru(W())},decimalExponentSign:function(){if(U.isDigit(R))return z+=W(),void(T="decimalExponentInteger");throw ru(W())},decimalExponentInteger:function(){if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},hexadecimal:function(){if(U.isHexDigit(R))return z+=W(),void(T="hexadecimalInteger");throw ru(W())},hexadecimalInteger:function(){if(!U.isHexDigit(R))return K("numeric",$*Number(z));z+=W()},string:function(){switch(R){case"\\":return W(),void(z+=function(){switch(q()){case"b":return W(),"\b";case"f":return W(),"\f";case"n":return W(),"\n";case"r":return W(),"\r";case"t":return W(),"\t";case"v":return W(),"\v";case"0":if(W(),U.isDigit(q()))throw ru(W());return"\0";case"x":return W(),function(){var u="",D=q();if(!U.isHexDigit(D))throw ru(W());if(u+=W(),D=q(),!U.isHexDigit(D))throw ru(W());return u+=W(),String.fromCodePoint(parseInt(u,16))}();case"u":return W(),Y();case"\n":case"\u2028":case"\u2029":return W(),"";case"\r":return W(),"\n"===q()&&W(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw ru(W())}return W()}());case'"':return H?(W(),K("string",z)):void(z+=W());case"'":return H?void(z+=W()):(W(),K("string",z));case"\n":case"\r":throw ru(W());case"\u2028":case"\u2029":!function(u){console.warn("JSON5: '"+Fu(u)+"' in strings is not valid ECMAScript; consider escaping")}(R);break;case void 0:throw ru(W())}z+=W()},start:function(){switch(R){case"{":case"[":return K("punctuator",W())}T="value"},beforePropertyName:function(){switch(R){case"$":case"_":return z=W(),void(T="identifierName");case"\\":return W(),void(T="identifierNameStartEscape");case"}":return K("punctuator",W());case'"':case"'":return H='"'===W(),void(T="string")}if(U.isIdStartChar(R))return z+=W(),void(T="identifierName");throw ru(W())},afterPropertyName:function(){if(":"===R)return K("punctuator",W());throw ru(W())},beforePropertyValue:function(){T="value"},afterPropertyValue:function(){switch(R){case",":case"}":return K("punctuator",W())}throw ru(W())},beforeArrayValue:function(){if("]"===R)return K("punctuator",W());T="value"},afterArrayValue:function(){switch(R){case",":case"]":return K("punctuator",W())}throw ru(W())},end:function(){throw ru(W())}};function K(u,D){return{type:u,value:D,line:V,column:J}}function Q(u){for(var D=0,e=u;D0;){var e=q();if(!U.isHexDigit(e))throw ru(W());u+=W()}return String.fromCodePoint(parseInt(u,16))}var uu={start:function(){if("eof"===M.type)throw tu();Du()},beforePropertyName:function(){switch(M.type){case"identifier":case"string":return k=M.value,void(O="afterPropertyName");case"punctuator":return void eu();case"eof":throw tu()}},afterPropertyName:function(){if("eof"===M.type)throw tu();O="beforePropertyValue"},beforePropertyValue:function(){if("eof"===M.type)throw tu();Du()},beforeArrayValue:function(){if("eof"===M.type)throw tu();"punctuator"!==M.type||"]"!==M.value?Du():eu()},afterPropertyValue:function(){if("eof"===M.type)throw tu();switch(M.value){case",":return void(O="beforePropertyName");case"}":eu()}},afterArrayValue:function(){if("eof"===M.type)throw tu();switch(M.value){case",":return void(O="beforeArrayValue");case"]":eu()}},end:function(){}};function Du(){var u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}if(void 0===L)L=u;else{var D=j[j.length-1];Array.isArray(D)?D.push(u):Object.defineProperty(D,k,{value:u,writable:!0,enumerable:!0,configurable:!0})}if(null!==u&&"object"==typeof u)j.push(u),O=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{var e=j[j.length-1];O=null==e?"end":Array.isArray(e)?"afterArrayValue":"afterPropertyValue"}}function eu(){j.pop();var u=j[j.length-1];O=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function ru(u){return Cu(void 0===u?"JSON5: invalid end of input at "+V+":"+J:"JSON5: invalid character '"+Fu(u)+"' at "+V+":"+J)}function tu(){return Cu("JSON5: invalid end of input at "+V+":"+J)}function nu(){return Cu("JSON5: invalid identifier character at "+V+":"+(J-=5))}function Fu(u){var D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){var e=u.charCodeAt(0).toString(16);return"\\x"+("00"+e).substring(e.length)}return u}function Cu(u){var D=new SyntaxError(u);return D.lineNumber=V,D.columnNumber=J,D}return{parse:function(u,D){_=String(u),O="start",j=[],I=0,V=1,J=0,M=void 0,k=void 0,L=void 0;do{M=Z(),uu[O]()}while("eof"!==M.type);return"function"==typeof D?function u(D,e,r){var t=D[e];if(null!=t&&"object"==typeof t)if(Array.isArray(t))for(var n=0;n0&&(e=Math.min(10,Math.floor(e)),A=" ".substr(0,e)):"string"==typeof e&&(A=e.substr(0,10)),c("",{"":u});function c(u,D){var e=D[u];switch(null!=e&&("function"==typeof e.toJSON5?e=e.toJSON5(u):"function"==typeof e.toJSON&&(e=e.toJSON(u))),t&&(e=t.call(D,u,e)),e instanceof Number?e=Number(e):e instanceof String?e=String(e):e instanceof Boolean&&(e=e.valueOf()),e){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof e?B(e):"number"==typeof e?String(e):"object"==typeof e?Array.isArray(e)?function(u){if(F.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");F.push(u);var D=C;C+=A;for(var e,r=[],t=0;t=0)throw TypeError("Converting circular structure to JSON5");F.push(u);var D=C;C+=A;for(var e,t,n=r||Object.keys(u),i=[],E=0,o=n;E"string"==typeof u&&unicode.Space_Separator.test(u),isIdStartChar:u=>"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||unicode.ID_Start.test(u)),isIdContinueChar:u=>"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"‌"===u||"‍"===u||unicode.ID_Continue.test(u)),isDigit:u=>"string"==typeof u&&/[0-9]/.test(u),isHexDigit:u=>"string"==typeof u&&/[0-9A-Fa-f]/.test(u)};let source,parseState,stack,pos,line,column,token,key,root;var parse=function(u,D){source=String(u),parseState="start",stack=[],pos=0,line=1,column=0,token=void 0,key=void 0,root=void 0;do{token=lex(),parseStates[parseState]()}while("eof"!==token.type);return"function"==typeof D?internalize({"":root},"",D):root};function internalize(u,D,e){const r=u[D];if(null!=r&&"object"==typeof r)for(const u in r){const D=internalize(r,u,e);void 0===D?delete r[u]:r[u]=D}return e.call(u,D,r)}let lexState,buffer,doubleQuote,sign,c;function lex(){for(lexState="default",buffer="",doubleQuote=!1,sign=1;;){c=peek();const u=lexStates[lexState]();if(u)return u}}function peek(){if(source[pos])return String.fromCodePoint(source.codePointAt(pos))}function read(){const u=peek();return"\n"===u?(line++,column=0):u?column+=u.length:column++,u&&(pos+=u.length),u}const lexStates={default(){switch(c){case"\t":case"\v":case"\f":case" ":case" ":case"\ufeff":case"\n":case"\r":case"\u2028":case"\u2029":return void read();case"/":return read(),void(lexState="comment");case void 0:return read(),newToken("eof")}if(!util.isSpaceSeparator(c))return lexStates[parseState]();read()},comment(){switch(c){case"*":return read(),void(lexState="multiLineComment");case"/":return read(),void(lexState="singleLineComment")}throw invalidChar(read())},multiLineComment(){switch(c){case"*":return read(),void(lexState="multiLineCommentAsterisk");case void 0:throw invalidChar(read())}read()},multiLineCommentAsterisk(){switch(c){case"*":return void read();case"/":return read(),void(lexState="default");case void 0:throw invalidChar(read())}read(),lexState="multiLineComment"},singleLineComment(){switch(c){case"\n":case"\r":case"\u2028":case"\u2029":return read(),void(lexState="default");case void 0:return read(),newToken("eof")}read()},value(){switch(c){case"{":case"[":return newToken("punctuator",read());case"n":return read(),literal("ull"),newToken("null",null);case"t":return read(),literal("rue"),newToken("boolean",!0);case"f":return read(),literal("alse"),newToken("boolean",!1);case"-":case"+":return"-"===read()&&(sign=-1),void(lexState="sign");case".":return buffer=read(),void(lexState="decimalPointLeading");case"0":return buffer=read(),void(lexState="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return buffer=read(),void(lexState="decimalInteger");case"I":return read(),literal("nfinity"),newToken("numeric",1/0);case"N":return read(),literal("aN"),newToken("numeric",NaN);case'"':case"'":return doubleQuote='"'===read(),buffer="",void(lexState="string")}throw invalidChar(read())},identifierNameStartEscape(){if("u"!==c)throw invalidChar(read());read();const u=unicodeEscape();switch(u){case"$":case"_":break;default:if(!util.isIdStartChar(u))throw invalidIdentifier()}buffer+=u,lexState="identifierName"},identifierName(){switch(c){case"$":case"_":case"‌":case"‍":return void(buffer+=read());case"\\":return read(),void(lexState="identifierNameEscape")}if(!util.isIdContinueChar(c))return newToken("identifier",buffer);buffer+=read()},identifierNameEscape(){if("u"!==c)throw invalidChar(read());read();const u=unicodeEscape();switch(u){case"$":case"_":case"‌":case"‍":break;default:if(!util.isIdContinueChar(u))throw invalidIdentifier()}buffer+=u,lexState="identifierName"},sign(){switch(c){case".":return buffer=read(),void(lexState="decimalPointLeading");case"0":return buffer=read(),void(lexState="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return buffer=read(),void(lexState="decimalInteger");case"I":return read(),literal("nfinity"),newToken("numeric",sign*(1/0));case"N":return read(),literal("aN"),newToken("numeric",NaN)}throw invalidChar(read())},zero(){switch(c){case".":return buffer+=read(),void(lexState="decimalPoint");case"e":case"E":return buffer+=read(),void(lexState="decimalExponent");case"x":case"X":return buffer+=read(),void(lexState="hexadecimal")}return newToken("numeric",0*sign)},decimalInteger(){switch(c){case".":return buffer+=read(),void(lexState="decimalPoint");case"e":case"E":return buffer+=read(),void(lexState="decimalExponent")}if(!util.isDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},decimalPointLeading(){if(util.isDigit(c))return buffer+=read(),void(lexState="decimalFraction");throw invalidChar(read())},decimalPoint(){switch(c){case"e":case"E":return buffer+=read(),void(lexState="decimalExponent")}return util.isDigit(c)?(buffer+=read(),void(lexState="decimalFraction")):newToken("numeric",sign*Number(buffer))},decimalFraction(){switch(c){case"e":case"E":return buffer+=read(),void(lexState="decimalExponent")}if(!util.isDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},decimalExponent(){switch(c){case"+":case"-":return buffer+=read(),void(lexState="decimalExponentSign")}if(util.isDigit(c))return buffer+=read(),void(lexState="decimalExponentInteger");throw invalidChar(read())},decimalExponentSign(){if(util.isDigit(c))return buffer+=read(),void(lexState="decimalExponentInteger");throw invalidChar(read())},decimalExponentInteger(){if(!util.isDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},hexadecimal(){if(util.isHexDigit(c))return buffer+=read(),void(lexState="hexadecimalInteger");throw invalidChar(read())},hexadecimalInteger(){if(!util.isHexDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},string(){switch(c){case"\\":return read(),void(buffer+=escape());case'"':return doubleQuote?(read(),newToken("string",buffer)):void(buffer+=read());case"'":return doubleQuote?void(buffer+=read()):(read(),newToken("string",buffer));case"\n":case"\r":throw invalidChar(read());case"\u2028":case"\u2029":separatorChar(c);break;case void 0:throw invalidChar(read())}buffer+=read()},start(){switch(c){case"{":case"[":return newToken("punctuator",read())}lexState="value"},beforePropertyName(){switch(c){case"$":case"_":return buffer=read(),void(lexState="identifierName");case"\\":return read(),void(lexState="identifierNameStartEscape");case"}":return newToken("punctuator",read());case'"':case"'":return doubleQuote='"'===read(),void(lexState="string")}if(util.isIdStartChar(c))return buffer+=read(),void(lexState="identifierName");throw invalidChar(read())},afterPropertyName(){if(":"===c)return newToken("punctuator",read());throw invalidChar(read())},beforePropertyValue(){lexState="value"},afterPropertyValue(){switch(c){case",":case"}":return newToken("punctuator",read())}throw invalidChar(read())},beforeArrayValue(){if("]"===c)return newToken("punctuator",read());lexState="value"},afterArrayValue(){switch(c){case",":case"]":return newToken("punctuator",read())}throw invalidChar(read())},end(){throw invalidChar(read())}};function newToken(u,D){return{type:u,value:D,line:line,column:column}}function literal(u){for(const D of u){if(peek()!==D)throw invalidChar(read());read()}}function escape(){switch(peek()){case"b":return read(),"\b";case"f":return read(),"\f";case"n":return read(),"\n";case"r":return read(),"\r";case"t":return read(),"\t";case"v":return read(),"\v";case"0":if(read(),util.isDigit(peek()))throw invalidChar(read());return"\0";case"x":return read(),hexEscape();case"u":return read(),unicodeEscape();case"\n":case"\u2028":case"\u2029":return read(),"";case"\r":return read(),"\n"===peek()&&read(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw invalidChar(read())}return read()}function hexEscape(){let u="",D=peek();if(!util.isHexDigit(D))throw invalidChar(read());if(u+=read(),D=peek(),!util.isHexDigit(D))throw invalidChar(read());return u+=read(),String.fromCodePoint(parseInt(u,16))}function unicodeEscape(){let u="",D=4;for(;D-- >0;){const D=peek();if(!util.isHexDigit(D))throw invalidChar(read());u+=read()}return String.fromCodePoint(parseInt(u,16))}const parseStates={start(){if("eof"===token.type)throw invalidEOF();push()},beforePropertyName(){switch(token.type){case"identifier":case"string":return key=token.value,void(parseState="afterPropertyName");case"punctuator":return void pop();case"eof":throw invalidEOF()}},afterPropertyName(){if("eof"===token.type)throw invalidEOF();parseState="beforePropertyValue"},beforePropertyValue(){if("eof"===token.type)throw invalidEOF();push()},beforeArrayValue(){if("eof"===token.type)throw invalidEOF();"punctuator"!==token.type||"]"!==token.value?push():pop()},afterPropertyValue(){if("eof"===token.type)throw invalidEOF();switch(token.value){case",":return void(parseState="beforePropertyName");case"}":pop()}},afterArrayValue(){if("eof"===token.type)throw invalidEOF();switch(token.value){case",":return void(parseState="beforeArrayValue");case"]":pop()}},end(){}};function push(){let u;switch(token.type){case"punctuator":switch(token.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=token.value}if(void 0===root)root=u;else{const D=stack[stack.length-1];Array.isArray(D)?D.push(u):D[key]=u}if(null!==u&&"object"==typeof u)stack.push(u),parseState=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=stack[stack.length-1];parseState=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}}function pop(){stack.pop();const u=stack[stack.length-1];parseState=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function invalidChar(u){return syntaxError(void 0===u?`JSON5: invalid end of input at ${line}:${column}`:`JSON5: invalid character '${formatChar(u)}' at ${line}:${column}`)}function invalidEOF(){return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)}function invalidIdentifier(){return syntaxError(`JSON5: invalid identifier character at ${line}:${column-=5}`)}function separatorChar(u){console.warn(`JSON5: '${formatChar(u)}' in strings is not valid ECMAScript; consider escaping`)}function formatChar(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return"\\x"+("00"+D).substring(D.length)}return u}function syntaxError(u){const D=new SyntaxError(u);return D.lineNumber=line,D.columnNumber=column,D}var stringify=function(u,D,e){const r=[];let t,F,C,a="",A="";if(null==D||"object"!=typeof D||Array.isArray(D)||(e=D.space,C=D.quote,D=D.replacer),"function"==typeof D)F=D;else if(Array.isArray(D)){t=[];for(const u of D){let D;"string"==typeof u?D=u:("number"==typeof u||u instanceof String||u instanceof Number)&&(D=String(u)),void 0!==D&&t.indexOf(D)<0&&t.push(D)}}return e instanceof Number?e=Number(e):e instanceof String&&(e=String(e)),"number"==typeof e?e>0&&(e=Math.min(10,Math.floor(e)),A=" ".substr(0,e)):"string"==typeof e&&(A=e.substr(0,10)),E("",{"":u});function E(u,D){let e=D[u];switch(null!=e&&("function"==typeof e.toJSON5?e=e.toJSON5(u):"function"==typeof e.toJSON&&(e=e.toJSON(u))),F&&(e=F.call(D,u,e)),e instanceof Number?e=Number(e):e instanceof String?e=String(e):e instanceof Boolean&&(e=e.valueOf()),e){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof e?n(e):"number"==typeof e?String(e):"object"==typeof e?Array.isArray(e)?function(u){if(r.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");r.push(u);let D=a;a+=A;let e,t=[];for(let D=0;D=0)throw TypeError("Converting circular structure to JSON5");r.push(u);let D=a;a+=A;let e,F=t||Object.keys(u),C=[];for(const D of F){const e=E(D,u);if(void 0!==e){let u=i(D)+":";""!==A&&(u+=" "),u+=e,C.push(u)}}if(0===C.length)e="{}";else{let u;if(""===A)u=C.join(","),e="{"+u+"}";else{let r=",\n"+a;u=C.join(r),e="{\n"+a+u+",\n"+D+"}"}}return r.pop(),a=D,e}(e):void 0}function n(u){const D={"'":.1,'"':.2},e={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};let r="";for(let t=0;tD[u]"string"==typeof u&&unicode.Space_Separator.test(u),isIdStartChar:u=>"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||unicode.ID_Start.test(u)),isIdContinueChar:u=>"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"‌"===u||"‍"===u||unicode.ID_Continue.test(u)),isDigit:u=>"string"==typeof u&&/[0-9]/.test(u),isHexDigit:u=>"string"==typeof u&&/[0-9A-Fa-f]/.test(u)};let source,parseState,stack,pos,line,column,token,key,root;var parse=function(u,D){source=String(u),parseState="start",stack=[],pos=0,line=1,column=0,token=void 0,key=void 0,root=void 0;do{token=lex(),parseStates[parseState]()}while("eof"!==token.type);return"function"==typeof D?internalize({"":root},"",D):root};function internalize(u,D,e){const r=u[D];if(null!=r&&"object"==typeof r)if(Array.isArray(r))for(let u=0;u0;){const D=peek();if(!util.isHexDigit(D))throw invalidChar(read());u+=read()}return String.fromCodePoint(parseInt(u,16))}const parseStates={start(){if("eof"===token.type)throw invalidEOF();push()},beforePropertyName(){switch(token.type){case"identifier":case"string":return key=token.value,void(parseState="afterPropertyName");case"punctuator":return void pop();case"eof":throw invalidEOF()}},afterPropertyName(){if("eof"===token.type)throw invalidEOF();parseState="beforePropertyValue"},beforePropertyValue(){if("eof"===token.type)throw invalidEOF();push()},beforeArrayValue(){if("eof"===token.type)throw invalidEOF();"punctuator"!==token.type||"]"!==token.value?push():pop()},afterPropertyValue(){if("eof"===token.type)throw invalidEOF();switch(token.value){case",":return void(parseState="beforePropertyName");case"}":pop()}},afterArrayValue(){if("eof"===token.type)throw invalidEOF();switch(token.value){case",":return void(parseState="beforeArrayValue");case"]":pop()}},end(){}};function push(){let u;switch(token.type){case"punctuator":switch(token.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=token.value}if(void 0===root)root=u;else{const D=stack[stack.length-1];Array.isArray(D)?D.push(u):Object.defineProperty(D,key,{value:u,writable:!0,enumerable:!0,configurable:!0})}if(null!==u&&"object"==typeof u)stack.push(u),parseState=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=stack[stack.length-1];parseState=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}}function pop(){stack.pop();const u=stack[stack.length-1];parseState=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function invalidChar(u){return syntaxError(void 0===u?`JSON5: invalid end of input at ${line}:${column}`:`JSON5: invalid character '${formatChar(u)}' at ${line}:${column}`)}function invalidEOF(){return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)}function invalidIdentifier(){return syntaxError(`JSON5: invalid identifier character at ${line}:${column-=5}`)}function separatorChar(u){console.warn(`JSON5: '${formatChar(u)}' in strings is not valid ECMAScript; consider escaping`)}function formatChar(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return"\\x"+("00"+D).substring(D.length)}return u}function syntaxError(u){const D=new SyntaxError(u);return D.lineNumber=line,D.columnNumber=column,D}var stringify=function(u,D,e){const r=[];let t,F,C,a="",A="";if(null==D||"object"!=typeof D||Array.isArray(D)||(e=D.space,C=D.quote,D=D.replacer),"function"==typeof D)F=D;else if(Array.isArray(D)){t=[];for(const u of D){let D;"string"==typeof u?D=u:("number"==typeof u||u instanceof String||u instanceof Number)&&(D=String(u)),void 0!==D&&t.indexOf(D)<0&&t.push(D)}}return e instanceof Number?e=Number(e):e instanceof String&&(e=String(e)),"number"==typeof e?e>0&&(e=Math.min(10,Math.floor(e)),A=" ".substr(0,e)):"string"==typeof e&&(A=e.substr(0,10)),n("",{"":u});function n(u,D){let e=D[u];switch(null!=e&&("function"==typeof e.toJSON5?e=e.toJSON5(u):"function"==typeof e.toJSON&&(e=e.toJSON(u))),F&&(e=F.call(D,u,e)),e instanceof Number?e=Number(e):e instanceof String?e=String(e):e instanceof Boolean&&(e=e.valueOf()),e){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof e?E(e):"number"==typeof e?String(e):"object"==typeof e?Array.isArray(e)?function(u){if(r.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");r.push(u);let D=a;a+=A;let e,t=[];for(let D=0;D=0)throw TypeError("Converting circular structure to JSON5");r.push(u);let D=a;a+=A;let e,F=t||Object.keys(u),C=[];for(const D of F){const e=n(D,u);if(void 0!==e){let u=i(D)+":";""!==A&&(u+=" "),u+=e,C.push(u)}}if(0===C.length)e="{}";else{let u;if(""===A)u=C.join(","),e="{"+u+"}";else{let r=",\n"+a;u=C.join(r),e="{\n"+a+u+",\n"+D+"}"}}return r.pop(),a=D,e}(e):void 0}function E(u){const D={"'":.1,'"':.2},e={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};let r="";for(let t=0;tD[u] mime scripts/jquery.js - application/javascript - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - -```js -var mime = require('mime'); - -mime.lookup('/path/to/file.txt'); // => 'text/plain' -mime.lookup('file.txt'); // => 'text/plain' -mime.lookup('.TXT'); // => 'text/plain' -mime.lookup('htm'); // => 'text/html' -``` - -### mime.default_type -Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) - -### mime.extension(type) -Get the default extension for `type` - -```js -mime.extension('text/html'); // => 'html' -mime.extension('application/octet-stream'); // => 'bin' -``` - -### mime.charsets.lookup() - -Map mime-type to charset - -```js -mime.charsets.lookup('text/plain'); // => 'UTF-8' -``` - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -Custom type mappings can be added on a per-project basis via the following APIs. - -### mime.define() - -Add custom mime/extension mappings - -```js -mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... -}); - -mime.lookup('x-sft'); // => 'text/x-some-format' -``` - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - -```js -mime.extension('text/x-some-format'); // => 'x-sf' -``` - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - -```js -mime.load('./my_project.types'); -``` -The .types file format is simple - See the `types` dir for examples. diff --git a/node_modules/mime/cli.js b/node_modules/mime/cli.js deleted file mode 100755 index 20b1ffeb2f97..000000000000 --- a/node_modules/mime/cli.js +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env node - -var mime = require('./mime.js'); -var file = process.argv[2]; -var type = mime.lookup(file); - -process.stdout.write(type + '\n'); - diff --git a/node_modules/mime/mime.js b/node_modules/mime/mime.js deleted file mode 100644 index d7efbde70b8e..000000000000 --- a/node_modules/mime/mime.js +++ /dev/null @@ -1,108 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts[i]]) { - console.warn((this._loading || "define()").replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts[i]] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/^.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Define built-in types -mime.define(require('./types.json')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\/|^application\/(javascript|json)/).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; diff --git a/node_modules/mime/package.json b/node_modules/mime/package.json deleted file mode 100644 index 6bd24bc53c1a..000000000000 --- a/node_modules/mime/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "url": "http://github.com/broofa", - "email": "robert@broofa.com" - }, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "url": "http://github.com/bentomas", - "email": "benjamin@benjaminthomas.org" - } - ], - "description": "A comprehensive library for mime-type mapping", - "license": "MIT", - "dependencies": {}, - "devDependencies": { - "github-release-notes": "0.13.1", - "mime-db": "1.31.0", - "mime-score": "1.1.0" - }, - "scripts": { - "prepare": "node src/build.js", - "changelog": "gren changelog --tags=all --generate --override", - "test": "node src/test.js" - }, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.6.0" -} diff --git a/node_modules/mime/src/build.js b/node_modules/mime/src/build.js deleted file mode 100755 index 4928e48bcd5d..000000000000 --- a/node_modules/mime/src/build.js +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env node - -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const mimeScore = require('mime-score'); - -let db = require('mime-db'); -let chalk = require('chalk'); - -const STANDARD_FACET_SCORE = 900; - -const byExtension = {}; - -// Clear out any conflict extensions in mime-db -for (let type in db) { - let entry = db[type]; - entry.type = type; - - if (!entry.extensions) continue; - - entry.extensions.forEach(ext => { - if (ext in byExtension) { - const e0 = entry; - const e1 = byExtension[ext]; - e0.pri = mimeScore(e0.type, e0.source); - e1.pri = mimeScore(e1.type, e1.source); - - let drop = e0.pri < e1.pri ? e0 : e1; - let keep = e0.pri >= e1.pri ? e0 : e1; - drop.extensions = drop.extensions.filter(e => e !== ext); - - console.log(`${ext}: Keeping ${chalk.green(keep.type)} (${keep.pri}), dropping ${chalk.red(drop.type)} (${drop.pri})`); - } - byExtension[ext] = entry; - }); -} - -function writeTypesFile(types, path) { - fs.writeFileSync(path, JSON.stringify(types)); -} - -// Segregate into standard and non-standard types based on facet per -// https://tools.ietf.org/html/rfc6838#section-3.1 -const types = {}; - -Object.keys(db).sort().forEach(k => { - const entry = db[k]; - types[entry.type] = entry.extensions; -}); - -writeTypesFile(types, path.join(__dirname, '..', 'types.json')); diff --git a/node_modules/mime/src/test.js b/node_modules/mime/src/test.js deleted file mode 100644 index 42958a20d5bd..000000000000 --- a/node_modules/mime/src/test.js +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('../mime'); -var assert = require('assert'); -var path = require('path'); - -// -// Test mime lookups -// - -assert.equal('text/plain', mime.lookup('text.txt')); // normal file -assert.equal('text/plain', mime.lookup('TEXT.TXT')); // uppercase -assert.equal('text/plain', mime.lookup('dir/text.txt')); // dir + file -assert.equal('text/plain', mime.lookup('.text.txt')); // hidden file -assert.equal('text/plain', mime.lookup('.txt')); // nameless -assert.equal('text/plain', mime.lookup('txt')); // extension-only -assert.equal('text/plain', mime.lookup('/txt')); // extension-less () -assert.equal('text/plain', mime.lookup('\\txt')); // Windows, extension-less -assert.equal('application/octet-stream', mime.lookup('text.nope')); // unrecognized -assert.equal('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default - -// -// Test extensions -// - -assert.equal('txt', mime.extension(mime.types.text)); -assert.equal('html', mime.extension(mime.types.htm)); -assert.equal('bin', mime.extension('application/octet-stream')); -assert.equal('bin', mime.extension('application/octet-stream ')); -assert.equal('html', mime.extension(' text/html; charset=UTF-8')); -assert.equal('html', mime.extension('text/html; charset=UTF-8 ')); -assert.equal('html', mime.extension('text/html; charset=UTF-8')); -assert.equal('html', mime.extension('text/html ; charset=UTF-8')); -assert.equal('html', mime.extension('text/html;charset=UTF-8')); -assert.equal('html', mime.extension('text/Html;charset=UTF-8')); -assert.equal(undefined, mime.extension('unrecognized')); - -// -// Test node.types lookups -// - -assert.equal('font/woff', mime.lookup('file.woff')); -assert.equal('application/octet-stream', mime.lookup('file.buffer')); -// TODO: Uncomment once #157 is resolved -// assert.equal('audio/mp4', mime.lookup('file.m4a')); -assert.equal('font/otf', mime.lookup('file.otf')); - -// -// Test charsets -// - -assert.equal('UTF-8', mime.charsets.lookup('text/plain')); -assert.equal('UTF-8', mime.charsets.lookup(mime.types.js)); -assert.equal('UTF-8', mime.charsets.lookup(mime.types.json)); -assert.equal(undefined, mime.charsets.lookup(mime.types.bin)); -assert.equal('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -console.log('\nAll tests passed'); diff --git a/node_modules/mime/types.json b/node_modules/mime/types.json deleted file mode 100644 index bec78abd491e..000000000000 --- a/node_modules/mime/types.json +++ /dev/null @@ -1 +0,0 @@ -{"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomsvc+xml":["atomsvc"],"application/bdoc":["bdoc"],"application/ccxml+xml":["ccxml"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/font-tdpfr":["pfr"],"application/font-woff":[],"application/font-woff2":[],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/prs.cww":["cww"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":[],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":[],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":[],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":[],"application/x-msdownload":["com","bat"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["wmf","emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":[],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"application/xaml+xml":["xaml"],"application/xcap-diff+xml":["xdf"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":[],"audio/adpcm":["adp"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mp3":[],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/wav":["wav"],"audio/wave":[],"audio/webm":["weba"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":[],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":[],"audio/x-wav":[],"audio/xm":["xm"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/apng":["apng"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/g3fax":["g3"],"image/gif":["gif"],"image/ief":["ief"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/ktx":["ktx"],"image/png":["png"],"image/prs.btif":["btif"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/tiff":["tiff","tif"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":[],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/webp":["webp"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":[],"image/x-pcx":["pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/rfc822":["eml","mime"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.vtu":["vtu"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["x3db","x3dbz"],"model/x3d+vrml":["x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/hjson":["hjson"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/prs.lines.tag":["dsc"],"text/richtext":["rtx"],"text/rtf":[],"text/sgml":["sgml","sgm"],"text/slim":["slim","slm"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/vtt":["vtt"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":[],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"text/xml":[],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/jpeg":["jpgv"],"video/jpm":["jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/webm":["webm"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]} \ No newline at end of file diff --git a/node_modules/needle/.github/workflows/nodejs.yml b/node_modules/needle/.github/workflows/nodejs.yml deleted file mode 100644 index e6f3b75ca05b..000000000000 --- a/node_modules/needle/.github/workflows/nodejs.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Node CI -on: [push] - -jobs: - build: - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [0.10.0, 4.x, 6.x, 8.x, 10.x, 12.x] - - steps: - - uses: actions/checkout@v1 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - name: npm install, build, and test - run: | - npm install - mkdir -p test/keys - openssl genrsa -out test/keys/ssl.key 2048 - openssl req -new -key test/keys/ssl.key -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -x509 -days 999 -out test/keys/ssl.cert - npm run build --if-present - npm test - env: - CI: true diff --git a/node_modules/needle/README.md b/node_modules/needle/README.md deleted file mode 100644 index 3937ce7d75c1..000000000000 --- a/node_modules/needle/README.md +++ /dev/null @@ -1,612 +0,0 @@ -Needle -====== - -[![NPM](https://nodei.co/npm/needle.png)](https://nodei.co/npm/needle/) - -The leanest and most handsome HTTP client in the Nodelands. - -```js -var needle = require('needle'); - -needle.get('http://www.google.com', function(error, response) { - if (!error && response.statusCode == 200) - console.log(response.body); -}); -``` - -Callbacks not floating your boat? Needle got your back. - -``` js -var data = { - file: '/home/johnlennon/walrus.png', - content_type: 'image/png' -}; - -// the callback is optional, and needle returns a `readableStream` object -// that triggers a 'done' event when the request/response process is complete. -needle - .post('https://my.server.com/foo', data, { multipart: true }) - .on('readable', function() { /* eat your chunks */ }) - .on('done', function(err, resp) { - console.log('Ready-o!'); - }) -``` - -From version 2.0.x up, Promises are also supported. Just call `needle()` directly and you'll get a native Promise object. - -```js -needle('put', 'https://hacking.the.gibson/login', { password: 'god' }, { json: true }) - .then(function(response) { - return doSomethingWith(response) - }) - .catch(function(err) { - console.log('Call the locksmith!') - }) -``` - -With only two real dependencies, Needle supports: - - - HTTP/HTTPS requests, with the usual verbs you would expect - - All of Node's native TLS options, such as 'rejectUnauthorized' (see below) - - Basic & Digest authentication with auto-detection - - Multipart form-data (e.g. file uploads) - - HTTP Proxy forwarding, optionally with authentication - - Streaming gzip, deflate, and brotli decompression - - Automatic XML & JSON parsing - - 301/302/303 redirect following, with fine-grained tuning, and - - Streaming non-UTF-8 charset decoding, via `iconv-lite` - -And yes, Mr. Wayne, it does come in black. - -This makes Needle an ideal alternative for performing quick HTTP requests in Node, either for API interaction, downloading or uploading streams of data, and so on. If you need OAuth, AWS support or anything fancier, you should check out mikeal's request module. - -Install -------- - -``` -$ npm install needle -``` - -Usage ------ - -```js -// using promises -needle('get', 'https://server.com/posts/12') - .then(function(resp) { - // ... - }) - .catch(function(err) { - // ... - }); - -// with callback -needle.get('ifconfig.me/all.json', function(error, response, body) { - if (error) throw error; - - // body is an alias for `response.body`, - // that in this case holds a JSON-decoded object. - console.log(body.ip_addr); -}); - -// no callback, using streams -var out = fs.createWriteStream('logo.png'); -needle.get('https://google.com/images/logo.png').pipe(out).on('done', function() { - console.log('Pipe finished!'); -}); -``` - -As you can see, you can use Needle with Promises or without them. When using Promises or when a callback is passed, the response's body will be buffered and written to `response.body`, and the callback will be fired when all of the data has been collected and processed (e.g. decompressed, decoded and/or parsed). - -When no callback is passed, however, the buffering logic will be skipped but the response stream will still go through Needle's processing pipeline, so you get all the benefits of post-processing while keeping the streamishness we all love from Node. - -Response pipeline ------------------ - -Depending on the response's Content-Type, Needle will either attempt to parse JSON or XML streams, or, if a text response was received, will ensure that the final encoding you get is UTF-8. - -You can also request a gzip/deflated/brotli response, which, if sent by the server, will be processed before parsing or decoding is performed. (Note: brotli is only supported on Node 10.16.0 or above, and will not be requested or processed on earlier versions.) - -```js -needle.get('http://stackoverflow.com/feeds', { compressed: true }, function(err, resp) { - console.log(resp.body); // this little guy won't be a Gzipped binary blob - // but a nice object containing all the latest entries -}); -``` - -Or in anti-callback mode, using a few other options: - -```js -var options = { - compressed : true, // sets 'Accept-Encoding' to 'gzip, deflate, br' - follow_max : 5, // follow up to five redirects - rejectUnauthorized : true // verify SSL certificate -} - -var stream = needle.get('https://backend.server.com/everything.html', options); - -// read the chunks from the 'readable' event, so the stream gets consumed. -stream.on('readable', function() { - while (data = this.read()) { - console.log(data.toString()); - } -}) - -stream.on('done', function(err) { - // if our request had an error, our 'done' event will tell us. - if (!err) console.log('Great success!'); -}) -``` - -API ---- - -### needle(method, url[, data][, options][, callback]) `(> 2.0.x)` - -Calling `needle()` directly returns a Promise. Besides `method` and `url`, all parameters are optional, although when sending a `post`, `put` or `patch` request you will get an error if `data` is not present. - -```js -needle('get', 'http://some.url.com') - .then(function(resp) { console.log(resp.body) }) - .catch(function(err) { console.error(err) }) -}) -``` - -Except from the above, all of Needle's request methods return a Readable stream, and both `options` and `callback` are optional. If passed, the callback will return three arguments: `error`, `response` and `body`, which is basically an alias for `response.body`. - -### needle.head(url[, options][, callback]) - -```js -needle.head('https://my.backend.server.com', { - open_timeout: 5000 // if we're not able to open a connection in 5 seconds, boom. -}, function(err, resp) { - if (err) - console.log('Shoot! Something is wrong: ' + err.message) - else - console.log('Yup, still alive.') -}) -``` - -### needle.get(url[, options][, callback]) - -```js -needle.get('google.com/search?q=syd+barrett', function(err, resp) { - // if no http:// is found, Needle will automagically prepend it. -}); -``` - -### needle.post(url, data[, options][, callback]) - -```js -var options = { - headers: { 'X-Custom-Header': 'Bumbaway atuna' } -} - -needle.post('https://my.app.com/endpoint', 'foo=bar', options, function(err, resp) { - // you can pass params as a string or as an object. -}); -``` - -### needle.put(url, data[, options][, callback]) - -```js -var nested = { - params: { - are: { - also: 'supported' - } - } -} - -needle.put('https://api.app.com/v2', nested, function(err, resp) { - console.log('Got ' + resp.bytes + ' bytes.') // another nice treat from this handsome fella. -}); -``` - -### needle.patch(url, data[, options][, callback]) - -Same behaviour as PUT. - -### needle.delete(url, data[, options][, callback]) - -```js -var options = { - username: 'fidelio', - password: 'x' -} - -needle.delete('https://api.app.com/messages/123', null, options, function(err, resp) { - // in this case, data may be null, but you need to explicity pass it. -}); -``` - -### needle.request(method, url, data[, options][, callback]) - -Generic request. This not only allows for flexibility, but also lets you perform a GET request with data, in which case will be appended to the request as a query string, unless you pass a `json: true` option (read below). - -```js -var params = { - q : 'a very smart query', - page : 2 -} - -needle.request('get', 'forum.com/search', params, function(err, resp) { - if (!err && resp.statusCode == 200) - console.log(resp.body); // here you go, mister. -}); -``` - -Now, if you set pass `json: true` among the options, Needle won't set your params as a querystring but instead send a JSON representation of your data through the request's body, as well as set the `Content-Type` and `Accept` headers to `application/json`. - -```js -needle.request('get', 'forum.com/search', params, { json: true }, function(err, resp) { - if (resp.statusCode == 200) console.log('It worked!'); -}); -``` - -Events ------- - -The [Readable stream](https://nodejs.org/api/stream.html#stream_class_stream_readable) object returned by the above request methods emits the following events, in addition to the regular ones (e.g. `end`, `close`, `data`, `pipe`, `readable`). - -### Event: `'response'` - - - `response ` - -Emitted when the underlying [http.ClientRequest](https://nodejs.org/api/http.html#http_class_http_clientrequest) emits a response event. This is after the connection is established and the header received, but before any of it is processed (e.g. authorization required or redirect to be followed). No data has been consumed at this point. - -### Event: `'redirect'` - - - `location ` - -Indicates that the a redirect is being followed. This means that the response code was a redirect (`301`, `302`, `303`, `307`) and the given [redirect options](#redirect-options) allowed following the URL received in the `Location` header. - -### Event: `'header'` - - - `statusCode ` - - `headers ` - -Triggered after the header has been processed, and just before the data is to be consumed. This implies that no redirect was followed and/or authentication header was received. In other words, we got a "valid" response. - -### Event: `'done'` (previously 'end') - - - `exception ` (optional) - -Emitted when the request/response process has finished, either because all data was consumed or an error ocurred somewhere in between. Unlike a regular stream's `end` event, Needle's `done` will be fired either on success or on failure, which is why the first argument may be an Error object. In other words: - -```js -var resp = needle.get('something.worthy/of/being/streamed/by/needle'); -resp.pipe(someWritableStream); - -resp.on('done', function(err) { - if (err) console.log('An error ocurred: ' + err.message); - else console.log('Great success!'); -}) -``` - -### Event: `'err'` - - - `exception ` - -Emitted when an error ocurrs. This should only happen once in the lifecycle of a Needle request. - -### Event: `'timeout'` - - - `type ` - -Emitted when an timeout error occurs. Type can be either 'open', 'response', or 'read'. This will called right before aborting the request, which will also trigger an `err` event, a described above, with an `ECONNRESET` (Socket hang up) exception. - -Request options ---------------- - -For information about options that've changed, there's always [the changelog](https://github.com/tomas/needle/releases). - - - `agent` : Uses an [http.Agent](https://nodejs.org/api/http.html#http_class_http_agent) of your choice, instead of the global, default one. Useful for tweaking the behaviour at the connection level, such as when doing tunneling (see below for an example). - - `json` : When `true`, sets content type to `application/json` and sends request body as JSON string, instead of a query string. - - `open_timeout`: (or `timeout`) Returns error if connection takes longer than X milisecs to establish. Defaults to `10000` (10 secs). `0` means no timeout. - - `response_timeout`: Returns error if no response headers are received in X milisecs, counting from when the connection is opened. Defaults to `0` (no response timeout). - - `read_timeout`: Returns error if data transfer takes longer than X milisecs, once response headers are received. Defaults to `0` (no timeout). - - `follow_max` : (or `follow`) Number of redirects to follow. Defaults to `0`. See below for more redirect options. - - `multipart` : Enables multipart/form-data encoding. Defaults to `false`. Use it when uploading files. - - `proxy` : Forwards request through HTTP(s) proxy. Eg. `proxy: 'http://user:pass@proxy.server.com:3128'`. For more advanced proxying/tunneling use a custom `agent`, as described below. - - `headers` : Object containing custom HTTP headers for request. Overrides defaults described below. - - `auth` : Determines what to do with provided username/password. Options are `auto`, `digest` or `basic` (default). `auto` will detect the type of authentication depending on the response headers. - - `stream_length`: When sending streams, this lets you manually set the Content-Length header --if the stream's bytecount is known beforehand--, preventing ECONNRESET (socket hang up) errors on some servers that misbehave when receiving payloads of unknown size. Set it to `0` and Needle will get and set the stream's length for you, or leave unset for the default behaviour, which is no Content-Length header for stream payloads. - - `localAddress`: , IP address. Passed to http/https request. Local interface from which the request should be emitted. - - `uri_modifier`: Anonymous function taking request (or redirect location if following redirects) URI as an argument and modifying it given logic. It has to return a valid URI string for successful request. - -Response options ----------------- - - - `decode_response` : (or `decode`) Whether to decode the text responses to UTF-8, if Content-Type header shows a different charset. Defaults to `true`. - - `parse_response` : (or `parse`) Whether to parse XML or JSON response bodies automagically. Defaults to `true`. You can also set this to 'xml' or 'json' in which case Needle will *only* parse the response if the content type matches. - - `output` : Dump response output to file. This occurs after parsing and charset decoding is done. - - `parse_cookies` : Whether to parse response’s `Set-Cookie` header. Defaults to `true`. If parsed, response cookies will be available at `resp.cookies`. - -HTTP Header options -------------------- - -These are basically shortcuts to the `headers` option described above. - - - `cookies` : Builds and sets a Cookie header from a `{ key: 'value' }` object. - - `compressed`: If `true`, sets 'Accept-Encoding' header to 'gzip,deflate', and inflates content if zipped. Defaults to `false`. - - `username` : For HTTP basic auth. - - `password` : For HTTP basic auth. Requires username to be passed, but is optional. - - `accept` : Sets 'Accept' HTTP header. Defaults to `*/*`. - - `connection`: Sets 'Connection' HTTP header. Not set by default, unless running Node < 0.11.4 in which case it defaults to `close`. More info about this below. - - `user_agent`: Sets the 'User-Agent' HTTP header. Defaults to `Needle/{version} (Node.js {node_version})`. - - `content_type`: Sets the 'Content-Type' header. Unset by default, unless you're sending data in which case it's set accordingly to whatever is being sent (`application/x-www-form-urlencoded`, `application/json` or `multipart/form-data`). That is, of course, unless the option is passed, either here or through `options.headers`. You're the boss. - -Node.js TLS Options -------------------- - -These options are passed directly to `https.request` if present. Taken from the [original documentation](http://nodejs.org/docs/latest/api/https.html): - - - `pfx` : Certificate, Private key and CA certificates to use for SSL. - - `key` : Private key to use for SSL. - - `passphrase` : A string of passphrase for the private key or pfx. - - `cert` : Public x509 certificate to use. - - `ca` : An authority certificate or array of authority certificates to check the remote host against. - - `ciphers` : A string describing the ciphers to use or exclude. - - `rejectUnauthorized` : If true, the server certificate is verified against the list of supplied CAs. An 'error' event is emitted if verification fails. Verification happens at the connection level, before the HTTP request is sent. - - `secureProtocol` : The SSL method to use, e.g. SSLv3_method to force SSL version 3. - - `family` : IP address family to use when resolving host and hostname. Valid values are 4 or 6. When unspecified, both IP v4 and v6 will be used. - -Redirect options ----------------- - -These options only apply if the `follow_max` (or `follow`) option is higher than 0. - - - `follow_set_cookies` : Sends the cookies received in the `set-cookie` header as part of the following request. `false` by default. - - `follow_set_referer` : Sets the 'Referer' header to the requested URI when following a redirect. `false` by default. - - `follow_keep_method` : If enabled, resends the request using the original verb instead of being rewritten to `get` with no data. `false` by default. - - `follow_if_same_host` : When true, Needle will only follow redirects that point to the same host as the original request. `false` by default. - - `follow_if_same_protocol` : When true, Needle will only follow redirects that point to the same protocol as the original request. `false` by default. - - `follow_if_same_location` : Unless true, Needle will not follow redirects that point to same location (as set in the response header) as the original request URL. `false` by default. - -Overriding Defaults -------------------- - -Yes sir, we have it. Needle includes a `defaults()` method, that lets you override some of the defaults for all future requests. Like this: - -```js -needle.defaults({ - open_timeout: 60000, - user_agent: 'MyApp/1.2.3', - parse_response: false }); -``` - -This will override Needle's default user agent and 10-second timeout, and disable response parsing, so you don't need to pass those options in every other request. - -More advanced Proxy support ---------------------------- - -Since you can pass a custom HTTPAgent to Needle you can do all sorts of neat stuff. For example, if you want to use the [`tunnel`](https://github.com/koichik/node-tunnel) module for HTTPS proxying, you can do this: - -```js -var tunnel = require('tunnel'); -var myAgent = tunnel.httpOverHttp({ - proxy: { host: 'localhost' } -}); - -needle.get('foobar.com', { agent: myAgent }); -``` - -Otherwise, you can use the [`hpagent`](https://github.com/delvedor/hpagent) package, which keeps the internal sockets alive to be reused. - -```js -const { HttpsProxyAgent } = require('hpagent'); -needle('get', 'https://localhost:9200', { - agent: new HttpsProxyAgent({ - keepAlive: true, - keepAliveMsecs: 1000, - maxSockets: 256, - maxFreeSockets: 256, - scheduling: 'lifo', - proxy: 'https://localhost:8080' - }) -}); -``` - -Regarding the 'Connection' header ---------------------------------- - -Unless you're running an old version of Node (< 0.11.4), by default Needle won't set the Connection header on requests, yielding Node's default behaviour of keeping the connection alive with the target server. This speeds up immensely the process of sending several requests to the same host. - -On older versions, however, this has the unwanted behaviour of preventing the runtime from exiting, either because of a bug or 'feature' that was changed on 0.11.4. To overcome this Needle does set the 'Connection' header to 'close' on those versions, however this also means that making new requests to the same host doesn't benefit from Keep-Alive. - -So if you're stuck on 0.10 or even lower and want full speed, you can simply set the Connection header to 'Keep-Alive' by using `{ connection: 'Keep-Alive' }`. Please note, though, that an event loop handler will prevent the runtime from exiting so you'll need to manually call `process.exit()` or the universe will collapse. - -Examples Galore ---------------- - -### HTTPS GET with Basic Auth - -```js -needle.get('https://api.server.com', { username: 'you', password: 'secret' }, - function(err, resp) { - // used HTTP auth -}); -``` - -Or use [RFC-1738](http://tools.ietf.org/html/rfc1738#section-3.1) basic auth URL syntax: - -```js -needle.get('https://username:password@api.server.com', function(err, resp) { - // used HTTP auth from URL -}); -``` - -### Digest Auth - -```js -needle.get('other.server.com', { username: 'you', password: 'secret', auth: 'digest' }, - function(err, resp, body) { - // needle prepends 'http://' to your URL, if missing -}); -``` - -### Custom Accept header, deflate - -```js -var options = { - compressed : true, - follow : 10, - accept : 'application/vnd.github.full+json' -} - -needle.get('api.github.com/users/tomas', options, function(err, resp, body) { - // body will contain a JSON.parse(d) object - // if parsing fails, you'll simply get the original body -}); -``` - -### GET XML object - -```js -needle.get('https://news.ycombinator.com/rss', function(err, resp, body) { - // you'll get a nice object containing the nodes in the RSS -}); -``` - -### GET binary, output to file - -```js -needle.get('http://upload.server.com/tux.png', { output: '/tmp/tux.png' }, function(err, resp, body) { - // you can dump any response to a file, not only binaries. -}); -``` - -### GET through proxy - -```js -needle.get('http://search.npmjs.org', { proxy: 'http://localhost:1234' }, function(err, resp, body) { - // request passed through proxy -}); -``` - -### GET a very large document in a stream (from 0.7+) - -```js -var stream = needle.get('http://www.as35662.net/100.log'); - -stream.on('readable', function() { - var chunk; - while (chunk = this.read()) { - console.log('got data: ', chunk); - } -}); -``` - -### GET JSON object in a stream (from 0.7+) - -```js -var stream = needle.get('http://jsonplaceholder.typicode.com/db', { parse: true }); - -stream.on('readable', function() { - var node; - - // our stream will only emit a single JSON root node. - while (node = this.read()) { - console.log('got data: ', node); - } -}); -``` - -### GET JSONStream flexible parser with search query (from 0.7+) - -```js - - // The 'data' element of this stream will be the string representation - // of the titles of all posts. - -needle.get('http://jsonplaceholder.typicode.com/db', { parse: true }) - .pipe(new JSONStream.parse('posts.*.title')); - .on('data', function (obj) { - console.log('got post title: %s', obj); - }); -``` - -### File upload using multipart, passing file path - -```js -var data = { - foo: 'bar', - image: { file: '/home/tomas/linux.png', content_type: 'image/png' } -} - -needle.post('http://my.other.app.com', data, { multipart: true }, function(err, resp, body) { - // needle will read the file and include it in the form-data as binary -}); -``` - -### Stream upload, PUT or POST - -``` js -needle.put('https://api.app.com/v2', fs.createReadStream('myfile.txt'), function(err, resp, body) { - // stream content is uploaded verbatim -}); -``` - -### Multipart POST, passing data buffer - -```js -var buffer = fs.readFileSync('/path/to/package.zip'); - -var data = { - zip_file: { - buffer : buffer, - filename : 'mypackage.zip', - content_type : 'application/octet-stream' - } -} - -needle.post('http://somewhere.com/over/the/rainbow', data, { multipart: true }, function(err, resp, body) { - // if you see, when using buffers we need to pass the filename for the multipart body. - // you can also pass a filename when using the file path method, in case you want to override - // the default filename to be received on the other end. -}); -``` - -### Multipart with custom Content-Type - -```js -var data = { - token: 'verysecret', - payload: { - value: JSON.stringify({ title: 'test', version: 1 }), - content_type: 'application/json' - } -} - -needle.post('http://test.com/', data, { timeout: 5000, multipart: true }, function(err, resp, body) { - // in this case, if the request takes more than 5 seconds - // the callback will return a [Socket closed] error -}); -``` - -For even more examples, check out the examples directory in the repo. - -### Testing - -To run tests, you need to generate a self-signed SSL certificate in the `test` directory. After cloning the repository, run the following commands: - - $ mkdir -p test/keys - $ openssl genrsa -out test/keys/ssl.key 2048 - $ openssl req -new -key test/keys/ssl.key -x509 -days 999 -out test/keys/ssl.cert - -Then you should be able to run `npm test` once you have the dependencies in place. - -> Note: Tests currently only work on linux-based environments that have `/proc/self/fd`. They *do not* work on MacOS environments. -> You can use Docker to run tests by creating a container and mounting the needle project directory on `/app` -> `docker create --name Needle -v /app -w /app -v /app/node_modules -i node:argon` - -Credits -------- - -Written by Tomás Pollak, with the help of contributors. - -Copyright ---------- - -(c) Fork Ltd. Licensed under the MIT license. diff --git a/node_modules/needle/bin/needle b/node_modules/needle/bin/needle deleted file mode 100755 index baaa79b055f4..000000000000 --- a/node_modules/needle/bin/needle +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env node -var needle = require('./../lib/needle'); - -function exit(code, str) { - console.log(str) || process.exit(code); -} - -function usage() { - var out = ['Usage: needle [get|head|post|put|delete] url [query]']; - out.push('Examples: \n needle get google.com\n needle post server.com/api foo=bar'); - exit(1, out.join('\n')) -} - -if (process.argv[2] == '-v' || process.argv[2] == '--version') - exit(0, needle.version); -else if (process.argv[2] == null) - usage(); - -var method = process.argv[2], - url = process.argv[3], - options = { compressed: true, parse_response: true, follow_max: 5, timeout: 10000 }; - -if (!needle[method]) { - url = method; - method = 'get'; -} - -var callback = function(err, resp) { - if (err) return exit(1, "Error: " + err.message); - - if (process.argv.indexOf('-i') != -1) - console.log(resp.headers) || console.log(''); - - console.log(resp.body.toString()); -}; - -if (method == 'post' || method == 'put') - needle[method](url, process.argv[4], options, callback); -else - needle[method](url, options, callback); diff --git a/node_modules/needle/examples/deflated-stream.js b/node_modules/needle/examples/deflated-stream.js deleted file mode 100644 index 4e771b743085..000000000000 --- a/node_modules/needle/examples/deflated-stream.js +++ /dev/null @@ -1,22 +0,0 @@ -var fs = require('fs'), - stream = require('stream'), - needle = require('./../'); - -var url = 'http://ibl.gamechaser.net/f/tagqfxtteucbuldhezkz/bt_level1.gz'; - -var resp = needle.get(url, { compressed: true, follow_max: 10 }); -console.log('Downloading...'); - -resp.on('readable', function() { - - while (data = this.read()) { - var lines = data.toString().split('\n'); - console.log('Got ' + lines.length + ' items.'); - // console.log(lines); - } - -}) - -resp.on('done', function(data) { - console.log('Done'); -}) diff --git a/node_modules/needle/examples/digest-auth.js b/node_modules/needle/examples/digest-auth.js deleted file mode 100644 index 5b8e5d5e78ae..000000000000 --- a/node_modules/needle/examples/digest-auth.js +++ /dev/null @@ -1,16 +0,0 @@ -var needle = require('./..'); - -var opts = { - username: 'user3', - password: 'user3', - auth: 'digest' -} - -needle.get('http://test.webdav.org/auth-digest/', opts, function(err, resp, body) { - console.log(resp.headers); - - if (resp.statusCode == 401) - console.log('\nIt failed.') - else - console.log('\nIt worked!') -}); diff --git a/node_modules/needle/examples/download-to-file.js b/node_modules/needle/examples/download-to-file.js deleted file mode 100644 index 39d5af97d448..000000000000 --- a/node_modules/needle/examples/download-to-file.js +++ /dev/null @@ -1,18 +0,0 @@ -var fs = require('fs'), - needle = require('./..'), - path = require('path'); - -var url = process.argv[2] || 'https://upload.wikimedia.org/wikipedia/commons/a/af/Tux.png'; -var file = path.basename(url); - -console.log('Downloading ' + file); - -needle.get(url, { output: file, follow: 3 }, function(err, resp, data){ - console.log('File saved: ' + process.cwd() + '/' + file); - - var size = fs.statSync(file).size; - if (size == resp.bytes) - console.log(resp.bytes + ' bytes written to file.'); - else - throw new Error('File size mismatch: ' + size + ' != ' + resp.bytes); -}); diff --git a/node_modules/needle/examples/multipart-stream.js b/node_modules/needle/examples/multipart-stream.js deleted file mode 100644 index df1ada6e25c4..000000000000 --- a/node_modules/needle/examples/multipart-stream.js +++ /dev/null @@ -1,25 +0,0 @@ -var needle = require('./../'); - -var url = 'http://posttestserver.com/post.php?dir=needle'; - -var black_pixel = Buffer.from("R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=", 'base64'); - -var data = { - foo: 'bar', - nested: { - test: 123 - }, - image: { buffer: black_pixel, content_type: 'image/gif' } -} - -var resp = needle.post(url, data, { multipart: true }); - -resp.on('readable', function() { - while (data = this.read()) { - console.log(data.toString()); - } -}) - -resp.on('done', function(data) { - console.log('Done.'); -}) diff --git a/node_modules/needle/examples/parsed-stream.js b/node_modules/needle/examples/parsed-stream.js deleted file mode 100644 index 89c22c666ff7..000000000000 --- a/node_modules/needle/examples/parsed-stream.js +++ /dev/null @@ -1,23 +0,0 @@ -////////////////////////////////////////// -// This example demonstrates what happends -// when you use the built-in JSON parser. -////////////////////////////////////////// - -var fs = require('fs'), - stream = require('stream'), - needle = require('./../'); - -var url = 'http://ip.jsontest.com/', - resp = needle.get(url, { parse: true }); - -resp.on('readable', function(obj) { - var chunk; - - while (chunk = this.read()) { - console.log('root = ', chunk); - } -}); - -resp.on('done', function() { - console.log('Done.'); -}); diff --git a/node_modules/needle/examples/parsed-stream2.js b/node_modules/needle/examples/parsed-stream2.js deleted file mode 100644 index 5d9b79afe1db..000000000000 --- a/node_modules/needle/examples/parsed-stream2.js +++ /dev/null @@ -1,21 +0,0 @@ -////////////////////////////////////////// -// This example illustrates a more complex -// example of parsing a JSON stream. -////////////////////////////////////////// - -var needle = require('./../'), - JSONStream = require('JSONStream'); - -var url = 'http://jsonplaceholder.typicode.com/db'; - -// Initialize our GET request with our default (JSON) -// parsers disabled. - -var json = new needle.get(url, {parse: false}) - // And now interpret the stream as JSON, returning only the - // title of all the posts. - .pipe(new JSONStream.parse('posts.*.title')); - -json.on('data', function (obj) { - console.log('got title: \'' + obj + '\''); -}) diff --git a/node_modules/needle/examples/stream-events.js b/node_modules/needle/examples/stream-events.js deleted file mode 100644 index 623099380996..000000000000 --- a/node_modules/needle/examples/stream-events.js +++ /dev/null @@ -1,23 +0,0 @@ -var needle = require('./..'); - -var resp = needle.get('google.com', { follow_max: 10, timeout: 5000 }); - -resp.on('readable', function() { - var chunk; - while (chunk = this.read()) { - console.log('Got ' + chunk.length + ' bytes'); - } -}) - -resp.on('headers', function(headers) { - console.log('Got headers', headers); -}) - -resp.on('redirect', function(url) { - console.log('Redirected to url ' + url); -}) - -resp.on('done', function(err) { - console.log('Finished. No more data to receive.'); - if (err) console.log('With error', err) -}) diff --git a/node_modules/needle/examples/stream-to-file.js b/node_modules/needle/examples/stream-to-file.js deleted file mode 100644 index d261bee9f66f..000000000000 --- a/node_modules/needle/examples/stream-to-file.js +++ /dev/null @@ -1,14 +0,0 @@ -var fs = require('fs'), - needle = require('./..'), - path = require('path'); - -var url = process.argv[2] || 'http://www.google.com/images/errors/robot.png'; -var file = path.basename(url); - -console.log('Downloading ' + file + '...'); -needle - .get(url) - .pipe(fs.createWriteStream(file)) - .on('done', function() { - console.log('Done!') - }) diff --git a/node_modules/needle/examples/upload-image.js b/node_modules/needle/examples/upload-image.js deleted file mode 100644 index 090e3e3fc16e..000000000000 --- a/node_modules/needle/examples/upload-image.js +++ /dev/null @@ -1,51 +0,0 @@ -var needle = require('../'), - path = require('path'); - -var image = 'https://upload.wikimedia.org/wikipedia/commons/a/af/Tux.png'; - -function upload(obj, cb) { - console.log('Uploading image...'); - - var url = 'http://deviantsart.com'; - - var opts = { - timeout: 10000, - follow: 3, - multipart: true - }; - - var params = { - file: obj - } - - needle.post(url, params, opts, function(err, resp) { - if (err || !resp.body.match('url')) - return cb(err || new Error('No image URL found.')) - - cb(null, JSON.parse(resp.body).url) - }) -} - -function download(url, cb) { - console.log('Getting ' + url); - needle.get(url, function(err, resp) { - if (err) throw err; - - cb(null, resp.body); - }) -} - -//////////////////////////////////////// -// ok, now go. - -download(image, function(err, buffer) { - if (err) throw err; - - var obj = { buffer: buffer, content_type: 'image/png' }; - - upload(obj, function(err, url) { - if (err) throw err; - - console.log('Image uploaded to ' + url); - }) -}) diff --git a/node_modules/needle/lib/auth.js b/node_modules/needle/lib/auth.js deleted file mode 100644 index 272443e26ec8..000000000000 --- a/node_modules/needle/lib/auth.js +++ /dev/null @@ -1,112 +0,0 @@ -var createHash = require('crypto').createHash; - -function get_header(header, credentials, opts) { - var type = header.split(' ')[0], - user = credentials[0], - pass = credentials[1]; - - if (type == 'Digest') { - return digest.generate(header, user, pass, opts.method, opts.path); - } else if (type == 'Basic') { - return basic(user, pass); - } -} - -//////////////////// -// basic - -function md5(string) { - return createHash('md5').update(string).digest('hex'); -} - -function basic(user, pass) { - var str = typeof pass == 'undefined' ? user : [user, pass].join(':'); - return 'Basic ' + Buffer.from(str).toString('base64'); -} - -//////////////////// -// digest -// logic inspired from https://github.com/simme/node-http-digest-client - -var digest = {}; - -digest.parse_header = function(header) { - var challenge = {}, - matches = header.match(/([a-z0-9_-]+)="?([a-z0-9=\/\.@\s-\+)()]+)"?/gi); - - for (var i = 0, l = matches.length; i < l; i++) { - var parts = matches[i].split('='), - key = parts.shift(), - val = parts.join('=').replace(/^"/, '').replace(/"$/, ''); - - challenge[key] = val; - } - - return challenge; -} - -digest.update_nc = function(nc) { - var max = 99999999; - nc++; - - if (nc > max) - nc = 1; - - var padding = new Array(8).join('0') + ''; - nc = nc + ''; - return padding.substr(0, 8 - nc.length) + nc; -} - -digest.generate = function(header, user, pass, method, path) { - - var nc = 1, - cnonce = null, - challenge = digest.parse_header(header); - - var ha1 = md5(user + ':' + challenge.realm + ':' + pass), - ha2 = md5(method.toUpperCase() + ':' + path), - resp = [ha1, challenge.nonce]; - - if (typeof challenge.qop === 'string') { - cnonce = md5(Math.random().toString(36)).substr(0, 8); - nc = digest.update_nc(nc); - resp = resp.concat(nc, cnonce); - resp = resp.concat(challenge.qop, ha2); - } else { - resp = resp.concat(ha2); - } - - - var params = { - uri : path, - realm : challenge.realm, - nonce : challenge.nonce, - username : user, - response : md5(resp.join(':')) - } - - if (challenge.qop) { - params.qop = challenge.qop; - } - - if (challenge.opaque) { - params.opaque = challenge.opaque; - } - - if (cnonce) { - params.nc = nc; - params.cnonce = cnonce; - } - - header = [] - for (var k in params) - header.push(k + '="' + params[k] + '"') - - return 'Digest ' + header.join(', '); -} - -module.exports = { - header : get_header, - basic : basic, - digest : digest.generate -} diff --git a/node_modules/needle/lib/cookies.js b/node_modules/needle/lib/cookies.js deleted file mode 100644 index 0f48afcff4d8..000000000000 --- a/node_modules/needle/lib/cookies.js +++ /dev/null @@ -1,79 +0,0 @@ - -// Simple cookie handling implementation based on the standard RFC 6265. -// -// This module just has two functionalities: -// - Parse a set-cookie-header as a key value object -// - Write a cookie-string from a key value object -// -// All cookie attributes are ignored. - -var unescape = require('querystring').unescape; - -var COOKIE_PAIR = /^([^=\s]+)\s*=\s*("?)\s*(.*)\s*\2\s*$/; -var EXCLUDED_CHARS = /[\x00-\x1F\x7F\x3B\x3B\s\"\,\\"%]/g; -var TRAILING_SEMICOLON = /\x3B+$/; -var SEP_SEMICOLON = /\s*\x3B\s*/; - -// i know these should be 'const', but I'd like to keep -// supporting earlier node.js versions as long as I can. :) - -var KEY_INDEX = 1; // index of key from COOKIE_PAIR match -var VALUE_INDEX = 3; // index of value from COOKIE_PAIR match - -// Returns a copy str trimmed and without trainling semicolon. -function cleanCookieString(str) { - return str.trim().replace(/\x3B+$/, ''); -} - -function getFirstPair(str) { - var index = str.indexOf('\x3B'); - return index === -1 ? str : str.substr(0, index); -} - -// Returns a encoded copy of str based on RFC6265 S4.1.1. -function encodeCookieComponent(str) { - return str.toString().replace(EXCLUDED_CHARS, encodeURIComponent); -} - -// Parses a set-cookie-string based on the standard defined in RFC6265 S4.1.1. -function parseSetCookieString(str) { - str = cleanCookieString(str); - str = getFirstPair(str); - - var res = COOKIE_PAIR.exec(str); - if (!res || !res[VALUE_INDEX]) return null; - - return { - name : unescape(res[KEY_INDEX]), - value : unescape(res[VALUE_INDEX]) - }; -} - -// Parses a set-cookie-header and returns a key/value object. -// Each key represents the name of a cookie. -function parseSetCookieHeader(header) { - if (!header) return {}; - header = Array.isArray(header) ? header : [header]; - - return header.reduce(function(res, str) { - var cookie = parseSetCookieString(str); - if (cookie) res[cookie.name] = cookie.value; - return res; - }, {}); -} - -// Writes a set-cookie-string based on the standard definded in RFC6265 S4.1.1. -function writeCookieString(obj) { - return Object.keys(obj).reduce(function(str, name) { - var encodedName = encodeCookieComponent(name); - var encodedValue = encodeCookieComponent(obj[name]); - str += (str ? '; ' : '') + encodedName + '=' + encodedValue; - return str; - }, ''); -} - -// returns a key/val object from an array of cookie strings -exports.read = parseSetCookieHeader; - -// writes a cookie string header -exports.write = writeCookieString; diff --git a/node_modules/needle/lib/decoder.js b/node_modules/needle/lib/decoder.js deleted file mode 100644 index 4ff6198b18c0..000000000000 --- a/node_modules/needle/lib/decoder.js +++ /dev/null @@ -1,53 +0,0 @@ -var iconv, - inherits = require('util').inherits, - stream = require('stream'); - -var regex = /(?:charset|encoding)\s*=\s*['"]? *([\w\-]+)/i; - -inherits(StreamDecoder, stream.Transform); - -function StreamDecoder(charset) { - if (!(this instanceof StreamDecoder)) - return new StreamDecoder(charset); - - stream.Transform.call(this, charset); - this.charset = charset; - this.parsed_chunk = false; -} - -StreamDecoder.prototype._transform = function(chunk, encoding, done) { - var res, found; - - // try get charset from chunk, just once - if (this.charset == 'utf8' && !this.parsed_chunk) { - this.parsed_chunk = true; - - var matches = regex.exec(chunk.toString()); - if (matches) { - found = matches[1].toLowerCase(); - this.charset = found == 'utf-8' ? 'utf8' : found; - } - } - - try { - res = iconv.decode(chunk, this.charset); - } catch(e) { // something went wrong, just return original chunk - res = chunk; - } - - this.push(res); - done(); -} - -module.exports = function(charset) { - try { - if (!iconv) iconv = require('iconv-lite'); - } catch(e) { - /* iconv not found */ - } - - if (iconv) - return new StreamDecoder(charset); - else - return new stream.PassThrough; -} diff --git a/node_modules/needle/lib/multipart.js b/node_modules/needle/lib/multipart.js deleted file mode 100644 index d1e6e1855ad6..000000000000 --- a/node_modules/needle/lib/multipart.js +++ /dev/null @@ -1,98 +0,0 @@ -var readFile = require('fs').readFile, - basename = require('path').basename; - -exports.build = function(data, boundary, callback) { - - if (typeof data != 'object' || typeof data.pipe == 'function') - return callback(new Error('Multipart builder expects data as key/val object.')); - - var body = '', - object = flatten(data), - count = Object.keys(object).length; - - if (count === 0) - return callback(new Error('Empty multipart body. Invalid data.')) - - function done(err, section) { - if (err) return callback(err); - if (section) body += section; - --count || callback(null, body + '--' + boundary + '--'); - }; - - for (var key in object) { - var value = object[key]; - if (value === null || typeof value == 'undefined') { - done(); - } else if (Buffer.isBuffer(value)) { - var part = { buffer: value, content_type: 'application/octet-stream' }; - generate_part(key, part, boundary, done); - } else { - var part = (value.buffer || value.file || value.content_type) ? value : { value: value }; - generate_part(key, part, boundary, done); - } - } - -} - -function generate_part(name, part, boundary, callback) { - - var return_part = '--' + boundary + '\r\n'; - return_part += 'Content-Disposition: form-data; name="' + name + '"'; - - function append(data, filename) { - - if (data) { - var binary = part.content_type.indexOf('text') == -1; - return_part += '; filename="' + encodeURIComponent(filename) + '"\r\n'; - if (binary) return_part += 'Content-Transfer-Encoding: binary\r\n'; - return_part += 'Content-Type: ' + part.content_type + '\r\n\r\n'; - return_part += binary ? data.toString('binary') : data.toString('utf8'); - } - - callback(null, return_part + '\r\n'); - }; - - if ((part.file || part.buffer) && part.content_type) { - - var filename = part.filename ? part.filename : part.file ? basename(part.file) : name; - if (part.buffer) return append(part.buffer, filename); - - readFile(part.file, function(err, data) { - if (err) return callback(err); - append(data, filename); - }); - - } else { - - if (typeof part.value == 'object') - return callback(new Error('Object received for ' + name + ', expected string.')) - - if (part.content_type) { - return_part += '\r\n'; - return_part += 'Content-Type: ' + part.content_type; - } - - return_part += '\r\n\r\n'; - return_part += Buffer.from(String(part.value), 'utf8').toString('binary'); - append(); - - } - -} - -// flattens nested objects for multipart body -function flatten(object, into, prefix) { - into = into || {}; - - for(var key in object) { - var prefix_key = prefix ? prefix + '[' + key + ']' : key; - var prop = object[key]; - - if (prop && typeof prop === 'object' && !(prop.buffer || prop.file || prop.content_type)) - flatten(prop, into, prefix_key) - else - into[prefix_key] = prop; - } - - return into; -} diff --git a/node_modules/needle/lib/needle.js b/node_modules/needle/lib/needle.js deleted file mode 100644 index 7a838062de96..000000000000 --- a/node_modules/needle/lib/needle.js +++ /dev/null @@ -1,829 +0,0 @@ -////////////////////////////////////////// -// Needle -- HTTP Client for Node.js -// Written by Tomás Pollak -// (c) 2012-2020 - Fork Ltd. -// MIT Licensed -////////////////////////////////////////// - -var fs = require('fs'), - http = require('http'), - https = require('https'), - url = require('url'), - stream = require('stream'), - debug = require('debug')('needle'), - stringify = require('./querystring').build, - multipart = require('./multipart'), - auth = require('./auth'), - cookies = require('./cookies'), - parsers = require('./parsers'), - decoder = require('./decoder'); - -////////////////////////////////////////// -// variabilia - -var version = require('../package.json').version; - -var user_agent = 'Needle/' + version; -user_agent += ' (Node.js ' + process.version + '; ' + process.platform + ' ' + process.arch + ')'; - -var tls_options = 'agent pfx key passphrase cert ca ciphers rejectUnauthorized secureProtocol checkServerIdentity family'; - -// older versions of node (< 0.11.4) prevent the runtime from exiting -// because of connections in keep-alive state. so if this is the case -// we'll default new requests to set a Connection: close header. -var close_by_default = !http.Agent || http.Agent.defaultMaxSockets != Infinity; - -// see if we have Object.assign. otherwise fall back to util._extend -var extend = Object.assign ? Object.assign : require('util')._extend; - -// these are the status codes that Needle interprets as redirects. -var redirect_codes = [301, 302, 303, 307, 308]; - -////////////////////////////////////////// -// decompressors for gzip/deflate/br bodies - -function bind_opts(fn, options) { - return fn.bind(null, options); -} - -var decompressors = {}; - -try { - - var zlib = require('zlib'); - - // Enable Z_SYNC_FLUSH to avoid Z_BUF_ERROR errors (Node PR #2595) - var zlib_options = { - flush: zlib.Z_SYNC_FLUSH, - finishFlush: zlib.Z_SYNC_FLUSH - }; - - var br_options = { - flush: zlib.BROTLI_OPERATION_FLUSH, - finishFlush: zlib.BROTLI_OPERATION_FLUSH - }; - - decompressors['x-deflate'] = bind_opts(zlib.Inflate, zlib_options); - decompressors['deflate'] = bind_opts(zlib.Inflate, zlib_options); - decompressors['x-gzip'] = bind_opts(zlib.Gunzip, zlib_options); - decompressors['gzip'] = bind_opts(zlib.Gunzip, zlib_options); - if (typeof zlib.BrotliDecompress === 'function') { - decompressors['br'] = bind_opts(zlib.BrotliDecompress, br_options); - } - -} catch(e) { /* zlib not available */ } - -////////////////////////////////////////// -// options and aliases - -var defaults = { - // data - boundary : '--------------------NODENEEDLEHTTPCLIENT', - encoding : 'utf8', - parse_response : 'all', // same as true. valid options: 'json', 'xml' or false/null - proxy : null, - - // headers - headers : {}, - accept : '*/*', - user_agent : user_agent, - - // numbers - open_timeout : 10000, - response_timeout : 0, - read_timeout : 0, - follow_max : 0, - stream_length : -1, - - // booleans - compressed : false, - decode_response : true, - parse_cookies : true, - follow_set_cookies : false, - follow_set_referer : false, - follow_keep_method : false, - follow_if_same_host : false, - follow_if_same_protocol : false, - follow_if_same_location : false -} - -var aliased = { - options: { - decode : 'decode_response', - parse : 'parse_response', - timeout : 'open_timeout', - follow : 'follow_max' - }, - inverted: {} -} - -// only once, invert aliased keys so we can get passed options. -Object.keys(aliased.options).map(function(k) { - var value = aliased.options[k]; - aliased.inverted[value] = k; -}); - -////////////////////////////////////////// -// helpers - -function keys_by_type(type) { - return Object.keys(defaults).map(function(el) { - if (defaults[el] !== null && defaults[el].constructor == type) - return el; - }).filter(function(el) { return el }) -} - -function parse_content_type(header) { - if (!header || header === '') return {}; - - var found, charset = 'utf8', arr = header.split(';'); - - if (arr.length > 1 && (found = arr[1].match(/charset=(.+)/))) - charset = found[1]; - - return { type: arr[0], charset: charset }; -} - -function is_stream(obj) { - return typeof obj.pipe === 'function'; -} - -function get_stream_length(stream, given_length, cb) { - if (given_length > 0) - return cb(given_length); - - if (stream.end !== void 0 && stream.end !== Infinity && stream.start !== void 0) - return cb((stream.end + 1) - (stream.start || 0)); - - fs.stat(stream.path, function(err, stat) { - cb(stat ? stat.size - (stream.start || 0) : null); - }); -} - -////////////////////////////////////////// -// the main act - -function Needle(method, uri, data, options, callback) { - // if (!(this instanceof Needle)) { - // return new Needle(method, uri, data, options, callback); - // } - - if (typeof uri !== 'string') - throw new TypeError('URL must be a string, not ' + uri); - - this.method = method; - this.uri = uri; - this.data = data; - - if (typeof options == 'function') { - this.callback = options; - this.options = {}; - } else { - this.callback = callback; - this.options = options; - } - -} - -Needle.prototype.setup = function(uri, options) { - - function get_option(key, fallback) { - // if original is in options, return that value - if (typeof options[key] != 'undefined') return options[key]; - - // otherwise, return value from alias or fallback/undefined - return typeof options[aliased.inverted[key]] != 'undefined' - ? options[aliased.inverted[key]] : fallback; - } - - function check_value(expected, key) { - var value = get_option(key), - type = typeof value; - - if (type != 'undefined' && type != expected) - throw new TypeError(type + ' received for ' + key + ', but expected a ' + expected); - - return (type == expected) ? value : defaults[key]; - } - - ////////////////////////////////////////////////// - // the basics - - var config = { - http_opts : { - localAddress: get_option('localAddress', undefined) - }, // passed later to http.request() directly - headers : {}, - output : options.output, - proxy : get_option('proxy', defaults.proxy), - parser : get_option('parse_response', defaults.parse_response), - encoding : options.encoding || (options.multipart ? 'binary' : defaults.encoding) - } - - keys_by_type(Boolean).forEach(function(key) { - config[key] = check_value('boolean', key); - }) - - keys_by_type(Number).forEach(function(key) { - config[key] = check_value('number', key); - }) - - // populate http_opts with given TLS options - tls_options.split(' ').forEach(function(key) { - if (typeof options[key] != 'undefined') { - config.http_opts[key] = options[key]; - if (typeof options.agent == 'undefined') - config.http_opts.agent = false; // otherwise tls options are skipped - } - }); - - ////////////////////////////////////////////////// - // headers, cookies - - for (var key in defaults.headers) - config.headers[key] = defaults.headers[key]; - - config.headers['accept'] = options.accept || defaults.accept; - config.headers['user-agent'] = options.user_agent || defaults.user_agent; - - if (options.content_type) - config.headers['content-type'] = options.content_type; - - // set connection header if opts.connection was passed, or if node < 0.11.4 (close) - if (options.connection || close_by_default) - config.headers['connection'] = options.connection || 'close'; - - if ((options.compressed || defaults.compressed) && typeof zlib != 'undefined') - config.headers['accept-encoding'] = decompressors['br'] ? 'gzip, deflate, br' : 'gzip, deflate'; - - if (options.cookies) - config.headers['cookie'] = cookies.write(options.cookies); - - ////////////////////////////////////////////////// - // basic/digest auth - - if (uri.match(/[^\/]@/)) { // url contains user:pass@host, so parse it. - var parts = (url.parse(uri).auth || '').split(':'); - options.username = parts[0]; - options.password = parts[1]; - } - - if (options.username) { - if (options.auth && (options.auth == 'auto' || options.auth == 'digest')) { - config.credentials = [options.username, options.password]; - } else { - config.headers['authorization'] = auth.basic(options.username, options.password); - } - } - - // if proxy is present, set auth header from either url or proxy_user option. - if (config.proxy) { - if (config.proxy.indexOf('http') === -1) - config.proxy = 'http://' + config.proxy; - - if (config.proxy.indexOf('@') !== -1) { - var proxy = (url.parse(config.proxy).auth || '').split(':'); - options.proxy_user = proxy[0]; - options.proxy_pass = proxy[1]; - } - - if (options.proxy_user) - config.headers['proxy-authorization'] = auth.basic(options.proxy_user, options.proxy_pass); - } - - // now that all our headers are set, overwrite them if instructed. - for (var h in options.headers) - config.headers[h.toLowerCase()] = options.headers[h]; - - config.uri_modifier = get_option('uri_modifier', null); - - return config; -} - -Needle.prototype.start = function() { - - var out = new stream.PassThrough({ objectMode: false }), - uri = this.uri, - data = this.data, - method = this.method, - callback = (typeof this.options == 'function') ? this.options : this.callback, - options = this.options || {}; - - // if no 'http' is found on URL, prepend it. - if (uri.indexOf('http') === -1) - uri = uri.replace(/^(\/\/)?/, 'http://'); - - var self = this, body, waiting = false, config = this.setup(uri, options); - - // unless options.json was set to false, assume boss also wants JSON if content-type matches. - var json = options.json || (options.json !== false && config.headers['content-type'] == 'application/json'); - - if (data) { - - if (options.multipart) { // boss says we do multipart. so we do it. - var boundary = options.boundary || defaults.boundary; - - waiting = true; - multipart.build(data, boundary, function(err, parts) { - if (err) throw(err); - - config.headers['content-type'] = 'multipart/form-data; boundary=' + boundary; - next(parts); - }); - - } else if (is_stream(data)) { - - if (method.toUpperCase() == 'GET') - throw new Error('Refusing to pipe() a stream via GET. Did you mean .post?'); - - if (config.stream_length > 0 || (config.stream_length === 0 && data.path)) { - // ok, let's get the stream's length and set it as the content-length header. - // this prevents some servers from cutting us off before all the data is sent. - waiting = true; - get_stream_length(data, config.stream_length, function(length) { - data.length = length; - next(data); - }) - - } else { - // if the boss doesn't want us to get the stream's length, or if it doesn't - // have a file descriptor for that purpose, then just head on. - body = data; - } - - } else if (Buffer.isBuffer(data)) { - - body = data; // use the raw buffer as request body. - - } else if (method.toUpperCase() == 'GET' && !json) { - - // append the data to the URI as a querystring. - uri = uri.replace(/\?.*|$/, '?' + stringify(data)); - - } else { // string or object data, no multipart. - - // if string, leave it as it is, otherwise, stringify. - body = (typeof(data) === 'string') ? data - : json ? JSON.stringify(data) : stringify(data); - - // ensure we have a buffer so bytecount is correct. - body = Buffer.from(body, config.encoding); - } - - } - - function next(body) { - if (body) { - if (body.length) config.headers['content-length'] = body.length; - - // if no content-type was passed, determine if json or not. - if (!config.headers['content-type']) { - config.headers['content-type'] = json - ? 'application/json; charset=utf-8' - : 'application/x-www-form-urlencoded'; // no charset says W3 spec. - } - } - - // unless a specific accept header was set, assume json: true wants JSON back. - if (options.json && (!options.accept && !(options.headers || {}).accept)) - config.headers['accept'] = 'application/json'; - - self.send_request(1, method, uri, config, body, out, callback); - } - - if (!waiting) next(body); - return out; -} - -Needle.prototype.get_request_opts = function(method, uri, config) { - var opts = config.http_opts, - proxy = config.proxy, - remote = proxy ? url.parse(proxy) : url.parse(uri); - - opts.protocol = remote.protocol; - opts.host = remote.hostname; - opts.port = remote.port || (remote.protocol == 'https:' ? 443 : 80); - opts.path = proxy ? uri : remote.pathname + (remote.search || ''); - opts.method = method; - opts.headers = config.headers; - - if (!opts.headers['host']) { - // if using proxy, make sure the host header shows the final destination - var target = proxy ? url.parse(uri) : remote; - opts.headers['host'] = target.hostname; - - // and if a non standard port was passed, append it to the port header - if (target.port && [80, 443].indexOf(target.port) === -1) { - opts.headers['host'] += ':' + target.port; - } - } - - return opts; -} - -Needle.prototype.should_follow = function(location, config, original) { - if (!location) return false; - - // returns true if location contains matching property (host or protocol) - function matches(property) { - var property = original[property]; - return location.indexOf(property) !== -1; - } - - // first, check whether the requested location is actually different from the original - if (!config.follow_if_same_location && location === original) - return false; - - if (config.follow_if_same_host && !matches('host')) - return false; // host does not match, so not following - - if (config.follow_if_same_protocol && !matches('protocol')) - return false; // procotol does not match, so not following - - return true; -} - -Needle.prototype.send_request = function(count, method, uri, config, post_data, out, callback) { - - if (typeof config.uri_modifier === 'function') { - var modified_uri = config.uri_modifier(uri); - debug('Modifying request URI', uri + ' => ' + modified_uri); - uri = modified_uri; - } - - var timer, - returned = 0, - self = this, - request_opts = this.get_request_opts(method, uri, config), - protocol = request_opts.protocol == 'https:' ? https : http; - - function done(err, resp) { - if (returned++ > 0) - return debug('Already finished, stopping here.'); - - if (timer) clearTimeout(timer); - request.removeListener('error', had_error); - - if (callback) - return callback(err, resp, resp ? resp.body : undefined); - - // NOTE: this event used to be called 'end', but the behaviour was confusing - // when errors ocurred, because the stream would still emit an 'end' event. - out.emit('done', err); - } - - function had_error(err) { - debug('Request error', err); - out.emit('err', err); - done(err || new Error('Unknown error when making request.')); - } - - function set_timeout(type, milisecs) { - if (timer) clearTimeout(timer); - if (milisecs <= 0) return; - - timer = setTimeout(function() { - out.emit('timeout', type); - request.abort(); - // also invoke done() to terminate job on read_timeout - if (type == 'read') done(new Error(type + ' timeout')); - }, milisecs); - } - - // handle errors on the underlying socket, that may be closed while writing - // for an example case, see test/long_string_spec.js. we make sure this - // scenario ocurred by verifying the socket's writable & destroyed states. - function on_socket_end() { - if (returned && !this.writable && this.destroyed === false) { - this.destroy(); - had_error(new Error('Remote end closed socket abruptly.')) - } - } - - debug('Making request #' + count, request_opts); - var request = protocol.request(request_opts, function(resp) { - - var headers = resp.headers; - debug('Got response', resp.statusCode, headers); - out.emit('response', resp); - - set_timeout('read', config.read_timeout); - - // if we got cookies, parse them unless we were instructed not to. make sure to include any - // cookies that might have been set on previous redirects. - if (config.parse_cookies && (headers['set-cookie'] || config.previous_resp_cookies)) { - resp.cookies = extend(config.previous_resp_cookies || {}, cookies.read(headers['set-cookie'])); - debug('Got cookies', resp.cookies); - } - - // if redirect code is found, determine if we should follow it according to the given options. - if (redirect_codes.indexOf(resp.statusCode) !== -1 && self.should_follow(headers.location, config, uri)) { - // clear timer before following redirects to prevent unexpected setTimeout consequence - clearTimeout(timer); - - if (count <= config.follow_max) { - out.emit('redirect', headers.location); - - // unless 'follow_keep_method' is true, rewrite the request to GET before continuing. - if (!config.follow_keep_method) { - method = 'GET'; - post_data = null; - delete config.headers['content-length']; // in case the original was a multipart POST request. - } - - // if follow_set_cookies is true, insert cookies in the next request's headers. - // we set both the original request cookies plus any response cookies we might have received. - if (config.follow_set_cookies) { - var request_cookies = cookies.read(config.headers['cookie']); - config.previous_resp_cookies = resp.cookies; - if (Object.keys(request_cookies).length || Object.keys(resp.cookies || {}).length) { - config.headers['cookie'] = cookies.write(extend(request_cookies, resp.cookies)); - } - } else if (config.headers['cookie']) { - debug('Clearing original request cookie', config.headers['cookie']); - delete config.headers['cookie']; - } - - if (config.follow_set_referer) - config.headers['referer'] = encodeURI(uri); // the original, not the destination URL. - - config.headers['host'] = null; // clear previous Host header to avoid conflicts. - - debug('Redirecting to ' + url.resolve(uri, headers.location)); - return self.send_request(++count, method, url.resolve(uri, headers.location), config, post_data, out, callback); - } else if (config.follow_max > 0) { - return done(new Error('Max redirects reached. Possible loop in: ' + headers.location)); - } - } - - // if auth is requested and credentials were not passed, resend request, provided we have user/pass. - if (resp.statusCode == 401 && headers['www-authenticate'] && config.credentials) { - if (!config.headers['authorization']) { // only if authentication hasn't been sent - var auth_header = auth.header(headers['www-authenticate'], config.credentials, request_opts); - - if (auth_header) { - config.headers['authorization'] = auth_header; - return self.send_request(count, method, uri, config, post_data, out, callback); - } - } - } - - // ok, so we got a valid (non-redirect & authorized) response. let's notify the stream guys. - out.emit('header', resp.statusCode, headers); - out.emit('headers', headers); - - var pipeline = [], - mime = parse_content_type(headers['content-type']), - text_response = mime.type && mime.type.indexOf('text/') != -1; - - // To start, if our body is compressed and we're able to inflate it, do it. - if (headers['content-encoding'] && decompressors[headers['content-encoding']]) { - - var decompressor = decompressors[headers['content-encoding']](); - - // make sure we catch errors triggered by the decompressor. - decompressor.on('error', had_error); - pipeline.push(decompressor); - } - - // If parse is enabled and we have a parser for it, then go for it. - if (config.parser && parsers[mime.type]) { - - // If a specific parser was requested, make sure we don't parse other types. - var parser_name = config.parser.toString().toLowerCase(); - if (['xml', 'json'].indexOf(parser_name) == -1 || parsers[mime.type].name == parser_name) { - - // OK, so either we're parsing all content types or the one requested matches. - out.parser = parsers[mime.type].name; - pipeline.push(parsers[mime.type].fn()); - - // Set objectMode on out stream to improve performance. - out._writableState.objectMode = true; - out._readableState.objectMode = true; - } - - // If we're not parsing, and unless decoding was disabled, we'll try - // decoding non UTF-8 bodies to UTF-8, using the iconv-lite library. - } else if (text_response && config.decode_response - && mime.charset) { - pipeline.push(decoder(mime.charset)); - } - // And `out` is the stream we finally push the decoded/parsed output to. - pipeline.push(out); - - // Now, release the kraken! - var tmp = resp; - while (pipeline.length) { - tmp = tmp.pipe(pipeline.shift()); - } - - // If the user has requested and output file, pipe the output stream to it. - // In stream mode, we will still get the response stream to play with. - if (config.output && resp.statusCode == 200) { - - // for some reason, simply piping resp to the writable stream doesn't - // work all the time (stream gets cut in the middle with no warning). - // so we'll manually need to do the readable/write(chunk) trick. - var file = fs.createWriteStream(config.output); - file.on('error', had_error); - - out.on('end', function() { - if (file.writable) file.end(); - }); - - file.on('close', function() { - delete out.file; - }) - - out.on('readable', function() { - var chunk; - while ((chunk = this.read()) !== null) { - if (file.writable) file.write(chunk); - - // if callback was requested, also push it to resp.body - if (resp.body) resp.body.push(chunk); - } - }) - - out.file = file; - } - - // Only aggregate the full body if a callback was requested. - if (callback) { - resp.raw = []; - resp.body = []; - resp.bytes = 0; - - // Gather and count the amount of (raw) bytes using a PassThrough stream. - var clean_pipe = new stream.PassThrough(); - resp.pipe(clean_pipe); - - clean_pipe.on('readable', function() { - var chunk; - while ((chunk = this.read()) != null) { - resp.bytes += chunk.length; - resp.raw.push(chunk); - } - }) - - // Listen on the 'readable' event to aggregate the chunks, but only if - // file output wasn't requested. Otherwise we'd have two stream readers. - if (!config.output || resp.statusCode != 200) { - out.on('readable', function() { - var chunk; - while ((chunk = this.read()) !== null) { - // We're either pushing buffers or objects, never strings. - if (typeof chunk == 'string') chunk = Buffer.from(chunk); - - // Push all chunks to resp.body. We'll bind them in resp.end(). - resp.body.push(chunk); - } - }) - } - } - - // And set the .body property once all data is in. - out.on('end', function() { - if (resp.body) { // callback mode - - // we want to be able to access to the raw data later, so keep a reference. - resp.raw = Buffer.concat(resp.raw); - - // if parse was successful, we should have an array with one object - if (resp.body[0] !== undefined && !Buffer.isBuffer(resp.body[0])) { - - // that's our body right there. - resp.body = resp.body[0]; - - // set the parser property on our response. we may want to check. - if (out.parser) resp.parser = out.parser; - - } else { // we got one or several buffers. string or binary. - resp.body = Buffer.concat(resp.body); - - // if we're here and parsed is true, it means we tried to but it didn't work. - // so given that we got a text response, let's stringify it. - if (text_response || out.parser) { - resp.body = resp.body.toString(); - } - } - } - - // if an output file is being written to, make sure the callback - // is triggered after all data has been written to it. - if (out.file) { - out.file.on('close', function() { - done(null, resp, resp.body); - }) - } else { // elvis has left the building. - done(null, resp, resp.body); - } - - }); - - }); // end request call - - // unless open_timeout was disabled, set a timeout to abort the request. - set_timeout('open', config.open_timeout); - - // handle errors on the request object. things might get bumpy. - request.on('error', had_error); - - // make sure timer is cleared if request is aborted (issue #257) - request.once('abort', function() { - if (timer) clearTimeout(timer); - }) - - // handle socket 'end' event to ensure we don't get delayed EPIPE errors. - request.once('socket', function(socket) { - if (socket.connecting) { - socket.once('connect', function() { - set_timeout('response', config.response_timeout); - }) - } else { - set_timeout('response', config.response_timeout); - } - - // console.log(socket); - if (!socket.on_socket_end) { - socket.on_socket_end = on_socket_end; - socket.once('end', function() { process.nextTick(on_socket_end.bind(socket)) }); - } - }) - - if (post_data) { - if (is_stream(post_data)) { - post_data.pipe(request); - } else { - request.write(post_data, config.encoding); - request.end(); - } - } else { - request.end(); - } - - out.request = request; - return out; -} - -////////////////////////////////////////// -// exports - -if (typeof Promise !== 'undefined') { - module.exports = function() { - var verb, args = [].slice.call(arguments); - - if (args[0].match(/\.|\//)) // first argument looks like a URL - verb = (args.length > 2) ? 'post' : 'get'; - else - verb = args.shift(); - - if (verb.match(/get|head/) && args.length == 2) - args.splice(1, 0, null); // assume no data if head/get with two args (url, options) - - return new Promise(function(resolve, reject) { - module.exports.request(verb, args[0], args[1], args[2], function(err, resp) { - return err ? reject(err) : resolve(resp); - }); - }) - } -} - -module.exports.version = version; - -module.exports.defaults = function(obj) { - for (var key in obj) { - var target_key = aliased.options[key] || key; - - if (defaults.hasOwnProperty(target_key) && typeof obj[key] != 'undefined') { - if (target_key != 'parse_response' && target_key != 'proxy') { - // ensure type matches the original, except for proxy/parse_response that can be null/bool or string - var valid_type = defaults[target_key].constructor.name; - - if (obj[key].constructor.name != valid_type) - throw new TypeError('Invalid type for ' + key + ', should be ' + valid_type); - } - defaults[target_key] = obj[key]; - } else { - throw new Error('Invalid property for defaults:' + target_key); - } - } - - return defaults; -} - -'head get'.split(' ').forEach(function(method) { - module.exports[method] = function(uri, options, callback) { - return new Needle(method, uri, null, options, callback).start(); - } -}) - -'post put patch delete'.split(' ').forEach(function(method) { - module.exports[method] = function(uri, data, options, callback) { - return new Needle(method, uri, data, options, callback).start(); - } -}) - -module.exports.request = function(method, uri, data, opts, callback) { - return new Needle(method, uri, data, opts, callback).start(); -}; diff --git a/node_modules/needle/lib/parsers.js b/node_modules/needle/lib/parsers.js deleted file mode 100644 index 57f33ecc0d3e..000000000000 --- a/node_modules/needle/lib/parsers.js +++ /dev/null @@ -1,120 +0,0 @@ -////////////////////////////////////////// -// Defines mappings between content-type -// and the appropriate parsers. -////////////////////////////////////////// - -var Transform = require('stream').Transform; -var sax = require('sax'); - -function parseXML(str, cb) { - var obj, current, parser = sax.parser(true, { trim: true, lowercase: true }) - parser.onerror = parser.onend = done; - - function done(err) { - parser.onerror = parser.onend = function() { } - cb(err, obj) - } - - function newElement(name, attributes) { - return { - name: name || '', - value: '', - attributes: attributes || {}, - children: [] - } - } - - parser.oncdata = parser.ontext = function(t) { - if (current) current.value += t - } - - parser.onopentag = function(node) { - var element = newElement(node.name, node.attributes) - if (current) { - element.parent = current - current.children.push(element) - } else { // root object - obj = element - } - - current = element - }; - - parser.onclosetag = function() { - if (typeof current.parent !== 'undefined') { - var just_closed = current - current = current.parent - delete just_closed.parent - } - } - - parser.write(str).close() -} - -function parserFactory(name, fn) { - - function parser() { - var chunks = [], - stream = new Transform({ objectMode: true }); - - // Buffer all our data - stream._transform = function(chunk, encoding, done) { - chunks.push(chunk); - done(); - } - - // And call the parser when all is there. - stream._flush = function(done) { - var self = this, - data = Buffer.concat(chunks); - - try { - fn(data, function(err, result) { - if (err) throw err; - self.push(result); - }); - } catch (err) { - self.push(data); // just pass the original data - } finally { - done(); - } - } - - return stream; - } - - return { fn: parser, name: name }; -} - -var parsers = {} - -function buildParser(name, types, fn) { - var parser = parserFactory(name, fn); - types.forEach(function(type) { - parsers[type] = parser; - }) -} - -buildParser('json', [ - 'application/json', - 'text/javascript' -], function(buffer, cb) { - var err, data; - try { data = JSON.parse(buffer); } catch (e) { err = e; } - cb(err, data); -}); - -buildParser('xml', [ - 'text/xml', - 'application/xml', - 'application/rdf+xml', - 'application/rss+xml', - 'application/atom+xml' -], function(buffer, cb) { - parseXML(buffer.toString(), function(err, obj) { - cb(err, obj) - }) -}); - -module.exports = parsers; -module.exports.use = buildParser; diff --git a/node_modules/needle/lib/querystring.js b/node_modules/needle/lib/querystring.js deleted file mode 100644 index e58cc426fe0a..000000000000 --- a/node_modules/needle/lib/querystring.js +++ /dev/null @@ -1,49 +0,0 @@ -// based on the qs module, but handles null objects as expected -// fixes by Tomas Pollak. - -var toString = Object.prototype.toString; - -function stringify(obj, prefix) { - if (prefix && (obj === null || typeof obj == 'undefined')) { - return prefix + '='; - } else if (toString.call(obj) == '[object Array]') { - return stringifyArray(obj, prefix); - } else if (toString.call(obj) == '[object Object]') { - return stringifyObject(obj, prefix); - } else if (toString.call(obj) == '[object Date]') { - return obj.toISOString(); - } else if (prefix) { // string inside array or hash - return prefix + '=' + encodeURIComponent(String(obj)); - } else if (String(obj).indexOf('=') !== -1) { // string with equal sign - return String(obj); - } else { - throw new TypeError('Cannot build a querystring out of: ' + obj); - } -}; - -function stringifyArray(arr, prefix) { - var ret = []; - - for (var i = 0, len = arr.length; i < len; i++) { - if (prefix) - ret.push(stringify(arr[i], prefix + '[]')); - else - ret.push(stringify(arr[i])); - } - - return ret.join('&'); -} - -function stringifyObject(obj, prefix) { - var ret = []; - - Object.keys(obj).forEach(function(key) { - ret.push(stringify(obj[key], prefix - ? prefix + '[' + encodeURIComponent(key) + ']' - : encodeURIComponent(key))); - }) - - return ret.join('&'); -} - -exports.build = stringify; diff --git a/node_modules/needle/license.txt b/node_modules/needle/license.txt deleted file mode 100644 index fb245f39b923..000000000000 --- a/node_modules/needle/license.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) Fork, Ltd. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/needle/package.json b/node_modules/needle/package.json deleted file mode 100644 index 2e1141c4b665..000000000000 --- a/node_modules/needle/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "needle", - "version": "2.6.0", - "description": "The leanest and most handsome HTTP client in the Nodelands.", - "keywords": [ - "http", - "https", - "simple", - "request", - "client", - "multipart", - "upload", - "proxy", - "deflate", - "timeout", - "charset", - "iconv", - "cookie", - "redirect" - ], - "tags": [ - "http", - "https", - "simple", - "request", - "client", - "multipart", - "upload", - "proxy", - "deflate", - "timeout", - "charset", - "iconv", - "cookie", - "redirect" - ], - "author": "Tomás Pollak ", - "repository": { - "type": "git", - "url": "https://github.com/tomas/needle.git" - }, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "devDependencies": { - "JSONStream": "^1.3.5", - "jschardet": "^1.6.0", - "mocha": "^5.2.0", - "q": "^1.5.1", - "should": "^13.2.3", - "sinon": "^2.3.0", - "xml2js": "^0.4.19" - }, - "scripts": { - "test": "mocha test" - }, - "directories": { - "lib": "./lib" - }, - "main": "./lib/needle", - "bin": { - "needle": "./bin/needle" - }, - "license": "MIT", - "engines": { - "node": ">= 4.4.x" - } -} diff --git a/node_modules/needle/test/auth_digest_spec.js b/node_modules/needle/test/auth_digest_spec.js deleted file mode 100644 index 58799f21c104..000000000000 --- a/node_modules/needle/test/auth_digest_spec.js +++ /dev/null @@ -1,192 +0,0 @@ -var needle = require('../'), - auth = require('../lib/auth'), - sinon = require('sinon'), - should = require('should'), - http = require('http'), - helpers = require('./helpers'); - -var createHash = require('crypto').createHash; - -function md5(string) { - return createHash('md5').update(string).digest('hex'); -} - -function parse_header(header) { - var challenge = {}, - matches = header.match(/([a-z0-9_-]+)="?([a-z0-9=\/\.@\s-\+]+)"?/gi); - - for (var i = 0, l = matches.length; i < l; i++) { - var parts = matches[i].split('='), - key = parts.shift(), - val = parts.join('=').replace(/^"/, '').replace(/"$/, ''); - - challenge[key] = val; - } - - return challenge; -} - -describe('auth_digest', function() { - describe('With qop (RFC 2617)', function() { - it('should generate a proper header', function() { - // from https://tools.ietf.org/html/rfc2617 - var performDigest = function() { - var header = 'Digest realm="testrealm@host.com", qop="auth,auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"'; - var user = 'Mufasa'; - var pass = 'Circle Of Life'; - var method = 'get'; - var path = '/dir/index.html'; - - var updatedHeader = auth.digest(header, user, pass, method, path); - var parsedUpdatedHeader = parse_header(updatedHeader); - - var ha1 = md5(user + ':' + parsedUpdatedHeader.realm + ':' + pass); - var ha2 = md5(method.toUpperCase() + ':' + path); - var expectedResponse = md5([ - ha1, - parsedUpdatedHeader.nonce, - parsedUpdatedHeader.nc, - parsedUpdatedHeader.cnonce, - parsedUpdatedHeader.qop, - ha2 - ].join(':')); - - return { - header: updatedHeader, - parsed: parsedUpdatedHeader, - expectedResponse: expectedResponse, - } - } - - const result = performDigest(); - - (result.header).should - .match(/qop="auth"/) - .match(/uri="\/dir\/index.html"/) - .match(/opaque="5ccc069c403ebaf9f0171e9517f40e41"/) - .match(/realm="testrealm@host\.com"/) - .match(/response=/) - .match(/nc=/) - .match(/nonce=/) - .match(/cnonce=/); - - (result.parsed.response).should.be.eql(result.expectedResponse); - }); - }); - - describe('With plus character in nonce header', function() { - it('should generate a proper header', function() { - // from https://tools.ietf.org/html/rfc2617 - var performDigest = function() { - var header = 'Digest realm="testrealm@host.com", qop="auth,auth-int", nonce="dcd98b7102dd2f0e8b11d0f6+00bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"'; - var user = 'Mufasa'; - var pass = 'Circle Of Life'; - var method = 'get'; - var path = '/dir/index.html'; - - var updatedHeader = auth.digest(header, user, pass, method, path); - var parsedUpdatedHeader = parse_header(updatedHeader); - - var ha1 = md5(user + ':' + parsedUpdatedHeader.realm + ':' + pass); - var ha2 = md5(method.toUpperCase() + ':' + path); - var expectedResponse = md5([ - ha1, - parsedUpdatedHeader.nonce, - parsedUpdatedHeader.nc, - parsedUpdatedHeader.cnonce, - parsedUpdatedHeader.qop, - ha2 - ].join(':')); - - return { - header: updatedHeader, - parsed: parsedUpdatedHeader, - expectedResponse: expectedResponse, - } - } - - const result = performDigest(); - - (result.header).should - .match(/nonce="dcd98b7102dd2f0e8b11d0f6\+00bfb0c093"/) - }); - }); - - describe('With brackets in realm header', function() { - it('should generate a proper header', function() { - // from https://tools.ietf.org/html/rfc2617 - var performDigest = function() { - var header = 'Digest qop="auth", realm="IP Camera(76475)", nonce="4e4449794d575269597a706b5a575935595441324d673d3d", stale="FALSE", Basic realm="IP Camera(76475)"'; - var user = 'Mufasa'; - var pass = 'Circle Of Life'; - var method = 'get'; - var path = '/dir/index.html'; - - var updatedHeader = auth.digest(header, user, pass, method, path); - var parsedUpdatedHeader = parse_header(updatedHeader); - - var ha1 = md5(user + ':' + parsedUpdatedHeader.realm + ':' + pass); - var ha2 = md5(method.toUpperCase() + ':' + path); - var expectedResponse = md5([ - ha1, - parsedUpdatedHeader.nonce, - parsedUpdatedHeader.nc, - parsedUpdatedHeader.cnonce, - parsedUpdatedHeader.qop, - ha2 - ].join(':')); - - return { - header: updatedHeader, - parsed: parsedUpdatedHeader, - expectedResponse: expectedResponse, - } - } - - const result = performDigest(); - - (result.header).should - .match(/realm="IP Camera\(76475\)"/) - }); - }); - - describe('Without qop (RFC 2617)', function() { - it('should generate a proper header', function() { - // from https://tools.ietf.org/html/rfc2069 - var performDigest = function() { - var header = 'Digest realm="testrealm@host.com", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"'; - var user = 'Mufasa'; - var pass = 'Circle Of Life'; - var method = 'get'; - var path = '/dir/index.html'; - - var updatedHeader = auth.digest(header, user, pass, method, path); - var parsedUpdatedHeader = parse_header(updatedHeader); - - var ha1 = md5(user + ':' + parsedUpdatedHeader.realm + ':' + pass); - var ha2 = md5(method.toUpperCase() + ':' + path); - var expectedResponse = md5([ha1, parsedUpdatedHeader.nonce, ha2].join(':')); - - return { - header: updatedHeader, - parsed: parsedUpdatedHeader, - expectedResponse: expectedResponse, - } - } - - const result = performDigest(); - - (result.header).should - .not.match(/qop=/) - .match(/uri="\/dir\/index.html"/) - .match(/opaque="5ccc069c403ebaf9f0171e9517f40e41"/) - .match(/realm="testrealm@host\.com"/) - .match(/response=/) - .not.match(/nc=/) - .match(/nonce=/) - .not.match(/cnonce=/); - - (result.parsed.response).should.be.eql(result.expectedResponse); - }); - }); -}) \ No newline at end of file diff --git a/node_modules/needle/test/basic_auth_spec.js b/node_modules/needle/test/basic_auth_spec.js deleted file mode 100644 index 343f1db0e964..000000000000 --- a/node_modules/needle/test/basic_auth_spec.js +++ /dev/null @@ -1,196 +0,0 @@ -var helpers = require('./helpers'), - should = require('should'), - needle = require('./../'), - server; - -var port = 7707; - -describe('Basic Auth', function() { - - before(function(done) { - server = helpers.server({ port: port }, done); - }) - - after(function(done) { - server.close(done); - }) - - ///////////////// helpers - - var get_auth = function(header) { - var token = header.split(/\s+/).pop(); - return token && Buffer.from(token, 'base64').toString().split(':'); - } - - describe('when neither username or password are passed', function() { - - it('doesnt send any Authorization headers', function(done) { - needle.get('localhost:' + port, { parse: true }, function(err, resp) { - var sent_headers = resp.body.headers; - Object.keys(sent_headers).should.not.containEql('authorization'); - done(); - }) - }) - - }) - - describe('when username is an empty string, and password is a valid string', function() { - - var opts = { username: '', password: 'foobar', parse: true }; - - it('doesnt send any Authorization headers', function(done) { - needle.get('localhost:' + port, { parse: true }, function(err, resp) { - var sent_headers = resp.body.headers; - Object.keys(sent_headers).should.not.containEql('authorization'); - done(); - }) - }) - - }); - - describe('when username is a valid string, but no username is passed', function() { - - var opts = { username: 'foobar', parse: true }; - - it('sends Authorization header', function(done) { - needle.get('localhost:' + port, opts, function(err, resp) { - var sent_headers = resp.body.headers; - Object.keys(sent_headers).should.containEql('authorization'); - done(); - }) - }) - - it('Basic Auth only includes username, without colon', function(done) { - needle.get('localhost:' + port, opts, function(err, resp) { - var sent_headers = resp.body.headers; - var auth = get_auth(sent_headers['authorization']); - auth[0].should.equal('foobar'); - auth.should.have.lengthOf(1); - done(); - }) - }) - - }) - - describe('when username is a valid string, and password is null', function() { - - var opts = { username: 'foobar', password: null, parse: true }; - - it('sends Authorization header', function(done) { - needle.get('localhost:' + port, opts, function(err, resp) { - var sent_headers = resp.body.headers; - Object.keys(sent_headers).should.containEql('authorization'); - done(); - }) - }) - - it('Basic Auth only includes both username and password', function(done) { - needle.get('localhost:' + port, opts, function(err, resp) { - var sent_headers = resp.body.headers; - var auth = get_auth(sent_headers['authorization']); - auth[0].should.equal('foobar'); - auth[1].should.equal(''); - done(); - }) - }) - - }) - - describe('when username is a valid string, and password is an empty string', function() { - - var opts = { username: 'foobar', password: '', parse: true }; - - it('sends Authorization header', function(done) { - needle.get('localhost:' + port, opts, function(err, resp) { - var sent_headers = resp.body.headers; - Object.keys(sent_headers).should.containEql('authorization'); - done(); - }) - }) - - it('Basic Auth only includes both username and password', function(done) { - needle.get('localhost:' + port, opts, function(err, resp) { - var sent_headers = resp.body.headers; - var auth = get_auth(sent_headers['authorization']); - auth[0].should.equal('foobar'); - auth[1].should.equal(''); - auth.should.have.lengthOf(2); - done(); - }) - }) - - }) - - describe('when username AND password are non empty strings', function() { - - var opts = { username: 'foobar', password: 'jakub', parse: true }; - - it('sends Authorization header', function(done) { - needle.get('localhost:' + port, opts, function(err, resp) { - var sent_headers = resp.body.headers; - Object.keys(sent_headers).should.containEql('authorization'); - done(); - }) - }) - - it('Basic Auth only includes both user and password', function(done) { - needle.get('localhost:' + port, opts, function(err, resp) { - var sent_headers = resp.body.headers; - var auth = get_auth(sent_headers['authorization']); - auth[0].should.equal('foobar'); - auth[1].should.equal('jakub'); - auth.should.have.lengthOf(2); - done(); - }) - }) - - }) - - describe('URL with @ but not username/pass', function() { - it('doesnt send Authorization header', function(done) { - var url = 'localhost:' + port + '/abc/@def/xyz.zip'; - - needle.get(url, {}, function(err, resp) { - var sent_headers = resp.body.headers; - Object.keys(sent_headers).should.not.containEql('authorization'); - done(); - }) - }) - - it('sends user:pass headers if passed via options', function(done) { - var url = 'localhost:' + port + '/abc/@def/xyz.zip'; - - needle.get(url, { username: 'foo' }, function(err, resp) { - var sent_headers = resp.body.headers; - Object.keys(sent_headers).should.containEql('authorization'); - sent_headers['authorization'].should.eql('Basic Zm9v') - done(); - }) - }) - }) - - describe('when username/password are included in URL', function() { - var opts = { parse: true }; - - it('sends Authorization header', function(done) { - needle.get('foobar:jakub@localhost:' + port, opts, function(err, resp) { - var sent_headers = resp.body.headers; - Object.keys(sent_headers).should.containEql('authorization'); - done(); - }) - }) - - it('Basic Auth only includes both user and password', function(done) { - needle.get('foobar:jakub@localhost:' + port, opts, function(err, resp) { - var sent_headers = resp.body.headers; - var auth = get_auth(sent_headers['authorization']); - auth[0].should.equal('foobar'); - auth[1].should.equal('jakub'); - auth.should.have.lengthOf(2); - done(); - }) - }) - - }) - -}) diff --git a/node_modules/needle/test/compression_spec.js b/node_modules/needle/test/compression_spec.js deleted file mode 100644 index 227ae09355b0..000000000000 --- a/node_modules/needle/test/compression_spec.js +++ /dev/null @@ -1,112 +0,0 @@ -var should = require('should'), - needle = require('./../'), - http = require('http'), - zlib = require('zlib'), - stream = require('stream'), - port = 11123, - server; - -describe('compression', function(){ - - require.bind(null, 'zlib').should.not.throw() - - var jsonData = '{"foo":"bar"}'; - - describe('when server supports compression', function(){ - - before(function(){ - server = http.createServer(function(req, res) { - var raw = new stream.PassThrough(); - - var acceptEncoding = req.headers['accept-encoding']; - if (!acceptEncoding) { - acceptEncoding = ''; - } - - if (acceptEncoding.match(/\bdeflate\b/)) { - res.setHeader('Content-Encoding', 'deflate'); - raw.pipe(zlib.createDeflate()).pipe(res); - } else if (acceptEncoding.match(/\bgzip\b/)) { - res.setHeader('Content-Encoding', 'gzip'); - raw.pipe(zlib.createGzip()).pipe(res); - } else if (acceptEncoding.match(/\bbr\b/)) { - res.setHeader('Content-Encoding', 'br'); - raw.pipe(zlib.createBrotliCompress()).pipe(res); - } else { - raw.pipe(res); - } - - res.setHeader('Content-Type', 'application/json') - if (req.headers['with-bad']) { - res.end('foo'); // end, no deflate data - } else { - raw.end(jsonData) - } - - }) - - server.listen(port); - }); - - after(function(done){ - server.close(done); - }) - - describe('and client requests no compression', function() { - it('should have the body decompressed', function(done){ - needle.get('localhost:' + port, function(err, response, body){ - should.ifError(err); - body.should.have.property('foo', 'bar'); - response.bytes.should.equal(jsonData.length); - done(); - }) - }) - }) - - describe('and client requests gzip compression', function() { - it('should have the body decompressed', function(done){ - needle.get('localhost:' + port, {headers: {'Accept-Encoding': 'gzip'}}, function(err, response, body){ - should.ifError(err); - body.should.have.property('foo', 'bar'); - response.bytes.should.not.equal(jsonData.length); - done(); - }) - }) - }) - - describe('and client requests deflate compression', function() { - it('should have the body decompressed', function(done){ - needle.get('localhost:' + port, {headers: {'Accept-Encoding': 'deflate'}}, function(err, response, body){ - should.ifError(err); - body.should.have.property('foo', 'bar'); - response.bytes.should.not.equal(jsonData.length); - done(); - }) - }) - - it('should rethrow errors from decompressors', function(done){ - needle.get('localhost:' + port, {headers: {'Accept-Encoding': 'deflate', 'With-Bad': 'true'}}, function(err, response, body) { - should.exist(err); - err.message.should.equal("incorrect header check"); - err.code.should.equal("Z_DATA_ERROR") - done(); - }) - }) - }) - - describe('and client requests brotli compression', function() { - it('should have the body decompressed', function(done){ - // Skip this test if Brotli is not supported - if (typeof zlib.BrotliDecompress !== 'function') { - return done(); - } - needle.get('localhost:' + port, {headers: {'Accept-Encoding': 'br'}}, function(err, response, body){ - should.ifError(err); - body.should.have.property('foo', 'bar'); - response.bytes.should.not.equal(jsonData.length); - done(); - }) - }) - }) - }) -}) diff --git a/node_modules/needle/test/cookies_spec.js b/node_modules/needle/test/cookies_spec.js deleted file mode 100644 index 745f4c71f81f..000000000000 --- a/node_modules/needle/test/cookies_spec.js +++ /dev/null @@ -1,396 +0,0 @@ -var needle = require('../'), - cookies = require('../lib/cookies'), - sinon = require('sinon'), - http = require('http'), - should = require('should'); - -var WEIRD_COOKIE_NAME = 'wc', - BASE64_COOKIE_NAME = 'bc', - FORBIDDEN_COOKIE_NAME = 'fc', - NUMBER_COOKIE_NAME = 'nc'; - -var WEIRD_COOKIE_VALUE = '!\'*+#()&-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~', - BASE64_COOKIE_VALUE = 'Y29va2llCg==', - FORBIDDEN_COOKIE_VALUE = ' ;"\\,', - NUMBER_COOKIE_VALUE = 12354342; - -var NO_COOKIES_TEST_PORT = 11112, - ALL_COOKIES_TEST_PORT = 11113; - -describe('cookies', function() { - - var setCookieHeader, headers, server, opts; - - function decode(str) { - return decodeURIComponent(str); - } - - function encode(str) { - str = str.toString().replace(/[\x00-\x1F\x7F]/g, encodeURIComponent); - return str.replace(/[\s\"\,;\\%]/g, encodeURIComponent); - } - - before(function() { - setCookieHeader = [ - WEIRD_COOKIE_NAME + '=' + encode(WEIRD_COOKIE_VALUE) + ';', - BASE64_COOKIE_NAME + '=' + encode(BASE64_COOKIE_VALUE) + ';', - FORBIDDEN_COOKIE_NAME + '=' + encode(FORBIDDEN_COOKIE_VALUE) + ';', - NUMBER_COOKIE_NAME + '=' + encode(NUMBER_COOKIE_VALUE) + ';' - ]; - }); - - before(function(done) { - serverAllCookies = http.createServer(function(req, res) { - res.setHeader('Content-Type', 'text/html'); - res.setHeader('Set-Cookie', setCookieHeader); - res.end('200'); - }).listen(ALL_COOKIES_TEST_PORT, done); - }); - - after(function(done) { - serverAllCookies.close(done); - }); - - describe('with default options', function() { - it('no cookie header is set on request', function(done) { - needle.get( - 'localhost:' + ALL_COOKIES_TEST_PORT, function(err, response) { - should.not.exist(response.req._headers.cookie); - done(); - }); - }); - }); - - describe('if response does not contain cookies', function() { - before(function(done) { - serverNoCookies = http.createServer(function(req, res) { - res.setHeader('Content-Type', 'text/html'); - res.end('200'); - }).listen(NO_COOKIES_TEST_PORT, done); - }); - - it('response.cookies is undefined', function(done) { - needle.get( - 'localhost:' + NO_COOKIES_TEST_PORT, function(error, response) { - should.not.exist(response.cookies); - done(); - }); - }); - - after(function(done) { - serverNoCookies.close(done); - }); - }); - - describe('if response contains cookies', function() { - - it('puts them on resp.cookies', function(done) { - needle.get( - 'localhost:' + ALL_COOKIES_TEST_PORT, function(error, response) { - response.should.have.property('cookies'); - done(); - }); - }); - - it('parses them as a object', function(done) { - needle.get( - 'localhost:' + ALL_COOKIES_TEST_PORT, function(error, response) { - response.cookies.should.be.an.instanceOf(Object) - .and.have.property(WEIRD_COOKIE_NAME); - response.cookies.should.have.property(BASE64_COOKIE_NAME); - response.cookies.should.have.property(FORBIDDEN_COOKIE_NAME); - response.cookies.should.have.property(NUMBER_COOKIE_NAME); - done(); - }); - }); - - it('must decode it', function(done) { - needle.get( - 'localhost:' + ALL_COOKIES_TEST_PORT, function(error, response) { - response.cookies.wc.should.be.eql(WEIRD_COOKIE_VALUE); - response.cookies.bc.should.be.eql(BASE64_COOKIE_VALUE); - response.cookies.fc.should.be.eql(FORBIDDEN_COOKIE_VALUE); - response.cookies.nc.should.be.eql(NUMBER_COOKIE_VALUE.toString()); - done(); - }); - }); - - describe('when a cookie value is invalid', function() { - - before(function() { - setCookieHeader = [ - 'geo_city=%D1%E0%ED%EA%F2-%CF%E5%F2%E5%F0%E1%F3%F0%E3' - ]; - }) - - it('doesnt blow up', function(done) { - needle.get('localhost:' + ALL_COOKIES_TEST_PORT, function(error, response) { - should.not.exist(error) - var whatever = 'efbfbdefbfbdefbfbdefbfbdefbfbd2defbfbdefbfbdefbfbdefbfbdefbfbdefbfbdefbfbdefbfbdefbfbd'; - Buffer.from(response.cookies.geo_city).toString('hex').should.eql(whatever) - done(); - }); - }) - - }) - - describe('and response is a redirect', function() { - - var redirectServer, testPort = 22222; - var requestCookies = []; - - var responseCookies = [ - [ // first req - WEIRD_COOKIE_NAME + '=' + encode(WEIRD_COOKIE_VALUE) + ';', - BASE64_COOKIE_NAME + '=' + encode(BASE64_COOKIE_VALUE) + ';', - 'FOO=123;' - ], [ // second req - FORBIDDEN_COOKIE_NAME + '=' + encode(FORBIDDEN_COOKIE_VALUE) + ';', - NUMBER_COOKIE_NAME + '=' + encode(NUMBER_COOKIE_VALUE) + ';' - ], [ // third red - 'FOO=BAR;' - ] - ] - - before(function(done) { - redirectServer = http.createServer(function(req, res) { - var number = parseInt(req.url.replace('/', '')); - var nextUrl = 'http://' + 'localhost:' + testPort + '/' + (number + 1); - - if (number == 0) requestCookies = []; // reset - requestCookies.push(req.headers['cookie']); - - if (responseCookies[number]) { // we should send cookies for this request - res.statusCode = 302; - res.setHeader('Set-Cookie', responseCookies[number]); - res.setHeader('Location', nextUrl); - } else if (number == 3) { - res.statusCode = 302; // redirect but without cookies - res.setHeader('Location', nextUrl); - } - - res.end('OK'); - }).listen(22222, done); - }); - - after(function(done) { - redirectServer.close(done); - }) - - describe('and follow_set_cookies is false', function() { - - describe('with original request cookie', function() { - - var opts = { - follow_set_cookies: false, - follow_max: 4, - cookies: { 'xxx': 123 } - }; - - it('request cookie is not passed to redirects', function(done) { - needle.get('localhost:' + testPort + '/0', opts, function(err, resp) { - requestCookies.should.eql(["xxx=123", undefined, undefined, undefined, undefined]) - done(); - }); - }); - - it('response cookies are not passed either', function(done) { - needle.get('localhost:' + testPort + '/0', opts, function(err, resp) { - should.not.exist(resp.cookies); - done(); - }); - }); - - }) - - describe('without original request cookie', function() { - - var opts = { - follow_set_cookies: false, - follow_max: 4, - }; - - it('no request cookies are sent', function(done) { - needle.get('localhost:' + testPort + '/0', opts, function(err, resp) { - requestCookies.should.eql([undefined, undefined, undefined, undefined, undefined]) - done(); - }); - }); - - it('response cookies are not passed either', function(done) { - needle.get('localhost:' + testPort + '/0', opts, function(err, resp) { - should.not.exist(resp.cookies); - done(); - }); - }); - - }) - - }); - - describe('and follow_set_cookies is true', function() { - - describe('with original request cookie', function() { - - var opts = { - follow_set_cookies: true, - follow_max: 4, - cookies: { 'xxx': 123 } - }; - - it('request cookie is passed passed to redirects, and response cookies are added too', function(done) { - needle.get('localhost:' + testPort + '/0', opts, function(err, resp) { - requestCookies.should.eql([ - "xxx=123", - "xxx=123; wc=!'*+#()&-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~; bc=Y29va2llCg==; FOO=123", - "xxx=123; wc=!\'*+#()&-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~; bc=Y29va2llCg==; FOO=123; fc=%20%3B%22%5C%2C; nc=12354342", - "xxx=123; wc=!\'*+#()&-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~; bc=Y29va2llCg==; FOO=BAR; fc=%20%3B%22%5C%2C; nc=12354342", - "xxx=123; wc=!\'*+#()&-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~; bc=Y29va2llCg==; FOO=BAR; fc=%20%3B%22%5C%2C; nc=12354342" - ]) - done(); - }); - }); - - it('response cookies are passed as well', function(done) { - needle.get('localhost:' + testPort + '/0', opts, function(err, resp) { - resp.cookies.should.have.property(WEIRD_COOKIE_NAME); - resp.cookies.should.have.property(BASE64_COOKIE_NAME); - resp.cookies.should.have.property(FORBIDDEN_COOKIE_NAME); - resp.cookies.should.have.property(NUMBER_COOKIE_NAME); - resp.cookies.should.have.property('FOO'); - resp.cookies.FOO.should.eql('BAR'); // should overwrite previous one - done(); - }); - }); - - }) - - describe('without original request cookie', function() { - - var opts = { - follow_set_cookies: true, - follow_max: 4, - }; - - it('response cookies are passed to redirects', function(done) { - needle.get('localhost:' + testPort + '/0', opts, function(err, resp) { - requestCookies.should.eql([ - undefined, - "wc=!'*+#()&-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~; bc=Y29va2llCg==; FOO=123", - "wc=!\'*+#()&-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~; bc=Y29va2llCg==; FOO=123; fc=%20%3B%22%5C%2C; nc=12354342", - "wc=!\'*+#()&-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~; bc=Y29va2llCg==; FOO=BAR; fc=%20%3B%22%5C%2C; nc=12354342", - "wc=!\'*+#()&-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~; bc=Y29va2llCg==; FOO=BAR; fc=%20%3B%22%5C%2C; nc=12354342" - ]) - done(); - }); - }); - - it('response cookies are passed as well', function(done) { - needle.get('localhost:' + testPort + '/0', opts, function(err, resp) { - // resp.cookies.should.have.property(WEIRD_COOKIE_NAME); - // resp.cookies.should.have.property(BASE64_COOKIE_NAME); - // resp.cookies.should.have.property(FORBIDDEN_COOKIE_NAME); - // resp.cookies.should.have.property(NUMBER_COOKIE_NAME); - // resp.cookies.should.have.property('FOO'); - // resp.cookies.FOO.should.eql('BAR'); // should overwrite previous one - done(); - }); - }); - - }) - - }); - }); - - describe('with parse_cookies = false', function() { - it('does not parse them', function(done) { - needle.get( - 'localhost:' + ALL_COOKIES_TEST_PORT, { parse_cookies: false }, function(error, response) { - should.not.exist(response.cookies); - done(); - }); - }); - }); - }); - - describe('if request contains cookie header', function() { - var opts = { - cookies: {} - }; - - before(function() { - opts.cookies[WEIRD_COOKIE_NAME] = WEIRD_COOKIE_VALUE; - opts.cookies[BASE64_COOKIE_NAME] = BASE64_COOKIE_VALUE; - opts.cookies[FORBIDDEN_COOKIE_NAME] = FORBIDDEN_COOKIE_VALUE; - opts.cookies[NUMBER_COOKIE_NAME] = NUMBER_COOKIE_VALUE; - }); - - it('must be a valid cookie string', function(done) { - var COOKIE_PAIR = /^([^=\s]+)\s*=\s*("?)\s*(.*)\s*\2\s*$/; - - var full_header = [ - WEIRD_COOKIE_NAME + '=' + WEIRD_COOKIE_VALUE, - BASE64_COOKIE_NAME + '=' + BASE64_COOKIE_VALUE, - FORBIDDEN_COOKIE_NAME + '=' + encode(FORBIDDEN_COOKIE_VALUE), - NUMBER_COOKIE_NAME + '=' + NUMBER_COOKIE_VALUE - ].join('; ') - - needle.get('localhost:' + ALL_COOKIES_TEST_PORT, opts, function(error, response) { - var cookieString = response.req._headers.cookie; - cookieString.should.be.type('string'); - - cookieString.split(/\s*;\s*/).forEach(function(pair) { - COOKIE_PAIR.test(pair).should.be.exactly(true); - }); - - cookieString.should.be.exactly(full_header); - done(); - }); - }); - - it('dont have to encode allowed characters', function(done) { - var COOKIE_PAIR = /^([^=\s]+)\s*=\s*("?)\s*(.*)\s*\2\s*$/, - KEY_INDEX = 1, - VALUE_INEX = 3; - - needle.get('localhost:' + ALL_COOKIES_TEST_PORT, opts, function(error, response) { - var cookieObj = {}, - cookieString = response.req._headers.cookie; - - cookieString.split(/\s*;\s*/).forEach(function(str) { - var pair = COOKIE_PAIR.exec(str); - cookieObj[pair[KEY_INDEX]] = pair[VALUE_INEX]; - }); - - cookieObj[WEIRD_COOKIE_NAME].should.be.exactly(WEIRD_COOKIE_VALUE); - cookieObj[BASE64_COOKIE_NAME].should.be.exactly(BASE64_COOKIE_VALUE); - done(); - }); - }); - - it('must encode forbidden characters', function(done) { - var COOKIE_PAIR = /^([^=\s]+)\s*=\s*("?)\s*(.*)\s*\2\s*$/, - KEY_INDEX = 1, - VALUE_INEX = 3; - - needle.get('localhost:' + ALL_COOKIES_TEST_PORT, opts, function(error, response) { - var cookieObj = {}, - cookieString = response.req._headers.cookie; - - cookieString.split(/\s*;\s*/).forEach(function(str) { - var pair = COOKIE_PAIR.exec(str); - cookieObj[pair[KEY_INDEX]] = pair[VALUE_INEX]; - }); - - cookieObj[FORBIDDEN_COOKIE_NAME].should.not.be.eql( - FORBIDDEN_COOKIE_VALUE); - cookieObj[FORBIDDEN_COOKIE_NAME].should.be.exactly( - encode(FORBIDDEN_COOKIE_VALUE)); - cookieObj[FORBIDDEN_COOKIE_NAME].should.be.exactly( - encodeURIComponent(FORBIDDEN_COOKIE_VALUE)); - done(); - }); - }); - }); - -}); diff --git a/node_modules/needle/test/decoder_spec.js b/node_modules/needle/test/decoder_spec.js deleted file mode 100644 index db38821df4b2..000000000000 --- a/node_modules/needle/test/decoder_spec.js +++ /dev/null @@ -1,121 +0,0 @@ -var should = require('should'), - needle = require('./../'), - Q = require('q'), - chardet = require('jschardet'), - helpers = require('./helpers'); - -describe('character encoding', function() { - - var url; - this.timeout(5000); - - describe('Given content-type: "text/html; charset=EUC-JP"', function() { - - before(function() { - url = 'http://www.nina.jp/server/slackware/webapp/tomcat_charset.html'; - }) - - describe('with decode = false', function() { - - it('does not decode', function(done) { - - needle.get(url, { decode: false }, function(err, resp) { - resp.body.should.be.a.String; - chardet.detect(resp.body).encoding.should.eql('windows-1252'); - resp.body.indexOf('EUCを使う').should.eql(-1); - done(); - }) - - }) - - }) - - describe('with decode = true', function() { - - it('decodes', function(done) { - - needle.get(url, { decode: true }, function(err, resp) { - resp.body.should.be.a.String; - chardet.detect(resp.body).encoding.should.eql('ascii'); - resp.body.indexOf('EUCを使う').should.not.eql(-1); - done(); - }) - - }) - - }) - - }) - - describe('Given content-type: "text/html but file is charset: gb2312', function() { - - it('encodes to UTF-8', function(done) { - - // Our Needle wrapper that requests a chinese website. - var task = Q.nbind(needle.get, needle, 'http://www.chinesetop100.com/'); - - // Different instantiations of this task - var tasks = [Q.fcall(task, {decode: true}), - Q.fcall(task, {decode: false})]; - - var results = tasks.map(function(task) { - return task.then(function(obj) { - return obj[0].body; - }); - }); - - // Execute all requests concurrently - Q.all(results).done(function(bodies) { - - var charsets = [ - chardet.detect(bodies[0]).encoding, - chardet.detect(bodies[1]).encoding, - ] - - // We wanted to decode our first stream as specified by options - charsets[0].should.equal('ascii'); - bodies[0].indexOf('全球中文网站前二十强').should.not.equal(-1); - - // But not our second stream - charsets[1].should.equal('windows-1252'); - bodies[1].indexOf('全球中文网站前二十强').should.equal(-1); - - done(); - }); - }) - }) - - describe('Given content-type: "text/html"', function () { - - var server, - port = 54321, - text = 'Magyarországi Fióktelepe' - - before(function(done) { - server = helpers.server({ - port: port, - response: text, - headers: { 'Content-Type': 'text/html' } - }, done); - }) - - after(function(done) { - server.close(done) - }) - - describe('with decode = false', function () { - it('decodes by default to utf-8', function (done) { - - needle.get('http://localhost:' + port, { decode: false }, function (err, resp) { - resp.body.should.be.a.String; - chardet.detect(resp.body).encoding.should.eql('ISO-8859-2'); - resp.body.should.eql('Magyarországi Fióktelepe') - done(); - }) - - }) - - }) - - }) -}) diff --git a/node_modules/needle/test/errors_spec.js b/node_modules/needle/test/errors_spec.js deleted file mode 100644 index 2f488f5fd7f9..000000000000 --- a/node_modules/needle/test/errors_spec.js +++ /dev/null @@ -1,286 +0,0 @@ -var needle = require('../'), - sinon = require('sinon'), - should = require('should'), - http = require('http'), - Emitter = require('events').EventEmitter, - helpers = require('./helpers'); - -var get_catch = function(url, opts) { - var err; - try { - needle.get(url, opts); - } catch(e) { - err = e; - } - return err; -} - -describe('errors', function() { - - after(function(done) { - setTimeout(done, 100) - }) - - describe('when host does not exist', function() { - - var url = 'http://unexistinghost/foo'; - - describe('with callback', function() { - - it('does not throw', function() { - var ex = get_catch(url); - should.not.exist(ex); - }) - - it('callbacks an error', function(done) { - needle.get(url, function(err) { - err.should.be.a.Error; - done(); - }) - }) - - it('error should be ENOTFOUND or EADDRINFO or EAI_AGAIN', function(done) { - needle.get(url, function(err) { - err.code.should.match(/ENOTFOUND|EADDRINFO|EAI_AGAIN/) - done(); - }) - }) - - it('does not callback a response', function(done) { - needle.get(url, function(err, resp) { - should.not.exist(resp); - done(); - }) - }) - - it('does not emit an error event', function(done) { - var emitted = false; - var req = needle.get(url, function(err, resp) { }) - - req.on('error', function() { - emitted = true; - }) - - setTimeout(function() { - emitted.should.eql(false); - done(); - }, 100); - }) - - }) - - describe('without callback', function() { - - it('does not throw', function() { - var ex = get_catch(url); - should.not.exist(ex); - }) - - it('emits end event once, with error', function(done) { - var callcount = 0, - stream = needle.get(url); - - stream.on('done', function(err) { - callcount++; - }) - - setTimeout(function() { - callcount.should.equal(1); - done(); - }, 200) - }) - - it('error should be ENOTFOUND or EADDRINFO or EAI_AGAIN', function(done) { - var errorific, - stream = needle.get(url); - - stream.on('done', function(err) { - errorific = err; - }) - - setTimeout(function() { - should.exist(errorific); - errorific.code.should.match(/ENOTFOUND|EADDRINFO|EAI_AGAIN/) - done(); - }, 200) - }) - - it('does not emit a readable event', function(done) { - var called = false, - stream = needle.get(url); - - stream.on('readable', function() { - called = true; - }) - - setTimeout(function() { - called.should.be.false; - done(); - }, 50) - }) - - it('does not emit an error event', function(done) { - var emitted = false, - req = needle.get(url); - - req.on('error', function() { - emitted = true; - }) - - setTimeout(function() { - emitted.should.eql(false); - done(); - }, 100); - }) - - }) - - }) - - describe('when request times out waiting for response', function() { - - var server, - url = 'http://localhost:3333/foo'; - - var send_request = function(cb) { - return needle.get(url, { response_timeout: 200 }, cb); - } - - before(function() { - server = helpers.server({ port: 3333, wait: 1000 }); - }) - - after(function() { - server.close(); - }) - - describe('with callback', function() { - - it('aborts the request', function(done) { - - var time = new Date(); - - send_request(function(err) { - var timediff = (new Date() - time); - timediff.should.be.within(200, 300); - done(); - }) - - }) - - it('callbacks an error', function(done) { - send_request(function(err) { - err.should.be.a.Error; - done(); - }) - }) - - it('error should be ECONNRESET', function(done) { - send_request(function(err) { - err.code.should.equal('ECONNRESET') - done(); - }) - }) - - it('does not callback a response', function(done) { - send_request(function(err, resp) { - should.not.exist(resp); - done(); - }) - }) - - it('does not emit an error event', function(done) { - var emitted = false; - - var req = send_request(function(err, resp) { - should.not.exist(resp); - }) - - req.on('error', function() { - emitted = true; - }) - - setTimeout(function() { - emitted.should.eql(false); - done(); - }, 350); - }) - - }) - - describe('without callback', function() { - - it('emits done event once, with error', function(done) { - var called = 0, - stream = send_request(); - - stream.on('done', function(err) { - called++; - }) - - setTimeout(function() { - called.should.equal(1); - done(); - }, 250) - }) - - it('aborts the request', function(done) { - - var time = new Date(); - var stream = send_request(); - - stream.on('done', function(err) { - var timediff = (new Date() - time); - timediff.should.be.within(200, 300); - done(); - }) - - }) - - it('error should be ECONNRESET', function(done) { - var error, - stream = send_request(); - - stream.on('done', function(err) { - error = err; - }) - - setTimeout(function() { - error.code.should.equal('ECONNRESET') - done(); - }, 250) - }) - - it('does not emit a readable event', function(done) { - var called = false, - stream = send_request(); - - stream.on('readable', function() { - called = true; - }) - - setTimeout(function() { - called.should.be.false; - done(); - }, 250) - }) - - it('does not emit an error event', function(done) { - var emitted = false; - var req = send_request(); - - req.on('error', function() { - emitted = true; - }) - - setTimeout(function() { - emitted.should.eql(false); - done(); - }, 100); - }) - - }) - - }) - -}) diff --git a/node_modules/needle/test/headers_spec.js b/node_modules/needle/test/headers_spec.js deleted file mode 100644 index a5c17e62d9e0..000000000000 --- a/node_modules/needle/test/headers_spec.js +++ /dev/null @@ -1,203 +0,0 @@ -var http = require('http'), - helpers = require('./helpers'), - should = require('should'); - -var port = 54321; - -describe('request headers', function() { - - var needle, - server, - existing_sockets, - original_defaultMaxSockets; - - before(function(done) { - setTimeout(function() { - existing_sockets = get_active_sockets().length; - server = helpers.server({ port: port }, done); - }, 100); - }) - - after(function(done) { - server.close(done); - }) - - function send_request(opts, cb) { - needle.get('http://localhost:' + port, opts, cb); - } - - function get_active_sockets() { - var handles = process._getActiveHandles(); - - return handles.filter(function(el) { - if (el.constructor.name.toString() == 'Socket') { - return el.destroyed !== true; - } - }) - } - - describe('old node versions (<0.11.4) with persistent keep-alive connections', function() { - - before(function() { - delete require.cache[require.resolve('..')] // in case it was already loaded - original_defaultMaxSockets = http.Agent.defaultMaxSockets; - http.Agent.defaultMaxSockets = 5; - needle = require('..'); - }) - - after(function() { - http.Agent.defaultMaxSockets = original_defaultMaxSockets; - delete require.cache[require.resolve('..')] - }) - - describe('default options', function() { - - it('sends a Connection: close header', function(done) { - send_request({}, function(err, resp) { - resp.body.headers['connection'].should.eql('close'); - done(); - }) - }) - - it('no open sockets remain after request', function(done) { - send_request({}, function(err, resp) { - setTimeout(function() { - get_active_sockets().length.should.eql(existing_sockets); - done(); - }, 10) - }); - }) - - }) - - describe('passing connection: close', function() { - - it('sends a Connection: close header', function(done) { - send_request({ connection: 'close' }, function(err, resp) { - resp.body.headers['connection'].should.eql('close'); - done(); - }) - }) - - it('no open sockets remain after request', function(done) { - send_request({ connection: 'close' }, function(err, resp) { - setTimeout(function() { - get_active_sockets().length.should.eql(existing_sockets); - done(); - }, 10) - }); - }) - - }) - - describe('passing connection: keep-alive', function() { - - it('sends a Connection: keep-alive header (using options.headers.connection)', function(done) { - send_request({ headers: { connection: 'keep-alive' }}, function(err, resp) { - resp.body.headers['connection'].should.eql('keep-alive'); - done(); - }) - }) - - it('sends a Connection: keep-alive header (using options.connection)', function(done) { - send_request({ connection: 'keep-alive' }, function(err, resp) { - resp.body.headers['connection'].should.eql('keep-alive'); - done(); - }) - }) - - it('one open socket remain after request', function(done) { - send_request({ connection: 'keep-alive' }, function(err, resp) { - get_active_sockets().length.should.eql(existing_sockets + 1); - done(); - }); - }) - - }) - - }) - - describe('new node versions with smarter connection disposing', function() { - - before(function() { - delete require.cache[require.resolve('..')] - original_defaultMaxSockets = http.Agent.defaultMaxSockets; - http.Agent.defaultMaxSockets = Infinity; - needle = require('..'); - }) - - after(function() { - http.Agent.defaultMaxSockets = original_defaultMaxSockets; - delete require.cache[require.resolve('..')] - }) - - describe('default options', function() { - - // TODO: - // this is weird. by default, new node versions set a 'close' header - // while older versions set a keep-alive header - - it.skip('sets a Connection header', function(done) { - send_request({}, function(err, resp) { - // should.not.exist(resp.body.headers['connection']); - // done(); - }) - }) - - it.skip('one open sockets remain after request', function(done) { - send_request({}, function(err, resp) { - // get_active_sockets().length.should.eql(1); - // done(); - }); - }) - - }) - - describe('passing connection: close', function() { - - it('sends a Connection: close header', function(done) { - send_request({ connection: 'close' }, function(err, resp) { - resp.body.headers['connection'].should.eql('close'); - done(); - }) - }) - - it('no open sockets remain after request', function(done) { - send_request({ connection: 'close' }, function(err, resp) { - setTimeout(function() { - get_active_sockets().length.should.eql(existing_sockets); - done(); - }, 10); - }); - }) - - }) - - describe('passing connection: keep-alive', function() { - - it('sends a Connection: keep-alive header (using options.headers.connection)', function(done) { - send_request({ headers: { connection: 'keep-alive' }}, function(err, resp) { - resp.body.headers['connection'].should.eql('keep-alive'); - done(); - }) - }) - - it('sends a Connection: keep-alive header (using options.connection)', function(done) { - send_request({ connection: 'keep-alive' }, function(err, resp) { - resp.body.headers['connection'].should.eql('keep-alive'); - done(); - }) - }) - - it('one open socket remain after request', function(done) { - send_request({ connection: 'keep-alive' }, function(err, resp) { - get_active_sockets().length.should.eql(existing_sockets + 1); - done(); - }); - }) - - }) - - }) - -}) diff --git a/node_modules/needle/test/helpers.js b/node_modules/needle/test/helpers.js deleted file mode 100644 index a85f54874b12..000000000000 --- a/node_modules/needle/test/helpers.js +++ /dev/null @@ -1,72 +0,0 @@ -var fs = require('fs'); - -var protocols = { - http : require('http'), - https : require('https') -} - -var keys = { - cert : fs.readFileSync(__dirname + '/keys/ssl.cert'), - key : fs.readFileSync(__dirname + '/keys/ssl.key') -} - -var helpers = {}; - -helpers.server = function(opts, cb) { - - var defaults = { - code : 200, - headers : {'Content-Type': 'application/json'} - } - - var mirror_response = function(req) { - return JSON.stringify({ - headers: req.headers, - body: req.body - }) - } - - var get = function(what) { - if (!opts[what]) - return defaults[what]; - - if (typeof opts[what] == 'function') - return opts[what](); // set them at runtime - else - return opts[what]; - } - - var finish = function(req, res) { - res.writeHead(get('code'), get('headers')); - res.end(opts.response || mirror_response(req)); - } - - var handler = function(req, res) { - - req.setEncoding('utf8'); // get as string - req.body = ''; - req.on('data', function(str) { req.body += str }) - req.socket.on('error', function(e) { - // res.writeHead(500, {'Content-Type': 'text/plain'}); - // res.end('Error: ' + e.message); - }) - - setTimeout(function(){ - finish(req, res); - }, opts.wait || 0); - - }; - - var protocol = opts.protocol || 'http'; - var server; - - if (protocol == 'https') - server = protocols[protocol].createServer(keys, handler); - else - server = protocols[protocol].createServer(handler); - - server.listen(opts.port, cb); - return server; -} - -module.exports = helpers; \ No newline at end of file diff --git a/node_modules/needle/test/long_string_spec.js b/node_modules/needle/test/long_string_spec.js deleted file mode 100644 index 4baa4fabfd85..000000000000 --- a/node_modules/needle/test/long_string_spec.js +++ /dev/null @@ -1,34 +0,0 @@ -var needle = require('../'), - should = require('should'); - -describe('when posting a very long string', function() { - - this.timeout(20000); - - function get_string(length) { - var str = ''; - for (var i = 0; i < length; i++) { - str += 'x'; - } - return str; - } - - it("shouldn't throw an EPIPE error out of nowhere", function(done) { - var error; - - function finished() { - setTimeout(function() { - should.not.exist(error); - done(); - }, 300); - } - - try { - needle.post('https://google.com', { data: get_string(Math.pow(2, 20)) }, finished) - } catch(e) { - error = e; - } - - }) - -}) diff --git a/node_modules/needle/test/output_spec.js b/node_modules/needle/test/output_spec.js deleted file mode 100644 index 14fc5bb03f78..000000000000 --- a/node_modules/needle/test/output_spec.js +++ /dev/null @@ -1,254 +0,0 @@ -var should = require('should'), - needle = require('./../'), - http = require('http'), - sinon = require('sinon'), - stream = require('stream'), - fs = require('fs'), - port = 11111, - server; - -describe('with output option', function() { - - var server, handler, file = '/tmp/foobar.out'; - - function send_request_cb(where, cb) { - var url = 'http://localhost:' + port + '/whatever.file'; - return needle.get(url, { output: where }, cb); - } - - function send_request_stream(where, cb) { - var url = 'http://localhost:' + port + '/whatever.file'; - var stream = needle.get(url, { output: where }); - stream.on('end', cb); - } - - // this will only work in UNICES - function get_open_file_descriptors() { - var list = fs.readdirSync('/proc/self/fd'); - return list.length; - } - - var send_request = send_request_cb; - - before(function(){ - server = http.createServer(function(req, res) { - handler(req, res); - }).listen(port); - }); - - after(function() { - server.close(); - }) - - beforeEach(function() { - try { fs.unlinkSync(file) } catch(e) { }; - }) - - describe('and a 404 response', function() { - - before(function() { - handler = function(req, res) { - res.writeHead(404, {'Content-Type': 'text/plain' }); - res.end(); - } - }) - - it('doesnt attempt to write a file', function(done) { - var spy = sinon.spy(fs, 'createWriteStream'); - send_request(file, function(err, resp) { - resp.statusCode.should.eql(404); - spy.called.should.eql(false); - spy.restore(); - done(); - }) - }) - - it('doesnt actually write a file', function(done) { - send_request(file, function(err, resp) { - resp.statusCode.should.eql(404); - fs.existsSync(file).should.eql(false); - done(); - }) - }) - - }) - - describe('and a 200 response', function() { - - describe('for an empty response', function() { - - before(function() { - handler = function(req, res) { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(); - } - }) - - it('uses a writableStream', function(done) { - var spy = sinon.spy(fs, 'createWriteStream'); - send_request(file, function(err, resp) { - resp.statusCode.should.eql(200); - spy.called.should.eql(true); - spy.restore(); - done(); - }) - }) - - it('writes a file', function(done) { - fs.existsSync(file).should.eql(false); - send_request(file, function(err, resp) { - fs.existsSync(file).should.eql(true); - done(); - }) - }) - - it('file is zero bytes in length', function(done) { - send_request(file, function(err, resp) { - fs.statSync(file).size.should.equal(0); - done(); - }) - }) - - if (process.platform != 'win32') { - it('closes the file descriptor', function(done) { - var open_descriptors = get_open_file_descriptors(); - send_request(file + Math.random(), function(err, resp) { - var current_descriptors = get_open_file_descriptors(); - open_descriptors.should.eql(current_descriptors); - done() - }) - }) - } - - }) - - describe('for a JSON response', function() { - - before(function() { - handler = function(req, res) { - res.writeHead(200, { 'Content-Type': 'application/javascript' }); - res.end(JSON.stringify({foo: 'bar'})); - } - }) - - it('uses a writableStream', function(done) { - var spy = sinon.spy(fs, 'createWriteStream'); - send_request(file, function(err, resp) { - resp.statusCode.should.eql(200); - spy.called.should.eql(true); - spy.restore(); - done(); - }) - }) - - it('writes a file', function(done) { - fs.existsSync(file).should.eql(false); - send_request(file, function(err, resp) { - fs.existsSync(file).should.eql(true); - done(); - }) - }) - - it('file size equals response length', function(done) { - send_request(file, function(err, resp) { - fs.statSync(file).size.should.equal(resp.bytes); - done(); - }) - }) - - it('response pipeline is honoured (JSON is decoded by default)', function(done) { - send_request_stream(file, function(err, resp) { - // we need to wait a bit since writing to config.output - // happens independently of needle's callback logic. - setTimeout(function() { - fs.readFileSync(file).toString().should.eql('{\"foo\":\"bar\"}'); - done(); - }, 20); - }) - }) - - it('closes the file descriptor', function(done) { - var open_descriptors = get_open_file_descriptors(); - send_request(file + Math.random(), function(err, resp) { - var current_descriptors = get_open_file_descriptors(); - open_descriptors.should.eql(current_descriptors); - done() - }) - }) - - }) - - describe('for a binary file', function() { - - var pixel = Buffer.from("base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs", "base64"); - - before(function() { - handler = function(req, res) { - res.writeHead(200, { 'Content-Type': 'application/octet-stream', 'Transfer-Encoding': 'chunked' }); - res.write(pixel.slice(0, 10)); - res.write(pixel.slice(10, 20)); - res.write(pixel.slice(20, 30)); - res.write(pixel.slice(30)); - res.end(); - } - }) - - it('uses a writableStream', function(done) { - var spy = sinon.spy(fs, 'createWriteStream'); - send_request(file, function(err, resp) { - resp.statusCode.should.eql(200); - spy.called.should.eql(true); - spy.restore(); - done(); - }) - }) - - it('writes a file', function(done) { - fs.existsSync(file).should.eql(false); - send_request(file, function(err, resp) { - fs.existsSync(file).should.eql(true); - done(); - }) - }) - - it('file size equals response length', function(done) { - send_request(file, function(err, resp) { - fs.statSync(file).size.should.equal(resp.bytes); - done(); - }) - }) - - it('file is equal to original buffer', function(done) { - send_request(file, function(err, resp) { - // we need to wait a bit since writing to config.output - // happens independently of needle's callback logic. - setTimeout(function() { - fs.readFileSync(file).should.eql(pixel); - done(); - }, 20); - }) - }) - - it('returns the data in resp.body too', function(done) { - send_request(file, function(err, resp) { - resp.body.should.eql(pixel); - done(); - }) - }) - - if (process.platform != 'win32') { - it('closes the file descriptor', function(done) { - var open_descriptors = get_open_file_descriptors(); - send_request(file + Math.random(), function(err, resp) { - var current_descriptors = get_open_file_descriptors(); - open_descriptors.should.eql(current_descriptors); - done() - }) - }) - } - - }) - - }) - -}) diff --git a/node_modules/needle/test/parsing_spec.js b/node_modules/needle/test/parsing_spec.js deleted file mode 100644 index 1e117dc8ad34..000000000000 --- a/node_modules/needle/test/parsing_spec.js +++ /dev/null @@ -1,494 +0,0 @@ -var should = require('should'), - needle = require('./../'), - http = require('http'), - port = 11111, - server; - -describe('parsing', function(){ - - describe('when response is an JSON string', function(){ - - var json_string = '{"foo":"bar"}'; - - before(function(done){ - server = http.createServer(function(req, res) { - res.setHeader('Content-Type', 'application/json'); - res.end(json_string); - }).listen(port, done); - }); - - after(function(done){ - server.close(done); - }) - - describe('and parse option is not passed', function() { - - describe('with default parse_response', function() { - - before(function() { - needle.defaults().parse_response.should.eql('all') - }) - - it('should return object', function(done){ - needle.get('localhost:' + port, function(err, response, body){ - should.ifError(err); - body.should.have.property('foo', 'bar'); - done(); - }) - }) - - }) - - describe('and default parse_response is set to false', function() { - - it('does NOT return object when disabled using .defaults', function(done){ - needle.defaults({ parse_response: false }) - - needle.get('localhost:' + port, function(err, response, body) { - should.not.exist(err); - body.should.be.an.instanceof(Buffer) - body.toString().should.eql('{"foo":"bar"}'); - - needle.defaults({ parse_response: 'all' }); - done(); - }) - }) - - - }) - - }) - - describe('and parse option is true', function() { - - describe('and JSON is valid', function() { - - it('should return object', function(done) { - needle.get('localhost:' + port, { parse: true }, function(err, response, body){ - should.not.exist(err); - body.should.have.property('foo', 'bar') - done(); - }) - }) - - it('should have a .parser = json property', function(done) { - needle.get('localhost:' + port, { parse: true }, function(err, resp) { - should.not.exist(err); - resp.parser.should.eql('json'); - done(); - }) - }) - - }); - - describe('and response is empty', function() { - - var old_json_string; - - before(function() { - old_json_string = json_string; - json_string = ""; - }); - - after(function() { - json_string = old_json_string; - }); - - it('should return an empty string', function(done) { - needle.get('localhost:' + port, { parse: true }, function(err, resp) { - should.not.exist(err); - resp.body.should.equal(''); - done(); - }) - }) - - }) - - describe('and JSON is invalid', function() { - - var old_json_string; - - before(function() { - old_json_string = json_string; - json_string = "this is not going to work"; - }); - - after(function() { - json_string = old_json_string; - }); - - it('does not throw', function(done) { - (function(){ - needle.get('localhost:' + port, { parse: true }, done); - }).should.not.throw(); - }); - - it('does NOT return object', function(done) { - needle.get('localhost:' + port, { parse: true }, function(err, response, body) { - should.not.exist(err); - body.should.be.a.String; - body.toString().should.eql('this is not going to work'); - done(); - }) - }) - - }); - - }) - - describe('and parse option is false', function() { - - it('does NOT return object', function(done){ - needle.get('localhost:' + port, { parse: false }, function(err, response, body) { - should.not.exist(err); - body.should.be.an.instanceof(Buffer) - body.toString().should.eql('{"foo":"bar"}'); - done(); - }) - }) - - it('should NOT have a .parser = json property', function(done) { - needle.get('localhost:' + port, { parse: false }, function(err, resp) { - should.not.exist(err); - should.not.exist(resp.parser); - done(); - }) - }) - - }) - - describe('and parse option is "xml"', function() { - - it('does NOT return object', function(done){ - needle.get('localhost:' + port, { parse: 'xml' }, function(err, response, body) { - should.not.exist(err); - body.should.be.an.instanceof(Buffer) - body.toString().should.eql('{"foo":"bar"}'); - done(); - }) - }) - - it('should NOT have a .parser = json property', function(done) { - needle.get('localhost:' + port, { parse: 'xml' }, function(err, resp) { - should.not.exist(err); - should.not.exist(resp.parser); - done(); - }) - }) - - }) - - }); - - describe('when response is JSON \'false\'', function(){ - - var json_string = 'false'; - - before(function(done){ - server = http.createServer(function(req, res) { - res.setHeader('Content-Type', 'application/json'); - res.end(json_string); - }).listen(port, done); - }); - - after(function(done){ - server.close(done); - }) - - describe('and parse option is not passed', function() { - - it('should return object', function(done){ - needle.get('localhost:' + port, function(err, response, body){ - should.ifError(err); - body.should.equal(false); - done(); - }) - }) - - }) - - describe('and parse option is true', function() { - - describe('and JSON is valid', function() { - - it('should return object', function(done){ - needle.get('localhost:' + port, { parse: true }, function(err, response, body){ - should.not.exist(err); - body.should.equal(false) - done(); - }) - }) - - }); - - describe('and response is empty', function() { - - var old_json_string; - - before(function() { - old_json_string = json_string; - json_string = ""; - }); - - after(function() { - json_string = old_json_string; - }); - - it('should return an empty string', function(done) { - needle.get('localhost:' + port, { parse: true }, function(err, resp) { - should.not.exist(err); - resp.body.should.equal(''); - done(); - }) - }) - - }) - - describe('and JSON is invalid', function() { - - var old_json_string; - - before(function() { - old_json_string = json_string; - json_string = "this is not going to work"; - }); - - after(function() { - json_string = old_json_string; - }); - - it('does not throw', function(done) { - (function(){ - needle.get('localhost:' + port, { parse: true }, done); - }).should.not.throw(); - }); - - it('does NOT return object', function(done) { - needle.get('localhost:' + port, { parse: true }, function(err, response, body) { - should.not.exist(err); - body.should.be.a.String; - body.toString().should.eql('this is not going to work'); - done(); - }) - }) - - }); - - }) - - describe('and parse option is false', function() { - - it('does NOT return object', function(done){ - needle.get('localhost:' + port, { parse: false }, function(err, response, body) { - should.not.exist(err); - body.should.be.an.instanceof(Buffer) - body.toString().should.eql('false'); - done(); - }) - }) - - }) - - describe('and parse option is "xml"', function() { - - it('does NOT return object', function(done){ - needle.get('localhost:' + port, { parse: 'xml' }, function(err, response, body) { - should.not.exist(err); - body.should.be.an.instanceof(Buffer) - body.toString().should.eql('false'); - done(); - }) - }) - - }) - - - }); - - describe('when response is an invalid XML string', function(){ - - before(function(done){ - server = http.createServer(function(req, res) { - res.writeHeader(200, {'Content-Type': 'application/xml'}) - res.end("") - }).listen(port, done); - }); - - after(function(done){ - server.close(done); - }) - - describe('and parse_response is true', function(){ - - it('should return original string', function(done) { - needle.get('localhost:' + port, { parse_response: true }, function(err, response, body) { - should.not.exist(err); - body.should.eql('') - should.not.exist(body.name); - done(); - }) - }) - - it('should not have a .parser = xml property', function(done) { - needle.get('localhost:' + port, { parse_response: true }, function(err, resp) { - should.not.exist(err); - should.not.exist(resp.parser); - done(); - }) - }) - - }) - - describe('and parse response is false', function(){ - - it('should return valid object', function(done) { - needle.get('localhost:' + port, { parse_response: false }, function(err, response, body){ - should.not.exist(err); - body.toString().should.eql('') - done(); - }) - }) - - it('should not have a .parser property', function(done) { - needle.get('localhost:' + port, { parse_response: false }, function(err, resp) { - should.not.exist(err); - should.not.exist(resp.parser) - done(); - }) - }) - - }) - - }) - - describe('when response is a valid XML string', function(){ - - before(function(done) { - server = http.createServer(function(req, res) { - res.writeHeader(200, {'Content-Type': 'application/xml'}) - res.end("

hello

") - }).listen(port, done); - }); - - after(function(done) { - server.close(done); - }) - - describe('and parse_response is true', function(){ - - it('should return valid object', function(done) { - needle.get('localhost:' + port, { parse_response: true }, function(err, response, body) { - should.not.exist(err); - body.name.should.eql('post') - body.children[0].name.should.eql('p') - body.children[0].value.should.eql('hello') - - body.children[1].name.should.eql('p') - body.children[1].value.should.eql('world') - done(); - }) - }) - - it('should have a .parser = xml property', function(done) { - needle.get('localhost:' + port, { parse_response: true }, function(err, resp) { - should.not.exist(err); - resp.parser.should.eql('xml'); - done(); - }) - }) - - }) - - describe('and parse response is false', function(){ - - it('should return valid object', function(done) { - needle.get('localhost:' + port, { parse_response: false }, function(err, response, body){ - should.not.exist(err); - body.toString().should.eql('

hello

') - done(); - }) - }) - - it('should not have a .parser property', function(done) { - needle.get('localhost:' + port, { parse_response: false }, function(err, resp) { - should.not.exist(err); - should.not.exist(resp.parser) - done(); - }) - }) - - }) - - }) - - - describe('valid XML, using xml2js', function() { - - var parsers, origParser; - - before(function(done) { - var xml2js = require('xml2js') - parsers = require('../lib/parsers'); - origParser = parsers['application/xml']; - - var customParser = require('xml2js').parseString; - parsers.use('xml2js', ['application/xml'], function(buff, cb) { - var opts = { explicitRoot: true, explicitArray: false }; - customParser(buff, opts, cb); - }) - - server = http.createServer(function(req, res) { - res.writeHeader(200, {'Content-Type': 'application/xml'}) - res.end("

hello

world

") - }).listen(port, done); - }); - - after(function(done) { - parsers['application/xml'] = origParser; - server.close(done); - }) - - describe('and parse_response is true', function(){ - - it('should return valid object', function(done) { - needle.get('localhost:' + port, { parse_response: true }, function(err, response, body) { - should.not.exist(err); - body.should.eql({ post: { p: ['hello', 'world' ]}}) - done(); - }) - }) - - it('should have a .parser = xml property', function(done) { - needle.get('localhost:' + port, { parse_response: true }, function(err, resp) { - should.not.exist(err); - resp.parser.should.eql('xml2js'); - done(); - }) - }) - - }) - - describe('and parse response is false', function(){ - - it('should return valid object', function(done) { - needle.get('localhost:' + port, { parse_response: false }, function(err, response, body){ - should.not.exist(err); - body.toString().should.eql('

hello

world

') - done(); - }) - }) - - it('should not have a .parser property', function(done) { - needle.get('localhost:' + port, { parse_response: false }, function(err, resp) { - should.not.exist(err); - should.not.exist(resp.parser) - done(); - }) - }) - - }) - - }) - - -}) diff --git a/node_modules/needle/test/post_data_spec.js b/node_modules/needle/test/post_data_spec.js deleted file mode 100644 index d9a28c6d1688..000000000000 --- a/node_modules/needle/test/post_data_spec.js +++ /dev/null @@ -1,1021 +0,0 @@ -var needle = require('..'), - http = require('http'), - should = require('should'), - sinon = require('sinon'), - stream = require('stream'), - helpers = require('./helpers'); - -var multiparts = ['----------------------NODENEEDLEHTTPCLIENT']; -multiparts.push(['Content-Disposition: form-data; name=\"foo\"']) -multiparts.push(['\r\nbar\r\n----------------------NODENEEDLEHTTPCLIENT--']) -// multiparts.push(['Content-Disposition: form-data; name=\"test\"']) -// multiparts.push(['\r\næµè¯\r\n----------------------NODENEEDLEHTTPCLIENT--']) -// multiparts.push(['\r\n' + Buffer.from('测试').toString() + '\r\n----------------------NODENEEDLEHTTPCLIENT--']) - - -describe('post data (e.g. request body)', function() { - - var stub, spy, server; - - before(function(done) { - server = helpers.server({ port: 4321 }, done); - }) - - after(function(done) { - server.close(done); - }) - - afterEach(function() { - if (stub) stub.restore(); - if (spy) spy.restore(); - }) - - function get(data, opts, cb) { - return needle.request('get', 'http://localhost:' + 4321, data, opts, cb) - } - - function post(data, opts, cb) { - return needle.request('post', 'http://localhost:' + 4321, data, opts, cb) - } - - function spystub_request() { - var http_req = http.request; - stub = sinon.stub(http, 'request', function(opts, cb) { - var req = http_req(opts, cb); - spy = sinon.spy(req, 'write'); - return req; - }) - } - - function check_request(method) { - stub.calledOnce.should.be.true; - stub.args[0][0]['headers']['host'].should.equal('localhost:4321'); - stub.args[0][0]['method'].should.equal(method); - } - - describe('with multipart: true', function() { - - describe('when null', function() { - - it('sends request (non multipart)', function(done) { - spystub_request(); - - post(null, { multipart: true }, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('doesnt set Content-Type header', function(done) { - post(null, { multipart: true }, function(err, resp) { - should.not.exist(resp.body.headers['content-type']); - done(); - }) - }) - - it('doesnt change default Accept header', function(done) { - post(null, { multipart: true }, function(err, resp) { - // resp.body contains 'header' and 'body', mirroring what we sent - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('doesnt write anything', function(done) { - spystub_request(); - - post(null, { multipart: true }, function(err, resp) { - spy.called.should.be.false; - resp.body.body.should.eql(''); - done(); - }) - }) - - }) - - describe('when string', function() { - - it('explodes', function() { - (function() { - post('foobar', { multipart: true }) - }).should.throw() - }) - - }) - - describe('when object', function() { - - describe('get request', function() { - - it('sends request', function(done) { - spystub_request(); - - get({ foo: 'bar', test: '测试' }, { multipart: true }, function(err, resp) { - check_request('get'); - done(); - }) - }) - - it('sets Content-Type header', function(done) { - post({ foo: 'bar', test: '测试' }, { multipart: true }, function(err, resp) { - resp.body.headers['content-type'].should.equal('multipart/form-data; boundary=--------------------NODENEEDLEHTTPCLIENT'); - done(); - }) - }) - - it('doesnt change default Accept header', function(done) { - post({ foo: 'bar', test: '测试' }, { multipart: true }, function(err, resp) { - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('writes string as buffer', function(done) { - spystub_request(); - - get({ foo: 'bar' }, { multipart: true }, function(err, resp) { - spy.called.should.be.true; - - spy.args[0][0].should.be.an.instanceof(String); - spy.args[0][0].toString().should.equal(multiparts.join('\r\n')); - resp.body.body.should.eql(multiparts.join('\r\n')); - done(); - }) - }) - - it('writes japanese chars correctly as binary', function(done) { - spystub_request(); - - get({ foo: 'bar', test: '测试' }, { multipart: true }, function(err, resp) { - spy.called.should.be.true; - - spy.args[0][0].should.be.an.instanceof(String); - Buffer.from(spy.args[0][0]).toString('hex').should.eql('2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4e4f44454e4545444c4548545450434c49454e540d0a436f6e74656e742d446973706f736974696f6e3a20666f726d2d646174613b206e616d653d22666f6f220d0a0d0a6261720d0a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4e4f44454e4545444c4548545450434c49454e540d0a436f6e74656e742d446973706f736974696f6e3a20666f726d2d646174613b206e616d653d2274657374220d0a0d0ac3a6c2b5c28bc3a8c2afc2950d0a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4e4f44454e4545444c4548545450434c49454e542d2d') - done(); - }) - }) - - - }) - - describe('post request', function() { - - it('sends request', function(done) { - spystub_request(); - - post({ foo: 'bar', test: '测试' }, { multipart: true }, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('writes string as buffer', function(done) { - spystub_request(); - - post({ foo: 'bar' }, { multipart: true }, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].should.be.an.instanceof(String); - spy.args[0][0].toString().should.equal(multiparts.join('\r\n')); - resp.body.body.should.eql(multiparts.join('\r\n')); - done(); - }) - }) - - it('writes japanese chars correctly as binary', function(done) { - spystub_request(); - - post({ foo: 'bar', test: '测试' }, { multipart: true }, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].should.be.an.instanceof(String); - Buffer.from(spy.args[0][0]).toString('hex').should.eql('2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4e4f44454e4545444c4548545450434c49454e540d0a436f6e74656e742d446973706f736974696f6e3a20666f726d2d646174613b206e616d653d22666f6f220d0a0d0a6261720d0a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4e4f44454e4545444c4548545450434c49454e540d0a436f6e74656e742d446973706f736974696f6e3a20666f726d2d646174613b206e616d653d2274657374220d0a0d0ac3a6c2b5c28bc3a8c2afc2950d0a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4e4f44454e4545444c4548545450434c49454e542d2d') - done(); - }) - }) - - }) - - }) - - describe('when stream', function() { - - var stream_for_multipart; - - before(function() { - stream_for_multipart = new stream.Readable(); - stream_for_multipart._read = function() { - this.push('foobar'); - this.push(null); - } - }) - - it('explodes', function() { - (function() { - post(stream_for_multipart, { multipart: true }) - }).should.throw() - }) - - }) - - }) - - describe('non multipart', function() { - - describe('when null', function() { - - describe('get request', function() { - - it('sends request', function(done) { - spystub_request(); - - get(null, {}, function(err, resp) { - check_request('get'); - done(); - }) - }) - - it('doesnt write anything', function(done) { - spystub_request(); - - get(null, {}, function(err, resp) { - spy.called.should.be.false; - resp.body.body.should.eql(''); - done(); - }) - }) - - }) - - describe('post request', function() { - - it('sends request', function(done) { - spystub_request(); - - post(null, {}, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('doesnt write anything', function(done) { - spystub_request(); - - post(null, {}, function(err, resp) { - spy.called.should.be.false; - resp.body.body.should.eql(''); - done(); - }) - }) - - }) - - }) - - describe('when string with no equal sign', function() { - - describe('get request', function() { - - it('explodes', function() { - (function() { - get('foobar', {}) - }).should.throw() - }) - - }) - - describe('post request', function() { - - it('sends request', function(done) { - spystub_request(); - - post('foobar', {}, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('writes string as buffer', function(done) { - spystub_request(); - - post('foobar', {}, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].should.be.an.instanceof(Buffer); - spy.args[0][0].toString().should.equal('foobar'); - resp.body.body.should.eql('foobar'); - done(); - }) - }) - - }) - - }) - - describe('when string WITH equal sign', function() { - - describe('get request', function() { - - describe('with json: false (default)', function() { - - it('sends request, adding data as querystring', function(done) { - spystub_request(); - - get('foo=bar', { json: false }, function(err, resp) { - check_request('get'); - stub.args[0][0]['path'].should.equal('/?foo=bar') - done(); - }) - }) - - it('doesnt set Content-Type header', function(done) { - get('foo=bar', { json: false }, function(err, resp) { - // resp.body contains 'header' and 'body', mirroring what we sent - should.not.exist(resp.body.headers['content-type']); - done(); - }) - }) - - it('doesnt change default Accept header', function(done) { - get('foo=bar', { json: false }, function(err, resp) { - // resp.body contains 'header' and 'body', mirroring what we sent - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('doesnt write anything', function(done) { - get('foo=bar', { json: false }, function(err, resp) { - spy.called.should.be.false; - resp.body.body.should.eql(''); - done(); - }) - }) - - }) - - describe('with json: true', function() { - - it('sends request, without setting a querystring', function(done) { - spystub_request(); - - get('foo=bar', { json: true }, function(err, resp) { - check_request('get'); - stub.args[0][0]['path'].should.equal('/') - done(); - }) - }) - - it('sets Content-Type header', function(done) { - get('foo=bar', { json: true }, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/json; charset=utf-8'); - done(); - }) - }) - - it('set Accept header to application/json', function(done) { - get('foo=bar', { json: true }, function(err, resp) { - resp.body.headers['accept'].should.equal('application/json'); - done(); - }) - }) - - it('writes raw string (assuming it already is JSON, so no JSON.stringify)', function(done) { - get('foo=bar', { json: true }, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].toString().should.eql('foo=bar') - resp.body.body.should.eql('foo=bar'); - done(); - }) - }) - - }) - - }) - - describe('post request', function() { - - describe('with json: false (default)', function() { - - it('sends request', function(done) { - spystub_request(); - - post('foo=bar', { json: false }, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('sets Content-Type header to www-form-urlencoded', function(done) { - post('foo=bar', { json: false }, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/x-www-form-urlencoded'); - done(); - }) - }) - - it('doesnt change default Accept header', function(done) { - post('foo=bar', { json: false }, function(err, resp) { - // resp.body contains 'header' and 'body', mirroring what we sent - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('writes as buffer', function(done) { - post('foo=bar', { json: false }, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].should.be.an.instanceof(Buffer); - spy.args[0][0].toString().should.equal('foo=bar'); - resp.body.body.should.eql('foo=bar'); - done(); - }) - }) - - }) - - describe('with json: true', function() { - - it('sends request', function(done) { - spystub_request(); - - post('foo=bar', { json: true }, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('sets Content-Type header', function(done) { - post('foo=bar', { json: true }, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/json; charset=utf-8'); - done(); - }) - }) - - it('set Accept header to application/json', function(done) { - post('foo=bar', { json: true }, function(err, resp) { - resp.body.headers['accept'].should.equal('application/json'); - done(); - }) - }) - - it('writes raw string (assuming it already is JSON, so no JSON.stringify)', function(done) { - post('foo=bar', { json: true }, function(err, resp) { - spy.called.should.be.true; - var json = JSON.stringify('foo=bar'); - spy.args[0][0].toString().should.eql('foo=bar') - resp.body.body.should.eql('foo=bar'); - done(); - }) - }) - - }) - - }) - - }) - - describe('when object', function() { - - describe('get request', function() { - - describe('with json: false (default)', function() { - - it('sends request, adding data as querystring', function(done) { - spystub_request(); - - get({ foo: 'bar', test: '测试' }, { json: false }, function(err, resp) { - check_request('get'); - stub.args[0][0]['path'].should.equal('/?foo=bar&test=%E6%B5%8B%E8%AF%95') - done(); - }) - }) - - it('doesnt set Content-Type header', function(done) { - get({ foo: 'bar', test: '测试' }, { json: false }, function(err, resp) { - // resp.body contains 'header' and 'body', mirroring what we sent - should.not.exist(resp.body.headers['content-type']); - done(); - }) - }) - - it('doesnt change default Accept header', function(done) { - get({ foo: 'bar', test: '测试' }, { json: false }, function(err, resp) { - // resp.body contains 'header' and 'body', mirroring what we sent - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('doesnt write anything', function(done) { - get({ foo: 'bar', test: '测试' }, { json: false }, function(err, resp) { - spy.called.should.be.false; - resp.body.body.should.eql(''); - done(); - }) - }) - - }) - - describe('with json: true', function() { - - it('sends request, without setting a querystring', function(done) { - spystub_request(); - - get({ foo: 'bar', test: '测试' }, { json: true }, function(err, resp) { - check_request('get'); - stub.args[0][0]['path'].should.equal('/') - done(); - }) - }) - - it('sets Content-Type header', function(done) { - get({ foo: 'bar', test: '测试' }, { json: true }, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/json; charset=utf-8'); - done(); - }) - }) - - it('set Accept header to application/json', function(done) { - get({ foo: 'bar', test: '测试' }, { json: true }, function(err, resp) { - resp.body.headers['accept'].should.equal('application/json'); - done(); - }) - }) - - it('writes JSON.stringify version of object', function(done) { - get({ foo: 'bar', test: '测试' }, { json: true }, function(err, resp) { - spy.called.should.be.true; - var json = JSON.stringify({ foo: 'bar', test: '测试' }) - spy.args[0][0].toString().should.eql(json) - resp.body.body.should.eql(json); - done(); - }) - }) - - }) - - }) - - describe('post request', function() { - - describe('with json: false (default)', function() { - - it('sends request', function(done) { - spystub_request(); - - post({ foo: 'bar', test: '测试' }, { json: false }, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('sets Content-Type header to www-form-urlencoded', function(done) { - post({ foo: 'bar', test: '测试' }, { json: false }, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/x-www-form-urlencoded'); - done(); - }) - }) - - it('doesnt change default Accept header', function(done) { - post({ foo: 'bar', test: '测试' }, { json: false }, function(err, resp) { - // resp.body contains 'header' and 'body', mirroring what we sent - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('writes as buffer', function(done) { - post({ foo: 'bar', test: '测试' }, { json: false }, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].should.be.an.instanceof(Buffer); - spy.args[0][0].toString().should.equal('foo=bar&test=%E6%B5%8B%E8%AF%95'); - resp.body.body.should.eql('foo=bar&test=%E6%B5%8B%E8%AF%95'); - done(); - }) - }) - - }) - - describe('with json: false and content_type = "application/json"', function() { - - var opts = { json: false, content_type: 'application/json' }; - - it('sends request', function(done) { - spystub_request(); - - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('sets Content-Type header to application/json', function(done) { - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/json'); - done(); - }) - }) - - it('doesnt change default Accept header', function(done) { - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - // resp.body contains 'header' and 'body', mirroring what we sent - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('writes as buffer', function(done) { - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].constructor.name.should.eql('Buffer'); - spy.args[0][0].toString().should.equal('foo=bar&test=%E6%B5%8B%E8%AF%95'); - resp.body.body.should.eql('foo=bar&test=%E6%B5%8B%E8%AF%95'); - done(); - }) - }) - - }) - - describe('with json: undefined but content-type = application/json', function() { - - var opts = { headers: { 'content-type': 'application/json' } }; - - it('sends request', function(done) { - spystub_request(); - - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('doesnt change Content-Type header', function(done) { - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/json'); - done(); - }) - }) - - it('leaves default Accept header', function(done) { - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('writes JSON.stringified object', function(done) { - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - spy.called.should.be.true; - var json = JSON.stringify({ foo: 'bar', test: '测试' }) - spy.args[0][0].toString().should.eql(json) - resp.body.body.should.eql(json); - done(); - }) - }) - }) - - describe('with json: true', function() { - - it('sends request', function(done) { - spystub_request(); - - post({ foo: 'bar', test: '测试' }, { json: true }, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('sets Content-Type header', function(done) { - post({ foo: 'bar', test: '测试' }, { json: true }, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/json; charset=utf-8'); - done(); - }) - }) - - it('set Accept header to application/json', function(done) { - post({ foo: 'bar', test: '测试' }, { json: true }, function(err, resp) { - resp.body.headers['accept'].should.equal('application/json'); - done(); - }) - }) - - it('writes JSON.stringified object', function(done) { - post({ foo: 'bar', test: '测试' }, { json: true }, function(err, resp) { - spy.called.should.be.true; - var json = JSON.stringify({ foo: 'bar', test: '测试' }) - spy.args[0][0].toString().should.eql(json) - resp.body.body.should.eql(json); - done(); - }) - }) - - }) - - - describe('with json: true and content_type: */* (passed, not default)', function() { - - var opts = { json: true, accept: '*/*' }; - - it('sends request', function(done) { - spystub_request(); - - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('sets Content-Type header to application/json', function(done) { - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/json; charset=utf-8'); - done(); - }) - }) - - it('respects Accept header set by user', function(done) { - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('writes JSON.stringified object', function(done) { - post({ foo: 'bar', test: '测试' }, opts, function(err, resp) { - spy.called.should.be.true; - var json = JSON.stringify({ foo: 'bar', test: '测试' }) - spy.args[0][0].toString().should.eql(json) - resp.body.body.should.eql(json); - done(); - }) - }) - - }) - - }) - - }) - - describe('when buffer', function() { - - describe('get request', function() { - - describe('with json: false (default)', function() { - - it('sends request', function(done) { - spystub_request(); - - get(Buffer.from('foobar'), { json: false }, function(err, resp) { - check_request('get'); - done(); - }) - }) - - it('sets Content-Type header', function(done) { - get(Buffer.from('foobar'), { json: false }, function(err, resp) { - // should.not.exist(resp.body.headers['content-type']); - resp.body.headers['content-type'].should.equal('application/x-www-form-urlencoded'); - - done(); - }) - }) - - it('doesnt change default Accept header', function(done) { - get(Buffer.from('foobar'), { json: false }, function(err, resp) { - // resp.body contains 'header' and 'body', mirroring what we sent - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('writes as buffer', function(done) { - get(Buffer.from('foobar'), { json: false }, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].should.be.an.instanceof(Buffer); - spy.args[0][0].toString().should.equal('foobar'); - resp.body.body.should.eql('foobar'); - done(); - }) - }) - - }) - - describe('with json: true', function() { - - it('sends request, without setting a querystring', function(done) { - spystub_request(); - - get(Buffer.from('foobar'), { json: true }, function(err, resp) { - check_request('get'); - done(); - }) - }) - - it('sets Content-Type header', function(done) { - get(Buffer.from('foobar'), { json: true }, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/json; charset=utf-8'); - done(); - }) - }) - - it('set Accept header to application/json', function(done) { - get(Buffer.from('foobar'), { json: true }, function(err, resp) { - resp.body.headers['accept'].should.equal('application/json'); - done(); - }) - }) - - it('writes JSON.stringify version of object', function(done) { - get(Buffer.from('foobar'), { json: true }, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].toString().should.eql('foobar') - resp.body.body.should.eql('foobar'); - done(); - }) - }) - - }) - - }) - - describe('post request', function() { - - describe('with json: false (default)', function() { - - it('sends request', function(done) { - spystub_request(); - - post(Buffer.from('foobar'), { json: false }, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('sets Content-Type header to www-form-urlencoded', function(done) { - post(Buffer.from('foobar'), { json: false }, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/x-www-form-urlencoded'); - done(); - }) - }) - - it('doesnt change default Accept header', function(done) { - post(Buffer.from('foobar'), { json: false }, function(err, resp) { - // resp.body contains 'header' and 'body', mirroring what we sent - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('writes as buffer', function(done) { - post(Buffer.from('foobar'), { json: false }, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].should.be.an.instanceof(Buffer); - spy.args[0][0].toString().should.equal('foobar'); - resp.body.body.should.eql('foobar'); - done(); - }) - }) - - }) - - describe('with json: true', function() { - - it('sends request', function(done) { - spystub_request(); - - post(Buffer.from('foobar'), { json: true }, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('sets Content-Type header', function(done) { - post(Buffer.from('foobar'), { json: true }, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/json; charset=utf-8'); - done(); - }) - }) - - it('set Accept header to application/json', function(done) { - post(Buffer.from('foobar'), { json: true }, function(err, resp) { - resp.body.headers['accept'].should.equal('application/json'); - done(); - }) - }) - - it('passes raw buffer (assuming its a JSON string beneath)', function(done) { - post(Buffer.from('foobar'), { json: true }, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].toString().should.eql('foobar') - resp.body.body.should.eql('foobar'); - done(); - }) - }) - - }) - - }) - - }) - - describe('when stream', function() { - - var input_stream; - - beforeEach(function() { - input_stream = new stream.Readable(); - input_stream._read = function() { - this.push('foobar'); - this.push(null); - } - }) - - describe('get request', function() { - - it('explodes', function() { - (function() { - get(input_stream, {}) - }).should.throw() - }) - - }); - - describe('post request', function() { - - describe('with json: false (default)', function() { - - it('sends request', function(done) { - spystub_request(); - - post(input_stream, { json: false }, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('sets Content-Type header to www-form-urlencoded', function(done) { - post(input_stream, { json: false }, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/x-www-form-urlencoded'); - done(); - }) - }) - - it('doesnt change default Accept header', function(done) { - post(input_stream, { json: false }, function(err, resp) { - // resp.body contains 'header' and 'body', mirroring what we sent - resp.body.headers['accept'].should.equal('*/*'); - done(); - }) - }) - - it('writes as buffer', function(done) { - post(input_stream, { json: false }, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].should.be.an.instanceof(Buffer); - spy.args[0][0].toString().should.equal('foobar'); - resp.body.body.should.eql('foobar'); - done(); - }) - }) - - }) - - describe('with json: true', function() { - - it('sends request', function(done) { - spystub_request(); - - post(input_stream, { json: true }, function(err, resp) { - check_request('post'); - done(); - }) - }) - - it('sets Content-Type header', function(done) { - post(input_stream, { json: true }, function(err, resp) { - resp.body.headers['content-type'].should.equal('application/json; charset=utf-8'); - done(); - }) - }) - - it('set Accept header to application/json', function(done) { - post(input_stream, { json: true }, function(err, resp) { - resp.body.headers['accept'].should.equal('application/json'); - done(); - }) - }) - - it('writes JSON.stringified object', function(done) { - post(input_stream, { json: true }, function(err, resp) { - spy.called.should.be.true; - spy.args[0][0].toString().should.eql('foobar') - resp.body.body.should.eql('foobar'); - done(); - }) - }) - - }) - - }) - - }) - - }) - -}) diff --git a/node_modules/needle/test/proxy_spec.js b/node_modules/needle/test/proxy_spec.js deleted file mode 100644 index 9526e7f7a646..000000000000 --- a/node_modules/needle/test/proxy_spec.js +++ /dev/null @@ -1,202 +0,0 @@ -var helpers = require('./helpers'), - should = require('should'), - sinon = require('sinon'), - http = require('http'), - needle = require('./../'); - -var port = 7707; -var url = 'localhost:' + port; -var nonexisting_host = 'awepfokawepofawe.com'; - -describe('proxy option', function() { - - var spy, opts; - - function send_request(opts, done) { - if (spy) spy.restore(); - spy = sinon.spy(http, 'request'); - needle.get(url, opts, done); - } - - ////////////////////// - // proxy opts helpers - - function not_proxied(done) { - return function(err, resp) { - var path = spy.args[0][0].path; - path.should.eql('/'); // not the full original URI - spy.restore(); - done(); - } - } - - function proxied(host, port, done) { - return function(err, resp) { - var path = spy.args[0][0].path; - path.should.eql('http://' + url); // the full original URI - - var http_host = spy.args[0][0].host; - if (http_host) http_host.should.eql(host); - - var http_port = spy.args[0][0].port; - if (http_port) http_port.should.eql(port); - - spy.restore(); - done(); - } - } - - ////////////////////// - // auth helpers - - function get_auth(header) { - var token = header.split(/\s+/).pop(); - return token && Buffer.from(token, 'base64').toString().split(':'); - } - - function no_proxy_auth(done) { - return function(err, resp) { - var headers = spy.args[0][0].headers; - Object.keys(headers).should.not.containEql('proxy-authorization'); - done(); - } - } - - function header_set(name, user, pass, done) { - return function(err, resp) { - var headers = spy.args[0][0].headers; - var auth = get_auth(headers[name]); - auth[0].should.eql(user); - auth[1].should.eql(pass); - done(); - } - } - - function proxy_auth_set(user, pass, done) { - return header_set('proxy-authorization', user, pass, done); - } - - function basic_auth_set(user, pass, done) { - return header_set('authorization', user, pass, done); - } - - after(function() { - spy.restore(); - }) - - describe('when null proxy is passed', function() { - - it('does not proxy', function(done) { - send_request({ proxy: null }, not_proxied(done)) - }) - - describe('but defaults has been set', function() { - - before(function() { - needle.defaults({ proxy: 'foobar' }); - }) - - after(function() { - needle.defaults({ proxy: null }); - }) - - it('tries to proxy anyway', function(done) { - send_request({}, proxied('foobar', 80, done)) - }) - - }) - - }) - - describe('when weird string is passed', function() { - - it('tries to proxy anyway', function(done) { - send_request({ proxy: 'alfalfa' }, proxied('alfalfa', 80, done)) - }) - }) - - describe('when valid url is passed', function() { - - it('proxies request', function(done) { - send_request({ proxy: nonexisting_host + ':123/done' }, proxied(nonexisting_host, '123', done)) - }) - - it('does not set a Proxy-Authorization header', function(done) { - send_request({ proxy: nonexisting_host + ':123/done' }, no_proxy_auth(done)); - }) - - describe('and proxy url contains user:pass', function() { - - before(function() { - opts = { - proxy: 'http://mj:x@' + nonexisting_host + ':123/done' - } - }) - - it('proxies request', function(done) { - send_request(opts, proxied(nonexisting_host, '123', done)) - }) - - it('sets Proxy-Authorization header', function(done) { - send_request(opts, proxy_auth_set('mj', 'x', done)); - }) - - }) - - describe('and a proxy_user is passed', function() { - - before(function() { - opts = { - proxy: nonexisting_host + ':123', - proxy_user: 'someone', - proxy_pass: 'else' - } - }) - - it('proxies request', function(done) { - send_request(opts, proxied(nonexisting_host, '123', done)) - }) - - it('sets Proxy-Authorization header', function(done) { - send_request(opts, proxy_auth_set('someone', 'else', done)); - }) - - describe('and url also contains user:pass', function() { - - it('url user:pass wins', function(done) { - var opts = { - proxy: 'http://xxx:yyy@' + nonexisting_host + ':123', - proxy_user: 'someone', - proxy_pass: 'else' - } - - send_request(opts, proxy_auth_set('xxx', 'yyy', done)); - }) - - }) - - describe('and options.username is also present', function() { - - before(function() { - opts = { proxy_user: 'foobar', username: 'someone' }; - }) - - it('a separate Authorization header is set', function(done) { - var opts = { - proxy: nonexisting_host + ':123', - proxy_user: 'someone', - proxy_pass: 'else', - username: 'test', - password: 'X' - } - - send_request(opts, basic_auth_set('test', 'X', done)); - }) - - }) - - }) - - }) - -}) diff --git a/node_modules/needle/test/querystring_spec.js b/node_modules/needle/test/querystring_spec.js deleted file mode 100644 index 34c1748c6f2f..000000000000 --- a/node_modules/needle/test/querystring_spec.js +++ /dev/null @@ -1,128 +0,0 @@ -var should = require('should'), - stringify = require('../lib/querystring').build; - -describe('stringify', function() { - - describe('with null', function() { - - it('throws', function() { - (function() { - var res = stringify(null); - }).should.throw(); - }) - - }) - - describe('with a number', function() { - - it('throws', function() { - (function() { - var res = stringify(100); - }).should.throw(); - }) - - }) - - describe('with a string', function() { - - describe('that is empty', function() { - - it('throws', function() { - (function() { - var res = stringify(''); - }).should.throw(); - }) - - }) - - describe('that doesnt contain an equal sign', function() { - - it('throws', function() { - (function() { - var res = stringify('boomshagalaga'); - }).should.throw(); - }) - - }) - - describe('that contains an equal sign', function() { - - it('works', function() { - var res = stringify('hello=123'); - res.should.eql('hello=123'); - }) - - }) - - }) - - describe('with an array', function() { - - describe('with key val objects', function() { - - it('works', function() { - var res = stringify([ {foo: 'bar'} ]); - res.should.eql('foo=bar'); - }) - - }) - - describe('where all elements are strings with an equal sign', function() { - - it('works', function() { - var res = stringify([ 'bar=123', 'quux=' ]); - res.should.eql('bar=123&quux='); - }) - - }) - - describe('with random words', function() { - - it('throws', function() { - (function() { - var res = stringify(['hello', 'there']); - }).should.throw(); - }) - - }) - - describe('with integers', function() { - - it('throws', function() { - (function() { - var res = stringify([123, 432]); - }).should.throw(); - }) - - }) - - }) - - describe('with an object', function() { - - it('works', function() { - var res = stringify({ test: 100 }); - res.should.eql('test=100'); - }) - - describe('with object where val is an array', function() { - - it('works', function() { - var res = stringify({ foo: ['bar', 'baz'] }); - res.should.eql('foo[]=bar&foo[]=baz'); - }) - - }) - - describe('with object where val is an array of key val objects', function() { - - it('works', function() { - var res = stringify({ foo: [{'1': 'bar'}, {'2': 'baz'}] }); - res.should.eql('foo[][1]=bar&foo[][2]=baz'); - }) - - }) - - }) - -}) diff --git a/node_modules/needle/test/redirect_spec.js b/node_modules/needle/test/redirect_spec.js deleted file mode 100644 index c3942e279b29..000000000000 --- a/node_modules/needle/test/redirect_spec.js +++ /dev/null @@ -1,394 +0,0 @@ -var helpers = require('./helpers'), - should = require('should'), - sinon = require('sinon'), - needle = require('./../'); - -var ports = { - http : 8888, - https : 9999 -} - -var protocols = { - http : require('http'), - https : require('https') -} - -var code = 301; -var location; // var to set the response location - -function response_code() { - return code; -} - -function response_headers() { - return { 'Content-Type': 'text/plain', 'Location': location } -} - -describe('redirects', function() { - - var spies = {}, - servers = {}; - - var current_protocol; - var hostname = require('os').hostname(); - - // open two servers, one that responds to a redirect - before(function(done) { - - var conf = { - port : ports.http, - code : response_code, - headers : response_headers - } - - servers.http = helpers.server(conf, function() { - conf.port = ports.https; - conf.protocol = 'https'; - servers.https = helpers.server(conf, done); - }); - }) - - after(function(done) { - servers.http.close(function() { - servers.https.close(done); - }); - }) - - var prots = {'http': 'https'}; - Object.keys(prots).forEach(function(protocol) { - - current_protocol = protocol; - var other_protocol = protocol == 'http' ? 'https' : 'http'; - - var opts, // each test will modify this - host = '127.0.0.1', - url = protocol + '://' + host + ':' + ports[protocol] + '/hello'; - - function send_request(opts, cb) { - opts.rejectUnauthorized = false; - // console.log(' -- sending request ' + url + ' -- redirect to ' + location); - needle.post(url, { foo: 'bar' }, opts, cb); - } - - function not_followed(done) { - send_request(opts, function(err, resp) { - resp.statusCode.should.eql(301); - if (current_protocol == 'http') { - spies.http.callCount.should.eql(1); // only original request - spies.https.callCount.should.eql(0); - } else { - spies.http.callCount.should.eql(0); - spies.https.callCount.should.eql(1); // only original request - } - done(); - }) - } - - function followed_same_protocol(done) { - send_request(opts, function(err, resp) { - // the original request plus the redirect one - spies[current_protocol].callCount.should.eql(2); - done(); - }) - - } - - function followed_other_protocol(done) { - send_request(opts, function(err, resp) { - // on new-ish node versions, https.request calls http.request internally, - // so we need to amount for that additional call. - // update: this doesn't happen on node > 10.x - - var node_major_ver = process.version.split('.')[0].replace('v', ''); - var http_calls = protocols.http.Agent.defaultMaxSockets == Infinity && parseInt(node_major_ver) < 10 ? 2 : 1; - - spies.http.callCount.should.eql(http_calls); // the one(s) from http.request - spies.https.callCount.should.eql(1); // the one from https.request (redirect) - done(); - }) - } - - // set a spy on [protocol].request - // so we can see how many times a request was made - before(function() { - spies.http = sinon.spy(protocols.http, 'request'); - spies.https = sinon.spy(protocols.https, 'request'); - }) - - // and make sure it is restored after each test - afterEach(function() { - spies.http.reset(); - spies.https.reset(); - }) - - after(function() { - spies.http.restore(); - spies.https.restore(); - }) - - describe('when overriding defaults', function() { - - before(function() { - needle.defaults({ follow_max: 10 }); - opts = {}; - }) - - after(function() { - // reset values to previous - needle.defaults({ follow_max: 0 }); - }) - - describe('and redirected to the same path on same host and protocol', function() { - before(function() { - location = url; - }) - it('does not follow redirect', not_followed); - }) - - describe('and redirected to the same path on same host and different protocol', function() { - before(function() { - location = url.replace(protocol, other_protocol).replace(ports[protocol], ports[other_protocol]); - }) - - it('follows redirect', followed_other_protocol); - }) - - describe('and redirected to a different path on same host, same protocol', function() { - before(function() { - location = url.replace('/hello', '/goodbye'); - }) - it('follows redirect', followed_same_protocol); - }) - - describe('and redirected to a different path on same host, different protocol', function() { - before(function() { - location = url.replace('/hello', '/goodbye').replace(protocol, other_protocol).replace(ports[protocol], ports[other_protocol]); - }) - it('follows redirect', followed_other_protocol); - }) - - describe('and redirected to same path on another host, same protocol', function() { - before(function() { - location = url.replace(host, hostname); - }) - it('follows redirect', followed_same_protocol); - }) - - describe('and redirected to same path on another host, different protocol', function() { - before(function() { - location = url.replace(host, hostname).replace(protocol, other_protocol).replace(ports[protocol], ports[other_protocol]); - }) - it('follows redirect', followed_other_protocol); - }) - - }) - - // false and null have the same result - var values = [false, null]; - values.forEach(function(value) { - - describe('when follow is ' + value, function() { - - before(function() { - opts = { follow: value }; - }) - - - - describe('and redirected to the same path on same host and protocol', function() { - before(function() { - location = url; - }) - - it('throws an error', function() { - (function() { - send_request(opts, function() { }); - }).should.throw; - }) - - }) - - }) - - }) - - describe('when follow is true', function() { - - before(function() { - opts = { follow: true }; - }) - - describe('and redirected to the same path on same host and protocol', function() { - before(function() { location = url }) - - it('throws an error', function() { - (function() { - send_request(opts, function() { }); - }).should.throw; - }) - - }) - - }) - - describe('when follow is > 0', function() { - - before(function() { - needle.defaults({ follow: 10 }); - }) - - after(function() { - needle.defaults({ follow: 0 }); - }) - - describe('when keep_method is false', function() { - - before(function() { - opts = { follow_keep_method: false }; - }) - - // defaults to follow host and protocol - describe('and redirected to the same path on same host and different protocol', function() { - - before(function() { - location = url.replace(protocol, other_protocol); - }) - - it('follows redirect', followed_other_protocol); - - it('sends a GET request with no data', function(done) { - send_request(opts, function(err, resp) { - spies.http.args[0][0].method.should.eql('GET'); - // spy.args[0][3].should.eql(null); - done(); - }) - }) - - }) - - }) - - describe('and set_referer is true', function() { - - before(function() { - opts = { follow_set_referer: true }; - }) - - // defaults to follow host and protocol - describe('and redirected to the same path on same host and different protocol', function() { - - before(function() { - location = url.replace(protocol, other_protocol); - }) - - it('follows redirect', followed_other_protocol); - - it('sets Referer header when following redirect', function(done) { - send_request(opts, function(err, resp) { - spies.http.args[0][0].headers['referer'].should.eql("http://" + host + ":8888/hello"); - // spies.http.args[0][3].should.eql({ foo: 'bar'}); - done(); - }) - }) - - }) - - }) - - describe('and keep_method is true', function() { - - before(function() { - opts = { follow_keep_method: true }; - }) - - // defaults to follow host and protocol - describe('and redirected to the same path on same host and different protocol', function() { - - before(function() { - location = url.replace(protocol, other_protocol); - }) - - it('follows redirect', followed_other_protocol); - - it('sends a POST request with the original data', function(done) { - send_request(opts, function(err, resp) { - spies.http.args[0][0].method.should.eql('post'); - // spies.http.args[0][3].should.eql({ foo: 'bar'}); - done(); - }) - }) - - }) - - }) - - describe('and if_same_host is false', function() { - - before(function() { - opts = { follow_if_same_host: false }; - }) - - // by default it will follow other protocols - describe('and redirected to same path on another domain, same protocol', function() { - before(function() { - location = url.replace(host, hostname); - }) - it('follows redirect', followed_same_protocol); - }) - - }) - - describe('and if_same_host is true', function() { - - before(function() { - opts = { follow_if_same_host: true }; - }) - - // by default it will follow other protocols - describe('and redirected to same path on another domain, same protocol', function() { - before(function() { - location = url.replace(host, hostname); - }) - - it('does not follow redirect', not_followed); - }) - - }) - - describe('and if_same_protocol is false', function() { - - before(function() { - opts = { follow_if_same_protocol: false }; - }) - - // by default it will follow other hosts - describe('and redirected to same path on another domain, different protocol', function() { - before(function() { - location = url.replace(host, hostname).replace(protocol, other_protocol).replace(ports[protocol], ports[other_protocol]); - }) - it('follows redirect', followed_other_protocol); - }) - - }) - - describe('and if_same_protocol is true', function() { - - before(function() { - opts = { follow_if_same_protocol: true }; - }) - - // by default it will follow other hosts - describe('and redirected to same path on another domain, different protocol', function() { - before(function() { - location = url.replace(host, hostname).replace(protocol, other_protocol).replace(ports[protocol], ports[other_protocol]); - }) - it('does not follow redirect', not_followed); - }) - - }) - - }) - - }) - -}); diff --git a/node_modules/needle/test/redirect_with_timeout.js b/node_modules/needle/test/redirect_with_timeout.js deleted file mode 100644 index 7e8e02e630e8..000000000000 --- a/node_modules/needle/test/redirect_with_timeout.js +++ /dev/null @@ -1,45 +0,0 @@ -var should = require('should') -var needle = require('./../') - -describe('follow redirects when read_timeout is set', function () { - - it('clear timeout before following redirect', function (done) { - var opts = { - open_timeout: 1000, - read_timeout: 3000, - follow: 5, - user_agent: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36' - } - - var timedOut = 0 - var redirects = 0 - - var timer = setTimeout(function () { - var hasRedirects = redirects > 0 - hasRedirects.should.equal(true) - done() - }, opts.read_timeout || 3000) - - var resp = needle.get('http://google.com/', opts, function (err, resp, body) { - var noErr = err === null - var hasBody = body.length > 0 - noErr.should.equal(true); - hasBody.should.equal(true); - }); - - resp.on('redirect', function (location) { - redirects++ - // console.info(' Redirected to ', location) - }) - - resp.on('timeout', function (type) { - timedOut++ - timedOut.should.equal(0) - // console.error(' ', type, 'timeout') - clearTimeout(timer) - done() - }) - - }).timeout(30000) - -}) \ No newline at end of file diff --git a/node_modules/needle/test/request_stream_spec.js b/node_modules/needle/test/request_stream_spec.js deleted file mode 100644 index bfd2d50119f8..000000000000 --- a/node_modules/needle/test/request_stream_spec.js +++ /dev/null @@ -1,236 +0,0 @@ -var fs = require('fs'), - needle = require('..'), - stream = require('stream'), - http = require('http'), - should = require('should'), - sinon = require('sinon'); - -var port = 2233; - -var node_major_ver = parseInt(process.version.split('.')[0].replace('v', '')); - -describe('request stream length', function() { - - var server, writable; - - function createServer() { - return http.createServer(function(req, res) { - - req.on('data', function(chunk) { - // console.log(chunk.length); - }) - - req.on('end', function() { - res.writeHeader(200, { 'Content-Type': 'application/json'}) - res.end(JSON.stringify({ headers: req.headers })) - }) - - }) - } - - before(function(done) { - server = createServer(); - server.listen(port, done) - }) - - beforeEach(function() { - writable = new stream.Readable(); - writable._read = function() { - this.push('hello world'); - this.push(null); - } - }) - - after(function(done) { - server.close(done) - }) - - function send_request(opts, cb) { - needle.post('http://localhost:' + port, writable, opts, function(err, resp) { - cb(err, resp) - }) - } - - describe('no stream_length set', function() { - - it('doesnt set Content-Length header', function(done) { - send_request({}, function(err, resp) { - should.not.exist(resp.body.headers['content-length']); - done() - }) - }) - - if (node_major_ver >= 10) { - it('returns 400 if Transfer-Encoding is set to a blank string', function(done) { - send_request({ headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(400); - done() - }) - }) - } else { - it('doesnt work if Transfer-Encoding is set to a blank string', function(done) { - send_request({ headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - err.code.should.eql('ECONNRESET'); - done() - }) - }) - } - - it('works if Transfer-Encoding is not set', function(done) { - send_request({}, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(200); - done() - }) - }) - - }) - - describe('stream_length set to invalid value', function() { - - if (node_major_ver >= 10) { - - it('returns 400 if Transfer-Encoding is set to a blank string', function(done) { - send_request({ stream_length: 5, headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(400); - done() - }) - }) - - it('returns 400 if Transfer-Encoding is not set', function(done) { - send_request({ stream_length: 5 }, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(400); - done() - }) - }) - - } else { - - it('doesnt work if Transfer-Encoding is set to a blank string', function(done) { - send_request({ stream_length: 5, headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - err.code.should.eql('ECONNRESET'); - done() - }) - }) - it('doesnt work if Transfer-Encoding is not set', function(done) { - send_request({ stream_length: 5 }, function(err, resp) { - err.code.should.eql('ECONNRESET'); - done() - }) - }) - - } - - }) - - describe('stream_length is set to valid value', function() { - - it('sets Content-Length header to that value', function(done) { - send_request({ stream_length: 11 }, function(err, resp) { - resp.body.headers['content-length'].should.eql('11'); - done() - }) - }) - - it('works if Transfer-Encoding is set to a blank string', function(done) { - send_request({ stream_length: 11, headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(200); - done() - }) - }) - - it('works if Transfer-Encoding is not set', function(done) { - send_request({ stream_length: 11 }, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(200); - done() - }) - }) - - }) - - - describe('stream_length set to 0', function() { - - describe('stream with path', function() { - - var stub; - - beforeEach(function() { - writable.path = '/foo/bar'; - stub = sinon.stub(fs, 'stat', function(path, cb) { - cb(null, { size: 11 }) - }) - }) - - afterEach(function() { - stub.restore(); - }) - - it('sets Content-Length header to streams length', function(done) { - send_request({ stream_length: 0 }, function(err, resp) { - resp.body.headers['content-length'].should.eql('11'); - done() - }) - }) - - it('works if Transfer-Encoding is set to a blank string', function(done) { - send_request({ stream_length: 0, headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(200); - done() - }) - }) - - it('works if Transfer-Encoding is not set', function(done) { - send_request({ stream_length: 0 }, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(200); - done() - }) - }) - - }) - - describe('stream without path', function() { - - it('does not set Content-Length header', function(done) { - send_request({ stream_length: 0 }, function(err, resp) { - should.not.exist(resp.body.headers['content-length']); - done() - }) - }) - - if (node_major_ver >= 10) { - it('returns 400 if Transfer-Encoding is set to a blank string', function(done) { - send_request({ stream_length: 0, headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(400); - done() - }) - }) - } else { - it('throws ECONNRESET if Transfer-Encoding is set to a blank string', function(done) { - send_request({ stream_length: 0, headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - err.code.should.eql('ECONNRESET'); - done() - }) - }) - } - - it('works if Transfer-Encoding is not set', function(done) { - send_request({ stream_length: 0 }, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(200); - done() - }) - }) - }) - - }) - -}) diff --git a/node_modules/needle/test/response_stream_spec.js b/node_modules/needle/test/response_stream_spec.js deleted file mode 100644 index a0ccef8e40a4..000000000000 --- a/node_modules/needle/test/response_stream_spec.js +++ /dev/null @@ -1,138 +0,0 @@ -var should = require('should'), - needle = require('./../'), - http = require('http'), - stream = require('stream'), - fs = require('fs'), - port = 11111, - server; - -describe('response streams', function() { - - describe('when the server sends back json', function(){ - - before(function(done) { - server = http.createServer(function(req, res) { - res.setHeader('Content-Type', 'application/json') - res.end('{"foo":"bar"}') - }).listen(port, done); - }); - - after(function(done) { - server.close(done); - }) - - describe('and the client uses streams', function(){ - - it('creates a proper streams2 stream', function(done) { - var stream = needle.get('localhost:' + port) - - // newer node versions set this to null instead of false - var bool = !!stream._readableState.flowing; - should.equal(false, bool); - - var readableCalled = false; - stream.on('readable', function() { - readableCalled = true; - }) - - stream.on('finish', function() { - readableCalled.should.be.true; - done(); - }); - - stream.resume(); - }) - - it('emits a single data item which is our JSON object', function(done) { - var stream = needle.get('localhost:' + port) - - var chunks = []; - stream.on('readable', function () { - while (chunk = this.read()) { - chunk.should.be.an.Object; - chunks.push(chunk); - } - }) - - stream.on('done', function () { - chunks.should.have.length(1) - chunks[0].should.have.property('foo', 'bar'); - done(); - }); - }) - - it('emits a raw buffer if we do not want to parse JSON', function(done) { - var stream = needle.get('localhost:' + port, { parse: false }) - - var chunks = []; - stream.on('readable', function () { - while (chunk = this.read()) { - Buffer.isBuffer(chunk).should.be.true; - chunks.push(chunk); - } - }) - - stream.on('done', function() { - var body = Buffer.concat(chunks).toString(); - body.should.equal('{"foo":"bar"}') - done(); - }); - }) - - }) - }) - - describe('when the server sends back what was posted to it', function () { - var file = 'asdf.txt'; - - before(function(done){ - server = http.createServer(function(req, res) { - res.setHeader('Content-Type', 'application/octet') - req.pipe(res); - }).listen(port); - - fs.writeFile(file, 'contents of stream', done); - }); - - after(function(done){ - server.close(); - fs.unlink(file, done); - }) - - it('can PUT a stream', function (done) { - var stream = needle.put('localhost:' + port, fs.createReadStream(file), { stream: true }); - - var chunks = []; - stream.on('readable', function () { - while (chunk = this.read()) { - Buffer.isBuffer(chunk).should.be.true; - chunks.push(chunk); - } - }) - - stream.on('end', function () { - var body = Buffer.concat(chunks).toString(); - body.should.equal('contents of stream') - done(); - }); - }); - - it('can PATCH a stream', function (done) { - var stream = needle.patch('localhost:' + port, fs.createReadStream(file), { stream: true }); - - var chunks = []; - stream.on('readable', function () { - while (chunk = this.read()) { - Buffer.isBuffer(chunk).should.be.true; - chunks.push(chunk); - } - }) - - stream.on('end', function () { - var body = Buffer.concat(chunks).toString(); - body.should.equal('contents of stream') - done(); - }); - }); - }) -}) diff --git a/node_modules/needle/test/socket_pool_spec.js b/node_modules/needle/test/socket_pool_spec.js deleted file mode 100644 index 75080bdfb6e5..000000000000 --- a/node_modules/needle/test/socket_pool_spec.js +++ /dev/null @@ -1,67 +0,0 @@ -var needle = require('../'), - should = require('should'), - http = require('http'); - -var server, port = 11112; - -describe('socket reuse', function() { - - var httpAgent = new http.Agent({ - keepAlive : true, - maxSockets : 1 - }); - - before(function(done) { - server = http.createServer(function(req, res) { - res.setHeader('Content-Type', 'application/json'); - setTimeout(function() { - res.end('{"foo":"bar"}'); - }, 50); - }).listen(port, done); - }); - - after(function(done) { - httpAgent.destroy(); - server.close(done); - }); - - describe('when sockets are reused', function() { - - it('does not duplicate listeners on .end', function(done) { - - var last_error; - var count = 10; - - function completed(err) { - --count || done(last_error); - } - - function send() { - needle.get('localhost:' + port, { agent: httpAgent }, function(err, resp) { - if (err) - throw new Error("Unexpected error: " + err); - - // lets go through all sockets and inspect all socket objects - for (hostTarget in httpAgent.sockets) { - httpAgent.sockets[hostTarget].forEach(function(socket) { - // normally, there are 2 internal listeners and 1 needle sets up, - // but to be sure the test does not fail even if newer node versions - // introduce additional listeners, we use a higher limit. - try { - socket.listeners('end').length.should.be.below(5, "too many listeners on the socket object's end event"); - } catch (e) { - last_error = e; - } - }); - } - - completed(); - }); - } - - for (var i = 0; i < count; i++) { - send(); - } - }); - }); -}); diff --git a/node_modules/needle/test/uri_modifier_spec.js b/node_modules/needle/test/uri_modifier_spec.js deleted file mode 100644 index 1a12a36caf36..000000000000 --- a/node_modules/needle/test/uri_modifier_spec.js +++ /dev/null @@ -1,46 +0,0 @@ -var needle = require('../'), - sinon = require('sinon'), - should = require('should'), - http = require('http'), - helpers = require('./helpers'); - -var port = 3456; - -describe('uri_modifier config parameter function', function() { - - var server, uri; - - function send_request(mw, cb) { - needle.get(uri, { uri_modifier: mw }, cb); - } - - before(function(done){ - server = helpers.server({ port: port }, done); - }) - - after(function(done) { - server.close(done); - }) - - describe('modifies uri', function() { - - var path = '/foo/replace'; - - before(function() { - uri = 'localhost:' + port + path - }); - - it('should modify path', function(done) { - send_request(function(uri) { - return uri.replace('/replace', ''); - }, function(err, res) { - should.not.exist(err); - should(res.req.path).be.exactly('/foo'); - done(); - }); - - }); - - }) - -}) diff --git a/node_modules/needle/test/url_spec.js b/node_modules/needle/test/url_spec.js deleted file mode 100644 index 5154d5849aa0..000000000000 --- a/node_modules/needle/test/url_spec.js +++ /dev/null @@ -1,155 +0,0 @@ -var needle = require('../'), - sinon = require('sinon'), - should = require('should'), - http = require('http'), - helpers = require('./helpers'); - -var port = 3456; - -describe('urls', function() { - - var server, url; - - function send_request(cb) { - return needle.get(url, cb); - } - - before(function(done){ - server = helpers.server({ port: port }, done); - }) - - after(function(done) { - server.close(done); - }) - - describe('null URL', function(){ - - it('throws', function(){ - (function() { - send_request() - }).should.throw(); - }) - - }) - - describe('invalid protocol', function(){ - - before(function() { - url = 'foo://google.com/what' - }) - - it('does not throw', function(done) { - (function() { - send_request(function(err) { - done(); - }) - }).should.not.throw() - }) - - it('returns an error', function(done) { - send_request(function(err) { - err.should.be.an.Error; - err.code.should.match(/ENOTFOUND|EADDRINFO|EAI_AGAIN/) - done(); - }) - }) - - }) - - describe('invalid host', function(){ - - before(function() { - url = 'http://s1\\\u0002.com/' - }) - - it('fails', function(done) { - (function() { - send_request(function(){ }) - }.should.throw(TypeError)) - done() - }) - - }) - -/* - describe('invalid path', function(){ - - before(function() { - url = 'http://www.google.com\\\/x\\\ %^&*() /x2.com/' - }) - - it('fails', function(done) { - send_request(function(err) { - err.should.be.an.Error; - done(); - }) - }) - - }) -*/ - - describe('valid protocol and path', function() { - - before(function() { - url = 'http://localhost:' + port + '/foo'; - }) - - it('works', function(done) { - send_request(function(err){ - should.not.exist(err); - done(); - }) - }) - - }) - - describe('no protocol but with slashes and valid path', function() { - - before(function() { - url = '//localhost:' + port + '/foo'; - }) - - it('works', function(done) { - send_request(function(err){ - should.not.exist(err); - done(); - }) - }) - - }) - - describe('no protocol nor slashes and valid path', function() { - - before(function() { - url = 'localhost:' + port + '/foo'; - }) - - it('works', function(done) { - send_request(function(err){ - should.not.exist(err); - done(); - }) - }) - - }) - - describe('double encoding', function() { - - var path = '/foo?email=' + encodeURIComponent('what-ever@Example.Com'); - - before(function() { - url = 'localhost:' + port + path - }); - - it('should not occur', function(done) { - send_request(function(err, res) { - should.not.exist(err); - should(res.req.path).be.exactly(path); - done(); - }); - - }); - - }) - -}) diff --git a/node_modules/needle/test/utils/formidable.js b/node_modules/needle/test/utils/formidable.js deleted file mode 100644 index ba1d983e2c16..000000000000 --- a/node_modules/needle/test/utils/formidable.js +++ /dev/null @@ -1,17 +0,0 @@ -var formidable = require('formidable'), - http = require('http'), - util = require('util'); - -var port = process.argv[2] || 8888; - -http.createServer(function(req, res) { - var form = new formidable.IncomingForm(); - form.parse(req, function(err, fields, files) { - res.writeHead(200, {'content-type': 'text/plain'}); - res.write('received upload:\n\n'); - console.log(util.inspect({fields: fields, files: files})) - res.end(util.inspect({fields: fields, files: files})); - }); -}).listen(port); - -console.log('HTTP server listening on port ' + port); \ No newline at end of file diff --git a/node_modules/needle/test/utils/proxy.js b/node_modules/needle/test/utils/proxy.js deleted file mode 100644 index 531bf49354cb..000000000000 --- a/node_modules/needle/test/utils/proxy.js +++ /dev/null @@ -1,62 +0,0 @@ -var http = require('http'), - https = require('https'), - url = require('url'); - -var port = 1234, - log = true, - request_auth = false; - -http.createServer(function(request, response) { - - console.log(request.headers); - console.log("Got request: " + request.url); - console.log("Forwarding request to " + request.headers['host']); - - if (request_auth) { - if (!request.headers['proxy-authorization']) { - response.writeHead(407, {'Proxy-Authenticate': 'Basic realm="proxy.com"'}) - return response.end('Hello.'); - } - } - - var remote = url.parse(request.url); - var protocol = remote.protocol == 'https:' ? https : http; - - var opts = { - host: request.headers['host'], - port: remote.port || (remote.protocol == 'https:' ? 443 : 80), - method: request.method, - path: remote.pathname, - headers: request.headers - } - - var proxy_request = protocol.request(opts, function(proxy_response){ - - proxy_response.on('data', function(chunk) { - if (log) console.log(chunk.toString()); - response.write(chunk, 'binary'); - }); - proxy_response.on('end', function() { - response.end(); - }); - - response.writeHead(proxy_response.statusCode, proxy_response.headers); - }); - - request.on('data', function(chunk) { - if (log) console.log(chunk.toString()); - proxy_request.write(chunk, 'binary'); - }); - - request.on('end', function() { - proxy_request.end(); - }); - -}).listen(port); - -process.on('uncaughtException', function(err){ - console.log('Uncaught exception!'); - console.log(err); -}); - -console.log("Proxy server listening on port " + port); diff --git a/node_modules/needle/test/utils/test.js b/node_modules/needle/test/utils/test.js deleted file mode 100644 index 8d58d70f2ae2..000000000000 --- a/node_modules/needle/test/utils/test.js +++ /dev/null @@ -1,104 +0,0 @@ -// TODO: write specs. :) - -var fs = require('fs'), - client = require('./../../'); - -process.env.DEBUG = true; - -var response_callback = function(err, resp, body){ - console.log(err); - if(resp) console.log("Got status code " + resp.statusCode) - console.log(body); -} - -function simple_head(){ - client.head('http://www.amazon.com', response_callback); -} - -function simple_get(){ - client.get('http://www.nodejs.org', response_callback); -} - -function proxy_get(){ - client.get('https://www.google.com/search?q=nodejs', {proxy: 'http://localhost:1234'}, response_callback); -} - -function auth_get(){ - client.get('https://www.twitter.com', {username: 'asd', password: '123'}, response_callback); -} - -function simple_post(url){ - - var data = { - foo: 'bar', - baz: { - nested: 'attribute' - } - } - - client.post(url, data, response_callback); - -} - -function multipart_post(url){ - - var filename = 'test_file.txt'; - var data = 'Plain text data.\nLorem ipsum dolor sit amet.\nBla bla bla.\n'; - fs.writeFileSync(filename, data); - - var black_pixel = Buffer.from("data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=".replace(/^data:image\/\w+;base64,/, ""), "base64"); - - var data = { - foo: 'bar', - bar: 'baz', - nested: { - my_document: { file: filename, content_type: 'text/plain' }, - even: { - more: 'nesting' - } - }, - pixel: { filename: 'black_pixel.gif', buffer: black_pixel, content_type: 'image/gif' }, - field2: {value: JSON.stringify({"json":[ {"one":1}, {"two":2} ]}), content_type: 'application/json' } - } - - client.post(url, data, {multipart: true}, function(err, resp, body){ - - console.log(err); - console.log("Got status code " + resp.statusCode) - console.log(body); - fs.unlink(filename); - - }); - -} - -switch(process.argv[2]){ - case 'head': - simple_head(); - break; - case 'get': - simple_get(); - break; - case 'auth': - auth_get(); - break; - case 'proxy': - proxy_get(); - break; - case 'post': - simple_post(process.argv[3] || 'http://posttestserver.com/post.php'); - break; - case 'multipart': - multipart_post(process.argv[3] || 'http://posttestserver.com/post.php?dir=example'); - break; - case 'all': - simple_head(); - simple_get(); - auth_get(); - proxy_get(); - simple_post(process.argv[3] || 'http://posttestserver.com/post.php'); - multipart_post(process.argv[3] || 'http://posttestserver.com/post.php?dir=example'); - break; - default: - console.log("Usage: ./test.js [head|get|auth|proxy|multipart]") -} diff --git a/node_modules/node-releases/README.md b/node_modules/node-releases/README.md index 114fb4a267f8..d30d2003e446 100644 --- a/node_modules/node-releases/README.md +++ b/node_modules/node-releases/README.md @@ -2,30 +2,11 @@ All data is located in `data` directory. -`data/raw` contains raw data `nodejs.json` and `iojs.json`. +`data/processed` contains `envs.json` with node.js releases data preprocessed to be used by [Browserslist](https://github.com/ai/browserslist) and other projects. Each version in this file contains only necessary info: version, release date, LTS flag/name, and security flag. -`data/processed` contains `envs.js` with both node.js and io.js data preprocessed to be used by [Browserslist](https://github.com/ai/browserslist) and other projects. Each version in this file contains only necessary info: version, release date and optionally LTS flag. +`data/release-schedule` contains `release-schedule.json` with node.js releases date and end of life date. ## Installation ```bash -npm install --save node-releases +npm install node-releases ``` - -## Updating data -```bash -npm run build -``` -This is a build script which fetches data from web, processes it and saves processed data to `data/processed/envs.json`. If you want to run this steps separately you can use commands described below. - - -### Fetching data -```bash -npm run fetch -``` -This npm script will download new data to `data/raw` directory. Also it'll download Node.js release schedule into `release-schedule` folder. - -### Processing data -```bash -npm run process -``` -This script generates `envs.json` file from raw data files and saves it to `data/processed` directory. diff --git a/node_modules/node-releases/data/processed/envs.json b/node_modules/node-releases/data/processed/envs.json index 94985f83fbed..00998c00a104 100644 --- a/node_modules/node-releases/data/processed/envs.json +++ b/node_modules/node-releases/data/processed/envs.json @@ -1 +1 @@ -[{"name":"nodejs","version":"0.2.0","date":"2011-08-26","lts":false,"security":false},{"name":"nodejs","version":"0.3.0","date":"2011-08-26","lts":false,"security":false},{"name":"nodejs","version":"0.4.0","date":"2011-08-26","lts":false,"security":false},{"name":"nodejs","version":"0.5.0","date":"2011-08-26","lts":false,"security":false},{"name":"nodejs","version":"0.6.0","date":"2011-11-04","lts":false,"security":false},{"name":"nodejs","version":"0.7.0","date":"2012-01-17","lts":false,"security":false},{"name":"nodejs","version":"0.8.0","date":"2012-06-22","lts":false,"security":false},{"name":"nodejs","version":"0.9.0","date":"2012-07-20","lts":false,"security":false},{"name":"nodejs","version":"0.10.0","date":"2013-03-11","lts":false,"security":false},{"name":"nodejs","version":"0.11.0","date":"2013-03-28","lts":false,"security":false},{"name":"nodejs","version":"0.12.0","date":"2015-02-06","lts":false,"security":false},{"name":"nodejs","version":"4.0.0","date":"2015-09-08","lts":false,"security":false},{"name":"nodejs","version":"4.1.0","date":"2015-09-17","lts":false,"security":false},{"name":"nodejs","version":"4.2.0","date":"2015-10-12","lts":"Argon","security":false},{"name":"nodejs","version":"4.3.0","date":"2016-02-09","lts":"Argon","security":false},{"name":"nodejs","version":"4.4.0","date":"2016-03-08","lts":"Argon","security":false},{"name":"nodejs","version":"4.5.0","date":"2016-08-16","lts":"Argon","security":false},{"name":"nodejs","version":"4.6.0","date":"2016-09-27","lts":"Argon","security":true},{"name":"nodejs","version":"4.7.0","date":"2016-12-06","lts":"Argon","security":false},{"name":"nodejs","version":"4.8.0","date":"2017-02-21","lts":"Argon","security":false},{"name":"nodejs","version":"4.9.0","date":"2018-03-28","lts":"Argon","security":true},{"name":"nodejs","version":"5.0.0","date":"2015-10-29","lts":false,"security":false},{"name":"nodejs","version":"5.1.0","date":"2015-11-17","lts":false,"security":false},{"name":"nodejs","version":"5.2.0","date":"2015-12-09","lts":false,"security":false},{"name":"nodejs","version":"5.3.0","date":"2015-12-15","lts":false,"security":false},{"name":"nodejs","version":"5.4.0","date":"2016-01-06","lts":false,"security":false},{"name":"nodejs","version":"5.5.0","date":"2016-01-21","lts":false,"security":false},{"name":"nodejs","version":"5.6.0","date":"2016-02-09","lts":false,"security":false},{"name":"nodejs","version":"5.7.0","date":"2016-02-23","lts":false,"security":false},{"name":"nodejs","version":"5.8.0","date":"2016-03-09","lts":false,"security":false},{"name":"nodejs","version":"5.9.0","date":"2016-03-16","lts":false,"security":false},{"name":"nodejs","version":"5.10.0","date":"2016-04-01","lts":false,"security":false},{"name":"nodejs","version":"5.11.0","date":"2016-04-21","lts":false,"security":false},{"name":"nodejs","version":"5.12.0","date":"2016-06-23","lts":false,"security":false},{"name":"nodejs","version":"6.0.0","date":"2016-04-26","lts":false,"security":false},{"name":"nodejs","version":"6.1.0","date":"2016-05-05","lts":false,"security":false},{"name":"nodejs","version":"6.2.0","date":"2016-05-17","lts":false,"security":false},{"name":"nodejs","version":"6.3.0","date":"2016-07-06","lts":false,"security":false},{"name":"nodejs","version":"6.4.0","date":"2016-08-12","lts":false,"security":false},{"name":"nodejs","version":"6.5.0","date":"2016-08-26","lts":false,"security":false},{"name":"nodejs","version":"6.6.0","date":"2016-09-14","lts":false,"security":false},{"name":"nodejs","version":"6.7.0","date":"2016-09-27","lts":false,"security":true},{"name":"nodejs","version":"6.8.0","date":"2016-10-12","lts":false,"security":false},{"name":"nodejs","version":"6.9.0","date":"2016-10-18","lts":"Boron","security":false},{"name":"nodejs","version":"6.10.0","date":"2017-02-21","lts":"Boron","security":false},{"name":"nodejs","version":"6.11.0","date":"2017-06-06","lts":"Boron","security":false},{"name":"nodejs","version":"6.12.0","date":"2017-11-06","lts":"Boron","security":false},{"name":"nodejs","version":"6.13.0","date":"2018-02-10","lts":"Boron","security":false},{"name":"nodejs","version":"6.14.0","date":"2018-03-28","lts":"Boron","security":true},{"name":"nodejs","version":"6.15.0","date":"2018-11-27","lts":"Boron","security":true},{"name":"nodejs","version":"6.16.0","date":"2018-12-26","lts":"Boron","security":false},{"name":"nodejs","version":"6.17.0","date":"2019-02-28","lts":"Boron","security":true},{"name":"nodejs","version":"7.0.0","date":"2016-10-25","lts":false,"security":false},{"name":"nodejs","version":"7.1.0","date":"2016-11-08","lts":false,"security":false},{"name":"nodejs","version":"7.2.0","date":"2016-11-22","lts":false,"security":false},{"name":"nodejs","version":"7.3.0","date":"2016-12-20","lts":false,"security":false},{"name":"nodejs","version":"7.4.0","date":"2017-01-04","lts":false,"security":false},{"name":"nodejs","version":"7.5.0","date":"2017-01-31","lts":false,"security":false},{"name":"nodejs","version":"7.6.0","date":"2017-02-21","lts":false,"security":false},{"name":"nodejs","version":"7.7.0","date":"2017-02-28","lts":false,"security":false},{"name":"nodejs","version":"7.8.0","date":"2017-03-29","lts":false,"security":false},{"name":"nodejs","version":"7.9.0","date":"2017-04-11","lts":false,"security":false},{"name":"nodejs","version":"7.10.0","date":"2017-05-02","lts":false,"security":false},{"name":"nodejs","version":"8.0.0","date":"2017-05-30","lts":false,"security":false},{"name":"nodejs","version":"8.1.0","date":"2017-06-08","lts":false,"security":false},{"name":"nodejs","version":"8.2.0","date":"2017-07-19","lts":false,"security":false},{"name":"nodejs","version":"8.3.0","date":"2017-08-08","lts":false,"security":false},{"name":"nodejs","version":"8.4.0","date":"2017-08-15","lts":false,"security":false},{"name":"nodejs","version":"8.5.0","date":"2017-09-12","lts":false,"security":false},{"name":"nodejs","version":"8.6.0","date":"2017-09-26","lts":false,"security":false},{"name":"nodejs","version":"8.7.0","date":"2017-10-11","lts":false,"security":false},{"name":"nodejs","version":"8.8.0","date":"2017-10-24","lts":false,"security":false},{"name":"nodejs","version":"8.9.0","date":"2017-10-31","lts":"Carbon","security":false},{"name":"nodejs","version":"8.10.0","date":"2018-03-06","lts":"Carbon","security":false},{"name":"nodejs","version":"8.11.0","date":"2018-03-28","lts":"Carbon","security":true},{"name":"nodejs","version":"8.12.0","date":"2018-09-10","lts":"Carbon","security":false},{"name":"nodejs","version":"8.13.0","date":"2018-11-20","lts":"Carbon","security":false},{"name":"nodejs","version":"8.14.0","date":"2018-11-27","lts":"Carbon","security":true},{"name":"nodejs","version":"8.15.0","date":"2018-12-26","lts":"Carbon","security":false},{"name":"nodejs","version":"8.16.0","date":"2019-04-16","lts":"Carbon","security":false},{"name":"nodejs","version":"8.17.0","date":"2019-12-17","lts":"Carbon","security":true},{"name":"nodejs","version":"9.0.0","date":"2017-10-31","lts":false,"security":false},{"name":"nodejs","version":"9.1.0","date":"2017-11-07","lts":false,"security":false},{"name":"nodejs","version":"9.2.0","date":"2017-11-14","lts":false,"security":false},{"name":"nodejs","version":"9.3.0","date":"2017-12-12","lts":false,"security":false},{"name":"nodejs","version":"9.4.0","date":"2018-01-10","lts":false,"security":false},{"name":"nodejs","version":"9.5.0","date":"2018-01-31","lts":false,"security":false},{"name":"nodejs","version":"9.6.0","date":"2018-02-21","lts":false,"security":false},{"name":"nodejs","version":"9.7.0","date":"2018-03-01","lts":false,"security":false},{"name":"nodejs","version":"9.8.0","date":"2018-03-07","lts":false,"security":false},{"name":"nodejs","version":"9.9.0","date":"2018-03-21","lts":false,"security":false},{"name":"nodejs","version":"9.10.0","date":"2018-03-28","lts":false,"security":true},{"name":"nodejs","version":"9.11.0","date":"2018-04-04","lts":false,"security":false},{"name":"nodejs","version":"10.0.0","date":"2018-04-24","lts":false,"security":false},{"name":"nodejs","version":"10.1.0","date":"2018-05-08","lts":false,"security":false},{"name":"nodejs","version":"10.2.0","date":"2018-05-23","lts":false,"security":false},{"name":"nodejs","version":"10.3.0","date":"2018-05-29","lts":false,"security":false},{"name":"nodejs","version":"10.4.0","date":"2018-06-06","lts":false,"security":false},{"name":"nodejs","version":"10.5.0","date":"2018-06-20","lts":false,"security":false},{"name":"nodejs","version":"10.6.0","date":"2018-07-04","lts":false,"security":false},{"name":"nodejs","version":"10.7.0","date":"2018-07-18","lts":false,"security":false},{"name":"nodejs","version":"10.8.0","date":"2018-08-01","lts":false,"security":false},{"name":"nodejs","version":"10.9.0","date":"2018-08-15","lts":false,"security":false},{"name":"nodejs","version":"10.10.0","date":"2018-09-06","lts":false,"security":false},{"name":"nodejs","version":"10.11.0","date":"2018-09-19","lts":false,"security":false},{"name":"nodejs","version":"10.12.0","date":"2018-10-10","lts":false,"security":false},{"name":"nodejs","version":"10.13.0","date":"2018-10-30","lts":"Dubnium","security":false},{"name":"nodejs","version":"10.14.0","date":"2018-11-27","lts":"Dubnium","security":true},{"name":"nodejs","version":"10.15.0","date":"2018-12-26","lts":"Dubnium","security":false},{"name":"nodejs","version":"10.16.0","date":"2019-05-28","lts":"Dubnium","security":false},{"name":"nodejs","version":"10.17.0","date":"2019-10-22","lts":"Dubnium","security":false},{"name":"nodejs","version":"10.18.0","date":"2019-12-17","lts":"Dubnium","security":true},{"name":"nodejs","version":"10.19.0","date":"2020-02-05","lts":"Dubnium","security":true},{"name":"nodejs","version":"10.20.0","date":"2020-03-26","lts":"Dubnium","security":false},{"name":"nodejs","version":"10.21.0","date":"2020-06-02","lts":"Dubnium","security":true},{"name":"nodejs","version":"10.22.0","date":"2020-07-21","lts":"Dubnium","security":false},{"name":"nodejs","version":"10.23.0","date":"2020-10-27","lts":"Dubnium","security":false},{"name":"nodejs","version":"10.24.0","date":"2021-02-23","lts":"Dubnium","security":true},{"name":"nodejs","version":"11.0.0","date":"2018-10-23","lts":false,"security":false},{"name":"nodejs","version":"11.1.0","date":"2018-10-30","lts":false,"security":false},{"name":"nodejs","version":"11.2.0","date":"2018-11-15","lts":false,"security":false},{"name":"nodejs","version":"11.3.0","date":"2018-11-27","lts":false,"security":true},{"name":"nodejs","version":"11.4.0","date":"2018-12-07","lts":false,"security":false},{"name":"nodejs","version":"11.5.0","date":"2018-12-18","lts":false,"security":false},{"name":"nodejs","version":"11.6.0","date":"2018-12-26","lts":false,"security":false},{"name":"nodejs","version":"11.7.0","date":"2019-01-17","lts":false,"security":false},{"name":"nodejs","version":"11.8.0","date":"2019-01-24","lts":false,"security":false},{"name":"nodejs","version":"11.9.0","date":"2019-01-30","lts":false,"security":false},{"name":"nodejs","version":"11.10.0","date":"2019-02-14","lts":false,"security":false},{"name":"nodejs","version":"11.11.0","date":"2019-03-05","lts":false,"security":false},{"name":"nodejs","version":"11.12.0","date":"2019-03-14","lts":false,"security":false},{"name":"nodejs","version":"11.13.0","date":"2019-03-28","lts":false,"security":false},{"name":"nodejs","version":"11.14.0","date":"2019-04-10","lts":false,"security":false},{"name":"nodejs","version":"11.15.0","date":"2019-04-30","lts":false,"security":false},{"name":"nodejs","version":"12.0.0","date":"2019-04-23","lts":false,"security":false},{"name":"nodejs","version":"12.1.0","date":"2019-04-29","lts":false,"security":false},{"name":"nodejs","version":"12.2.0","date":"2019-05-07","lts":false,"security":false},{"name":"nodejs","version":"12.3.0","date":"2019-05-21","lts":false,"security":false},{"name":"nodejs","version":"12.4.0","date":"2019-06-04","lts":false,"security":false},{"name":"nodejs","version":"12.5.0","date":"2019-06-26","lts":false,"security":false},{"name":"nodejs","version":"12.6.0","date":"2019-07-03","lts":false,"security":false},{"name":"nodejs","version":"12.7.0","date":"2019-07-23","lts":false,"security":false},{"name":"nodejs","version":"12.8.0","date":"2019-08-06","lts":false,"security":false},{"name":"nodejs","version":"12.9.0","date":"2019-08-20","lts":false,"security":false},{"name":"nodejs","version":"12.10.0","date":"2019-09-04","lts":false,"security":false},{"name":"nodejs","version":"12.11.0","date":"2019-09-25","lts":false,"security":false},{"name":"nodejs","version":"12.12.0","date":"2019-10-11","lts":false,"security":false},{"name":"nodejs","version":"12.13.0","date":"2019-10-21","lts":"Erbium","security":false},{"name":"nodejs","version":"12.14.0","date":"2019-12-17","lts":"Erbium","security":true},{"name":"nodejs","version":"12.15.0","date":"2020-02-05","lts":"Erbium","security":true},{"name":"nodejs","version":"12.16.0","date":"2020-02-11","lts":"Erbium","security":false},{"name":"nodejs","version":"12.17.0","date":"2020-05-26","lts":"Erbium","security":false},{"name":"nodejs","version":"12.18.0","date":"2020-06-02","lts":"Erbium","security":true},{"name":"nodejs","version":"12.19.0","date":"2020-10-06","lts":"Erbium","security":false},{"name":"nodejs","version":"12.20.0","date":"2020-11-24","lts":"Erbium","security":false},{"name":"nodejs","version":"12.21.0","date":"2021-02-23","lts":"Erbium","security":true},{"name":"nodejs","version":"12.22.0","date":"2021-03-30","lts":"Erbium","security":false},{"name":"nodejs","version":"13.0.0","date":"2019-10-22","lts":false,"security":false},{"name":"nodejs","version":"13.1.0","date":"2019-11-05","lts":false,"security":false},{"name":"nodejs","version":"13.2.0","date":"2019-11-21","lts":false,"security":false},{"name":"nodejs","version":"13.3.0","date":"2019-12-03","lts":false,"security":false},{"name":"nodejs","version":"13.4.0","date":"2019-12-17","lts":false,"security":true},{"name":"nodejs","version":"13.5.0","date":"2019-12-18","lts":false,"security":false},{"name":"nodejs","version":"13.6.0","date":"2020-01-07","lts":false,"security":false},{"name":"nodejs","version":"13.7.0","date":"2020-01-21","lts":false,"security":false},{"name":"nodejs","version":"13.8.0","date":"2020-02-05","lts":false,"security":true},{"name":"nodejs","version":"13.9.0","date":"2020-02-18","lts":false,"security":false},{"name":"nodejs","version":"13.10.0","date":"2020-03-04","lts":false,"security":false},{"name":"nodejs","version":"13.11.0","date":"2020-03-12","lts":false,"security":false},{"name":"nodejs","version":"13.12.0","date":"2020-03-26","lts":false,"security":false},{"name":"nodejs","version":"13.13.0","date":"2020-04-14","lts":false,"security":false},{"name":"nodejs","version":"13.14.0","date":"2020-04-29","lts":false,"security":false},{"name":"nodejs","version":"14.0.0","date":"2020-04-21","lts":false,"security":false},{"name":"nodejs","version":"14.1.0","date":"2020-04-29","lts":false,"security":false},{"name":"nodejs","version":"14.2.0","date":"2020-05-05","lts":false,"security":false},{"name":"nodejs","version":"14.3.0","date":"2020-05-19","lts":false,"security":false},{"name":"nodejs","version":"14.4.0","date":"2020-06-02","lts":false,"security":true},{"name":"nodejs","version":"14.5.0","date":"2020-06-30","lts":false,"security":false},{"name":"nodejs","version":"14.6.0","date":"2020-07-20","lts":false,"security":false},{"name":"nodejs","version":"14.7.0","date":"2020-07-29","lts":false,"security":false},{"name":"nodejs","version":"14.8.0","date":"2020-08-11","lts":false,"security":false},{"name":"nodejs","version":"14.9.0","date":"2020-08-27","lts":false,"security":false},{"name":"nodejs","version":"14.10.0","date":"2020-09-08","lts":false,"security":false},{"name":"nodejs","version":"14.11.0","date":"2020-09-15","lts":false,"security":true},{"name":"nodejs","version":"14.12.0","date":"2020-09-22","lts":false,"security":false},{"name":"nodejs","version":"14.13.0","date":"2020-09-29","lts":false,"security":false},{"name":"nodejs","version":"14.14.0","date":"2020-10-15","lts":false,"security":false},{"name":"nodejs","version":"14.15.0","date":"2020-10-27","lts":"Fermium","security":false},{"name":"nodejs","version":"14.16.0","date":"2021-02-23","lts":"Fermium","security":true},{"name":"nodejs","version":"14.17.0","date":"2021-05-11","lts":"Fermium","security":false},{"name":"nodejs","version":"14.18.0","date":"2021-09-28","lts":"Fermium","security":false},{"name":"nodejs","version":"14.19.0","date":"2022-02-01","lts":"Fermium","security":false},{"name":"nodejs","version":"14.20.0","date":"2022-07-07","lts":"Fermium","security":true},{"name":"nodejs","version":"14.21.0","date":"2022-11-01","lts":"Fermium","security":false},{"name":"nodejs","version":"15.0.0","date":"2020-10-20","lts":false,"security":false},{"name":"nodejs","version":"15.1.0","date":"2020-11-04","lts":false,"security":false},{"name":"nodejs","version":"15.2.0","date":"2020-11-10","lts":false,"security":false},{"name":"nodejs","version":"15.3.0","date":"2020-11-24","lts":false,"security":false},{"name":"nodejs","version":"15.4.0","date":"2020-12-09","lts":false,"security":false},{"name":"nodejs","version":"15.5.0","date":"2020-12-22","lts":false,"security":false},{"name":"nodejs","version":"15.6.0","date":"2021-01-14","lts":false,"security":false},{"name":"nodejs","version":"15.7.0","date":"2021-01-25","lts":false,"security":false},{"name":"nodejs","version":"15.8.0","date":"2021-02-02","lts":false,"security":false},{"name":"nodejs","version":"15.9.0","date":"2021-02-18","lts":false,"security":false},{"name":"nodejs","version":"15.10.0","date":"2021-02-23","lts":false,"security":true},{"name":"nodejs","version":"15.11.0","date":"2021-03-03","lts":false,"security":false},{"name":"nodejs","version":"15.12.0","date":"2021-03-17","lts":false,"security":false},{"name":"nodejs","version":"15.13.0","date":"2021-03-31","lts":false,"security":false},{"name":"nodejs","version":"15.14.0","date":"2021-04-06","lts":false,"security":false},{"name":"nodejs","version":"16.0.0","date":"2021-04-20","lts":false,"security":false},{"name":"nodejs","version":"16.1.0","date":"2021-05-04","lts":false,"security":false},{"name":"nodejs","version":"16.2.0","date":"2021-05-19","lts":false,"security":false},{"name":"nodejs","version":"16.3.0","date":"2021-06-03","lts":false,"security":false},{"name":"nodejs","version":"16.4.0","date":"2021-06-23","lts":false,"security":false},{"name":"nodejs","version":"16.5.0","date":"2021-07-14","lts":false,"security":false},{"name":"nodejs","version":"16.6.0","date":"2021-07-29","lts":false,"security":true},{"name":"nodejs","version":"16.7.0","date":"2021-08-18","lts":false,"security":false},{"name":"nodejs","version":"16.8.0","date":"2021-08-25","lts":false,"security":false},{"name":"nodejs","version":"16.9.0","date":"2021-09-07","lts":false,"security":false},{"name":"nodejs","version":"16.10.0","date":"2021-09-22","lts":false,"security":false},{"name":"nodejs","version":"16.11.0","date":"2021-10-08","lts":false,"security":false},{"name":"nodejs","version":"16.12.0","date":"2021-10-20","lts":false,"security":false},{"name":"nodejs","version":"16.13.0","date":"2021-10-26","lts":"Gallium","security":false},{"name":"nodejs","version":"16.14.0","date":"2022-02-08","lts":"Gallium","security":false},{"name":"nodejs","version":"16.15.0","date":"2022-04-26","lts":"Gallium","security":false},{"name":"nodejs","version":"16.16.0","date":"2022-07-07","lts":"Gallium","security":true},{"name":"nodejs","version":"16.17.0","date":"2022-08-16","lts":"Gallium","security":false},{"name":"nodejs","version":"16.18.0","date":"2022-10-12","lts":"Gallium","security":false},{"name":"nodejs","version":"17.0.0","date":"2021-10-19","lts":false,"security":false},{"name":"nodejs","version":"17.1.0","date":"2021-11-09","lts":false,"security":false},{"name":"nodejs","version":"17.2.0","date":"2021-11-30","lts":false,"security":false},{"name":"nodejs","version":"17.3.0","date":"2021-12-17","lts":false,"security":false},{"name":"nodejs","version":"17.4.0","date":"2022-01-18","lts":false,"security":false},{"name":"nodejs","version":"17.5.0","date":"2022-02-10","lts":false,"security":false},{"name":"nodejs","version":"17.6.0","date":"2022-02-22","lts":false,"security":false},{"name":"nodejs","version":"17.7.0","date":"2022-03-09","lts":false,"security":false},{"name":"nodejs","version":"17.8.0","date":"2022-03-22","lts":false,"security":false},{"name":"nodejs","version":"17.9.0","date":"2022-04-07","lts":false,"security":false},{"name":"nodejs","version":"18.0.0","date":"2022-04-18","lts":false,"security":false},{"name":"nodejs","version":"18.1.0","date":"2022-05-03","lts":false,"security":false},{"name":"nodejs","version":"18.2.0","date":"2022-05-17","lts":false,"security":false},{"name":"nodejs","version":"18.3.0","date":"2022-06-02","lts":false,"security":false},{"name":"nodejs","version":"18.4.0","date":"2022-06-16","lts":false,"security":false},{"name":"nodejs","version":"18.5.0","date":"2022-07-06","lts":false,"security":true},{"name":"nodejs","version":"18.6.0","date":"2022-07-13","lts":false,"security":false},{"name":"nodejs","version":"18.7.0","date":"2022-07-26","lts":false,"security":false},{"name":"nodejs","version":"18.8.0","date":"2022-08-24","lts":false,"security":false},{"name":"nodejs","version":"18.9.0","date":"2022-09-07","lts":false,"security":false},{"name":"nodejs","version":"18.10.0","date":"2022-09-28","lts":false,"security":false},{"name":"nodejs","version":"18.11.0","date":"2022-10-13","lts":false,"security":false},{"name":"nodejs","version":"18.12.0","date":"2022-10-25","lts":"Hydrogen","security":false},{"name":"nodejs","version":"19.0.0","date":"2022-10-17","lts":false,"security":false},{"name":"nodejs","version":"19.1.0","date":"2022-11-14","lts":false,"security":false},{"name":"nodejs","version":"19.2.0","date":"2022-11-29","lts":false,"security":false}] \ No newline at end of file +[{"name":"nodejs","version":"0.2.0","date":"2011-08-26","lts":false,"security":false,"v8":"2.3.8.0"},{"name":"nodejs","version":"0.3.0","date":"2011-08-26","lts":false,"security":false,"v8":"2.5.1.0"},{"name":"nodejs","version":"0.4.0","date":"2011-08-26","lts":false,"security":false,"v8":"3.1.2.0"},{"name":"nodejs","version":"0.5.0","date":"2011-08-26","lts":false,"security":false,"v8":"3.1.8.25"},{"name":"nodejs","version":"0.6.0","date":"2011-11-04","lts":false,"security":false,"v8":"3.6.6.6"},{"name":"nodejs","version":"0.7.0","date":"2012-01-17","lts":false,"security":false,"v8":"3.8.6.0"},{"name":"nodejs","version":"0.8.0","date":"2012-06-22","lts":false,"security":false,"v8":"3.11.10.10"},{"name":"nodejs","version":"0.9.0","date":"2012-07-20","lts":false,"security":false,"v8":"3.11.10.15"},{"name":"nodejs","version":"0.10.0","date":"2013-03-11","lts":false,"security":false,"v8":"3.14.5.8"},{"name":"nodejs","version":"0.11.0","date":"2013-03-28","lts":false,"security":false,"v8":"3.17.13.0"},{"name":"nodejs","version":"0.12.0","date":"2015-02-06","lts":false,"security":false,"v8":"3.28.73.0"},{"name":"nodejs","version":"4.0.0","date":"2015-09-08","lts":false,"security":false,"v8":"4.5.103.30"},{"name":"nodejs","version":"4.1.0","date":"2015-09-17","lts":false,"security":false,"v8":"4.5.103.33"},{"name":"nodejs","version":"4.2.0","date":"2015-10-12","lts":"Argon","security":false,"v8":"4.5.103.35"},{"name":"nodejs","version":"4.3.0","date":"2016-02-09","lts":"Argon","security":false,"v8":"4.5.103.35"},{"name":"nodejs","version":"4.4.0","date":"2016-03-08","lts":"Argon","security":false,"v8":"4.5.103.35"},{"name":"nodejs","version":"4.5.0","date":"2016-08-16","lts":"Argon","security":false,"v8":"4.5.103.37"},{"name":"nodejs","version":"4.6.0","date":"2016-09-27","lts":"Argon","security":true,"v8":"4.5.103.37"},{"name":"nodejs","version":"4.7.0","date":"2016-12-06","lts":"Argon","security":false,"v8":"4.5.103.43"},{"name":"nodejs","version":"4.8.0","date":"2017-02-21","lts":"Argon","security":false,"v8":"4.5.103.45"},{"name":"nodejs","version":"4.9.0","date":"2018-03-28","lts":"Argon","security":true,"v8":"4.5.103.53"},{"name":"nodejs","version":"5.0.0","date":"2015-10-29","lts":false,"security":false,"v8":"4.6.85.28"},{"name":"nodejs","version":"5.1.0","date":"2015-11-17","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.2.0","date":"2015-12-09","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.3.0","date":"2015-12-15","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.4.0","date":"2016-01-06","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.5.0","date":"2016-01-21","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.6.0","date":"2016-02-09","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.7.0","date":"2016-02-23","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.8.0","date":"2016-03-09","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.9.0","date":"2016-03-16","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.10.0","date":"2016-04-01","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.11.0","date":"2016-04-21","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.12.0","date":"2016-06-23","lts":false,"security":false,"v8":"4.6.85.32"},{"name":"nodejs","version":"6.0.0","date":"2016-04-26","lts":false,"security":false,"v8":"5.0.71.35"},{"name":"nodejs","version":"6.1.0","date":"2016-05-05","lts":false,"security":false,"v8":"5.0.71.35"},{"name":"nodejs","version":"6.2.0","date":"2016-05-17","lts":false,"security":false,"v8":"5.0.71.47"},{"name":"nodejs","version":"6.3.0","date":"2016-07-06","lts":false,"security":false,"v8":"5.0.71.52"},{"name":"nodejs","version":"6.4.0","date":"2016-08-12","lts":false,"security":false,"v8":"5.0.71.60"},{"name":"nodejs","version":"6.5.0","date":"2016-08-26","lts":false,"security":false,"v8":"5.1.281.81"},{"name":"nodejs","version":"6.6.0","date":"2016-09-14","lts":false,"security":false,"v8":"5.1.281.83"},{"name":"nodejs","version":"6.7.0","date":"2016-09-27","lts":false,"security":true,"v8":"5.1.281.83"},{"name":"nodejs","version":"6.8.0","date":"2016-10-12","lts":false,"security":false,"v8":"5.1.281.84"},{"name":"nodejs","version":"6.9.0","date":"2016-10-18","lts":"Boron","security":false,"v8":"5.1.281.84"},{"name":"nodejs","version":"6.10.0","date":"2017-02-21","lts":"Boron","security":false,"v8":"5.1.281.93"},{"name":"nodejs","version":"6.11.0","date":"2017-06-06","lts":"Boron","security":false,"v8":"5.1.281.102"},{"name":"nodejs","version":"6.12.0","date":"2017-11-06","lts":"Boron","security":false,"v8":"5.1.281.108"},{"name":"nodejs","version":"6.13.0","date":"2018-02-10","lts":"Boron","security":false,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.14.0","date":"2018-03-28","lts":"Boron","security":true,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.15.0","date":"2018-11-27","lts":"Boron","security":true,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.16.0","date":"2018-12-26","lts":"Boron","security":false,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.17.0","date":"2019-02-28","lts":"Boron","security":true,"v8":"5.1.281.111"},{"name":"nodejs","version":"7.0.0","date":"2016-10-25","lts":false,"security":false,"v8":"5.4.500.36"},{"name":"nodejs","version":"7.1.0","date":"2016-11-08","lts":false,"security":false,"v8":"5.4.500.36"},{"name":"nodejs","version":"7.2.0","date":"2016-11-22","lts":false,"security":false,"v8":"5.4.500.43"},{"name":"nodejs","version":"7.3.0","date":"2016-12-20","lts":false,"security":false,"v8":"5.4.500.45"},{"name":"nodejs","version":"7.4.0","date":"2017-01-04","lts":false,"security":false,"v8":"5.4.500.45"},{"name":"nodejs","version":"7.5.0","date":"2017-01-31","lts":false,"security":false,"v8":"5.4.500.48"},{"name":"nodejs","version":"7.6.0","date":"2017-02-21","lts":false,"security":false,"v8":"5.5.372.40"},{"name":"nodejs","version":"7.7.0","date":"2017-02-28","lts":false,"security":false,"v8":"5.5.372.41"},{"name":"nodejs","version":"7.8.0","date":"2017-03-29","lts":false,"security":false,"v8":"5.5.372.43"},{"name":"nodejs","version":"7.9.0","date":"2017-04-11","lts":false,"security":false,"v8":"5.5.372.43"},{"name":"nodejs","version":"7.10.0","date":"2017-05-02","lts":false,"security":false,"v8":"5.5.372.43"},{"name":"nodejs","version":"8.0.0","date":"2017-05-30","lts":false,"security":false,"v8":"5.8.283.41"},{"name":"nodejs","version":"8.1.0","date":"2017-06-08","lts":false,"security":false,"v8":"5.8.283.41"},{"name":"nodejs","version":"8.2.0","date":"2017-07-19","lts":false,"security":false,"v8":"5.8.283.41"},{"name":"nodejs","version":"8.3.0","date":"2017-08-08","lts":false,"security":false,"v8":"6.0.286.52"},{"name":"nodejs","version":"8.4.0","date":"2017-08-15","lts":false,"security":false,"v8":"6.0.286.52"},{"name":"nodejs","version":"8.5.0","date":"2017-09-12","lts":false,"security":false,"v8":"6.0.287.53"},{"name":"nodejs","version":"8.6.0","date":"2017-09-26","lts":false,"security":false,"v8":"6.0.287.53"},{"name":"nodejs","version":"8.7.0","date":"2017-10-11","lts":false,"security":false,"v8":"6.1.534.42"},{"name":"nodejs","version":"8.8.0","date":"2017-10-24","lts":false,"security":false,"v8":"6.1.534.42"},{"name":"nodejs","version":"8.9.0","date":"2017-10-31","lts":"Carbon","security":false,"v8":"6.1.534.46"},{"name":"nodejs","version":"8.10.0","date":"2018-03-06","lts":"Carbon","security":false,"v8":"6.2.414.50"},{"name":"nodejs","version":"8.11.0","date":"2018-03-28","lts":"Carbon","security":true,"v8":"6.2.414.50"},{"name":"nodejs","version":"8.12.0","date":"2018-09-10","lts":"Carbon","security":false,"v8":"6.2.414.66"},{"name":"nodejs","version":"8.13.0","date":"2018-11-20","lts":"Carbon","security":false,"v8":"6.2.414.72"},{"name":"nodejs","version":"8.14.0","date":"2018-11-27","lts":"Carbon","security":true,"v8":"6.2.414.72"},{"name":"nodejs","version":"8.15.0","date":"2018-12-26","lts":"Carbon","security":false,"v8":"6.2.414.75"},{"name":"nodejs","version":"8.16.0","date":"2019-04-16","lts":"Carbon","security":false,"v8":"6.2.414.77"},{"name":"nodejs","version":"8.17.0","date":"2019-12-17","lts":"Carbon","security":true,"v8":"6.2.414.78"},{"name":"nodejs","version":"9.0.0","date":"2017-10-31","lts":false,"security":false,"v8":"6.2.414.32"},{"name":"nodejs","version":"9.1.0","date":"2017-11-07","lts":false,"security":false,"v8":"6.2.414.32"},{"name":"nodejs","version":"9.2.0","date":"2017-11-14","lts":false,"security":false,"v8":"6.2.414.44"},{"name":"nodejs","version":"9.3.0","date":"2017-12-12","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.4.0","date":"2018-01-10","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.5.0","date":"2018-01-31","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.6.0","date":"2018-02-21","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.7.0","date":"2018-03-01","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.8.0","date":"2018-03-07","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.9.0","date":"2018-03-21","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.10.0","date":"2018-03-28","lts":false,"security":true,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.11.0","date":"2018-04-04","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"10.0.0","date":"2018-04-24","lts":false,"security":false,"v8":"6.6.346.24"},{"name":"nodejs","version":"10.1.0","date":"2018-05-08","lts":false,"security":false,"v8":"6.6.346.27"},{"name":"nodejs","version":"10.2.0","date":"2018-05-23","lts":false,"security":false,"v8":"6.6.346.32"},{"name":"nodejs","version":"10.3.0","date":"2018-05-29","lts":false,"security":false,"v8":"6.6.346.32"},{"name":"nodejs","version":"10.4.0","date":"2018-06-06","lts":false,"security":false,"v8":"6.7.288.43"},{"name":"nodejs","version":"10.5.0","date":"2018-06-20","lts":false,"security":false,"v8":"6.7.288.46"},{"name":"nodejs","version":"10.6.0","date":"2018-07-04","lts":false,"security":false,"v8":"6.7.288.46"},{"name":"nodejs","version":"10.7.0","date":"2018-07-18","lts":false,"security":false,"v8":"6.7.288.49"},{"name":"nodejs","version":"10.8.0","date":"2018-08-01","lts":false,"security":false,"v8":"6.7.288.49"},{"name":"nodejs","version":"10.9.0","date":"2018-08-15","lts":false,"security":false,"v8":"6.8.275.24"},{"name":"nodejs","version":"10.10.0","date":"2018-09-06","lts":false,"security":false,"v8":"6.8.275.30"},{"name":"nodejs","version":"10.11.0","date":"2018-09-19","lts":false,"security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.12.0","date":"2018-10-10","lts":false,"security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.13.0","date":"2018-10-30","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.14.0","date":"2018-11-27","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.15.0","date":"2018-12-26","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.16.0","date":"2019-05-28","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.17.0","date":"2019-10-22","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.18.0","date":"2019-12-17","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.19.0","date":"2020-02-05","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.20.0","date":"2020-03-26","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.21.0","date":"2020-06-02","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.22.0","date":"2020-07-21","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.23.0","date":"2020-10-27","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.24.0","date":"2021-02-23","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"11.0.0","date":"2018-10-23","lts":false,"security":false,"v8":"7.0.276.28"},{"name":"nodejs","version":"11.1.0","date":"2018-10-30","lts":false,"security":false,"v8":"7.0.276.32"},{"name":"nodejs","version":"11.2.0","date":"2018-11-15","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.3.0","date":"2018-11-27","lts":false,"security":true,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.4.0","date":"2018-12-07","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.5.0","date":"2018-12-18","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.6.0","date":"2018-12-26","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.7.0","date":"2019-01-17","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.8.0","date":"2019-01-24","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.9.0","date":"2019-01-30","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.10.0","date":"2019-02-14","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.11.0","date":"2019-03-05","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.12.0","date":"2019-03-14","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.13.0","date":"2019-03-28","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.14.0","date":"2019-04-10","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.15.0","date":"2019-04-30","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"12.0.0","date":"2019-04-23","lts":false,"security":false,"v8":"7.4.288.21"},{"name":"nodejs","version":"12.1.0","date":"2019-04-29","lts":false,"security":false,"v8":"7.4.288.21"},{"name":"nodejs","version":"12.2.0","date":"2019-05-07","lts":false,"security":false,"v8":"7.4.288.21"},{"name":"nodejs","version":"12.3.0","date":"2019-05-21","lts":false,"security":false,"v8":"7.4.288.27"},{"name":"nodejs","version":"12.4.0","date":"2019-06-04","lts":false,"security":false,"v8":"7.4.288.27"},{"name":"nodejs","version":"12.5.0","date":"2019-06-26","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.6.0","date":"2019-07-03","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.7.0","date":"2019-07-23","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.8.0","date":"2019-08-06","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.9.0","date":"2019-08-20","lts":false,"security":false,"v8":"7.6.303.29"},{"name":"nodejs","version":"12.10.0","date":"2019-09-04","lts":false,"security":false,"v8":"7.6.303.29"},{"name":"nodejs","version":"12.11.0","date":"2019-09-25","lts":false,"security":false,"v8":"7.7.299.11"},{"name":"nodejs","version":"12.12.0","date":"2019-10-11","lts":false,"security":false,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.13.0","date":"2019-10-21","lts":"Erbium","security":false,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.14.0","date":"2019-12-17","lts":"Erbium","security":true,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.15.0","date":"2020-02-05","lts":"Erbium","security":true,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.16.0","date":"2020-02-11","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.17.0","date":"2020-05-26","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.18.0","date":"2020-06-02","lts":"Erbium","security":true,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.19.0","date":"2020-10-06","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.20.0","date":"2020-11-24","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.21.0","date":"2021-02-23","lts":"Erbium","security":true,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.22.0","date":"2021-03-30","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"13.0.0","date":"2019-10-22","lts":false,"security":false,"v8":"7.8.279.17"},{"name":"nodejs","version":"13.1.0","date":"2019-11-05","lts":false,"security":false,"v8":"7.8.279.17"},{"name":"nodejs","version":"13.2.0","date":"2019-11-21","lts":false,"security":false,"v8":"7.9.317.23"},{"name":"nodejs","version":"13.3.0","date":"2019-12-03","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.4.0","date":"2019-12-17","lts":false,"security":true,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.5.0","date":"2019-12-18","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.6.0","date":"2020-01-07","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.7.0","date":"2020-01-21","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.8.0","date":"2020-02-05","lts":false,"security":true,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.9.0","date":"2020-02-18","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.10.0","date":"2020-03-04","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.11.0","date":"2020-03-12","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.12.0","date":"2020-03-26","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.13.0","date":"2020-04-14","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.14.0","date":"2020-04-29","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"14.0.0","date":"2020-04-21","lts":false,"security":false,"v8":"8.1.307.30"},{"name":"nodejs","version":"14.1.0","date":"2020-04-29","lts":false,"security":false,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.2.0","date":"2020-05-05","lts":false,"security":false,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.3.0","date":"2020-05-19","lts":false,"security":false,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.4.0","date":"2020-06-02","lts":false,"security":true,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.5.0","date":"2020-06-30","lts":false,"security":false,"v8":"8.3.110.9"},{"name":"nodejs","version":"14.6.0","date":"2020-07-20","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.7.0","date":"2020-07-29","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.8.0","date":"2020-08-11","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.9.0","date":"2020-08-27","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.10.0","date":"2020-09-08","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.11.0","date":"2020-09-15","lts":false,"security":true,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.12.0","date":"2020-09-22","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.13.0","date":"2020-09-29","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.14.0","date":"2020-10-15","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.15.0","date":"2020-10-27","lts":"Fermium","security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.16.0","date":"2021-02-23","lts":"Fermium","security":true,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.17.0","date":"2021-05-11","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.18.0","date":"2021-09-28","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.19.0","date":"2022-02-01","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.20.0","date":"2022-07-07","lts":"Fermium","security":true,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.21.0","date":"2022-11-01","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"15.0.0","date":"2020-10-20","lts":false,"security":false,"v8":"8.6.395.16"},{"name":"nodejs","version":"15.1.0","date":"2020-11-04","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.2.0","date":"2020-11-10","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.3.0","date":"2020-11-24","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.4.0","date":"2020-12-09","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.5.0","date":"2020-12-22","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.6.0","date":"2021-01-14","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.7.0","date":"2021-01-25","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.8.0","date":"2021-02-02","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.9.0","date":"2021-02-18","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.10.0","date":"2021-02-23","lts":false,"security":true,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.11.0","date":"2021-03-03","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.12.0","date":"2021-03-17","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.13.0","date":"2021-03-31","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.14.0","date":"2021-04-06","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"16.0.0","date":"2021-04-20","lts":false,"security":false,"v8":"9.0.257.17"},{"name":"nodejs","version":"16.1.0","date":"2021-05-04","lts":false,"security":false,"v8":"9.0.257.24"},{"name":"nodejs","version":"16.2.0","date":"2021-05-19","lts":false,"security":false,"v8":"9.0.257.25"},{"name":"nodejs","version":"16.3.0","date":"2021-06-03","lts":false,"security":false,"v8":"9.0.257.25"},{"name":"nodejs","version":"16.4.0","date":"2021-06-23","lts":false,"security":false,"v8":"9.1.269.36"},{"name":"nodejs","version":"16.5.0","date":"2021-07-14","lts":false,"security":false,"v8":"9.1.269.38"},{"name":"nodejs","version":"16.6.0","date":"2021-07-29","lts":false,"security":true,"v8":"9.2.230.21"},{"name":"nodejs","version":"16.7.0","date":"2021-08-18","lts":false,"security":false,"v8":"9.2.230.21"},{"name":"nodejs","version":"16.8.0","date":"2021-08-25","lts":false,"security":false,"v8":"9.2.230.21"},{"name":"nodejs","version":"16.9.0","date":"2021-09-07","lts":false,"security":false,"v8":"9.3.345.16"},{"name":"nodejs","version":"16.10.0","date":"2021-09-22","lts":false,"security":false,"v8":"9.3.345.19"},{"name":"nodejs","version":"16.11.0","date":"2021-10-08","lts":false,"security":false,"v8":"9.4.146.19"},{"name":"nodejs","version":"16.12.0","date":"2021-10-20","lts":false,"security":false,"v8":"9.4.146.19"},{"name":"nodejs","version":"16.13.0","date":"2021-10-26","lts":"Gallium","security":false,"v8":"9.4.146.19"},{"name":"nodejs","version":"16.14.0","date":"2022-02-08","lts":"Gallium","security":false,"v8":"9.4.146.24"},{"name":"nodejs","version":"16.15.0","date":"2022-04-26","lts":"Gallium","security":false,"v8":"9.4.146.24"},{"name":"nodejs","version":"16.16.0","date":"2022-07-07","lts":"Gallium","security":true,"v8":"9.4.146.24"},{"name":"nodejs","version":"16.17.0","date":"2022-08-16","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"16.18.0","date":"2022-10-12","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"16.19.0","date":"2022-12-13","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"16.20.0","date":"2023-03-28","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"17.0.0","date":"2021-10-19","lts":false,"security":false,"v8":"9.5.172.21"},{"name":"nodejs","version":"17.1.0","date":"2021-11-09","lts":false,"security":false,"v8":"9.5.172.25"},{"name":"nodejs","version":"17.2.0","date":"2021-11-30","lts":false,"security":false,"v8":"9.6.180.14"},{"name":"nodejs","version":"17.3.0","date":"2021-12-17","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.4.0","date":"2022-01-18","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.5.0","date":"2022-02-10","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.6.0","date":"2022-02-22","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.7.0","date":"2022-03-09","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.8.0","date":"2022-03-22","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.9.0","date":"2022-04-07","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"18.0.0","date":"2022-04-18","lts":false,"security":false,"v8":"10.1.124.8"},{"name":"nodejs","version":"18.1.0","date":"2022-05-03","lts":false,"security":false,"v8":"10.1.124.8"},{"name":"nodejs","version":"18.2.0","date":"2022-05-17","lts":false,"security":false,"v8":"10.1.124.8"},{"name":"nodejs","version":"18.3.0","date":"2022-06-02","lts":false,"security":false,"v8":"10.2.154.4"},{"name":"nodejs","version":"18.4.0","date":"2022-06-16","lts":false,"security":false,"v8":"10.2.154.4"},{"name":"nodejs","version":"18.5.0","date":"2022-07-06","lts":false,"security":true,"v8":"10.2.154.4"},{"name":"nodejs","version":"18.6.0","date":"2022-07-13","lts":false,"security":false,"v8":"10.2.154.13"},{"name":"nodejs","version":"18.7.0","date":"2022-07-26","lts":false,"security":false,"v8":"10.2.154.13"},{"name":"nodejs","version":"18.8.0","date":"2022-08-24","lts":false,"security":false,"v8":"10.2.154.13"},{"name":"nodejs","version":"18.9.0","date":"2022-09-07","lts":false,"security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.10.0","date":"2022-09-28","lts":false,"security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.11.0","date":"2022-10-13","lts":false,"security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.12.0","date":"2022-10-25","lts":"Hydrogen","security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.13.0","date":"2023-01-05","lts":"Hydrogen","security":false,"v8":"10.2.154.23"},{"name":"nodejs","version":"18.14.0","date":"2023-02-01","lts":"Hydrogen","security":false,"v8":"10.2.154.23"},{"name":"nodejs","version":"18.15.0","date":"2023-03-05","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"18.16.0","date":"2023-04-12","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"18.17.0","date":"2023-07-18","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"18.18.0","date":"2023-09-18","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"18.19.0","date":"2023-11-29","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"19.0.0","date":"2022-10-17","lts":false,"security":false,"v8":"10.7.193.13"},{"name":"nodejs","version":"19.1.0","date":"2022-11-14","lts":false,"security":false,"v8":"10.7.193.20"},{"name":"nodejs","version":"19.2.0","date":"2022-11-29","lts":false,"security":false,"v8":"10.8.168.20"},{"name":"nodejs","version":"19.3.0","date":"2022-12-14","lts":false,"security":false,"v8":"10.8.168.21"},{"name":"nodejs","version":"19.4.0","date":"2023-01-05","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.5.0","date":"2023-01-24","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.6.0","date":"2023-02-01","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.7.0","date":"2023-02-21","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.8.0","date":"2023-03-14","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.9.0","date":"2023-04-10","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"20.0.0","date":"2023-04-17","lts":false,"security":false,"v8":"11.3.244.4"},{"name":"nodejs","version":"20.1.0","date":"2023-05-03","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.2.0","date":"2023-05-16","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.3.0","date":"2023-06-08","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.4.0","date":"2023-07-04","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.5.0","date":"2023-07-19","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.6.0","date":"2023-08-23","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.7.0","date":"2023-09-18","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.8.0","date":"2023-09-28","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.9.0","date":"2023-10-24","lts":"Iron","security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.10.0","date":"2023-11-22","lts":"Iron","security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"21.0.0","date":"2023-10-17","lts":false,"security":false,"v8":"11.8.172.13"},{"name":"nodejs","version":"21.1.0","date":"2023-10-24","lts":false,"security":false,"v8":"11.8.172.15"},{"name":"nodejs","version":"21.2.0","date":"2023-11-14","lts":false,"security":false,"v8":"11.8.172.17"},{"name":"nodejs","version":"21.3.0","date":"2023-11-30","lts":false,"security":false,"v8":"11.8.172.17"}] \ No newline at end of file diff --git a/node_modules/node-releases/data/release-schedule/release-schedule.json b/node_modules/node-releases/data/release-schedule/release-schedule.json index 5eca422e2a52..167314aa2ea1 100644 --- a/node_modules/node-releases/data/release-schedule/release-schedule.json +++ b/node_modules/node-releases/data/release-schedule/release-schedule.json @@ -1 +1 @@ -{"v0.8":{"start":"2012-06-25","end":"2014-07-31"},"v0.10":{"start":"2013-03-11","end":"2016-10-31"},"v0.12":{"start":"2015-02-06","end":"2016-12-31"},"v4":{"start":"2015-09-08","lts":"2015-10-12","maintenance":"2017-04-01","end":"2018-04-30","codename":"Argon"},"v5":{"start":"2015-10-29","maintenance":"2016-04-30","end":"2016-06-30"},"v6":{"start":"2016-04-26","lts":"2016-10-18","maintenance":"2018-04-30","end":"2019-04-30","codename":"Boron"},"v7":{"start":"2016-10-25","maintenance":"2017-04-30","end":"2017-06-30"},"v8":{"start":"2017-05-30","lts":"2017-10-31","maintenance":"2019-01-01","end":"2019-12-31","codename":"Carbon"},"v9":{"start":"2017-10-01","maintenance":"2018-04-01","end":"2018-06-30"},"v10":{"start":"2018-04-24","lts":"2018-10-30","maintenance":"2020-05-19","end":"2021-04-30","codename":"Dubnium"},"v11":{"start":"2018-10-23","maintenance":"2019-04-22","end":"2019-06-01"},"v12":{"start":"2019-04-23","lts":"2019-10-21","maintenance":"2020-11-30","end":"2022-04-30","codename":"Erbium"},"v13":{"start":"2019-10-22","maintenance":"2020-04-01","end":"2020-06-01"},"v14":{"start":"2020-04-21","lts":"2020-10-27","maintenance":"2021-10-19","end":"2023-04-30","codename":"Fermium"},"v15":{"start":"2020-10-20","maintenance":"2021-04-01","end":"2021-06-01"},"v16":{"start":"2021-04-20","lts":"2021-10-26","maintenance":"2022-10-18","end":"2023-09-11","codename":"Gallium"},"v17":{"start":"2021-10-19","maintenance":"2022-04-01","end":"2022-06-01"},"v18":{"start":"2022-04-19","lts":"2022-10-25","maintenance":"2023-10-18","end":"2025-04-30","codename":"Hydrogen"},"v19":{"start":"2022-10-18","maintenance":"2023-04-01","end":"2023-06-01"},"v20":{"start":"2023-04-18","lts":"2023-10-24","maintenance":"2024-10-22","end":"2026-04-30","codename":""}} \ No newline at end of file +{"v0.8":{"start":"2012-06-25","end":"2014-07-31"},"v0.10":{"start":"2013-03-11","end":"2016-10-31"},"v0.12":{"start":"2015-02-06","end":"2016-12-31"},"v4":{"start":"2015-09-08","lts":"2015-10-12","maintenance":"2017-04-01","end":"2018-04-30","codename":"Argon"},"v5":{"start":"2015-10-29","maintenance":"2016-04-30","end":"2016-06-30"},"v6":{"start":"2016-04-26","lts":"2016-10-18","maintenance":"2018-04-30","end":"2019-04-30","codename":"Boron"},"v7":{"start":"2016-10-25","maintenance":"2017-04-30","end":"2017-06-30"},"v8":{"start":"2017-05-30","lts":"2017-10-31","maintenance":"2019-01-01","end":"2019-12-31","codename":"Carbon"},"v9":{"start":"2017-10-01","maintenance":"2018-04-01","end":"2018-06-30"},"v10":{"start":"2018-04-24","lts":"2018-10-30","maintenance":"2020-05-19","end":"2021-04-30","codename":"Dubnium"},"v11":{"start":"2018-10-23","maintenance":"2019-04-22","end":"2019-06-01"},"v12":{"start":"2019-04-23","lts":"2019-10-21","maintenance":"2020-11-30","end":"2022-04-30","codename":"Erbium"},"v13":{"start":"2019-10-22","maintenance":"2020-04-01","end":"2020-06-01"},"v14":{"start":"2020-04-21","lts":"2020-10-27","maintenance":"2021-10-19","end":"2023-04-30","codename":"Fermium"},"v15":{"start":"2020-10-20","maintenance":"2021-04-01","end":"2021-06-01"},"v16":{"start":"2021-04-20","lts":"2021-10-26","maintenance":"2022-10-18","end":"2023-09-11","codename":"Gallium"},"v17":{"start":"2021-10-19","maintenance":"2022-04-01","end":"2022-06-01"},"v18":{"start":"2022-04-19","lts":"2022-10-25","maintenance":"2023-10-18","end":"2025-04-30","codename":"Hydrogen"},"v19":{"start":"2022-10-18","maintenance":"2023-04-01","end":"2023-06-01"},"v20":{"start":"2023-04-18","lts":"2023-10-24","maintenance":"2024-10-22","end":"2026-04-30","codename":"Iron"},"v21":{"start":"2023-10-17","maintenance":"2024-04-01","end":"2024-06-01"},"v22":{"start":"2024-04-23","lts":"2024-10-29","maintenance":"2025-10-21","end":"2027-04-30","codename":""},"v23":{"start":"2024-10-15","maintenance":"2025-04-01","end":"2025-06-01"},"v24":{"start":"2025-04-22","lts":"2025-10-28","maintenance":"2026-10-20","end":"2028-04-30","codename":""}} \ No newline at end of file diff --git a/node_modules/node-releases/package.json b/node_modules/node-releases/package.json index a58f40125013..b3334e92900a 100644 --- a/node_modules/node-releases/package.json +++ b/node_modules/node-releases/package.json @@ -1,7 +1,8 @@ { "name": "node-releases", - "version": "2.0.7", + "version": "2.0.14", "description": "Node.js releases data", + "type": "module", "scripts": { "build": "node scripts/build.js" }, diff --git a/node_modules/prr/.jshintrc b/node_modules/prr/.jshintrc deleted file mode 100644 index 6a7a956c0651..000000000000 --- a/node_modules/prr/.jshintrc +++ /dev/null @@ -1,61 +0,0 @@ -{ - "predef": [ ] - , "bitwise": false - , "camelcase": false - , "curly": false - , "eqeqeq": false - , "forin": false - , "immed": false - , "latedef": false - , "newcap": true - , "noarg": true - , "noempty": true - , "nonew": true - , "plusplus": false - , "quotmark": true - , "regexp": false - , "undef": true - , "unused": true - , "strict": false - , "trailing": true - , "maxlen": 120 - , "asi": true - , "boss": true - , "debug": true - , "eqnull": true - , "es5": true - , "esnext": true - , "evil": true - , "expr": true - , "funcscope": false - , "globalstrict": false - , "iterator": false - , "lastsemic": true - , "laxbreak": true - , "laxcomma": true - , "loopfunc": true - , "multistr": false - , "onecase": false - , "proto": false - , "regexdash": false - , "scripturl": true - , "smarttabs": false - , "shadow": false - , "sub": true - , "supernew": false - , "validthis": true - , "browser": true - , "couch": false - , "devel": false - , "dojo": false - , "mootools": false - , "node": true - , "nonstandard": true - , "prototypejs": false - , "rhino": false - , "worker": true - , "wsh": false - , "nomen": false - , "onevar": true - , "passfail": false -} \ No newline at end of file diff --git a/node_modules/prr/.npmignore b/node_modules/prr/.npmignore deleted file mode 100644 index b512c09d4766..000000000000 --- a/node_modules/prr/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/node_modules/prr/.travis.yml b/node_modules/prr/.travis.yml deleted file mode 100644 index 33dcbc3a8681..000000000000 --- a/node_modules/prr/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: node_js -node_js: - - 0.8 - - "0.10" -branches: - only: - - master -notifications: - email: - - rod@vagg.org \ No newline at end of file diff --git a/node_modules/prr/LICENSE.md b/node_modules/prr/LICENSE.md deleted file mode 100644 index 29b95e39a595..000000000000 --- a/node_modules/prr/LICENSE.md +++ /dev/null @@ -1,11 +0,0 @@ -The MIT License (MIT) -===================== - -Copyright (c) 2014 Rod Vagg ---------------------------- - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/prr/README.md b/node_modules/prr/README.md deleted file mode 100644 index b93404823519..000000000000 --- a/node_modules/prr/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# prr [![Build Status](https://secure.travis-ci.org/rvagg/prr.png)](http://travis-ci.org/rvagg/prr) - -An sensible alternative to `Object.defineProperty()`. Available in npm and Ender as **prr**. - -## Usage - -Set the property `'foo'` (`obj.foo`) to have the value `'bar'` with default options (`'enumerable'`, `'configurable'` and `'writable'` are all `false`): - -```js -prr(obj, 'foo', 'bar') -``` - -Adjust the default options: - -```js -prr(obj, 'foo', 'bar', { enumerable: true, writable: true }) -``` - -Do the same operation for multiple properties: - -```js -prr(obj, { one: 'one', two: 'two' }) -// or with options: -prr(obj, { one: 'one', two: 'two' }, { enumerable: true, writable: true }) -``` - -### Simplify! - -But obviously, having to write out the full options object makes it nearly as bad as the original `Object.defineProperty()` so we can simplify. - -As an alternative method we can use an options string where each character represents a option: `'e'=='enumerable'`, `'c'=='configurable'` and `'w'=='writable'`: - -```js -prr(obj, 'foo', 'bar', 'ew') // enumerable and writable but not configurable -// muliple properties: -prr(obj, { one: 'one', two: 'two' }, 'ewc') // configurable too -``` - -## Where can I use it? - -Anywhere! For pre-ES5 environments *prr* will simply fall-back to an `object[property] = value` so you can get close to what you want. - -*prr* is Ender-compatible so you can include it in your Ender build and `$.prr(...)` or `var prr = require('prr'); prr(...)`. - -## Licence - -prr is Copyright (c) 2013 Rod Vagg [@rvagg](https://twitter.com/rvagg) and licensed under the MIT licence. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE.md file for more details. diff --git a/node_modules/prr/package.json b/node_modules/prr/package.json deleted file mode 100644 index 5d298e59818a..000000000000 --- a/node_modules/prr/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "prr", - "description": "A better Object.defineProperty()", - "version": "1.0.1", - "homepage": "https://github.com/rvagg/prr", - "author": "Rod Vagg (https://github.com/rvagg)", - "keywords": [ - "property", - "properties", - "defineProperty", - "ender" - ], - "main": "./prr.js", - "repository": { - "type": "git", - "url": "https://github.com/rvagg/prr.git" - }, - "dependencies": {}, - "devDependencies": { - "tap": "*" - }, - "scripts": { - "test": "node ./test.js" - }, - "license": "MIT" -} diff --git a/node_modules/prr/prr.js b/node_modules/prr/prr.js deleted file mode 100644 index 94f58628be9b..000000000000 --- a/node_modules/prr/prr.js +++ /dev/null @@ -1,63 +0,0 @@ -/*! - * prr - * (c) 2013 Rod Vagg - * https://github.com/rvagg/prr - * License: MIT - */ - -(function (name, context, definition) { - if (typeof module != 'undefined' && module.exports) - module.exports = definition() - else - context[name] = definition() -})('prr', this, function() { - - var setProperty = typeof Object.defineProperty == 'function' - ? function (obj, key, options) { - Object.defineProperty(obj, key, options) - return obj - } - : function (obj, key, options) { // < es5 - obj[key] = options.value - return obj - } - - , makeOptions = function (value, options) { - var oo = typeof options == 'object' - , os = !oo && typeof options == 'string' - , op = function (p) { - return oo - ? !!options[p] - : os - ? options.indexOf(p[0]) > -1 - : false - } - - return { - enumerable : op('enumerable') - , configurable : op('configurable') - , writable : op('writable') - , value : value - } - } - - , prr = function (obj, key, value, options) { - var k - - options = makeOptions(value, options) - - if (typeof key == 'object') { - for (k in key) { - if (Object.hasOwnProperty.call(key, k)) { - options.value = key[k] - setProperty(obj, k, options) - } - } - return obj - } - - return setProperty(obj, key, options) - } - - return prr -}) \ No newline at end of file diff --git a/node_modules/prr/test.js b/node_modules/prr/test.js deleted file mode 100644 index 5222e3073c84..000000000000 --- a/node_modules/prr/test.js +++ /dev/null @@ -1,169 +0,0 @@ -const test = require('tap').test - , prr = require('./') - -test('test prr(o, key, value) form', function (t) { - t.plan(2) - - var o = {} - prr(o, 'foo', 'bar') - t.equal(o.foo, 'bar', 'correct value') - t.deepEqual( - Object.getOwnPropertyDescriptor(o, 'foo') - , { - enumerable : false - , configurable : false - , writable : false - , value : 'bar' - } - , 'correct property descriptor' - ) - t.end() -}) - -test('test prr(o, { key: value }) form', function (t) { - t.plan(2) - - var o = {} - prr(o, { foo: 'bar' }) - - t.equal(o.foo, 'bar', 'correct value') - t.deepEqual( - Object.getOwnPropertyDescriptor(o, 'foo') - , { - enumerable : false - , configurable : false - , writable : false - , value : 'bar' - } - , 'correct property descriptor' - ) - t.end() -}) - -test('test multiple key:value pairs', function (t) { - var o = { foo: 'bar' } - - prr(o, { one: 'ONE', two: 'TWO', obj: { o: 'o' }}) - - t.deepEqual(o, { foo: 'bar' }, 'properties are not enumerable') - t.equal(o.one, 'ONE', 'correctly set property') - t.equal(o.two, 'TWO', 'correctly set property') - t.deepEqual(o.obj, { o: 'o' }, 'correctly set property') - - ;[ 'one', 'two', 'obj' ].forEach(function (p) { - t.deepEqual( - Object.getOwnPropertyDescriptor(o, p) - , { - enumerable : false - , configurable : false - , writable : false - , value : p == 'obj' ? { o: 'o' } : p.toUpperCase() - } - , 'correct property descriptor' - ) - }) - - t.end() -}) - -test('test descriptor options', function (t) { - var o = {} - - prr(o, 'foo', 'bar', { - enumerable : true - , configurable : false - }) - t.equal(o.foo, 'bar', 'correct value') - t.deepEqual( - Object.getOwnPropertyDescriptor(o, 'foo') - , { - enumerable : true - , configurable : false - , writable : false - , value : 'bar' - } - , 'correct property descriptor' - ) - - prr(o, 'foo2', 'bar2', { - enumerable : true - , configurable : true - , writable : false - }) - t.equal(o.foo2, 'bar2', 'correct value') - t.deepEqual( - Object.getOwnPropertyDescriptor(o, 'foo2') - , { - enumerable : true - , configurable : true - , writable : false - , value : 'bar2' - } - , 'correct property descriptor' - ) - - prr(o, 'foo3', 'bar3', { - enumerable : true - , configurable : true - , writable : true - }) - t.equal(o.foo3, 'bar3', 'correct value') - t.deepEqual( - Object.getOwnPropertyDescriptor(o, 'foo3') - , { - enumerable : true - , configurable : true - , writable : true - , value : 'bar3' - } - , 'correct property descriptor' - ) - - t.end() -}) - - -test('test descriptor options, string form', function (t) { - var o = {} - - prr(o, 'foo', 'bar', 'e') - t.equal(o.foo, 'bar', 'correct value') - t.deepEqual( - Object.getOwnPropertyDescriptor(o, 'foo') - , { - enumerable : true - , configurable : false - , writable : false - , value : 'bar' - } - , 'correct property descriptor' - ) - - prr(o, 'foo2', 'bar2', 'ec') - t.equal(o.foo2, 'bar2', 'correct value') - t.deepEqual( - Object.getOwnPropertyDescriptor(o, 'foo2') - , { - enumerable : true - , configurable : true - , writable : false - , value : 'bar2' - } - , 'correct property descriptor' - ) - - prr(o, 'foo3', 'bar3', 'ecw') - t.equal(o.foo3, 'bar3', 'correct value') - t.deepEqual( - Object.getOwnPropertyDescriptor(o, 'foo3') - , { - enumerable : true - , configurable : true - , writable : true - , value : 'bar3' - } - , 'correct property descriptor' - ) - - t.end() -}) diff --git a/node_modules/sax/LICENSE b/node_modules/sax/LICENSE deleted file mode 100644 index ccffa082c991..000000000000 --- a/node_modules/sax/LICENSE +++ /dev/null @@ -1,41 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -==== - -`String.fromCodePoint` by Mathias Bynens used according to terms of MIT -License, as follows: - - Copyright Mathias Bynens - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/sax/README.md b/node_modules/sax/README.md deleted file mode 100644 index afcd3f3dd657..000000000000 --- a/node_modules/sax/README.md +++ /dev/null @@ -1,225 +0,0 @@ -# sax js - -A sax-style parser for XML and HTML. - -Designed with [node](http://nodejs.org/) in mind, but should work fine in -the browser or other CommonJS implementations. - -## What This Is - -* A very simple tool to parse through an XML string. -* A stepping stone to a streaming HTML parser. -* A handy way to deal with RSS and other mostly-ok-but-kinda-broken XML - docs. - -## What This Is (probably) Not - -* An HTML Parser - That's a fine goal, but this isn't it. It's just - XML. -* A DOM Builder - You can use it to build an object model out of XML, - but it doesn't do that out of the box. -* XSLT - No DOM = no querying. -* 100% Compliant with (some other SAX implementation) - Most SAX - implementations are in Java and do a lot more than this does. -* An XML Validator - It does a little validation when in strict mode, but - not much. -* A Schema-Aware XSD Thing - Schemas are an exercise in fetishistic - masochism. -* A DTD-aware Thing - Fetching DTDs is a much bigger job. - -## Regarding `Hello, world!').close(); - -// stream usage -// takes the same options as the parser -var saxStream = require("sax").createStream(strict, options) -saxStream.on("error", function (e) { - // unhandled errors will throw, since this is a proper node - // event emitter. - console.error("error!", e) - // clear the error - this._parser.error = null - this._parser.resume() -}) -saxStream.on("opentag", function (node) { - // same object as above -}) -// pipe is supported, and it's readable/writable -// same chunks coming in also go out. -fs.createReadStream("file.xml") - .pipe(saxStream) - .pipe(fs.createWriteStream("file-copy.xml")) -``` - - -## Arguments - -Pass the following arguments to the parser function. All are optional. - -`strict` - Boolean. Whether or not to be a jerk. Default: `false`. - -`opt` - Object bag of settings regarding string formatting. All default to `false`. - -Settings supported: - -* `trim` - Boolean. Whether or not to trim text and comment nodes. -* `normalize` - Boolean. If true, then turn any whitespace into a single - space. -* `lowercase` - Boolean. If true, then lowercase tag names and attribute names - in loose mode, rather than uppercasing them. -* `xmlns` - Boolean. If true, then namespaces are supported. -* `position` - Boolean. If false, then don't track line/col/position. -* `strictEntities` - Boolean. If true, only parse [predefined XML - entities](http://www.w3.org/TR/REC-xml/#sec-predefined-ent) - (`&`, `'`, `>`, `<`, and `"`) - -## Methods - -`write` - Write bytes onto the stream. You don't have to do this all at -once. You can keep writing as much as you want. - -`close` - Close the stream. Once closed, no more data may be written until -it is done processing the buffer, which is signaled by the `end` event. - -`resume` - To gracefully handle errors, assign a listener to the `error` -event. Then, when the error is taken care of, you can call `resume` to -continue parsing. Otherwise, the parser will not continue while in an error -state. - -## Members - -At all times, the parser object will have the following members: - -`line`, `column`, `position` - Indications of the position in the XML -document where the parser currently is looking. - -`startTagPosition` - Indicates the position where the current tag starts. - -`closed` - Boolean indicating whether or not the parser can be written to. -If it's `true`, then wait for the `ready` event to write again. - -`strict` - Boolean indicating whether or not the parser is a jerk. - -`opt` - Any options passed into the constructor. - -`tag` - The current tag being dealt with. - -And a bunch of other stuff that you probably shouldn't touch. - -## Events - -All events emit with a single argument. To listen to an event, assign a -function to `on`. Functions get executed in the this-context of -the parser object. The list of supported events are also in the exported -`EVENTS` array. - -When using the stream interface, assign handlers using the EventEmitter -`on` function in the normal fashion. - -`error` - Indication that something bad happened. The error will be hanging -out on `parser.error`, and must be deleted before parsing can continue. By -listening to this event, you can keep an eye on that kind of stuff. Note: -this happens *much* more in strict mode. Argument: instance of `Error`. - -`text` - Text node. Argument: string of text. - -`doctype` - The ``. Argument: -object with `name` and `body` members. Attributes are not parsed, as -processing instructions have implementation dependent semantics. - -`sgmldeclaration` - Random SGML declarations. Stuff like `` -would trigger this kind of event. This is a weird thing to support, so it -might go away at some point. SAX isn't intended to be used to parse SGML, -after all. - -`opentagstart` - Emitted immediately when the tag name is available, -but before any attributes are encountered. Argument: object with a -`name` field and an empty `attributes` set. Note that this is the -same object that will later be emitted in the `opentag` event. - -`opentag` - An opening tag. Argument: object with `name` and `attributes`. -In non-strict mode, tag names are uppercased, unless the `lowercase` -option is set. If the `xmlns` option is set, then it will contain -namespace binding information on the `ns` member, and will have a -`local`, `prefix`, and `uri` member. - -`closetag` - A closing tag. In loose mode, tags are auto-closed if their -parent closes. In strict mode, well-formedness is enforced. Note that -self-closing tags will have `closeTag` emitted immediately after `openTag`. -Argument: tag name. - -`attribute` - An attribute node. Argument: object with `name` and `value`. -In non-strict mode, attribute names are uppercased, unless the `lowercase` -option is set. If the `xmlns` option is set, it will also contains namespace -information. - -`comment` - A comment node. Argument: the string of the comment. - -`opencdata` - The opening tag of a ``) of a `` tags trigger a `"script"` -event, and their contents are not checked for special xml characters. -If you pass `noscript: true`, then this behavior is suppressed. - -## Reporting Problems - -It's best to write a failing test if you find an issue. I will always -accept pull requests with failing tests if they demonstrate intended -behavior, but it is very hard to figure out what issue you're describing -without a test. Writing a test is also the best way for you yourself -to figure out if you really understand the issue you think you have with -sax-js. diff --git a/node_modules/sax/lib/sax.js b/node_modules/sax/lib/sax.js deleted file mode 100644 index 795d607ef630..000000000000 --- a/node_modules/sax/lib/sax.js +++ /dev/null @@ -1,1565 +0,0 @@ -;(function (sax) { // wrapper for non-node envs - sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } - sax.SAXParser = SAXParser - sax.SAXStream = SAXStream - sax.createStream = createStream - - // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. - // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), - // since that's the earliest that a buffer overrun could occur. This way, checks are - // as rare as required, but as often as necessary to ensure never crossing this bound. - // Furthermore, buffers are only tested at most once per write(), so passing a very - // large string into write() might have undesirable effects, but this is manageable by - // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme - // edge case, result in creating at most one complete copy of the string passed in. - // Set to Infinity to have unlimited buffers. - sax.MAX_BUFFER_LENGTH = 64 * 1024 - - var buffers = [ - 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype', - 'procInstName', 'procInstBody', 'entity', 'attribName', - 'attribValue', 'cdata', 'script' - ] - - sax.EVENTS = [ - 'text', - 'processinginstruction', - 'sgmldeclaration', - 'doctype', - 'comment', - 'opentagstart', - 'attribute', - 'opentag', - 'closetag', - 'opencdata', - 'cdata', - 'closecdata', - 'error', - 'end', - 'ready', - 'script', - 'opennamespace', - 'closenamespace' - ] - - function SAXParser (strict, opt) { - if (!(this instanceof SAXParser)) { - return new SAXParser(strict, opt) - } - - var parser = this - clearBuffers(parser) - parser.q = parser.c = '' - parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH - parser.opt = opt || {} - parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags - parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase' - parser.tags = [] - parser.closed = parser.closedRoot = parser.sawRoot = false - parser.tag = parser.error = null - parser.strict = !!strict - parser.noscript = !!(strict || parser.opt.noscript) - parser.state = S.BEGIN - parser.strictEntities = parser.opt.strictEntities - parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES) - parser.attribList = [] - - // namespaces form a prototype chain. - // it always points at the current tag, - // which protos to its parent tag. - if (parser.opt.xmlns) { - parser.ns = Object.create(rootNS) - } - - // mostly just for error reporting - parser.trackPosition = parser.opt.position !== false - if (parser.trackPosition) { - parser.position = parser.line = parser.column = 0 - } - emit(parser, 'onready') - } - - if (!Object.create) { - Object.create = function (o) { - function F () {} - F.prototype = o - var newf = new F() - return newf - } - } - - if (!Object.keys) { - Object.keys = function (o) { - var a = [] - for (var i in o) if (o.hasOwnProperty(i)) a.push(i) - return a - } - } - - function checkBufferLength (parser) { - var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) - var maxActual = 0 - for (var i = 0, l = buffers.length; i < l; i++) { - var len = parser[buffers[i]].length - if (len > maxAllowed) { - // Text/cdata nodes can get big, and since they're buffered, - // we can get here under normal conditions. - // Avoid issues by emitting the text node now, - // so at least it won't get any bigger. - switch (buffers[i]) { - case 'textNode': - closeText(parser) - break - - case 'cdata': - emitNode(parser, 'oncdata', parser.cdata) - parser.cdata = '' - break - - case 'script': - emitNode(parser, 'onscript', parser.script) - parser.script = '' - break - - default: - error(parser, 'Max buffer length exceeded: ' + buffers[i]) - } - } - maxActual = Math.max(maxActual, len) - } - // schedule the next check for the earliest possible buffer overrun. - var m = sax.MAX_BUFFER_LENGTH - maxActual - parser.bufferCheckPosition = m + parser.position - } - - function clearBuffers (parser) { - for (var i = 0, l = buffers.length; i < l; i++) { - parser[buffers[i]] = '' - } - } - - function flushBuffers (parser) { - closeText(parser) - if (parser.cdata !== '') { - emitNode(parser, 'oncdata', parser.cdata) - parser.cdata = '' - } - if (parser.script !== '') { - emitNode(parser, 'onscript', parser.script) - parser.script = '' - } - } - - SAXParser.prototype = { - end: function () { end(this) }, - write: write, - resume: function () { this.error = null; return this }, - close: function () { return this.write(null) }, - flush: function () { flushBuffers(this) } - } - - var Stream - try { - Stream = require('stream').Stream - } catch (ex) { - Stream = function () {} - } - - var streamWraps = sax.EVENTS.filter(function (ev) { - return ev !== 'error' && ev !== 'end' - }) - - function createStream (strict, opt) { - return new SAXStream(strict, opt) - } - - function SAXStream (strict, opt) { - if (!(this instanceof SAXStream)) { - return new SAXStream(strict, opt) - } - - Stream.apply(this) - - this._parser = new SAXParser(strict, opt) - this.writable = true - this.readable = true - - var me = this - - this._parser.onend = function () { - me.emit('end') - } - - this._parser.onerror = function (er) { - me.emit('error', er) - - // if didn't throw, then means error was handled. - // go ahead and clear error, so we can write again. - me._parser.error = null - } - - this._decoder = null - - streamWraps.forEach(function (ev) { - Object.defineProperty(me, 'on' + ev, { - get: function () { - return me._parser['on' + ev] - }, - set: function (h) { - if (!h) { - me.removeAllListeners(ev) - me._parser['on' + ev] = h - return h - } - me.on(ev, h) - }, - enumerable: true, - configurable: false - }) - }) - } - - SAXStream.prototype = Object.create(Stream.prototype, { - constructor: { - value: SAXStream - } - }) - - SAXStream.prototype.write = function (data) { - if (typeof Buffer === 'function' && - typeof Buffer.isBuffer === 'function' && - Buffer.isBuffer(data)) { - if (!this._decoder) { - var SD = require('string_decoder').StringDecoder - this._decoder = new SD('utf8') - } - data = this._decoder.write(data) - } - - this._parser.write(data.toString()) - this.emit('data', data) - return true - } - - SAXStream.prototype.end = function (chunk) { - if (chunk && chunk.length) { - this.write(chunk) - } - this._parser.end() - return true - } - - SAXStream.prototype.on = function (ev, handler) { - var me = this - if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) { - me._parser['on' + ev] = function () { - var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments) - args.splice(0, 0, ev) - me.emit.apply(me, args) - } - } - - return Stream.prototype.on.call(me, ev, handler) - } - - // this really needs to be replaced with character classes. - // XML allows all manner of ridiculous numbers and digits. - var CDATA = '[CDATA[' - var DOCTYPE = 'DOCTYPE' - var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace' - var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/' - var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } - - // http://www.w3.org/TR/REC-xml/#NT-NameStartChar - // This implementation works on strings, a single character at a time - // as such, it cannot ever support astral-plane characters (10000-EFFFF) - // without a significant breaking change to either this parser, or the - // JavaScript language. Implementation of an emoji-capable xml parser - // is left as an exercise for the reader. - var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ - - var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ - - var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ - var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ - - function isWhitespace (c) { - return c === ' ' || c === '\n' || c === '\r' || c === '\t' - } - - function isQuote (c) { - return c === '"' || c === '\'' - } - - function isAttribEnd (c) { - return c === '>' || isWhitespace(c) - } - - function isMatch (regex, c) { - return regex.test(c) - } - - function notMatch (regex, c) { - return !isMatch(regex, c) - } - - var S = 0 - sax.STATE = { - BEGIN: S++, // leading byte order mark or whitespace - BEGIN_WHITESPACE: S++, // leading whitespace - TEXT: S++, // general stuff - TEXT_ENTITY: S++, // & and such. - OPEN_WAKA: S++, // < - SGML_DECL: S++, // - SCRIPT: S++, // "; } - $script.= ""; From 21c7062eef1454d9ec5d14d4dcd1e03071b7a019 Mon Sep 17 00:00:00 2001 From: Uwe Kohnle Date: Sun, 11 Feb 2024 22:06:21 +0000 Subject: [PATCH 449/497] improvements for importing ILIAS SCORM export files --- .../class.ilObjSAHSLearningModuleGUI.php | 28 ++---- .../classes/class.ilScormAiccImporter.php | 92 ++----------------- 2 files changed, 18 insertions(+), 102 deletions(-) diff --git a/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php b/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php index ad619b999e9b..25f22da9fe4a 100755 --- a/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php +++ b/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php @@ -338,6 +338,7 @@ public function uploadObject(): void global $DIC; $rbacsystem = $DIC->access(); $ilErr = $DIC['ilErr']; + $ilLog = ilLoggerFactory::getLogger('sahs'); $refId = $DIC->http()->wrapper()->query()->retrieve('ref_id', $DIC->refinery()->kindlyTo()->int()); $importFromXml = false; @@ -398,9 +399,6 @@ public function uploadObject(): void switch ($subType) { case "scorm2004": $newObj = new ilObjSCORM2004LearningModule(); - // $newObj->setEditable(false);//$_POST["editable"] == 'y'); - // $newObj->setImportSequencing($_POST["import_sequencing"]); - // $newObj->setSequencingExpertMode($_POST["import_sequencing"]); break; case "scorm": @@ -412,15 +410,9 @@ public function uploadObject(): void $fType = $sFile["type"]; $cFileTypes = ["application/zip", "application/x-compressed","application/x-zip-compressed"]; if (in_array($fType, $cFileTypes)) { - $timeStamp = time(); $tempFile = $sFile["tmp_name"]; - $lmDir = ilFileUtils::getWebspaceDir("filesystem") . "/lm_data/"; - $lmTempDir = $lmDir . $timeStamp; - if (!file_exists($lmTempDir)) { - if (!mkdir($lmTempDir, 0755, true) && !is_dir($lmTempDir)) { - throw new \RuntimeException(sprintf('Directory "%s" was not created', $lmTempDir)); - } - } + $lmTempDir = ilFileUtils::ilTempnam(); + ilFileUtils::makeDir($lmTempDir); $zar = new ZipArchive(); $zar->open($tempFile); $zar->extractTo($lmTempDir); @@ -428,21 +420,21 @@ public function uploadObject(): void ilFileUtils::renameExecutables($lmTempDir); $importer = new ilScormAiccImporter(); $import_dirname = $lmTempDir . '/' . substr($_FILES["scormfile"]["name"], 0, -4); - try { - $importer->importXmlRepresentation("sahs", "", $import_dirname, null); - $importFromXml = true; - $mprops = $importer->moduleProperties; + $importer->importXmlRepresentation("sahs", "", $import_dirname, null); + $importFromXml = true; + $mprops = $importer->moduleProperties; + if (isset($mprops["SubType"])) { $subType = (string) $mprops["SubType"]; if ($subType === "scorm") { $newObj = new ilObjSCORMLearningModule(); } else { $newObj = new ilObjSCORM2004LearningModule(); } - } catch (\Exception $e) { + } else { ilFileUtils::delDir($lmTempDir, false); - $this->lng->loadLanguageModule("obj"); - $this->tpl->setOnScreenMessage('failure', $this->lng->txt("obj_import_file_error") . "
" . $e->getMessage(), true); + $ilLog->info("SCORM import of ILIAS exportfile not possible because of missing SCORM SubType"); + $this->tpl->setOnScreenMessage('failure', $this->lng->txt("import_file_not_valid"), true); return; } } diff --git a/Modules/ScormAicc/classes/class.ilScormAiccImporter.php b/Modules/ScormAicc/classes/class.ilScormAiccImporter.php index 3b9bc34adfa9..406b625da2ff 100755 --- a/Modules/ScormAicc/classes/class.ilScormAiccImporter.php +++ b/Modules/ScormAicc/classes/class.ilScormAiccImporter.php @@ -51,26 +51,8 @@ public function importXmlRepresentation(string $a_entity, string $a_id, string $ // case i container if ($a_id !== "" && $a_mapping !== null && $new_id = $a_mapping->getMapping('Services/Container', 'objs', $a_id)) { $newObj = ilObjectFactory::getInstanceByObjId((int) $new_id, false); - // $exportDir = ilExport::_getExportDirectory((int) $a_id); - // $tempFile = dirname($exportDir) . '/export/' . basename($this->getImportDirectory()) . '.zip'; - // $timeStamp = time(); - // $lmDir = ilFileUtils::getWebspaceDir("filesystem") . "/lm_data/"; - // $lmTempDir = $lmDir . $timeStamp; - // if (!file_exists($lmTempDir)) { - // if (!mkdir($lmTempDir, 0755, true) && !is_dir($lmTempDir)) { - // throw new \RuntimeException(sprintf('Directory "%s" was not created', $lmTempDir)); - // } - // } - // $zar = new ZipArchive(); - // $zar->open($tempFile); - // $zar->extractTo($lmTempDir); - // $zar->close(); - // $a_xml = $lmTempDir . '/' . basename($this->getImportDirectory()); $a_import_dirname = $this->getImportDirectory(); } - - - $result = false; if (file_exists($a_import_dirname)) { $manifestFile = $a_import_dirname . "/manifest.xml"; @@ -81,7 +63,13 @@ public function importXmlRepresentation(string $a_entity, string $a_id, string $ $xml = file_get_contents($propertiesFile); if (isset($xml)) { - $xmlRoot = simplexml_load_string($xml); + $use_internal_errors = libxml_use_internal_errors(true); + $xmlRoot = simplexml_load_string(trim($xml)); + libxml_use_internal_errors($use_internal_errors); + if (!$xmlRoot instanceof SimpleXMLElement) { + $ilLog->write('XML for SCORM Import is: ' . $xml . $xmlRoot); + return; + } foreach ($this->dataset->properties as $key => $value) { $this->moduleProperties[$key] = $xmlRoot->$key; @@ -126,7 +114,6 @@ public function importXmlRepresentation(string $a_entity, string $a_id, string $ $newObj->setLearningProgressSettingsAtUpload(); } - $result = true; } else { $ilLog->write("error parsing xml file for scorm import"); @@ -142,70 +129,7 @@ public function importXmlRepresentation(string $a_entity, string $a_id, string $ $ilLog->write("error file lost while importing"); //error non existing file } - // - // if (file_exists($a_xml)) { - // $manifestFile = $a_xml . "/manifest.xml"; - // if (file_exists($manifestFile)) { - // $manifest = file_get_contents($manifestFile); - // if (isset($manifest)) { - // $propertiesFile = $a_xml . "/properties.xml"; - // $xml = file_get_contents($propertiesFile); - // if (isset($xml)) { - // $xmlRoot = simplexml_load_string($xml); - // foreach ($this->dataset->properties as $key => $value) { - // $this->moduleProperties[$key] = $xmlRoot->$key; - // } - // $this->moduleProperties["Title"] = $xmlRoot->Title; - // $this->moduleProperties["Description"] = $xmlRoot->Description; - // - // if ($a_id !== "" && $a_mapping !== null && $new_id = $a_mapping->getMapping('Services/Container', 'objs', $a_id)) { - // if ($newObj !== null) { - // $this->dataset->writeData("sahs", "5.1.0", $newObj->getId(), $this->moduleProperties); - // - // $newObj->createReference(); - // - // $scormFile = "content.zip"; - // $scormFilePath = $a_xml . "/" . $scormFile; - // $targetPath = $newObj->getDataDirectory() . "/" . $scormFile; - // $file_path = $targetPath; - // - // ilFileUtils::rename($scormFilePath, $targetPath); - // ilFileUtils::unzip($file_path); - // unlink($file_path); - // ilFileUtils::delDir($lmTempDir, false); - // ilFileUtils::renameExecutables($newObj->getDataDirectory()); - // - // $newId = $newObj->getRefId(); - // // $newObj->putInTree($newId); - // // $newObj->setPermissions($newId); - // $subType = $this->moduleProperties["SubType"][0]; - // if ($subType === "scorm") { - // $newObj = new ilObjSCORMLearningModule($newId); - // } else { - // $newObj = new ilObjSCORM2004LearningModule($newId); - // } - // $title = $newObj->readObject(); - // //auto set learning progress settings - // $newObj->setLearningProgressSettingsAtUpload(); - // } - // } - // - // - // $result = true; - // } else { - // $ilLog->write("error parsing xml file for scorm import"); - // //error xml parsing - // } - // } else { - // $ilLog->write("error reading manifest file"); - // } - // } else { - // $ilLog->write("error no manifest file found"); - // } - // } else { - // $ilLog->write("error file lost while importing"); - // //error non existing file - // } + // return $result; } public function writeData(string $a_entity, string $a_version, int $a_id): void From d6aafd826ddf9b7aea16b380266f017891f83d34 Mon Sep 17 00:00:00 2001 From: kunzeus Date: Fri, 26 Jan 2024 18:31:39 +0100 Subject: [PATCH 450/497] [add] Case distinction for saved test runs --- Modules/Test/classes/class.ilTestServiceGUI.php | 8 +++++++- lang/ilias_de.lang | 3 ++- lang/ilias_en.lang | 3 ++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Modules/Test/classes/class.ilTestServiceGUI.php b/Modules/Test/classes/class.ilTestServiceGUI.php index 43b1aad0cd30..3bc88a1568e8 100755 --- a/Modules/Test/classes/class.ilTestServiceGUI.php +++ b/Modules/Test/classes/class.ilTestServiceGUI.php @@ -439,7 +439,13 @@ public function getPassListOfAnswers( if ($show_best_solution) { $compare_template = new ilTemplate('tpl.il_as_tst_answers_compare.html', true, true, 'Modules/Test'); - $compare_template->setVariable("HEADER_PARTICIPANT", $this->lng->txt('tst_header_participant')); + $test_session = $this->testSessionFactory->getSession($active_id); + if ($pass <= $test_session->getLastFinishedPass()) { + $compare_template->setVariable("HEADER_PARTICIPANT", $this->lng->txt('tst_header_participant')); + } else { + $compare_template->setVariable("HEADER_PARTICIPANT", $this->lng->txt('tst_header_participant_no_answer')); + } + $compare_template->setVariable("HEADER_SOLUTION", $this->lng->txt('tst_header_solution')); $result_output = $question_gui->getSolutionOutput($active_id, $pass, $show_graphical_output, false, $show_question_only, $show_feedback); $best_output = $question_gui->getSolutionOutput($active_id, $pass, false, false, $show_question_only, false, true); diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 6664fec30249..6844bc39fd84 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -1448,7 +1448,8 @@ assessment#:#tst_finished#:#Beendet assessment#:#tst_form_dynamic_question_set_config#:#Fortlaufende Fragenauswahl assessment#:#tst_gap_analysis#:#Gap-Analyse assessment#:#tst_general_properties#:#Einstellungen des Tests -assessment#:#tst_header_participant#:#Ihre Antwort: +assessment#:#tst_header_participant#:#Frage und Ihre Antwort: +assessment#:#tst_header_participant_no_answer#:#Frage - nicht beantwortet: assessment#:#tst_header_solution#:#Bestmögliche Lösung: assessment#:#tst_heading_scoring#:#Bewertung assessment#:#tst_hide_pagecontents#:#Seiteninhalte ausblenden diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 693130d276fa..d6335cb16ccc 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -1448,7 +1448,8 @@ assessment#:#tst_finished#:#Finished assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis assessment#:#tst_general_properties#:#General Settings -assessment#:#tst_header_participant#:#Your Answer: +assessment#:#tst_header_participant#:#Question and your answer: +assessment#:#tst_header_participant_no_answer#:#Question - not answered assessment#:#tst_header_solution#:#Best Solution: assessment#:#tst_heading_scoring#:#Scoring assessment#:#tst_hide_pagecontents#:#Hide page content From 17dc1be428f0de6adea391ba64cbc77d15cbaeec Mon Sep 17 00:00:00 2001 From: kunzeus Date: Mon, 29 Jan 2024 14:46:21 +0100 Subject: [PATCH 451/497] [add] correctness icons --- .../classes/class.assOrderingQuestionGUI.php | 6 ++++-- .../class.ilAssNestedOrderingElementsInputGUI.php | 5 +++-- .../questions/class.ilAssOrderingElementList.php | 12 ++++++------ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assOrderingQuestionGUI.php b/Modules/TestQuestionPool/classes/class.assOrderingQuestionGUI.php index 2873c63047f0..da571dacb385 100755 --- a/Modules/TestQuestionPool/classes/class.assOrderingQuestionGUI.php +++ b/Modules/TestQuestionPool/classes/class.assOrderingQuestionGUI.php @@ -436,7 +436,7 @@ public function supportsIntermediateSolutionOutput() * @param boolean $result_output Show the reached points for parts of the question * @param boolean $show_question_only Show the question without the ILIAS content around * @param boolean $show_feedback Show the question feedback - * @param boolean $show_correct_solution Show the correct solution instead of the user solution + * @param boolean $show_correct_solution Show the correct solution instead of the user solution * @param boolean $show_manual_scoring Show specific information for the manual scoring output * @param bool $show_question_text * @return string The solution output of the question as HTML code @@ -474,7 +474,9 @@ public function getSolutionOutput( $answers_gui->setCorrectnessTrueElementList( $solutionOrderingList->getParityTrueElementList($this->object->getOrderingElementList()) ); - + if (!$show_correct_solution) { + $answers_gui->setShowCorrectnessIconsEnabled(true); + } $solution_html = $answers_gui->getHTML(); $template = new ilTemplate("tpl.il_as_qpl_nested_ordering_output_solution.html", true, true, "Modules/TestQuestionPool"); diff --git a/Modules/TestQuestionPool/classes/forms/class.ilAssNestedOrderingElementsInputGUI.php b/Modules/TestQuestionPool/classes/forms/class.ilAssNestedOrderingElementsInputGUI.php index 471890ab0fd1..184ece8320f5 100644 --- a/Modules/TestQuestionPool/classes/forms/class.ilAssNestedOrderingElementsInputGUI.php +++ b/Modules/TestQuestionPool/classes/forms/class.ilAssNestedOrderingElementsInputGUI.php @@ -34,6 +34,8 @@ class ilAssNestedOrderingElementsInputGUI extends ilMultipleNestedOrderingElemen public const ILC_CSS_CLASS_LIST = 'ilc_qordul_OrderList'; public const ILC_CSS_CLASS_ITEM = 'ilc_qordli_OrderListItem'; + public const DEFAULT_THUMBNAIL_PREFIX = 'thumb.'; + /** * @var string */ @@ -49,8 +51,6 @@ class ilAssNestedOrderingElementsInputGUI extends ilMultipleNestedOrderingElemen */ protected $orderingType = null; - public const DEFAULT_THUMBNAIL_PREFIX = 'thumb.'; - /** * @var string */ @@ -335,6 +335,7 @@ protected function getItemHtml($element, $identifier, $position, $itemSubFieldPo $correctness = 'correct'; } $tpl->setCurrentBlock('correctness_icon'); + $tpl->setVariable("ICON_OK", $this->getCorrectnessIcon($correctness)); $tpl->parseCurrentBlock(); } diff --git a/Modules/TestQuestionPool/classes/questions/class.ilAssOrderingElementList.php b/Modules/TestQuestionPool/classes/questions/class.ilAssOrderingElementList.php index baab4d297111..59ce55b8fdb1 100644 --- a/Modules/TestQuestionPool/classes/questions/class.ilAssOrderingElementList.php +++ b/Modules/TestQuestionPool/classes/questions/class.ilAssOrderingElementList.php @@ -295,11 +295,9 @@ public function elementExistByPosition($position): bool public function getElementByRandomIdentifier($randomIdentifier): ?ilAssOrderingElement { foreach ($this as $element) { - if ($element->getRandomIdentifier() != $randomIdentifier) { - continue; + if ($element->getRandomIdentifier() === intval($randomIdentifier)) { + return $element; } - - return $element; } return null; @@ -486,8 +484,10 @@ protected function fetchIdentifier(ilAssOrderingElement $element, string $identi protected function populateIdentifier(ilAssOrderingElement $element, $identifierType, $identifier): void { switch ($identifierType) { - case self::IDENTIFIER_TYPE_SOLUTION: $element->setSolutionIdentifier($identifier); break; - case self::IDENTIFIER_TYPE_RANDOM: $element->setRandomIdentifier($identifier); break; + case self::IDENTIFIER_TYPE_SOLUTION: $element->setSolutionIdentifier($identifier); + break; + case self::IDENTIFIER_TYPE_RANDOM: $element->setRandomIdentifier($identifier); + break; default: $this->throwUnknownIdentifierTypeException($identifierType); } } From fe065a5f3009aef7b74f0d7cb772af11dfd94935 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 12 Feb 2024 10:56:53 +0100 Subject: [PATCH 452/497] 38228: Cannot copy table cell style within Content Style Editor --- Modules/Survey/classes/class.ilObjSurvey.php | 5 +++++ .../Characteristic/class.ilStyleCharacteristicGUI.php | 8 +++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Modules/Survey/classes/class.ilObjSurvey.php b/Modules/Survey/classes/class.ilObjSurvey.php index 93b53a3ad76f..1427fdd5ee8b 100755 --- a/Modules/Survey/classes/class.ilObjSurvey.php +++ b/Modules/Survey/classes/class.ilObjSurvey.php @@ -2459,6 +2459,11 @@ public function sendNotificationMail( $user_id = (int) ilObjUser::_lookupId($recipient); if ($user_id > 0) { $ntf->sendMailAndReturnRecipients([$user_id]); + } else { + $user_ids = ilObjUser::getUserIdsByEmail($recipient); + if (count($user_ids) > 0) { + $ntf->sendMailAndReturnRecipients([current($user_ids)]); + } } /* note: this block is replace by the single line above since the UI asks for account names and the "e-mail" fallback leads diff --git a/Services/Style/Content/Characteristic/class.ilStyleCharacteristicGUI.php b/Services/Style/Content/Characteristic/class.ilStyleCharacteristicGUI.php index 187415692c8a..844f1a91fca3 100644 --- a/Services/Style/Content/Characteristic/class.ilStyleCharacteristicGUI.php +++ b/Services/Style/Content/Characteristic/class.ilStyleCharacteristicGUI.php @@ -1041,7 +1041,6 @@ public function copyCharacteristics(): void $lng = $this->domain_service->lng(); $chars = $this->request->getCharacteristics(); - if (count($chars) == 0) { $this->main_tpl->setOnScreenMessage('failure', $lng->txt("no_checkbox"), true); } else { @@ -1209,10 +1208,9 @@ public function pasteCharacteristicsWithinStyle(): void } $new_char = $d["char_" . $char]; $char_parts = explode(".", $char); - $manager->copyCharacteristicFromSource( $this->manager->getCopyCharacteristicStyleId(), - $this->manager->getCopyCharacteristicStyleType(), + $char_parts[0], $char_parts[2], $new_char, $titles @@ -1258,7 +1256,7 @@ public function pasteCharacteristicsFromOtherStyle(): void if (isset($d["overwrite_class"])) { $manager->copyCharacteristicFromSource( $manager->getCopyCharacteristicStyleId(), - $manager->getCopyCharacteristicStyleType(), + $char_parts[0], $char_parts[2], $d["overwrite_class"], [] @@ -1271,7 +1269,7 @@ public function pasteCharacteristicsFromOtherStyle(): void $new_char = $d["char_" . $char]; $manager->copyCharacteristicFromSource( $manager->getCopyCharacteristicStyleId(), - $manager->getCopyCharacteristicStyleType(), + $char_parts[0], $char_parts[2], $new_char, $titles From e50f09353020f77e72f0381ad2a656ef34a1283e Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 12 Feb 2024 09:30:19 +0100 Subject: [PATCH 453/497] SCORM: Refactor import See: https://mantis.ilias.de/view.php?id=40097 --- .../class.ilObjSAHSLearningModuleGUI.php | 16 +- .../classes/class.ilScormAiccImporter.php | 269 ++++++++++++------ .../classes/class.ilScormImportParser.php | 120 ++++++++ 3 files changed, 309 insertions(+), 96 deletions(-) create mode 100644 Modules/ScormAicc/classes/class.ilScormImportParser.php diff --git a/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php b/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php index 25f22da9fe4a..14549f8730b8 100755 --- a/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php +++ b/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php @@ -1,7 +1,5 @@ importXmlRepresentation("sahs", "", $import_dirname, null); + $import_result = $importer->getResult(); + $importFromXml = true; - $mprops = $importer->moduleProperties; - if (isset($mprops["SubType"])) { - $subType = (string) $mprops["SubType"]; - if ($subType === "scorm") { + if ($import_result->isOK()) { + $properties = $import_result->value(); + if (($subType = $properties['SubType']) === 'scorm') { $newObj = new ilObjSCORMLearningModule(); } else { $newObj = new ilObjSCORM2004LearningModule(); } } else { ilFileUtils::delDir($lmTempDir, false); - $ilLog->info("SCORM import of ILIAS exportfile not possible because of missing SCORM SubType"); + $ilLog->error('SCORM import of ILIAS exportfile not possible because parsing error'); + $ilLog->error($import_result->error()); $this->tpl->setOnScreenMessage('failure', $this->lng->txt("import_file_not_valid"), true); return; } diff --git a/Modules/ScormAicc/classes/class.ilScormAiccImporter.php b/Modules/ScormAicc/classes/class.ilScormAiccImporter.php index 406b625da2ff..8128199899df 100755 --- a/Modules/ScormAicc/classes/class.ilScormAiccImporter.php +++ b/Modules/ScormAicc/classes/class.ilScormAiccImporter.php @@ -1,6 +1,5 @@ + */ + private array $module_properties = []; public function __construct() { $this->dataset = new ilScormAiccDataSet(); - //todo: at the moment restricted to one module in xml file, extend? - $this->moduleProperties = []; - //$this->manifest = []; + $this->df = new DataTypeFactory(); + $this->initResult(); + + parent::__construct(); + } + + private function initResult(): void + { + $this->publishResult($this->df->error('No XML parsed, yet')); + $this->module_properties = []; + } + + private function publishResult(\ILIAS\Data\Result $result): \ILIAS\Data\Result + { + $this->result = $result; + return $this->result; + } + + /** + * @return \ILIAS\Data\Result|\ILIAS\Data\Result\Ok> + */ + public function getResult(): \ILIAS\Data\Result + { + return $this->result; } public function init(): void @@ -35,106 +64,168 @@ public function init(): void } /** - * Import XML * @throws ilDatabaseException * @throws ilFileUtilsException * @throws ilObjectNotFoundException */ - public function importXmlRepresentation(string $a_entity, string $a_id, string $a_import_dirname, ?ilImportMapping $a_mapping): void - { + public function importXmlRepresentation( + string $a_entity, + string $a_id, + string $a_xml, + ?ilImportMapping $a_mapping + ): void { global $DIC; - $ilLog = ilLoggerFactory::getLogger('sahs'); - - // if ($this->handleEditableLmXml($a_entity, $a_id, $a_xml, $a_mapping)) { - // return; - // } - // case i container - if ($a_id !== "" && $a_mapping !== null && $new_id = $a_mapping->getMapping('Services/Container', 'objs', $a_id)) { - $newObj = ilObjectFactory::getInstanceByObjId((int) $new_id, false); - $a_import_dirname = $this->getImportDirectory(); - } - $result = false; - if (file_exists($a_import_dirname)) { - $manifestFile = $a_import_dirname . "/manifest.xml"; - if (file_exists($manifestFile)) { - $manifest = file_get_contents($manifestFile); - if (isset($manifest)) { - $propertiesFile = $a_import_dirname . "/properties.xml"; - $xml = file_get_contents($propertiesFile); - - if (isset($xml)) { - $use_internal_errors = libxml_use_internal_errors(true); - $xmlRoot = simplexml_load_string(trim($xml)); - libxml_use_internal_errors($use_internal_errors); - if (!$xmlRoot instanceof SimpleXMLElement) { - $ilLog->write('XML for SCORM Import is: ' . $xml . $xmlRoot); - return; - } - foreach ($this->dataset->properties as $key => $value) { - $this->moduleProperties[$key] = $xmlRoot->$key; + $this->initResult(); + + $xml_directory = $a_xml; + $new_object = null; + + $this->publishResult( + $this->df + ->ok('Parsing started') + ->then( + function (string $message) use ( + &$new_object, + &$xml_directory, + $a_id, + $a_mapping + ): ?\ILIAS\Data\Result { + if ($a_id !== '' && + $a_mapping !== null && + ($new_id = $a_mapping->getMapping('Services/Container', 'objs', $a_id))) { + $new_object = ilObjectFactory::getInstanceByObjId((int) $new_id, false); + $xml_directory = $this->getImportDirectory(); } - $this->moduleProperties["Title"] = $xmlRoot->Title; - $this->moduleProperties["Description"] = $xmlRoot->Description; - foreach ($this->moduleProperties as $key => $xmlRoot) { - $xmlRootValue = $xmlRoot->__toString(); - $filteredValue = preg_replace('%\s%', '', $xmlRootValue); - $this->moduleProperties[$key] = $filteredValue; - } + return $this->df->ok($xml_directory); + } + ) + ->then(function (string $xml_directory): ?\ILIAS\Data\Result { + if (!is_dir($xml_directory)) { + return $this->df->error( + sprintf('Directory lost while importing: %s', $xml_directory) + ); + } + + return null; + }) + ->then(function (string $xml_directory): ?\ILIAS\Data\Result { + $manifest_file = $xml_directory . '/manifest.xml'; + if (!file_exists($manifest_file)) { + return $this->df->error( + sprintf( + 'No manifest file found in import directory "%s": %s', + $xml_directory, + $manifest_file + ) + ); + } + + return $this->df->ok($manifest_file); + }) + ->then(function (string $manifest_file): ?\ILIAS\Data\Result { + $manifest_file_content = file_get_contents($manifest_file); + if (!is_string($manifest_file_content) || $manifest_file_content === '') { + return $this->df->error( + sprintf( + 'Could not read content from manifest file: %s', + $manifest_file + ) + ); + } + + return $this->df->ok($manifest_file_content); + }) + ->then(function (string $manifest_file_content) use ($xml_directory): ?\ILIAS\Data\Result { + $properties_file = $xml_directory . '/properties.xml'; + $properties_file_content = file_get_contents($properties_file); + if (!is_string($properties_file_content) || $properties_file_content === '') { + return $this->df->error( + sprintf( + 'Could not read file: %s', + $properties_file + ) + ); + } - if ($a_id != null && $new_id = $a_mapping->getMapping('Services/Container', 'objs', $a_id)) { - $this->dataset->writeData("sahs", "5.1.0", $newObj->getId(), $this->moduleProperties); - - $newObj->createReference(); - - $scormFile = "content.zip"; - $scormFilePath = $a_import_dirname . "/" . $scormFile; - $targetPath = $newObj->getDataDirectory() . "/" . $scormFile; - $file_path = $targetPath; - - ilFileUtils::rename($scormFilePath, $targetPath); - ilFileUtils::unzip($file_path); - unlink($file_path); - // ilUtil::delDir($lmTempDir, false); - // $ilLog->write($scormFilePath.'----'. $targetPath); - ilFileUtils::renameExecutables($newObj->getDataDirectory()); - - $newId = $newObj->getRefId(); - // $newObj->putInTree($newId); - // $newObj->setPermissions($newId); - $subType = $this->moduleProperties["SubType"]; - if ($subType == "scorm") { - $newObj = new ilObjSCORMLearningModule($newId); - } else { - $newObj = new ilObjSCORM2004LearningModule($newId); + return $this->df->ok($properties_file_content); + }) + ->then(function (string $properties_file_content): ?\ILIAS\Data\Result { + return (new ilScormImportParser($this->df))->parse($properties_file_content); + }) + ->then( + function (SimpleXMLElement $properties_xml_doc): ?\ILIAS\Data\Result { + try { + foreach ($this->dataset->properties as $key => $value) { + $this->module_properties[$key] = $properties_xml_doc->{$key}; } - $title = $newObj->readObject(); - //auto set learning progress settings - $newObj->setLearningProgressSettingsAtUpload(); + + $this->module_properties['Title'] = $properties_xml_doc->Title; + $this->module_properties['Description'] = $properties_xml_doc->Description; + + foreach ($this->module_properties as $key => $property_node) { + $property_value = $property_node->__toString(); + $filteredValue = preg_replace('%\s%', '', $property_value); + $this->module_properties[$key] = $filteredValue; + } + + return $this->df->ok($this->module_properties); + } catch (Exception $exception) { + return $this->df->error($exception); + } + } + )->then(function (array $module_properties) use ( + $xml_directory, + $a_id, + $a_mapping, + $new_object + ): ?\ILIAS\Data\Result { + if ($a_id !== '' && + $a_mapping !== null && + ($new_id = $a_mapping->getMapping( + 'Services/Container', + 'objs', + $a_id + ))) { + $this->dataset->writeData( + 'sahs', + '5.1.0', + $new_object->getId(), + $this->module_properties + ); + + $new_object->createReference(); + + $scormFile = 'content.zip'; + $scormFilePath = $xml_directory . '/' . $scormFile; + $targetPath = $new_object->getDataDirectory() . '/' . $scormFile; + $file_path = $targetPath; + + ilFileUtils::rename($scormFilePath, $targetPath); + ilFileUtils::unzip($file_path); + unlink($file_path); + ilFileUtils::renameExecutables($new_object->getDataDirectory()); + + $new_ref_id = $new_object->getRefId(); + $subType = $module_properties['SubType']; + if ($subType === 'scorm') { + $new_object = new ilObjSCORMLearningModule($new_ref_id); + } else { + $new_object = new ilObjSCORM2004LearningModule($new_ref_id); } - $result = true; - } else { - $ilLog->write("error parsing xml file for scorm import"); - //error xml parsing + $title = $new_object->readObject(); + $new_object->setLearningProgressSettingsAtUpload(); } - } else { - $ilLog->write("error reading manifest file"); - } - } else { - $ilLog->write("error no manifest file found"); - } - } else { - $ilLog->write("error file lost while importing"); - //error non existing file - } - // return $result; + + return null; + }) + ); } public function writeData(string $a_entity, string $a_version, int $a_id): void { - $this->dataset->writeData($a_entity, $a_version, $a_id, $this->moduleProperties); + $this->dataset->writeData($a_entity, $a_version, $a_id, $this->module_properties); } - } diff --git a/Modules/ScormAicc/classes/class.ilScormImportParser.php b/Modules/ScormAicc/classes/class.ilScormImportParser.php new file mode 100644 index 000000000000..0743c5fea874 --- /dev/null +++ b/Modules/ScormAicc/classes/class.ilScormImportParser.php @@ -0,0 +1,120 @@ + */ + private array $error_stack = []; + private DataTypeFactory $df; + + public function __construct(DataTypeFactory $data_factory) + { + $this->df = $data_factory; + } + + private function formatError(LibXMLError $error): string + { + return implode(',', [ + 'level=' . $error->level, + 'code=' . $error->code, + 'line=' . $error->line, + 'col=' . $error->column, + 'msg=' . trim($error->message) + ]); + } + + private function formatErrors(LibXMLError ...$errors): string + { + $text = ''; + foreach ($errors as $error) { + $text .= $this->formatError($error) . "\n"; + } + + return $text; + } + + private function beginLogging(): void + { + if ([] === $this->error_stack) { + $this->xml_error_state = libxml_use_internal_errors(true); + libxml_clear_errors(); + } else { + $this->addErrors(); + } + + $this->error_stack[] = []; + } + + private function addErrors(): void + { + $currentErrors = libxml_get_errors(); + libxml_clear_errors(); + + $level = count($this->error_stack) - 1; + $this->error_stack[$level] = array_merge($this->error_stack[$level], $currentErrors); + } + + /** + * @return LibXMLError[] An array with the LibXMLErrors which has occurred since beginLogging() was called. + */ + private function endLogging(): array + { + $this->addErrors(); + + $errors = array_pop($this->error_stack); + + if ([] === $this->error_stack) { + libxml_use_internal_errors($this->xml_error_state); + } + + return $errors; + } + + public function parse(string $xmlString): \ILIAS\Data\Result + { + try { + $this->beginLogging(); + + $xml = new SimpleXMLElement($xmlString); + + $errors = $this->endLogging(); + + if ($xml->xpath('//SubType')) { + return $this->df->ok($xml); + } + + $error = new LibXMLError(); + $error->level = LIBXML_ERR_FATAL; + $error->code = 0; + $error->message = 'No "SubType" element found'; + $error->line = 1; + $error->column = 0; + + $errors[] = $error; + + return $this->df->error($this->formatErrors(...$errors)); + } catch (Throwable $e) { + return $this->df->error($this->formatErrors(...$this->endLogging())); + } + } +} From 0d48106d16717c6fd91389a7d7c09c498298d27a Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 12 Feb 2024 11:46:06 +0100 Subject: [PATCH 454/497] 31428: Change texts of mini-manual in slate --- lang/ilias_de.lang | 6 +++--- lang/ilias_en.lang | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 6844bc39fd84..4d74f9c06715 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -6230,7 +6230,7 @@ content#:#cont_citation_selection_not_valid#:#Ihre Auswahl ist nicht gültig, bi content#:#cont_click_br_corner#:#Bitte klicken Sie in die rechte untere Ecke des gewünschten Bereichs. content#:#cont_click_center#:#Bitte klicken Sie in die Mitte des gewünschten Bereichs. content#:#cont_click_circle#:#Bitte klicken Sie auf einen Kreispunkt des gewünschten Bereichs. -content#:#cont_click_edit#:#Klicken Sie ein Seitenelement, um es zu bearbeiten. +content#:#cont_click_edit#:#Um ein Seitenelement zu bearbeiten, klicken Sie es an. content#:#cont_click_multi_select#:#Klicken Sie Seitenelemente um diese auszuwählen oder die Auswahl wieder aufzuheben. content#:#cont_click_next_or_save#:#Bitte klicken Sie auf die nächste Ecke des Polygons oder speichern Sie den gewünschten Bereich. (Sie brauchen nicht mehr auf den Ausgangspunkt des Polygons zu klicken!) content#:#cont_click_next_point#:#Bitte klicken Sie auf die nächste Ecke des Polygons. @@ -6315,7 +6315,7 @@ content#:#cont_download_title#:#Titel der Download-Datei content#:#cont_downloads#:#Download content#:#cont_downloads_desc#:#Der Reiter „Download“ wird in der Präsentationsansicht angezeigt. Erzeugen Sie im Reiter „Export„ eine Exportdatei und geben Sie diese für den öffentlichen Zugriff frei. Dann können Benutzer freigegebene Exportdateien herunterladen, zum Beispiel für die Offline-Nutzung oder den Import in eine andere ILIAS-Installation. content#:#cont_downloads_public_desc#:#Erlaubt das Herunterladen auch für nichtangemeldete Benutzer (Öffentlicher Bereich) -content#:#cont_drag_and_drop_elements#:#Ziehen Sie ein Seitenelement mit der Maus auf einen Platzhalter um es zu bewegen. +content#:#cont_drag_and_drop_elements#:#Um ein Seitenelement zu verschieben, ziehen Sie es mit der Maus auf den gewünschten Platzhalter. content#:#cont_drag_element_click_save#:#Bewegen Sie das Element an die gewünschte Position und klicken dann auf "Speichern". content#:#cont_ed_align_center#:#Mittig ausrichten content#:#cont_ed_align_left#:#Links ausrichten @@ -6980,7 +6980,7 @@ content#:#cont_set_styles#:#Styles bestimmen content#:#cont_set_tab_style_info#:#Checkboxen aktivieren, um die Tabellenzellen zu formatieren content#:#cont_settings#:#Lernmoduleinstellungen content#:#cont_shape#:#Form -content#:#cont_shift_click_to_select#:#Mit Shift + Klick wählen Sie ein Seitenelement aus und wechseln in den Auswahlmodus. +content#:#cont_shift_click_to_select#:#Um Seitenelemente zum Löschen, Kopieren usw. auszuwählen, drücken Sie die Umschalt-Taste ⇧ und klicken auf die Seitenelemente. content#:#cont_short_title#:#Kurztitel content#:#cont_short_title_info#:#Kurztitel werden in der Baumdarstellung auf der linken Seite und für das Vor- und Zurück-Navigieren genutzt. content#:#cont_short_titles#:#Kurztitel diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index d6335cb16ccc..0650365019dc 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -6126,7 +6126,7 @@ content#:#cont_add_area#:#Add Area content#:#cont_add_cell#:#Add Column content#:#cont_add_change_comment#:#Add change comment content#:#cont_add_definition#:#Add Definition -content#:#cont_add_elements#:#Click on a plus symbol to add a new element. +content#:#cont_add_elements#:#Click on a plus symbol to add a new element. content#:#cont_add_file#:#Add File content#:#cont_add_images#:#Add Images content#:#cont_add_popup#:#Add Popup @@ -6230,7 +6230,7 @@ content#:#cont_citation_selection_not_valid#:#You're selection is not valid content#:#cont_click_br_corner#:#Please click on the bottom right corner of the desired area. content#:#cont_click_center#:#Please click on center of the desired area. content#:#cont_click_circle#:#Please click on a circle point of the desired area. -content#:#cont_click_edit#:#Click on elements to edit its properties. +content#:#cont_click_edit#:#To edit a page element, click on it. content#:#cont_click_multi_select#:#Click on elements to select or deselect them. content#:#cont_click_next_or_save#:#Please click on the next point of the polygon or save the area. (It is not necessary to click again on the starting point of this polygon !) content#:#cont_click_next_point#:#Please click on the next point of the polygon. @@ -6315,7 +6315,7 @@ content#:#cont_download_title#:#Download Title content#:#cont_downloads#:#Enable Download content#:#cont_downloads_desc#:#Offers all public export files for download (e.g. for offline use or import). content#:#cont_downloads_public_desc#:#Allow download even for anonymous users (in public area) -content#:#cont_drag_and_drop_elements#:#To move an element, Drag and drop it to a placeholder. +content#:#cont_drag_and_drop_elements#:#To move a page element, drag it with the mouse to the intended location and drop it. content#:#cont_drag_element_click_save#:#Drag and drop the element to the desired position. Then hit ‘Save’. content#:#cont_ed_align_center#:#Align: Center content#:#cont_ed_align_left#:#Align: Left @@ -6980,7 +6980,7 @@ content#:#cont_set_styles#:#Set Styles content#:#cont_set_tab_style_info#:#Activate checkboxes in table cells to set style. content#:#cont_settings#:#Settings for learning modules content#:#cont_shape#:#Shape -content#:#cont_shift_click_to_select#:#Shift-click on an element to select it and switch to selection mode. +content#:#cont_shift_click_to_select#:#To select page elements for deleting, copying etc, press Shift ⇧ and click on the respective page elements. content#:#cont_short_title#:#Short Title content#:#cont_short_title_info#:#Short titles are used in the left-hand tree presentation and for labels in the previous/next navigation. content#:#cont_short_titles#:#Short Titles From fa0683c46ed5c7d720b9c099b6bccdce6cd00c0c Mon Sep 17 00:00:00 2001 From: kunzeus Date: Tue, 6 Feb 2024 10:35:17 +0100 Subject: [PATCH 455/497] add unicode able trim methode --- .../classes/class.assQuestion.php | 22 +++++++++++++++++++ .../classes/class.assTextSubset.php | 2 +- .../classes/class.assTextSubsetGUI.php | 3 ++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assQuestion.php b/Modules/TestQuestionPool/classes/class.assQuestion.php index b3d80abedead..3168411a21c3 100755 --- a/Modules/TestQuestionPool/classes/class.assQuestion.php +++ b/Modules/TestQuestionPool/classes/class.assQuestion.php @@ -61,6 +61,8 @@ abstract class assQuestion protected const DEFAULT_THUMB_SIZE = 150; protected const MINIMUM_THUMB_SIZE = 20; + public const TRIM_PATTERN = '/^[\p{C}\p{Z}]+|[\p{C}\p{Z}]+$/u'; + protected ILIAS\HTTP\Services $http; protected ILIAS\Refinery\Factory $refinery; @@ -4199,4 +4201,24 @@ public function isInActiveTest(): bool $res = $this->db->query($query); return $res->numRows() > 0; } + + /** + * Trim non-printable characters from the beginning and end of a string. + * + * Note: The PHP trim() function is not fully Unicode-compatible and may not handle + * non-printable characters effectively. As a result, it may not trim certain Unicode + * characters, such as control characters, zero width characters or ideographic space as expected. + * + * This method provides a workaround for trimming non-printable characters until PHP 8.4, + * where the mb_trim() function is introduced. Users are encouraged to migrate to mb_trim() + * for proper Unicode and non-printable character handling. + * + * @param string $value The string to trim. + * @return string The trimmed string. + */ + public static function extendedTrim(string $value): string + { + return preg_replace(self::TRIM_PATTERN, '', $value); + } + } diff --git a/Modules/TestQuestionPool/classes/class.assTextSubset.php b/Modules/TestQuestionPool/classes/class.assTextSubset.php index f3797603f22f..d83f57a32cbe 100755 --- a/Modules/TestQuestionPool/classes/class.assTextSubset.php +++ b/Modules/TestQuestionPool/classes/class.assTextSubset.php @@ -853,7 +853,7 @@ protected function getSolutionSubmit(): array $this->dic->refinery()->kindlyTo()->string() ); if ($value) { - $value = trim($value); + $value = $this->extendedTrim($value); $value = $purifier->purify($value); $solutionSubmit[] = $value; } diff --git a/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php b/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php index cb62eb862148..bb2d1aa905be 100755 --- a/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php +++ b/Modules/TestQuestionPool/classes/class.assTextSubsetGUI.php @@ -316,7 +316,8 @@ public function writeAnswerSpecificPostData(ilPropertyFormGUI $form): void // Delete all existing answers and create new answers from the form data $this->object->flushAnswers(); foreach ($this->answers_from_post as $index => $answertext) { - $this->object->addAnswer(htmlentities(trim($answertext)), $_POST['answers']['points'][$index], $index); + $answertext = assQuestion::extendedTrim($answertext); + $this->object->addAnswer(htmlentities($answertext), $_POST['answers']['points'][$index], $index); } } From 78e89b80052ab8b20446705708ad6ded3f77f215 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 12 Feb 2024 12:21:19 +0100 Subject: [PATCH 456/497] 40478: After upgrade from 7.27 to 8.8, Learning Module ILIAS not accessible --- .../LearningModule/Presentation/class.ilLMNavigationStatus.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/LearningModule/Presentation/class.ilLMNavigationStatus.php b/Modules/LearningModule/Presentation/class.ilLMNavigationStatus.php index e8f41f3356ef..a46819d9f0e3 100644 --- a/Modules/LearningModule/Presentation/class.ilLMNavigationStatus.php +++ b/Modules/LearningModule/Presentation/class.ilLMNavigationStatus.php @@ -279,7 +279,7 @@ public function getPredecessorPageId(): int $active = ilLMPage::_lookupActive( $c_id, $this->lm->getType(), - $this->lm_set->get("time_scheduled_page_activation") + (bool) $this->lm_set->get("time_scheduled_page_activation") ); } if (is_array($pre_node) && $pre_node["obj_id"] > 0 && From 50c219178f719546c83aee01473a2f501e221491 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 12 Feb 2024 13:04:15 +0100 Subject: [PATCH 457/497] =?UTF-8?q?38049:=20Cronjob=20T=C3=A4gliche=20Mail?= =?UTF-8?q?=20=C3=BCber=20Neuigkeiten=20aus=20Gruppen=20und=20Kursen=20wir?= =?UTF-8?q?ft=20Fehler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cron/class.ilMembershipCronNotificationsData.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Services/Membership/classes/Cron/class.ilMembershipCronNotificationsData.php b/Services/Membership/classes/Cron/class.ilMembershipCronNotificationsData.php index fb66f99ce9dd..6cf1f280c7be 100644 --- a/Services/Membership/classes/Cron/class.ilMembershipCronNotificationsData.php +++ b/Services/Membership/classes/Cron/class.ilMembershipCronNotificationsData.php @@ -240,8 +240,10 @@ protected function loadMissingNews(): void foreach ($r as $ref_id => $n) { foreach ($n as $news_id) { $this->log->debug("Load missing news: " . $user_id . "-" . $ref_id . "-" . $news_id); - $this->user_news_aggr[$user_id][$ref_id][$news_id] = $this->news[$news_id]; - $this->news_per_user[$user_id][$ref_id][$news_id] = $news_id; + if (isset($this->news[$news_id])) { + $this->user_news_aggr[$user_id][$ref_id][$news_id] = $this->news[$news_id]; + $this->news_per_user[$user_id][$ref_id][$news_id] = $news_id; + } } } } From 1923b485ab500edea4416d91b4242414bb61a7a0 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 12 Feb 2024 15:34:23 +0100 Subject: [PATCH 458/497] 38914: Timeline ILIAS 8.6: No paragraphs --- Services/News/classes/class.ilNewsItemGUI.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Services/News/classes/class.ilNewsItemGUI.php b/Services/News/classes/class.ilNewsItemGUI.php index bcfef17b9003..8f1e8802e0cb 100755 --- a/Services/News/classes/class.ilNewsItemGUI.php +++ b/Services/News/classes/class.ilNewsItemGUI.php @@ -597,9 +597,6 @@ public function setTabs(): void public static function isRteActivated(): bool { - if (ilObjAdvancedEditing::_getRichTextEditor() === "") { - return false; - } - return true; + return false; } } From d82151a82d1a4450950954ab0f9f0dbbcbfcb2f4 Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Mon, 12 Feb 2024 17:04:29 +0100 Subject: [PATCH 459/497] [FIX] 0040285: Custom icons and images are not displayed & 0039530 improved request handling --- .../classes/class.ilWACPath.php | 22 +++++++---- .../classes/class.ilWebAccessChecker.php | 37 ++----------------- 2 files changed, 17 insertions(+), 42 deletions(-) diff --git a/Services/WebAccessChecker/classes/class.ilWACPath.php b/Services/WebAccessChecker/classes/class.ilWACPath.php index 0182fafba98b..bad295c070a7 100644 --- a/Services/WebAccessChecker/classes/class.ilWACPath.php +++ b/Services/WebAccessChecker/classes/class.ilWACPath.php @@ -232,20 +232,26 @@ public static function setVideoSuffixes(array $video_suffixes): void protected function normalizePath(string $path): string { + $path = ltrim($path, '.'); $original_path = parse_url($path, PHP_URL_PATH); $query = parse_url($path, PHP_URL_QUERY); - $base_path = strstr(realpath("." . $original_path), '/' . self::DIR_DATA . '/', true) . '/'; + + $real_data_dir = realpath("./" . self::DIR_DATA); $realpath = realpath("." . $original_path); - if ($realpath === false) { - return $path; + + if (strpos($realpath, $real_data_dir) !== 0) { + throw new ilWACException(ilWACException::ACCESS_DENIED); } - $normalized_path = str_replace( - $base_path, - '', - $realpath + + $normalized_path = ltrim( + str_replace( + $real_data_dir, + '', + $realpath + ), '/' ); - return "/" . $normalized_path . (!empty($query) ? '?' . $query : ''); + return "/" . self::DIR_DATA . '/' . $normalized_path . (!empty($query) ? '?' . $query : ''); } public function getPrefix(): string diff --git a/Services/WebAccessChecker/classes/class.ilWebAccessChecker.php b/Services/WebAccessChecker/classes/class.ilWebAccessChecker.php index e29723757528..b92eb5066ab1 100644 --- a/Services/WebAccessChecker/classes/class.ilWebAccessChecker.php +++ b/Services/WebAccessChecker/classes/class.ilWebAccessChecker.php @@ -193,8 +193,7 @@ public function initILIAS(): void protected function checkPublicSection(): void { global $DIC; - $on_login_page = !$this->isRequestNotFromLoginPage(); - $is_anonymous = ($DIC->user()->getId() === ANONYMOUS_USER_ID); + $is_anonymous = ((int) $DIC->user()->getId() === (int) ANONYMOUS_USER_ID); $is_null_user = ($DIC->user()->getId() === 0); $pub_section_activated = (bool) $DIC['ilSetting']->get('pub_section'); $isset = isset($DIC['ilSetting']); @@ -204,11 +203,6 @@ protected function checkPublicSection(): void throw new ilWACException(ilWACException::ACCESS_DENIED_NO_PUB); } - if ($on_login_page && ($is_null_user || $is_anonymous)) { - // Request is initiated from login page - return; - } - if ($pub_section_activated && ($is_null_user || $is_anonymous)) { // Request is initiated from an enabled public area return; @@ -224,9 +218,8 @@ protected function checkUser(): void global $DIC; $is_user = $DIC->user() instanceof ilObjUser; - $user_id_is_zero = ($DIC->user()->getId() === 0); - $not_on_login_page = $this->isRequestNotFromLoginPage(); - if (!$is_user || ($user_id_is_zero && $not_on_login_page)) { + $user_id_is_zero = ((int) $DIC->user()->getId() === 0); + if (!$is_user || $user_id_is_zero) { throw new ilWACException(ilWACException::ACCESS_DENIED_NO_LOGIN); } } @@ -348,28 +341,4 @@ protected function initAnonymousSession(): void $ilAuthSession->setAuthenticated(false, ANONYMOUS_USER_ID); $DIC->user()->setId(ANONYMOUS_USER_ID); } - - protected function isRequestNotFromLoginPage(): bool - { - $referrer = $_SERVER['HTTP_REFERER'] ?? ''; - $not_on_login_page = (strpos($referrer, 'login.php') === false - && strpos($referrer, '&baseClass=ilStartUpGUI') === false); - - if ($not_on_login_page && $referrer !== '') { - // In some scenarios (observed for content styles on login page, the HTTP_REFERER does not contain a PHP script - $referrer_url_parts = parse_url($referrer); - $ilias_url_parts = parse_url(ilUtil::_getHttpPath()); - if ( - $ilias_url_parts['host'] === $referrer_url_parts['host'] && - ( - !isset($referrer_url_parts['path']) || - strpos($referrer_url_parts['path'], '.php') === false - ) - ) { - $not_on_login_page = false; - } - } - - return $not_on_login_page; - } } From b0f4771a3b9393a2d948d51e4358e356d1ce8104 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 12 Feb 2024 17:12:54 +0100 Subject: [PATCH 460/497] 39515: Neutrale Spalte bei der Matrixfrage wird nicht gespeichert --- .../Questions/class.SurveyMatrixQuestionGUI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/SurveyQuestionPool/Questions/class.SurveyMatrixQuestionGUI.php b/Modules/SurveyQuestionPool/Questions/class.SurveyMatrixQuestionGUI.php index 54056ea21689..b8c0b5e89332 100755 --- a/Modules/SurveyQuestionPool/Questions/class.SurveyMatrixQuestionGUI.php +++ b/Modules/SurveyQuestionPool/Questions/class.SurveyMatrixQuestionGUI.php @@ -175,9 +175,9 @@ protected function importEditFormValues(ilPropertyFormGUI $a_form): void $this->object->getColumns()->addCategory($value, $columns['other'][$key] ?? 0, 0, null, $columns['scale'][$key]); } } - if (isset($columns["neutral"]) && is_string($columns["neutral"])) { + if (isset($columns["neutral"][0]) && is_string($columns["neutral"][0])) { $this->object->getColumns()->addCategory( - $columns['neutral'], + $columns['neutral'][0], 0, 1, null, From f06481c835eb5e1ed3dc317cc993c1b098883bb7 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 12 Feb 2024 17:28:42 +0100 Subject: [PATCH 461/497] 38747: big icons in history of page editor --- Services/COPage/classes/class.ilPCResourcesGUI.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Services/COPage/classes/class.ilPCResourcesGUI.php b/Services/COPage/classes/class.ilPCResourcesGUI.php index f3cdb3919b3b..229c6c55f40f 100755 --- a/Services/COPage/classes/class.ilPCResourcesGUI.php +++ b/Services/COPage/classes/class.ilPCResourcesGUI.php @@ -268,7 +268,17 @@ public static function insertResourcesIntoPageContent( if (isset($childs_by_type[$type]) && count($childs_by_type[$type]) > 0) { foreach ($childs_by_type[$type] as $child) { $tpl->setCurrentBlock("row"); - $tpl->setVariable("IMG", ilUtil::img(ilObject::_getIcon((int) $child["obj_id"], "small"))); + $tpl->setVariable("IMG", + ilUtil::img( + ilObject::_getIcon((int) $child["obj_id"], "small"), + null, + "", + "", + 0, + "", + "ilListItemIcon" + ) + ); $tpl->setVariable("TITLE", $child["title"]); $tpl->parseCurrentBlock(); $cnt++; From 95d52082936667adad5d0997c7307e4a0d5d5b43 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 12 Feb 2024 17:45:06 +0100 Subject: [PATCH 462/497] =?UTF-8?q?36921:=20Glyphe=20f=C3=BCr=20Lernmoduls?= =?UTF-8?q?eite=20liefert=20Tooltip=20mit=20Verzeichnis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LearningModule/classes/class.ilChapterHierarchyFormGUI.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/LearningModule/classes/class.ilChapterHierarchyFormGUI.php b/Modules/LearningModule/classes/class.ilChapterHierarchyFormGUI.php index cdb6808f909c..bb334564def9 100644 --- a/Modules/LearningModule/classes/class.ilChapterHierarchyFormGUI.php +++ b/Modules/LearningModule/classes/class.ilChapterHierarchyFormGUI.php @@ -309,8 +309,9 @@ public function getChildIconAlt(array $a_item): string return $lng->txt("cont_page_deactivated_elements"); } } + return $lng->txt("pg"); } - return ilUtil::getImagePath("icon_" . $a_item["type"] . ".svg"); + return $lng->txt("st");; } /** From b285471c732bf6997be86db7562db0fed987e125 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 12 Feb 2024 21:05:40 +0100 Subject: [PATCH 463/497] OpenIDConnect: Fix unchecking role mapping checkbox See: https://mantis.ilias.de/view.php?id=39545 --- .../classes/class.ilOpenIdConnectSettingsGUI.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Services/OpenIdConnect/classes/class.ilOpenIdConnectSettingsGUI.php b/Services/OpenIdConnect/classes/class.ilOpenIdConnectSettingsGUI.php index 0672e850891b..fe3f4679087f 100644 --- a/Services/OpenIdConnect/classes/class.ilOpenIdConnectSettingsGUI.php +++ b/Services/OpenIdConnect/classes/class.ilOpenIdConnectSettingsGUI.php @@ -1,7 +1,5 @@ prepareRoleSelection(false) as $role_id => $role_title) { - if (trim($form->getInput('role_map_' . $role_id)) === '') { + $role_settings[(int) $role_id]['update'] = !$form->getInput('role_map_update_' . $role_id); + $role_settings[(int) $role_id]['value'] = ''; + + $input_role = trim($form->getInput('role_map_' . $role_id)); + if ($input_role === '') { continue; } - $role_params = explode('::', $form->getInput('role_map_' . $role_id)); + $role_params = explode('::', $input_role); $this->logger->dump($role_params, ilLogLevel::DEBUG); if (count($role_params) !== 2) { @@ -636,8 +640,7 @@ protected function saveRoles(): void $role_valid = false; continue; } - $role_settings[(int) $role_id]['update'] = !$form->getInput('role_map_update_' . $role_id); - $role_settings[(int) $role_id]['value'] = (string) $form->getInput('role_map_' . $role_id); + $role_settings[(int) $role_id]['value'] = $input_role; } if (!$role_valid) { From a7017aa9c89152c62ee410078b2cb3b133c85201 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 12 Feb 2024 21:37:33 +0100 Subject: [PATCH 464/497] 38670: Counter displays notes, but you cannot find them --- Services/Notes/Note/class.NoteDBRepository.php | 5 +++-- Services/Notes/Note/class.NotesManager.php | 6 ++++-- Services/Notes/Service/class.DomainService.php | 9 +++++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Services/Notes/Note/class.NoteDBRepository.php b/Services/Notes/Note/class.NoteDBRepository.php index ff1552dab06a..258d4c77ed1c 100644 --- a/Services/Notes/Note/class.NoteDBRepository.php +++ b/Services/Notes/Note/class.NoteDBRepository.php @@ -260,7 +260,8 @@ public function getNotesForObjIds( public function getNrOfNotesForContext( Context $context, int $type = Note::PRIVATE, - bool $incl_sub = false + bool $incl_sub = false, + int $author = 0 ): int { $db = $this->db; @@ -268,7 +269,7 @@ public function getNrOfNotesForContext( $context, $type, $incl_sub, - 0, + $author, false, true ); diff --git a/Services/Notes/Note/class.NotesManager.php b/Services/Notes/Note/class.NotesManager.php index 73f2f5718c21..3b7a86f46797 100644 --- a/Services/Notes/Note/class.NotesManager.php +++ b/Services/Notes/Note/class.NotesManager.php @@ -173,12 +173,14 @@ public function getNotesForRepositoryObjIds( public function getNrOfNotesForContext( Context $context, int $type = Note::PRIVATE, - bool $incl_sub = false + bool $incl_sub = false, + int $author = 0 ): int { return $this->db_repo->getNrOfNotesForContext( $context, $type, - $incl_sub + $incl_sub, + $author ); } diff --git a/Services/Notes/Service/class.DomainService.php b/Services/Notes/Service/class.DomainService.php index 23be7d0c875f..169df8d2b34a 100644 --- a/Services/Notes/Service/class.DomainService.php +++ b/Services/Notes/Service/class.DomainService.php @@ -38,12 +38,17 @@ public function __construct( public function getNrOfNotesForContext( Context $context, - bool $incl_sub = false + bool $incl_sub = false, + ?int $author = null ): int { + if (is_null($author)) { + $author = $this->internal_domain->user()->getId(); + } return $this->notes_manager->getNrOfNotesForContext( $context, Note::PRIVATE, - $incl_sub + $incl_sub, + $author ); } From eb34d986bfc92bd8eaf93fbcff45c6da36b5f45f Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 12 Feb 2024 22:38:10 +0100 Subject: [PATCH 465/497] 8222: Content Style Editor: cannot add new colour -> error --- .../Form/classes/class.ilColorPickerInputGUI.php | 2 +- .../Content/classes/class.ilObjStyleSheet.php | 16 ++++++++++++---- .../Content/classes/class.ilObjStyleSheetGUI.php | 6 ++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Services/Form/classes/class.ilColorPickerInputGUI.php b/Services/Form/classes/class.ilColorPickerInputGUI.php index 9e9e80bc865d..1faa1aaff577 100644 --- a/Services/Form/classes/class.ilColorPickerInputGUI.php +++ b/Services/Form/classes/class.ilColorPickerInputGUI.php @@ -180,7 +180,7 @@ public function insert(ilTemplate $a_tpl): void $tpl->setVariable("POST_VAR", $this->getPostVar()); $tpl->setVariable("PROP_COLOR_ID", $this->getFieldId()); - if (substr(trim($this->getValue()), 0, 1) == "!" && $this->getAcceptNamedColors()) { + if (substr(trim($this->getValue() ?? ""), 0, 1) == "!" && $this->getAcceptNamedColors()) { $tpl->setVariable( "PROPERTY_VALUE_COLOR", ilLegacyFormElementsUtil::prepareFormOutput(trim($this->getValue())) diff --git a/Services/Style/Content/classes/class.ilObjStyleSheet.php b/Services/Style/Content/classes/class.ilObjStyleSheet.php index db5dd78b8dd6..acc2649f3a88 100755 --- a/Services/Style/Content/classes/class.ilObjStyleSheet.php +++ b/Services/Style/Content/classes/class.ilObjStyleSheet.php @@ -2605,16 +2605,24 @@ public static function _explodeRGB( $r["r"] = substr($a_rgb, 0, 2); $r["g"] = substr($a_rgb, 2, 2); $r["b"] = substr($a_rgb, 4, 2); - if ($as_dec) { - $r["r"] = (int) hexdec($r["r"]); - $r["g"] = (int) hexdec($r["g"]); - $r["b"] = (int) hexdec($r["b"]); + $r["r"] = self::hexdec($r["r"]); + $r["g"] = self::hexdec($r["g"]); + $r["b"] = self::hexdec($r["b"]); } return $r; } + protected static function hexdec(string $hex) : int + { + $hex = preg_replace("/[^a-fA-F0-9]+/", "", $hex); + if ($hex === "") { + $hex = "0"; + } + return (int) hexdec($hex); + } + /** * RGB to HLS (both arrays, 0..255) */ diff --git a/Services/Style/Content/classes/class.ilObjStyleSheetGUI.php b/Services/Style/Content/classes/class.ilObjStyleSheetGUI.php index a2d1dc75244c..bdd09f9c8a1e 100755 --- a/Services/Style/Content/classes/class.ilObjStyleSheetGUI.php +++ b/Services/Style/Content/classes/class.ilObjStyleSheetGUI.php @@ -839,8 +839,6 @@ public function saveColorObject(): void $lng = $this->lng; $this->initColorForm(); - $this->form_gui->checkInput(); - if ($this->form_gui->checkInput()) { if ($this->color_manager->colorExists($this->form_gui->getInput("color_name"))) { $col_input = $this->form_gui->getItemByPostVar("color_name"); @@ -866,9 +864,10 @@ public function updateColorObject(): void $ilCtrl = $this->ctrl; $lng = $this->lng; + $c_name = $this->style_request->getColorName(); + $ilCtrl->setParameter($this, "c_name", $c_name); $this->initColorForm("edit"); - $c_name = $this->style_request->getColorName(); if ($this->form_gui->checkInput()) { if ($this->color_manager->colorExists($this->form_gui->getInput("color_name")) && $this->form_gui->getInput("color_name") != $c_name) { @@ -883,7 +882,6 @@ public function updateColorObject(): void $ilCtrl->redirect($this, "listColors"); } } - $ilCtrl->setParameter($this, "c_name", $c_name); $this->form_gui->setValuesByPost(); $tpl->setContent($this->form_gui->getHTML()); } From caaf75c0866d532ce197556c1793d467d3039794 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Mon, 12 Feb 2024 23:50:36 +0100 Subject: [PATCH 466/497] 39022: Empty form for content style editing when changing @media --- .../class.ilStyleCharacteristicGUI.php | 13 ++++++++++++- .../Content/classes/class.ilObjStyleSheetGUI.php | 11 +---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Services/Style/Content/Characteristic/class.ilStyleCharacteristicGUI.php b/Services/Style/Content/Characteristic/class.ilStyleCharacteristicGUI.php index 844f1a91fca3..223388df5144 100644 --- a/Services/Style/Content/Characteristic/class.ilStyleCharacteristicGUI.php +++ b/Services/Style/Content/Characteristic/class.ilStyleCharacteristicGUI.php @@ -118,7 +118,7 @@ public function executeCommand(): void "pasteCharacteristicsWithinStyle", "pasteCharacteristicsFromOtherStyle", "saveStatus", "setOutdated", "removeOutdated", "editTagStyle", "refreshTagStyle", "updateTagStyle", - "editTagTitles", "saveTagTitles"])) { + "editTagTitles", "saveTagTitles", "switchMQuery"])) { $this->$cmd(); } } @@ -1312,4 +1312,15 @@ public function pasteCharacteristics(): void $ilCtrl->redirect($this, "listCharacteristics"); } + + /** + * Switch media query + */ + public function switchMQuery(): void + { + $ctrl = $this->gui_service->ctrl(); + $ctrl->setParameter($this, "mq_id", $this->request->getMediaQueryId()); + $ctrl->redirectByClass("ilstylecharacteristicgui", "editTagStyle"); + } + } diff --git a/Services/Style/Content/classes/class.ilObjStyleSheetGUI.php b/Services/Style/Content/classes/class.ilObjStyleSheetGUI.php index bdd09f9c8a1e..35441ba8b05f 100755 --- a/Services/Style/Content/classes/class.ilObjStyleSheetGUI.php +++ b/Services/Style/Content/classes/class.ilObjStyleSheetGUI.php @@ -361,15 +361,6 @@ public function updateObject(): void } } - /** - * Switch media query - */ - public function switchMQueryObject(): void - { - $ctrl = $this->gui_service->ctrl(); - $ctrl->setParameter($this, "mq_id", $this->style_request->getMediaQueryId()); - $ctrl->redirectByClass("ilstylecharacteristicgui", "editTagStyle"); - } public function exportStyleObject(): void { @@ -1083,7 +1074,7 @@ public function deleteMediaQueryConfirmationObject(): void foreach ($mq_ids as $i) { $mq = $this->object->getMediaQueryForId($i); - $cgui->addItem("mq_id[]", $i, $mq["mquery"]); + $cgui->addItem("mq_id[]", (string) $i, $mq["mquery"]); } $tpl->setContent($cgui->getHTML()); From f3ba5ca6e7a159199baa7961e754d764d0ca620f Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Tue, 13 Feb 2024 09:37:51 +0100 Subject: [PATCH 467/497] [FIX] wac path internal usage of normalizePath # Conflicts: # Services/WebAccessChecker/classes/class.ilWACSignedPath.php # Services/WebAccessChecker/test/Token/ilWACTokenTest.php --- .../classes/class.ilWACPath.php | 11 ++++--- .../classes/class.ilWACSignedPath.php | 2 +- .../test/Token/ilWACTokenTest.php | 29 ++++++++++--------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Services/WebAccessChecker/classes/class.ilWACPath.php b/Services/WebAccessChecker/classes/class.ilWACPath.php index bad295c070a7..70b72cfe1189 100644 --- a/Services/WebAccessChecker/classes/class.ilWACPath.php +++ b/Services/WebAccessChecker/classes/class.ilWACPath.php @@ -84,9 +84,11 @@ class ilWACPath protected string $module_identifier = ''; protected string $path_without_query = ''; - public function __construct(string $path) + public function __construct(string $path, bool $normalize = true) { - $path = $this->normalizePath($path); + if ($normalize) { + $path = $this->normalizePath($path); + } $this->setOriginalRequest($path); $re = '/' . self::REGEX . '/'; @@ -240,7 +242,7 @@ protected function normalizePath(string $path): string $realpath = realpath("." . $original_path); if (strpos($realpath, $real_data_dir) !== 0) { - throw new ilWACException(ilWACException::ACCESS_DENIED); + throw new ilWACException(ilWACException::ACCESS_DENIED, "Path is not in data directory"); } $normalized_path = ltrim( @@ -248,7 +250,8 @@ protected function normalizePath(string $path): string $real_data_dir, '', $realpath - ), '/' + ), + '/' ); return "/" . self::DIR_DATA . '/' . $normalized_path . (!empty($query) ? '?' . $query : ''); diff --git a/Services/WebAccessChecker/classes/class.ilWACSignedPath.php b/Services/WebAccessChecker/classes/class.ilWACSignedPath.php index 92d039b91c31..ed5d8fed5638 100644 --- a/Services/WebAccessChecker/classes/class.ilWACSignedPath.php +++ b/Services/WebAccessChecker/classes/class.ilWACSignedPath.php @@ -218,7 +218,7 @@ public static function signFile(string $path_to_file): string if ($path_to_file === '' || $path_to_file === '0') { return ''; } - $ilWACPath = new ilWACPath($path_to_file); + $ilWACPath = new ilWACPath($path_to_file, false); if ($ilWACPath->getClient() === '' || $ilWACPath->getClient() === '0') { return $path_to_file; } diff --git a/Services/WebAccessChecker/test/Token/ilWACTokenTest.php b/Services/WebAccessChecker/test/Token/ilWACTokenTest.php index 00dcab01ea7e..1eac9e859b74 100644 --- a/Services/WebAccessChecker/test/Token/ilWACTokenTest.php +++ b/Services/WebAccessChecker/test/Token/ilWACTokenTest.php @@ -1,5 +1,4 @@ * @version 1.0.0 * - * @runTestsInSeparateProcesses * @preserveGlobalState disabled * @backupGlobals disabled * @backupStaticAttributes disabled @@ -110,7 +111,7 @@ protected function setUp(): void //setup container for HttpServiceAware classes $container = new \ILIAS\DI\Container(); - $container['http'] = fn ($c) => Mockery::mock(GlobalHttpState::class); + $container['http'] = fn($c) => Mockery::mock(GlobalHttpState::class); $this->http = $container['http']; @@ -128,7 +129,7 @@ protected function setUp(): void public function testWithoutSigning(): void { - $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->file_one->url()), $this->http, $this->cookieFactory); + $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->file_one->url(), false), $this->http, $this->cookieFactory); $cookieJar = Mockery::mock(CookieJar::class); @@ -162,7 +163,7 @@ public function testSomeBasics(): void { $query = 'myparam=1234'; $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->file_four->url() . '?' - . $query), $this->http, $this->cookieFactory); + . $query, false), $this->http, $this->cookieFactory); $this->assertEquals('dummy.jpg', $ilWACSignedPath->getPathObject()->getFileName()); $this->assertEquals($query, $ilWACSignedPath->getPathObject()->getQuery()); @@ -176,7 +177,7 @@ public function testSomeBasics(): void public function testTokenGeneration(): void { - $ilWacPath = new ilWacPath($this->file_four->url()); + $ilWacPath = new ilWacPath($this->file_four->url(), false); $ilWACToken = new ilWACToken($ilWacPath->getPath(), self::CLIENT_NAME, 123456, 20); $ilWACToken->generateToken(); $this->assertEquals('SALT-client_name-123456-20', $ilWACToken->getRawToken()); @@ -244,7 +245,7 @@ public function testFileToken(): void // Request within lifetime $signed_path = ilWACSignedPath::signFile($this->file_one->url()); - $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($signed_path), $this->http, $this->cookieFactory); + $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($signed_path, false), $this->http, $this->cookieFactory); $this->assertTrue($ilWACSignedPath->isSignedPath()); $this->assertTrue($ilWACSignedPath->isSignedPathValid()); @@ -259,7 +260,7 @@ public function testFileToken(): void // Request after lifetime $signed_path = ilWACSignedPath::signFile($this->file_four->url()); sleep($lifetime + self::ADDITIONAL_TIME); - $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($signed_path), $this->http, $this->cookieFactory); + $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($signed_path, false), $this->http, $this->cookieFactory); $this->assertTrue($ilWACSignedPath->isSignedPath()); $this->assertFalse($ilWACSignedPath->isSignedPathValid()); } @@ -273,7 +274,7 @@ public function testModifiedTimestampNoMod(): void { // self::markTestSkipped("WIP"); // return; - $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->getModifiedSignedPath(0, 0)), $this->http, $this->cookieFactory); + $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->getModifiedSignedPath(0, 0), false), $this->http, $this->cookieFactory); $this->assertTrue($ilWACSignedPath->isSignedPath()); $this->assertTrue($ilWACSignedPath->isSignedPathValid()); } @@ -286,7 +287,7 @@ public function testModifiedTimestampAddTime(): void { // self::markTestSkipped("WIP"); // return; - $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->getModifiedSignedPath(self::ADDITIONAL_TIME, 0)), $this->http, $this->cookieFactory); + $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->getModifiedSignedPath(self::ADDITIONAL_TIME, 0), false), $this->http, $this->cookieFactory); $this->assertTrue($ilWACSignedPath->isSignedPath()); $this->assertFalse($ilWACSignedPath->isSignedPathValid()); } @@ -297,7 +298,7 @@ public function testModifiedTimestampSubTime(): void // self::markTestSkipped("WIP"); // return; $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->getModifiedSignedPath(self::ADDITIONAL_TIME - * -1, 0)), $this->http, $this->cookieFactory); + * -1, 0), false), $this->http, $this->cookieFactory); $this->assertTrue($ilWACSignedPath->isSignedPath()); $this->assertFalse($ilWACSignedPath->isSignedPathValid()); } @@ -307,7 +308,7 @@ public function testModifiedTTL(): void { // self::markTestSkipped("WIP"); // return; - $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->getModifiedSignedPath(0, 1)), $this->http, $this->cookieFactory); + $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->getModifiedSignedPath(0, 1), false), $this->http, $this->cookieFactory); $this->assertTrue($ilWACSignedPath->isSignedPath()); $this->assertFalse($ilWACSignedPath->isSignedPathValid()); } @@ -317,7 +318,7 @@ public function testModifiedTTLAndTimestamp(): void { // self::markTestSkipped("WIP"); // return; - $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->getModifiedSignedPath(1, 1)), $this->http, $this->cookieFactory); + $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->getModifiedSignedPath(1, 1), false), $this->http, $this->cookieFactory); $this->assertTrue($ilWACSignedPath->isSignedPath()); $this->assertFalse($ilWACSignedPath->isSignedPathValid()); } @@ -327,7 +328,7 @@ public function testModifiedToken(): void { // self::markTestSkipped("WIP"); // return; - $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->getModifiedSignedPath(0, 0, md5('LOREM'))), $this->http, $this->cookieFactory); + $ilWACSignedPath = new ilWACSignedPath(new ilWACPath($this->getModifiedSignedPath(0, 0, md5('LOREM')), false), $this->http, $this->cookieFactory); $this->assertTrue($ilWACSignedPath->isSignedPath()); $this->assertFalse($ilWACSignedPath->isSignedPathValid()); } From 28151b06a403a6f73477b2217d2506c7b30166cb Mon Sep 17 00:00:00 2001 From: Stefan Meyer Date: Tue, 13 Feb 2024 10:24:34 +0100 Subject: [PATCH 468/497] 0040490: false tab is highlighted when deleting objects in course --- Modules/Course/classes/class.ilObjCourseGUI.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Modules/Course/classes/class.ilObjCourseGUI.php b/Modules/Course/classes/class.ilObjCourseGUI.php index 77dda258fd15..4a65dd4cf8bb 100755 --- a/Modules/Course/classes/class.ilObjCourseGUI.php +++ b/Modules/Course/classes/class.ilObjCourseGUI.php @@ -55,6 +55,7 @@ class ilObjCourseGUI extends ilContainerGUI protected GlobalHttpState $http; protected Factory $refinery; protected ilHelpGUI $help; + protected ilTabsGUI $tabs; protected ilNavigationHistory $navigation_history; public function __construct($a_data, int $a_id, bool $a_call_by_reference = true, bool $a_prepare_output = true) @@ -65,6 +66,7 @@ public function __construct($a_data, int $a_id, bool $a_call_by_reference = true parent::__construct($a_data, $a_id, $a_call_by_reference, $a_prepare_output); $this->help = $DIC->help(); + $this->tabs = $DIC->tabs(); $this->logger = $DIC->logger()->crs(); $this->navigation_history = $DIC['ilNavigationHistory']; $this->ctrl->saveParameter($this, ['ref_id']); @@ -165,6 +167,12 @@ public function viewObject(): void } } + public function deleteObject(bool $error = false): void + { + $this->tabs->activateTab('view_content'); + parent::deleteObject($error); + } + public function renderContainer(): void { parent::renderObject(); From dc6f412c322b95b4a47268ec09f356ecdc08a016 Mon Sep 17 00:00:00 2001 From: Stefan Meyer Date: Tue, 13 Feb 2024 10:27:17 +0100 Subject: [PATCH 469/497] 0040490: false tab is highlighted when deleting objects in course --- Modules/Course/classes/class.ilObjCourseGUI.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Modules/Course/classes/class.ilObjCourseGUI.php b/Modules/Course/classes/class.ilObjCourseGUI.php index 4a65dd4cf8bb..b2dbe98ac4a7 100755 --- a/Modules/Course/classes/class.ilObjCourseGUI.php +++ b/Modules/Course/classes/class.ilObjCourseGUI.php @@ -55,7 +55,6 @@ class ilObjCourseGUI extends ilContainerGUI protected GlobalHttpState $http; protected Factory $refinery; protected ilHelpGUI $help; - protected ilTabsGUI $tabs; protected ilNavigationHistory $navigation_history; public function __construct($a_data, int $a_id, bool $a_call_by_reference = true, bool $a_prepare_output = true) @@ -66,7 +65,6 @@ public function __construct($a_data, int $a_id, bool $a_call_by_reference = true parent::__construct($a_data, $a_id, $a_call_by_reference, $a_prepare_output); $this->help = $DIC->help(); - $this->tabs = $DIC->tabs(); $this->logger = $DIC->logger()->crs(); $this->navigation_history = $DIC['ilNavigationHistory']; $this->ctrl->saveParameter($this, ['ref_id']); @@ -169,7 +167,7 @@ public function viewObject(): void public function deleteObject(bool $error = false): void { - $this->tabs->activateTab('view_content'); + $this->tabs_gui->activateTab('view_content'); parent::deleteObject($error); } From b9c79d7de397d19d0179e4a5c204903a29987c76 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 13 Feb 2024 10:29:16 +0100 Subject: [PATCH 470/497] 31429: Labeling of Select Multiple Editing slate --- lang/ilias_en.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 0650365019dc..62bb78052c85 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -6231,7 +6231,7 @@ content#:#cont_click_br_corner#:#Please click on the bottom right corner of the content#:#cont_click_center#:#Please click on center of the desired area. content#:#cont_click_circle#:#Please click on a circle point of the desired area. content#:#cont_click_edit#:#To edit a page element, click on it. -content#:#cont_click_multi_select#:#Click on elements to select or deselect them. +content#:#cont_click_multi_select#:#Click on elements to select them. content#:#cont_click_next_or_save#:#Please click on the next point of the polygon or save the area. (It is not necessary to click again on the starting point of this polygon !) content#:#cont_click_next_point#:#Please click on the next point of the polygon. content#:#cont_click_starting_point#:#Please click on the starting point of the polygon. From 2b1cb8d1d8d4d157d3000d72cae240d5facc7b68 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 13 Feb 2024 10:37:17 +0100 Subject: [PATCH 471/497] 40491: no tab is highlighted when deleting objects in folder --- Modules/Folder/classes/class.ilObjFolderGUI.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Modules/Folder/classes/class.ilObjFolderGUI.php b/Modules/Folder/classes/class.ilObjFolderGUI.php index 1a36ddc2bc63..6adbee8f143b 100755 --- a/Modules/Folder/classes/class.ilObjFolderGUI.php +++ b/Modules/Folder/classes/class.ilObjFolderGUI.php @@ -600,4 +600,10 @@ public function setSubTabs(string $a_tab): void $ilTabs->activateSubTab($a_tab); $ilTabs->activateTab("settings"); } + + public function deleteObject(bool $error = false): void + { + $this->tabs_gui->activateTab('view_content'); + parent::deleteObject($error); + } } From 4163c5ea741f361fd8764feedf5a26f78bf1cd91 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 13 Feb 2024 10:56:04 +0100 Subject: [PATCH 472/497] 39308: Its not possible to adopt (link) all object from a specific course --- Services/COPage/classes/class.ilPCPlugged.php | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/Services/COPage/classes/class.ilPCPlugged.php b/Services/COPage/classes/class.ilPCPlugged.php index d37d1a2ea909..021037fd9bd5 100755 --- a/Services/COPage/classes/class.ilPCPlugged.php +++ b/Services/COPage/classes/class.ilPCPlugged.php @@ -167,32 +167,36 @@ public static function handleCopiedPluggedContent( $plugin_name = $node->getAttribute('PluginName'); $plugin_version = $node->getAttribute('PluginVersion'); - $plugin_info = $component_repository->getPluginByName($plugin_name); - if ($plugin_info->isActive()) { - /** @var ilPageComponentPlugin $plugin_obj */ - $plugin_obj = $component_factory->getPlugin($plugin_info->getId()); - $plugin_obj->setPageObj($a_page); - - $properties = array(); - /** @var DOMElement $child */ - foreach ($node->childNodes as $child) { - $properties[$child->getAttribute('Name')] = $child->nodeValue; - } - - // let the plugin copy additional content - // and allow it to modify the saved parameters - $plugin_obj->onClone($properties, $plugin_version); - - foreach ($node->childNodes as $child) { - $node->removeChild($child); - } - foreach ($properties as $name => $value) { - $child = new DOMElement('PluggedProperty', - str_replace("&", "&", $value) - ); - $node->appendChild($child); - $child->setAttribute('Name', $name); + try { + $plugin_info = $component_repository->getPluginByName($plugin_name); + if ($plugin_info->isActive()) { + /** @var ilPageComponentPlugin $plugin_obj */ + $plugin_obj = $component_factory->getPlugin($plugin_info->getId()); + $plugin_obj->setPageObj($a_page); + + $properties = array(); + /** @var DOMElement $child */ + foreach ($node->childNodes as $child) { + $properties[$child->getAttribute('Name')] = $child->nodeValue; + } + + // let the plugin copy additional content + // and allow it to modify the saved parameters + $plugin_obj->onClone($properties, $plugin_version); + + foreach ($node->childNodes as $child) { + $node->removeChild($child); + } + foreach ($properties as $name => $value) { + $child = new DOMElement( + 'PluggedProperty', + str_replace("&", "&", $value) + ); + $node->appendChild($child); + $child->setAttribute('Name', $name); + } } + } catch (Exception $e) { } } } From 01a5e1e0db2a7720801d83bec27215b3c25b0fe2 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 13 Feb 2024 11:10:31 +0100 Subject: [PATCH 473/497] User: Fix Access to ilUser See: https://mantis.ilias.de/view.php?id=40498 --- Services/User/classes/class.ilObjUserGUI.php | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/Services/User/classes/class.ilObjUserGUI.php b/Services/User/classes/class.ilObjUserGUI.php index d3249dcc7b94..aeb79417e245 100755 --- a/Services/User/classes/class.ilObjUserGUI.php +++ b/Services/User/classes/class.ilObjUserGUI.php @@ -784,7 +784,7 @@ public function updateObject(): void } catch (ilUserException $e) { $this->tpl->setOnScreenMessage('failure', $e->getMessage()); $this->form_gui->setValuesByPost(); - $tpl->setContent($this->form_gui->getHTML()); + $this->tpl->setContent($this->form_gui->getHTML()); return; } @@ -854,14 +854,14 @@ public function updateObject(): void // If the current user is editing its own user account, // we update his preferences. - if ($ilUser->getId() == $this->object->getId()) { - $ilUser->readPrefs(); + if ($this->user->getId() == $this->object->getId()) { + $this->user->readPrefs(); } - $ilUser->setPref( + $this->user->setPref( 'send_info_mails', ($this->form_gui->getInput("send_mail") == 'y') ? 'y' : 'n' ); - $ilUser->writePrefs(); + $this->user->writePrefs(); $mail_message = $this->__sendProfileMail(); $msg = $this->lng->txt('saved_successfully') . $mail_message; @@ -891,7 +891,7 @@ public function updateObject(): void } else { $this->form_gui->setValuesByPost(); $this->tabs_gui->activateTab('properties'); - $tpl->setContent($this->form_gui->getHtml()); + $this->tpl->setContent($this->form_gui->getHtml()); } } @@ -900,11 +900,6 @@ public function updateObject(): void */ public function getValues(): void { - global $DIC; - - $ilUser = $DIC['ilUser']; - $ilSetting = $DIC['ilSetting']; - $data = array(); // login data From b26ddf1cb9a5ae68d12bbebba735b229d2e67c59 Mon Sep 17 00:00:00 2001 From: Stefan Meyer Date: Tue, 13 Feb 2024 11:48:26 +0100 Subject: [PATCH 474/497] 0026268: ilDatePresentation::formatDate => wrong date (was: Exercise and Timezone => Wrong date) --- Services/Calendar/classes/class.ilDatePresentation.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Services/Calendar/classes/class.ilDatePresentation.php b/Services/Calendar/classes/class.ilDatePresentation.php index ae6d58d05cd3..5a596fa32619 100644 --- a/Services/Calendar/classes/class.ilDatePresentation.php +++ b/Services/Calendar/classes/class.ilDatePresentation.php @@ -90,6 +90,7 @@ public static function formatDate(ilDateTime $date, bool $a_skip_day = false, bo global $DIC; $lng = $DIC['lng']; + $lng->loadLanguageModule('dateplaner'); $ilUser = $DIC['ilUser']; if ($date->isNull()) { @@ -99,6 +100,7 @@ public static function formatDate(ilDateTime $date, bool $a_skip_day = false, bo $has_time = !is_a($date, 'ilDate'); // Converting pure dates to user timezone might return wrong dates + $date_info = []; if ($has_time) { $date_info = $date->get(IL_CAL_FKT_GETDATE, '', $ilUser->getTimeZone()); } else { @@ -117,9 +119,9 @@ public static function formatDate(ilDateTime $date, bool $a_skip_day = false, bo } else { $date_str = ""; if ($a_include_wd) { - $date_str = $lng->txt(self::$weekdays[$date->get(IL_CAL_FKT_DATE, 'w')]) . ", "; + $date_str = $lng->txt(self::$weekdays[$date_info['wday']]) . ", "; } - $date_str .= $date->get(IL_CAL_FKT_DATE, 'd') . '. ' . + $date_str .= $date_info['mday'] . '. ' . ilCalendarUtil::_numericMonthToString($date_info['mon'], false) . ' ' . $date_info['year']; } From 31c747543c211b2c82875b0e8c5abcc59ba0dae2 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 13 Feb 2024 15:55:03 +0100 Subject: [PATCH 475/497] 39960: Bildergalerie: Lernfortschritt wird nicht festgehalten --- .../LearningProgressManager.php | 54 ++++++++++++++++ .../class.McstImageGalleryGUI.php | 61 ++++++++++++++++--- .../Service/class.InternalDomainService.php | 8 ++- .../classes/class.ilObjMediaCast.php | 18 ++---- .../classes/class.ilObjMediaCastGUI.php | 7 +++ 5 files changed, 124 insertions(+), 24 deletions(-) create mode 100644 Modules/MediaCast/LearningProgress/LearningProgressManager.php diff --git a/Modules/MediaCast/LearningProgress/LearningProgressManager.php b/Modules/MediaCast/LearningProgress/LearningProgressManager.php new file mode 100644 index 000000000000..18dcdf53d7fb --- /dev/null +++ b/Modules/MediaCast/LearningProgress/LearningProgressManager.php @@ -0,0 +1,54 @@ +media_cast = $media_cast; + } + + public function addItemToLP(int $mob_id): void + { + $lp = \ilObjectLP::getInstance($this->media_cast->getId()); + + // see ilLPListOfSettingsGUI assign + $collection = $lp->getCollectionInstance(); + if ( + $collection && + $collection->hasSelectableItems() && + $this->media_cast->getNewItemsInLearningProgress() + ) { + $collection->activateEntries([$mob_id]); + $lp->resetCaches(); + \ilLPStatusWrapper::_refreshStatus($this->media_cast->getId()); + } + } + + public function isCollectionMode(): bool + { + $lp = \ilObjectLP::getInstance($this->media_cast->getId()); + return $lp->getCurrentMode() === \ilLPObjSettings::LP_MODE_COLLECTION_MOBS; + } +} diff --git a/Modules/MediaCast/Presentation/class.McstImageGalleryGUI.php b/Modules/MediaCast/Presentation/class.McstImageGalleryGUI.php index c5d90614c8e4..ed91cb3fefe2 100644 --- a/Modules/MediaCast/Presentation/class.McstImageGalleryGUI.php +++ b/Modules/MediaCast/Presentation/class.McstImageGalleryGUI.php @@ -23,6 +23,8 @@ */ class McstImageGalleryGUI { + protected \ILIAS\MediaCast\InternalDomainService $domain; + protected string $completed_callback; protected string $rss_link; protected \ilObjMediaCast $media_cast; protected ilGlobalTemplateInterface $tpl; @@ -32,9 +34,11 @@ class McstImageGalleryGUI protected \ilCtrl $ctrl; protected \ilToolbarGUI $toolbar; - public function __construct(\ilObjMediaCast $obj, $tpl = null, - string $rss_link = "") - { + public function __construct( + \ilObjMediaCast $obj, + $tpl = null, + string $rss_link = "" + ) { global $DIC; $this->ui = $DIC->ui(); @@ -45,6 +49,7 @@ public function __construct(\ilObjMediaCast $obj, $tpl = null, $this->user = $DIC->user(); $this->ctrl = $DIC->ctrl(); $this->toolbar = $DIC->toolbar(); + $this->domain = $DIC->mediaCast()->internal()->domain(); } public function executeCommand(): void @@ -89,6 +94,10 @@ public function getHTML(): string $modals = []; $pages = []; + + $lp_collection_mode = $this->domain->learningProgress($this->media_cast)->isCollectionMode(); + + $mob_modals = []; foreach ($this->media_cast->getSortedItemsArray() as $item) { $mob = new \ilObjMediaObject($item["mob_id"]); $med = $mob->getMediaItem("Standard"); @@ -110,8 +119,15 @@ public function getHTML(): string ); $pages[] = $f->modal()->lightboxImagePage($image, $mob->getTitle()); + if ($lp_collection_mode) { + $mob_modals[$mob->getId()] = $f->modal()->lightbox($pages); + $pages = []; + } + } + $main_modal = null; + if (!$lp_collection_mode) { + $main_modal = $f->modal()->lightbox($pages); } - $main_modal = $f->modal()->lightbox($pages); $cnt = 0; foreach ($this->media_cast->getSortedItemsArray() as $item) { @@ -144,13 +160,28 @@ public function getHTML(): string $mob->getTitle() ); - $modal = $main_modal; + if (!$lp_collection_mode) { + $modal = $main_modal; + } else { + $modal = $mob_modals[$mob->getId()]; + } $card_image = $preview_image->withAction($modal->getShowSignal()); - $card_image = $card_image->withAdditionalOnLoadCode(function ($id) use ($cnt) { - return "$('#$id').click(function(e) { document.querySelector('.modal-body .carousel [data-slide-to=\"" . $cnt . "\"]').click(); });"; + $slide_to = ""; + $completed_cb = ""; + if (!$lp_collection_mode) { + $slide_to = "document.querySelector('.modal-body .carousel [data-slide-to=\"" . $cnt . "\"]').click();"; + } else { + $completed_cb = $this->completed_callback . '&mob_id=' . $mob->getId(); + $completed_cb = "$.ajax({type:'GET', url: '$completed_cb'});"; + } + + $card_image = $card_image->withAdditionalOnLoadCode(function ($id) use ($slide_to, $completed_cb) { + return "$('#$id').click(function(e) { $slide_to $completed_cb });"; }); - $cnt++; + if (!$lp_collection_mode) { + $cnt++; + } $sections = ($mob->getDescription()) ? [$f->legacy($mob->getDescription())] @@ -179,10 +210,15 @@ public function getHTML(): string $deck = $f->deck($cards); - if (count($pages) == 0) { + if (count($pages) === 0 && count($mob_modals) === 0) { return ""; } - return ""; + if (!$lp_collection_mode) { + $modals = [$main_modal]; + } else { + $modals = $mob_modals; + } + return ""; } protected function downloadAll(): void @@ -204,4 +240,9 @@ protected function downloadAll(): void $this->ctrl->redirectByClass("ilobjmediacastgui", "showContent"); } + + public function setCompletedCallback(string $completed_callback): void + { + $this->completed_callback = $completed_callback; + } } diff --git a/Modules/MediaCast/Service/class.InternalDomainService.php b/Modules/MediaCast/Service/class.InternalDomainService.php index 053937c43f3f..d4dc72239968 100644 --- a/Modules/MediaCast/Service/class.InternalDomainService.php +++ b/Modules/MediaCast/Service/class.InternalDomainService.php @@ -22,6 +22,7 @@ use ILIAS\DI\Container; use ILIAS\Repository\GlobalDICDomainServices; +use ILIAS\MediaCast\LearningProgress\LearningProgressManager; /** * @author Alexander Killing @@ -54,8 +55,13 @@ public function access(int $ref_id, int $user_id) : Access\AccessManager ); }*/ - public function mediaCast() : MediaCastManager + public function mediaCast(): MediaCastManager { return new MediaCastManager(); } + + public function learningProgress(\ilObjMediaCast $cast): LearningProgressManager + { + return new LearningProgressManager($cast); + } } diff --git a/Modules/MediaCast/classes/class.ilObjMediaCast.php b/Modules/MediaCast/classes/class.ilObjMediaCast.php index ff05bb67e550..30e259c14bd8 100755 --- a/Modules/MediaCast/classes/class.ilObjMediaCast.php +++ b/Modules/MediaCast/classes/class.ilObjMediaCast.php @@ -34,6 +34,7 @@ class ilObjMediaCast extends ilObject public const AUTOPLAY_NO = 0; public const AUTOPLAY_ACT = 1; public const AUTOPLAY_INACT = 2; + protected \ILIAS\MediaCast\InternalDomainService $domain; protected \ILIAS\MediaObjects\Tracking\TrackingManager $mob_tracking; protected array $itemsarray; @@ -65,6 +66,7 @@ public function __construct( $this->mob_tracking = $DIC->mediaObjects()->internal() ->domain() ->tracking(); + $this->domain = $DIC->mediaCast()->internal()->domain(); parent::__construct($a_id, $a_call_by_reference); } @@ -523,19 +525,9 @@ public function addMobToCast( $mc_item->setVisibility($this->getDefaultAccess() == 0 ? "users" : "public"); $mc_item->create(); - $lp = ilObjectLP::getInstance($this->getId()); - - // see ilLPListOfSettingsGUI assign - $collection = $lp->getCollectionInstance(); - if ( - $collection && - $collection->hasSelectableItems() && - $this->getNewItemsInLearningProgress() - ) { - $collection->activateEntries([$mob_id]); - $lp->resetCaches(); - ilLPStatusWrapper::_refreshStatus($this->getId()); - } + $lp = $this->domain->learningProgress($this); + $lp->addItemToLP($mob_id); + return $mc_item->getId(); } diff --git a/Modules/MediaCast/classes/class.ilObjMediaCastGUI.php b/Modules/MediaCast/classes/class.ilObjMediaCastGUI.php index 0f2ce38b379f..e836163d932d 100755 --- a/Modules/MediaCast/classes/class.ilObjMediaCastGUI.php +++ b/Modules/MediaCast/classes/class.ilObjMediaCastGUI.php @@ -1489,6 +1489,13 @@ public function showContentObject(): void $this->showGallery(); } elseif ($this->object->getViewMode() == ilObjMediaCast::VIEW_IMG_GALLERY) { $view = new \McstImageGalleryGUI($this->object, $this->tpl, $this->getFeedLink()); + $view->setCompletedCallback($this->ctrl->getLinkTarget( + $this, + "handlePlayerCompletedEvent", + "", + true, + false + )); $this->tabs->activateTab("content"); $this->addContentSubTabs("content"); $tpl->setContent($this->ctrl->getHTML($view)); From f2f3aaf9de3aeefd3180ebdab3cc871db37c161c Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Tue, 13 Feb 2024 11:39:35 +0100 Subject: [PATCH 476/497] [FIX] WAC support for ILIAS ins subdirectories --- Services/WebAccessChecker/classes/class.ilWACPath.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Services/WebAccessChecker/classes/class.ilWACPath.php b/Services/WebAccessChecker/classes/class.ilWACPath.php index 70b72cfe1189..751bf69097fc 100644 --- a/Services/WebAccessChecker/classes/class.ilWACPath.php +++ b/Services/WebAccessChecker/classes/class.ilWACPath.php @@ -235,6 +235,9 @@ public static function setVideoSuffixes(array $video_suffixes): void protected function normalizePath(string $path): string { $path = ltrim($path, '.'); + // cut everything before "data/" (for installations using a subdirectory) + $path = strstr($path, '/' . self::DIR_DATA . '/'); + $original_path = parse_url($path, PHP_URL_PATH); $query = parse_url($path, PHP_URL_QUERY); From 0fe6fb8c7c6ba21d85352e87ba5dec562e0c612e Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Tue, 13 Feb 2024 17:45:54 +0100 Subject: [PATCH 477/497] 39280: Failed test: Neues Medienobjekt anlegen --- .../MediaObjects/classes/class.ilExternalMediaAnalyzer.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Services/MediaObjects/classes/class.ilExternalMediaAnalyzer.php b/Services/MediaObjects/classes/class.ilExternalMediaAnalyzer.php index c58bedd8faa3..1ce8d1b005e6 100755 --- a/Services/MediaObjects/classes/class.ilExternalMediaAnalyzer.php +++ b/Services/MediaObjects/classes/class.ilExternalMediaAnalyzer.php @@ -55,7 +55,10 @@ public static function extractYouTubeParameters( } elseif (strpos($a_location, "youtu.be") > 0) { $par["v"] = substr($a_location, strrpos($a_location, "/") + 1); } - + $qpos = strpos($par["v"], "?"); + if (is_int($qpos)) { + $par["v"] = substr($par["v"], 0, $qpos); + } return $par; } From a8442e1ce1dd3123208d26eaf996a035e8f8f950 Mon Sep 17 00:00:00 2001 From: Uwe Kohnle Date: Tue, 13 Feb 2024 23:12:07 +0000 Subject: [PATCH 478/497] remove unallowed characters in SCORM manifest and properties data --- .../classes/class.ilSCORM13MDImporter.php | 632 +++++++++--------- .../Scorm2004/classes/ilSCORM13Package.php | 100 ++- .../SCORM/class.ilSCORMPackageParser.php | 8 +- .../class.ilObjSAHSLearningModuleGUI.php | 7 +- .../classes/class.ilScormAiccImporter.php | 2 +- 5 files changed, 391 insertions(+), 358 deletions(-) diff --git a/Modules/Scorm2004/classes/class.ilSCORM13MDImporter.php b/Modules/Scorm2004/classes/class.ilSCORM13MDImporter.php index ef5446fb956b..ad0d724f5261 100644 --- a/Modules/Scorm2004/classes/class.ilSCORM13MDImporter.php +++ b/Modules/Scorm2004/classes/class.ilSCORM13MDImporter.php @@ -48,22 +48,22 @@ public function __construct(\DOMDocument $a_manifest_dom, int $a_obj_id) public function setTitle(string $a_val): void { - $this->title = $a_val; + $this->title = ilUtil::stripSlashes($a_val); } public function getTitle(): string { - return $this->title; + return ilUtil::stripSlashes($this->title); } public function setDescription(string $a_val): void { - $this->description = $a_val; + $this->description = ilUtil::stripSlashes($a_val); } public function getDescription(): string { - return $this->description; + return ilUtil::stripSlashes($this->description); } public function import(): void @@ -130,7 +130,7 @@ public function handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs) strtolower(get_class($par)) === 'ilmdannotation' or strtolower(get_class($par)) === 'ilmdclassification') { // todo -// $par->setDescriptionLanguage(new ilMDLanguageItem($a_attribs['Language'])); + // $par->setDescriptionLanguage(new ilMDLanguageItem($a_attribs['Language'])); } elseif ($this->in("general")) { $this->md_des = $par->addDescription(); $this->md_des->save(); @@ -147,11 +147,11 @@ public function handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs) } break; - // todo - /*case 'Coverage': - $par =& $this->__getParent(); - $par->setCoverageLanguage(new ilMDLanguageItem($a_attribs['Language'])); - break;*/ + // todo + /*case 'Coverage': + $par =& $this->__getParent(); + $par->setCoverageLanguage(new ilMDLanguageItem($a_attribs['Language'])); + break;*/ case 'lifeCycle': $par = $this->__getParent(); @@ -165,201 +165,201 @@ public function handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs) // nothing to do here break; - /*case 'metaMetadata': - $par = $this->__getParent(); - $this->md_met = $par->addMetaMetadata(); - $this->md_met->setMetaDataScheme($a_attribs['MetadataScheme']); - $this->md_met->setLanguage(new ilMDLanguageItem($a_attribs['Language'])); - $this->md_met->save(); - $this->__pushParent($this->md_met); - break;*/ - - // todo - /*case 'Contribute': - $par =& $this->__getParent(); - $this->md_con =& $par->addContribute(); - $this->md_con->setRole($a_attribs['Role']); - $this->md_con->save(); - $this->__pushParent($this->md_con); - break; - - case 'Entity': - $par =& $this->__getParent(); + /*case 'metaMetadata': + $par = $this->__getParent(); + $this->md_met = $par->addMetaMetadata(); + $this->md_met->setMetaDataScheme($a_attribs['MetadataScheme']); + $this->md_met->setLanguage(new ilMDLanguageItem($a_attribs['Language'])); + $this->md_met->save(); + $this->__pushParent($this->md_met); + break;*/ - if(strtolower(get_class($par)) == 'ilmdcontribute') - { - $this->md_ent =& $par->addEntity(); - $this->md_ent->save(); - $this->__pushParent($this->md_ent); + // todo + /*case 'Contribute': + $par =& $this->__getParent(); + $this->md_con =& $par->addContribute(); + $this->md_con->setRole($a_attribs['Role']); + $this->md_con->save(); + $this->__pushParent($this->md_con); break; - } - else - { - // single element in 'Annotation' + + case 'Entity': + $par =& $this->__getParent(); + + if(strtolower(get_class($par)) == 'ilmdcontribute') + { + $this->md_ent =& $par->addEntity(); + $this->md_ent->save(); + $this->__pushParent($this->md_ent); + break; + } + else + { + // single element in 'Annotation' + break; + } + case 'Date': break; - } - case 'Date': - break; - case 'Technical': - $par =& $this->__getParent(); - $this->md_tec =& $par->addTechnical(); - $this->md_tec->save(); - $this->__pushParent($this->md_tec); - break; + case 'Technical': + $par =& $this->__getParent(); + $this->md_tec =& $par->addTechnical(); + $this->md_tec->save(); + $this->__pushParent($this->md_tec); + break; - case 'Format': - $par =& $this->__getParent(); - $this->md_for =& $par->addFormat(); - $this->md_for->save(); - $this->__pushParent($this->md_for); - break; + case 'Format': + $par =& $this->__getParent(); + $this->md_for =& $par->addFormat(); + $this->md_for->save(); + $this->__pushParent($this->md_for); + break; - case 'Size': - break; + case 'Size': + break; - case 'Location': - $par =& $this->__getParent(); - $this->md_loc =& $par->addLocation(); - $this->md_loc->setLocationType($a_attribs['Type']); - $this->md_loc->save(); - $this->__pushParent($this->md_loc); - break; + case 'Location': + $par =& $this->__getParent(); + $this->md_loc =& $par->addLocation(); + $this->md_loc->setLocationType($a_attribs['Type']); + $this->md_loc->save(); + $this->__pushParent($this->md_loc); + break; - case 'Requirement': - $par =& $this->__getParent(); - $this->md_req =& $par->addRequirement(); - $this->md_req->save(); - $this->__pushParent($this->md_req); - break; + case 'Requirement': + $par =& $this->__getParent(); + $this->md_req =& $par->addRequirement(); + $this->md_req->save(); + $this->__pushParent($this->md_req); + break; - case 'OrComposite': - $par =& $this->__getParent(); - $this->md_orc =& $par->addOrComposite(); - $this->__pushParent($this->md_orc); - break; + case 'OrComposite': + $par =& $this->__getParent(); + $this->md_orc =& $par->addOrComposite(); + $this->__pushParent($this->md_orc); + break; - case 'Type': - break; + case 'Type': + break; - case 'OperatingSystem': - $par =& $this->__getParent(); - $par->setOperatingSystemName($a_attribs['Name']); - $par->setOperatingSystemMinimumVersion($a_attribs['MinimumVersion']); - $par->setOperatingSystemMaximumVersion($a_attribs['MaximumVersion']); - break; + case 'OperatingSystem': + $par =& $this->__getParent(); + $par->setOperatingSystemName($a_attribs['Name']); + $par->setOperatingSystemMinimumVersion($a_attribs['MinimumVersion']); + $par->setOperatingSystemMaximumVersion($a_attribs['MaximumVersion']); + break; - case 'Browser': - $par =& $this->__getParent(); - $par->setBrowserName($a_attribs['Name']); - $par->setBrowserMinimumVersion($a_attribs['MinimumVersion']); - $par->setBrowserMaximumVersion($a_attribs['MaximumVersion']); - break; + case 'Browser': + $par =& $this->__getParent(); + $par->setBrowserName($a_attribs['Name']); + $par->setBrowserMinimumVersion($a_attribs['MinimumVersion']); + $par->setBrowserMaximumVersion($a_attribs['MaximumVersion']); + break; - case 'InstallationRemarks': - $par =& $this->__getParent(); - $par->setInstallationRemarksLanguage(new ilMDLanguageItem($a_attribs['Language'])); - break; + case 'InstallationRemarks': + $par =& $this->__getParent(); + $par->setInstallationRemarksLanguage(new ilMDLanguageItem($a_attribs['Language'])); + break; - case 'OtherPlatformRequirements': - $par =& $this->__getParent(); - $par->setOtherPlatformRequirementsLanguage(new ilMDLanguageItem($a_attribs['Language'])); - break; + case 'OtherPlatformRequirements': + $par =& $this->__getParent(); + $par->setOtherPlatformRequirementsLanguage(new ilMDLanguageItem($a_attribs['Language'])); + break; - case 'Duration': - break; + case 'Duration': + break; - case 'Educational': - $par =& $this->__getParent(); - $this->md_edu =& $par->addEducational(); - $this->md_edu->setInteractivityType($a_attribs['InteractivityType']); - $this->md_edu->setLearningResourceType($a_attribs['LearningResourceType']); - $this->md_edu->setInteractivityLevel($a_attribs['InteractivityLevel']); - $this->md_edu->setSemanticDensity($a_attribs['SemanticDensity']); - $this->md_edu->setIntendedEndUserRole($a_attribs['IntendedEndUserRole']); - $this->md_edu->setContext($a_attribs['Context']); - $this->md_edu->setDifficulty($a_attribs['Difficulty']); - $this->md_edu->save(); - $this->__pushParent($this->md_edu); - break; + case 'Educational': + $par =& $this->__getParent(); + $this->md_edu =& $par->addEducational(); + $this->md_edu->setInteractivityType($a_attribs['InteractivityType']); + $this->md_edu->setLearningResourceType($a_attribs['LearningResourceType']); + $this->md_edu->setInteractivityLevel($a_attribs['InteractivityLevel']); + $this->md_edu->setSemanticDensity($a_attribs['SemanticDensity']); + $this->md_edu->setIntendedEndUserRole($a_attribs['IntendedEndUserRole']); + $this->md_edu->setContext($a_attribs['Context']); + $this->md_edu->setDifficulty($a_attribs['Difficulty']); + $this->md_edu->save(); + $this->__pushParent($this->md_edu); + break; - case 'TypicalAgeRange': - $par =& $this->__getParent(); - $this->md_typ =& $par->addTypicalAgeRange(); - $this->md_typ->setTypicalAgeRangeLanguage(new ilMDLanguageItem($a_attribs['Language'])); - $this->md_typ->save(); - $this->__pushParent($this->md_typ); - break; + case 'TypicalAgeRange': + $par =& $this->__getParent(); + $this->md_typ =& $par->addTypicalAgeRange(); + $this->md_typ->setTypicalAgeRangeLanguage(new ilMDLanguageItem($a_attribs['Language'])); + $this->md_typ->save(); + $this->__pushParent($this->md_typ); + break; - case 'TypicalLearningTime': - break; + case 'TypicalLearningTime': + break; - case 'Rights': - $par =& $this->__getParent(); - $this->md_rig =& $par->addRights(); - $this->md_rig->setCosts($a_attribs['Cost']); - $this->md_rig->setCopyrightAndOtherRestrictions($a_attribs['CopyrightAndOtherRestrictions']); - $this->md_rig->save(); - $this->__pushParent($this->md_rig); - break; + case 'Rights': + $par =& $this->__getParent(); + $this->md_rig =& $par->addRights(); + $this->md_rig->setCosts($a_attribs['Cost']); + $this->md_rig->setCopyrightAndOtherRestrictions($a_attribs['CopyrightAndOtherRestrictions']); + $this->md_rig->save(); + $this->__pushParent($this->md_rig); + break; - case 'Relation': - $par =& $this->__getParent(); - $this->md_rel =& $par->addRelation(); - $this->md_rel->setKind($a_attribs['Kind']); - $this->md_rel->save(); - $this->__pushParent($this->md_rel); - break; + case 'Relation': + $par =& $this->__getParent(); + $this->md_rel =& $par->addRelation(); + $this->md_rel->setKind($a_attribs['Kind']); + $this->md_rel->save(); + $this->__pushParent($this->md_rel); + break; - case 'Resource': - break; + case 'Resource': + break; - case 'Identifier_': - $par =& $this->__getParent(); - $this->md_ide_ =& $par->addIdentifier_(); - $this->md_ide_->setCatalog($a_attribs['Catalog']); - $this->md_ide_->setEntry($a_attribs['Entry']); - $this->md_ide_->save(); - $this->__pushParent($this->md_ide_); - break; + case 'Identifier_': + $par =& $this->__getParent(); + $this->md_ide_ =& $par->addIdentifier_(); + $this->md_ide_->setCatalog($a_attribs['Catalog']); + $this->md_ide_->setEntry($a_attribs['Entry']); + $this->md_ide_->save(); + $this->__pushParent($this->md_ide_); + break; - case 'Annotation': - $par =& $this->__getParent(); - $this->md_ann =& $par->addAnnotation(); - $this->md_ann->save(); - $this->__pushParent($this->md_ann); - break; + case 'Annotation': + $par =& $this->__getParent(); + $this->md_ann =& $par->addAnnotation(); + $this->md_ann->save(); + $this->__pushParent($this->md_ann); + break; - case 'Classification': - $par =& $this->__getParent(); - $this->md_cla =& $par->addClassification(); - $this->md_cla->setPurpose($a_attribs['Purpose']); - $this->md_cla->save(); - $this->__pushParent($this->md_cla); - break; + case 'Classification': + $par =& $this->__getParent(); + $this->md_cla =& $par->addClassification(); + $this->md_cla->setPurpose($a_attribs['Purpose']); + $this->md_cla->save(); + $this->__pushParent($this->md_cla); + break; - case 'TaxonPath': - $par =& $this->__getParent(); - $this->md_taxp =& $par->addTaxonPath(); - $this->md_taxp->save(); - $this->__pushParent($this->md_taxp); - break; + case 'TaxonPath': + $par =& $this->__getParent(); + $this->md_taxp =& $par->addTaxonPath(); + $this->md_taxp->save(); + $this->__pushParent($this->md_taxp); + break; - case 'Source': - $par =& $this->__getParent(); - $par->setSourceLanguage(new ilMDLanguageItem($a_attribs['Language'])); - break; + case 'Source': + $par =& $this->__getParent(); + $par->setSourceLanguage(new ilMDLanguageItem($a_attribs['Language'])); + break; - case 'Taxon': - $par =& $this->__getParent(); - $this->md_tax =& $par->addTaxon(); - $this->md_tax->setTaxonLanguage(new ilMDLanguageItem($a_attribs['Language'])); - $this->md_tax->setTaxonId($a_attribs['Id']); - $this->md_tax->save(); - $this->__pushParent($this->md_tax); - break; - */ + case 'Taxon': + $par =& $this->__getParent(); + $this->md_tax =& $par->addTaxon(); + $this->md_tax->setTaxonLanguage(new ilMDLanguageItem($a_attribs['Language'])); + $this->md_tax->setTaxonId($a_attribs['Id']); + $this->md_tax->save(); + $this->__pushParent($this->md_tax); + break; + */ case 'string': $par = $this->__getParent(); @@ -449,11 +449,11 @@ public function handlerEndTag($a_xml_parser, string $a_name): void } break; - // todo - /*case 'Coverage': - $par =& $this->__getParent(); - $par->setCoverage($this->__getCharacterData()); - break;*/ + // todo + /*case 'Coverage': + $par =& $this->__getParent(); + $par->setCoverage($this->__getCharacterData()); + break;*/ case 'lifeCycle': $par = $this->__getParent(); @@ -466,168 +466,168 @@ public function handlerEndTag($a_xml_parser, string $a_name): void break; - // todo - /*case 'Contribute': - $par =& $this->__getParent(); - $par->update(); - $this->__popParent(); - break; - - case 'Entity': - $par =& $this->__getParent(); - - if(strtolower(get_class($par)) == 'ilmdentity') - { - $par->setEntity($this->__getCharacterData()); + // todo + /*case 'Contribute': + $par =& $this->__getParent(); $par->update(); $this->__popParent(); - } - else - { - // Single element in 'Annotation' - $par->setEntity($this->__getCharacterData()); - } - break; + break; - case 'Date': - $par =& $this->__getParent(); - $par->setDate($this->__getCharacterData()); - break; + case 'Entity': + $par =& $this->__getParent(); - case 'Meta-Metadata': - $par =& $this->__getParent(); - $par->update(); - $this->__popParent(); - break; + if(strtolower(get_class($par)) == 'ilmdentity') + { + $par->setEntity($this->__getCharacterData()); + $par->update(); + $this->__popParent(); + } + else + { + // Single element in 'Annotation' + $par->setEntity($this->__getCharacterData()); + } + break; - case 'Technical': - $par =& $this->__getParent(); - $par->update(); - $this->__popParent(); - break; + case 'Date': + $par =& $this->__getParent(); + $par->setDate($this->__getCharacterData()); + break; - case 'Format': - $par =& $this->__getParent(); - $par->setFormat($this->__getCharacterData()); - $par->update(); - $this->__popParent(); - break; + case 'Meta-Metadata': + $par =& $this->__getParent(); + $par->update(); + $this->__popParent(); + break; - case 'Size': - $par =& $this->__getParent(); - $par->setSize($this->__getCharacterData()); - break; + case 'Technical': + $par =& $this->__getParent(); + $par->update(); + $this->__popParent(); + break; - case 'Location': - $par =& $this->__getParent(); - $par->setLocation($this->__getCharacterData()); - $par->update(); - $this->__popParent(); - break; + case 'Format': + $par =& $this->__getParent(); + $par->setFormat($this->__getCharacterData()); + $par->update(); + $this->__popParent(); + break; - case 'Requirement': - $par =& $this->__getParent(); - $par->update(); - $this->__popParent(); - break; + case 'Size': + $par =& $this->__getParent(); + $par->setSize($this->__getCharacterData()); + break; - case 'OrComposite': - $this->__popParent(); - break; + case 'Location': + $par =& $this->__getParent(); + $par->setLocation($this->__getCharacterData()); + $par->update(); + $this->__popParent(); + break; - case 'Type': - break; + case 'Requirement': + $par =& $this->__getParent(); + $par->update(); + $this->__popParent(); + break; - case 'OperatingSystem': - break; + case 'OrComposite': + $this->__popParent(); + break; - case 'Browser': - break; + case 'Type': + break; - case 'InstallationRemarks': - $par =& $this->__getParent(); - $par->setInstallationRemarks($this->__getCharacterData()); - break; + case 'OperatingSystem': + break; - case 'OtherPlatformRequirements': - $par =& $this->__getParent(); - $par->setOtherPlatformRequirements($this->__getCharacterData()); - break; + case 'Browser': + break; - case 'Duration': - $par =& $this->__getParent(); - $par->setDuration($this->__getCharacterData()); - break; + case 'InstallationRemarks': + $par =& $this->__getParent(); + $par->setInstallationRemarks($this->__getCharacterData()); + break; - case 'Educational': - $par =& $this->__getParent(); - $par->update(); - $this->__popParent(); - break; + case 'OtherPlatformRequirements': + $par =& $this->__getParent(); + $par->setOtherPlatformRequirements($this->__getCharacterData()); + break; - case 'TypicalAgeRange': - $par =& $this->__getParent(); - $par->setTypicalAgeRange($this->__getCharacterData()); - $par->update(); - $this->__popParent(); - break; + case 'Duration': + $par =& $this->__getParent(); + $par->setDuration($this->__getCharacterData()); + break; - case 'TypicalLearningTime': - $par =& $this->__getParent(); - $par->setTypicalLearningTime($this->__getCharacterData()); - break; + case 'Educational': + $par =& $this->__getParent(); + $par->update(); + $this->__popParent(); + break; - case 'Rights': - $par =& $this->__getParent(); - $par->update(); - $this->__popParent(); - break; + case 'TypicalAgeRange': + $par =& $this->__getParent(); + $par->setTypicalAgeRange($this->__getCharacterData()); + $par->update(); + $this->__popParent(); + break; - case 'Relation': - $par =& $this->__getParent(); - $par->update(); - $this->__popParent(); - break; + case 'TypicalLearningTime': + $par =& $this->__getParent(); + $par->setTypicalLearningTime($this->__getCharacterData()); + break; - case 'Resource': - break; + case 'Rights': + $par =& $this->__getParent(); + $par->update(); + $this->__popParent(); + break; - case 'Identifier_': - $par =& $this->__getParent(); - $par->update(); - $this->__popParent(); - break; + case 'Relation': + $par =& $this->__getParent(); + $par->update(); + $this->__popParent(); + break; - case 'Annotation': - $par =& $this->__getParent(); - $par->update(); - $this->__popParent(); - break; + case 'Resource': + break; - case 'Classification': - $par =& $this->__getParent(); - $par->update(); - $this->__popParent(); - break; + case 'Identifier_': + $par =& $this->__getParent(); + $par->update(); + $this->__popParent(); + break; - case 'TaxonPath': - $par =& $this->__getParent(); - $par->update(); - $this->__popParent(); - break; + case 'Annotation': + $par =& $this->__getParent(); + $par->update(); + $this->__popParent(); + break; - case 'Taxon': - $par =& $this->__getParent(); - $par->setTaxon($this->__getCharacterData()); - $par->update(); - $this->__popParent(); - break; + case 'Classification': + $par =& $this->__getParent(); + $par->update(); + $this->__popParent(); + break; - case 'Source': - $par =& $this->__getParent(); - $par->setSource($this->__getCharacterData()); - break; - */ + case 'TaxonPath': + $par =& $this->__getParent(); + $par->update(); + $this->__popParent(); + break; + + case 'Taxon': + $par =& $this->__getParent(); + $par->setTaxon($this->__getCharacterData()); + $par->update(); + $this->__popParent(); + break; + + case 'Source': + $par =& $this->__getParent(); + $par->setSource($this->__getCharacterData()); + break; + */ case 'string': $par = $this->__getParent(); diff --git a/Modules/Scorm2004/classes/ilSCORM13Package.php b/Modules/Scorm2004/classes/ilSCORM13Package.php index 509b77afe92f..7b62a666a575 100755 --- a/Modules/Scorm2004/classes/ilSCORM13Package.php +++ b/Modules/Scorm2004/classes/ilSCORM13Package.php @@ -34,12 +34,12 @@ class ilSCORM13Package public const WRAPPER_JS = './Modules/Scorm2004/scripts/converter/GenericRunTimeWrapper1.0_aadlc/SCOPlayerWrapper.js'; -// private $packageFile; + // private $packageFile; private string $packageFolder; private string $packagesFolder; private array $packageData = []; -// private $slm; -// private $slm_tree; + // private $slm; + // private $slm_tree; public \DOMDocument $imsmanifest; /** @@ -47,13 +47,13 @@ class ilSCORM13Package */ public $manifest; public array $diagnostic; -// public $status; + // public $status; public int $packageId; public string $packageName = ""; public string $packageHash = ""; public int $userId; -// private $idmap = array(); + // private $idmap = array(); private float $progress = 0.0; /** @@ -226,7 +226,10 @@ public function il_import(string $packageFolder, int $packageId, bool $reimport $j['base'] = $packageFolder . '/'; $j['foreignId'] = floatval($x['foreignId']); // manifest cp_node_id for associating global (package wide) objectives $j['id'] = strval($x['id']); // manifest id for associating global (package wide) objectives - + $j['item']['title'] = ilUtil::stripSlashes($j['item']['title']); + for($i = 0; $i < count($j['item']['item']); $i++) { + $j['item']['item'][$i]['title'] = ilUtil::stripSlashes($j['item']['item'][$i]['title']); + } //last step - build ADL Activity tree $act = new SeqTreeBuilder(); @@ -352,35 +355,62 @@ public function dbImport(object $node, ?int &$lft = 1, ?int $depth = 1, ?int $pa foreach ($node->attributes as $attr) { switch (strtolower($attr->name)) { - case 'completionsetbycontent': $names[] = 'completionbycontent';break; - case 'objectivesetbycontent': $names[] = 'objectivebycontent';break; - case 'type': $names[] = 'c_type';break; - case 'mode': $names[] = 'c_mode';break; - case 'language': $names[] = 'c_language';break; - case 'condition': $names[] = 'c_condition';break; - case 'operator': $names[] = 'c_operator';break; -// case 'condition': $names[] = 'c_condition';break; - case 'readnormalizedmeasure': $names[] = 'readnormalmeasure';break; - case 'writenormalizedmeasure': $names[] = 'writenormalmeasure';break; - case 'minnormalizedmeasure': $names[] = 'minnormalmeasure';break; - case 'primary': $names[] = 'c_primary';break; -// case 'minnormalizedmeasure': $names[] = 'minnormalmeasure';break; - case 'persistpreviousattempts': $names[] = 'persistprevattempts';break; - case 'identifier': $names[] = 'c_identifier';break; - case 'settings': $names[] = 'c_settings';break; - case 'activityabsolutedurationlimit': $names[] = 'activityabsdurlimit';break; - case 'activityexperienceddurationlimit': $names[] = 'activityexpdurlimit';break; - case 'attemptabsolutedurationlimit': $names[] = 'attemptabsdurlimit';break; - case 'measuresatisfactionifactive': $names[] = 'measuresatisfactive';break; - case 'objectivemeasureweight': $names[] = 'objectivemeasweight';break; - case 'requiredforcompleted': $names[] = 'requiredcompleted';break; - case 'requiredforincomplete': $names[] = 'requiredincomplete';break; - case 'requiredfornotsatisfied': $names[] = 'requirednotsatisfied';break; - case 'rollupobjectivesatisfied': $names[] = 'rollupobjectivesatis';break; - case 'rollupprogresscompletion': $names[] = 'rollupprogcompletion';break; - case 'usecurrentattemptobjectiveinfo': $names[] = 'usecurattemptobjinfo';break; - case 'usecurrentattemptprogressinfo': $names[] = 'usecurattemptproginfo';break; - default: $names[] = strtolower($attr->name);break; + case 'completionsetbycontent': $names[] = 'completionbycontent'; + break; + case 'objectivesetbycontent': $names[] = 'objectivebycontent'; + break; + case 'type': $names[] = 'c_type'; + break; + case 'mode': $names[] = 'c_mode'; + break; + case 'language': $names[] = 'c_language'; + break; + case 'condition': $names[] = 'c_condition'; + break; + case 'operator': $names[] = 'c_operator'; + break; + // case 'condition': $names[] = 'c_condition';break; + case 'readnormalizedmeasure': $names[] = 'readnormalmeasure'; + break; + case 'writenormalizedmeasure': $names[] = 'writenormalmeasure'; + break; + case 'minnormalizedmeasure': $names[] = 'minnormalmeasure'; + break; + case 'primary': $names[] = 'c_primary'; + break; + // case 'minnormalizedmeasure': $names[] = 'minnormalmeasure';break; + case 'persistpreviousattempts': $names[] = 'persistprevattempts'; + break; + case 'identifier': $names[] = 'c_identifier'; + break; + case 'settings': $names[] = 'c_settings'; + break; + case 'activityabsolutedurationlimit': $names[] = 'activityabsdurlimit'; + break; + case 'activityexperienceddurationlimit': $names[] = 'activityexpdurlimit'; + break; + case 'attemptabsolutedurationlimit': $names[] = 'attemptabsdurlimit'; + break; + case 'measuresatisfactionifactive': $names[] = 'measuresatisfactive'; + break; + case 'objectivemeasureweight': $names[] = 'objectivemeasweight'; + break; + case 'requiredforcompleted': $names[] = 'requiredcompleted'; + break; + case 'requiredforincomplete': $names[] = 'requiredincomplete'; + break; + case 'requiredfornotsatisfied': $names[] = 'requirednotsatisfied'; + break; + case 'rollupobjectivesatisfied': $names[] = 'rollupobjectivesatis'; + break; + case 'rollupprogresscompletion': $names[] = 'rollupprogcompletion'; + break; + case 'usecurrentattemptobjectiveinfo': $names[] = 'usecurattemptobjinfo'; + break; + case 'usecurrentattemptprogressinfo': $names[] = 'usecurattemptproginfo'; + break; + default: $names[] = strtolower($attr->name); + break; } if (in_array( diff --git a/Modules/ScormAicc/classes/SCORM/class.ilSCORMPackageParser.php b/Modules/ScormAicc/classes/SCORM/class.ilSCORMPackageParser.php index 15154d2f8f4b..fc63608cf6e8 100755 --- a/Modules/ScormAicc/classes/SCORM/class.ilSCORMPackageParser.php +++ b/Modules/ScormAicc/classes/SCORM/class.ilSCORMPackageParser.php @@ -79,7 +79,7 @@ public function startParsing(): void public function getPackageTitle(): string { - return $this->package_title; + return ilUtil::stripSlashes($this->package_title); } /** @@ -342,14 +342,14 @@ public function handlerCharacterData($a_xml_parser, ?string $a_data): void switch ($this->getAncestorElement(1)) { case "organization": $this->current_organization->setTitle( - $this->current_organization->getTitle() . $a_data + ilUtil::stripSlashes($this->current_organization->getTitle() . $a_data) ); - $this->package_title = $this->current_organization->getTitle(); + $this->package_title = ilUtil::stripSlashes($this->current_organization->getTitle()); break; case "item": $this->item_stack[count($this->item_stack) - 1]->setTitle( - $this->item_stack[count($this->item_stack) - 1]->getTitle() . $a_data + ilUtil::stripSlashes($this->item_stack[count($this->item_stack) - 1]->getTitle() . $a_data) ); break; } diff --git a/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php b/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php index 14549f8730b8..f6be90b1ff02 100755 --- a/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php +++ b/Modules/ScormAicc/classes/class.ilObjSAHSLearningModuleGUI.php @@ -385,6 +385,8 @@ public function uploadObject(): void $name = $this->lng->txt("no_title"); } + $description = ""; + $subType = "scorm2004"; if ($DIC->http()->wrapper()->post()->has('sub_type')) { $subType = $DIC->http()->wrapper()->post()->retrieve('sub_type', $DIC->refinery()->kindlyTo()->string()); @@ -424,7 +426,6 @@ public function uploadObject(): void $import_result = $importer->getResult(); $importFromXml = true; - if ($import_result->isOK()) { $properties = $import_result->value(); if (($subType = $properties['SubType']) === 'scorm') { @@ -432,6 +433,8 @@ public function uploadObject(): void } else { $newObj = new ilObjSCORM2004LearningModule(); } + $name = $properties['Title']; + $description = $properties['Description']; } else { ilFileUtils::delDir($lmTempDir, false); $ilLog->error('SCORM import of ILIAS exportfile not possible because parsing error'); @@ -445,7 +448,7 @@ public function uploadObject(): void $newObj->setTitle($name); $newObj->setSubType($subType); - $newObj->setDescription(""); + $newObj->setDescription($description); $newObj->setOfflineStatus(false); $newObj->create(true); $newObj->createReference(); diff --git a/Modules/ScormAicc/classes/class.ilScormAiccImporter.php b/Modules/ScormAicc/classes/class.ilScormAiccImporter.php index 8128199899df..c0e6cdd6b2e3 100755 --- a/Modules/ScormAicc/classes/class.ilScormAiccImporter.php +++ b/Modules/ScormAicc/classes/class.ilScormAiccImporter.php @@ -167,7 +167,7 @@ function (SimpleXMLElement $properties_xml_doc): ?\ILIAS\Data\Result { foreach ($this->module_properties as $key => $property_node) { $property_value = $property_node->__toString(); $filteredValue = preg_replace('%\s%', '', $property_value); - $this->module_properties[$key] = $filteredValue; + $this->module_properties[$key] = ilUtil::stripSlashes($filteredValue); } return $this->df->ok($this->module_properties); From 8d643fa2ab22fef2b0f8907e3e81e9e02d1dff9b Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 14 Feb 2024 10:02:35 +0100 Subject: [PATCH 479/497] 39234: Failed test: Interne Links anklicken (ohne Bearbeitungsrechte) --- .../Presentation/class.ilLMPresentationLinker.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Modules/LearningModule/Presentation/class.ilLMPresentationLinker.php b/Modules/LearningModule/Presentation/class.ilLMPresentationLinker.php index cbf81dcc6b87..ccbbb9653fe3 100644 --- a/Modules/LearningModule/Presentation/class.ilLMPresentationLinker.php +++ b/Modules/LearningModule/Presentation/class.ilLMPresentationLinker.php @@ -412,8 +412,11 @@ public function getLinkXML( $nframe = ($ltarget == "") ? $this->frame : $ltarget; - $href = - $this->getLink($a_cmd = "glossary", (int) $target_id, $nframe, $type); + $href = ""; + if (ilGlossaryTerm::_exists((int) $target_id)) { + $href = + $this->getLink($a_cmd = "glossary", (int) $target_id, $nframe, $type); + } break; case "MediaObject": From 95f1abc6617aff16ebad489371355f1513f1cde0 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 14 Feb 2024 12:44:28 +0100 Subject: [PATCH 480/497] 39163: Failed test: Benutzer hat in einer Gruppe Rechte in der Mitgliederverwaltung --- .../class.ilGroupAddToGroupActionGUI.php | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Modules/Group/UserActions/classes/class.ilGroupAddToGroupActionGUI.php b/Modules/Group/UserActions/classes/class.ilGroupAddToGroupActionGUI.php index f1fb21e809c6..c8ea198e0ac6 100644 --- a/Modules/Group/UserActions/classes/class.ilGroupAddToGroupActionGUI.php +++ b/Modules/Group/UserActions/classes/class.ilGroupAddToGroupActionGUI.php @@ -48,6 +48,18 @@ public function __construct() } protected function initGroupRefIdFromQuery(): int + { + $ref_id = 0; + if ($this->http->wrapper()->query()->has('grp_act_ref_id')) { + $ref_id = $this->http->wrapper()->query()->retrieve( + 'grp_act_ref_id', + $this->refinery->kindlyTo()->int() + ); + } + return $ref_id; + } + + protected function initGroupParentRefIdFromQuery(): int { $ref_id = 0; if ($this->http->wrapper()->query()->has('grp_act_par_ref_id')) { @@ -190,7 +202,6 @@ public function confirmAddUser(): void $ref_id = $this->initGroupRefIdFromQuery(); $user_id = $this->initUserIdFromQuery(); - $participants = ilParticipants::getInstanceByObjId(ilObject::_lookupObjId($ref_id)); if ($participants->isMember($user_id)) { $url = $ctrl->getLinkTarget($this, "selectGroup", "", true); @@ -270,7 +281,7 @@ public function createGroup($form = null): void { $lng = $this->lng; - $ref_id = $this->initGroupRefIdFromQuery(); + $ref_id = $this->initGroupParentRefIdFromQuery(); if ($form == null) { $form = $this->getGroupCreationForm(); @@ -344,7 +355,7 @@ public function createGroupAndAddUser(): void $lng = $this->lng; $user_id = $this->initUserIdFromQuery(); - $ref_id = $this->initGroupRefIdFromQuery(); + $ref_id = $this->initGroupParentRefIdFromQuery(); $form = $this->getGroupCreationForm(); $form->checkInput(); From ee29cc7d2a70cc1ef10625ce373ba96507f8d0a5 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 14 Feb 2024 13:25:48 +0100 Subject: [PATCH 481/497] 39147: Failed test: Freigegebene Ressourcen einsehen --- .../User/Actions/classes/class.ilWorkspaceUserActionProvider.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Services/User/Actions/classes/class.ilWorkspaceUserActionProvider.php b/Services/User/Actions/classes/class.ilWorkspaceUserActionProvider.php index e3e7e19e4180..b532cb544b97 100644 --- a/Services/User/Actions/classes/class.ilWorkspaceUserActionProvider.php +++ b/Services/User/Actions/classes/class.ilWorkspaceUserActionProvider.php @@ -68,6 +68,7 @@ public function collectActionsForTargetUser(int $a_target_user): ilUserActionCol $f->setType("shared_res"); $f->setText($lng->txt("wsp_shared_resources")); $ilCtrl->setParameterByClass("ilobjworkspacerootfoldergui", "user", ilObjUser::_lookupLogin($a_target_user)); + $ilCtrl->setParameterByClass("ilobjworkspacerootfoldergui", "shr_id", $a_target_user); $f->setHref($ilCtrl->getLinkTargetByClass( array("ildashboardgui", "ilpersonalworkspacegui", "ilobjworkspacerootfoldergui"), "listSharedResourcesOfOtherUser" From e238444344dc399a8df2e5faa0cdcc87da7e4a8b Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 14 Feb 2024 14:04:30 +0100 Subject: [PATCH 482/497] export: added debug message --- Services/Export/classes/class.ilExport.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Services/Export/classes/class.ilExport.php b/Services/Export/classes/class.ilExport.php index 72b4f86484b0..c165d8cae69f 100644 --- a/Services/Export/classes/class.ilExport.php +++ b/Services/Export/classes/class.ilExport.php @@ -378,6 +378,7 @@ public function exportObject( // zip the file $this->log->debug("zip: " . $export_dir . "/" . $new_file); + $this->log->debug("run dir: " . $this->export_run_dir); ilFileUtils::zip($this->export_run_dir, $export_dir . "/" . $new_file); ilFileUtils::delDir($this->export_run_dir); From 68c8609e38ebba3f3edec65e8ca30de9eabb8d47 Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Wed, 14 Feb 2024 15:57:00 +0100 Subject: [PATCH 483/497] sync language files --- lang/ilias_ar.lang | 9 +++++++++ lang/ilias_bg.lang | 9 +++++++++ lang/ilias_cs.lang | 9 +++++++++ lang/ilias_da.lang | 9 +++++++++ lang/ilias_el.lang | 9 +++++++++ lang/ilias_es.lang | 9 +++++++++ lang/ilias_et.lang | 9 +++++++++ lang/ilias_fa.lang | 9 +++++++++ lang/ilias_fr.lang | 9 +++++++++ lang/ilias_hr.lang | 9 +++++++++ lang/ilias_hu.lang | 9 +++++++++ lang/ilias_it.lang | 9 +++++++++ lang/ilias_ja.lang | 9 +++++++++ lang/ilias_ka.lang | 9 +++++++++ lang/ilias_lt.lang | 9 +++++++++ lang/ilias_nl.lang | 9 +++++++++ lang/ilias_pl.lang | 9 +++++++++ lang/ilias_pt.lang | 9 +++++++++ lang/ilias_ro.lang | 9 +++++++++ lang/ilias_ru.lang | 9 +++++++++ lang/ilias_sk.lang | 9 +++++++++ lang/ilias_sl.lang | 9 +++++++++ lang/ilias_sq.lang | 9 +++++++++ lang/ilias_sr.lang | 9 +++++++++ lang/ilias_sv.lang | 9 +++++++++ lang/ilias_tr.lang | 9 +++++++++ lang/ilias_uk.lang | 9 +++++++++ lang/ilias_vi.lang | 9 +++++++++ lang/ilias_zh.lang | 9 +++++++++ 29 files changed, 261 insertions(+) diff --git a/lang/ilias_ar.lang b/lang/ilias_ar.lang index 97429ab60e18..b67f3ef4125f 100644 --- a/lang/ilias_ar.lang +++ b/lang/ilias_ar.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#The number of terms must be greater o assessment#:#msg_poly_added#:#Polygon added assessment#:#msg_questions_moved#:#Question(s) moved assessment#:#msg_rect_added#:#Rectangle added +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Question(s) selected for moving assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#الخصائص العامة assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#Scoring assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Memberships in Groups crs#:#crs_members_map#:#Course Members Map crs#:#crs_members_print_title#:#اعضاء الدورة crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this course. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Your new status is: @@ -7908,6 +7914,7 @@ crs#:#events#:#Sessions crs#:#export_members#:#Export Participants crs#:#grouping_change_assignment#:#تغيير التعيين crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#حقوق الطبع والنشر meta#:#md_copyright_add#:#اضافة حقوق الطبع والنشر المعدة مسبقا meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Edit Copyright Presetting meta#:#md_copyright_enable_info#:#اختر هذا الخيار لعرض مجموعة مختارة من حقوق الطبع والنشر المحدد مسبقا meta#:#md_copyright_enabled#:#تفعيل خيار حقوق الطبع والنشر @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_bg.lang b/lang/ilias_bg.lang index c1aad69fb7c9..2f34f31547e0 100644 --- a/lang/ilias_bg.lang +++ b/lang/ilias_bg.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#Броят на термините т assessment#:#msg_poly_added#:#Добавен полигон assessment#:#msg_questions_moved#:#Въпросите са преместени assessment#:#msg_rect_added#:# Добавен правоъгълник +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Въпроси, избрани за преместване assessment#:#new_category#:#Нова категория единици assessment#:#new_unit#:#Нова единица @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Продължава изб assessment#:#tst_gap_analysis#:#Анализ на пропуските assessment#:#tst_general_properties#:#Общи характеристики assessment#:#tst_header_participant#:#Резултат: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Правилно решение: assessment#:#tst_heading_scoring#:#Оценяване assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Време за четене###22 06 2022 new va copa#:#copa_value_reading_time_f_p#:#%s минути###22 06 2022 new variable copa#:#copa_value_reading_time_f_s#:#%s минута###22 06 2022 new variable copa#:#obj_copa_duplicate#:#Дублиране на страница със съдържание +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Активирайте HTML/Javascript copg#:#copg_allow_html_info#:#Потребителят може да използва HTML или Javascript съдържание на страницата. Това може да доведе до проблеми със сигурността. Не активирайте, ако функциите могат да се използват от потребители, които според вас не заслужават доверие. Поддръжката на добавянето на HTML съдържание по този начин може да бъде преустановена в бъдеща версия. copg#:#copg_an_error_occured#:#Възникна грешка.###22 06 2022 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Презареждане на страницата###2 copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#Ако зададете връзка към целия раздел, моля, уверете се, че в раздела не са включени други интерактивни елементи. В противен случай поведението им може да бъде нестабилно. copg#:#copg_snippet_cannot_be_edited#:#Това е предварително дефиниран фрагмент от съдържанието и не може да се редактира тук. +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Време за четене###22 06 2022 new variable cpad#:#cpad_reading_time_status_desc#:#Ако е разрешено, очакваното време за четене за обекти на страница със съдържание ще бъде определено и показано.###22 06 2022 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Групи на членовете на курса crs#:#crs_members_map#:#Карта на членовете на курса crs#:#crs_members_print_title#:#Членове на курса crs#:#crs_min_one_admin#:#За този курс трябва да има поне един администратор. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Новият ви статус е: @@ -7908,6 +7914,7 @@ crs#:#events#:#Sessions crs#:#export_members#:#Експортиране на участници crs#:#grouping_change_assignment#:#Промяна на заданието crs#:#grp_grp_already_assigned#:#Вие вече сте член на тази група от групи. +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#Следващите курсове и групи не отговарят на изискванията за минимален брой членове (все още). crs#:#mem_cron_min_members_reason#:#Получавате това съобщение, защото сте активирали известието в раздела за членове. crs#:#mem_cron_min_members_subject#:#Курс/Група: Проверка на минималния брой членове @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Copyright meta#:#md_copyright_add#:# Добавяне на предварително зададени авторски права meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Предварителна настройка на авторските права meta#:#md_copyright_enable_info#:#Изберете тази опция, за да предложите избор от предварително дефинирани авторски права meta#:#md_copyright_enabled#:#Активиране на избора на авторски права @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Завършване на проучването '%1' svy#:#svy_invite_participants#:#Привличане на участници svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Проучване +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Отстраняване на всички участници svy#:#svy_remove_participants#:#Отстраняване на участници diff --git a/lang/ilias_cs.lang b/lang/ilias_cs.lang index 1dab54e2fe81..072dabaf081e 100644 --- a/lang/ilias_cs.lang +++ b/lang/ilias_cs.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#Počet výrazů musí být větší, assessment#:#msg_poly_added#:#Polygon přidán assessment#:#msg_questions_moved#:#Otázky přesunuty assessment#:#msg_rect_added#:#Obdélník přidán +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Otázky vybrány k přesunutí assessment#:#new_category#:#Nová kategorie jednotky assessment#:#new_unit#:#Nová jednotka @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Pokračuje výběr otázek assessment#:#tst_gap_analysis#:#Analýza mezer assessment#:#tst_general_properties#:#Obecná nastavení assessment#:#tst_header_participant#:#Výsledek: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Správné řešení: assessment#:#tst_heading_scoring#:#Hodnocení assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplikovat stránku obsahu +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#Pokud nastavíte odkaz na celou část, ujistěte se, že v této části nejsou obsaženy žádné další interaktivní prvky. Jinak může být jejich chování nevypočitatelné. copg#:#copg_snippet_cannot_be_edited#:#Jedná se o předem definovaný úryvek obsahu, který zde nelze upravovat. +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Členství ve skupině crs#:#crs_members_map#:#Mapa členů kurzu crs#:#crs_members_print_title#:#Členové kurzu crs#:#crs_min_one_admin#:#K tomuto kurzu musí být přiřazen alespoň jeden správce. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Váš nový status je: @@ -7908,6 +7914,7 @@ crs#:#events#:#Sezení crs#:#export_members#:#Export účastníků crs#:#grouping_change_assignment#:#Změnit přidělení crs#:#grp_grp_already_assigned#:#Již jste členem tohoto seskupení skupin. +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#Následující kurzy a skupiny (ještě) nesplňují minimální počet členů. crs#:#mem_cron_min_members_reason#:#Dostanete tuto zprávu, protože jste aktivovali oznámení v záložce členové. crs#:#mem_cron_min_members_subject#:#Kurz/skupina: Kontrola minimálního počtu členů @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Autorská práva meta#:#md_copyright_add#:#Přidat přednastavení Copyrightu meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Upravit přednastavení Copyrightu meta#:#md_copyright_enable_info#:#Vyberte tuto volbu k nabídnutí výběru předdefinovaného Copyrightu meta#:#md_copyright_enabled#:#Zapnout výběr Copyrightu @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_da.lang b/lang/ilias_da.lang index f47fda1f775f..cf6ab41dfdbb 100644 --- a/lang/ilias_da.lang +++ b/lang/ilias_da.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#The number of terms must be greater o assessment#:#msg_poly_added#:#Polygon tilføjet assessment#:#msg_questions_moved#:#Spørgsmål flyttet assessment#:#msg_rect_added#:#Rektangel tilføjet +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Question(s) selected for moving###06 08 2009 new variable assessment#:#new_category#:#New Unit Category###16 09 2013 new variable assessment#:#new_unit#:#New Unit###16 09 2013 new variable @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#Generelle egenskaber assessment#:#tst_header_participant#:#Result:###16 09 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###16 09 2013 new variable assessment#:#tst_heading_scoring#:#Resultat assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Kursusdeltagernes grupper crs#:#crs_members_map#:#Kort over kursister crs#:#crs_members_print_title#:#Kursusdeltagere crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this course.###12 08 2009 new variable +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Din nye status er: @@ -7908,6 +7914,7 @@ crs#:#events#:#Sessioner crs#:#export_members#:#Eksporter kursister crs#:#grouping_change_assignment#:#Change Assignment###05 10 2006 new variable crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Copyright meta#:#md_copyright_add#:#Add Copyright Presetting###25 09 2007 new variable meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Ret copyright indstilling meta#:#md_copyright_enable_info#:#Vælg denne for se listen over prædefinerede copyrights meta#:#md_copyright_enabled#:#Aktiver copyright @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_el.lang b/lang/ilias_el.lang index e38c99b8ceff..d7d4b8bd0a0c 100644 --- a/lang/ilias_el.lang +++ b/lang/ilias_el.lang @@ -912,6 +912,8 @@ assessment#:#msg_number_of_terms_too_low#:#The number of terms must be greater o assessment#:#msg_poly_added#:#Polygon added###24 07 2009 new variable assessment#:#msg_questions_moved#:#Question(s) moved###06 08 2009 new variable assessment#:#msg_rect_added#:#Rectangle added###24 07 2009 new variable +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Question(s) selected for moving###06 08 2009 new variable assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1433,6 +1435,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#Γενικές ιδιότητες assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#Βαθμολογία assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7232,6 +7235,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7259,6 +7263,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7582,6 +7587,7 @@ crs#:#crs_members_groups#:#Course Members Groups###16 07 2010 new variable crs#:#crs_members_map#:#Course Members Map crs#:#crs_members_print_title#:#Μέλη μαθήματος crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this course.###12 08 2009 new variable +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Your new status is:###21 09 2009 new variable @@ -7909,6 +7915,7 @@ crs#:#events#:#Σύνοδοι crs#:#export_members#:#Export Participants crs#:#grouping_change_assignment#:#Change Assignment crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11320,6 +11327,7 @@ meta#:#md_copyright#:#Copyright meta#:#md_copyright_add#:#Add Copyright Presetting meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Edit Copyright Presetting meta#:#md_copyright_enable_info#:#Choose this option to offer a selection of predefined copyrights meta#:#md_copyright_enabled#:#Enable Copyright Selection @@ -16148,6 +16156,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_es.lang b/lang/ilias_es.lang index dd84019ab9ca..ec942174d71b 100644 --- a/lang/ilias_es.lang +++ b/lang/ilias_es.lang @@ -913,6 +913,8 @@ assessment#:#msg_number_of_terms_too_low#:#El número de términos debe ser mayo assessment#:#msg_poly_added#:#Polígono añadido assessment#:#msg_questions_moved#:#Pregunta(s) movidas assessment#:#msg_rect_added#:#Rectángulo añadido +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Preguntas(s) seleccionadas para mover assessment#:#new_category#:#Nueva Categoria de Unidad assessment#:#new_unit#:#Nueva unidad @@ -1434,6 +1436,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Selección continua de pregu assessment#:#tst_gap_analysis#:#Análisis de huecos assessment#:#tst_general_properties#:#Propiedades generales assessment#:#tst_header_participant#:#Resultado: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Solución correcta: assessment#:#tst_heading_scoring#:#Puntuación assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7233,6 +7236,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7260,6 +7264,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#Si configura un enlace a toda la sección, asegúrese de que la sección no incluya otros elementos interactivos. De lo contrario, su comportamiento podría ser errático. copg#:#copg_snippet_cannot_be_edited#:#Este es un fragmento de contenido predefinido y no se puede editar aquí. +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7583,6 +7588,7 @@ crs#:#crs_members_groups#:#Pertenencia a grupos crs#:#crs_members_map#:#Mapa de miembros del Curso crs#:#crs_members_print_title#:#Miembros del Curso crs#:#crs_min_one_admin#:#Debe haber al menos un administrador asignado a este curso +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Tu nuevo estado es: @@ -7910,6 +7916,7 @@ crs#:#events#:#Sesiones crs#:#export_members#:#Exportar Participantes crs#:#grouping_change_assignment#:#Modificar asignación crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#Los siguientes cursos y grupos no satisfacen todavía el número mínimo de miembros. crs#:#mem_cron_min_members_reason#:#Has recibido este mensaje porque has activado la notificación en la pestaña 'Miembros'. crs#:#mem_cron_min_members_subject#:#Curso/Grupo: Comprobar número mínimo de miembros @@ -11321,6 +11328,7 @@ meta#:#md_copyright#:#Copyright meta#:#md_copyright_add#:#Añadir preselección de Copyright meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Editar Preselección de Copyright meta#:#md_copyright_enable_info#:#Escoja esta opción para ofrecer una selección de copyrights predefinidos meta#:#md_copyright_enabled#:#Habilitar Selección de Copyright @@ -16149,6 +16157,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_et.lang b/lang/ilias_et.lang index d692af0f9a6b..21f965a79373 100644 --- a/lang/ilias_et.lang +++ b/lang/ilias_et.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#Mõistete arv peab olema võrdne (võ assessment#:#msg_poly_added#:#Hulknurk lisatud assessment#:#msg_questions_moved#:#Küsimus(ed) on ümber tõstetud assessment#:#msg_rect_added#:#Ristkülik lisatud +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Küsimus(ed) on ümber tõstmiseks märgistatud assessment#:#new_category#:#New Unit Category assessment#:#new_unit#:#New Unit @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis assessment#:#tst_general_properties#:#Üldised seaded assessment#:#tst_header_participant#:#Result: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution: assessment#:#tst_heading_scoring#:#Punktiarvestus assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Kursuseliikmete grupid crs#:#crs_members_map#:#Kursuseliikmete kaart crs#:#crs_members_print_title#:#Kursuse liikmed crs#:#crs_min_one_admin#:#Kursusele peab olema määratud vähemalt üks haldur. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Uus staatus on: @@ -7908,6 +7914,7 @@ crs#:#events#:#Kohtumised crs#:#export_members#:#Ekspordi osalejad crs#:#grouping_change_assignment#:#Muuda ülesannet crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Autoriõigus meta#:#md_copyright_add#:#Lisa autoriõiguse eelseaded meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Muuda autoriõiguse eelseadeid meta#:#md_copyright_enable_info#:#Tee see valik eelmääratud autoriõiguste võimaldamiseks meta#:#md_copyright_enabled#:#Võimalda autoriõiguse valik @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_fa.lang b/lang/ilias_fa.lang index dd504d8c0099..86d73d903dfb 100644 --- a/lang/ilias_fa.lang +++ b/lang/ilias_fa.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#The number of terms must be greater o assessment#:#msg_poly_added#:#Polygon added assessment#:#msg_questions_moved#:#Question(s) moved assessment#:#msg_rect_added#:#Rectangle added +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Question(s) selected for moving assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#ویژگیهای همگانی assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#امتیازدهی assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#عضویتها در گروهها crs#:#crs_members_map#:#Course Members Map crs#:#crs_members_print_title#:#اعضای درس crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this course. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Your new status is: @@ -7908,6 +7914,7 @@ crs#:#events#:#جلسات crs#:#export_members#:#Export Participants crs#:#grouping_change_assignment#:#Change Assignment crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#حق نشر meta#:#md_copyright_add#:#Add Copyright Presetting meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Edit Copyright Presetting meta#:#md_copyright_enable_info#:#Choose this option to offer a selection of predefined copyrights. meta#:#md_copyright_enabled#:#Enable Copyright Selection @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_fr.lang b/lang/ilias_fr.lang index 9d59be371d92..d3f7a8598fc8 100644 --- a/lang/ilias_fr.lang +++ b/lang/ilias_fr.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#Le nombre de termes doit être supér assessment#:#msg_poly_added#:#Polygone ajouté assessment#:#msg_questions_moved#:#Question(s) déplacée(s) assessment#:#msg_rect_added#:#Rectangle ajouté +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Question(s) sélectionnée(s) à déplacer assessment#:#new_category#:#Nouvelle Catégorie d'Unité assessment#:#new_unit#:#Nouvelle Unité @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Sélection des Questions assessment#:#tst_gap_analysis#:#Analyse d’écart assessment#:#tst_general_properties#:#Paramètres Généraux assessment#:#tst_header_participant#:#Résultat : +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Solution correcte : assessment#:#tst_heading_scoring#:#Notation assessment#:#tst_hide_pagecontents#:#Hide page content###31 10 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time copa#:#copa_value_reading_time_f_p#:#%s Minutes copa#:#copa_value_reading_time_f_s#:#%s Minute copa#:#obj_copa_duplicate#:#Duplicate Content Page +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version. copg#:#copg_an_error_occured#:#An error occured. @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#Si vous définissez un lien sur toute la section, veuillez vous assurer qu’aucun autre élément interactif n’est inclus dans la section. Autrement, son comportement peut être irrégulier. copg#:#copg_snippet_cannot_be_edited#:#Il s'agit d’un extrait du contenu prédéfini et il ne peut pas être édité ici. +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 10 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed. @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Répartition par groupes crs#:#crs_members_map#:#Carte des Membres du Cours crs#:#crs_members_print_title#:#Membres du cours crs#:#crs_min_one_admin#:#Il existe au moins un administrateur assigné à ce cours. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible. crs#:#crs_new_status#:#Votre nouveau statut est : @@ -7908,6 +7914,7 @@ crs#:#events#:#Sessions crs#:#export_members#:#Exporter Participants crs#:#grouping_change_assignment#:#Modifier Assignation crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups. +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#Les cours et les groupes suivants ne respectent pas le nombre minimum de membres (encore). crs#:#mem_cron_min_members_reason#:#Vous recevez ce message parce que vous avez activé la notification dans l'onglet membres. crs#:#mem_cron_min_members_subject#:#Cours / Groupe: Vérification du Nombre Minimum des Membres @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Droits d'Auteur meta#:#md_copyright_add#:#Ajouter une Configuration de Droits d'Auteur meta#:#md_copyright_alt_text#:#Text Representation###31 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###31 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Editer la Configuration des Droits d'Auteur meta#:#md_copyright_enable_info#:#Cette option permet d'offrir une sélection de droits d'auteur prédéfinis meta#:#md_copyright_enabled#:#Activer le Choix des Droits d'Auteur @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1' svy#:#svy_invite_participants#:#Invite Participants svy#:#svy_link_to_svy#:#Link to Survey###31 10 2023 new variable svy#:#svy_part_overview#:#Overview +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 10 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants svy#:#svy_remove_participants#:#Remove Participants diff --git a/lang/ilias_hr.lang b/lang/ilias_hr.lang index 6fda919890df..afd25e32e62c 100644 --- a/lang/ilias_hr.lang +++ b/lang/ilias_hr.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#Broj pojmova mora biti veći ili jedn assessment#:#msg_poly_added#:#Dodan je poligon assessment#:#msg_questions_moved#:#Pitanje(a) je(su) pomaknuto(a) assessment#:#msg_rect_added#:#Dodan je pravokutnik +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Pitanje(a) odabrano(a) za pomicanje assessment#:#new_category#:#Kategorija nove jedinice assessment#:#new_unit#:#Nova jedinica @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Kontinuirani izbor pitanja assessment#:#tst_gap_analysis#:#Analiza praznine assessment#:#tst_general_properties#:#Opće postavke assessment#:#tst_header_participant#:#Vaš odgovor: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Najbolje moguće rješenje: assessment#:#tst_heading_scoring#:#Broj bodova assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###04 06 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###04 06 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###04 06 2021 new variable copa#:#obj_copa_duplicate#:#Dupliciraj stranicu sadržaja +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###04 06 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###04 06 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###04 06 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#Ako postavite poveznicu na cijeli odjeljak, pripazite da unutar odjeljka ne postoje drugi interaktivni elementi. U protivnom njihovo ponašanje može biti nestalno. copg#:#copg_snippet_cannot_be_edited#:#Ovo je unaprijed definirani isječak sadržaja koji se ovdje ne može uređivati. +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###04 06 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###04 06 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Članstva u grupama crs#:#crs_members_map#:#Karta članova tečaja crs#:#crs_members_print_title#:#Članovi tečaja crs#:#crs_min_one_admin#:#Ovom tečaju mora biti dodijeljen barem jedan administrator. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Vaš novi status je: @@ -7908,6 +7914,7 @@ crs#:#events#:#Sesije crs#:#export_members#:#Izvezi sudionike crs#:#grouping_change_assignment#:#Promijeni zadatak crs#:#grp_grp_already_assigned#:#Već ste član ove skupine grupa. +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#Sljedeći tečajevi i grupe ne zadovoljavaju minimalni broj članova (još). crs#:#mem_cron_min_members_reason#:#Ovu poruku primate jer ste aktivirali obavijest na kartici članova. crs#:#mem_cron_min_members_subject#:#Tečaj/grupa: Provjera minimalnog broja članova @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Autorska prava meta#:#md_copyright_add#:#Dodaj zadano autorsko pravo meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Uredi zadano autorsko pravo meta#:#md_copyright_enable_info#:#Odaberite ovu opciju da biste ponudili izbor unaprijed definiranih autorskih prava. meta#:#md_copyright_enabled#:#Omogući odabir autorskih prava @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###04 06 2021 new variable svy#:#svy_invite_participants#:#Invite Participants###04 06 2021 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###04 06 2021 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###04 06 2021 new variable svy#:#svy_remove_participants#:#Remove Participants###04 06 2021 new variable diff --git a/lang/ilias_hu.lang b/lang/ilias_hu.lang index 08d7a5680104..d692bc36d88e 100644 --- a/lang/ilias_hu.lang +++ b/lang/ilias_hu.lang @@ -926,6 +926,8 @@ assessment#:#msg_number_of_terms_too_low#:#A kifejezések száma nagyobb vagy eg assessment#:#msg_poly_added#:#Sokszög hozzáadva assessment#:#msg_questions_moved#:#Kérdés(ek) áthelyezve. assessment#:#msg_rect_added#:#Téglalap hozzáadva +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Kérdés(ek) kiválasztva áthelyezéshez. assessment#:#new_category#:#Új mértékegység-kategória assessment#:#new_unit#:#Új mértékegység @@ -1447,6 +1449,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Folyamatos kérdéskiválasz assessment#:#tst_gap_analysis#:#Gap analízis (rés elemzés) assessment#:#tst_general_properties#:#Általános beállítások assessment#:#tst_header_participant#:#Az Ön válasza: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Legjobb megoldás: assessment#:#tst_heading_scoring#:#Pontozás assessment#:#tst_hide_pagecontents#:#Oldaltartalom elrejtése @@ -7246,6 +7249,7 @@ copa#:#copa_prop_reading_time#:#Olvasási idő copa#:#copa_value_reading_time_f_p#:#%s perc copa#:#copa_value_reading_time_f_s#:#%s perc copa#:#obj_copa_duplicate#:#Tartalomlap duplikálása +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#HTML/Javascript bekapcsolása copg#:#copg_allow_html_info#:#HTML, illetve Javascript oldaltartalmakat használhat. Ez biztonsági rést okozhat, ezért ne kapcsolja be, ha lehet ártó szándékú felhasználója. Az ilyen módú HTML-tartalom hozzáadása várhatóan már nem lesz támogatott a későbbi verziókban. copg#:#copg_an_error_occured#:#Hiba történt. @@ -7273,6 +7277,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#Válassza ki a cél, amire a blokk mutat. Figyelem: A blokk nem tartalmazhat önmagára mutató linket! copg#:#copg_snippet_cannot_be_edited#:#Ez egy előre definiált tartalom-építőelem, ezért itt nem módosítható. +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s perc cpad#:#cpad_reading_time_status#:#Olvasási idő cpad#:#cpad_reading_time_status_desc#:#A tartalomlap becsült olvasási idejét megállapítjuk és megjelenítjük. @@ -7596,6 +7601,7 @@ crs#:#crs_members_groups#:#Csoporttagságok crs#:#crs_members_map#:#Kurzustagok térképe crs#:#crs_members_print_title#:#Kurzustagok crs#:#crs_min_one_admin#:#Legalább egy vezetőt hozzá kell rendelni ehhez a kurzushoz. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Az Ön új állapota: @@ -7923,6 +7929,7 @@ crs#:#events#:#Események crs#:#export_members#:#Résztvevők adatainak exportálása crs#:#grouping_change_assignment#:#Hozzárendelés változtatása crs#:#grp_grp_already_assigned#:#Már tagja ennek a csoportosításnak. +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#Ezúton értesítjük, hogy az alábbi kurzusok és csoportok esetén nincs meg a minimális taglétszám (még): crs#:#mem_cron_min_members_reason#:#Ezt a levelet azért kapta, mert a tagok fülön beállította, hogy kér értesítést. crs#:#mem_cron_min_members_subject#:#Kurzus/Csoport: Minimális taglétszám ellenőrzése @@ -11334,6 +11341,7 @@ meta#:#md_copyright#:#Szerzői jog meta#:#md_copyright_add#:#Új szerzői jog hozzáadása meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Alapértelmezett szerzői jog módosítása meta#:#md_copyright_enable_info#:#Válassza ezt az opciót előre meghatározott szerzői jogok ajánlására. meta#:#md_copyright_enabled#:#Szerzői jog kiválasztásának engedélyezése @@ -16162,6 +16170,7 @@ svy#:#svy_finish_survey#:#'%1' kérdőív befejezése svy#:#svy_invite_participants#:#Résztvevők meghívása svy#:#svy_link_to_svy#:#Kérdőívre mutató link svy#:#svy_part_overview#:#Áttekintés +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Nyomtatási nézet választása svy#:#svy_remove_all_participants#:#Összes résztvevő eltávolítása svy#:#svy_remove_participants#:#Résztvevő eltávolítása diff --git a/lang/ilias_it.lang b/lang/ilias_it.lang index 374c5dd61c36..d0f615793dc2 100644 --- a/lang/ilias_it.lang +++ b/lang/ilias_it.lang @@ -925,6 +925,8 @@ assessment#:#msg_number_of_terms_too_low#:#Il numero dei termini deve essere mag assessment#:#msg_poly_added#:#Aggiunto poligono assessment#:#msg_questions_moved#:#Domanda(e) spostata(e) assessment#:#msg_rect_added#:#Aggiunto rettangolo +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Domanda(e) selezionata(e) per lo spostamento assessment#:#new_category#:#Nuova categoria di unità assessment#:#new_unit#:#Nuova unità @@ -1446,6 +1448,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Selezione continua di domand assessment#:#tst_gap_analysis#:#Analisi gap assessment#:#tst_general_properties#:#Impostazioni generali del test assessment#:#tst_header_participant#:#La tua risposta: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Migliore soluzione possibile: assessment#:#tst_heading_scoring#:#Punteggio assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7245,6 +7248,7 @@ copa#:#copa_prop_reading_time#:#Reading Time copa#:#copa_value_reading_time_f_p#:#%s Minutes copa#:#copa_value_reading_time_f_s#:#%s Minute copa#:#obj_copa_duplicate#:#Pagina di contenuti duplicati +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Abilita HTML / Javascript copg#:#copg_allow_html_info#:#L'utente può utilizzare il contenuto della pagina HTML o Javascript. Ciò può causare problemi di sicurezza. Non attivare, se le funzionalità possono essere utilizzate dagli utenti che ritieni non attendibili. Il supporto per aggiungere contenuto HTML in questo modo potrebbe essere sospeso in una versione futura. copg#:#copg_an_error_occured#:#An error occured. @@ -7272,6 +7276,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#Se si imposta un link sul tutta la sezione, bisogna assicurarsi che nessun altro elemento interattivo sia incluso nella sezione. Altrimenti il loro comportamento potrebbe essere errato. copg#:#copg_snippet_cannot_be_edited#:#Questo è un frammento di contenuto predefinito e non può essere modificato qui. +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed. @@ -7595,6 +7600,7 @@ crs#:#crs_members_groups#:#Gruppi dei membri del corso crs#:#crs_members_map#:#Mappa dei membri del corso crs#:#crs_members_print_title#:#Iscritti al corso crs#:#crs_min_one_admin#:#Deve essere assegnato almeno un amministratore a questo corso. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Il tuo nuovo status e': @@ -7922,6 +7928,7 @@ crs#:#events#:#Sessioni crs#:#export_members#:#Esporta partecipanti crs#:#grouping_change_assignment#:#Cambio assegnazione crs#:#grp_grp_already_assigned#:#Sei già membro di questo raggruppamento di gruppi. +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#I gruppi e i corsi seguenti non soddisfano (ancora)il numero minimo di membri. crs#:#mem_cron_min_members_reason#:#Hai ricevuto questa mail perché hai attivato la notifica nella scheda dei membri. crs#:#mem_cron_min_members_subject#:#Corso/Gruppo: Controllo numero minimo dei membri @@ -11333,6 +11340,7 @@ meta#:#md_copyright#:#Copyright meta#:#md_copyright_add#:#Aggiungi preset di Copyright meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Modifica il preset di Copyright meta#:#md_copyright_enable_info#:#Seleziona questa opzione per mostrare una selezione di copyright predefiniti. meta#:#md_copyright_enabled#:#Abilita la selezione dei Copyright @@ -16161,6 +16169,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1' svy#:#svy_invite_participants#:#Invita partecipanti svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Panoramica +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Rimuovi tutti i partecipanti svy#:#svy_remove_participants#:#Rimuovi partecipanti diff --git a/lang/ilias_ja.lang b/lang/ilias_ja.lang index 7e6a2f839d36..cd0588177456 100644 --- a/lang/ilias_ja.lang +++ b/lang/ilias_ja.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#用語数は定義数と等しいか assessment#:#msg_poly_added#:#多角形の追加 assessment#:#msg_questions_moved#:#問題の移動 assessment#:#msg_rect_added#:#長方形の追加 +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#移動用に選択した問題 assessment#:#new_category#:#新ユニットカテゴリ assessment#:#new_unit#:#新ユニット @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#問題選択の継続 assessment#:#tst_gap_analysis#:#ギャップ分析 assessment#:#tst_general_properties#:#全般プロパティ assessment#:#tst_header_participant#:#結果: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#正解: assessment#:#tst_heading_scoring#:#採点 assessment#:#tst_hide_pagecontents#:#ページコンテンツを非表示 @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#読み取り時間 copa#:#copa_value_reading_time_f_p#:#%s 分 copa#:#copa_value_reading_time_f_s#:#%s 分 copa#:#obj_copa_duplicate#:#コンテンツページを複製 +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#HTML/Javascriptを有効にする copg#:#copg_allow_html_info#:#ユーザはHTMLまたはJavascriptページコンテンツを利用できます。セキュリティ事項に影響する可能性があります。信頼に欠けるユーザによる機能の利用可能性がある場合は有効にしてはいけません。HTMLコンテンツの追加するサポートは将来バージョンで打ち切る可能性があります。 copg#:#copg_an_error_occured#:#エラーが発生しました。 @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#ページの再読み込み copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#全セクションのリンクを設定するには他のインタラクティブ要素がセクション内に含まれない事を確認して下さい。そうでないと動作が不安定になります。 copg#:#copg_snippet_cannot_be_edited#:#これは定義済みコンテンツスニペットなのでここでは編集できません。 +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s 分 cpad#:#cpad_reading_time_status#:#読込み時間 cpad#:#cpad_reading_time_status_desc#:#有効にすると、コンテンツページオブジェクトの読込み予測時間が確定して表示されます。 @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#グループのメンバーシップ crs#:#crs_members_map#:#コースメンバーのマップ crs#:#crs_members_print_title#:#コースメンバー crs#:#crs_min_one_admin#:#このコース割当てのための管理者が一人は必要です。 +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#新しいステータスは次の通り: @@ -7908,6 +7914,7 @@ crs#:#events#:#セッション crs#:#export_members#:#受講者をエクスポート crs#:#grouping_change_assignment#:#割当て変更 crs#:#grp_grp_already_assigned#:#既にグループのこのグループ化されたメンバーです。 +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#次のコースとグループは(まだ)最小メンバー数に達していません。 crs#:#mem_cron_min_members_reason#:#メンバータブ内の通知をアクティブにしているのでこのメッセージを受領します。 crs#:#mem_cron_min_members_subject#:#コース/グループ: 最小メンバ数ーチェック @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#著作権 meta#:#md_copyright_add#:#著作権のプリセットを追加 meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#著作権のプリセットを編集 meta#:#md_copyright_enable_info#:#定義済みの著作権の選択を提供するには、このオプションを選択します。 meta#:#md_copyright_enabled#:#著作権選択を可能にする @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#サーベイ'%1'を修了 svy#:#svy_invite_participants#:#参加者を招待 svy#:#svy_link_to_svy#:#サーベイへのリンク svy#:#svy_part_overview#:#概要 +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#印刷ビュー選択 svy#:#svy_remove_all_participants#:#全参加者を削除 svy#:#svy_remove_participants#:#参加者を削除 diff --git a/lang/ilias_ka.lang b/lang/ilias_ka.lang index f0b7737103b3..841eec9afd96 100644 --- a/lang/ilias_ka.lang +++ b/lang/ilias_ka.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#დასახელებები assessment#:#msg_poly_added#:#პოლიგონი დაემატა assessment#:#msg_questions_moved#:#კითხვა გადაადგილდა assessment#:#msg_rect_added#:#მართკუთხედი დაემატა +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#გადასაადგილებლად მონიშნული კითხვები assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#ზოგადი პარამეტრები assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#შეფასება assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#ჯგუფებში წევრობა crs#:#crs_members_map#:#კურსის წევრების რუკა crs#:#crs_members_print_title#:#კურსის წევრები crs#:#crs_min_one_admin#:#სულ მცირე ერთი ადმინისტრატორი არის დანიშნული აღნიშნულ კურსზე +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#თქვენი ახალი სტატუსი არის @@ -7908,6 +7914,7 @@ crs#:#events#:#სესიები crs#:#export_members#:#მონაწილეების გადაგზავნა crs#:#grouping_change_assignment#:#დანიშვნის შეცვლა crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#საავტორო უფლება meta#:#md_copyright_add#:#საავტორო უფლებების პრეზენტაციის დამატება meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#საავტორო უფლებების პრეზენტაციის რედაქტირება meta#:#md_copyright_enable_info#:#აირჩიეთ ეს პარამეტრი გასაზრვრული საავტორო უფლებების მონიშვნის შესათავაზებლად meta#:#md_copyright_enabled#:#საავტორო უფლების მონიშვნის გააქტიურება @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_lt.lang b/lang/ilias_lt.lang index 265345f9e9d7..ccc60f6f0a33 100644 --- a/lang/ilias_lt.lang +++ b/lang/ilias_lt.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#The number of terms must be greater o assessment#:#msg_poly_added#:#Polygon added###24 07 2009 new variable assessment#:#msg_questions_moved#:#Question(s) moved###06 08 2009 new variable assessment#:#msg_rect_added#:#Rectangle added###24 07 2009 new variable +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Question(s) selected for moving###06 08 2009 new variable assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#Bendros savybės assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#Vertinimas assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Course Members Groups###16 07 2010 new variable crs#:#crs_members_map#:#Course Members Map###02 04 2007 new variable crs#:#crs_members_print_title#:#Kurso nariai crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this course.###12 08 2009 new variable +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Your new status is:###21 09 2009 new variable @@ -7908,6 +7914,7 @@ crs#:#events#:#Sesijos crs#:#export_members#:#Export Participants###25 02 2007 new variable crs#:#grouping_change_assignment#:#Keisti Priskyrimą crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Kopijavimo Teisės meta#:#md_copyright_add#:#Sukurti Kopijavimo Teisių Rinkinį meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Redaguoti Kopijavimo Teisių Rinkinį meta#:#md_copyright_enable_info#:#Rinkitės šią parinktį, norėdami pasiųlyti iš anksto numatytų kopijavimo teisių rinkinį meta#:#md_copyright_enabled#:#Įjungti Kopijavimo Teisių Parinktį @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_nl.lang b/lang/ilias_nl.lang index 847d4813b4e3..3d8fec3ffeb6 100644 --- a/lang/ilias_nl.lang +++ b/lang/ilias_nl.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#Het aantal termen moet groter of geli assessment#:#msg_poly_added#:#Polygon toegevoegd assessment#:#msg_questions_moved#:#Vragen verplaatst assessment#:#msg_rect_added#:#Rechthoek toegevoegd +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Vragen geselecteerd om te worden verplaatst. assessment#:#new_category#:#Nieuwe categorie assessment#:#new_unit#:#Nieuwe eenheid @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Doorgaan met vragenselectie assessment#:#tst_gap_analysis#:#Gap Analyse assessment#:#tst_general_properties#:#Algemene eigenschappen assessment#:#tst_header_participant#:#Resultaat: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correcte oplossing: assessment#:#tst_heading_scoring#:#Score assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Aanmelden in groep crs#:#crs_members_map#:#Cursusdeelnemers op kaart crs#:#crs_members_print_title#:#Cursusgebruikers crs#:#crs_min_one_admin#:#Er moet tenminste één beheerder bestaan in deze cursus +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Je nieuwe status is: @@ -7908,6 +7914,7 @@ crs#:#events#:#Sessies crs#:#export_members#:#Exporteer Deelnemers crs#:#grouping_change_assignment#:#Wijzig taak crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Copyright meta#:#md_copyright_add#:#Add Copyright Presetting meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Edit Copyright Presetting meta#:#md_copyright_enable_info#:#Kies deze optie om een selectie van voor-gedefinieerde copyrights aan te bieden. meta#:#md_copyright_enabled#:#Enable Copyright Selection @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_pl.lang b/lang/ilias_pl.lang index 43de07528789..6ea65a4ab702 100644 --- a/lang/ilias_pl.lang +++ b/lang/ilias_pl.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#Liczba pojęć musi być większa lub assessment#:#msg_poly_added#:#Dodano wielobok. assessment#:#msg_questions_moved#:#Przesunięto pytanie(a). assessment#:#msg_rect_added#:#Dodano prostokąt +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Wybrano pytanie(a) przeznaczone do przesunięcia assessment#:#new_category#:#Nowa kategoria jednostek assessment#:#new_unit#:#Nowa jednostka @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Bieżący wybór pytań assessment#:#tst_gap_analysis#:#Analiza GAP assessment#:#tst_general_properties#:#Cechy ogólne assessment#:#tst_header_participant#:#Twoja odpowiedź: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Najlepsze rozwiązanie: assessment#:#tst_heading_scoring#:#Punktacja assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#Jeśli ustawisz link na całą sekcję, upewnij się, że nie są w niej zawarte żadne inne elementy interaktywne (np. inne linki). Ta funkcja jest gwarantowana. copg#:#copg_snippet_cannot_be_edited#:#Jest to wstępnie zdefiniowany moduł treści, którego nie można w tym miejscu edytować. +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Członkostwo w grupach crs#:#crs_members_map#:#Mapy członków kursu crs#:#crs_members_print_title#:#Uczestnicy kursu crs#:#crs_min_one_admin#:#Do tego kursu musi być przydzielony co najmniej jeden administrator. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Twój nowy status to: @@ -7908,6 +7914,7 @@ crs#:#events#:#Zdarzenia crs#:#export_members#:#Uczestnicy eksportu crs#:#grouping_change_assignment#:#Zmień przydziały crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#Poniższe grupy i kursy aktualnie nie osiągnęły określonej dla nich minimalnej liczby uczestników. crs#:#mem_cron_min_members_reason#:#Otrzymałeś tę wiadomość, ponieważ aktywowałeś funkcję powiadomień w danej zakładce dla członków. crs#:#mem_cron_min_members_subject#:#Kurs/grupa: Kontrola minimalnej liczby uczestników @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Prawa autorskie meta#:#md_copyright_add#:#Nowe wytyczne meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Edytuj wytyczne dotyczące praw autorskich meta#:#md_copyright_enable_info#:#Aktywuj to ustawienie, aby zaoferować domyślny wybór praw autorskich. meta#:#md_copyright_enabled#:#Aktywuj wybór praw aktorskich @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_pt.lang b/lang/ilias_pt.lang index 6a9ca36b553a..6f127601fbe5 100644 --- a/lang/ilias_pt.lang +++ b/lang/ilias_pt.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#O número de termos tem de ser superi assessment#:#msg_poly_added#:#Polígono adicionado assessment#:#msg_questions_moved#:#Pergunta(s) movida(s) assessment#:#msg_rect_added#:#Retângulo adicionado +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Pergunta(s) selecionada(s) para mover assessment#:#new_category#:#Nova unidade de categoria assessment#:#new_unit#:#Nova unidade @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continuar seleção de pergu assessment#:#tst_gap_analysis#:#Análise de intervalo assessment#:#tst_general_properties#:#A sua resposta: assessment#:#tst_header_participant#:#Melhor solução: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Pontuação assessment#:#tst_heading_scoring#:#Ocultar lista de perguntas assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Atribuição de materiais +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#Se definir uma ligação em toda a secção, certifique-se que não está incluído nenhum outro elemento interativo dentro da secção. Caso contrário, o respetivo comportamento pode ser irregular. copg#:#copg_snippet_cannot_be_edited#:#Este é um fragmento conteúdo predefinido e não pode ser editado aqui. +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Os utilizadores podem classificar entradas até cinco crs#:#crs_members_map#:#Mapa dos membros do curso crs#:#crs_members_print_title#:#Membros do curso crs#:#crs_min_one_admin#:#Tem de haver pelo menos um administrador atribuído a este curso. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#O seu novo estado é: @@ -7908,6 +7914,7 @@ crs#:#events#:#Sessões crs#:#export_members#:#Exportar participantes crs#:#grouping_change_assignment#:#Mudar atribuição crs#:#grp_grp_already_assigned#:#Voltar a escrever a palavra-passe +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#Os seguintes cursos e grupos não satisfazem o número mínimo de membros (ainda). crs#:#mem_cron_min_members_reason#:#Recebeu esta mensagem porque ativou a notificação no separador dos membros. crs#:#mem_cron_min_members_subject#:#Curso/Grupo: Controlo do mínimo de membros @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Copyright meta#:#md_copyright_add#:#Adicionar predefinição de Copyright meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Editar predefinição de Copyright meta#:#md_copyright_enable_info#:#O utilizador pode editar definições da administração de teste e avaliação meta#:#md_copyright_enabled#:#Ativar seleção de Copyright @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_ro.lang b/lang/ilias_ro.lang index abe94f6cbba4..3a10c92aab32 100644 --- a/lang/ilias_ro.lang +++ b/lang/ilias_ro.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#The number of terms must be greater o assessment#:#msg_poly_added#:#Polygon added###24 07 2009 new variable assessment#:#msg_questions_moved#:#Question(s) moved###06 08 2009 new variable assessment#:#msg_rect_added#:#Rectangle added###24 07 2009 new variable +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Question(s) selected for moving###06 08 2009 new variable assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#Proprietati generale assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#Scoring ### 2006-8-11 --- Add new translation here. assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Course Members Groups###16 07 2010 new variable crs#:#crs_members_map#:#Course Members Map###02 04 2007 new variable crs#:#crs_members_print_title#:#Membrii cursului crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this course.###12 08 2009 new variable +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Your new status is:###21 09 2009 new variable @@ -7908,6 +7914,7 @@ crs#:#events#:#Events###10 Jul 2006 new variable crs#:#export_members#:#Export Participants###25 02 2007 new variable crs#:#grouping_change_assignment#:#Change Assignment###05 10 2006 new variable crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Copyright###23 10 2007 new variable meta#:#md_copyright_add#:#Add Copyright Presetting###25 09 2007 new variable meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Edit Copyright Presetting###25 09 2007 new variable meta#:#md_copyright_enable_info#:#Choose this option to offer a selection of predefined copyrights###23 10 2007 new variable meta#:#md_copyright_enabled#:#Enable Copyright Selection###25 09 2007 new variable @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_ru.lang b/lang/ilias_ru.lang index 9c7a31edf58d..a5e322f1a078 100644 --- a/lang/ilias_ru.lang +++ b/lang/ilias_ru.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#Число терминов долж assessment#:#msg_poly_added#:#Многогранник добавлен assessment#:#msg_questions_moved#:#Вопрос(ы) перемещены assessment#:#msg_rect_added#:#Прямоугольник добавлен +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Вопрос(ы) выбранные для перемещения assessment#:#new_category#:#New Unit Category assessment#:#new_unit#:#New Unit @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Продолжить выб assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#Основные свойства assessment#:#tst_header_participant#:#Result: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution: assessment#:#tst_heading_scoring#:#Оценки assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Группы подписчиков курса crs#:#crs_members_map#:#Course Members Map crs#:#crs_members_print_title#:#Подписчики курса crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this course. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Your new status is: @@ -7908,6 +7914,7 @@ crs#:#events#:#Сессии crs#:#export_members#:#Экспортировать участников crs#:#grouping_change_assignment#:#Change Assignment crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Copyright meta#:#md_copyright_add#:#Add Copyright Presetting meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Edit Copyright Presetting meta#:#md_copyright_enable_info#:#Choose this option to offer a selection of predefined copyrights meta#:#md_copyright_enabled#:#Enable Copyright Selection @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_sk.lang b/lang/ilias_sk.lang index ed6605b53833..ed6f4fd62253 100644 --- a/lang/ilias_sk.lang +++ b/lang/ilias_sk.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#Počet výrazů musí být větší, assessment#:#msg_poly_added#:#Polygon přidán assessment#:#msg_questions_moved#:#Otázky přesunuty assessment#:#msg_rect_added#:#Obdélník přidán +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Otázky vybrány k přesunutí assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#Obecné vlastnosti assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#Hodnocení assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Členství ve skupině crs#:#crs_members_map#:#Mapa příslušníků kurzu crs#:#crs_members_print_title#:#Příslušníci kurzu crs#:#crs_min_one_admin#:#K tomuto kurzu musí být přiřazen alespoň jeden správce. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Váš nový status je: @@ -7908,6 +7914,7 @@ crs#:#events#:#Lekce crs#:#export_members#:#Export účastníků crs#:#grouping_change_assignment#:#Změnit přidělení crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Copyright meta#:#md_copyright_add#:#Přidat přednastavení Copyrightu meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Upravit přednastavení Copyrightu meta#:#md_copyright_enable_info#:#Vyberte tuto volbu k nabídnutí výběru předdefinovaného Copyrightu meta#:#md_copyright_enabled#:#Zapnout výběr Copyrightu @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_sl.lang b/lang/ilias_sl.lang index 347e19a35cbb..f74b6f7f5bd0 100644 --- a/lang/ilias_sl.lang +++ b/lang/ilias_sl.lang @@ -925,6 +925,8 @@ assessment#:#msg_number_of_terms_too_low#:#Število izrazov mora biti večje ali assessment#:#msg_poly_added#:#Dodan je poligon assessment#:#msg_questions_moved#:#Vprašanje/-a je/so premaknjeno/-a. assessment#:#msg_rect_added#:#Dodan je pravokotnik +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Izbrano vprašanje/-a za premik assessment#:#new_category#:#Nova kategorija enot assessment#:#new_unit#:#Nova enota @@ -1446,6 +1448,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Zaporedni izbor vprašanj assessment#:#tst_gap_analysis#:#Analiza praznine assessment#:#tst_general_properties#:#Nastavitve testa assessment#:#tst_header_participant#:#Vaš odgovor: +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Najboljša možna rešitev: assessment#:#tst_heading_scoring#:#Ocena assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7245,6 +7248,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###19 08 2022 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###19 08 2022 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###19 08 2022 new variable copa#:#obj_copa_duplicate#:#Podvoji stran z vsebino +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version. copg#:#copg_an_error_occured#:#An error occured.###19 08 2022 new variable @@ -7272,6 +7276,7 @@ copg#:#copg_reload_page#:#Reload Page###19 08 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#Če ustvarite povezavo do celotnega bloka, se prepričajte, da ta ne vsebuje nadaljnjih interaktivnih elementov (npr. drugih povezav). Njihovo delovanje ni zagotovljeno. copg#:#copg_snippet_cannot_be_edited#:#To je vnaprej določen sestavni del vsebine, ki ga na tem mestu ni mogoče urejati. +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###19 08 2022 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###19 08 2022 new variable @@ -7595,6 +7600,7 @@ crs#:#crs_members_groups#:#Članstva v skupini crs#:#crs_members_map#:#Zemljevid članov tečaja crs#:#crs_members_print_title#:#Člani tečaja crs#:#crs_min_one_admin#:#Temu tečaju mora biti dodeljen vsaj en administrator. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Vaš status: @@ -7922,6 +7928,7 @@ crs#:#events#:#Seje crs#:#export_members#:#Izvoz udeleženca crs#:#grouping_change_assignment#:#Spremeni dodelitve crs#:#grp_grp_already_assigned#:#Ker ste že član skupine, ne morete postati član nadaljnje skupine s seznama! +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#naslednji tečaji in skupine trenutno ne dosegajo minimalnega števila udeleženk in udeležencev. crs#:#mem_cron_min_members_reason#:#To e-pošto ste prejeli, ker ste aktivirali funkcijo obveščanja v posameznem zavihku člana. crs#:#mem_cron_min_members_subject#:#Tečaj/skupina: Preverjanje minimalnega števila udeležencev @@ -11333,6 +11340,7 @@ meta#:#md_copyright#:#Avtorske pravice meta#:#md_copyright_add#:#Nova smernica meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Uredi smernico za avtorske pravice meta#:#md_copyright_enable_info#:#Aktivirajte to nastavitev, da ponudite vnaprej določene uporabniške licence. meta#:#md_copyright_enabled#:#Aktiviraj izbiro avtorskih pravic @@ -16161,6 +16169,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1' svy#:#svy_invite_participants#:#Invite Participants svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants svy#:#svy_remove_participants#:#Remove Participants diff --git a/lang/ilias_sq.lang b/lang/ilias_sq.lang index 806158834677..0d7f03601d86 100644 --- a/lang/ilias_sq.lang +++ b/lang/ilias_sq.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#The number of terms must be greater o assessment#:#msg_poly_added#:#Polygon added###24 07 2009 new variable assessment#:#msg_questions_moved#:#Question(s) moved###06 08 2009 new variable assessment#:#msg_rect_added#:#Rectangle added###24 07 2009 new variable +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Question(s) selected for moving###06 08 2009 new variable assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#Karakteristikat gjenerale assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#Scoring ### 2006-8-11 --- Add new translation here. assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Course Members Groups###16 07 2010 new variable crs#:#crs_members_map#:#Course Members Map###02 04 2007 new variable crs#:#crs_members_print_title#:#Anëtarët e Kursit crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this course.###12 08 2009 new variable +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Your new status is:###21 09 2009 new variable @@ -7908,6 +7914,7 @@ crs#:#events#:#Events###10 Jul 2006 new variable crs#:#export_members#:#Export Participants###25 02 2007 new variable crs#:#grouping_change_assignment#:#Change Assignment###05 10 2006 new variable crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Copyright###23 10 2007 new variable meta#:#md_copyright_add#:#Add Copyright Presetting###25 09 2007 new variable meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Edit Copyright Presetting###25 09 2007 new variable meta#:#md_copyright_enable_info#:#Choose this option to offer a selection of predefined copyrights###23 10 2007 new variable meta#:#md_copyright_enabled#:#Enable Copyright Selection###25 09 2007 new variable @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_sr.lang b/lang/ilias_sr.lang index 778a32c56024..7e434cf46c64 100644 --- a/lang/ilias_sr.lang +++ b/lang/ilias_sr.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#The number of terms must be greater o assessment#:#msg_poly_added#:#Polygon added###24 07 2009 new variable assessment#:#msg_questions_moved#:#Question(s) moved###06 08 2009 new variable assessment#:#msg_rect_added#:#Rectangle added###24 07 2009 new variable +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Question(s) selected for moving###06 08 2009 new variable assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#Osnovne osobine assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#Scoring ### 2006-8-11 --- Add new translation here. assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Course Members Groups###16 07 2010 new variable crs#:#crs_members_map#:#Course Members Map###02 04 2007 new variable crs#:#crs_members_print_title#:#Clanovi kursa crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this course.###12 08 2009 new variable +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Your new status is:###21 09 2009 new variable @@ -7908,6 +7914,7 @@ crs#:#events#:#Events###10 Jul 2006 new variable crs#:#export_members#:#Export Participants###25 02 2007 new variable crs#:#grouping_change_assignment#:#Change Assignment###05 10 2006 new variable crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Copyright###23 10 2007 new variable meta#:#md_copyright_add#:#Add Copyright Presetting###25 09 2007 new variable meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Edit Copyright Presetting###25 09 2007 new variable meta#:#md_copyright_enable_info#:#Choose this option to offer a selection of predefined copyrights###23 10 2007 new variable meta#:#md_copyright_enabled#:#Enable Copyright Selection###25 09 2007 new variable @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_sv.lang b/lang/ilias_sv.lang index b13fca94b61d..325c70429802 100644 --- a/lang/ilias_sv.lang +++ b/lang/ilias_sv.lang @@ -926,6 +926,8 @@ assessment#:#msg_number_of_terms_too_low#:#Antalet termer måste vara större ä assessment#:#msg_poly_added#:#Polygon tillagd assessment#:#msg_questions_moved#:#Frågeställningar uppskjutna assessment#:#msg_rect_added#:#Rektangel tillagd +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Frågor om att flytta utvalda assessment#:#new_category#:#Nya enheter Kategori assessment#:#new_unit#:#Ny enhet @@ -1447,6 +1449,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Kontinuerligt urval av fråg assessment#:#tst_gap_analysis#:#Analys av luckor assessment#:#tst_general_properties#:#Inställningar för testet assessment#:#tst_header_participant#:#Ditt svar +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Bästa möjliga lösning assessment#:#tst_heading_scoring#:#Rating assessment#:#tst_hide_pagecontents#:# Dölj sidans innehåll @@ -7246,6 +7249,7 @@ copa#:#copa_prop_reading_time#:#Tid för läsning copa#:#copa_value_reading_time_f_p#:#%s minuter copa#:#copa_value_reading_time_f_s#:#%s minut copa#:#obj_copa_duplicate#:#Sidor med duplicerat innehåll +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Tillåt HTML/Javascript copg#:#copg_allow_html_info#:#Användare kan använda HTML eller Javascript i sidinnehåll. Detta kan leda till säkerhetsproblem. Du bör endast aktivera denna funktion för komponenter som används av betrodda användare. Möjligheten att inkludera HTML på detta sätt kan komma att tas bort copg#:#copg_an_error_occured#:#Tyvärr har ett problem uppstått. @@ -7273,6 +7277,7 @@ copg#:#copg_reload_page#:#Reload sida copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#Välj en destination för länkning av blocket. Uppmärksamhet copg#:#copg_snippet_cannot_be_edited#:#Detta är en fördefinierad innehållsmodul som inte kan redigeras just nu. +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minut(er) cpad#:#cpad_reading_time_status#:#Tid för läsning cpad#:#cpad_reading_time_status_desc#:#Om den är aktiverad beräknas och visas den uppskattade lästiden för innehållssidor. @@ -7596,6 +7601,7 @@ crs#:#crs_members_groups#:#Gruppmedlemskap crs#:#crs_members_map#:#Card kursdeltagare crs#:#crs_members_print_title#:#Kursdeltagare crs#:#crs_min_one_admin#:#Minst en administratör måste vara kvar på den här kursen. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#Mina kurser och grupper crs#:#crs_my_courses_groups_enabled_info#:#Om du aktiverar det här alternativet visas alternativet "Mina kurser och grupper" i tidningen. crs#:#crs_new_status#:#Din status @@ -7923,6 +7929,7 @@ crs#:#events#:#Sessioner crs#:#export_members#:#Export av deltagardata crs#:#grouping_change_assignment#:#Ändra uppdrag crs#:#grp_grp_already_assigned#:#Eftersom du redan är medlem i en av grupperna kan du inte gå med i en annan grupp från listan! +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#Följande kurser och grupper når för närvarande inte upp till minimiantalet medlemmar crs#:#mem_cron_min_members_reason#:#Om du inte längre vill få aviseringar för dessa kurser och grupper, avaktivera kryssrutan "Avisering" på fliken "Medlemmar" i respektive objekt. crs#:#mem_cron_min_members_subject#:#Kurs/Grupp @@ -11334,6 +11341,7 @@ meta#:#md_copyright#:#Upphovsrätt meta#:#md_copyright_add#:#Ny standard meta#:#md_copyright_alt_text#:#Alternativ text meta#:#md_copyright_alt_text_info#:#Används för 'alt'-attributet för bilden +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Ändra copyright-standard meta#:#md_copyright_enable_info#:#Aktivera denna inställning för att erbjuda fördefinierade användningslicenser. meta#:#md_copyright_enabled#:#Aktivera val av upphovsrätt @@ -16162,6 +16170,7 @@ svy#:#svy_finish_survey#:#Redigera undersökning "%1 svy#:#svy_invite_participants#:#Bjud in deltagare svy#:#svy_link_to_svy#:#Länk till undersökningen svy#:#svy_part_overview#:#Översikt +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Selektion utskriftsvy svy#:#svy_remove_all_participants#:#Radera alla deltagardata svy#:#svy_remove_participants#:#Ta bort deltagare diff --git a/lang/ilias_tr.lang b/lang/ilias_tr.lang index cacadc8481c4..9b5310b1f3b0 100644 --- a/lang/ilias_tr.lang +++ b/lang/ilias_tr.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#Terimler sayısı tanımlar sayısın assessment#:#msg_poly_added#:#Poligon eklendi assessment#:#msg_questions_moved#:#Soru(lar) taşındı assessment#:#msg_rect_added#:#Dikdörtgen eklendi +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Soru(lar) taşıma için seçildi assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#Genel Ayarlar assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#Puanlama assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Gruplardaki Üyelikler crs#:#crs_members_map#:#Ders Üyeler Harita crs#:#crs_members_print_title#:#Ders üyeleri crs#:#crs_min_one_admin#:#Bunun ders atanmış en az bir yönetici olmalıdır. +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Yeni durumu: @@ -7908,6 +7914,7 @@ crs#:#events#:#Oturumlar crs#:#export_members#:#Katılımcıları Dışa Aktar crs#:#grouping_change_assignment#:#Atananı Değiştir crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Copyright meta#:#md_copyright_add#:#Önayar Ekleme Copyright meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Önayar Düzenleme Copyright meta#:#md_copyright_enable_info#:#önceden telif haklarının bir seçim sunmak için bu seçeneği seçin. meta#:#md_copyright_enabled#:#Etkinleştir Telif Seçimi @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_uk.lang b/lang/ilias_uk.lang index 11e54eb9e80f..e4830116deda 100644 --- a/lang/ilias_uk.lang +++ b/lang/ilias_uk.lang @@ -911,6 +911,8 @@ assessment#:#msg_number_of_terms_too_low#:#The number of terms must be greater o assessment#:#msg_poly_added#:#Polygon added###24 07 2009 new variable assessment#:#msg_questions_moved#:#Question(s) moved###06 08 2009 new variable assessment#:#msg_rect_added#:#Rectangle added###24 07 2009 new variable +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Question(s) selected for moving###06 08 2009 new variable assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1432,6 +1434,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#Загальні властивості assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#Scoring###13 May 2005 new variable assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7231,6 +7234,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7258,6 +7262,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7581,6 +7586,7 @@ crs#:#crs_members_groups#:#Course Members Groups###16 07 2010 new variable crs#:#crs_members_map#:#Course Members Map###02 04 2007 new variable crs#:#crs_members_print_title#:#Члени курсу crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this course.###12 08 2009 new variable +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Your new status is:###21 09 2009 new variable @@ -7908,6 +7914,7 @@ crs#:#events#:#Sessions###25 02 2007 new variable crs#:#export_members#:#Export Participants###25 02 2007 new variable crs#:#grouping_change_assignment#:#Change Assignment###25 02 2007 new variable crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11319,6 +11326,7 @@ meta#:#md_copyright#:#Copyright###23 10 2007 new variable meta#:#md_copyright_add#:#Add Copyright Presetting###25 09 2007 new variable meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Edit Copyright Presetting###25 09 2007 new variable meta#:#md_copyright_enable_info#:#Choose this option to offer a selection of predefined copyrights###23 10 2007 new variable meta#:#md_copyright_enabled#:#Enable Copyright Selection###25 09 2007 new variable @@ -16147,6 +16155,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_vi.lang b/lang/ilias_vi.lang index cbe4ce47287b..0afc8c6a3738 100644 --- a/lang/ilias_vi.lang +++ b/lang/ilias_vi.lang @@ -913,6 +913,8 @@ assessment#:#msg_number_of_terms_too_low#:#The number of terms must be greater o assessment#:#msg_poly_added#:#Polygon added###24 07 2009 new variable assessment#:#msg_questions_moved#:#Question(s) moved###06 08 2009 new variable assessment#:#msg_rect_added#:#Rectangle added###24 07 2009 new variable +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#Question(s) selected for moving###06 08 2009 new variable assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1434,6 +1436,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#Thuộc tính chung assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#Ghi điểm assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7233,6 +7236,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7260,6 +7264,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7583,6 +7588,7 @@ crs#:#crs_members_groups#:#Course Members Groups###16 07 2010 new variable crs#:#crs_members_map#:#Course Members Map###02 04 2007 new variable crs#:#crs_members_print_title#:#Thành viên khóa học crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this course.###12 08 2009 new variable +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#Your new status is:###21 09 2009 new variable @@ -7910,6 +7916,7 @@ crs#:#events#:#Sessions###25 02 2007 new variable crs#:#export_members#:#Export Participants###25 02 2007 new variable crs#:#grouping_change_assignment#:#Change Assignment###25 02 2007 new variable crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11321,6 +11328,7 @@ meta#:#md_copyright#:#Copyright###23 10 2007 new variable meta#:#md_copyright_add#:#Add Copyright Presetting###25 09 2007 new variable meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#Edit Copyright Presetting###25 09 2007 new variable meta#:#md_copyright_enable_info#:#Choose this option to offer a selection of predefined copyrights###23 10 2007 new variable meta#:#md_copyright_enabled#:#Enable Copyright Selection###25 09 2007 new variable @@ -16149,6 +16157,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable diff --git a/lang/ilias_zh.lang b/lang/ilias_zh.lang index 7b40b6bd23dc..782b2824fbf7 100644 --- a/lang/ilias_zh.lang +++ b/lang/ilias_zh.lang @@ -910,6 +910,8 @@ assessment#:#msg_number_of_terms_too_low#:#项目的数量必需大于或等于 assessment#:#msg_poly_added#:#添加多边形 assessment#:#msg_questions_moved#:#题目被移除 assessment#:#msg_rect_added#:#添加矩形 +assessment#:#msg_score_settings_modified_and_recalc#:#Your changes were saved and the results recalculated correspondingly.###14 02 2024 new variable +assessment#:#msg_score_settings_not_modified#:#Your changes were not saved.###14 02 2024 new variable assessment#:#msg_selected_for_move#:#已选择的要移除的题目 assessment#:#new_category#:#New Unit Category###24 10 2013 new variable assessment#:#new_unit#:#New Unit###24 10 2013 new variable @@ -1431,6 +1433,7 @@ assessment#:#tst_form_dynamic_question_set_config#:#Continues Question Selection assessment#:#tst_gap_analysis#:#Gap Analysis###26 09 2014 new variable assessment#:#tst_general_properties#:#常规属性 assessment#:#tst_header_participant#:#Result:###24 10 2013 new variable +assessment#:#tst_header_participant_no_answer#:#Question - not answered###14 02 2024 new variable assessment#:#tst_header_solution#:#Correct solution:###24 10 2013 new variable assessment#:#tst_heading_scoring#:#得分 assessment#:#tst_hide_pagecontents#:#Hide page content###31 03 2023 new variable @@ -7230,6 +7233,7 @@ copa#:#copa_prop_reading_time#:#Reading Time###30 04 2021 new variable copa#:#copa_value_reading_time_f_p#:#%s Minutes###30 04 2021 new variable copa#:#copa_value_reading_time_f_s#:#%s Minute###30 04 2021 new variable copa#:#obj_copa_duplicate#:#Duplicate Content Page###10 11 2018 new variable +copg#:#copg_active_to_small#:#This date must be higher than the starting date.###14 02 2024 new variable copg#:#copg_allow_html#:#Enable HTML/Javascript###30 04 2021 new variable copg#:#copg_allow_html_info#:#User may use HTML or Javascript page content. This may lead to security issues. Do not activate, if features can be used by users which you consider not being trustworthy. The support to add HTML content this way may be discontinued in a future version.###30 04 2021 new variable copg#:#copg_an_error_occured#:#An error occured.###30 04 2021 new variable @@ -7257,6 +7261,7 @@ copg#:#copg_reload_page#:#Reload Page###29 06 2022 new variable copg#:#copg_remove_formats#:#Remove Formatting###17 01 2024 new variable copg#:#copg_sec_link_info#:#If you set a link on the whole section, please ensure that no other interactive elements are included within the section. Otherwise their behaviour may be erratically.###25 10 2016 new variable copg#:#copg_snippet_cannot_be_edited#:#This is a predefined content snippet and cannot be edited here.###25 10 2016 new variable +copg#:#copg_unsupported_media_type#:#This media object has an unsupported media type.###14 02 2024 new variable copg#:#copg_x_minutes#:#%s minute(s)###31 03 2023 new variable cpad#:#cpad_reading_time_status#:#Reading Time###30 04 2021 new variable cpad#:#cpad_reading_time_status_desc#:#If enabled, the estimated reading time for content page objects will be determined and displayed.###30 04 2021 new variable @@ -7580,6 +7585,7 @@ crs#:#crs_members_groups#:#课程成员组 crs#:#crs_members_map#:#课程成员地图 crs#:#crs_members_print_title#:#课程成员 crs#:#crs_min_one_admin#:#必须至少有一个管理员分配给本课程 +crs#:#crs_msg_no_self_registration_period_if_self_enrolment_disabled#:#The limited registration period can not be defined if the "No Self-enrolment" setting is active.###14 02 2024 new variable crs#:#crs_my_courses_groups_enabled#:#My Courses and Groups###28 07 2023 new variable crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Courses and Groups' is visible.###28 07 2023 new variable crs#:#crs_new_status#:#您的新状态 @@ -7907,6 +7913,7 @@ crs#:#events#:#会话 crs#:#export_members#:#导出参与者 crs#:#grouping_change_assignment#:#改变分配 crs#:#grp_grp_already_assigned#:#You are already member of this grouping of groups.###07 02 2020 new variable +crs#:#grp_not_all_users_assigned_msg#:#%s user(s) assigned as group member(s), %s user(s) were already in the group.###14 02 2024 new variable crs#:#mem_cron_min_members_intro#:#The following courses and groups do not meet the minimum number of members (yet).###25 10 2015 new variable crs#:#mem_cron_min_members_reason#:#You receive this message because you have activated the notification in the members-tab.###25 10 2015 new variable crs#:#mem_cron_min_members_subject#:#Course/Group: Minimum Members Check###25 10 2015 new variable @@ -11318,6 +11325,7 @@ meta#:#md_copyright#:#版权 meta#:#md_copyright_add#:#添加版权预设定置 meta#:#md_copyright_alt_text#:#Text Representation###23 10 2023 new variable meta#:#md_copyright_alt_text_info#:#Used for image ‘alt’ attribute###23 10 2023 new variable +meta#:#md_copyright_default#:#Default###14 02 2024 new variable meta#:#md_copyright_edit#:#编辑版权预设置 meta#:#md_copyright_enable_info#:#选择这个选项提供一个预定义版权选项 meta#:#md_copyright_enabled#:#启用版权选择 @@ -16146,6 +16154,7 @@ svy#:#svy_finish_survey#:#Finish survey '%1'###07 02 2020 new variable svy#:#svy_invite_participants#:#Invite Participants###07 02 2020 new variable svy#:#svy_link_to_svy#:#Link to Survey###31 03 2023 new variable svy#:#svy_part_overview#:#Overview###07 02 2020 new variable +svy#:#svy_placeholders_label#:#Verfügbare Platzhalter###14 02 2024 new variable svy#:#svy_print_selection#:#Print View Selection###31 03 2023 new variable svy#:#svy_remove_all_participants#:#Remove all Participants###07 02 2020 new variable svy#:#svy_remove_participants#:#Remove Participants###07 02 2020 new variable From 6b0c3ebfa3ba3ac86974b49f6c228c0a383c69bc Mon Sep 17 00:00:00 2001 From: Fabian Wolf Date: Wed, 14 Feb 2024 16:01:31 +0100 Subject: [PATCH 484/497] Release 8.9 --- include/inc.ilias_version.php | 4 ++-- setup/sql/ilias3.sql | 16 +++++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/include/inc.ilias_version.php b/include/inc.ilias_version.php index 844aa97bf5a0..1e0ce111bdcd 100644 --- a/include/inc.ilias_version.php +++ b/include/inc.ilias_version.php @@ -10,5 +10,5 @@ * * @package ilias-core */ -define("ILIAS_VERSION", "8.8 2024-01-17"); -define("ILIAS_VERSION_NUMERIC", "8.8"); // since version ILIAS 6 this must be always x.y: x and y are numbers +define("ILIAS_VERSION", "8.9 2024-02-14"); +define("ILIAS_VERSION_NUMERIC", "8.9"); // since version ILIAS 6 this must be always x.y: x and y are numbers diff --git a/setup/sql/ilias3.sql b/setup/sql/ilias3.sql index aeb606c6a15a..7f026e5e32b4 100644 --- a/setup/sql/ilias3.sql +++ b/setup/sql/ilias3.sql @@ -1,8 +1,8 @@ --- MariaDB dump 10.19 Distrib 10.6.12-MariaDB, for debian-linux-gnu (x86_64) +-- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) -- -- Host: localhost Database: ilias_release -- ------------------------------------------------------ --- Server version 10.6.12-MariaDB-0ubuntu0.22.04.1 +-- Server version 10.6.16-MariaDB-0ubuntu0.22.04.1 -- -- Table structure for table `acc_access_key` @@ -3189,7 +3189,7 @@ CREATE TABLE `cp_item` ( CREATE TABLE `cp_manifest` ( `base` varchar(200) DEFAULT NULL, `cp_node_id` int(11) NOT NULL DEFAULT 0, - `defaultorganization` varchar(50) DEFAULT NULL, + `defaultorganization` varchar(255) DEFAULT NULL, `id` varchar(200) DEFAULT NULL, `title` varchar(255) DEFAULT NULL, `uri` varchar(255) DEFAULT NULL, @@ -7220,6 +7220,7 @@ INSERT INTO `il_db_steps` VALUES ('ilResourceStorageDB80',9,'2023-03-31 13:10:07 INSERT INTO `il_db_steps` VALUES ('ilResourceStorageDB80',10,'2023-03-31 13:10:07.991955','2023-03-31 13:10:08.003472'); INSERT INTO `il_db_steps` VALUES ('ilResourceStorageDB80',11,'2023-05-17 16:34:13.517597','2023-05-17 16:34:13.532396'); INSERT INTO `il_db_steps` VALUES ('ilResourceStorageDB80',12,'2023-05-17 16:34:13.532947','2023-05-17 16:34:13.537961'); +INSERT INTO `il_db_steps` VALUES ('ilScormAiccDatabaseUpdateSteps',1,'2024-02-14 15:58:32.828596','2024-02-14 15:58:32.837435'); INSERT INTO `il_db_steps` VALUES ('ilSessionDBUpdateSteps8',1,'2023-05-17 16:34:13.592751','2023-05-17 16:34:13.598572'); INSERT INTO `il_db_steps` VALUES ('ilSkillDBUpdateSteps',1,'2023-03-31 13:10:08.762867','2023-03-31 13:10:08.777841'); INSERT INTO `il_db_steps` VALUES ('ilSkillDBUpdateSteps',2,'2023-03-31 13:10:08.778520','2023-03-31 13:10:08.783301'); @@ -7251,6 +7252,7 @@ INSERT INTO `il_db_steps` VALUES ('ilTreeDBUpdateSteps8',1,'2023-06-21 14:26:12. INSERT INTO `il_db_steps` VALUES ('ilUser8DBUpdateSteps',1,'2023-06-21 14:26:12.990740','2023-06-21 14:26:13.010246'); INSERT INTO `il_db_steps` VALUES ('ilUser8DBUpdateSteps',2,'2023-07-28 17:12:14.517581','2023-07-28 17:12:14.535810'); INSERT INTO `il_db_steps` VALUES ('ilUser8DBUpdateSteps',3,'2023-10-23 15:11:23.309986','2023-10-23 15:11:23.315407'); +INSERT INTO `il_db_steps` VALUES ('ilUser8DBUpdateSteps',4,'2024-02-14 15:58:32.841548','2024-02-14 15:58:32.847008'); INSERT INTO `il_db_steps` VALUES ('ilUserTableUpdateSteps',1,'2023-10-23 15:11:23.316516','2023-10-23 15:11:23.321536'); INSERT INTO `il_db_steps` VALUES ('ilUserTableUpdateSteps',2,'2023-10-23 15:11:23.322403','2023-10-23 15:11:23.327533'); INSERT INTO `il_db_steps` VALUES ('ilUserTableUpdateSteps',3,'2023-10-23 15:11:23.328168','2023-10-23 15:11:23.340048'); @@ -13118,7 +13120,7 @@ INSERT INTO `object_data` VALUES (34,'typ','lm','Learning module Object',-1,'200 INSERT INTO `object_data` VALUES (35,'typ','notf','Note Folder Object',-1,'2002-12-21 00:04:00','2002-12-21 00:04:00','',NULL); INSERT INTO `object_data` VALUES (36,'typ','note','Note Object',-1,'2002-12-21 00:04:00','2002-12-21 00:04:00','',NULL); INSERT INTO `object_data` VALUES (37,'typ','frm','Forum object',-1,'2002-07-15 15:54:22','2003-08-15 12:36:40','',NULL); -INSERT INTO `object_data` VALUES (70,'lng','en','installed',-1,NULL,'2024-01-17 12:41:24','',NULL); +INSERT INTO `object_data` VALUES (70,'lng','en','installed',-1,NULL,'2024-02-14 15:58:32','',NULL); INSERT INTO `object_data` VALUES (71,'lng','de','not_installed',6,'2003-08-15 10:25:19','2015-12-22 16:29:24','',NULL); INSERT INTO `object_data` VALUES (72,'lng','es','not_installed',6,'2003-08-15 10:25:19','2003-08-15 10:25:19','',NULL); INSERT INTO `object_data` VALUES (73,'lng','it','not_installed',6,'2003-08-15 10:25:19','2003-08-15 10:25:19','',NULL); @@ -20111,7 +20113,7 @@ INSERT INTO `settings` VALUES ('common','ilfrmnoti1','1'); INSERT INTO `settings` VALUES ('common','ilfrmreadidx1','1'); INSERT INTO `settings` VALUES ('common','ilfrmthri2','1'); INSERT INTO `settings` VALUES ('common','ilGlobalTstPoolUsageSettingInitilisation','1'); -INSERT INTO `settings` VALUES ('common','ilias_version','8.8.0'); +INSERT INTO `settings` VALUES ('common','ilias_version','8.9.0'); INSERT INTO `settings` VALUES ('common','ilinc_akclassvalues_required','1'); INSERT INTO `settings` VALUES ('common','ilmpathix','1'); INSERT INTO `settings` VALUES ('common','iloscmsgidx1','1'); @@ -23883,7 +23885,7 @@ CREATE TABLE `usr_data` ( `gender` char(1) DEFAULT 'm', `email` varchar(128) DEFAULT NULL, `institution` varchar(80) DEFAULT NULL, - `street` varchar(40) DEFAULT NULL, + `street` varchar(512) DEFAULT NULL, `city` varchar(40) DEFAULT NULL, `zipcode` varchar(10) DEFAULT NULL, `country` varchar(40) DEFAULT NULL, @@ -25095,4 +25097,4 @@ CREATE TABLE `xmlvalue_seq` ( --- Dump completed on 2024-01-17 12:41:26 +-- Dump completed on 2024-02-14 15:58:33 From 9ac0519c8a13713da4a3e93b6b299874d53224f2 Mon Sep 17 00:00:00 2001 From: Thibeau Fuhrer Date: Tue, 13 Feb 2024 11:41:50 +0100 Subject: [PATCH 485/497] [FIX] #39872 ilCtrl: support namespaced command classes. --- Services/UICore/classes/class.ilCtrl.php | 12 ++++++++---- .../UICore/interfaces/interface.ilCtrlInterface.php | 6 ++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Services/UICore/classes/class.ilCtrl.php b/Services/UICore/classes/class.ilCtrl.php index 3bf4295b7c8a..301fa145ea53 100644 --- a/Services/UICore/classes/class.ilCtrl.php +++ b/Services/UICore/classes/class.ilCtrl.php @@ -296,7 +296,11 @@ public function setCmd(?string $a_cmd): void */ public function getCmdClass(): ?string { - return $this->context->getCmdClass() ?? ''; + if (null !== ($cmd_class = $this->context->getCmdClass())) { + return strtolower($this->structure->getObjNameByName($cmd_class)); + } + + return ''; } /** @@ -329,7 +333,7 @@ public function getNextClass($a_gui_class = null): ?string ); if (null !== $next_cid) { - return $this->structure->getClassNameByCid($next_cid) ?? ''; + return strtolower($this->structure->getObjNameByCid($next_cid) ?? ''); } return ''; @@ -942,7 +946,7 @@ private function getTargetUrl( $target_url = $this->appendParameterString( $target_url, self::PARAM_BASE_CLASS, - $base_class, + urlencode($base_class), // encode in case of namespaced classes $is_escaped ); @@ -963,7 +967,7 @@ private function getTargetUrl( $target_url = $this->appendParameterString( $target_url, self::PARAM_CMD_CLASS, - $cmd_class, + urlencode($cmd_class), // encode in case of namespaced classes $is_escaped ); } diff --git a/Services/UICore/interfaces/interface.ilCtrlInterface.php b/Services/UICore/interfaces/interface.ilCtrlInterface.php index 247c2f0a47c0..fc62770a53d5 100644 --- a/Services/UICore/interfaces/interface.ilCtrlInterface.php +++ b/Services/UICore/interfaces/interface.ilCtrlInterface.php @@ -111,7 +111,8 @@ public function getCmd(string $fallback_command = null): ?string; public function setCmd(?string $a_cmd): void; /** - * Returns the command class which should be executed next. + * Returns the fully-qualified classname of the requested command class. + * Note this will be lowercase for backwards compatibility. * * @return string|null */ @@ -128,7 +129,8 @@ public function getCmdClass(): ?string; public function setCmdClass($a_cmd_class): void; /** - * Returns the classname of the next class in the control flow. + * Returns the fully-qualified classname of the next class in the control flow. + * Note this will be lowercase for backwards compatibility. * * @param object|string|null $a_gui_class * @return string|null From 219296304121c6af2c1187c54cea138390cdfe7f Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 22 Jun 2023 14:57:39 +0200 Subject: [PATCH 486/497] ErrorHandling: Hide sensitive information See: https://mantis.ilias.de/view.php?id=37522 --- .../classes/class.ilPlainTextHandler.php | 79 ++++++++++++++++--- .../Init/classes/class.ilErrorHandling.php | 20 ++++- .../error/class.ilLoggingErrorFileStorage.php | 34 ++++++-- 3 files changed, 114 insertions(+), 19 deletions(-) diff --git a/Services/Exceptions/classes/class.ilPlainTextHandler.php b/Services/Exceptions/classes/class.ilPlainTextHandler.php index af2f65b6fff6..1018bc8cec3a 100644 --- a/Services/Exceptions/classes/class.ilPlainTextHandler.php +++ b/Services/Exceptions/classes/class.ilPlainTextHandler.php @@ -29,6 +29,19 @@ class ilPlainTextHandler extends \Whoops\Handler\PlainTextHandler { protected const KEY_SPACE = 25; + /** @var list */ + private array $exclusion_list = []; + + /** + * @param list $exclusion_list + */ + public function withExclusionList(array $exclusion_list): self + { + $clone = clone $this; + $clone->exclusion_list = $exclusion_list; + return $clone; + } + private function stripNullBytes(string $ret): string { return str_replace("\0", '', $ret); @@ -52,7 +65,7 @@ protected function getExceptionOutput(): string */ protected function tablesContent(): string { - $ret = ""; + $ret = ''; foreach ($this->tables() as $title => $content) { $ret .= "\n\n-- $title --\n\n"; if (count($content) > 0) { @@ -62,7 +75,7 @@ protected function tablesContent(): string // indent multiline values, first print_r, split in lines, // indent all but first line, then implode again. $first = true; - $indentation = str_pad("", self::KEY_SPACE); + $indentation = str_pad('', self::KEY_SPACE); $value = implode( "\n", array_map( @@ -92,14 +105,62 @@ static function ($line) use (&$first, $indentation): string { */ protected function tables(): array { + $post = $_POST; + $server = $_SERVER; + + $post = $this->hideSensitiveData($post); + $server = $this->hideSensitiveData($server); + $server = $this->shortenPHPSessionId($server); + return [ - "GET Data" => $_GET, - "POST Data" => $_POST, - "Files" => $_FILES, - "Cookies" => $_COOKIE, - "Session" => $_SESSION ?? [], - "Server/Request Data" => $_SERVER, - "Environment Variables" => $_ENV, + 'GET Data' => $_GET, + 'POST Data' => $post, + 'Files' => $_FILES, + 'Cookies' => $_COOKIE, + 'Session' => $_SESSION ?? [], + 'Server/Request Data' => $server, + 'Environment Variables' => $_ENV, ]; } + + /** + * @param array $super_global + * @return array + */ + private function hideSensitiveData(array $super_global): array + { + foreach ($this->exclusion_list as $parameter) { + if (isset($super_global[$parameter])) { + $super_global[$parameter] = 'REMOVED FOR SECURITY'; + } + + if (isset($super_global['post_vars'][$parameter])) { + $super_global['post_vars'][$parameter] = 'REMOVED FOR SECURITY'; + } + } + + return $super_global; + } + + /** + * @param array $server + * @return array + */ + private function shortenPHPSessionId(array $server): array + { + $cookie_content = $server['HTTP_COOKIE']; + $cookie_content = explode(';', $cookie_content); + + foreach ($cookie_content as $key => $content) { + $content_array = explode('=', $content); + if (trim($content_array[0]) === session_name()) { + $content_array[1] = substr($content_array[1], 0, 5) . ' (SHORTENED FOR SECURITY)'; + $cookie_content[$key] = implode('=', $content_array); + } + } + + $server['HTTP_COOKIE'] = implode(';', $cookie_content); + + return $server; + } } diff --git a/Services/Init/classes/class.ilErrorHandling.php b/Services/Init/classes/class.ilErrorHandling.php index 070e6e760e70..9abdce2b706a 100755 --- a/Services/Init/classes/class.ilErrorHandling.php +++ b/Services/Init/classes/class.ilErrorHandling.php @@ -37,6 +37,17 @@ */ class ilErrorHandling extends PEAR { + private const SENSTIVE_PARAMETER_NAMES = [ + 'password', + 'passwd', + 'passwd_retype', + 'current_password', + 'usr_password', + 'usr_password_retype', + 'new_password', + 'new_password_retype', + ]; + protected ?RunInterface $whoops; protected string $message; @@ -287,6 +298,7 @@ protected function defaultHandler(): HandlerInterface $logger = ilLoggingErrorSettings::getInstance(); if (!empty($logger->folder())) { $lwriter = new ilLoggingErrorFileStorage($inspector, $logger->folder(), $file_name); + $lwriter = $lwriter->withExclusionList(self::SENSTIVE_PARAMETER_NAMES); $lwriter->write(); } @@ -330,10 +342,10 @@ protected function devmodeHandler(): HandlerInterface switch (ERROR_HANDLER) { case "TESTING": - return new ilTestingHandler(); + return (new ilTestingHandler())->withExclusionList(self::SENSTIVE_PARAMETER_NAMES); case "PLAIN_TEXT": - return new ilPlainTextHandler(); + return (new ilPlainTextHandler())->withExclusionList(self::SENSTIVE_PARAMETER_NAMES); case "PRETTY_PAGE": // fallthrough @@ -349,6 +361,10 @@ protected function devmodeHandler(): HandlerInterface $this->addEditorSupport($prettyPageHandler); + foreach (self::SENSTIVE_PARAMETER_NAMES as $param) { + $prettyPageHandler->blacklist('_POST', $param); + } + return $prettyPageHandler; } } diff --git a/Services/Logging/classes/error/class.ilLoggingErrorFileStorage.php b/Services/Logging/classes/error/class.ilLoggingErrorFileStorage.php index 3f0294b0b496..7effaa9447c3 100644 --- a/Services/Logging/classes/error/class.ilLoggingErrorFileStorage.php +++ b/Services/Logging/classes/error/class.ilLoggingErrorFileStorage.php @@ -32,7 +32,8 @@ class ilLoggingErrorFileStorage protected Inspector $inspector; protected string $file_path; protected string $file_name; - + /** @var list */ + private array $exclusion_list = []; public function __construct(Inspector $inspector, string $file_path, string $file_name) { @@ -41,6 +42,16 @@ public function __construct(Inspector $inspector, string $file_path, string $fil $this->file_name = $file_name; } + /** + * @param list $exclusion_list + */ + public function withExclusionList(array $exclusion_list): self + { + $clone = clone $this; + $clone->exclusion_list = $exclusion_list; + return $clone; + } + protected function createDir(string $path): void { if (!is_dir($this->file_path)) { @@ -121,7 +132,8 @@ protected function tables(): array $post = $_POST; $server = $_SERVER; - $post = $this->hidePassword($post); + $post = $this->hideSensitiveData($post); + $server = $this->hideSensitiveData($server); $server = $this->shortenPHPSessionId($server); return array( "GET Data" => $_GET @@ -135,16 +147,22 @@ protected function tables(): array } /** - * Replace passwort from post array with security message + * @param array $super_global + * @return array */ - private function hidePassword(array $post): array + private function hideSensitiveData(array $super_global): array { - ilSystemStyleLessVariable::class; - if (isset($post["password"])) { - $post["password"] = "REMOVED FOR SECURITY"; + foreach ($this->exclusion_list as $parameter) { + if (isset($super_global[$parameter])) { + $super_global[$parameter] = 'REMOVED FOR SECURITY'; + } + + if (isset($super_global['post_vars'][$parameter])) { + $super_global['post_vars'][$parameter] = 'REMOVED FOR SECURITY'; + } } - return $post; + return $super_global; } /** From da34663b80e4c0eb3e07862599f25a8c35b38cc7 Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Thu, 15 Feb 2024 15:35:43 +0100 Subject: [PATCH 487/497] [FIX] support for spaces in filenames --- Services/WebAccessChecker/classes/class.ilWACPath.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Services/WebAccessChecker/classes/class.ilWACPath.php b/Services/WebAccessChecker/classes/class.ilWACPath.php index 751bf69097fc..8b4e16d6d56a 100644 --- a/Services/WebAccessChecker/classes/class.ilWACPath.php +++ b/Services/WebAccessChecker/classes/class.ilWACPath.php @@ -235,6 +235,8 @@ public static function setVideoSuffixes(array $video_suffixes): void protected function normalizePath(string $path): string { $path = ltrim($path, '.'); + $path = urldecode($path); + // cut everything before "data/" (for installations using a subdirectory) $path = strstr($path, '/' . self::DIR_DATA . '/'); From e48a654276048578ac0d3227c15d8fbee8d465d1 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 16 Feb 2024 12:25:11 +0100 Subject: [PATCH 488/497] AdvMD: fix preloading of sets that need activation (40308) --- .../AdvancedMetaData/classes/class.ilAdvancedMDValues.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php b/Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php index 47124e111725..18e90297ab0b 100644 --- a/Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php +++ b/Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php @@ -261,7 +261,12 @@ public static function preloadedRead(string $a_type, int $a_obj_id): array // record is optional, check activation for object if ($item[1]) { $found = false; - foreach (ilAdvancedMDRecord::_getSelectedRecordsByObject($a_type, $a_obj_id) as $record) { + foreach (ilAdvancedMDRecord::_getSelectedRecordsByObject( + $a_type, + $a_obj_id, + '', + false + ) as $record) { if ($record->getRecordId() == $item[0]) { $found = true; } From fed9eb83085e0692b71f81c88abe7a48e6d42789 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 16 Feb 2024 14:30:10 +0100 Subject: [PATCH 489/497] AdvMD: min and max values for integer fields can now be empty (37925, 39360) --- .../Integer/class.ilADTIntegerDefinition.php | 7 +++---- .../class.ilAdvancedMDFieldDefinitionInteger.php | 16 ++++++++-------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Services/ADT/classes/Types/Integer/class.ilADTIntegerDefinition.php b/Services/ADT/classes/Types/Integer/class.ilADTIntegerDefinition.php index c7c70c4afb54..49fa1b2d161d 100644 --- a/Services/ADT/classes/Types/Integer/class.ilADTIntegerDefinition.php +++ b/Services/ADT/classes/Types/Integer/class.ilADTIntegerDefinition.php @@ -1,7 +1,5 @@ min_value; } - public function setMin(int $a_value): void + public function setMin(?int $a_value): void { $this->min_value = $this->handleNumber($a_value); } @@ -54,7 +53,7 @@ public function getMax(): ?int return $this->max_value; } - public function setMax(int $a_value): void + public function setMax(?int $a_value): void { $this->max_value = $this->handleNumber($a_value); } diff --git a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionInteger.php b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionInteger.php index b8ca54c7b78c..416b5ab971ca 100644 --- a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionInteger.php +++ b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionInteger.php @@ -1,7 +1,5 @@ @@ -66,8 +66,8 @@ public function setSuffixTranslations(array $suffix_translations): void protected function initADTDefinition(): ilADTDefinition { $def = ilADTFactory::getInstance()->getDefinitionInstanceByType('Integer'); - $def->setMin((int) $this->getMin()); - $def->setMax((int) $this->getMax()); + $def->setMin($this->getMin()); + $def->setMax($this->getMax()); $def->setSuffix((string) ($this->getSuffixTranslations()[$this->language] ?? $this->getSuffix())); return $def; } @@ -113,8 +113,8 @@ public function getSuffix(): ?string protected function importFieldDefinition(array $a_def): void { - $this->setMin($a_def["min"]); - $this->setMax($a_def["max"]); + $this->setMin(isset($a_def["min"]) ? (int) $a_def["min"] : null); + $this->setMax(isset($a_def["max"]) ? (int) $a_def["max"] : null); $this->setSuffix($a_def["suffix"]); $this->setSuffixTranslations($a_def['suffix_translations'] ?? []); } @@ -188,10 +188,10 @@ protected function addCustomFieldToDefinitionForm( public function importCustomDefinitionFormPostValues(ilPropertyFormGUI $a_form, string $language = ''): void { $min = $a_form->getInput("min"); - $this->setMin(($min !== "") ? (int) $min : null); + $this->setMin(($min !== "" && !is_null($min)) ? (int) $min : null); $max = $a_form->getInput("max"); - $this->setMax(($max !== "") ? (int) $max : null); + $this->setMax(($max !== "" && !is_null($max)) ? (int) $max : null); if ($this->useDefaultLanguageMode($language)) { $suffix = $a_form->getInput("suffix"); From 5aaa129d044c127d06a95bbc748c3c648336a074 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Fri, 16 Feb 2024 16:47:00 +0100 Subject: [PATCH 490/497] 39939: Failed test: Blog aus der Portfoliovorschau heraus editieren --- Modules/Blog/classes/class.ilObjBlogGUI.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Modules/Blog/classes/class.ilObjBlogGUI.php b/Modules/Blog/classes/class.ilObjBlogGUI.php index d131cac4b8c3..5c298e3ace3d 100644 --- a/Modules/Blog/classes/class.ilObjBlogGUI.php +++ b/Modules/Blog/classes/class.ilObjBlogGUI.php @@ -22,7 +22,7 @@ /** * Class ilObjBlogGUI * @author Jörg Lützenkirchen - * @ilCtrl_Calls ilObjBlogGUI: ilBlogPostingGUI, ilWorkspaceAccessGUI, ilPortfolioPageGUI + * @ilCtrl_Calls ilObjBlogGUI: ilBlogPostingGUI, ilWorkspaceAccessGUI * @ilCtrl_Calls ilObjBlogGUI: ilInfoScreenGUI, ilNoteGUI, ilCommonActionDispatcherGUI * @ilCtrl_Calls ilObjBlogGUI: ilPermissionGUI, ilObjectCopyGUI, ilRepositorySearchGUI * @ilCtrl_Calls ilObjBlogGUI: ilExportGUI, ilObjectContentStyleSettingsGUI, ilBlogExerciseGUI, ilObjNotificationSettingsGUI @@ -585,7 +585,6 @@ public function executeCommand(): void $link = $ilCtrl->getLinkTargetByClass(["ilrepositorygui", "ilObjBlogGUI"], "preview"); $ilNavigationHistory->addItem($this->node_id, $link, "blog"); } - switch ($next_class) { case 'ilblogpostinggui': $this->ctrl->saveParameter($this, "user_page"); @@ -811,7 +810,7 @@ public function executeCommand(): void } else { $settings_gui = $this->content_style_gui ->objectSettingsGUIForObjId( - 0, + null, $this->object->getId() ); } From 9d91aa4a4659ccf1ca9b464c35c1718150d3c0de Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sat, 17 Feb 2024 19:33:46 +0100 Subject: [PATCH 491/497] =?UTF-8?q?38782:=20Failed=20test:=20Fragen=20aus?= =?UTF-8?q?=20Pool=20einf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editing/class.ilSurveyEditorGUI.php | 5 ++ .../Survey/Sequence/SequenceDBRepository.php | 64 ++++++++++++++++ Modules/Survey/Sequence/SequenceManager.php | 73 +++++++++++++++++++ .../Service/class.InternalDomainService.php | 17 +++++ .../Service/class.InternalRepoService.php | 8 ++ Modules/Survey/classes/class.ilObjSurvey.php | 14 +++- 6 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 Modules/Survey/Sequence/SequenceDBRepository.php create mode 100644 Modules/Survey/Sequence/SequenceManager.php diff --git a/Modules/Survey/Editing/class.ilSurveyEditorGUI.php b/Modules/Survey/Editing/class.ilSurveyEditorGUI.php index 55b6f893b6d4..77b98f8c7838 100644 --- a/Modules/Survey/Editing/class.ilSurveyEditorGUI.php +++ b/Modules/Survey/Editing/class.ilSurveyEditorGUI.php @@ -29,6 +29,7 @@ */ class ilSurveyEditorGUI { + protected \ILIAS\Survey\Sequence\SequenceManager $sequence_manager; protected \ILIAS\Survey\PrintView\GUIService $print; protected \ILIAS\HTTP\Services $http; protected \ILIAS\DI\UIServices $ui; @@ -93,6 +94,10 @@ public function __construct(ilObjSurveyGUI $a_parent_gui) ->internal() ->gui() ->print(); + $this->sequence_manager = $DIC->survey()->internal()->domain()->sequence( + $this->object->getSurveyId(), + $this->object + ); } public function setRequestedPgov(string $pgov): void diff --git a/Modules/Survey/Sequence/SequenceDBRepository.php b/Modules/Survey/Sequence/SequenceDBRepository.php new file mode 100644 index 000000000000..15a92ee8bf1c --- /dev/null +++ b/Modules/Survey/Sequence/SequenceDBRepository.php @@ -0,0 +1,64 @@ +db = $db; + $this->data = $data; + } + + protected function count(int $survey_id): int + { + $set = $this->db->queryF( + "SELECT count(*) cnt FROM svy_svy_qst " . + " WHERE survey_fi = %s ", + ["integer"], + [$survey_id] + ); + if ($rec = $this->db->fetchAssoc($set)) { + return (int) $rec["cnt"]; + } + return 0; + } + + public function insert(int $survey_id, int $svy_question_id): int + { + $order_nr = $this->count($survey_id); + $next_id = $this->db->nextId('svy_svy_qst'); + $this->db->manipulateF( + "INSERT INTO svy_svy_qst (survey_question_id, survey_fi," . + "question_fi, sequence, tstamp) VALUES (%s, %s, %s, %s, %s)", + array('integer', 'integer', 'integer', 'integer', 'integer'), + array($next_id, $survey_id, $svy_question_id, $order_nr, time()) + ); + return $next_id; + } +} diff --git a/Modules/Survey/Sequence/SequenceManager.php b/Modules/Survey/Sequence/SequenceManager.php new file mode 100644 index 000000000000..d85180c8b1ef --- /dev/null +++ b/Modules/Survey/Sequence/SequenceManager.php @@ -0,0 +1,73 @@ +question_repo = $repo->sequence(); + $this->domain = $domain; + $this->survey_id = $survey_id; // not object id + $this->log = $domain->log(); + $this->survey = $survey; + } + + public function appendQuestion( + int $survey_question_id, + bool $duplicate = true, + bool $force_duplicate = false + ): int { + $this->log->debug("append question, id: " . $survey_question_id . ", duplicate: " . $duplicate . ", force: " . $force_duplicate); + + // create duplicate if pool question (or forced for question blocks copy) + if ($duplicate) { + // this does nothing if this is not a pool question and $a_force_duplicate is false + $survey_question_id = $this->survey->duplicateQuestionForSurvey($survey_question_id, $force_duplicate); + } + + // check if question is not already in the survey, see #22018 + if ($this->survey->isQuestionInSurvey($survey_question_id)) { + return $survey_question_id; + } + + // append to survey + $next_id = $this->question_repo->insert($this->survey_id, $survey_question_id); + + $this->log->debug("insert svy_svy_qst, id: " . $next_id . ", qfi: " . $survey_question_id); + + return $survey_question_id; + } + +} diff --git a/Modules/Survey/Service/class.InternalDomainService.php b/Modules/Survey/Service/class.InternalDomainService.php index 19b5fd40174b..58bbc871d377 100644 --- a/Modules/Survey/Service/class.InternalDomainService.php +++ b/Modules/Survey/Service/class.InternalDomainService.php @@ -25,6 +25,7 @@ use ILIAS\Survey\Code\CodeManager; use ILIAS\Repository\GlobalDICDomainServices; use ILIAS\Survey\Editing\EditManager; +use ILIAS\Survey\Sequence\SequenceManager; /** * Survey internal domain service @@ -56,6 +57,11 @@ public function __construct( $this->mode_factory = $mode_factory; } + public function log(): \ilLogger + { + return $this->logger()->svy(); + } + public function modeFeatureConfig(int $mode): FeatureConfig { $mode_provider = $this->mode_factory->getModeById($mode); @@ -122,4 +128,15 @@ public function edit(): EditManager $this ); } + + public function sequence(int $survey_id, \ilObjSurvey $survey): SequenceManager + { + return new SequenceManager( + $this->repo_service, + $this, + $survey_id, + $survey + ); + } + } diff --git a/Modules/Survey/Service/class.InternalRepoService.php b/Modules/Survey/Service/class.InternalRepoService.php index 13c88d414ca3..709c648b4058 100644 --- a/Modules/Survey/Service/class.InternalRepoService.php +++ b/Modules/Survey/Service/class.InternalRepoService.php @@ -80,4 +80,12 @@ public function evaluation(): Evaluation\EvaluationSessionRepo { return new Evaluation\EvaluationSessionRepo(); } + + public function sequence(): Sequence\SequenceDBRepository + { + return new Sequence\SequenceDBRepository( + $this->data, + $this->db + ); + } } diff --git a/Modules/Survey/classes/class.ilObjSurvey.php b/Modules/Survey/classes/class.ilObjSurvey.php index 1427fdd5ee8b..e78b548b105a 100755 --- a/Modules/Survey/classes/class.ilObjSurvey.php +++ b/Modules/Survey/classes/class.ilObjSurvey.php @@ -598,6 +598,13 @@ public function isQuestionInSurvey( public function insertQuestionblock( int $questionblock_id ): void { + + $sequence_manager = $this->survey_service->domain()->sequence( + $this->getSurveyId(), + $this + ); + + $ilDB = $this->db; $result = $ilDB->queryF( "SELECT svy_qblk.title, svy_qblk.show_questiontext, svy_qblk.show_blocktitle," . @@ -613,10 +620,15 @@ public function insertQuestionblock( $show_questiontext = false; $show_blocktitle = false; $title = ""; + $this->svy_log->debug("insert block, original id: " . $questionblock_id); while ($row = $ilDB->fetchAssoc($result)) { - $duplicate_id = $this->duplicateQuestionForSurvey($row["question_fi"]); + $this->svy_log->debug("question: " . $row["question_fi"]); + $duplicate_id = $sequence_manager->appendQuestion($row["question_fi"], true); + //$duplicate_id = $this->duplicateQuestionForSurvey($row["question_fi"]); + $this->svy_log->debug("question copy: " . $duplicate_id); $questions[] = $duplicate_id; $title = (string) $row["title"]; + $this->svy_log->debug("title: " . $title); $show_questiontext = (bool) $row["show_questiontext"]; $show_blocktitle = (bool) $row["show_blocktitle"]; } From 8ca0828166450c3b8330611196b5cc7dba4486cb Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sat, 17 Feb 2024 19:40:03 +0100 Subject: [PATCH 492/497] =?UTF-8?q?38782:=20Failed=20test:=20Fragen=20aus?= =?UTF-8?q?=20Pool=20einf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Survey/Editing/class.ilSurveyQuestionTableGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Survey/Editing/class.ilSurveyQuestionTableGUI.php b/Modules/Survey/Editing/class.ilSurveyQuestionTableGUI.php index 327f38f74cf3..a79e6971f5a3 100644 --- a/Modules/Survey/Editing/class.ilSurveyQuestionTableGUI.php +++ b/Modules/Survey/Editing/class.ilSurveyQuestionTableGUI.php @@ -163,7 +163,7 @@ protected function importData(): void $table_data[$id]["pool"] = $questionpools[$original_fi]; } else { // #11186 - $table_data[$id]["pool"] = $this->lng->txt("status_no_permission"); + $table_data[$id]["pool"] = "-"; } } From 6c963dd6fe55bf6cb1597ad744f6fba22261dce5 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 18 Feb 2024 15:13:09 +0100 Subject: [PATCH 493/497] =?UTF-8?q?40160:=20Failed=20test:=20Grundkonfigur?= =?UTF-8?q?ation:=20Anzahl=20Eintr=C3=A4ge=20im=20Baum=20begrenzen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/class.ilExplorerBaseGUI.php | 22 ++++++++++------- .../classes/class.ilTreeExplorerGUI.php | 4 ++-- .../UIComponent/Explorer2/js/Explorer2.js | 24 +++++++++++++++---- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/Services/UIComponent/Explorer2/classes/class.ilExplorerBaseGUI.php b/Services/UIComponent/Explorer2/classes/class.ilExplorerBaseGUI.php index 421e803df819..fb290670e1f7 100644 --- a/Services/UIComponent/Explorer2/classes/class.ilExplorerBaseGUI.php +++ b/Services/UIComponent/Explorer2/classes/class.ilExplorerBaseGUI.php @@ -484,9 +484,9 @@ public function getNodeAsync(): string if (!in_array($root, $this->open_nodes)) { $this->open_nodes[] = $root; } + $this->setSearchTerm(ilUtil::stripSlashes($this->requested_searchterm)); if ($this->requested_node_id !== "") { $id = $this->getNodeIdForDomNodeId($this->requested_node_id); - $this->setSearchTerm(ilUtil::stripSlashes($this->requested_searchterm)); $this->renderChilds($id, $etpl); } else { $this->getNodeId($this->getRootNode()); @@ -599,6 +599,7 @@ public static function init(ilGlobalTemplateInterface $a_main_tpl = null): void $tpl = $a_main_tpl ?? $DIC["tpl"]; + ilYuiUtil::initConnection(); iljQueryUtil::initjQuery($tpl); $tpl->addJavaScript(self::getLocalExplorerJsPath()); @@ -758,7 +759,7 @@ final public function renderChilds($a_node_id, ilTemplate $tpl): void $childs = $this->getChildsOfNode($a_node_id); $childs = $this->sortChilds($childs, $a_node_id); - if (count($childs) > 0 || ($this->getSearchTerm() !== "" && $this->requested_node_id === $this->getDomNodeIdForNodeId($a_node_id))) { + if (count($childs) > 0 || ($this->getSearchTerm() !== "" && $this->isNodeRequested($a_node_id))) { // collect visible childs $visible_childs = []; @@ -777,14 +778,13 @@ final public function renderChilds($a_node_id, ilTemplate $tpl): void // search field, if too many childs $any = false; - if (($this->getChildLimit() > 0 && $this->getChildLimit() < $cnt_child) || $this->getSearchTerm() !== "") { - if (!$any) { - $this->listStart($tpl); - $any = true; - } + if (($this->getChildLimit() > 0 && $this->getChildLimit() < $cnt_child) || ($this->getSearchTerm() !== "" && $this->isNodeRequested($a_node_id))) { + $this->listStart($tpl); + $any = true; + $tpl->setCurrentBlock("list_search"); $tpl->setVariable("SEARCH_CONTAINER_ID", $a_node_id); - if ($this->requested_node_id === $this->getDomNodeIdForNodeId($a_node_id)) { + if ($this->isNodeRequested($a_node_id)) { $tpl->setVariable("SEARCH_VAL", $this->getSearchTerm()); } $tpl->parseCurrentBlock(); @@ -810,6 +810,12 @@ final public function renderChilds($a_node_id, ilTemplate $tpl): void } } + protected function isNodeRequested(string $a_node_id): bool + { + return ($this->requested_node_id === $this->getDomNodeIdForNodeId($a_node_id) || + ($this->requested_node_id === "" && $a_node_id == $this->getNodeId($this->getRootNode()))); + } + /** * Get DOM node id for node id * @param string $a_node_id diff --git a/Services/UIComponent/Explorer2/classes/class.ilTreeExplorerGUI.php b/Services/UIComponent/Explorer2/classes/class.ilTreeExplorerGUI.php index 9f8aef512b35..2471ff0af1d9 100644 --- a/Services/UIComponent/Explorer2/classes/class.ilTreeExplorerGUI.php +++ b/Services/UIComponent/Explorer2/classes/class.ilTreeExplorerGUI.php @@ -224,7 +224,7 @@ public function getChildsOfNode($a_parent_node_id): array if (is_array($bl) && count($bl) > 0) { $bl_childs = array(); foreach ($childs as $k => $c) { - if (!in_array($c["type"], $bl, true) && ($this->matches($c) || $this->requested_node_id !== $this->getDomNodeIdForNodeId($a_parent_node_id))) { + if (!in_array($c["type"], $bl, true) && ($this->matches($c) || !$this->isNodeRequested($a_parent_node_id))) { $bl_childs[$k] = $c; } } @@ -233,7 +233,7 @@ public function getChildsOfNode($a_parent_node_id): array $final_childs = []; foreach ($childs as $k => $c) { - if ($this->matches($c) || $this->requested_node_id !== $this->getDomNodeIdForNodeId($a_parent_node_id)) { + if ($this->matches($c) || !$this->isNodeRequested($a_parent_node_id)) { $final_childs[$k] = $c; } } diff --git a/Services/UIComponent/Explorer2/js/Explorer2.js b/Services/UIComponent/Explorer2/js/Explorer2.js index f6e765a31b5f..f5dfa37ea0d2 100644 --- a/Services/UIComponent/Explorer2/js/Explorer2.js +++ b/Services/UIComponent/Explorer2/js/Explorer2.js @@ -17,7 +17,7 @@ il.Explorer2 = { - current_search_term: '', + current_search_term: [], selects: {}, @@ -29,18 +29,23 @@ il.Explorer2 = { js_tree_config.core.data = {url: config.url + "&exp_cmd=getNodeAsync", data: function(n) { var id = n.id; + console.log("data called"); if (n.id === "#") { id = ""; } if (id == "") { + console.log(n); + console.log(il.Explorer2.current_search_term[0]); return { exp_cont: config.container_id, - searchterm: il.Explorer2.current_search_term + searchterm: il.Explorer2.current_search_term[0] }; } else { + console.log(n); + console.log(il.Explorer2.current_search_term[id]); let d = { exp_cont: config.container_id, - searchterm: il.Explorer2.current_search_term + searchterm: il.Explorer2.current_search_term[id] }; d[node_name] = id; return d; @@ -62,6 +67,10 @@ il.Explorer2 = { il.Explorer2.setEvents("#" + config.container_id, config.container_id); + }).on('refresh.jstree', function (e, data) { + + il.Explorer2.setEvents("#" + config.container_id, config.container_id); + }).on('after_open.jstree', function (e, data) { var cid = data.node.id, p; if (cid !== "#") { @@ -92,8 +101,13 @@ il.Explorer2 = { e.stopPropagation(); e.preventDefault(); var pid = $(e.target).parents("li").parents("li").attr("id"); - il.Explorer2.current_search_term = $(e.target).val(); - $("#" + cid).jstree('refresh_node', pid); + if (pid) { + il.Explorer2.current_search_term[pid] = $(e.target).val(); + $("#" + cid).jstree('refresh_node', pid); + } else { + il.Explorer2.current_search_term[0] = $(e.target).val(); + $("#" + cid).jstree('refresh'); + } } }); From 588bbda3e4385b19b413a8be8006dcb8cdfdc12c Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 18 Feb 2024 20:01:58 +0100 Subject: [PATCH 494/497] 40508: Failed test: Change the content of notes --- Services/Notes/GlobalScreen/classes/NotesMainBarProvider.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Services/Notes/GlobalScreen/classes/NotesMainBarProvider.php b/Services/Notes/GlobalScreen/classes/NotesMainBarProvider.php index 212ea3f863ea..0901e9ee67bb 100644 --- a/Services/Notes/GlobalScreen/classes/NotesMainBarProvider.php +++ b/Services/Notes/GlobalScreen/classes/NotesMainBarProvider.php @@ -41,6 +41,7 @@ public function getStaticSubItems(): array // Comments $title = $dic->language()->txt("mm_comments"); $icon = $this->dic->ui()->factory()->symbol()->icon()->standard(Standard::COMS, $title); + $ctrl->setParameterByClass(\ilPDNotesGUI::class, "note_type", 2); $comments = $this->mainmenu->link($this->if->identifier('mm_pd_comments')) ->withTitle($title) ->withAction($ctrl->getLinkTargetByClass(["ilDashboardGUI", "ilPDNotesGUI"], "showPublicComments")) @@ -58,6 +59,7 @@ static function () use ($dic): bool { $icon = $this->dic->ui()->factory()->symbol()->icon()->standard(Standard::NOTS, $title); // Notes + $ctrl->setParameterByClass(\ilPDNotesGUI::class, "note_type", 1); $notes = $this->mainmenu->link($this->if->identifier('mm_pd_notes')) ->withTitle($title) ->withAction($ctrl->getLinkTargetByClass(["ilDashboardGUI", "ilPDNotesGUI"], "showPrivateNotes")) From 0b8650d7651e757695628770b194a0ad5e4888bb Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 18 Feb 2024 21:07:58 +0100 Subject: [PATCH 495/497] 40478: After upgrade from 7.27 to 8.8, Learning Module ILIAS not accessible --- .../Presentation/class.ilLMNavigationRendererGUI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/LearningModule/Presentation/class.ilLMNavigationRendererGUI.php b/Modules/LearningModule/Presentation/class.ilLMNavigationRendererGUI.php index 653ac6fc843a..b1af44f4f176 100644 --- a/Modules/LearningModule/Presentation/class.ilLMNavigationRendererGUI.php +++ b/Modules/LearningModule/Presentation/class.ilLMNavigationRendererGUI.php @@ -121,7 +121,7 @@ protected function render(bool $top = true): string $pre_id, $this->lm->getPageHeader(), $this->lm->isActiveNumbering(), - $this->lm_set->get("time_scheduled_page_activation"), + (bool) $this->lm_set->get("time_scheduled_page_activation"), false, 0, $this->lang, @@ -169,7 +169,7 @@ protected function render(bool $top = true): string $succ_id, $this->lm->getPageHeader(), $this->lm->isActiveNumbering(), - $this->lm_set->get("time_scheduled_page_activation"), + (bool) $this->lm_set->get("time_scheduled_page_activation"), false, 0, $this->lang, From 34a00b8944fdf3dbd2fe0dfb4f61b7e69dccdc53 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 19 Feb 2024 09:58:57 +0100 Subject: [PATCH 496/497] User: Fix Access to Missing Factory See: https://mantis.ilias.de/view.php?id=40567 --- Services/AccessControl/classes/class.ilObjRoleGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/AccessControl/classes/class.ilObjRoleGUI.php b/Services/AccessControl/classes/class.ilObjRoleGUI.php index 4a6245553acd..1e1edfdb862b 100755 --- a/Services/AccessControl/classes/class.ilObjRoleGUI.php +++ b/Services/AccessControl/classes/class.ilObjRoleGUI.php @@ -877,7 +877,7 @@ public function deassignUserObject(): void $this->object->getId(), $assigned_global_roles )) { - $userObj = $this->ilias->obj_factory->getInstanceByObjId($user); + $userObj = new ilObjUser($user); $last_role[$user] = $userObj->getFullName(); unset($userObj); } From a8d90b06995537ef6ec7e0b30a2de9e1933668bf Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 19 Feb 2024 11:40:04 +0100 Subject: [PATCH 497/497] Badge: Fix WAC handling for sub paths See: https://mantis.ilias.de/view.php?id=40528 (cherry picked from commit e8d19613c182fbac27ed6c781a0a30f5d3f2e77f) --- Services/Badge/classes/class.ilBadgeWAC.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Badge/classes/class.ilBadgeWAC.php b/Services/Badge/classes/class.ilBadgeWAC.php index 048910bb6411..4ca2dc7851aa 100644 --- a/Services/Badge/classes/class.ilBadgeWAC.php +++ b/Services/Badge/classes/class.ilBadgeWAC.php @@ -29,7 +29,7 @@ public function canBeDelivered(ilWACPath $ilWACPath): bool return false; } - if (!preg_match('@ilBadge\/badge(tmpl)?_(\d+)\/@ui', $ilWACPath->getPath())) { + if (!preg_match('@ilBadge\/(\d+\/)*?badge(tmpl)?_(\d+)\/@ui', $ilWACPath->getPath())) { return false; }