From 6c4f3cfede67f67d64bc167e73914b4e84330ff1 Mon Sep 17 00:00:00 2001 From: Arthur de Moulins Date: Thu, 6 Aug 2026 00:28:49 +0200 Subject: [PATCH] PS-1087 feat: replace TagFilterRule with AttributeFilterRule (AQL conditions with multiple user/group targets) --- .../api/config/packages/alchemy_track.yaml | 2 +- .../api/migrations/Version20260805170000.php | 102 + .../AttributeFilterRuleInputTransformer.php | 56 + .../TagFilterRuleInputTransformer.php | 68 - ...Input.php => AttributeFilterRuleInput.php} | 24 +- .../Output/AttributeFilterRuleOutput.php | 72 + .../Api/Model/Output/TagFilterRuleOutput.php | 104 - .../AttributeFilterRuleOutputProcessor.php | 56 + .../TagFilterRuleOutputProcessor.php | 54 - ...AttributeFilterRuleCollectionProvider.php} | 6 +- ... => AttributeFilterRuleCrudController.php} | 29 +- .../Controller/Admin/DashboardController.php | 2 +- .../src/Doctrine/Delete/WorkspaceDelete.php | 4 +- .../api/src/Elasticsearch/AQL/AQLGrammar.peg | 2 +- .../api/src/Elasticsearch/AQL/AQLGrammar.php | 8 +- .../src/Elasticsearch/AQL/AQLToESQuery.php | 6 +- .../Elasticsearch/AQL/LogicOperatorEnum.php | 1 + databox/api/src/Elasticsearch/AssetSearch.php | 79 +- .../api/src/Elasticsearch/AttributeSearch.php | 10 + .../src/Entity/Core/AttributeFilterRule.php | 150 + .../Entity/Core/AttributeFilterRuleTarget.php | 64 + databox/api/src/Entity/Core/TagFilterRule.php | 141 - .../Core/AttributeDefinitionRepository.php | 29 + .../Core/AttributeFilterRuleRepository.php | 63 + .../Core/TagFilterRuleRepository.php | 99 - .../src/Security/AttributeFilterManager.php | 55 + databox/api/src/Security/TagFilterManager.php | 86 - ...Voter.php => AttributeFilterRuleVoter.php} | 10 +- .../Workspace/WorkspaceDuplicateManager.php | 19 +- .../api/src/Validator/ValidAQLConstraint.php | 17 + .../Validator/ValidAQLConstraintValidator.php | 43 + databox/api/tests/DataboxTestTrait.php | 6 +- .../Search/AssetSearchPermissionsTest.php | 163 +- .../client/src/api/attribute-filter-rule.ts | 43 + databox/client/src/api/tag-filter-rule.ts | 46 - .../{TagRulesTab.tsx => FilterRulesTab.tsx} | 6 +- .../Dialog/Workspace/WorkspaceDialog.tsx | 11 +- .../AttributeFilterRules.tsx | 176 + .../AttributeFilterRule/FilterRuleForm.tsx | 244 ++ .../Search/AQL/SearchConditionDialog.tsx | 14 +- .../Media/TagFilterRule/FilterRule.tsx | 249 -- .../Media/TagFilterRule/TagRules.tsx | 206 - databox/client/src/types.ts | 12 +- databox/client/translations/de.json | 3097 +++++++------ databox/client/translations/en.json | 37 +- databox/client/translations/es.json | 139 +- databox/client/translations/fr.json | 3823 ++++++++--------- databox/client/translations/it.json | 139 +- 48 files changed, 5061 insertions(+), 4811 deletions(-) create mode 100644 databox/api/migrations/Version20260805170000.php create mode 100644 databox/api/src/Api/InputTransformer/AttributeFilterRuleInputTransformer.php delete mode 100644 databox/api/src/Api/InputTransformer/TagFilterRuleInputTransformer.php rename databox/api/src/Api/Model/Input/{TagFilterRuleInput.php => AttributeFilterRuleInput.php} (58%) create mode 100644 databox/api/src/Api/Model/Output/AttributeFilterRuleOutput.php delete mode 100644 databox/api/src/Api/Model/Output/TagFilterRuleOutput.php create mode 100644 databox/api/src/Api/OutputTransformer/AttributeFilterRuleOutputProcessor.php delete mode 100644 databox/api/src/Api/OutputTransformer/TagFilterRuleOutputProcessor.php rename databox/api/src/Api/Provider/{TagFilterRuleCollectionProvider.php => AttributeFilterRuleCollectionProvider.php} (68%) rename databox/api/src/Controller/Admin/{TagFilterRuleCrudController.php => AttributeFilterRuleCrudController.php} (63%) create mode 100644 databox/api/src/Entity/Core/AttributeFilterRule.php create mode 100644 databox/api/src/Entity/Core/AttributeFilterRuleTarget.php delete mode 100644 databox/api/src/Entity/Core/TagFilterRule.php create mode 100644 databox/api/src/Repository/Core/AttributeFilterRuleRepository.php delete mode 100644 databox/api/src/Repository/Core/TagFilterRuleRepository.php create mode 100644 databox/api/src/Security/AttributeFilterManager.php delete mode 100644 databox/api/src/Security/TagFilterManager.php rename databox/api/src/Security/Voter/{TagFilterRuleVoter.php => AttributeFilterRuleVoter.php} (66%) create mode 100644 databox/api/src/Validator/ValidAQLConstraint.php create mode 100644 databox/api/src/Validator/ValidAQLConstraintValidator.php create mode 100644 databox/client/src/api/attribute-filter-rule.ts delete mode 100644 databox/client/src/api/tag-filter-rule.ts rename databox/client/src/components/Dialog/Workspace/{TagRulesTab.tsx => FilterRulesTab.tsx} (56%) create mode 100644 databox/client/src/components/Media/AttributeFilterRule/AttributeFilterRules.tsx create mode 100644 databox/client/src/components/Media/AttributeFilterRule/FilterRuleForm.tsx delete mode 100644 databox/client/src/components/Media/TagFilterRule/FilterRule.tsx delete mode 100644 databox/client/src/components/Media/TagFilterRule/TagRules.tsx diff --git a/databox/api/config/packages/alchemy_track.yaml b/databox/api/config/packages/alchemy_track.yaml index 3f9644bac8..1cf2e5528d 100644 --- a/databox/api/config/packages/alchemy_track.yaml +++ b/databox/api/config/packages/alchemy_track.yaml @@ -17,4 +17,4 @@ alchemy_track: !php/const App\Entity\Core\RenditionDefinition::OBJECT_INDEX: App\Entity\Core\RenditionDefinition !php/const App\Entity\Core\RenditionPolicy::OBJECT_INDEX: App\Entity\Core\RenditionPolicy !php/const App\Entity\Core\Tag::OBJECT_INDEX: App\Entity\Core\Tag - !php/const App\Entity\Core\TagFilterRule::OBJECT_INDEX: App\Entity\Core\TagFilterRule + !php/const App\Entity\Core\AttributeFilterRule::OBJECT_INDEX: App\Entity\Core\AttributeFilterRule diff --git a/databox/api/migrations/Version20260805170000.php b/databox/api/migrations/Version20260805170000.php new file mode 100644 index 0000000000..f4c4959a51 --- /dev/null +++ b/databox/api/migrations/Version20260805170000.php @@ -0,0 +1,102 @@ +addSql('CREATE TABLE attribute_filter_rule (id UUID NOT NULL, workspace_id UUID NOT NULL, condition TEXT NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updated_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id))'); + $this->addSql('COMMENT ON COLUMN attribute_filter_rule.id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN attribute_filter_rule.workspace_id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN attribute_filter_rule.created_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('COMMENT ON COLUMN attribute_filter_rule.updated_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('CREATE INDEX IDX_133E386582D40A1F ON attribute_filter_rule (workspace_id)'); + $this->addSql('ALTER TABLE attribute_filter_rule ADD CONSTRAINT FK_133E386582D40A1F FOREIGN KEY (workspace_id) REFERENCES workspace (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + + $this->addSql('CREATE TABLE attribute_filter_rule_target (id UUID NOT NULL, rule_id UUID NOT NULL, user_type SMALLINT NOT NULL, user_id VARCHAR(36) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('COMMENT ON COLUMN attribute_filter_rule_target.id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN attribute_filter_rule_target.rule_id IS \'(DC2Type:uuid)\''); + $this->addSql('CREATE INDEX afrt_user_idx ON attribute_filter_rule_target (user_type, user_id)'); + $this->addSql('CREATE UNIQUE INDEX afrt_uniq_target ON attribute_filter_rule_target (rule_id, user_type, user_id)'); + $this->addSql('CREATE INDEX IDX_D246D06B744E0351 ON attribute_filter_rule_target (rule_id)'); + $this->addSql('ALTER TABLE attribute_filter_rule_target ADD CONSTRAINT FK_D246D06B744E0351 FOREIGN KEY (rule_id) REFERENCES attribute_filter_rule (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + + // Convert existing tag filter rules into AQL conditions: + // include tags [a, b] => @tag = "a" AND @tag = "b" (asset must have ALL included tags) + // exclude tags [c, d] => @tag NOT IN ("c", "d") (any excluded tag hides the asset) + // Rules with no tag at all are skipped (they had no effect). + $this->addSql(<<<'SQL' + INSERT INTO attribute_filter_rule (id, workspace_id, condition, created_at, updated_at) + SELECT r.id, r.workspace_id, + CONCAT_WS(' AND ', + (SELECT string_agg('@tag = "' || i.tag_id::text || '"', ' AND ' ORDER BY i.tag_id) FROM tfr_includes i WHERE i.tag_filter_rule_id = r.id), + (SELECT '@tag NOT IN ("' || string_agg(e.tag_id::text, '", "' ORDER BY e.tag_id) || '")' FROM tfr_excludes e WHERE e.tag_filter_rule_id = r.id) + ), + r.created_at, r.updated_at + FROM tag_filter_rule r + WHERE EXISTS (SELECT 1 FROM tfr_includes i WHERE i.tag_filter_rule_id = r.id) + OR EXISTS (SELECT 1 FROM tfr_excludes e WHERE e.tag_filter_rule_id = r.id) + SQL + ); + + // Each legacy rule had a single principal (user or group); a NULL user_id meant + // "everyone", which is now expressed by a rule without any target. + $this->addSql(<<<'SQL' + INSERT INTO attribute_filter_rule_target (id, rule_id, user_type, user_id) + SELECT md5(r.id::text || 'target')::uuid, r.id, r.user_type, r.user_id + FROM tag_filter_rule r + WHERE r.user_id IS NOT NULL + AND EXISTS (SELECT 1 FROM attribute_filter_rule a WHERE a.id = r.id) + SQL + ); + + $this->addSql('DROP TABLE tfr_includes'); + $this->addSql('DROP TABLE tfr_excludes'); + $this->addSql('DROP TABLE tag_filter_rule'); + } + + public function down(Schema $schema): void + { + // Schema-only: converted AQL conditions cannot be turned back into tag lists. + $this->addSql('CREATE TABLE tag_filter_rule (id UUID NOT NULL, user_type SMALLINT NOT NULL, user_id VARCHAR(36) DEFAULT NULL, workspace_id UUID NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updated_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id))'); + $this->addSql('COMMENT ON COLUMN tag_filter_rule.id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN tag_filter_rule.workspace_id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN tag_filter_rule.created_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('COMMENT ON COLUMN tag_filter_rule.updated_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('CREATE INDEX tfr_user_idx ON tag_filter_rule (user_type, user_id)'); + $this->addSql('CREATE INDEX tfr_user_type_idx ON tag_filter_rule (user_type)'); + $this->addSql('CREATE UNIQUE INDEX tfr_uniq_ace ON tag_filter_rule (user_type, user_id, workspace_id)'); + $this->addSql('CREATE INDEX IDX_322BB15582D40A1F ON tag_filter_rule (workspace_id)'); + $this->addSql('ALTER TABLE tag_filter_rule ADD CONSTRAINT FK_322BB15582D40A1F FOREIGN KEY (workspace_id) REFERENCES workspace (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + + $this->addSql('CREATE TABLE tfr_includes (tag_filter_rule_id UUID NOT NULL, tag_id UUID NOT NULL, PRIMARY KEY(tag_filter_rule_id, tag_id))'); + $this->addSql('COMMENT ON COLUMN tfr_includes.tag_filter_rule_id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN tfr_includes.tag_id IS \'(DC2Type:uuid)\''); + $this->addSql('CREATE INDEX IDX_BF991C3B5D544FE0 ON tfr_includes (tag_filter_rule_id)'); + $this->addSql('CREATE INDEX IDX_BF991C3BBAD26311 ON tfr_includes (tag_id)'); + $this->addSql('ALTER TABLE tfr_includes ADD CONSTRAINT FK_BF991C3B5D544FE0 FOREIGN KEY (tag_filter_rule_id) REFERENCES tag_filter_rule (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE tfr_includes ADD CONSTRAINT FK_BF991C3BBAD26311 FOREIGN KEY (tag_id) REFERENCES tag (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + + $this->addSql('CREATE TABLE tfr_excludes (tag_filter_rule_id UUID NOT NULL, tag_id UUID NOT NULL, PRIMARY KEY(tag_filter_rule_id, tag_id))'); + $this->addSql('COMMENT ON COLUMN tfr_excludes.tag_filter_rule_id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN tfr_excludes.tag_id IS \'(DC2Type:uuid)\''); + $this->addSql('CREATE INDEX IDX_EC38A0805D544FE0 ON tfr_excludes (tag_filter_rule_id)'); + $this->addSql('CREATE INDEX IDX_EC38A080BAD26311 ON tfr_excludes (tag_id)'); + $this->addSql('ALTER TABLE tfr_excludes ADD CONSTRAINT FK_EC38A0805D544FE0 FOREIGN KEY (tag_filter_rule_id) REFERENCES tag_filter_rule (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE tfr_excludes ADD CONSTRAINT FK_EC38A080BAD26311 FOREIGN KEY (tag_id) REFERENCES tag (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + + $this->addSql('DROP TABLE attribute_filter_rule_target'); + $this->addSql('DROP TABLE attribute_filter_rule'); + } +} diff --git a/databox/api/src/Api/InputTransformer/AttributeFilterRuleInputTransformer.php b/databox/api/src/Api/InputTransformer/AttributeFilterRuleInputTransformer.php new file mode 100644 index 0000000000..65de15c539 --- /dev/null +++ b/databox/api/src/Api/InputTransformer/AttributeFilterRuleInputTransformer.php @@ -0,0 +1,56 @@ +workspaceId) { + $workspace = DoctrineUtil::findStrict($this->em, Workspace::class, $data->workspaceId); + $this->denyAccessUnlessGranted(AbstractVoter::EDIT, $workspace); + $attributeFilterRule->setWorkspace($workspace); + } elseif ($isNew) { + throw new \InvalidArgumentException('Missing workspaceId'); + } + + if (null !== $data->userIds || null !== $data->groupIds || $isNew) { + $attributeFilterRule->setTargets($data->userIds ?? [], $data->groupIds ?? []); + } + + if (null !== $data->condition) { + $attributeFilterRule->setCondition($data->condition); + } + + return $attributeFilterRule; + } + + public function supports(string $resourceClass, object $data): bool + { + return AttributeFilterRule::class === $resourceClass && $data instanceof AttributeFilterRuleInput; + } +} diff --git a/databox/api/src/Api/InputTransformer/TagFilterRuleInputTransformer.php b/databox/api/src/Api/InputTransformer/TagFilterRuleInputTransformer.php deleted file mode 100644 index 61a330f890..0000000000 --- a/databox/api/src/Api/InputTransformer/TagFilterRuleInputTransformer.php +++ /dev/null @@ -1,68 +0,0 @@ -workspaceId) { - $workspace = DoctrineUtil::findStrict($this->em, Workspace::class, $data->workspaceId); - $this->denyAccessUnlessGranted(AbstractVoter::EDIT, $workspace); - $tagFilterRule->setWorkspace($workspace); - } elseif ($isNew) { - throw new \InvalidArgumentException('Missing workspaceId'); - } - - if ($data->groupId) { - $tagFilterRule->setUserType(TagFilterRule::TYPE_GROUP); - $tagFilterRule->setUserId($data->groupId); - } elseif ($data->userId) { - $tagFilterRule->setUserType(TagFilterRule::TYPE_USER); - $tagFilterRule->setUserId($data->userId); - } - - $collection = $tagFilterRule->getInclude(); - $collection->clear(); - foreach ($data->include ?? [] as $rule) { - $collection->add($rule); - } - - $collection = $tagFilterRule->getExclude(); - $collection->clear(); - foreach ($data->exclude ?? [] as $rule) { - $collection->add($rule); - } - - return $tagFilterRule; - } - - public function supports(string $resourceClass, object $data): bool - { - return TagFilterRule::class === $resourceClass && $data instanceof TagFilterRuleInput; - } -} diff --git a/databox/api/src/Api/Model/Input/TagFilterRuleInput.php b/databox/api/src/Api/Model/Input/AttributeFilterRuleInput.php similarity index 58% rename from databox/api/src/Api/Model/Input/TagFilterRuleInput.php rename to databox/api/src/Api/Model/Input/AttributeFilterRuleInput.php index 653956410e..7e0266a8e1 100644 --- a/databox/api/src/Api/Model/Input/TagFilterRuleInput.php +++ b/databox/api/src/Api/Model/Input/AttributeFilterRuleInput.php @@ -5,29 +5,25 @@ namespace App\Api\Model\Input; use App\Entity\Core\Asset; -use App\Entity\Core\Tag; use Symfony\Component\Serializer\Annotation\Groups; -class TagFilterRuleInput +class AttributeFilterRuleInput { + /** + * @var string[]|null + */ #[Groups([Asset::GROUP_WRITE])] - public ?string $userId = null; + public ?array $userIds = null; + /** + * @var string[]|null + */ #[Groups([Asset::GROUP_WRITE])] - public ?string $groupId = null; + public ?array $groupIds = null; #[Groups([Asset::GROUP_WRITE])] public ?string $workspaceId = null; - /** - * @var Tag[] - */ - #[Groups([Asset::GROUP_WRITE])] - public ?array $include = null; - - /** - * @var Tag[] - */ #[Groups([Asset::GROUP_WRITE])] - public ?array $exclude = null; + public ?string $condition = null; } diff --git a/databox/api/src/Api/Model/Output/AttributeFilterRuleOutput.php b/databox/api/src/Api/Model/Output/AttributeFilterRuleOutput.php new file mode 100644 index 0000000000..8f02c6e1be --- /dev/null +++ b/databox/api/src/Api/Model/Output/AttributeFilterRuleOutput.php @@ -0,0 +1,72 @@ + + */ + #[Groups([AttributeFilterRule::GROUP_READ])] + private array $users = []; + + /** + * @var array + */ + #[Groups([AttributeFilterRule::GROUP_READ])] + private array $groups = []; + + #[Groups([AttributeFilterRule::GROUP_READ])] + private ?string $workspaceId = null; + + #[Groups([AttributeFilterRule::GROUP_READ])] + private ?string $condition = null; + + public function getUsers(): array + { + return $this->users; + } + + public function setUsers(array $users): void + { + $this->users = $users; + } + + public function getGroups(): array + { + return $this->groups; + } + + public function setGroups(array $groups): void + { + $this->groups = $groups; + } + + public function getWorkspaceId(): ?string + { + return $this->workspaceId; + } + + public function setWorkspaceId(?string $workspaceId): void + { + $this->workspaceId = $workspaceId; + } + + public function getCondition(): ?string + { + return $this->condition; + } + + public function setCondition(?string $condition): void + { + $this->condition = $condition; + } +} diff --git a/databox/api/src/Api/Model/Output/TagFilterRuleOutput.php b/databox/api/src/Api/Model/Output/TagFilterRuleOutput.php deleted file mode 100644 index 6ed055b85e..0000000000 --- a/databox/api/src/Api/Model/Output/TagFilterRuleOutput.php +++ /dev/null @@ -1,104 +0,0 @@ -userId; - } - - public function setUserId(?string $userId): void - { - $this->userId = $userId; - } - - public function getGroupId(): ?string - { - return $this->groupId; - } - - public function setGroupId(?string $groupId): void - { - $this->groupId = $groupId; - } - - public function getWorkspaceId(): ?string - { - return $this->workspaceId; - } - - public function setWorkspaceId(?string $workspaceId): void - { - $this->workspaceId = $workspaceId; - } - - public function getInclude(): ?array - { - return $this->include; - } - - public function setInclude(?array $include): void - { - $this->include = $include; - } - - public function getExclude(): ?array - { - return $this->exclude; - } - - public function setExclude(?array $exclude): void - { - $this->exclude = $exclude; - } - - public function getUsername(): ?string - { - return $this->username; - } - - public function setUsername(?string $username): void - { - $this->username = $username; - } - - public function getGroupName(): ?string - { - return $this->groupName; - } - - public function setGroupName(?string $groupName): void - { - $this->groupName = $groupName; - } -} diff --git a/databox/api/src/Api/OutputTransformer/AttributeFilterRuleOutputProcessor.php b/databox/api/src/Api/OutputTransformer/AttributeFilterRuleOutputProcessor.php new file mode 100644 index 0000000000..6182b9327c --- /dev/null +++ b/databox/api/src/Api/OutputTransformer/AttributeFilterRuleOutputProcessor.php @@ -0,0 +1,56 @@ +setId($data->getId()); + $output->setCreatedAt($data->getCreatedAt()); + $output->setWorkspaceId($data->getWorkspaceId()); + $output->setCondition($data->getCondition()); + + $output->setUsers(array_map(function (string $userId): array { + $user = $this->userRepository->getUser($userId); + + return [ + 'id' => $userId, + 'name' => $user ? $user['username'] : 'User not found', + ]; + }, $data->getUserIds())); + + $output->setGroups(array_map(function (string $groupId): array { + $group = $this->groupRepository->getGroup($groupId); + + return [ + 'id' => $groupId, + 'name' => $group ? $group['name'] : 'Group not found', + ]; + }, $data->getGroupIds())); + + return $output; + } +} diff --git a/databox/api/src/Api/OutputTransformer/TagFilterRuleOutputProcessor.php b/databox/api/src/Api/OutputTransformer/TagFilterRuleOutputProcessor.php deleted file mode 100644 index 021c5b8cba..0000000000 --- a/databox/api/src/Api/OutputTransformer/TagFilterRuleOutputProcessor.php +++ /dev/null @@ -1,54 +0,0 @@ -setId($data->getId()); - $output->setCreatedAt($data->getCreatedAt()); - if (TagFilterRule::TYPE_USER === $data->getUserType()) { - $output->setUserId($data->getUserId()); - } elseif (TagFilterRule::TYPE_GROUP === $data->getUserType()) { - $output->setGroupId($data->getUserId()); - } - - $output->setWorkspaceId($data->getWorkspaceId()); - $output->setInclude($data->getInclude()->getValues()); - $output->setExclude($data->getExclude()->getValues()); - - if (null !== $output->getUserId()) { - $user = $this->userRepository->getUser($output->getUserId()); - $output->setUsername($user ? $user['username'] : 'User not found'); - } - if (null !== $output->getGroupId()) { - $group = $this->groupRepository->getGroup($output->getGroupId()); - $output->setGroupName($group ? $group['name'] : 'Group not found'); - } - - return $output; - } -} diff --git a/databox/api/src/Api/Provider/TagFilterRuleCollectionProvider.php b/databox/api/src/Api/Provider/AttributeFilterRuleCollectionProvider.php similarity index 68% rename from databox/api/src/Api/Provider/TagFilterRuleCollectionProvider.php rename to databox/api/src/Api/Provider/AttributeFilterRuleCollectionProvider.php index 17e62c2cea..bd847b4c0f 100644 --- a/databox/api/src/Api/Provider/TagFilterRuleCollectionProvider.php +++ b/databox/api/src/Api/Provider/AttributeFilterRuleCollectionProvider.php @@ -5,9 +5,9 @@ namespace App\Api\Provider; use ApiPlatform\Metadata\Operation; -use App\Entity\Core\TagFilterRule; +use App\Entity\Core\AttributeFilterRule; -class TagFilterRuleCollectionProvider extends AbstractCollectionProvider +class AttributeFilterRuleCollectionProvider extends AbstractCollectionProvider { protected function provideCollection( Operation $operation, @@ -20,6 +20,6 @@ protected function provideCollection( $criteria['workspace'] = $filters['workspaceId']; } - return $this->em->getRepository(TagFilterRule::class)->findBy($criteria); + return $this->em->getRepository(AttributeFilterRule::class)->findBy($criteria); } } diff --git a/databox/api/src/Controller/Admin/TagFilterRuleCrudController.php b/databox/api/src/Controller/Admin/AttributeFilterRuleCrudController.php similarity index 63% rename from databox/api/src/Controller/Admin/TagFilterRuleCrudController.php rename to databox/api/src/Controller/Admin/AttributeFilterRuleCrudController.php index 7c6c26f0ca..f116c2d380 100644 --- a/databox/api/src/Controller/Admin/TagFilterRuleCrudController.php +++ b/databox/api/src/Controller/Admin/AttributeFilterRuleCrudController.php @@ -6,24 +6,22 @@ use Alchemy\AdminBundle\Controller\AbstractAdminCrudController; use Alchemy\AdminBundle\Field\IdField; -use App\Entity\Core\TagFilterRule; +use App\Entity\Core\AttributeFilterRule; use EasyCorp\Bundle\EasyAdminBundle\Config\Action; use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; use EasyCorp\Bundle\EasyAdminBundle\Config\Filters; use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField; -use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField; -use EasyCorp\Bundle\EasyAdminBundle\Field\TextField; -use EasyCorp\Bundle\EasyAdminBundle\Filter\ChoiceFilter; +use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField; use EasyCorp\Bundle\EasyAdminBundle\Filter\DateTimeFilter; use EasyCorp\Bundle\EasyAdminBundle\Filter\EntityFilter; -class TagFilterRuleCrudController extends AbstractAdminCrudController +class AttributeFilterRuleCrudController extends AbstractAdminCrudController { public static function getEntityFqcn(): string { - return TagFilterRule::class; + return AttributeFilterRule::class; } #[\Override] @@ -37,9 +35,9 @@ public function configureActions(Actions $actions): Actions public function configureCrud(Crud $crud): Crud { return parent::configureCrud($crud) - ->setEntityLabelInSingular('TagFilterRule') - ->setEntityLabelInPlural('TagFilterRule') - ->setSearchFields(['id', 'userType', 'userId', 'objectType', 'objectId']) + ->setEntityLabelInSingular('AttributeFilterRule') + ->setEntityLabelInPlural('AttributeFilterRule') + ->setSearchFields(['id', 'condition']) ->setPaginatorPageSize(100); } @@ -48,10 +46,6 @@ public function configureFilters(Filters $filters): Filters { return $filters ->add(EntityFilter::new('workspace')) - ->add(ChoiceFilter::new('userType')->setChoices([ - 'user' => TagFilterRule::TYPE_USER, - 'group' => TagFilterRule::TYPE_GROUP, - ])) ->add(DateTimeFilter::new('createdAt')) ; } @@ -63,12 +57,9 @@ public function configureFields(string $pageName): iterable ->hideOnForm(); yield AssociationField::new('workspace') ->autocomplete(); - yield IntegerField::new('userType'); - yield TextField::new('userId'); - yield AssociationField::new('include') - ->autocomplete(); - yield AssociationField::new('exclude') - ->autocomplete(); + yield AssociationField::new('targets') + ->hideOnForm(); + yield TextareaField::new('condition'); yield DateTimeField::new('createdAt') ->hideOnForm(); yield DateTimeField::new('updatedAt') diff --git a/databox/api/src/Controller/Admin/DashboardController.php b/databox/api/src/Controller/Admin/DashboardController.php index 6df1ae86ea..42c234bb5d 100644 --- a/databox/api/src/Controller/Admin/DashboardController.php +++ b/databox/api/src/Controller/Admin/DashboardController.php @@ -61,7 +61,7 @@ public function configureMenuItems(): iterable MenuItem::linkTo(AssetPolicyCrudController::class, 'Asset Policy'), MenuItem::linkTo(AttributePolicyCrudController::class, 'Attribute Policy'), MenuItem::linkTo(TagCrudController::class, 'Tag'), - MenuItem::linkTo(TagFilterRuleCrudController::class, 'Tag Filter Rule'), + MenuItem::linkTo(AttributeFilterRuleCrudController::class, 'Attribute Filter Rule'), MenuItem::linkTo(AssetRenditionCrudController::class, 'Asset Rendition'), MenuItem::linkTo(RenditionDefinitionCrudController::class, 'Rendition Definition'), MenuItem::linkTo(RenditionPolicyCrudController::class, 'Rendition Policy'), diff --git a/databox/api/src/Doctrine/Delete/WorkspaceDelete.php b/databox/api/src/Doctrine/Delete/WorkspaceDelete.php index 151babb8a4..d6bd30926a 100644 --- a/databox/api/src/Doctrine/Delete/WorkspaceDelete.php +++ b/databox/api/src/Doctrine/Delete/WorkspaceDelete.php @@ -11,6 +11,7 @@ use App\Entity\Core\Asset; use App\Entity\Core\AttributeDefinition; use App\Entity\Core\AttributeEntity; +use App\Entity\Core\AttributeFilterRule; use App\Entity\Core\AttributePolicy; use App\Entity\Core\Collection; use App\Entity\Core\EntityList; @@ -18,7 +19,6 @@ use App\Entity\Core\RenditionDefinition; use App\Entity\Core\RenditionPolicy; use App\Entity\Core\Tag; -use App\Entity\Core\TagFilterRule; use App\Entity\Core\Workspace; use App\Entity\Integration\WorkspaceIntegration; use App\Entity\Integration\WorkspaceSecret; @@ -106,7 +106,7 @@ public function deleteWorkspace(string $workspaceId): void $this->deleteDependencies(WorkspaceSecret::class, $workspaceId); $this->deleteDependencies(AttributeEntity::class, $workspaceId); $this->deleteDependencies(EntityList::class, $workspaceId); - $this->deleteDependencies(TagFilterRule::class, $workspaceId); + $this->deleteDependencies(AttributeFilterRule::class, $workspaceId); $nFiles = $this->em->getRepository(File::class) ->createQueryBuilder('t') diff --git a/databox/api/src/Elasticsearch/AQL/AQLGrammar.peg b/databox/api/src/Elasticsearch/AQL/AQLGrammar.peg index 6fbf0b38cd..11db4e6640 100644 --- a/databox/api/src/Elasticsearch/AQL/AQLGrammar.peg +++ b/databox/api/src/Elasticsearch/AQL/AQLGrammar.peg @@ -63,7 +63,7 @@ condition: '(' > e:expression > ')' unset($result['e']); } -not_expression: "NOT" __ e:expression +not_expression: "NOT" ] e:expression function __finalise(&$result) { $result['data'] = [ 'type' => 'expression', diff --git a/databox/api/src/Elasticsearch/AQL/AQLGrammar.php b/databox/api/src/Elasticsearch/AQL/AQLGrammar.php index 7a37f9c819..f2a042ea53 100644 --- a/databox/api/src/Elasticsearch/AQL/AQLGrammar.php +++ b/databox/api/src/Elasticsearch/AQL/AQLGrammar.php @@ -257,7 +257,7 @@ public function condition__finalise (&$result) { unset($result['e']); } -/* not_expression: "NOT" __ e:expression */ +/* not_expression: "NOT" ] e:expression */ protected $match_not_expression_typestack = ['not_expression']; function match_not_expression($stack = []) { $matchrule = 'not_expression'; @@ -267,11 +267,7 @@ function match_not_expression($stack = []) { do { if (($subres = $this->literal('NOT')) !== \false) { $result["text"] .= $subres; } else { $_18327 = \false; break; } - $key = 'match_'.'__'; $pos = $this->pos; - $subres = $this->packhas($key, $pos) - ? $this->packread($key, $pos) - : $this->packwrite($key, $pos, $this->{$key}(\array_merge($stack, [$result]))); - if ($subres !== \false) { $this->store($result, $subres); } + if (($subres = $this->whitespace()) !== \false) { $result["text"] .= $subres; } else { $_18327 = \false; break; } $key = 'match_'.'expression'; $pos = $this->pos; $subres = $this->packhas($key, $pos) diff --git a/databox/api/src/Elasticsearch/AQL/AQLToESQuery.php b/databox/api/src/Elasticsearch/AQL/AQLToESQuery.php index 91263f887e..8d4451aec9 100644 --- a/databox/api/src/Elasticsearch/AQL/AQLToESQuery.php +++ b/databox/api/src/Elasticsearch/AQL/AQLToESQuery.php @@ -51,7 +51,11 @@ private function visitNode(array $fieldClusters, array $data, array $options): Q private function visitExpression(array $fieldClusters, array $data, array $options): Query\AbstractQuery { $boolQuery = new Query\BoolQuery(); - $method = LogicOperatorEnum::AND->value === strtoupper((string) $data['operator']) ? 'addMust' : 'addShould'; + $method = match (strtoupper((string) $data['operator'])) { + LogicOperatorEnum::AND->value => 'addMust', + LogicOperatorEnum::NOT->value => 'addMustNot', + default => 'addShould', + }; foreach ($data['conditions'] as $condition) { $boolQuery->$method($this->visitNode($fieldClusters, $condition, $options)); diff --git a/databox/api/src/Elasticsearch/AQL/LogicOperatorEnum.php b/databox/api/src/Elasticsearch/AQL/LogicOperatorEnum.php index 18a7e69e66..8652594bd8 100644 --- a/databox/api/src/Elasticsearch/AQL/LogicOperatorEnum.php +++ b/databox/api/src/Elasticsearch/AQL/LogicOperatorEnum.php @@ -8,4 +8,5 @@ enum LogicOperatorEnum: string { case AND = 'AND'; case OR = 'OR'; + case NOT = 'NOT'; } diff --git a/databox/api/src/Elasticsearch/AssetSearch.php b/databox/api/src/Elasticsearch/AssetSearch.php index ebc21fb9ef..fd83c19db2 100644 --- a/databox/api/src/Elasticsearch/AssetSearch.php +++ b/databox/api/src/Elasticsearch/AssetSearch.php @@ -12,11 +12,10 @@ use App\Entity\Core\Asset; use App\Entity\Core\AssetStatusEnum; use App\Entity\Core\Collection; -use App\Entity\Core\Workspace; use App\Entity\SavedSearch\SavedSearch; use App\Repository\Core\CollectionRepository; use App\Repository\SavedSearch\SavedSearchRepository; -use App\Security\TagFilterManager; +use App\Security\AttributeFilterManager; use App\Security\Voter\AbstractVoter; use App\Security\Voter\AssetVoter; use App\Service\Asset\AssetSortGroupMapper; @@ -24,6 +23,7 @@ use FOS\ElasticaBundle\Finder\PaginatedFinderInterface; use FOS\ElasticaBundle\Paginator\FantaPaginatorAdapter; use Pagerfanta\Pagerfanta; +use Psr\Log\LoggerInterface; use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -33,7 +33,8 @@ class AssetSearch extends AbstractSearch public function __construct( #[Autowire(service: 'fos_elastica.finder.asset')] private readonly PaginatedFinderInterface $finder, - private readonly TagFilterManager $tagFilterManager, + private readonly AttributeFilterManager $attributeFilterManager, + private readonly LoggerInterface $logger, private readonly AttributeSearch $attributeSearch, private readonly QueryStringParser $queryStringParser, private readonly FacetHandler $facetHandler, @@ -155,8 +156,8 @@ public function search( $filterQuery->addFilter($query); } - if (null !== $tagQuery = $this->buildTagFilterQuery($userId, $groupIds)) { - $filterQuery->addFilter($tagQuery); + if (null !== $attrFilterQuery = $this->buildAttributeFilterQuery($userId, $groupIds, $options)) { + $filterQuery->addFilter($attrFilterQuery); } $queryString = trim($options['query'] ?? ''); @@ -224,27 +225,39 @@ public function search( return [$result, $facets, $esQuery, $searchTime]; } - private function buildTagFilterQuery(?string $userId, array $groupIds): ?Query\BoolQuery + private function buildAttributeFilterQuery(?string $userId, array $groupIds, array $options): ?Query\BoolQuery { - $ruleSet = $this->tagFilterManager->getUserRules($userId, $groupIds); + $ruleSet = $this->attributeFilterManager->getUserRules($userId, $groupIds); $query = new Query\BoolQuery(); $hasConditions = false; - foreach ($ruleSet as $wId => $rules) { - if (empty($rules['include']) && empty($rules['exclude'])) { - continue; - } - $workspace = $this->workspaceRepository->find($wId); - if ($workspace instanceof Workspace) { - if (!empty($rules['include'])) { - $query->addMust($this->createIncludeQuery('workspaceId', $workspace->getId(), $rules['include'])); - $hasConditions = true; - } - if (!empty($rules['exclude'])) { - $query->addMustNot($this->createExcludeQuery('workspaceId', $workspace->getId(), $rules['exclude'])); - $hasConditions = true; + foreach ($ruleSet as $wId => $conditions) { + foreach ($conditions as $condition) { + try { + $conditionQuery = $this->attributeSearch->buildConditionQuery( + $this->attributeSearch->buildAllAttributeDefinitionsGroups(), + $condition, + $options + ); + } catch (\Throwable $e) { + // Fail-closed: hide the whole workspace rather than breaking search or leaking assets + $this->logger->error('Invalid attribute filter rule condition', [ + 'workspaceId' => $wId, + 'condition' => $condition, + 'error' => $e->getMessage(), + ]); + $conditionQuery = new Query\MatchNone(); } + + $scoped = new Query\BoolQuery(); + $notWorkspace = new Query\BoolQuery(); + $notWorkspace->addMustNot(new Query\Term(['workspaceId' => $wId])); + $scoped->addShould($notWorkspace); + $scoped->addShould($conditionQuery); + + $query->addMust($scoped); + $hasConditions = true; } } @@ -297,32 +310,6 @@ private function applySort(Query $query, array $options): void $query->setSort($sort); } - private function createIncludeQuery(string $termCol, string $termValue, array $include): Query\BoolQuery - { - $query = new Query\BoolQuery(); - - $notMatch = new Query\BoolQuery(); - $notMatch->addMustNot(new Query\Term([$termCol => $termValue])); - $query->addShould($notMatch); - - $bool = new Query\BoolQuery(); - foreach ($include as $tag) { - $bool->addFilter(new Query\Term(['tags' => $tag])); - } - $query->addShould($bool); - - return $query; - } - - private function createExcludeQuery(string $termCol, string $termValue, array $exclude): Query\BoolQuery - { - $query = new Query\BoolQuery(); - $query->addFilter(new Query\Term([$termCol => $termValue])); - $query->addFilter(new Query\Terms('tags', $exclude)); - - return $query; - } - protected function getAdminScope(): ?string { return AssetVoter::SCOPE_PREFIX.AbstractVoter::LIST; diff --git a/databox/api/src/Elasticsearch/AttributeSearch.php b/databox/api/src/Elasticsearch/AttributeSearch.php index ae53dd8230..5c36863388 100644 --- a/databox/api/src/Elasticsearch/AttributeSearch.php +++ b/databox/api/src/Elasticsearch/AttributeSearch.php @@ -54,6 +54,16 @@ public function buildSearchableAttributeDefinitionsGroups(?string $userId, array }); } + public function buildAllAttributeDefinitionsGroups(): array + { + return $this->cache->get('sa_all', function () { + $definitions = $this->em->getRepository(AttributeDefinition::class) + ->getAllSearchableAttributes(); + + return $this->createClustersFromDefinitions($definitions); + }); + } + public function createClustersFromDefinitions(iterable $definitions): array { $groups = []; diff --git a/databox/api/src/Entity/Core/AttributeFilterRule.php b/databox/api/src/Entity/Core/AttributeFilterRule.php new file mode 100644 index 0000000000..e503508397 --- /dev/null +++ b/databox/api/src/Entity/Core/AttributeFilterRule.php @@ -0,0 +1,150 @@ + ['_', + AttributeFilterRule::GROUP_READ], + ], + input: AttributeFilterRuleInput::class, + output: AttributeFilterRuleOutput::class, + security: 'is_granted("'.JwtUser::IS_AUTHENTICATED_FULLY.'")', + provider: AttributeFilterRuleCollectionProvider::class, +)] +#[ORM\Table] +#[ORM\Entity(repositoryClass: AttributeFilterRuleRepository::class)] +class AttributeFilterRule extends AbstractUuidEntity implements LoggableChangeSetInterface +{ + use CreatedAtTrait; + use UpdatedAtTrait; + use WorkspaceTrait; + final public const int OBJECT_INDEX = 21; + + final public const string GROUP_READ = 'afr:read'; + final public const string GROUP_LIST = 'afr:index'; + + /** + * A rule without any target applies to everyone. + * + * @var DoctrineCollection + */ + #[ORM\OneToMany(mappedBy: 'rule', targetEntity: AttributeFilterRuleTarget::class, cascade: ['persist', 'remove'], orphanRemoval: true)] + protected ?DoctrineCollection $targets = null; + + #[ORM\Column(type: Types::TEXT)] + #[ValidAQLConstraint] + protected ?string $condition = null; + + public function __construct() + { + parent::__construct(); + + $this->targets = new ArrayCollection(); + } + + /** + * @return DoctrineCollection + */ + public function getTargets(): DoctrineCollection + { + return $this->targets; + } + + public function addTarget(int $userType, string $userId): void + { + foreach ($this->targets as $target) { + if ($target->getUserType() === $userType && $target->getUserId() === $userId) { + return; + } + } + + $target = new AttributeFilterRuleTarget(); + $target->setRule($this); + $target->setUserType($userType); + $target->setUserId($userId); + $this->targets->add($target); + } + + public function setTargets(array $userIds, array $groupIds): void + { + foreach ($this->targets as $target) { + $list = AttributeFilterRuleTarget::TYPE_GROUP === $target->getUserType() ? $groupIds : $userIds; + if (!in_array($target->getUserId(), $list, true)) { + $this->targets->removeElement($target); + } + } + + foreach ($userIds as $userId) { + $this->addTarget(AttributeFilterRuleTarget::TYPE_USER, $userId); + } + foreach ($groupIds as $groupId) { + $this->addTarget(AttributeFilterRuleTarget::TYPE_GROUP, $groupId); + } + } + + /** + * @return string[] + */ + public function getUserIds(): array + { + return $this->getTargetIds(AttributeFilterRuleTarget::TYPE_USER); + } + + /** + * @return string[] + */ + public function getGroupIds(): array + { + return $this->getTargetIds(AttributeFilterRuleTarget::TYPE_GROUP); + } + + private function getTargetIds(int $userType): array + { + return $this->targets + ->filter(fn (AttributeFilterRuleTarget $t): bool => $t->getUserType() === $userType) + ->map(fn (AttributeFilterRuleTarget $t): string => $t->getUserId()) + ->getValues(); + } + + public function getCondition(): ?string + { + return $this->condition; + } + + public function setCondition(?string $condition): void + { + $this->condition = $condition; + } +} diff --git a/databox/api/src/Entity/Core/AttributeFilterRuleTarget.php b/databox/api/src/Entity/Core/AttributeFilterRuleTarget.php new file mode 100644 index 0000000000..4780ade51c --- /dev/null +++ b/databox/api/src/Entity/Core/AttributeFilterRuleTarget.php @@ -0,0 +1,64 @@ +rule; + } + + public function setRule(?AttributeFilterRule $rule): void + { + $this->rule = $rule; + } + + public function getUserType(): ?int + { + return $this->userType; + } + + public function setUserType(?int $userType): void + { + $this->userType = $userType; + } + + public function getUserId(): ?string + { + return $this->userId; + } + + public function setUserId(?string $userId): void + { + $this->userId = $userId; + } + + public function __toString(): string + { + return sprintf('%s:%s', self::TYPE_GROUP === $this->userType ? 'group' : 'user', $this->userId); + } +} diff --git a/databox/api/src/Entity/Core/TagFilterRule.php b/databox/api/src/Entity/Core/TagFilterRule.php deleted file mode 100644 index f3f65f2ff0..0000000000 --- a/databox/api/src/Entity/Core/TagFilterRule.php +++ /dev/null @@ -1,141 +0,0 @@ - ['_', - TagFilterRule::GROUP_READ, - Tag::GROUP_READ], - ], - input: TagFilterRuleInput::class, - output: TagFilterRuleOutput::class, - security: 'is_granted("'.JwtUser::IS_AUTHENTICATED_FULLY.'")', - provider: TagFilterRuleCollectionProvider::class, -)] -#[ORM\Table] -#[ORM\Index(columns: ['user_type', 'user_id'], name: 'tfr_user_idx')] -#[ORM\Index(columns: ['user_type'], name: 'tfr_user_type_idx')] -#[ORM\UniqueConstraint(name: 'tfr_uniq_ace', columns: ['user_type', 'user_id', 'workspace_id'])] -#[ORM\Entity(repositoryClass: TagFilterRuleRepository::class)] -#[SameWorkspaceConstraint( - properties: ['workspace', 'include.workspace', 'exclude.workspace'] -)] -class TagFilterRule extends AbstractUuidEntity implements LoggableChangeSetInterface -{ - use CreatedAtTrait; - use UpdatedAtTrait; - use WorkspaceTrait; - final public const int OBJECT_INDEX = 20; - - final public const string GROUP_READ = 'tfr:read'; - final public const string GROUP_LIST = 'tfr:index'; - - final public const int TYPE_USER = 0; - final public const int TYPE_GROUP = 1; - - #[ORM\Column(type: Types::SMALLINT)] - protected ?int $userType = null; - - #[ORM\Column(type: Types::STRING, length: 36, nullable: true)] - protected ?string $userId = null; - - #[ORM\JoinTable(name: 'tfr_includes')] - #[ORM\ManyToMany(targetEntity: Tag::class)] - protected ?DoctrineCollection $include = null; - - #[ORM\JoinTable(name: 'tfr_excludes')] - #[ORM\ManyToMany(targetEntity: Tag::class)] - protected ?DoctrineCollection $exclude = null; - - public function __construct() - { - parent::__construct(); - - $this->include = new ArrayCollection(); - $this->exclude = new ArrayCollection(); - } - - public function getUserType(): ?int - { - return $this->userType; - } - - public function setUserType(?int $userType): void - { - $this->userType = $userType; - } - - public function getUserId(): ?string - { - return $this->userId; - } - - public function setUserId(?string $userId): void - { - $this->userId = $userId; - } - - /** - * @return Tag[] - */ - public function getInclude(): DoctrineCollection - { - return $this->include; - } - - /** - * @return Tag[] - */ - public function getExclude(): DoctrineCollection - { - return $this->exclude; - } - - public function setInclude(iterable $include): void - { - $this->include->clear(); - foreach ($include as $item) { - $this->include->add($item); - } - } - - public function setExclude(iterable $exclude): void - { - $this->exclude->clear(); - foreach ($exclude as $item) { - $this->exclude->add($item); - } - } -} diff --git a/databox/api/src/Repository/Core/AttributeDefinitionRepository.php b/databox/api/src/Repository/Core/AttributeDefinitionRepository.php index 350f9dfbf6..f3b819f419 100644 --- a/databox/api/src/Repository/Core/AttributeDefinitionRepository.php +++ b/databox/api/src/Repository/Core/AttributeDefinitionRepository.php @@ -159,6 +159,35 @@ public function getSearchableAttributesWithPermission(?string $userId, array $gr } } + /** + * Returns every searchable attribute definition, regardless of user permissions. + * Filter rule conditions are authored by workspace admins and must resolve + * even when the target user cannot read the referenced attributes. + */ + public function getAllSearchableAttributes(): iterable + { + $queryBuilder = $this + ->createQueryBuilder('t') + ->innerJoin('t.workspace', 'w') + ->select('t.type') + ->addSelect('t.slug') + ->addSelect('t.multiple') + ->addSelect('t.searchBoost') + ->addSelect('t.translatable') + ->addSelect('w.id AS workspaceId') + ->addSelect('w.enabledLocales AS enabledLocales') + ->andWhere('t.searchable = true') + ; + + foreach ($queryBuilder + ->getQuery() + ->toIterable() as $row) { + $row['allowed'] = true; + + yield $row; + } + } + /** * @return AttributeDefinition[] */ diff --git a/databox/api/src/Repository/Core/AttributeFilterRuleRepository.php b/databox/api/src/Repository/Core/AttributeFilterRuleRepository.php new file mode 100644 index 0000000000..23766f28b9 --- /dev/null +++ b/databox/api/src/Repository/Core/AttributeFilterRuleRepository.php @@ -0,0 +1,63 @@ +createQueryBuilder('a') + ->distinct() + ->leftJoin('a.targets', 't'); + + $targetWhere = ['t.id IS NULL']; + + if ($userId) { + $targetWhere[] = 't.userType = :ut AND t.userId = :uid'; + $queryBuilder + ->setParameter('ut', AttributeFilterRuleTarget::TYPE_USER) + ->setParameter('uid', $userId) + ; + } + + if (!empty($groupIds)) { + $targetWhere[] = 't.userType = :gt AND t.userId IN (:gids)'; + $queryBuilder + ->setParameter('gt', AttributeFilterRuleTarget::TYPE_GROUP) + ->setParameter('gids', $groupIds) + ; + } + + $queryBuilder->andWhere($queryBuilder->expr()->orX(...$targetWhere)); + + if (null !== $workspaceId) { + $queryBuilder + ->andWhere('a.workspace = :wid') + ->setParameter('wid', $workspaceId); + } + + return $queryBuilder + ->getQuery() + ->getResult(); + } +} diff --git a/databox/api/src/Repository/Core/TagFilterRuleRepository.php b/databox/api/src/Repository/Core/TagFilterRuleRepository.php deleted file mode 100644 index 3f081b0cc4..0000000000 --- a/databox/api/src/Repository/Core/TagFilterRuleRepository.php +++ /dev/null @@ -1,99 +0,0 @@ -createBaseQueryBuilder(); - - $userWhere = [ - $userId ? 'a.userType = :ut AND a.userId = :uid OR a.userId IS NULL' : 'a.userId IS NULL', - ]; - - if (!empty($groupIds)) { - $userWhere[] = 'a.userType = :gt AND a.userId IN (:gids)'; - $queryBuilder - ->setParameter('gt', TagFilterRule::TYPE_GROUP) - ->setParameter('gids', $groupIds) - ; - } - - $queryBuilder->andWhere($queryBuilder->expr()->orX(...$userWhere)); - - if ($userId) { - $queryBuilder - ->setParameter('ut', TagFilterRule::TYPE_USER) - ->setParameter('uid', $userId) - ; - } - - if (null !== $workspaceId) { - $queryBuilder - ->andWhere('a.workspace = :wid') - ->setParameter('wid', $workspaceId); - } - - return $queryBuilder - ->getQuery() - ->getResult(); - } - - public function findRules(array $params = []): array - { - $queryBuilder = $this->createBaseQueryBuilder(); - - foreach ([ - 'userType', - 'userId', - 'workspace', - ] as $key) { - if (!array_key_exists($key, $params)) { - throw new \InvalidArgumentException(sprintf('Missing "%s" key', $key)); - } - } - - foreach ([ - 'userType' => 'ut', - 'userId' => 'uid', - 'workspace' => 'wid', - ] as $col => $alias) { - if (isset($params[$col])) { - $queryBuilder - ->andWhere(sprintf('a.%s = :%s', $col, $alias)) - ->setParameter($alias, $params[$col]); - } - } - - if (null === $params['userId']) { - $queryBuilder->andWhere('a.uid IS NULL'); - } - - return $queryBuilder - ->getQuery() - ->getResult(); - } - - private function createBaseQueryBuilder(): QueryBuilder - { - return $this->createQueryBuilder('a'); - } -} diff --git a/databox/api/src/Security/AttributeFilterManager.php b/databox/api/src/Security/AttributeFilterManager.php new file mode 100644 index 0000000000..2342346686 --- /dev/null +++ b/databox/api/src/Security/AttributeFilterManager.php @@ -0,0 +1,55 @@ +setWorkspace($workspace); + $rule->setCondition($condition); + $rule->setTargets($userIds, $groupIds); + + $this->em->persist($rule); + $this->em->flush(); + + return $rule; + } + + /** + * @return array AQL conditions indexed by workspace ID + */ + public function getUserRules(?string $userId, array $groupIds): array + { + $rules = $this->repository->getRules($userId, $groupIds, null); + $wsRules = []; + foreach ($rules as $rule) { + $wsRules[$rule->getWorkspaceId()][] = $rule->getCondition(); + } + + return $wsRules; + } +} diff --git a/databox/api/src/Security/TagFilterManager.php b/databox/api/src/Security/TagFilterManager.php deleted file mode 100644 index 2da8ecc578..0000000000 --- a/databox/api/src/Security/TagFilterManager.php +++ /dev/null @@ -1,86 +0,0 @@ -repository->findRules([ - 'userType' => $userType, - 'userId' => $userId, - 'workspace' => $workspace->getId(), - ]); - if (!empty($existingRules)) { - $filter = reset($existingRules); - } else { - $filter = new TagFilterRule(); - $filter->setUserType($userType); - $filter->setUserId($userId); - } - - $filter->setWorkspace($workspace); - - $filter->setInclude(array_map(fn (string $id): Tag => $this->em->getReference(Tag::class, Uuid::fromString($id)), $include)); - $filter->setExclude(array_map(fn (string $id): Tag => $this->em->getReference(Tag::class, Uuid::fromString($id)), $exclude)); - - $this->em->persist($filter); - $this->em->flush(); - - return $filter; - } - - public function getUserRules(?string $userId, array $groupIds): array - { - $rules = $this->repository->getRules($userId, $groupIds, null); - $wsRules = []; - foreach ($rules as $rule) { - $wsRules[$rule->getWorkspaceId()][] = $rule; - } - foreach ($wsRules as $wsId => $rules) { - $wsRules[$wsId] = $this->mergeRules($rules); - } - - return $wsRules; - } - - /** - * @param TagFilterRule[] $rules - */ - private function mergeRules(array $rules): array - { - $include = []; - $exclude = []; - - foreach ($rules as $rule) { - $include = [...$include, ...$rule->getInclude()->map(fn (Tag $tag): string => $tag->getId())->getValues()]; - $exclude = [...$exclude, ...$rule->getExclude()->map(fn (Tag $tag): string => $tag->getId())->getValues()]; - } - - return [ - 'include' => array_values(array_unique($include)), - 'exclude' => array_values(array_unique($exclude)), - ]; - } -} diff --git a/databox/api/src/Security/Voter/TagFilterRuleVoter.php b/databox/api/src/Security/Voter/AttributeFilterRuleVoter.php similarity index 66% rename from databox/api/src/Security/Voter/TagFilterRuleVoter.php rename to databox/api/src/Security/Voter/AttributeFilterRuleVoter.php index 7b821601ec..b1a5822243 100644 --- a/databox/api/src/Security/Voter/TagFilterRuleVoter.php +++ b/databox/api/src/Security/Voter/AttributeFilterRuleVoter.php @@ -4,24 +4,24 @@ namespace App\Security\Voter; -use App\Entity\Core\TagFilterRule; +use App\Entity\Core\AttributeFilterRule; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; -class TagFilterRuleVoter extends AbstractVoter +class AttributeFilterRuleVoter extends AbstractVoter { protected function supports(string $attribute, $subject): bool { - return $subject instanceof TagFilterRule; + return $subject instanceof AttributeFilterRule; } #[\Override] public function supportsType(string $subjectType): bool { - return is_a($subjectType, TagFilterRule::class, true); + return is_a($subjectType, AttributeFilterRule::class, true); } /** - * @param TagFilterRule $subject + * @param AttributeFilterRule $subject */ protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool { diff --git a/databox/api/src/Service/Workspace/WorkspaceDuplicateManager.php b/databox/api/src/Service/Workspace/WorkspaceDuplicateManager.php index 95a6b8cacb..28d09900cc 100644 --- a/databox/api/src/Service/Workspace/WorkspaceDuplicateManager.php +++ b/databox/api/src/Service/Workspace/WorkspaceDuplicateManager.php @@ -4,10 +4,10 @@ namespace App\Service\Workspace; +use App\Entity\Core\AttributeFilterRule; use App\Entity\Core\RenditionDefinition; use App\Entity\Core\RenditionPolicy; use App\Entity\Core\Tag; -use App\Entity\Core\TagFilterRule; use App\Entity\Core\Workspace; use App\Entity\Integration\WorkspaceIntegration; use Doctrine\ORM\EntityManagerInterface; @@ -77,29 +77,26 @@ private function copyTags(Workspace $from, Workspace $to): void $items = $this->em->getRepository(Tag::class)->findBy([ 'workspace' => $from->getId(), ]); - $map = []; foreach ($items as $item) { $i = new Tag(); $i->setWorkspace($to); $i->setName($item->getName()); $i->setLocale($item->getLocale()); $this->em->persist($i); - $map[$item->getId()] = $i; } - /** @var TagFilterRule[] $items */ - $items = $this->em->getRepository(TagFilterRule::class)->findBy([ + /** @var AttributeFilterRule[] $items */ + $items = $this->em->getRepository(AttributeFilterRule::class)->findBy([ 'workspace' => $from->getId(), ]); - $replace = fn (Tag $t): Tag => $map[$t->getId()]; + // Entity UUIDs embedded in the AQL condition (e.g. @tag references) are NOT + // remapped to the duplicated workspace's entities: such rules fail closed. foreach ($items as $item) { - $i = new TagFilterRule(); - $i->setExclude($item->getExclude()->map($replace)); - $i->setInclude($item->getInclude()->map($replace)); + $i = new AttributeFilterRule(); + $i->setCondition($item->getCondition()); $i->setWorkspace($to); - $i->setUserId($item->getUserId()); - $i->setUserType($item->getUserType()); + $i->setTargets($item->getUserIds(), $item->getGroupIds()); $this->em->persist($i); } } diff --git a/databox/api/src/Validator/ValidAQLConstraint.php b/databox/api/src/Validator/ValidAQLConstraint.php new file mode 100644 index 0000000000..90e6a358f4 --- /dev/null +++ b/databox/api/src/Validator/ValidAQLConstraint.php @@ -0,0 +1,17 @@ +attributeSearch->buildConditionQuery( + $this->attributeSearch->buildAllAttributeDefinitionsGroups(), + (string) $value, + [] + ); + } catch (\Throwable $e) { + $this->context + ->buildViolation(sprintf( + 'Invalid AQL condition: %s', + $e->getMessage() + )) + ->addViolation(); + } + } +} diff --git a/databox/api/tests/DataboxTestTrait.php b/databox/api/tests/DataboxTestTrait.php index 90d9bf2188..888a357681 100644 --- a/databox/api/tests/DataboxTestTrait.php +++ b/databox/api/tests/DataboxTestTrait.php @@ -20,7 +20,7 @@ use App\Entity\Core\Tag; use App\Entity\Core\Workspace; use App\Entity\Core\WorkspaceItemPrivacyInterface; -use App\Security\TagFilterManager; +use App\Security\AttributeFilterManager; use App\Service\Workspace\WorkspaceCreator; use MartinGeorgiev\Doctrine\DBAL\Types\ValueObject\Ltree; use Ramsey\Uuid\Uuid; @@ -251,9 +251,9 @@ protected static function getPermissionManager(): PermissionManager return self::getService(PermissionManager::class); } - protected static function getTagFilterManager(): TagFilterManager + protected static function getAttributeFilterManager(): AttributeFilterManager { - return self::getContainer()->get(TagFilterManager::class); + return self::getContainer()->get(AttributeFilterManager::class); } protected function addAssetToCollection(string $collectionId, string $assetId, array $options = []): string diff --git a/databox/api/tests/Search/AssetSearchPermissionsTest.php b/databox/api/tests/Search/AssetSearchPermissionsTest.php index 2a3f3ac978..ab0c5a1e27 100644 --- a/databox/api/tests/Search/AssetSearchPermissionsTest.php +++ b/databox/api/tests/Search/AssetSearchPermissionsTest.php @@ -7,7 +7,6 @@ use Alchemy\AclBundle\Model\AccessControlEntryInterface; use Alchemy\AclBundle\Security\PermissionInterface; use Alchemy\AuthBundle\Tests\Client\KeycloakClientTestMock; -use App\Entity\Core\TagFilterRule; class AssetSearchPermissionsTest extends AbstractSearchTest { @@ -308,7 +307,7 @@ public function testSearchAssetsWithACEOnAllCollections(): void /** * @dataProvider getAssetTagsDataSet */ - public function testSearchAssetsWithTagFilterRule( + public function testSearchAssetsWithAttributeFilterRuleOnTags( array $assets, array $include, array $exclude, @@ -341,13 +340,20 @@ public function testSearchAssetsWithTagFilterRule( $include = array_map($resolveTag, $include); $exclude = array_map($resolveTag, $exclude); - self::getTagFilterManager()->updateRule( - $workspace, - TagFilterRule::TYPE_USER, - KeycloakClientTestMock::USER_UID, - $include, - $exclude - ); + $conditionParts = array_map(fn (string $id): string => sprintf('@tag = "%s"', $id), $include); + if (!empty($exclude)) { + $conditionParts[] = sprintf('@tag NOT IN (%s)', implode(', ', array_map(fn (string $id): string => sprintf('"%s"', $id), $exclude))); + } + $condition = implode(' AND ', $conditionParts); + + if ('' !== $condition) { + self::getAttributeFilterManager()->saveRule( + $workspace, + [KeycloakClientTestMock::USER_UID], + [], + $condition + ); + } self::releaseIndex(); $client = self::createClient(); @@ -390,4 +396,143 @@ public function getAssetTagsDataSet(): array [['Foo' => [], 'Bar' => []], ['tag1'], ['tag1'], []], ]; } + + /** + * @dataProvider getAttributeConditionsDataSet + */ + public function testSearchAssetsWithAttributeFilterRuleOnAttribute( + string $condition, + array $expectedResults, + ): void { + $workspace = $this->createWorkspace([ + 'public' => true, + 'no_flush' => true, + ]); + $collection = $this->createCollection([ + 'workspace' => $workspace, + ]); + $definition = $this->createAttributeDefinition([ + 'workspace' => $workspace, + 'name' => 'Category', + 'slug' => 'category', + ]); + + foreach ([ + 'Press' => 'press', + 'Internal' => 'internal', + 'None' => null, + ] as $assetName => $category) { + $this->createAsset([ + 'workspace' => $workspace, + 'name' => $assetName, + 'public' => true, + 'collectionId' => $collection->getId(), + 'attributes' => null !== $category ? [[ + 'definition' => $definition, + 'value' => $category, + ]] : [], + ]); + } + self::releaseIndex(); + + self::getAttributeFilterManager()->saveRule( + $workspace, + [KeycloakClientTestMock::USER_UID], + [], + $condition + ); + self::releaseIndex(); + + $client = self::createClient(); + $response = $client->request('GET', '/assets', [ + 'headers' => [ + 'Authorization' => 'Bearer '.KeycloakClientTestMock::getJwtFor(KeycloakClientTestMock::USER_UID), + ], + ]); + + $data = $this->getDataFromResponse($response, 200)['hydra:member']; + $names = array_map(fn (array $asset): string => $asset['name'], $data); + sort($names); + sort($expectedResults); + + $this->assertSame($expectedResults, $names); + } + + public function getAttributeConditionsDataSet(): array + { + return [ + 'equals' => ['category = "press"', ['Press']], + 'not equals' => ['NOT (category = "press")', ['Internal', 'None']], + 'in' => ['category IN ("press", "internal")', ['Internal', 'Press']], + // Invalid condition (unknown field): fail-closed, the workspace is hidden + 'unknown field' => ['unknown_field = "press"', []], + ]; + } + + /** + * @dataProvider getTargetingDataSet + */ + public function testAttributeFilterRuleTargeting(array $userIds, bool $applies): void + { + $workspace = $this->createWorkspace([ + 'public' => true, + 'no_flush' => true, + ]); + $collection = $this->createCollection([ + 'workspace' => $workspace, + ]); + $definition = $this->createAttributeDefinition([ + 'workspace' => $workspace, + 'name' => 'Category', + 'slug' => 'category', + ]); + + foreach ([ + 'Press' => 'press', + 'Internal' => 'internal', + ] as $assetName => $category) { + $this->createAsset([ + 'workspace' => $workspace, + 'name' => $assetName, + 'public' => true, + 'collectionId' => $collection->getId(), + 'attributes' => [[ + 'definition' => $definition, + 'value' => $category, + ]], + ]); + } + self::releaseIndex(); + + self::getAttributeFilterManager()->saveRule( + $workspace, + $userIds, + [], + 'category = "press"' + ); + self::releaseIndex(); + + $client = self::createClient(); + $response = $client->request('GET', '/assets', [ + 'headers' => [ + 'Authorization' => 'Bearer '.KeycloakClientTestMock::getJwtFor(KeycloakClientTestMock::USER_UID), + ], + ]); + + $data = $this->getDataFromResponse($response, 200)['hydra:member']; + $names = array_map(fn (array $asset): string => $asset['name'], $data); + sort($names); + + $this->assertSame($applies ? ['Press'] : ['Internal', 'Press'], $names); + } + + public function getTargetingDataSet(): array + { + return [ + 'no target applies to everyone' => [[], true], + 'targeted user' => [[KeycloakClientTestMock::USER_UID], true], + 'other user only' => [[KeycloakClientTestMock::OTHER_USER_UID], false], + 'multiple users including current' => [[KeycloakClientTestMock::OTHER_USER_UID, KeycloakClientTestMock::USER_UID], true], + ]; + } } diff --git a/databox/client/src/api/attribute-filter-rule.ts b/databox/client/src/api/attribute-filter-rule.ts new file mode 100644 index 0000000000..0e226a3027 --- /dev/null +++ b/databox/client/src/api/attribute-filter-rule.ts @@ -0,0 +1,43 @@ +import {apiClient} from '../init.ts'; +import {AttributeFilterRule} from '../types'; +import {NormalizedCollectionResponse, getHydraCollection} from '@alchemy/api'; + +type AttributeFilterRuleOptions = { + workspaceId?: string; +}; + +export async function getAttributeFilterRules( + options: AttributeFilterRuleOptions +): Promise> { + const res = await apiClient.get('/attribute-filter-rules', { + params: { + ...options, + }, + }); + + return getHydraCollection(res.data); +} + +export async function saveAttributeFilterRule(data: { + id?: string; + userIds?: string[]; + groupIds?: string[]; + workspaceId?: string; + condition?: string; +}): Promise { + let res; + + if (data.id) { + const d = {...data}; + delete d.id; + res = await apiClient.put(`/attribute-filter-rules/${data.id}`, d); + } else { + res = await apiClient.post('/attribute-filter-rules', data); + } + + return res.data; +} + +export async function deleteAttributeFilterRule(id: string): Promise { + await apiClient.delete(`/attribute-filter-rules/${id}`); +} diff --git a/databox/client/src/api/tag-filter-rule.ts b/databox/client/src/api/tag-filter-rule.ts deleted file mode 100644 index 8d265f4e63..0000000000 --- a/databox/client/src/api/tag-filter-rule.ts +++ /dev/null @@ -1,46 +0,0 @@ -import {apiClient} from '../init.ts'; -import {TagFilterRule} from '../types'; -import {NormalizedCollectionResponse, getHydraCollection} from '@alchemy/api'; - -type TagFilterRuleOptions = { - collectionId?: string; - workspaceId?: string; -}; - -export async function getTagFilterRules( - options: TagFilterRuleOptions -): Promise> { - const res = await apiClient.get('/tag-filter-rules', { - params: { - ...options, - }, - }); - - return getHydraCollection(res.data); -} - -export async function saveTagFilterRule(data: { - id?: string; - userId?: string; - groupId?: string; - collectionId?: string; - workspaceId?: string; - include?: string[]; - exclude?: string[]; -}): Promise { - let res; - - if (data.id) { - const d = {...data}; - delete d.id; - res = await apiClient.put(`/tag-filter-rules/${data.id}`, d); - } else { - res = await apiClient.post('/tag-filter-rules', data); - } - - return res.data; -} - -export async function deleteTagFilterRule(id: string): Promise { - await apiClient.delete(`/tag-filter-rules/${id}`); -} diff --git a/databox/client/src/components/Dialog/Workspace/TagRulesTab.tsx b/databox/client/src/components/Dialog/Workspace/FilterRulesTab.tsx similarity index 56% rename from databox/client/src/components/Dialog/Workspace/TagRulesTab.tsx rename to databox/client/src/components/Dialog/Workspace/FilterRulesTab.tsx index 1e7b5f4ce1..090378551a 100644 --- a/databox/client/src/components/Dialog/Workspace/TagRulesTab.tsx +++ b/databox/client/src/components/Dialog/Workspace/FilterRulesTab.tsx @@ -1,14 +1,14 @@ import {Workspace} from '../../../types'; import {DataTabProps} from '../Tabbed/TabbedDialog'; -import TagRules from '../../Media/TagFilterRule/TagRules'; +import AttributeFilterRules from '../../Media/AttributeFilterRule/AttributeFilterRules'; import ContentTab from '../Tabbed/ContentTab'; type Props = DataTabProps; -export default function TagRulesTab({data, onClose, minHeight}: Props) { +export default function FilterRulesTab({data, onClose, minHeight}: Props) { return ( - + ); } diff --git a/databox/client/src/components/Dialog/Workspace/WorkspaceDialog.tsx b/databox/client/src/components/Dialog/Workspace/WorkspaceDialog.tsx index 372a8f234a..2e1bb35993 100644 --- a/databox/client/src/components/Dialog/Workspace/WorkspaceDialog.tsx +++ b/databox/client/src/components/Dialog/Workspace/WorkspaceDialog.tsx @@ -7,7 +7,7 @@ import {getWorkspace} from '../../../api/workspace'; import {FullPageLoader} from '@alchemy/phrasea-ui'; import {Workspace} from '../../../types'; import Acl from './Acl'; -import TagRulesTab from './TagRulesTab'; +import FilterRulesTab from './FilterRulesTab'; import AttributeDefinitionManager from './AttributeDefinitionManager'; import AttributePolicyManager from './AttributePolicyManager'; import TagManager from './TagManager'; @@ -185,9 +185,12 @@ export default function WorkspaceDialog({}: Props) { enabled: data.capabilities.edit, }, { - title: t('workspace.manage.tag_rules.title', 'Tag rules'), - component: TagRulesTab, - id: 'tag-rules', + title: t( + 'workspace.manage.filter_rules.title', + 'Filter rules' + ), + component: FilterRulesTab, + id: 'filter-rules', props: { data, }, diff --git a/databox/client/src/components/Media/AttributeFilterRule/AttributeFilterRules.tsx b/databox/client/src/components/Media/AttributeFilterRule/AttributeFilterRules.tsx new file mode 100644 index 0000000000..fa6ee80f4f --- /dev/null +++ b/databox/client/src/components/Media/AttributeFilterRule/AttributeFilterRules.tsx @@ -0,0 +1,176 @@ +import React from 'react'; +import {AttributeFilterRule} from '../../../types'; +import {getAttributeFilterRules} from '../../../api/attribute-filter-rule'; +import FilterRuleForm from './FilterRuleForm'; +import { + Box, + Button, + Chip, + Grid2 as Grid, + IconButton, + Paper, + Tooltip, + Typography, +} from '@mui/material'; +import EditIcon from '@mui/icons-material/Edit'; +import AddIcon from '@mui/icons-material/Add'; +import {FullPageLoader} from '@alchemy/phrasea-ui'; +import GroupIcon from '@mui/icons-material/Group'; +import PublicIcon from '@mui/icons-material/Public'; +import {useTranslation} from 'react-i18next'; + +type Props = { + workspaceId: string; +}; + +export default function AttributeFilterRules({workspaceId}: Props) { + const {t} = useTranslation(); + const [rules, setRules] = React.useState(); + const [newRule, setNewRule] = React.useState(false); + const [editRule, setEditRule] = React.useState(); + + const loadRules = React.useCallback(() => { + getAttributeFilterRules({ + workspaceId, + }).then(d => setRules(d.result)); + }, [workspaceId]); + + React.useEffect(() => { + loadRules(); + }, [loadRules]); + + const addRule = React.useCallback(() => { + setNewRule(true); + setEditRule(undefined); + }, []); + + const onCancel = React.useCallback(() => { + setNewRule(false); + setEditRule(undefined); + }, []); + + const onEditRule = React.useCallback((id: string) => { + setNewRule(false); + setEditRule(id); + }, []); + + const refresh = React.useCallback(() => { + onCancel(); + loadRules(); + }, [onCancel, loadRules]); + + if (!rules) { + return ; + } + + return ( + <> + + {t('filter_rules.filter_rules', `Filter rules`)} + +
+ {newRule && ( + + )} + {!newRule && ( +
+ +
+ )} +
+ {rules!.map((r: AttributeFilterRule) => { + if (editRule === r.id) { + return ( + + + + ); + } else { + const hasTargets = + r.users.length > 0 || r.groups.length > 0; + + return ( + + + + {r.users.map(u => ( + + ))} + {r.groups.map(g => ( + } + label={g.name} + /> + ))} + {!hasTargets && ( + } + label={t( + 'filter_rules.everyone', + `Everyone` + )} + /> + )} + + + {r.condition} + + + + + onEditRule(r.id) + } + > + + + + + + + ); + } + })} +
+
+ + ); +} diff --git a/databox/client/src/components/Media/AttributeFilterRule/FilterRuleForm.tsx b/databox/client/src/components/Media/AttributeFilterRule/FilterRuleForm.tsx new file mode 100644 index 0000000000..fd91de661b --- /dev/null +++ b/databox/client/src/components/Media/AttributeFilterRule/FilterRuleForm.tsx @@ -0,0 +1,244 @@ +import GroupSelect from '../../Form/GroupSelect'; +import UserSelect from '../../Form/UserSelect'; +import { + Button, + FormGroup, + FormHelperText, + FormLabel, + Paper, +} from '@mui/material'; +import {Grid2 as Grid} from '@mui/material'; +import {useTranslation} from 'react-i18next'; +import {useForm} from 'react-hook-form'; +import {FormRow} from '@alchemy/react-form'; +import { + deleteAttributeFilterRule, + saveAttributeFilterRule, +} from '../../../api/attribute-filter-rule'; +import {FormFieldErrors} from '@alchemy/react-form'; +import {AttributeFilterRule} from '../../../types'; +import {useDirtyFormPrompt} from '@alchemy/phrasea-framework'; +import EditIcon from '@mui/icons-material/Edit'; +import {useModals} from '@alchemy/navigation'; +import SearchConditionDialog from '../Search/AQL/SearchConditionDialog'; + +type FilterRuleFormData = { + id?: string | undefined; + userIds: string[]; + groupIds: string[]; + condition: string; +}; + +type Props = { + data?: AttributeFilterRule | undefined; + onCancel: () => void; + onDelete: (id?: string) => void; + onSubmit: (data: FilterRuleFormData) => void; + workspaceId: string; +}; + +export default function FilterRuleForm({ + data, + onSubmit, + onDelete, + onCancel, + workspaceId, +}: Props) { + const {t} = useTranslation(); + const {openModal} = useModals(); + + const { + handleSubmit, + control, + setValue, + watch, + formState: {errors, isDirty}, + } = useForm({ + defaultValues: data + ? { + id: data.id, + userIds: data.users.map(u => u.id), + groupIds: data.groups.map(g => g.id), + condition: data.condition, + } + : { + userIds: [], + groupIds: [], + condition: '', + }, + }); + useDirtyFormPrompt(isDirty); + + const condition: string = watch('condition') ?? ''; + + const editCondition = () => { + openModal(SearchConditionDialog, { + condition: { + id: data?.id ?? 'new-rule', + query: condition, + }, + onUpsert: c => { + setValue('condition', c.query, {shouldDirty: true}); + }, + workspaceId, + }); + }; + + const saveRule = async (formData: FilterRuleFormData) => { + await saveAttributeFilterRule({ + id: formData.id, + userIds: formData.userIds ?? [], + groupIds: formData.groupIds ?? [], + condition: formData.condition, + workspaceId, + }); + + onSubmit(formData); + }; + + const deleteClick = async () => { + if ( + !window.confirm( + t( + 'filter_rule.confirm_delete_this_rule', + `Confirm delete this rule?` + ) + ) + ) { + return; + } + + const id = data!.id!; + await deleteAttributeFilterRule(id); + onDelete(id); + }; + + return ( +
+ +
+ {t('filter_rule.rule_applies_for', `Rule applies for:`)} +
+ + + + + {t('filter_rule.users', 'Users')} + + + + + + + + + {t('filter_rule.groups', 'Groups')} + + + + + + + + {t( + 'filter_rule.targets_helper', + `Leave both empty to apply this rule to every user.` + )} + + + + + + + {t( + 'filter_rule.condition.label', + 'Condition' + )} + +
+ {condition ? ( + {condition} + ) : ( + + {t( + 'filter_rule.condition.empty', + 'No condition defined yet' + )} + + )} +
+
+ +
+ + {t( + 'filter_rule.condition.helper', + `Assets in this workspace will only be visible if they match this condition.` + )} + + +
+
+
+ + {' '} + {' '} + {data?.id && ( + + )} + +
+
+
+ ); +} diff --git a/databox/client/src/components/Media/Search/AQL/SearchConditionDialog.tsx b/databox/client/src/components/Media/Search/AQL/SearchConditionDialog.tsx index f2c13c2b4c..20a2665d43 100644 --- a/databox/client/src/components/Media/Search/AQL/SearchConditionDialog.tsx +++ b/databox/client/src/components/Media/Search/AQL/SearchConditionDialog.tsx @@ -30,6 +30,7 @@ import {logError} from '@alchemy/core'; type Props = { condition: AQLQuery; onUpsert: (condition: AQLQuery) => void; + workspaceId?: string; } & StackedModalProps; export default function SearchConditionDialog({ @@ -37,6 +38,7 @@ export default function SearchConditionDialog({ open, modalIndex, onUpsert, + workspaceId, }: Props) { const {t} = useTranslation(); const {closeModal} = useModals(); @@ -89,12 +91,18 @@ export default function SearchConditionDialog({ const isNew = !condition.query; - const {load, loaded} = useAttributeDefinitionStore(); - const definitionsIndex = useIndexBySlug(true); + const {load, loadWorkspace, loaded} = useAttributeDefinitionStore(); + const definitionsIndex = useIndexBySlug( + true, + workspaceId ? {workspaceId} : undefined + ); useEffectOnce(() => { load(); - }, [load]); + if (workspaceId) { + loadWorkspace(workspaceId); + } + }, [load, loadWorkspace, workspaceId]); const wrapValidate = (handler: () => void) => { try { diff --git a/databox/client/src/components/Media/TagFilterRule/FilterRule.tsx b/databox/client/src/components/Media/TagFilterRule/FilterRule.tsx deleted file mode 100644 index 5fbbc88192..0000000000 --- a/databox/client/src/components/Media/TagFilterRule/FilterRule.tsx +++ /dev/null @@ -1,249 +0,0 @@ -import TagSelect from '../../Form/TagSelect'; -import GroupSelect from '../../Form/GroupSelect'; -import UserSelect from '../../Form/UserSelect'; -import { - Button, - Chip, - FormGroup, - FormHelperText, - FormLabel, - Paper, -} from '@mui/material'; -import {Grid2 as Grid} from '@mui/material'; -import {Trans, useTranslation} from 'react-i18next'; -import {useForm} from 'react-hook-form'; -import {FormRow} from '@alchemy/react-form'; -import { - deleteTagFilterRule, - saveTagFilterRule, -} from '../../../api/tag-filter-rule'; -import {FormFieldErrors} from '@alchemy/react-form'; -import {TagFilterRule} from '../../../types'; -import {useDirtyFormPrompt} from '@alchemy/phrasea-framework'; -import GroupIcon from '@mui/icons-material/Group'; - -type FilterRule = { - id?: string | undefined; - include: string[]; - exclude: string[]; -} & Omit; - -export type TagFilterRuleType = 'workspace' | 'collection'; - -type Props = { - data?: FilterRule | undefined; - onCancel: () => void; - onDelete: (id?: string) => void; - onSubmit: (data: FilterRule) => void; - disabledUsers: string[]; - disabledGroups: string[]; - type: TagFilterRuleType; - workspaceId?: string; - collectionId?: string; - workspaceIdForTags: string; -}; - -export default function FilterRule({ - data, - onSubmit, - disabledGroups, - disabledUsers, - type, - onDelete, - onCancel, - workspaceId, - collectionId, - workspaceIdForTags, -}: Props) { - const {t} = useTranslation(); - - const { - handleSubmit, - control, - formState: {errors, isDirty}, - } = useForm({ - defaultValues: data, - }); - useDirtyFormPrompt(isDirty); - - const saveRule = async (data: FilterRule) => { - await saveTagFilterRule({ - ...data, - workspaceId, - collectionId, - }); - - onSubmit(data); - }; - - const deleteClick = async () => { - if ( - !window.confirm( - t( - 'filter_rule.confirm_delete_this_rule', - `Confirm delete this rule?` - ) - ) - ) { - return; - } - - const id = data!.id!; - await deleteTagFilterRule(id); - onDelete(id); - }; - - return ( -
- -
- {t('filter_rule.rule_applies_for', `Rule applies for:`)} -
- - {data?.id ? ( - - - - ) : undefined - } - label={data.username ?? data.groupName} - /> - - - ) : ( - <> - - - - {t('filter_rule.group', 'Group')} - - - - - - - {t('filter_rule.or', `or`)} - - - - - {t('filter_rule.user', 'User')} - - - - - - - )} - - - - - include`} - /> - - - - {t( - 'filter_rule.include.helper', - `Assets in this {{type}} will only be visible if they contain these tags.`, - { - type, - } - )} - - - - - - - - - - exclude`} - /> - - - - {t( - 'filter_rule.exclude.helper', - `Assets in this {{type}} will only be visible if they DOES NOT contain these tags.`, - { - type, - } - )} - - - - - - - {' '} - {' '} - {data?.id && ( - - )} - - -
-
- ); -} diff --git a/databox/client/src/components/Media/TagFilterRule/TagRules.tsx b/databox/client/src/components/Media/TagFilterRule/TagRules.tsx deleted file mode 100644 index 1130ee188f..0000000000 --- a/databox/client/src/components/Media/TagFilterRule/TagRules.tsx +++ /dev/null @@ -1,206 +0,0 @@ -import React from 'react'; -import {TagFilterRule} from '../../../types'; -import {getTagFilterRules} from '../../../api/tag-filter-rule'; -import FilterRule, {TagFilterRuleType} from './FilterRule'; -import { - Box, - Button, - Chip, - Grid2 as Grid, - IconButton, - Paper, - Tooltip, - Typography, -} from '@mui/material'; -import EditIcon from '@mui/icons-material/Edit'; -import AddIcon from '@mui/icons-material/Add'; -import {FullPageLoader} from '@alchemy/phrasea-ui'; -import GroupIcon from '@mui/icons-material/Group'; -import {useTranslation} from 'react-i18next'; -import {EntityName} from '../../../api/types.ts'; -import {createIriFromId} from '@alchemy/api'; - -type Props = { - id: string; - type: TagFilterRuleType; - workspaceId: string; -}; - -export default function TagRules({type, workspaceId, id}: Props) { - const {t} = useTranslation(); - const [rules, setRules] = React.useState(); - const [newRule, setNewRule] = React.useState(false); - const [editRule, setEditRule] = React.useState(); - - const loadRules = React.useCallback(() => { - getTagFilterRules({ - collectionId: type === 'collection' ? id : undefined, - workspaceId: type === 'workspace' ? id : undefined, - }).then(d => setRules(d.result)); - }, [type, id, workspaceId]); - - React.useEffect(() => { - loadRules(); - }, [loadRules]); - - const addRule = React.useCallback(() => { - setNewRule(true); - setEditRule(undefined); - }, []); - - const onCancel = React.useCallback(() => { - setNewRule(false); - setEditRule(undefined); - }, []); - - const onEditRule = React.useCallback((id: string) => { - setNewRule(false); - setEditRule(id); - }, []); - - const refresh = React.useCallback(() => { - onCancel(); - loadRules(); - }, [onCancel, loadRules]); - - if (!rules) { - return ; - } - - const disabledUsers = rules.filter(r => !!r.userId).map(r => r.userId!); - const disabledGroups = rules.filter(r => !!r.groupId).map(r => r.groupId!); - - return ( - <> - - {t('tag_rules.tag_rules', `Tag rules`)} - -
- {newRule && ( - - )} - {!newRule && ( -
- -
- )} -
- {rules!.map((r: TagFilterRule) => { - if (editRule === r.id) { - return ( - - - createIriFromId( - EntityName.Tag, - i.id - ) - ), - exclude: r.exclude.map(i => - createIriFromId( - EntityName.Tag, - i.id - ) - ), - }} - type={type} - workspaceIdForTags={workspaceId} - onDelete={refresh} - onSubmit={refresh} - onCancel={onCancel} - disabledUsers={disabledUsers} - disabledGroups={disabledGroups} - /> - - ); - } else { - return ( - - - - - ) : undefined - } - label={ - r.username ?? r.groupName - } - /> - - - - {r.include.map(t => ( - - ))} - - - {r.exclude.map(t => ( - - ))} - - - - - - onEditRule(r.id) - } - > - - - - - - - ); - } - })} -
-
- - ); -} diff --git a/databox/client/src/types.ts b/databox/client/src/types.ts index 46a6a0633f..7549e0a69a 100644 --- a/databox/client/src/types.ts +++ b/databox/client/src/types.ts @@ -330,15 +330,11 @@ export interface IPermissions< capabilities: TPermission; } -export interface TagFilterRule extends ApiHydraObjectResponse, Entity { - userId?: string; - username?: string; - groupId?: string; - groupName?: string; +export interface AttributeFilterRule extends ApiHydraObjectResponse, Entity { + users: {id: string; name: string}[]; + groups: {id: string; name: string}[]; workspaceId?: string; - collectionId?: string; - include: Tag[]; - exclude: Tag[]; + condition: string; } export type KeyTranslations = { diff --git a/databox/client/translations/de.json b/databox/client/translations/de.json index 24656030c5..46c63f59d2 100644 --- a/databox/client/translations/de.json +++ b/databox/client/translations/de.json @@ -1,23 +1,6 @@ { - "locale": { - "current": "Deutsch", - "switcher": { - "app_languages": "Sprachen", - "change_data_locale": { - "modal": { - "confirm": "Weiter", - "title": "Seite wird neu geladen" - } - }, - "data_languages": "Sprache der Daten", - "data_locale": { - "default": "Standard", - "default_description": "UI-Sprache verwenden" - }, - "filter_placeholder": "Suchen...", - "title": "Sprache ändern" - } - }, + "Already <1>bold.": "Schon <1>bold.", + "Already translated": "Bereits übersetzt", "acl": { "delete": "Löschen", "form": { @@ -28,23 +11,11 @@ "placeholder": "Gruppe wählen" } }, - "table": { - "cols": { - "user_group": "Benutzer/Gruppe" - } + "parent": { + "show": "Elternberechtigungen anzeigen {{name}} " }, "permission": { - "create": "Erstellen", - "delete": "Löschen", - "edit": "Bearbeiten", - "manage_collection": "Verwalten", - "master": "Master", - "operator": "Operator", - "owner": "Besitzer", - "share": "Teilen", - "undelete": "Wiederherstellen", "all": "Alle", - "view": "Ansehen", "asset": { "delete": { "desc": "Ermöglicht das Löschen dieses Assets.", @@ -71,6 +42,15 @@ "label": "Ansehen" } }, + "child_create": "Unterelemente erstellen", + "child_delete": "Unterelemente löschen", + "child_edit": "Unterelemente bearbeiten", + "child_master": "Unter-Master", + "child_operator": "Unter-Operator", + "child_owner": "Unter-Besitzer", + "child_share": "Unterelemente teilen", + "child_undelete": "Unterelemente wiederherstellen", + "child_view": "Unterelemente ansehen", "collection": { "assets_operator": { "desc": "Ermöglicht Verwaltungsaktionen für Assets ({{manage_asset_desc}}) in der Kollektion und in untergeordneten Kollektionen.", @@ -130,6 +110,9 @@ "desc": "Titel oder Tags bearbeiten, zu einer anderen Kollektion verschieben, Renditions bearbeiten, Dateiversionen anzeigen" } }, + "create": "Erstellen", + "delete": "Löschen", + "edit": "Bearbeiten", "integration": { "child_edit": { "desc": "Ermöglicht die Interaktion mit der Integration, z. B. das Ausführen oder Verwenden in einem Workflow, ohne die Konfiguration zu bearbeiten oder zu löschen.", @@ -148,6 +131,10 @@ "label": "Ansehen" } }, + "manage_collection": "Verwalten", + "master": "Master", + "operator": "Operator", + "owner": "Besitzer", "rendition_policy": { "child_edit": { "desc": "Bearbeiten Sie die Rendition dieser Richtlinie.", @@ -158,6 +145,9 @@ "label": "Ansehen" } }, + "share": "Teilen", + "undelete": "Wiederherstellen", + "view": "Ansehen", "workspace": { "assets_operator": { "desc": "Ermöglicht Verwaltungsaktionen für Assets ({{manage_asset_desc}}) im Workspace-Root.", @@ -211,60 +201,60 @@ "desc": "Ermöglicht die Anzeige aller Assets im Workspace, aber nicht unbedingt der Kollektionen, zu denen sie gehören.", "label": "Assets ansehen" } - }, - "child_create": "Unterelemente erstellen", - "child_delete": "Unterelemente löschen", - "child_edit": "Unterelemente bearbeiten", - "child_master": "Unter-Master", - "child_operator": "Unter-Operator", - "child_owner": "Unter-Besitzer", - "child_share": "Unterelemente teilen", - "child_undelete": "Unterelemente wiederherstellen", - "child_view": "Unterelemente ansehen" + } }, - "parent": { - "show": "Elternberechtigungen anzeigen {{name}} " + "table": { + "cols": { + "user_group": "Benutzer/Gruppe" + } + } + }, + "annotation": { + "type": { + "arrow": "Pfeil", + "circle": "Kreis", + "cue": "Marker", + "draw": "Zeichnen", + "line": "Linie", + "rectangle": "Rechteck", + "target": "Ziel", + "text": "Text", + "timerange": "Zeitbereich" + } + }, + "annotations": { + "delete_shape": { + "confirm": "Wollen Sie diese Form wirklich löschen?" + } + }, + "appbar": { + "assets": "Assets", + "pages": "Seiten" + }, + "aql": { + "constant": { + "no": "Nein", + "null": "Null", + "yes": "Ja" } }, "asset": { - "delete": { - "confirm": { - "message_one": "Möchten Sie dieses Asset wirklich löschen?", - "message_other": "Möchten Sie diese Assets wirklich löschen?", - "title": "Löschen bestätigen", - "not_allowed": "Sie sind nicht berechtigt, eines dieser Assets zu löschen", - "text_to_type": { - "delete": "Löschen" - } - }, - "confirm_message_one": "Möchten Sie {{count}} Asset wirklich löschen?", - "confirm_message_other": "Möchten Sie {{count}} Assets wirklich löschen?", - "hard_delete_one": "Asset dauerhaft löschen", - "hard_delete_other": "{{count}} Assets dauerhaft löschen", - "remove_from_collection": "Aus Kollektion {{name}} entfernen", - "shared_warning_one": "Dieser Asset ist zurzeit freigegeben. Beim Löschen wird allen Benutzern der Zugriff entzogen.", - "shared_warning_other": "{{count}} dieser Assets sind zurzeit freigegeben. Beim Löschen wird allen Benutzern der Zugriff entzogen.", - "confirm_hard_delete_message_one": "Möchten Sie wirklich diesen Asset dauerhaft löschen? Diese Aktion kann nicht rückgängig gemacht werden.", - "confirm_hard_delete_message_other": "Möchten Sie wirklich diese Assets dauerhaft löschen? Diese Aktion kann nicht rückgängig gemacht werden.", - "confirm_move_to_trash_message_one": "Möchten Sie wirklich diesen Asset in den Papierkorb verschieben?", - "confirm_move_to_trash_message_other": "Möchten Sie wirklich {{count}} Assets in den Papierkorb verschieben?", - "move_to_trash_one": "Asset in den Papierkorb verschieben", - "move_to_trash_other": "{{count}} Assets in den Papierkorb verschieben", - "remove_from_story": "Aus der Story {{name}} entfernen" - }, "actions": { + "copy": "Kopieren", "delete": "Löschen", "download": "Download", "edit": "Bearbeiten", "edit_attributes": "Attribute bearbeiten", - "open": "Öffnen", - "save_as": "Speichern unter", - "replace_source_file": "Quelldatei ersetzen", - "copy": "Kopieren", "info": "Informationen", "move": "Verschieben", - "share": "Teilen", - "restore": "Wiederherstellen" + "open": "Öffnen", + "replace_source_file": "Quelldatei ersetzen", + "restore": "Wiederherstellen", + "save_as": "Speichern unter", + "share": "Teilen" + }, + "chip": { + "deleted": "Gelöscht" }, "collection_list": { "collections_one": "+ {{count}} Kollektion", @@ -274,21 +264,49 @@ "others_other": "+ {{count}} anderen", "others_plural": "+ {{count}} andere" }, + "delete": { + "confirm": { + "message_one": "Möchten Sie dieses Asset wirklich löschen?", + "message_other": "Möchten Sie diese Assets wirklich löschen?", + "not_allowed": "Sie sind nicht berechtigt, eines dieser Assets zu löschen", + "text_to_type": { + "delete": "Löschen" + }, + "title": "Löschen bestätigen" + }, + "confirm_hard_delete_message_one": "Möchten Sie wirklich diesen Asset dauerhaft löschen? Diese Aktion kann nicht rückgängig gemacht werden.", + "confirm_hard_delete_message_other": "Möchten Sie wirklich diese Assets dauerhaft löschen? Diese Aktion kann nicht rückgängig gemacht werden.", + "confirm_message_one": "Möchten Sie {{count}} Asset wirklich löschen?", + "confirm_message_other": "Möchten Sie {{count}} Assets wirklich löschen?", + "confirm_move_to_trash_message_one": "Möchten Sie wirklich diesen Asset in den Papierkorb verschieben?", + "confirm_move_to_trash_message_other": "Möchten Sie wirklich {{count}} Assets in den Papierkorb verschieben?", + "hard_delete_one": "Asset dauerhaft löschen", + "hard_delete_other": "{{count}} Assets dauerhaft löschen", + "move_to_trash_one": "Asset in den Papierkorb verschieben", + "move_to_trash_other": "{{count}} Assets in den Papierkorb verschieben", + "remove_from_collection": "Aus Kollektion {{name}} entfernen", + "remove_from_story": "Aus der Story {{name}} entfernen", + "shared_warning_one": "Dieser Asset ist zurzeit freigegeben. Beim Löschen wird allen Benutzern der Zugriff entzogen.", + "shared_warning_other": "{{count}} dieser Assets sind zurzeit freigegeben. Beim Löschen wird allen Benutzern der Zugriff entzogen." + }, + "es_document": { + "sync_now": "Jetzt synchronisieren" + }, "info": { - "id": "ID", - "last_attribute_modification_date": "Datum der letzten Attributänderung", - "last_modification_date": "Datum der letzten Änderung", - "owner": "Besitzer", - "created_at": "Erstellt am", "collection": "Kollektion", "collections": { "none": "Keine" }, - "workspace": "Workspace", + "created_at": "Erstellt am", + "id": "ID", + "last_attribute_modification_date": "Datum der letzten Attributänderung", + "last_modification_date": "Datum der letzten Änderung", + "owner": "Besitzer", "source_file": { "label": "Quelldatei", "none": "Keine" - } + }, + "workspace": "Workspace" }, "manage": { "acl": { @@ -301,6 +319,9 @@ "edit": { "title": "Bearbeiten" }, + "es_doc": { + "title": "ES Dokument" + }, "info": { "title": "Informationen" }, @@ -314,22 +335,30 @@ "title": "Renditions" }, "title": "Asset {{name}} verwalten", - "es_doc": { - "title": "ES Dokument" - }, "workflow": { "title": "Workflow" } }, + "not_found": "Asset nicht gefunden", "operations": { + "last_asset_workflows": "Letzte Asset-Workflows", "trigger_workflow_again": "Workflow erneut auslösen", "view": "Ansehen", - "you_need_to_run_integrations_again": "Müssen Sie die Integrationen erneut durchführen?", - "last_asset_workflows": "Letzte Asset-Workflows" + "you_need_to_run_integrations_again": "Müssen Sie die Integrationen erneut durchführen?" }, "replace": { "label": "Ersetzen" }, + "restore": { + "confirm": { + "title": "Wiederherstellung bestätigen" + }, + "confirm_message_one": "Sind Sie sicher, dass Sie diesen Asset wiederherstellen möchten?", + "confirm_message_other": "Sind Sie sicher, dass Sie {{count}} Assets wiederherstellen möchten?", + "deleted_collection": "Wiederherstellen", + "deleted_collection_or_story_warning": "Hinweis: Einige Assets können nicht wiederhergestellt werden, da ihre Referenzkollektionen oder Stories gelöscht wurden:", + "no_restorable_assets": "Kein einziger der ausgewählten Assets kann wiederhergestellt werden, da ihre Referenzkollektionen gelöscht wurden." + }, "tag_list": { "others_one": "+ {{count}} andere", "others_other": "+ {{count}} anderen", @@ -339,20 +368,17 @@ "tags_plural": "+ {{count}} Tag" }, "view": { - "attributes": "Asset Attribute", - "discussion": "Diskussion", - "info": "Information", - "appears_in": "Erscheint in", "add_attachment": "Anhang hinzufügen", + "appears_in": "Erscheint in", "attachments": "Anhänge", + "attributes": "Asset Attribute", "delete_attachment": { + "button": "Anhang löschen", "confirm_button": "Löschen", "confirm_message": "Möchten Sie diesen Anhang wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", "confirm_title": "Anhang löschen", - "button": "Anhang löschen", "success_toast": "Anhang wurde erfolgreich gelöscht" }, - "rename_attachment": "Anhang umbenennen", "detach_attachment": { "button": "Von Asset trennen", "confirm_button": "Trennen", @@ -360,44 +386,42 @@ "confirm_title": "Von Asset trennen", "success_toast": "Anhang wurde erfolgreich getrennt" }, + "discussion": "Diskussion", + "info": "Information", "metrics": { "not_configured": "Matomo Analytics ist nicht konfiguriert.", "title": "Metriken" - } - }, - "es_document": { - "sync_now": "Jetzt synchronisieren" - }, - "not_found": "Asset nicht gefunden", - "chip": { - "deleted": "Gelöscht" - }, - "restore": { - "confirm": { - "title": "Wiederherstellung bestätigen" }, - "confirm_message_one": "Sind Sie sicher, dass Sie diesen Asset wiederherstellen möchten?", - "confirm_message_other": "Sind Sie sicher, dass Sie {{count}} Assets wiederherstellen möchten?", - "deleted_collection": "Wiederherstellen", - "deleted_collection_or_story_warning": "Hinweis: Einige Assets können nicht wiederhergestellt werden, da ihre Referenzkollektionen oder Stories gelöscht wurden:", - "no_restorable_assets": "Kein einziger der ausgewählten Assets kann wiederhergestellt werden, da ihre Referenzkollektionen gelöscht wurden." + "rename_attachment": "Anhang umbenennen" } }, "asset_actions": { "copy": "Kopieren", "delete": "Löschen", + "delete_permanently": "Dauerhaft löschen", "download": "Download", "edit": "Bearbeiten", "edit_attributes": "Attribute bearbeiten", "export": "Exportieren", "move": "Verschieben", + "restore": "Wiederherstellen", "select_all": "Alles auswählen", "share": "Teilen", - "substitute_file": "Datei ersetzen", - "unselect_all": "Alle abwählen", "share_multiple": "Sie können jeweils nur ein Asset teilen", - "delete_permanently": "Dauerhaft löschen", - "restore": "Wiederherstellen" + "substitute_file": "Datei ersetzen", + "unselect_all": "Alle abwählen" + }, + "asset_collections": { + "other_collections": "Es erscheint auch als Verknüpfung in den folgenden Kollektionen:", + "reference_collection": "Dieses Asset gehört zur Kollektion {{collection}} im Workspace {{workspace}}.", + "reference_workspace": "Dieses Asset gehört zum Workspace {{workspace}} Root - Kollection.", + "remove_shortcut": "Verknüpfung entfernen", + "remove_shortcut_confirm": "Sind Sie sicher, dass Sie diese Verknüpfung entfernen möchten?", + "title": "Kollektionen" + }, + "asset_delete": { + "confirm": "Sind Sie sicher, dass Sie dieses Asset löschen möchten?", + "title": "Asset löschen" }, "asset_dropzone": { "drop_the_files_here": "Legen Sie die Dateien hier ab…", @@ -406,6 +430,10 @@ "asset_file_versions": { "current": "Aktuell" }, + "asset_restore": { + "confirm": "Möchten Sie dieses Asset wirklich wiederherstellen?", + "title": "Asset wiederherstellen" + }, "asset_selection": { "item": "Element", "x_item_one": "{{count}} Asset", @@ -413,33 +441,75 @@ "x_item_with_selection_one": "{{selection}} / {{total}} Asset", "x_item_with_selection_other": "{{selection}} / {{total}} Assets" }, - "attribute": { - "editor": { - "tabs": { - "preview": { - "no_asset": "Kein Asset ausgewählt", - "title": "Vorschau" - }, - "values": { - "title": "Werte" - } - } - }, - "type": { - "size": { - "unit": { - "bytes": "{{value}} Bytes" - } - } - } - }, - "attribute_definitions": { - "new": { - "label": "Neues Attribut" + "asset_type": { + "choice": { + "asset": "Assets", + "asset_only": "Nur Assets", + "both": "Beide", + "story": "Stories", + "story_only": "Nur Stories" + } + }, + "asset_version": { + "delete": "Version löschen" + }, + "asset_version_delete": { + "confirm": "Möchten Sie diese Version wirklich löschen?", + "confirmed": "Version wurde gelöscht!" + }, + "asset_view": { + "edit_asset": "Asset {{name}}" + }, + "attachment": { + "dialog": { + "add": { + "submit": "Anhängen", + "success": "Neuer Anhang wurde hinzugefügt.", + "title": "Anhang zum Asset hinzufügen" + } + } + }, + "attribute": { + "editor": { + "tabs": { + "preview": { + "no_asset": "Kein Asset ausgewählt", + "title": "Vorschau" + }, + "values": { + "title": "Werte" + } + } + }, + "type": { + "size": { + "unit": { + "bytes": "{{value}} Bytes" + } + } + } + }, + "attributeList": { + "choose_modal": { + "title": "Aktuelle Attributliste auswählen" + }, + "create_button": { + "label": "Neue Attributliste erstellen" }, + "default": { + "title": "Meine Attributliste" + }, + "delete": { + "confirm": "Sind Sie sicher, dass Sie diese Attributliste löschen möchten?" + } + }, + "attribute_definitions": { "filter": { "asset_type": "Nach Asset-Typ filtern", "type": "Nach Typ filtern" + }, + "new": { + "label": "Neues Attribut" } }, "attribute_editor": { @@ -455,9 +525,9 @@ } }, "discard_changes": { - "title": "Änderungen verwerfen?", "confirm": "Ja, verwerfen", - "desc": "Alle Änderungen, die Sie an Assets vorgenommen haben, werden nicht übernommen und verworfen." + "desc": "Alle Änderungen, die Sie an Assets vorgenommen haben, werden nicht übernommen und verworfen.", + "title": "Änderungen verwerfen?" }, "remove_from_selection": "Aus der Auswahl entfernen", "save": { @@ -476,6 +546,14 @@ } }, "attribute_entity": { + "delete": { + "confirm": { + "assertion": { + "delete_attr_def": "Ich verstehe, dass diese Attributdefinition \"{{ definitionName }}\" aus allen Assets, die sie verwenden, gelöscht wird.", + "unset_on_attrs": "Ich verstehe, dass diese Entität aus allen Assets, die sie verwenden, gelöscht wird." + } + } + }, "dialog": { "create": { "title": "Neues Element" @@ -486,14 +564,29 @@ }, "new": { "label": "Neue Entität" + } + }, + "attribute_list": { + "manage": { + "acl": { + "title": "Berechtigungen" + }, + "edit": { + "title": "Bearbeiten" + }, + "organize": { + "title": "Organisieren" + }, + "title": "Attributliste {{name}} verwalten" }, - "delete": { - "confirm": { - "assertion": { - "delete_attr_def": "Ich verstehe, dass diese Attributdefinition \"{{ definitionName }}\" aus allen Assets, die sie verwenden, gelöscht wird.", - "unset_on_attrs": "Ich verstehe, dass diese Entität aus allen Assets, die sie verwenden, gelöscht wird." - } - } + "organize": { + "add_divider": "Trenner hinzufügen", + "add_spacer": "Abstand hinzufügen" + } + }, + "attribute_policy": { + "new": { + "label": "Neue Richtlinie" } }, "attributes": { @@ -511,14 +604,20 @@ "face_n": "Gesicht # {{n}}", "faces": "Gesichter", "labels": "Labels", - "no_text_detected": "Es wurde kein Text erkannt", - "text": "Text", "no_face_detected": "Kein Gesicht erkannt", "no_label_detected": "Keine Labels erkannt", + "no_text_detected": "Es wurde kein Text erkannt", + "text": "Text", "texts": "Texte" } }, "basket": { + "actions": { + "delete": "Korb löschen", + "edit": "Korb bearbeiten" + }, + "added_to_basket_one": "{{count}} Artikel zum Korb hinzugefügt", + "added_to_basket_other": "{{count}} Artikel zum Korb hinzugefügt", "choose_modal": { "title": "Wählen Sie den aktuellen Korb" }, @@ -528,6 +627,9 @@ "default": { "title": "Mein Korb" }, + "disabled": { + "label": "Sie sind nicht berechtigt, diesen Korb zu ändern." + }, "info": { "creation_date": "Erstellungsdatum", "id": "ID", @@ -538,6 +640,9 @@ "edit": "Diesen Korb bearbeiten" }, "manage": { + "acl": { + "title": "Berechtigungen" + }, "edit": { "title": "Bearbeiten" }, @@ -550,35 +655,45 @@ "operations": { "title": "Operationen" }, - "title": "Korb verwalten {{name}}", - "acl": { - "title": "Berechtigungen" - } - }, - "actions": { - "delete": "Korb löschen", - "edit": "Korb bearbeiten" - }, - "disabled": { - "label": "Sie sind nicht berechtigt, diesen Korb zu ändern." - }, - "added_to_basket_one": "{{count}} Artikel zum Korb hinzugefügt", - "added_to_basket_other": "{{count}} Artikel zum Korb hinzugefügt" + "title": "Korb verwalten {{name}}" + } }, "basket_delete": { - "title": "Korb löschen", - "confirm": "Wollen Sie diesen Korb sicher löschen?" + "confirm": "Wollen Sie diesen Korb sicher löschen?", + "title": "Korb löschen" }, "basket_view_dialog": { + "info": "Informationen", + "integrations": "Integrationen", "item": "Element", "remove_from_basket": "Aus dem Korb entfernen", + "title": "Korb {{name}} ", "x_item_one": "{{count}} Element", "x_item_other": "{{count}} Elemente", "x_item_with_selection_one": "{{selection}} / {{total}} Element", - "x_item_with_selection_other": "{{selection}} / {{total}} Elemente", - "info": "Informationen", - "integrations": "Integrationen", - "title": "Korb {{name}} " + "x_item_with_selection_other": "{{selection}} / {{total}} Elemente" + }, + "built_in_attr": { + "collection": "Kollektion", + "collections": "Kollektionen", + "createdAt": "Erstellt am", + "deleted": "Gelöscht", + "editedAt": "Bearbeitet am", + "fileExtension": "Dateierweiterung", + "fileMimeType": "MIME Typ Datei", + "fileSize": "Dateigrösse", + "fileType": "Dateityp", + "filename": "Dateiname", + "has_source": "Hat Quelldatei", + "id": "ID", + "isStory": "Story", + "owner": "Besitzer", + "privacy": "Datenschutz", + "rendition": "Rendition", + "score": "Score", + "stories": "Stories", + "tag": "Tag", + "workspace": "Workspace" }, "change_theme": { "save": "Speichern", @@ -591,19 +706,29 @@ "read_only": "Schreibgeschützt" }, "collection": { + "acl": { + "parent": { + "collection": "Berechtigungen für {{name}} ", + "story": "Berechtigungen für Story {{name}} ", + "workspace": "Berechtigungen für Workspace {{name}} " + } + }, + "delete": { + "confirm_message": "Sind Sie sicher, dass Sie die Kollektion löschen möchten?" + }, "info": { + "absolute_path": "Absoluter Pfad", "creation_date": "Erstellungsdatum", "id": "ID", "modification_date": "Datum der Änderung", "owner": "Besitzer", - "absolute_path": "Absoluter Pfad", "workspace": "Workspace" }, "item": { "create_asset": "Neues Asset zur Kollektion hinzufügen", - "edit": "Diese Kollektion bearbeiten", "create_collection": "Neue Kollektion in dieser erstellen", "delete": "Löschen", + "edit": "Diese Kollektion bearbeiten", "notifications": "Benachrichtigungen", "restore": "Wiederherstellen" }, @@ -614,25 +739,22 @@ "edit": { "title": "Bearbeiten" }, + "es_doc": { + "title": "ES Dokument" + }, "info": { "title": "Informationen" }, + "notifications": { + "title": "Benachrichtigungen" + }, "operations": { "title": "Operationen" }, "tag_rules": { "title": "Regeln für Tags" }, - "title": "Kollektion {{name}} verwalten", - "es_doc": { - "title": "ES Dokument" - }, - "notifications": { - "title": "Benachrichtigungen" - } - }, - "delete": { - "confirm_message": "Sind Sie sicher, dass Sie die Kollektion löschen möchten?" + "title": "Kollektion {{name}} verwalten" }, "restore": { "confirm": { @@ -640,59 +762,59 @@ }, "confirm_message": "Möchten Sie die Kollektion wirklich wiederherstellen?" }, - "acl": { - "parent": { - "collection": "Berechtigungen für {{name}} ", - "story": "Berechtigungen für Story {{name}} ", - "workspace": "Berechtigungen für Workspace {{name}} " - } - }, "tree_view": { "new_collection": "Neue Kollektion" } }, "collection_delete": { - "title": "Kollektion löschen", "confirm": "Wollen Sie diese Kollektion sicher löschen?", - "confirmed": "Kollektion wurde gelöscht!" + "confirmed": "Kollektion wurde gelöscht!", + "title": "Kollektion löschen" }, "collection_move": { "intro": "Wählen Sie das Ziel aus, an das diese Kollektion verschoben werden soll:", - "title": "Kollektion verschieben", "move": { "label": "Kollektion verschieben" - } + }, + "title": "Kollektion verschieben" + }, + "collection_panel": { + "trash": "Papierkorb" + }, + "collection_restore": { + "confirmed": "Kollektion wurde wiederhergestellt!", + "title": "Kollektion wiederherstellen" }, "common": { "cancel": "Abbrechen", + "close": "Schliessen", + "confirm": "Bestätigen", "copy": "Kopieren", "databox": "Databox", "delete": "Löschen", + "edit": "Bearbeiten", + "id": "ID", "item_sorted": "Reihenfolge gespeichert!", "loading": "Wird geladen…", "no": "Nein", "or": "Oder", "remove": "Entfernen", + "revoke": "Widerrufen", "save": "Speichern", "search": { - "submit": "Suchen", - "placeholder": "Suchen…" + "placeholder": "Suchen…", + "submit": "Suchen" }, "uploading": "Wird hochgeladen…", - "yes": "Ja", - "close": "Schliessen", - "edit": "Bearbeiten", - "revoke": "Widerrufen", - "id": "ID", - "confirm": "Bestätigen" + "yes": "Ja" }, "copy_assets": { "dialog": { "intro": "Wo möchten Sie die ausgewählten Assets kopieren?", "submit": "Kopieren", - "title_plural": "{{count}} Assets kopieren", "title_one": "{{count}} Asset kopieren", - "title_other": "{{count}} Assets kopieren" + "title_other": "{{count}} Assets kopieren", + "title_plural": "{{count}} Assets kopieren" }, "form": { "by_reference": { @@ -706,9 +828,32 @@ } } }, + "copy_assets_dialog": { + "assets_were_copied": "Assets wurden kopiert" + }, "copy_toclipboard": { "copied": "In die Zwischenablage kopiert!" }, + "create_share_link": { + "dialog": { + "submit": "Link erstellen", + "title": "Freigabelink erstellen" + }, + "form": { + "expiresAt": { + "helper": "Optional. Wenn aktiviert, ist der Freigabelink nur bis zu diesem Zeitpunkt aktiv.", + "label": "Läuft ab am" + }, + "startsAt": { + "helper": "Optional. Wenn aktiviert, ist der Freigabelink erst nach Ablauf dieser Zeit aktiv.", + "label": "Beginnt um" + }, + "title": { + "helper": "Sie können die Zielgruppe dieses Freigabelinks benennen", + "label": "Titel" + } + } + }, "danger_zone": "Gefahrenzone", "date_histogram_facet": { "clear_filter": "Filter löschen" @@ -723,11 +868,11 @@ "saved": "Gespeichert!" }, "delete": { - "collection": { - "confirmed": "Die Kollektion wurde entfernt!" - }, "basket": { "confirmed": "Der Korb wurde entfernt!" + }, + "collection": { + "confirmed": "Die Kollektion wurde entfernt!" } }, "dialog": { @@ -739,188 +884,570 @@ "intro": "Bitte geben Sie zur Bestätigung „{{ text }}“ ein:", "placeholder": "Geben Sie „{{ text }}“ ein" }, - "reset": "Zurücksetzen", - "save": "Speichern", - "search": "Suchen", "export_attribute_entities": { + "all_locales": "Alle Locales", "copy_code": "Code kopieren", "format": "Format", "locale": "Locale", "select_format": "Wählen Sie ein Format aus", "select_locale": "Locale auswählen", "title": "Attribut-Entitäten exportieren", - "all_locales": "Alle Locales", "values": { "helper_text": "Geben Sie einen Attributentitätswert pro Zeile ein.", "label": "Werte" } }, - "ok": "OK", "import_attribute_entities": { "import_button": "Importieren", "title": "Attribut-Entitäten nach {{list}} importieren", "toast": { "success": "Attributentitäten wurden erfolgreich importiert." } - } + }, + "ok": "OK", + "reset": "Zurücksetzen", + "save": "Speichern", + "search": "Suchen" }, "edit_sort_by": { - "group_by_sections": "Nach Abschnitten gruppieren", - "add_group_separators_between_results": "Gruppentrennzeichen zwischen Ergebnissen hinzufügen" - }, - "editor_panel": { - "untranslated": "Nicht übersetzt" + "add_group_separators_between_results": "Gruppentrennzeichen zwischen Ergebnissen hinzufügen", + "group_by_sections": "Nach Abschnitten gruppieren" }, - "export": { - "dialog": { - "intro": "Wählen Sie die Renditions aus, die Sie exportieren möchten:", - "submit": "Exportieren", - "title_one": "{{count}} Asset exportieren", - "title_other": "{{count}} Assets exportieren", - "title_plural": "{{count}} Assets exportieren" - } - }, - "expose_basket_integration": { - "also_delete_the_publication": "Löschen Sie auch die Veröffentlichung", - "authorize": "Berechtigen", - "force_sync": "Synchronisierung erzwingen", - "ok": "OK", - "stop_synchronization": "Synchronisierung beenden?", - "sync_with_a_publication": "Mit einer Veröffentlichung synchronisieren", - "edit_publication": "Veröffentlichung bearbeiten" - }, - "face_detail_tooltip": { - "age_range": "Altersspanne", - "eyeglasses": "Brillen", - "eyes_open": "offene Augen", - "gender": "Geschlecht", - "has_a_beard": "Hat einen Bart", - "mouth_open": "Mund offen", - "mustache": "Schnurrbart", - "smiling": "Lächelnd" - }, - "facets": { - "missing_with_total": "Fehlt ({{total}})" - }, - "filter": { - "exclude": "Ausschließen ", - "is_missing": "{{title}} fehlt" - }, - "filter_rule": { - "confirm_delete_this_rule": "Bestätigen, diese Regel zu löschen?", - "exclude": { - "helper": "Assets in diesem {{type}} sind nur sichtbar, wenn sie diese Tags NICHT enthalten.", - "label": "Tags zum ausschliessen" - }, - "group": "Gruppe", - "include": { - "helper": "Assets in diesem {{type}} sind nur sichtbar, wenn sie diese Tags enthalten.", - "label": "Tags zum einfügen" - }, - "or": "Oder", - "rule_applies_for": "Regel gilt für:", - "user": "Benutzer" - }, - "foo": "Bar", - "form": { - "asset": { - "tags": { - "label": "Tags" + "editor": { + "format": { + "alignCenter": "Zentriert", + "alignJustify": "Blocksatz", + "alignLeft": "Linksbündig", + "alignRight": "Rechtsbündig", + "blockQuote": "Blockzitat", + "block_type": { + "heading": { + "label": "Überschrift {{number}}" + }, + "paragraph": { + "label": "Normal" + } }, - "templates": { - "label": "Mit Vorlage füllen", - "no_options": "Keine Vorlagen verfügbar" + "bold": "Fett", + "bulletList": "Aufzählung", + "clear": "Format löschen", + "code": "Code", + "codeBlock": "Code-Block", + "fontFamily": { + "label": "Schriftart" }, - "title": { - "label": "Titel" - } - }, - "asset_create": { - "title": "Asset erstellen in", - "title_with_parent": "Asset erstellen unter" + "italic": "Kursiv", + "link": "Link", + "orderedList": "Nummerierte Liste", + "redo": "Wiederholen", + "save": "Speichern", + "strikethrough": "Durchschlagen", + "underline": "Unterstreichen", + "undo": "Rückgängig", + "view": "Ansehen" }, - "asset_edit": { - "success": "Asset bearbeitet!" + "link": { + "dialog": { + "dialog_title": "Link einfügen", + "remove": { + "label": "Link entfernen" + }, + "target": { + "blank": { + "label": "Neuer Tab" + }, + "label": "Link öffnen in", + "self": { + "label": "Gleicher Tab" + } + }, + "title": { + "label": "Titel (optional)" + }, + "url": { + "label": "URL" + } + } }, - "attribute": { - "collection": { - "item_add": "{{name}} hinzufügen", - "item_remove": "entfernen" + "menu": { + "colors": { + "backgroundColor": "Hintergrundfarbe", + "textColor": "Textfarbe" } }, - "attribute_definition": { - "allowInvalid": { - "label": "Ungültige Werte zulassen" - }, - "field_type": { - "label": "Typ des Feldes" - }, - "multiple": { - "label": "Mehrere Werte" - }, - "name": { - "label": "Name", - "translate": { - "title": "Übersetzung" - } - }, - "searchable": { - "label": "Durchsuchbar" - }, - "slug": { - "label": "Slug" + "widgets": { + "asset": { + "options": { + "assetId": { + "label": "Asset-ID" + }, + "borderRadius": { + "label": "Randradius (px)" + }, + "gap": { + "label": "Lücke" + }, + "imagePosition": { + "bottom": "Unten", + "label": "Bildposition", + "left": "Links", + "right": "Rechts", + "top": "Oben" + }, + "maxHeight": { + "label": "Max. Höhe (px)" + }, + "maxWidth": { + "label": "Maximale Breite (px)" + }, + "position": { + "fixed": "Fixiert", + "label": "Bildposition", + "static": "Statisch" + }, + "title": { + "label": "Titel" + } + }, + "title": "Asset" }, - "suggest": { - "label": "In Suchvorschlägen anzeigen" + "carousel": { + "options": { + "backgroundColor": { + "label": "Hintergrundfarbe" + }, + "cover": { + "label": "Covermodus" + }, + "height": { + "label": "Höhe (px)" + }, + "maxItems": { + "label": "Max. Anzahl Elemente" + }, + "openAsset": { + "label": "Asset per Klick öffnen" + }, + "searchId": { + "label": "Gespeicherte Suche" + } + }, + "title": "Bild-Slider" }, - "translatable": { - "label": "Übersetzbar" + "footer": { + "options": { + "add_link": "Link hinzufügen", + "backgroundColor": { + "label": "Hintergrundfarbe" + }, + "link_label": { + "label": "Titel" + }, + "link_url": { + "label": "URL" + }, + "links": { + "label": "Links" + }, + "textColor": { + "label": "Textfarbe" + } + }, + "title": "Fußzeile" }, - "policy": { - "label": "Richtlinie" + "grid": { + "options": { + "backgroundColor": { + "label": "Hintergrundfarbe" + }, + "gap": { + "label": "Lücke" + }, + "maxItems": { + "label": "Max. Anzahl Elemente" + }, + "openAsset": { + "label": "Asset per Klick öffnen" + }, + "searchId": { + "label": "Gespeicherte Suche" + }, + "size": { + "label": "Größe (px)" + } + }, + "title": "Gitter" }, - "entityList": { - "label": "Entitätsliste" + "header_bar": { + "options": { + "add_link": "Link hinzufügen", + "link_label": { + "label": "Titel" + }, + "link_url": { + "label": "URL" + }, + "links": { + "label": "Links" + } + }, + "title": "Kopfleiste" }, - "editableInGui": { - "label": "In der Benutzeroberfläche bearbeitbar" + "remove_widget": "Widget entfernen", + "search_grid": { + "options": { + "actions": { + "basket": { + "label": "Zum Korb hinzufügen" + }, + "copy": { + "label": "Kopieren" + }, + "delete": { + "label": "Löschen" + }, + "edit": { + "label": "Bearbeiten" + }, + "export": { + "label": "Exportieren" + }, + "info": { + "label": "Informationen" + }, + "label": "Aktionen", + "move": { + "label": "Verschieben" + }, + "open": { + "label": "Öffnen" + }, + "replace": { + "label": "Ersetzen" + }, + "restore": { + "label": "Wiederherstellen" + }, + "share": { + "label": "Teilen" + } + }, + "containerHeight": { + "label": "Behälterhöhe (px)" + }, + "displayFacets": { + "label": "Facetten anzeigen" + }, + "maxItems": { + "label": "Max. Anzahl Elemente" + }, + "openAsset": { + "label": "Asset per Klick öffnen" + }, + "searchId": { + "label": "Gespeicherte Suche" + }, + "size": { + "label": "Größe (px)" + } + }, + "title": "Rasteransicht" + }, + "spacer": { + "options": { + "spacing": { + "label": "Abstand" + } + }, + "title": "Abstandshalter" + }, + "unknown": "Unbekannter Widget-Typ" + } + }, + "editor_panel": { + "untranslated": "Nicht übersetzt" + }, + "entity_type": { + "definitions": { + "count_one": "Verwendet in {{ count }} Attributdefinition", + "count_other": "Verwendet in {{ count }} Attributdefinitionen", + "none": "Keine Verwendung von Attributdefinitionen" + }, + "delete": { + "confirm": { + "assertion": { + "no_undo": "Ich verstehe, dass diese Aktion nicht rückgängig gemacht werden kann.", + "unset_on_attrs": "Ich verstehe, dass alle Entitäten dieser Liste aus den Attributen des Assets entfernt werden" + } + } + }, + "list": { + "export": "Exportieren", + "import": "Importieren" + }, + "new": { + "label": "Neue Entitätenliste" + } + }, + "es_document": { + "not_synced": "Dieses Dokument ist nicht synchronisiert.", + "refresh": "Aktualisieren", + "sync_scheduled": "Synchronisierung geplant" + }, + "export": { + "dialog": { + "intro": "Wählen Sie die Renditions aus, die Sie exportieren möchten:", + "submit": "Exportieren", + "title_one": "{{count}} Asset exportieren", + "title_other": "{{count}} Assets exportieren", + "title_plural": "{{count}} Assets exportieren" + } + }, + "expose_basket_integration": { + "also_delete_the_publication": "Löschen Sie auch die Veröffentlichung", + "authorize": "Berechtigen", + "edit_publication": "Veröffentlichung bearbeiten", + "force_sync": "Synchronisierung erzwingen", + "ok": "OK", + "stop_synchronization": "Synchronisierung beenden?", + "sync_with_a_publication": "Mit einer Veröffentlichung synchronisieren" + }, + "face_detail_tooltip": { + "age_range": "Altersspanne", + "eyeglasses": "Brillen", + "eyes_open": "offene Augen", + "gender": "Geschlecht", + "has_a_beard": "Hat einen Bart", + "mouth_open": "Mund offen", + "mustache": "Schnurrbart", + "smiling": "Lächelnd" + }, + "facet": { + "boolean": { + "false": { + "label": "Nein ({{n}})" + }, + "true": { + "label": "Ja ({{n}})" + } + } + }, + "facets": { + "missing_with_total": "Fehlt ({{total}})" + }, + "file": { + "analysis_pending": "Analyse läuft…", + "dialog": { + "metadata": { + "refresh": "Aktualisieren" + } + }, + "info": { + "accepted": "Akzeptiert", + "analysis": "Analyse", + "analysis_pending": "Analyse ausstehend", + "id": "ID", + "size": "Grösse", + "size_unknown": "Unbekannt", + "type": "Typ", + "url": "URL", + "url_none": "N/A" + }, + "manage": { + "info": { + "title": "Informationen" + }, + "metadata": { + "title": "Metadaten" + }, + "title": "Datei {{name}} verwalten" + }, + "rejected": "Abgelehnt" + }, + "file_upload": { + "asset_created_one": "Asset erfolgreich erstellt.", + "asset_created_other": "{{count}} Assets erfolgreich erstellt.", + "back_to_file_upload": "Datei hochladen", + "back_to_files_upload": "Dateien hochladen", + "from_url": { + "placeholder": "Geben Sie die Datei-URL ein" + }, + "from_urls": { + "placeholder": "Datei-URL(s) eingeben, eine pro Zeile" + }, + "import_file": "Datei importieren", + "import_files": "Datei (en) importieren", + "upload_from_url": "Von URL hochladen" + }, + "filter": { + "exclude": "Ausschließen ", + "is_missing": "{{title}} fehlt" + }, + "filter_rule": { + "condition": { + "edit": "Bedingung bearbeiten", + "empty": "Noch keine Bedingung definiert", + "helper": "Assets in diesem Workspace sind nur sichtbar, wenn sie dieser Bedingung entsprechen.", + "label": "Bedingung" + }, + "confirm_delete_this_rule": "Bestätigen, diese Regel zu löschen?", + "groups": "Gruppen", + "rule_applies_for": "Regel gilt für:", + "targets_helper": "Beide leer lassen, um die Regel auf alle Benutzer anzuwenden.", + "users": "Benutzer" + }, + "filter_rules": { + "edit_this_rule": "Diese Regel bearbeiten", + "everyone": "Alle", + "filter_rules": "Filterregeln", + "new_rule": "Neue Regel" + }, + "foo": "Bar", + "form": { + "annotation": { + "default_name": "{{type}} #{{n}}" + }, + "asset": { + "tags": { + "label": "Tags" + }, + "templates": { + "label": "Mit Vorlage füllen", + "no_options": "Keine Vorlagen verfügbar" + }, + "title": { + "label": "Titel" + } + }, + "asset_create": { + "title": "Asset erstellen in", + "title_with_parent": "Asset erstellen unter" + }, + "asset_edit": { + "success": "Asset bearbeitet!" + }, + "attribute": { + "collection": { + "item_add": "{{name}} hinzufügen", + "item_remove": "entfernen" + } + }, + "attribute_definition": { + "allowInvalid": { + "label": "Ungültige Werte zulassen" + }, + "asset_type": { + "label": "Asset-Typ Ziel" }, "editable": { "label": "Bearbeitbar" }, + "editableInGui": { + "label": "In der Benutzeroberfläche bearbeitbar" + }, "enabled": { "label": "Aktiviert" }, + "entityList": { + "label": "Entitätsliste" + }, "facetEnabled": { "label": "Facetten" }, "fallback": { "label": "Fallback" }, + "field_type": { + "label": "Typ des Feldes" + }, "initialValues": { "label": "Initial Values" }, - "sortable": { - "label": "Sortierbar" + "multiple": { + "label": "Mehrere Werte" }, - "asset_type": { - "label": "Asset-Typ Ziel" - } - }, - "attribute_entity": { - "type": { - "label": "Typ" + "name": { + "label": "Name", + "translate": { + "title": "Übersetzung" + } }, - "value": { - "label": "Wert" + "policy": { + "label": "Richtlinie" }, + "searchable": { + "label": "Durchsuchbar" + }, + "slug": { + "label": "Slug" + }, + "sortable": { + "label": "Sortierbar" + }, + "suggest": { + "label": "In Suchvorschlägen anzeigen" + }, + "translatable": { + "label": "Übersetzbar" + } + }, + "attribute_entity": { "synonym": { "label": "Synonym" }, "synonyms": { "label": "Synonyme" + }, + "type": { + "label": "Typ" + }, + "value": { + "label": "Wert" + } + }, + "attribute_list": { + "description": { + "label": "Beschreibung" + }, + "public": { + "label": "Öffentlich" + }, + "title": { + "label": "Titel" + } + }, + "attribute_list_edit": { + "success": "Attributliste bearbeitet!" + }, + "attribute_list_item": { + "display_empty": { + "label": "Auch anzeigen, wenn leer" + }, + "format": { + "label": "Standardformat", + "none": "Keine" + }, + "key": { + "label": "Wert" + }, + "save": "Speichern", + "success": "Element gespeichert!" + }, + "attribute_policy": { + "editable": { + "label": "Bearbeitbar" + }, + "name": { + "label": "Name" + }, + "public": { + "label": "Öffentlich" } }, + "attributelist_create": { + "success": "Attributliste erstellt!", + "title": "Attributliste erstellen" + }, "basket": { "description": { "label": "Beschreibung" @@ -937,14 +1464,14 @@ "success": "Korb bearbeitet!" }, "collection": { + "privacy": { + "inherited": "Diese Kollektion kann nicht stärker eingeschränkt werden als die übergeordnete Kollektion." + }, "title": { "label": "Titel", "translate": { "title": "Titel übersetzen" } - }, - "privacy": { - "inherited": "Diese Kollektion kann nicht stärker eingeschränkt werden als die übergeordnete Kollektion." } }, "collection_create": { @@ -968,6 +1495,47 @@ "label": "Ziel" } }, + "entity_type": { + "name": { + "label": "Typ" + } + }, + "integration": { + "config_info": { + "title": "Integrationschlüssel" + }, + "enabled": { + "label": "Aktiviert" + }, + "errors": { + "label": "Letzte Fehler:" + }, + "help": { + "config_refenrece": "Konfigurationsreferenz:", + "config_reference": "Konfigurationsreferenz", + "copy_reference": "Referenz kopieren" + }, + "if": { + "helper": "Diese Bedingung wird verwendet, um zu bestimmen, ob die Integration ausgeführt werden soll.", + "helper_examples": "Beispiel für Bedingungen:", + "label": "WENN", + "placeholder": "Bedingung für die Ausführung der Integration" + }, + "integration": { + "label": "Integration" + }, + "needs": { + "helper": "Diese Integrationen müssen abgeschlossen sein, bevor diese Integration ausgeführt werden kann.", + "label": "Braucht", + "placeholder": "Abhängigkeiten auswählen" + }, + "public": { + "label": "Öffentlich" + }, + "title": { + "label": "Titel" + } + }, "move_assets": { "destination": { "label": "Ziel" @@ -977,7 +1545,6 @@ "label": "Berechtigungen" }, "privacy": { - "label": "Datenschutz", "choices": { "helpers": { "private": "Benutzer können Zugriff beantragen" @@ -987,17 +1554,18 @@ "secret": "Secret" }, "inherited": "Diese Kollektion kann nicht stärker eingeschränkt sein als ihre übergeordnete Kollektion", - "inherited_from_parent": "Datenschutz wird vom Elternteil übernommen: {{privacy}} " + "inherited_from_parent": "Datenschutz wird vom Elternteil übernommen: {{privacy}} ", + "label": "Datenschutz" }, "profile": { + "description": { + "label": "Beschreibung" + }, "firstName": { "translate": { "title": "Tag übersetzen" } }, - "description": { - "label": "Beschreibung" - }, "public": { "label": "Öffentlich" }, @@ -1005,7 +1573,31 @@ "label": "Titel" } }, + "profile_create": { + "success": "Profil erstellt!", + "title": "Profil erstellen" + }, + "profile_edit": { + "success": "Profil bearbeitet!" + }, + "profile_item": { + "display_empty": { + "label": "Auch bei leerem Zustand anzeigen" + }, + "format": { + "label": "Standardformat", + "none": "Keine" + }, + "key": { + "label": "Wert" + }, + "save": "Speichern", + "success": "Element gespeichert!" + }, "rendition_definition": { + "buildMode": { + "label": "Baumodus" + }, "definition": { "label": "Definition erstellen" }, @@ -1016,43 +1608,51 @@ } }, "parent": { - "label": "Elternteil", "helper": "Rendition, von der diese abgeleitet ist", + "label": "Elternteil", "placeholder": "Asset Quelldatei" }, "pickSourceFile": { "label": "Quelldatei auswählen" }, - "useAsMain": { - "label": "Als Original Dokument verwenden" - }, - "useAsThumbnail": { - "label": "Als Miniaturbild verwenden" - }, - "useAsPreview": { - "label": "Als Vorschau verwenden" - }, "policy": { "label": "Richtlinie" }, - "useAsAnimatedThumbnail": { - "label": "Als aktives Miniaturbild verwenden" + "substitutable": { + "label": "Ersetzbar" }, - "buildMode": { - "label": "Baumodus" + "target": { + "label": "Asset-Typ Ziel" }, "useAs": { + "animatedThumbnail": "Aktive Miniaturansicht", "label": "Rendition für die Anzeige", "main": "Hauptdokument", "preview": "Vorschau", - "thumbnail": "Miniaturansicht", - "animatedThumbnail": "Aktive Miniaturansicht" + "thumbnail": "Miniaturansicht" }, - "substitutable": { - "label": "Ersetzbar" + "useAsAnimatedThumbnail": { + "label": "Als aktives Miniaturbild verwenden" }, - "target": { - "label": "Asset-Typ Ziel" + "useAsMain": { + "label": "Als Original Dokument verwenden" + }, + "useAsPreview": { + "label": "Als Vorschau verwenden" + }, + "useAsThumbnail": { + "label": "Als Miniaturbild verwenden" + } + }, + "rendition_policy": { + "editable": { + "label": "Bearbeitbar" + }, + "name": { + "label": "Name" + }, + "public": { + "label": "Öffentlich" } }, "save_as": { @@ -1060,6 +1660,17 @@ "label": "Ziel" } }, + "saved_search": { + "public": { + "label": "Öffentlich" + }, + "title": { + "label": "Titel" + } + }, + "saved_search_edit": { + "success": "Gespeicherte Suche bearbeitet!" + }, "tag": { "color": { "label": "Farbe" @@ -1071,38 +1682,52 @@ "name": "Übersetzung" } }, + "thread_message": { + "content": { + "placeholder": "Geben Sie hier Ihre Nachricht ein" + }, + "edit": { + "label": "Bearbeiten" + }, + "submit": { + "label": "Senden" + } + }, "upload": { "destination": { "label": "Reiseziel" }, - "submit": { - "title": "Upload" + "files_to_upload_one": "{{count}} Datei zum Hochladen", + "files_to_upload_other": "{{count}} Dateien zum Hochladen", + "isStory": { + "label": "Story" }, - "success": "Dateien hochgeladen!", - "title": "Assets hinzufügen", "quiet": { "label": "Still (keine Benachrichtigung, kein Webhook)" }, - "files_to_upload_one": "{{count}} Datei zum Hochladen", - "files_to_upload_other": "{{count}} Dateien zum Hochladen", "reset": "Zurücksetzen", - "isStory": { - "label": "Story" - } + "submit": { + "title": "Upload" + }, + "success": "Dateien hochgeladen!", + "title": "Assets hinzufügen" }, "workspace": { "fallback_locales": { "add": "Eine Primärsprache hinzufügen", "label": "Sprache", - "title": "Primärsprachen", - "remove": "<1>Diese Sprache entfernen" + "remove": "<1>Diese Sprache entfernen", + "title": "Primärsprachen" + }, + "fileAnalyzers": { + "label": "Datei-Analyseprogramme" }, "locales": { "add": "Eine Sprache hinzufügen", "label": "Sprache", "placeholder": "zum Beispeil: fr oder fr-FR", - "title": "Sprachen für den Workspace", - "remove": "<1>Diese Sprache entfernen" + "remove": "<1>Diese Sprache entfernen", + "title": "Sprachen für den Workspace" }, "public": { "label": "Öffentlich" @@ -1113,174 +1738,33 @@ "title": "Titel übersetzen" } }, - "fileAnalyzers": { - "label": "Datei-Analyseprogramme" - }, "trashRetentionDelay": { "label": "Verzögerung bei der Aufbewahrung von Papierkorb (in Tagen)" } }, "workspace_edit": { "success": "Workspace bearbeitet!" - }, - "attribute_policy": { - "editable": { - "label": "Bearbeitbar" - }, - "name": { - "label": "Name" - }, - "public": { - "label": "Öffentlich" - } - }, - "rendition_policy": { - "name": { - "label": "Name" - }, - "public": { - "label": "Öffentlich" - }, - "editable": { - "label": "Bearbeitbar" - } - }, - "attribute_list_item": { - "format": { - "label": "Standardformat", - "none": "Keine" - }, - "display_empty": { - "label": "Auch anzeigen, wenn leer" - }, - "key": { - "label": "Wert" - }, - "save": "Speichern", - "success": "Element gespeichert!" - }, - "integration": { - "enabled": { - "label": "Aktiviert" - }, - "if": { - "helper": "Diese Bedingung wird verwendet, um zu bestimmen, ob die Integration ausgeführt werden soll.", - "helper_examples": "Beispiel für Bedingungen:", - "label": "WENN", - "placeholder": "Bedingung für die Ausführung der Integration" - }, - "config_info": { - "title": "Integrationschlüssel" - }, - "errors": { - "label": "Letzte Fehler:" - }, - "help": { - "config_refenrece": "Konfigurationsreferenz:", - "copy_reference": "Referenz kopieren", - "config_reference": "Konfigurationsreferenz" - }, - "integration": { - "label": "Integration" - }, - "needs": { - "helper": "Diese Integrationen müssen abgeschlossen sein, bevor diese Integration ausgeführt werden kann.", - "label": "Braucht", - "placeholder": "Abhängigkeiten auswählen" - }, - "title": { - "label": "Titel" - }, - "public": { - "label": "Öffentlich" - } - }, - "thread_message": { - "content": { - "placeholder": "Geben Sie hier Ihre Nachricht ein" - }, - "edit": { - "label": "Bearbeiten" - }, - "submit": { - "label": "Senden" - } - }, - "attribute_list": { - "description": { - "label": "Beschreibung" - }, - "public": { - "label": "Öffentlich" - }, - "title": { - "label": "Titel" - } - }, - "attribute_list_edit": { - "success": "Attributliste bearbeitet!" - }, - "annotation": { - "default_name": "{{type}} #{{n}}" - }, - "attributelist_create": { - "success": "Attributliste erstellt!", - "title": "Attributliste erstellen" - }, - "entity_type": { - "name": { - "label": "Typ" - } - }, - "profile_edit": { - "success": "Profil bearbeitet!" - }, - "profile_item": { - "display_empty": { - "label": "Auch bei leerem Zustand anzeigen" - }, - "format": { - "label": "Standardformat", - "none": "Keine" - }, - "key": { - "label": "Wert" - }, - "save": "Speichern", - "success": "Element gespeichert!" - }, - "profile_create": { - "success": "Profil erstellt!", - "title": "Profil erstellen" - }, - "saved_search": { - "public": { - "label": "Öffentlich" - }, - "title": { - "label": "Titel" - } - }, - "saved_search_edit": { - "success": "Gespeicherte Suche bearbeitet!" - } - }, - "get_resolved_sort_by": { - "relevance": "Relevanz", - "created_at": "Erstellt am" - }, - "get_user_name": { - "all_groups": "Alle Gruppen", - "group_not_found": "Gruppe wurde nicht gefunden", - "user_not_found": "Benutzer wurde nicht gefunden", - "all_users": "Alle Nutzer" - }, - "integration": { - "expose": { - "create_pub": { - "submit": "Erstellen und Synchronisieren", - "title": "Veröffentlichung erstellen", - "success": "Die Veröffentlichung wurde erstellt und wird synchronisiert" + } + }, + "get_resolved_sort_by": { + "created_at": "Erstellt am", + "relevance": "Relevanz" + }, + "get_user_name": { + "all_groups": "Alle Gruppen", + "all_users": "Alle Nutzer", + "group_not_found": "Gruppe wurde nicht gefunden", + "user_not_found": "Benutzer wurde nicht gefunden" + }, + "group_divider": { + "none": "Keine" + }, + "integration": { + "expose": { + "create_pub": { + "submit": "Erstellen und Synchronisieren", + "success": "Die Veröffentlichung wurde erstellt und wird synchronisiert", + "title": "Veröffentlichung erstellen" }, "form": { "description": "Beschreibung", @@ -1300,11 +1784,35 @@ }, "not_allowed_for_use": "Sie dürfen diese Integration nicht verwenden" }, + "integrations": { + "new": { + "label": "Neue Integration" + } + }, + "landing": { + "editor": { + "insert_menu": { + "search_placeholder": "Widgets suchen..." + } + }, + "page_editor": { + "save_success": "Seite wurde erfolgreich gespeichert" + } + }, "layout": { + "display_settings": { + "tooltip": "Einstellungen anzeigen" + }, "options": { "collections_count": { "label": "Kollektionen" }, + "display_collections": { + "label": "Kollektionen anzeigen" + }, + "display_previews_hover": { + "label": "Vorschau beim Hover anzeigen" + }, "display_tags": { "label": "Tags anzeigen" }, @@ -1312,31 +1820,16 @@ "label": "Titel anzeigen" }, "more": "Mehr Optionen", - "tags_count": { - "label": "Tags" - }, - "title_rows": { - "label": "Zeilen" - }, - "display_previews_hover": { - "label": "Vorschau beim Hover anzeigen" - }, "play_preview_videos": { "label": "Automatische Wiedergabe von Video Vorschauen" }, - "display_collections": { - "label": "Kollektionen anzeigen" - }, - "thumb_size": { - "label": "Grösse des Miniaturbildes" - }, "preview_options": { - "displayAttributes": { - "label": "Attribute in der Vorschau anzeigen" - }, "attributesRatio": { "label": "Attribute Grösse" }, + "displayAttributes": { + "label": "Attribute in der Vorschau anzeigen" + }, "displayFile": { "label": "Datei in der Vorschau anzeigen" }, @@ -1346,24 +1839,30 @@ "sizeRatio": { "label": "Grösse" } + }, + "tags_count": { + "label": "Tags" + }, + "thumb_size": { + "label": "Grösse des Miniaturbildes" + }, + "title_rows": { + "label": "Zeilen" } }, "previews_locked": "Vorschauen gesperrt", "previews_unlocked": "Vorschauen freigeschaltet", "view": { "grid": "Grid-Ansicht", - "masonry": "Mauerwerk Ansicht", - "list": "List Ansicht" - }, - "display_settings": { - "tooltip": "Einstellungen anzeigen" + "list": "List Ansicht", + "masonry": "Mauerwerk Ansicht" } }, "left_panel": { "baskets": "Körbe", "facets": "Facetten", - "tree": "Workspace", - "navigation": "Navigation" + "navigation": "Navigation", + "tree": "Workspace" }, "load_more": { "button": { @@ -1371,6 +1870,49 @@ "loading": "Wird geladen…" } }, + "locale": { + "current": "Deutsch", + "switcher": { + "app_languages": "Sprachen", + "change_data_locale": { + "modal": { + "confirm": "Weiter", + "title": "Seite wird neu geladen" + } + }, + "data_languages": "Sprache der Daten", + "data_locale": { + "default": "Standard", + "default_description": "UI-Sprache verwenden" + }, + "filter_placeholder": "Suchen...", + "title": "Sprache ändern" + } + }, + "matomo": { + "assetView": { + "avg_completion_rate": "Durchschnittliche Abschlussrate", + "avg_media_length": "Durchschnittliche Medienlänge", + "avg_time_watched": "Durchschnittliche Zuschauerzeit", + "finish_rate": "Abschlussrate", + "fullscreen_rate": "Vollbildrate", + "interaction_rate": "Interaktionsrate", + "nb_finishes": "Abschlüsse", + "nb_impressions": "Anzahl der Impressionen", + "nb_interactions": "Interaktionsanzahl", + "nb_plays": "Wiedergabeanzahl", + "nb_plays_with_ml": "Spielt mit ml", + "nb_plays_with_tip": "Wiedergaben mit Tips", + "nb_unique_visitors_impressions": "Anzahl der Unique-Impressions", + "nb_unique_visitors_plays": "Anzahl eindeutiger Wiedergaben", + "nb_visits": "Anzahl der Besuche", + "noStats": "Für dieses Asset sind keine Statistiken verfügbar", + "play_rate": "Wiedergaberate", + "sum_daily_nb_uniq_visitors": "Summe eindeutige Besucher (täglich)", + "sum_fullscreen_plays": "Gesamt Vollbild-Plays", + "sum_time_progress": "Summe Wiedergabezeit" + } + }, "menu": { "change_theme": "Thema ändern", "sign_in": "Einloggen", @@ -1386,9 +1928,9 @@ "dialog": { "intro": "Wohin möchten Sie die ausgewählten Assets verschieben?", "submit": "Verschieben", - "title_plural": "{{count}} Assets verschieben", "title_one": "{{count}} Asset verschieben", - "title_other": "{{count}} Assets verschieben" + "title_other": "{{count}} Assets verschieben", + "title_plural": "{{count}} Assets verschieben" } }, "move_assets_dialog": { @@ -1396,59 +1938,207 @@ }, "not_found": { "back_home": "Zurück zur Startseite", - "title": "Seite wurde nicht gefunden", - "content": "Die Seite, die Sie suchen, existiert nicht oder wurde entfernt" - }, - "operations_asset": { - "workflow_is_starting": "Workflow gestartet!" + "content": "Die Seite, die Sie suchen, existiert nicht oder wurde entfernt", + "title": "Seite wurde nicht gefunden" }, - "pagination": { - "load_more_collections": "Weitere Kollektionen laden" - }, - "pasted_image": { - "filename": "Bild eingefügt- {{date}}" - }, - "permission_table": { - "actions": "Aktionen", - "no_permissions": "Keine Berechtigungen definiert" - }, - "privacy": { - "no_access": "Kein Zugriff", - "private_in_workspace": "Privat im Workspace", - "public": "Öffentlich", - "public_for_users": "Öffentlich für Nutzer", - "public_in_workspace": "Öffentlich im Workspace", - "secret": "Secret", - "private": "Privat" + "notification": { + "action": { + "follow": { + "label": "Folgen" + }, + "unfollow": { + "label": "Nicht mehr folgen" + } + }, + "topics": { + "asset": { + "delete": { + "desc": "Benachrichtigung erhalten, wenn das Asset gelöscht wird", + "label": "Löschen" + }, + "new_comment": { + "desc": "Benachrichtigung erhalten, wenn es einen neuen Kommentar zu dem Asset gibt", + "label": "Diskussion" + }, + "update": { + "desc": "Benachrichtigung erhalten, wenn das Asset aktualisiert wird", + "label": "Aktualisieren" + } + }, + "collection": { + "asset_add": { + "desc": "Benachrichtigung erhalten, wenn ein Asset zur Kollektion hinzugefügt wird", + "label": "Asset hinzugefügt" + }, + "asset_new_comment": { + "desc": "Benachrichtigung erhalten, wenn ein neuer Kommentar zu einem Asset in dieser Kollektion vorliegt", + "label": "Diskussion" + }, + "asset_remove": { + "desc": "Benachrichtigung erhalten, wenn ein Asset aus der Kollektion entfernt wird", + "label": "Asset entfernt" + }, + "asset_update": { + "desc": "Benachrichtigung erhalten, wenn ein Asset aus der Kollektion aktualisiert ist", + "label": "Asset aktualisiert" + }, + "not_authenticated": "Sie sind nicht authentifiziert, um dieser Kollektion zu folgen." + } + } + }, + "operations_asset": { + "workflow_is_starting": "Workflow gestartet!" + }, + "page": { + "delete_confirm": "Seite löschen", + "delete_title": "Seite \"{{title}}\" löschen", + "list": { + "create_button": "Seite erstellen", + "no_result": "Keine Seite", + "title": "Seiten" + } + }, + "pages": { + "create": { + "submit": "Erstellen", + "success": "Seite wurde erfolgreich erstellt", + "title": "Seite erstellen" + }, + "edit": { + "submit": "Speichern", + "success": "Seite wurde erfolgreich gespeichert", + "title": "Seite bearbeiten" + }, + "form": { + "enabled": { + "label": "Aktiviert" + }, + "public": { + "label": "Öffentlich" + }, + "slug": { + "helper": "Der Slug wird in der Seiten-URL verwendet und muss eindeutig sein.", + "label": "Slug" + }, + "title": { + "label": "Titel" + } + } + }, + "pagination": { + "load_more_collections": "Weitere Kollektionen laden" + }, + "pasted_image": { + "filename": "Bild eingefügt- {{date}}" + }, + "permission_table": { + "actions": "Aktionen", + "no_permissions": "Keine Berechtigungen definiert" + }, + "permissions": { + "helper_desc": "Berechtigungsstufen:" + }, + "privacy": { + "no_access": "Kein Zugriff", + "private": "Privat", + "private_in_workspace": "Privat im Workspace", + "public": "Öffentlich", + "public_for_users": "Öffentlich für Nutzer", + "public_in_workspace": "Öffentlich im Workspace", + "secret": "Secret" }, "privacy_field": { - "user_must_be_authenticated": "Der Benutzer muss authentifiziert sein", - "only_visible_to_workspace": "Nur im Workspace sichtbar" + "only_visible_to_workspace": "Nur im Workspace sichtbar", + "user_must_be_authenticated": "Der Benutzer muss authentifiziert sein" + }, + "profile": { + "manage": { + "acl": { + "title": "Berechtigungen" + }, + "edit": { + "title": "Bearbeiten" + }, + "organize": { + "title": "Organisieren" + }, + "title": "Profil verwalten {{name}}" + }, + "organize": { + "add_divider": "Teiler hinzufügen", + "add_spacer": "Abstandshalter hinzufügen" + } + }, + "remove_bg": { + "bg_removed": "{{title}} - Bildhintergrund entfernt", + "cannot_interact": "Sie verfügen nicht über ausreichende Berechtigungen, um Bildhintergrund zu entfernen", + "remove_bg": "Bildhintergrund entfernen", + "use_slider_to_compare": "Verwenden Sie den Slider zum Vergleichen" }, "remove_bgasset_editor_actions": { "bg_removed": "{{name}} - Bildhintergrund entfernt", "remove_bg": "Bildhintergrund entfernen", "use_slider_to_compare": "Verwenden Sie den Slider zum Vergleichen" }, - "rendition_definitions": { - "new": { - "label": "Neue Rendition" + "rename_attachment": { + "dialog": { + "success": "Anhang wurde umbenannt.", + "title": "Anhang umbenennen" }, + "form": { + "label": "Anhangsname" + } + }, + "rendition_definition": { + "build_mode": { + "custom": "Erzeugen", + "none": "Keine", + "pick_source": "Übergeordnetes oder Quelldatei kopieren" + } + }, + "rendition_definitions": { "filter": { "asset_type": "Nach Asset-Typ filtern" + }, + "new": { + "label": "Neue Rendition" + } + }, + "rendition_delete": { + "confirm": "Sind Sie sicher, dass Sie diese Rendition löschen möchten?", + "confirmed": "Rendition wurde gelöscht!" + }, + "rendition_policy": { + "new": { + "label": "Neue Richtlinie" } }, "renditions": { + "delete": "Löschen", "dirty": "Die Einstellungen dieser Rendition wurden nach ihrer Generierung geändert (Dirty).", "download": "Download", - "delete": "Löschen", "replace": "Ersetzen", "upload": "Rendition hochladen" }, + "rentition": { + "flags": { + "is_projection": "Die Rendition ist eine Projektion der Quelle", + "locked": "Rendition ist gesperrt", + "non_projection": "Die Rendition ist keine Projektion und wurde in ihrer Struktur verändert", + "substituted": "Rendition wurde ersetzt" + } + }, + "replace_asset": { + "dialog": { + "submit": "Austauschen", + "success": "Die neue Asset-Quelldatei wurde hochgeladen.", + "title": "Asset-Quelldatei ersetzen" + } + }, "replace_asset_with_file_dialog": { + "asset_has_been_replaced": "Asset wurde ersetzt", "please_confirm_replacing_asset": "Bitte bestätigen Sie das Ersetzen des Assets.", - "replace_asset_with_file": "Asset durch Datei ersetzen", - "asset_has_been_replaced": "Asset wurde ersetzt" + "replace_asset_with_file": "Asset durch Datei ersetzen" }, "save_as_button": { "new_asset": "Neues Asset", @@ -1458,40 +2148,81 @@ }, "save_as_template_form": { "apply_to_collection": "Zur Kollektion anwenden", + "include_collection_children": "Kollektionkinder einbeziehen", "my_template": "Meine Vorlage…", "public": "Öffentlich", "remember_attributes": "Attribute einbeziehen", "remember_privacy": "Datenschutz einbeziehen", "remember_tags": "Tags einbeziehen", + "replace": "Angewendete Vorlage ersetzen", "save_values_as_template_for_reuse": "Werte als Vorlage zur Wiederverwendung speichern", - "template_name": "Name der Vorlage", - "include_collection_children": "Kollektionkinder einbeziehen", - "replace": "Angewendete Vorlage ersetzen" + "template_name": "Name der Vorlage" }, "save_file_as_new_asset_dialog": { "file_is_saved": "Datei ist gespeichert", "save": "Speichern", + "save_file_as_new_asset": "Datei als neues Asset speichern", "title": { "label": "Titel" - }, - "save_file_as_new_asset": "Datei als neues Asset speichern" + } }, "save_file_as_rendition_dialog": { "rendition_has_been_saved": "Die Rendition wurde gespeichert", "rendition_to_add_or_replace": "Rendition, die hinzugefügt oder ersetzt werden soll", "save_file_as_asset_rendition": "Datei als Asset-Rendition speichern" }, - "search": { - "search_button": "Suchen", - "sort_by": { - "title": "Sortiere nach" + "save_search": { + "dialog": { + "title": "Suche speichern" + } + }, + "saved_search": { + "automations": { + "coming_soon": "Automatisierungen kommen bald!" + }, + "form": { + "created": "Die Suche wurde gespeichert!" + }, + "info": { + "creation_date": "Erstellungsdatum", + "id": "ID", + "modification_date": "Datum der Änderung", + "owner": "Besitzer" + }, + "item": { + "delete": "Löschen", + "edit": "Bearbeiten" + }, + "list": { + "title": "Gespeicherte Suchen" }, + "manage": { + "acl": { + "title": "Berechtigungen" + }, + "automations": { + "title": "Automatisierungen" + }, + "edit": { + "title": "Bearbeiten" + }, + "info": { + "title": "Informationen" + }, + "title": "Gespeicherte Suche verwalten: {{name}}" + } + }, + "search": { "error": "Hoppla, ein Fehler ist aufgetreten:", "more_options": { "clear_search": "Suche löschen" }, "no_results_message": "Es tut uns leid, aber Ihre Suche ergab keine Assets!", "save_search": "Suche speichern", + "search_button": "Suchen", + "sort_by": { + "title": "Sortiere nach" + }, "suggestion": { "check_spelling": " Rechtschreibprüfung : Stellen Sie sicher, dass alle Suchbegriffe richtig geschrieben sind.", "consider_using_facets": " Erwägen Sie die Verwendung von Facetten: Klicken Sie auf die verschiedenen Facettenwerte, um die Ergebnisse einzugrenzen oder zu erweitern (Workspace, Kollektion, Schlagworte, Daten usw.).", @@ -1503,993 +2234,261 @@ "search_auto_complete": { "search": "Suchen…" }, - "search_provider": { - "collections": "Kollektionen", - "workspaces": "Workspaces" - }, - "selection_actions": { - "result": "Ergebnis", - "s": "", - "x_result_one": "{{count}} Treffer", - "x_result_other": "{{count}} Treffer", - "x_result_with_selection_one": "{{selection}} / {{total}} Treffer", - "x_result_with_selection_other": "{{selection}} / {{total}} Treffer" - }, - "sort_by": { - "sort_by": "Sortiere nach" - }, - "sort_by_row": { - "ascendant": "aufsteigend", - "descendant": "absteigend" - }, - "substitute_file": { - "dialog": { - "intro": "Assets hierher ziehen", - "submit": "Ersetzung", - "title": "Datei ersetzen" - } - }, - "tag_rules": { - "edit_this_rule": "Diese Regel bearbeiten", - "new_rule": "Neue Regel", - "tag_rules": "Tag Regeln" - }, - "tags": { - "label": "Tags", - "new": { - "label": "Neues Tag" - } - }, - "translatable_attribute_tabs": { - "untranslated": "Unübersetzt" - }, - "tuiphoto_editor": { - "file_name": "Dateiname", - "open_recent": "Kürzlich geöffnet", - "original": "Original", - "save": "Speichern", - "saved": "Gespeichert!", - "save_as": "Speichern unter" - }, - "use_integration_auth": { - "auth": "Authentifizierung" - }, - "workspace": { - "info": { - "creation_date": "Erstellungsdatum", - "id": "ID", - "owner": "Besitzer" - }, - "item": { - "create_collection": "Kollektion in diesem Workspace hinzufügen", - "edit": "Diesen Workspace bearbeiten", - "create_asset": "Asset zum Workspace hinzufügen" - }, - "manage": { - "acl": { - "title": "Berechtigungen" - }, - "attribute_definitions": { - "title": "Attribute" - }, - "attribute_entity": { - "title": "Entitäten" - }, - "edit": { - "title": "Bearbeiten" - }, - "info": { - "title": "Informationen" - }, - "rendition_definition": { - "title": "Renditions" - }, - "tag_rules": { - "title": "Tag Regeln" - }, - "tags": { - "title": "Tags" - }, - "title": "Workspace {{name}} verwalten", - "attribute_policy": { - "title": "Attributrichtlinien" - }, - "rendition_policy": { - "title": "Richtlinien für die Rendition" - }, - "integrations": { - "title": "Integrationen" - } - }, - "no_locale_defined": "In diesem Workspace ist keine Sprache definiert" - }, - "attribute_policy": { - "new": { - "label": "Neue Richtlinie" - } - }, - "rendition_policy": { - "new": { - "label": "Neue Richtlinie" - } - }, - "copy_assets_dialog": { - "assets_were_copied": "Assets wurden kopiert" - }, - "group_divider": { - "none": "Keine" - }, - "upload_dropzone": { - "drag_n_drop_some_files_here_or_click_to_select_files": "Ziehen Sie einige Dateien per Drag-and-Drop hierher oder klicken Sie, um Dateien auszuwählen" - }, - "annotations": { - "delete_shape": { - "confirm": "Wollen Sie diese Form wirklich löschen?" - } - }, - "asset_collections": { - "reference_collection": "Dieses Asset gehört zur Kollektion {{collection}} im Workspace {{workspace}}.", - "other_collections": "Es erscheint auch als Verknüpfung in den folgenden Kollektionen:", - "reference_workspace": "Dieses Asset gehört zum Workspace {{workspace}} Root - Kollection.", - "remove_shortcut": "Verknüpfung entfernen", - "remove_shortcut_confirm": "Sind Sie sicher, dass Sie diese Verknüpfung entfernen möchten?", - "title": "Kollektionen" - }, - "asset_version_delete": { - "confirm": "Möchten Sie diese Version wirklich löschen?", - "confirmed": "Version wurde gelöscht!" - }, - "attributeList": { - "delete": { - "confirm": "Sind Sie sicher, dass Sie diese Attributliste löschen möchten?" - }, - "choose_modal": { - "title": "Aktuelle Attributliste auswählen" - }, - "create_button": { - "label": "Neue Attributliste erstellen" - }, - "default": { - "title": "Meine Attributliste" - } - }, - "built_in_attr": { - "fileType": "Dateityp", - "privacy": "Datenschutz", - "rendition": "Rendition", - "score": "Score", - "tag": "Tag", - "workspace": "Workspace", - "collection": "Kollektion", - "fileMimeType": "MIME Typ Datei", - "fileSize": "Dateigrösse", - "filename": "Dateiname", - "id": "ID", - "owner": "Besitzer", - "createdAt": "Erstellt am", - "editedAt": "Bearbeitet am", - "collections": "Kollektionen", - "isStory": "Story", - "stories": "Stories", - "deleted": "Gelöscht", - "fileExtension": "Dateierweiterung", - "has_source": "Hat Quelldatei" - }, - "create_share_link": { - "form": { - "expiresAt": { - "helper": "Optional. Wenn aktiviert, ist der Freigabelink nur bis zu diesem Zeitpunkt aktiv.", - "label": "Läuft ab am" - }, - "startsAt": { - "helper": "Optional. Wenn aktiviert, ist der Freigabelink erst nach Ablauf dieser Zeit aktiv.", - "label": "Beginnt um" - }, - "title": { - "helper": "Sie können die Zielgruppe dieses Freigabelinks benennen", - "label": "Titel" - } - }, - "dialog": { - "submit": "Link erstellen", - "title": "Freigabelink erstellen" - } - }, - "entity_type": { - "definitions": { - "count_one": "Verwendet in {{ count }} Attributdefinition", - "count_other": "Verwendet in {{ count }} Attributdefinitionen", - "none": "Keine Verwendung von Attributdefinitionen" - }, - "delete": { - "confirm": { - "assertion": { - "no_undo": "Ich verstehe, dass diese Aktion nicht rückgängig gemacht werden kann.", - "unset_on_attrs": "Ich verstehe, dass alle Entitäten dieser Liste aus den Attributen des Assets entfernt werden" - } - } - }, - "new": { - "label": "Neue Entitätenliste" - }, - "list": { - "export": "Exportieren", - "import": "Importieren" - } - }, - "file": { - "dialog": { - "metadata": { - "refresh": "Aktualisieren" - } - }, - "info": { - "type": "Typ", - "id": "ID", - "size": "Grösse", - "url": "URL", - "accepted": "Akzeptiert", - "analysis": "Analyse", - "analysis_pending": "Analyse ausstehend", - "size_unknown": "Unbekannt", - "url_none": "N/A" - }, - "manage": { - "title": "Datei {{name}} verwalten", - "info": { - "title": "Informationen" - }, - "metadata": { - "title": "Metadaten" - } - }, - "analysis_pending": "Analyse läuft…", - "rejected": "Abgelehnt" - }, - "integrations": { - "new": { - "label": "Neue Integration" - } - }, - "notification": { - "topics": { - "asset": { - "new_comment": { - "desc": "Benachrichtigung erhalten, wenn es einen neuen Kommentar zu dem Asset gibt", - "label": "Diskussion" - }, - "delete": { - "desc": "Benachrichtigung erhalten, wenn das Asset gelöscht wird", - "label": "Löschen" - }, - "update": { - "desc": "Benachrichtigung erhalten, wenn das Asset aktualisiert wird", - "label": "Aktualisieren" - } - }, - "collection": { - "asset_new_comment": { - "desc": "Benachrichtigung erhalten, wenn ein neuer Kommentar zu einem Asset in dieser Kollektion vorliegt", - "label": "Diskussion" - }, - "asset_update": { - "desc": "Benachrichtigung erhalten, wenn ein Asset aus der Kollektion aktualisiert ist", - "label": "Asset aktualisiert" - }, - "asset_add": { - "desc": "Benachrichtigung erhalten, wenn ein Asset zur Kollektion hinzugefügt wird", - "label": "Asset hinzugefügt" - }, - "asset_remove": { - "desc": "Benachrichtigung erhalten, wenn ein Asset aus der Kollektion entfernt wird", - "label": "Asset entfernt" - }, - "not_authenticated": "Sie sind nicht authentifiziert, um dieser Kollektion zu folgen." - } - }, - "action": { - "follow": { - "label": "Folgen" - }, - "unfollow": { - "label": "Nicht mehr folgen" - } - } - }, - "rentition": { - "flags": { - "non_projection": "Die Rendition ist keine Projektion und wurde in ihrer Struktur verändert", - "is_projection": "Die Rendition ist eine Projektion der Quelle", - "locked": "Rendition ist gesperrt", - "substituted": "Rendition wurde ersetzt" - } - }, - "search_condition": { - "builder": { - "operator": { - "greater_than": "> (Grösser als)", - "not_in": "Nicht drin", - "within_rectangle": "Innerhalb des Rechtecks", - "within_rectangle_bottom_right_longitude": "Längengrad unten rechts", - "and": "UND", - "between": "Zwischen", - "contains": "Enhält", - "equals": "= (Entspricht)", - "exists": "Existiert", - "greater_than_or_equals": ">= (Grösser als oder gleich)", - "in": "In", - "less_than": "< (Weniger als)", - "less_than_or_equals": "<= (Weniger als oder gleich)", - "matches": "Übereinstimmt", - "missing": "Fehlt", - "not_between": "Nicht dazwischen", - "not_contains": "Enthält nicht", - "not_equals": "! = (Nicht gleich)", - "not_matches": "Stimmt nicht überein", - "not_starts_with": "Beginnt nicht mit", - "or": "ODER", - "starts_with": "Beginnt mit", - "within_circle": "Innerhalb des Kreises", - "within_circle_latitude": "Breitengrad", - "within_circle_longitude": "Längengrad", - "within_circle_radius": "Radius", - "within_rectangle_bottom_right_latitude": "Breitengrad unten rechts", - "within_rectangle_top_left_latitude": "Oberer linker Breitengrad", - "within_rectangle_top_left_longitude": "Längengrad oben links", - "placeholder": "Operator" - }, - "add_condition": "Bedingung hinzufügen", - "add_condition_group": "Bedingungsgruppe hinzufügen", - "field": "Feld", - "value": "Wert" - }, - "dialog": { - "switch_to_text": "Zu Text wechseln", - "add_condition": "Bedingung hinzufügen", - "error": { - "empty_query": "Abfrage leeren", - "invalid_query": "Ungültige Abfrage: {{error}}" - }, - "edit_condition": "Bedingung bearbeiten", - "submit_add": "Hinzufügen", - "submit_update": "Aktualisieren", - "switch_to_builder": "Zu Builder wechseln" - }, - "add_condition": "Bedingung hinzufügen", - "menu": { - "disable": "Deaktivieren", - "edit": "Bearbeiten", - "enable": "Aktivieren", - "remove": "Entfernen" - } - }, - "share": { - "dialog": { - "create_public_link": { - "primary": "Öffentlichen Link erstellen", - "secondary": "Teilen Sie einen Link mit Personen ausserhalb Ihrer Organisation" - }, - "copied": "Link in die Zwischenablage kopiert", - "advanced_mode": "Erweiterter Modus", - "submit": "Link kopieren", - "title": "Asset teilen", - "add_new": "Neuen Freigabelink erstellen" - }, - "socials": { - "email": { - "title": "Per E-Mail teilen" - }, - "telegram": { - "title": "Auf Telegram teilen" - }, - "embed": { - "title": "Eingebettete Freigabe" - }, - "facebook": { - "title": "Auf Facebook teilen" - }, - "instapaper": { - "title": "Auf Instapaper teilen" - }, - "linkedin": { - "title": "Auf LinkedIn teilen" - }, - "pinterest": { - "title": "Auf Pinterest teilen" - }, - "pocket": { - "title": "Auf Pocket teilen" - }, - "tumblr": { - "title": "Auf Tumblr teilen" - }, - "x": { - "title": "Auf X teilen" - }, - "whatsapp": { - "title": "Auf WhatsApp teilen" - }, - "workplace": { - "title": "Auf Workplace teilen" - } - }, - "embed": { - "title": "Eingebettete Freigabe" - }, - "item": { - "createdAt": "Erstellt bei {{date}}", - "expiresAt": "Läuft am {{date}} ab", - "rendition": { - "asset": "Asset" - }, - "startsAt": "Beginnt bei {{date}}" - } - }, - "thread": { - "message": { - "delete": { - "confirm": { - "success": "Nachricht wurde entfernt!", - "title": "Wollen Sie diese Nachricht wirklich löschen?" - } - } - } - }, - "Already translated": "Bereits übersetzt", - "annotation": { - "type": { - "arrow": "Pfeil", - "circle": "Kreis", - "draw": "Zeichnen", - "line": "Linie", - "rectangle": "Rechteck", - "target": "Ziel", - "text": "Text", - "timerange": "Zeitbereich", - "cue": "Marker" - } - }, - "asset_delete": { - "confirm": "Sind Sie sicher, dass Sie dieses Asset löschen möchten?", - "title": "Asset löschen" - }, - "asset_version": { - "delete": "Version löschen" - }, - "asset_view": { - "edit_asset": "Asset {{name}}" - }, - "attribute_list": { - "manage": { - "acl": { - "title": "Berechtigungen" - }, - "edit": { - "title": "Bearbeiten" - }, - "organize": { - "title": "Organisieren" - }, - "title": "Attributliste {{name}} verwalten" - }, - "organize": { - "add_divider": "Trenner hinzufügen", - "add_spacer": "Abstand hinzufügen" - } - }, - "es_document": { - "refresh": "Aktualisieren", - "sync_scheduled": "Synchronisierung geplant", - "not_synced": "Dieses Dokument ist nicht synchronisiert." - }, - "rendition_definition": { - "build_mode": { - "none": "Keine", - "custom": "Erzeugen", - "pick_source": "Übergeordnetes oder Quelldatei kopieren" - } - }, - "rendition_delete": { - "confirm": "Sind Sie sicher, dass Sie diese Rendition löschen möchten?", - "confirmed": "Rendition wurde gelöscht!" - }, - "replace_asset": { - "dialog": { - "success": "Die neue Asset-Quelldatei wurde hochgeladen.", - "title": "Asset-Quelldatei ersetzen", - "submit": "Austauschen" - } - }, - "user_preferences": { - "loading": "Benutzereinstellungen werden geladen…" - }, - "Already <1>bold.": "Schon <1>bold.", - "file_upload": { - "from_url": { - "placeholder": "Geben Sie die Datei-URL ein" - }, - "upload_from_url": "Von URL hochladen", - "asset_created_one": "Asset erfolgreich erstellt.", - "asset_created_other": "{{count}} Assets erfolgreich erstellt.", - "back_to_file_upload": "Datei hochladen", - "back_to_files_upload": "Dateien hochladen", - "from_urls": { - "placeholder": "Datei-URL(s) eingeben, eine pro Zeile" - }, - "import_file": "Datei importieren", - "import_files": "Datei (en) importieren" - }, - "upload": { - "pending": { - "cancel_upload": "Abbrechen", - "empty": "Keine ausstehenden Uploads", - "title": "Ausstehende Uploads", - "toast": { - "message_one": "{{uploaded}} / {{count}} hochgeladen", - "message_other": "{{uploaded}} / {{count}} hochgeladen" - }, - "uploaded": "Hochgeladen" - } - }, - "upload_rendition": { - "dialog": { - "submit": "Rendition hochladen", - "success": "Die Rendition wurde erfolgreich hochgeladen", - "title": "Rendition {{renditionName}} hochladen" - } - }, - "aql": { - "constant": { - "no": "Nein", - "null": "Null", - "yes": "Ja" - } - }, - "asset_type": { - "choice": { - "asset": "Assets", - "asset_only": "Nur Assets", - "both": "Beide", - "story": "Stories", - "story_only": "Nur Stories" - } - }, - "facet": { - "boolean": { - "false": { - "label": "Nein ({{n}})" - }, - "true": { - "label": "Ja ({{n}})" - } - } - }, - "story": { - "chip": { - "label": "Story" - } - }, - "asset_restore": { - "confirm": "Möchten Sie dieses Asset wirklich wiederherstellen?", - "title": "Asset wiederherstellen" - }, - "attachment": { - "dialog": { - "add": { - "submit": "Anhängen", - "success": "Neuer Anhang wurde hinzugefügt.", - "title": "Anhang zum Asset hinzufügen" - } - } - }, - "collection_panel": { - "trash": "Papierkorb" - }, - "collection_restore": { - "confirmed": "Kollektion wurde wiederhergestellt!", - "title": "Kollektion wiederherstellen" - }, - "rename_attachment": { - "dialog": { - "success": "Anhang wurde umbenannt.", - "title": "Anhang umbenennen" - }, - "form": { - "label": "Anhangsname" - } - }, - "appbar": { - "assets": "Assets", - "pages": "Seiten" - }, - "profile": { - "manage": { - "acl": { - "title": "Berechtigungen" - }, - "edit": { - "title": "Bearbeiten" - }, - "organize": { - "title": "Organisieren" - }, - "title": "Profil verwalten {{name}}" - }, - "organize": { - "add_divider": "Teiler hinzufügen", - "add_spacer": "Abstandshalter hinzufügen" - } - }, - "editor": { - "format": { - "alignCenter": "Zentriert", - "alignJustify": "Blocksatz", - "alignLeft": "Linksbündig", - "alignRight": "Rechtsbündig", - "blockQuote": "Blockzitat", - "block_type": { - "heading": { - "label": "Überschrift {{number}}" - }, - "paragraph": { - "label": "Normal" - } - }, - "bold": "Fett", - "bulletList": "Aufzählung", - "clear": "Format löschen", - "code": "Code", - "codeBlock": "Code-Block", - "fontFamily": { - "label": "Schriftart" - }, - "italic": "Kursiv", - "link": "Link", - "orderedList": "Nummerierte Liste", - "redo": "Wiederholen", - "save": "Speichern", - "strikethrough": "Durchschlagen", - "underline": "Unterstreichen", - "undo": "Rückgängig", - "view": "Ansehen" - }, - "link": { - "dialog": { - "dialog_title": "Link einfügen", - "remove": { - "label": "Link entfernen" - }, - "target": { - "blank": { - "label": "Neuer Tab" - }, - "label": "Link öffnen in", - "self": { - "label": "Gleicher Tab" - } - }, - "title": { - "label": "Titel (optional)" - }, - "url": { - "label": "URL" - } - } - }, - "menu": { - "colors": { - "backgroundColor": "Hintergrundfarbe", - "textColor": "Textfarbe" - } - }, - "widgets": { - "asset": { - "options": { - "assetId": { - "label": "Asset-ID" - }, - "borderRadius": { - "label": "Randradius (px)" - }, - "gap": { - "label": "Lücke" - }, - "imagePosition": { - "bottom": "Unten", - "label": "Bildposition", - "left": "Links", - "right": "Rechts", - "top": "Oben" - }, - "maxHeight": { - "label": "Max. Höhe (px)" - }, - "maxWidth": { - "label": "Maximale Breite (px)" - }, - "position": { - "fixed": "Fixiert", - "label": "Bildposition", - "static": "Statisch" - }, - "title": { - "label": "Titel" - } - }, - "title": "Asset" - }, - "carousel": { - "options": { - "backgroundColor": { - "label": "Hintergrundfarbe" - }, - "cover": { - "label": "Covermodus" - }, - "height": { - "label": "Höhe (px)" - }, - "maxItems": { - "label": "Max. Anzahl Elemente" - }, - "openAsset": { - "label": "Asset per Klick öffnen" - }, - "searchId": { - "label": "Gespeicherte Suche" - } - }, - "title": "Bild-Slider" - }, - "footer": { - "options": { - "add_link": "Link hinzufügen", - "backgroundColor": { - "label": "Hintergrundfarbe" - }, - "link_label": { - "label": "Titel" - }, - "link_url": { - "label": "URL" - }, - "links": { - "label": "Links" - }, - "textColor": { - "label": "Textfarbe" - } - }, - "title": "Fußzeile" - }, - "grid": { - "options": { - "backgroundColor": { - "label": "Hintergrundfarbe" - }, - "gap": { - "label": "Lücke" - }, - "maxItems": { - "label": "Max. Anzahl Elemente" - }, - "openAsset": { - "label": "Asset per Klick öffnen" - }, - "searchId": { - "label": "Gespeicherte Suche" - }, - "size": { - "label": "Größe (px)" - } - }, - "title": "Gitter" - }, - "header_bar": { - "options": { - "add_link": "Link hinzufügen", - "link_label": { - "label": "Titel" - }, - "link_url": { - "label": "URL" - }, - "links": { - "label": "Links" - } - }, - "title": "Kopfleiste" - }, - "remove_widget": "Widget entfernen", - "search_grid": { - "options": { - "actions": { - "basket": { - "label": "Zum Korb hinzufügen" - }, - "copy": { - "label": "Kopieren" - }, - "delete": { - "label": "Löschen" - }, - "edit": { - "label": "Bearbeiten" - }, - "export": { - "label": "Exportieren" - }, - "info": { - "label": "Informationen" - }, - "label": "Aktionen", - "move": { - "label": "Verschieben" - }, - "open": { - "label": "Öffnen" - }, - "replace": { - "label": "Ersetzen" - }, - "restore": { - "label": "Wiederherstellen" - }, - "share": { - "label": "Teilen" - } - }, - "containerHeight": { - "label": "Behälterhöhe (px)" - }, - "displayFacets": { - "label": "Facetten anzeigen" - }, - "maxItems": { - "label": "Max. Anzahl Elemente" - }, - "openAsset": { - "label": "Asset per Klick öffnen" - }, - "searchId": { - "label": "Gespeicherte Suche" - }, - "size": { - "label": "Größe (px)" - } - }, - "title": "Rasteransicht" - }, - "spacer": { - "options": { - "spacing": { - "label": "Abstand" - } - }, - "title": "Abstandshalter" + "search_condition": { + "add_condition": "Bedingung hinzufügen", + "builder": { + "add_condition": "Bedingung hinzufügen", + "add_condition_group": "Bedingungsgruppe hinzufügen", + "field": "Feld", + "operator": { + "and": "UND", + "between": "Zwischen", + "contains": "Enhält", + "equals": "= (Entspricht)", + "exists": "Existiert", + "greater_than": "> (Grösser als)", + "greater_than_or_equals": ">= (Grösser als oder gleich)", + "in": "In", + "less_than": "< (Weniger als)", + "less_than_or_equals": "<= (Weniger als oder gleich)", + "matches": "Übereinstimmt", + "missing": "Fehlt", + "not_between": "Nicht dazwischen", + "not_contains": "Enthält nicht", + "not_equals": "! = (Nicht gleich)", + "not_in": "Nicht drin", + "not_matches": "Stimmt nicht überein", + "not_starts_with": "Beginnt nicht mit", + "or": "ODER", + "placeholder": "Operator", + "starts_with": "Beginnt mit", + "within_circle": "Innerhalb des Kreises", + "within_circle_latitude": "Breitengrad", + "within_circle_longitude": "Längengrad", + "within_circle_radius": "Radius", + "within_rectangle": "Innerhalb des Rechtecks", + "within_rectangle_bottom_right_latitude": "Breitengrad unten rechts", + "within_rectangle_bottom_right_longitude": "Längengrad unten rechts", + "within_rectangle_top_left_latitude": "Oberer linker Breitengrad", + "within_rectangle_top_left_longitude": "Längengrad oben links" }, - "unknown": "Unbekannter Widget-Typ" - } - }, - "landing": { - "editor": { - "insert_menu": { - "search_placeholder": "Widgets suchen..." - } + "value": "Wert" }, - "page_editor": { - "save_success": "Seite wurde erfolgreich gespeichert" + "dialog": { + "add_condition": "Bedingung hinzufügen", + "edit_condition": "Bedingung bearbeiten", + "error": { + "empty_query": "Abfrage leeren", + "invalid_query": "Ungültige Abfrage: {{error}}" + }, + "submit_add": "Hinzufügen", + "submit_update": "Aktualisieren", + "switch_to_builder": "Zu Builder wechseln", + "switch_to_text": "Zu Text wechseln" + }, + "menu": { + "disable": "Deaktivieren", + "edit": "Bearbeiten", + "enable": "Aktivieren", + "remove": "Entfernen" } }, - "matomo": { - "assetView": { - "avg_completion_rate": "Durchschnittliche Abschlussrate", - "avg_media_length": "Durchschnittliche Medienlänge", - "avg_time_watched": "Durchschnittliche Zuschauerzeit", - "finish_rate": "Abschlussrate", - "fullscreen_rate": "Vollbildrate", - "interaction_rate": "Interaktionsrate", - "nb_finishes": "Abschlüsse", - "nb_impressions": "Anzahl der Impressionen", - "nb_interactions": "Interaktionsanzahl", - "nb_plays": "Wiedergabeanzahl", - "nb_plays_with_ml": "Spielt mit ml", - "nb_unique_visitors_impressions": "Anzahl der Unique-Impressions", - "nb_unique_visitors_plays": "Anzahl eindeutiger Wiedergaben", - "nb_visits": "Anzahl der Besuche", - "noStats": "Für dieses Asset sind keine Statistiken verfügbar", - "play_rate": "Wiedergaberate", - "sum_daily_nb_uniq_visitors": "Summe eindeutige Besucher (täglich)", - "sum_fullscreen_plays": "Gesamt Vollbild-Plays", - "sum_time_progress": "Summe Wiedergabezeit", - "nb_plays_with_tip": "Wiedergaben mit Tips" - } + "search_provider": { + "collections": "Kollektionen", + "workspaces": "Workspaces" }, - "page": { - "delete_confirm": "Seite löschen", - "delete_title": "Seite \"{{title}}\" löschen", - "list": { - "create_button": "Seite erstellen", - "no_result": "Keine Seite", - "title": "Seiten" - } + "selection_actions": { + "result": "Ergebnis", + "s": "", + "x_result_one": "{{count}} Treffer", + "x_result_other": "{{count}} Treffer", + "x_result_with_selection_one": "{{selection}} / {{total}} Treffer", + "x_result_with_selection_other": "{{selection}} / {{total}} Treffer" }, - "pages": { - "create": { - "submit": "Erstellen", - "success": "Seite wurde erfolgreich erstellt", - "title": "Seite erstellen" + "share": { + "dialog": { + "add_new": "Neuen Freigabelink erstellen", + "advanced_mode": "Erweiterter Modus", + "copied": "Link in die Zwischenablage kopiert", + "create_public_link": { + "primary": "Öffentlichen Link erstellen", + "secondary": "Teilen Sie einen Link mit Personen ausserhalb Ihrer Organisation" + }, + "submit": "Link kopieren", + "title": "Asset teilen" }, - "edit": { - "submit": "Speichern", - "success": "Seite wurde erfolgreich gespeichert", - "title": "Seite bearbeiten" + "embed": { + "title": "Eingebettete Freigabe" }, - "form": { - "enabled": { - "label": "Aktiviert" + "item": { + "createdAt": "Erstellt bei {{date}}", + "expiresAt": "Läuft am {{date}} ab", + "rendition": { + "asset": "Asset" }, - "public": { - "label": "Öffentlich" + "startsAt": "Beginnt bei {{date}}" + }, + "socials": { + "email": { + "title": "Per E-Mail teilen" }, - "slug": { - "helper": "Der Slug wird in der Seiten-URL verwendet und muss eindeutig sein.", - "label": "Slug" + "embed": { + "title": "Eingebettete Freigabe" }, - "title": { - "label": "Titel" + "facebook": { + "title": "Auf Facebook teilen" + }, + "instapaper": { + "title": "Auf Instapaper teilen" + }, + "linkedin": { + "title": "Auf LinkedIn teilen" + }, + "pinterest": { + "title": "Auf Pinterest teilen" + }, + "pocket": { + "title": "Auf Pocket teilen" + }, + "telegram": { + "title": "Auf Telegram teilen" + }, + "tumblr": { + "title": "Auf Tumblr teilen" + }, + "whatsapp": { + "title": "Auf WhatsApp teilen" + }, + "workplace": { + "title": "Auf Workplace teilen" + }, + "x": { + "title": "Auf X teilen" } } }, - "permissions": { - "helper_desc": "Berechtigungsstufen:" + "sort_by": { + "sort_by": "Sortiere nach" }, - "remove_bg": { - "cannot_interact": "Sie verfügen nicht über ausreichende Berechtigungen, um Bildhintergrund zu entfernen", - "remove_bg": "Bildhintergrund entfernen", - "bg_removed": "{{title}} - Bildhintergrund entfernt", - "use_slider_to_compare": "Verwenden Sie den Slider zum Vergleichen" + "sort_by_row": { + "ascendant": "aufsteigend", + "descendant": "absteigend" }, - "save_search": { + "story": { + "chip": { + "label": "Story" + } + }, + "substitute_file": { "dialog": { - "title": "Suche speichern" + "intro": "Assets hierher ziehen", + "submit": "Ersetzung", + "title": "Datei ersetzen" } }, - "saved_search": { - "automations": { - "coming_soon": "Automatisierungen kommen bald!" - }, - "form": { - "created": "Die Suche wurde gespeichert!" - }, + "tags": { + "label": "Tags", + "new": { + "label": "Neues Tag" + } + }, + "thread": { + "message": { + "delete": { + "confirm": { + "success": "Nachricht wurde entfernt!", + "title": "Wollen Sie diese Nachricht wirklich löschen?" + } + } + } + }, + "translatable_attribute_tabs": { + "untranslated": "Unübersetzt" + }, + "tuiphoto_editor": { + "file_name": "Dateiname", + "open_recent": "Kürzlich geöffnet", + "original": "Original", + "save": "Speichern", + "save_as": "Speichern unter", + "saved": "Gespeichert!" + }, + "upload": { + "pending": { + "cancel_upload": "Abbrechen", + "empty": "Keine ausstehenden Uploads", + "title": "Ausstehende Uploads", + "toast": { + "message_one": "{{uploaded}} / {{count}} hochgeladen", + "message_other": "{{uploaded}} / {{count}} hochgeladen" + }, + "uploaded": "Hochgeladen" + } + }, + "upload_dropzone": { + "drag_n_drop_some_files_here_or_click_to_select_files": "Ziehen Sie einige Dateien per Drag-and-Drop hierher oder klicken Sie, um Dateien auszuwählen" + }, + "upload_rendition": { + "dialog": { + "submit": "Rendition hochladen", + "success": "Die Rendition wurde erfolgreich hochgeladen", + "title": "Rendition {{renditionName}} hochladen" + } + }, + "use_integration_auth": { + "auth": "Authentifizierung" + }, + "user_preferences": { + "loading": "Benutzereinstellungen werden geladen…" + }, + "workspace": { "info": { "creation_date": "Erstellungsdatum", "id": "ID", - "modification_date": "Datum der Änderung", "owner": "Besitzer" }, "item": { - "delete": "Löschen", - "edit": "Bearbeiten" - }, - "list": { - "title": "Gespeicherte Suchen" + "create_asset": "Asset zum Workspace hinzufügen", + "create_collection": "Kollektion in diesem Workspace hinzufügen", + "edit": "Diesen Workspace bearbeiten" }, "manage": { "acl": { "title": "Berechtigungen" }, - "automations": { - "title": "Automatisierungen" + "attribute_definitions": { + "title": "Attribute" + }, + "attribute_entity": { + "title": "Entitäten" + }, + "attribute_policy": { + "title": "Attributrichtlinien" }, "edit": { "title": "Bearbeiten" }, + "filter_rules": { + "title": "Filterregeln" + }, "info": { "title": "Informationen" }, - "title": "Gespeicherte Suche verwalten: {{name}}" - } + "integrations": { + "title": "Integrationen" + }, + "rendition_definition": { + "title": "Renditions" + }, + "rendition_policy": { + "title": "Richtlinien für die Rendition" + }, + "tags": { + "title": "Tags" + }, + "title": "Workspace {{name}} verwalten" + }, + "no_locale_defined": "In diesem Workspace ist keine Sprache definiert" }, "workspaces": { "list": { diff --git a/databox/client/translations/en.json b/databox/client/translations/en.json index a1a084a2b1..6c5831826a 100644 --- a/databox/client/translations/en.json +++ b/databox/client/translations/en.json @@ -1359,19 +1359,23 @@ "upload_from_url": "Upload from URL" }, "filter_rule": { - "confirm_delete_this_rule": "Confirm delete this rule?", - "exclude": { - "helper": "Assets in this {{type}} will only be visible if they DOES NOT contain these tags.", - "label": "Tags to exclude" - }, - "group": "Group", - "include": { - "helper": "Assets in this {{type}} will only be visible if they contain these tags.", - "label": "Tags to include" + "condition": { + "edit": "Edit condition", + "empty": "No condition defined yet", + "helper": "Assets in this workspace will only be visible if they match this condition.", + "label": "Condition" }, - "or": "or", + "confirm_delete_this_rule": "Confirm delete this rule?", + "groups": "Groups", "rule_applies_for": "Rule applies for:", - "user": "User" + "targets_helper": "Leave both empty to apply this rule to every user.", + "users": "Users" + }, + "filter_rules": { + "edit_this_rule": "Edit this rule", + "everyone": "Everyone", + "filter_rules": "Filter rules", + "new_rule": "New rule" }, "form": { "annotation": { @@ -2451,11 +2455,6 @@ "label": "Story" } }, - "tag_rules": { - "edit_this_rule": "Edit this rule", - "new_rule": "New rule", - "tag_rules": "Tag rules" - }, "tags": { "label": "Tags", "new": { @@ -2571,6 +2570,9 @@ "edit": { "title": "Edit" }, + "filter_rules": { + "title": "Filter rules" + }, "info": { "title": "Info" }, @@ -2583,9 +2585,6 @@ "rendition_policy": { "title": "Rendition Policies" }, - "tag_rules": { - "title": "Tag rules" - }, "tags": { "title": "Tags" }, diff --git a/databox/client/translations/es.json b/databox/client/translations/es.json index 4304337fbd..43082136ff 100644 --- a/databox/client/translations/es.json +++ b/databox/client/translations/es.json @@ -1,7 +1,4 @@ { - "locale": { - "current": "Español" - }, "acl": { "delete": "Eliminar", "form": { @@ -28,18 +25,18 @@ "save_as": "Guardar como" }, "collection_list": { - "collections_one": "+ {{count}} Collection", "collections_many": "", + "collections_one": "+ {{count}} Collection", "collections_other": "", "collections_plural": "+ {{count}} Collection", - "others_one": "+ {{count}} otros", "others_many": "", + "others_one": "+ {{count}} otros", "others_other": "+ {{count}} otros" }, "delete": { "confirm": { - "message_one": "¿Seguro que quieres eliminar este Asset?", "message_many": "", + "message_one": "¿Seguro que quieres eliminar este Asset?", "message_other": "¿Seguro que quieres eliminar {{count}} Asset?", "title": "Confirmar eliminación" } @@ -86,11 +83,11 @@ "label": "Reemplazar" }, "tag_list": { - "others_one": "+ {{count}} otros", "others_many": "", + "others_one": "+ {{count}} otros", "others_other": "+ {{count}} otros", - "tags_one": "+ {{count}} Tag", "tags_many": "", + "tags_one": "+ {{count}} Tag", "tags_other": "+ {{count}} Tag" }, "view": { @@ -133,11 +130,6 @@ } } }, - "attribute_policy": { - "new": { - "label": "Nueva política" - } - }, "attribute_definitions": { "new": { "label": "Nuevo Attributo" @@ -189,9 +181,14 @@ "label": "Nueva entidad" } }, + "attribute_policy": { + "new": { + "label": "Nueva política" + } + }, "attributes": { - "values_one": "{{count}} valores", "values_many": "", + "values_one": "{{count}} valores", "values_other": "" }, "attributes_editor_form": { @@ -327,8 +324,8 @@ "dialog": { "intro": "¿Dónde quieres copiar los Asset seleccionados?", "submit": "Copiar", - "title_one": "Copiar {{count}} Asset", "title_many": "", + "title_one": "Copiar {{count}} Asset", "title_other": "Copiar {{count}} Asset" }, "form": { @@ -423,17 +420,23 @@ "is_missing": "Falta {{title}}" }, "filter_rule": { - "confirm_delete_this_rule": "¿Confirmar eliminación de esta regla?", - "exclude": { - "helper": "Los Asset en esta {{type}} solo serán visibles si NO contienen estos Tag." - }, - "group": "Grupo", - "include": { - "helper": "Los Asset en esta {{type}} solo serán visibles si contienen estos Tag." + "condition": { + "edit": "Editar condición", + "empty": "Aún no se ha definido ninguna condición", + "helper": "Los Asset en este workspace solo serán visibles si coinciden con esta condición.", + "label": "Condición" }, - "or": "o", + "confirm_delete_this_rule": "¿Confirmar eliminación de esta regla?", + "groups": "Grupos", "rule_applies_for": "Regla aplicable para:", - "user": "Usuario" + "targets_helper": "Deje ambos vacíos para aplicar la regla a todos los usuarios.", + "users": "Usuarios" + }, + "filter_rules": { + "edit_this_rule": "Editar esta regla", + "everyone": "Todos", + "filter_rules": "Reglas de filtrado", + "new_rule": "Nueva regla" }, "foo": "bar", "form": { @@ -461,24 +464,10 @@ "item_remove": "Eliminar" } }, - "attribute_policy": { - "editable": { - "label": "Editable" - }, - "name": { - "label": "Nombre" - }, - "public": { - "label": "Público" - } - }, "attribute_definition": { "allowInvalid": { "label": "Permitir valores no válidos" }, - "policy": { - "label": "Clase" - }, "entityList": { "label": "Lista de entidades" }, @@ -491,6 +480,9 @@ "name": { "label": "Nombre" }, + "policy": { + "label": "Clase" + }, "searchable": { "label": "Buscable" }, @@ -512,6 +504,17 @@ "label": "Valor" } }, + "attribute_policy": { + "editable": { + "label": "Editable" + }, + "name": { + "label": "Nombre" + }, + "public": { + "label": "Público" + } + }, "basket": { "description": { "label": "Descripción" @@ -571,18 +574,7 @@ } } }, - "rendition_policy": { - "name": { - "label": "Nombre" - }, - "public": { - "label": "Público" - } - }, "rendition_definition": { - "policy": { - "label": "Clase" - }, "definition": { "label": "Definición de construcción" }, @@ -596,6 +588,12 @@ "pickSourceFile": { "label": "Seleccionar archivo fuente" }, + "policy": { + "label": "Clase" + }, + "useAsAnimatedThumbnail": { + "label": "Usar como miniatura activa" + }, "useAsMain": { "label": "Usar como original" }, @@ -604,9 +602,14 @@ }, "useAsThumbnail": { "label": "Usar como miniatura" + } + }, + "rendition_policy": { + "name": { + "label": "Nombre" }, - "useAsAnimatedThumbnail": { - "label": "Usar como miniatura activa" + "public": { + "label": "Público" } }, "save_as": { @@ -742,6 +745,9 @@ "loading": "Cargando…" } }, + "locale": { + "current": "Español" + }, "menu": { "change_theme": "Cambiar tema", "sign_in": "Iniciar sesión", @@ -757,8 +763,8 @@ "dialog": { "intro": "¿Dónde quieres mover los Asset seleccionados?", "submit": "Mover", - "title_one": "Mover {{count}} Asset", "title_many": "", + "title_one": "Mover {{count}} Asset", "title_other": "Mover {{count}} Asset" } }, @@ -800,14 +806,14 @@ "remove_bg": "Eliminar fondo", "use_slider_to_compare": "Usa el deslizador para comparar" }, - "rendition_policy": { + "rendition_definitions": { "new": { - "label": "Nueva política" + "label": "Nueva Rendition" } }, - "rendition_definitions": { + "rendition_policy": { "new": { - "label": "Nueva Rendition" + "label": "Nueva política" } }, "renditions": { @@ -880,11 +886,6 @@ "title": "Sustituir archivo" } }, - "tag_rules": { - "edit_this_rule": "Editar esta regla", - "new_rule": "Nueva regla", - "tag_rules": "Reglas de Tag" - }, "tags": { "label": "Tag", "new": { @@ -921,29 +922,29 @@ "acl": { "title": "Permisos" }, - "attribute_policy": { - "title": "Políticas de Attributo" - }, "attribute_definitions": { "title": "Attributos" }, "attribute_entity": { "title": "Entidades" }, + "attribute_policy": { + "title": "Políticas de Attributo" + }, "edit": { "title": "Editar" }, + "filter_rules": { + "title": "Reglas de filtrado" + }, "info": { "title": "Información" }, - "rendition_policy": { - "title": "Políticas de Rendition" - }, "rendition_definition": { "title": "Rendition" }, - "tag_rules": { - "title": "Reglas de Tag" + "rendition_policy": { + "title": "Políticas de Rendition" }, "tags": { "title": "Tag" diff --git a/databox/client/translations/fr.json b/databox/client/translations/fr.json index fb8a0a0bed..2411a15e55 100644 --- a/databox/client/translations/fr.json +++ b/databox/client/translations/fr.json @@ -1,23 +1,137 @@ { - "locale": { - "current": "Français", - "switcher": { - "change_data_locale": { - "modal": { - "confirm": "Continuer", - "title": "La page va être actualisée" - } + "Already translated": "Déjà traduit", + "Asset": { + "actions": { + "delete": "Supprimer", + "download": "Télécharger", + "edit": "Modifier", + "edit_attributes": "Modifier les attributs", + "open": "Ouvrir", + "save_as": "Enregistrer sous" + }, + "collection_list": { + "collections": "+ {{count}} collection", + "collections_plural": "+ {{count}} collections", + "others": "+ {{count}} autre", + "others_plural": "+ {{count}} autres" + }, + "delete": { + "confirm": { + "message_many": "", + "message_one": "Êtes-vous sûr de vouloir supprimer cet asset ?", + "message_other": "Êtes-vous sûr de vouloir supprimer {{count}} assets ?", + "title": "Confirmer la suppression" + } + }, + "info": { + "created_at": "Date d'ajout", + "id": "ID", + "last_attribute_modification_date": "Date de dernière modification des attributs", + "last_modification_date": "Date de dernière modification", + "owner": "Propriétaire" + }, + "manage": { + "Renditions": { + "title": "Renditions" }, - "data_locale": { - "default": "Par défaut", - "default_description": "Utiliser la langue de l'interface" + "acl": { + "title": "Permissions", + "versions": "Versions" }, - "filter_placeholder": "Rechercher...", - "title": "Modifier la langue", - "app_languages": "Langues", - "data_languages": "Langue des données" + "attributes": { + "title": "Attributs" + }, + "edit": { + "title": "Modifier" + }, + "info": { + "title": "Informations" + }, + "open": { + "title": "Ouvrir" + }, + "operations": { + "title": "Opérations" + }, + "title": "Gérer l'Asset {{name}}" + }, + "operations": { + "last_asset_workflows": "Derniers workflows d'Assets", + "trigger_workflow_again": "Relancer le workflow", + "view": "Voir", + "you_need_to_run_integrations_again": "Vous devez relancer les intégrations ?" + }, + "replace": { + "label": "Remplacer" + }, + "tag_list": { + "others": "+ {{count}} autre", + "others_plural": "+ {{count}} autres", + "tags": "+ {{count}} tag", + "tags_plural": "+ {{count}} tags" + }, + "view": { + "attributes": "Attributs de l'Asset" + } + }, + "Rendition_definitions": { + "new": { + "label": "Nouvelle Rendition" + } + }, + "Rendition_policy": { + "new": { + "label": "Nouvelle politique d'accès de Rendition" } }, + "Renditions": { + "dirty": "Configuration modifiée", + "download": "Télécharger" + }, + "Workspace": { + "info": { + "creation_date": "Date de création", + "id": "ID" + }, + "item": { + "create_collection": "Ajouter une collection dans ce Workspace", + "edit": "Modifier ce Workspace" + }, + "manage": { + "acl": { + "title": "Permissions" + }, + "attribute_definitions": { + "title": "Définitions d'attributs" + }, + "attribute_entity": { + "title": "Entités" + }, + "attribute_policy": { + "title": "Classes d'attributs" + }, + "edit": { + "title": "Modifier" + }, + "info": { + "title": "Informations" + }, + "rendition_definition": { + "title": "Définitions de Rendition" + }, + "rendition_policy": { + "title": "Classes de Rendition" + }, + "tag_rules": { + "title": "Règles des tags" + }, + "tags": { + "title": "Tags" + }, + "title": "Gérer le Workspace {{name}}" + }, + "no_locale_defined": "Aucune langue définie dans ce Workspace" + }, "acl": { "delete": "Supprimer", "form": { @@ -28,23 +142,11 @@ "placeholder": "Sélectionner un groupe" } }, - "table": { - "cols": { - "user_group": "Utilisateur/Groupe" - } + "parent": { + "show": "Afficher les autorisations des parents {{name}} " }, "permission": { "all": "Toutes", - "create": "Créer", - "delete": "Supprimer", - "edit": "Modifier", - "manage_collection": "Gérez", - "master": "Master", - "operator": "Opérateur", - "owner": "Propriétaire", - "share": "Partager", - "undelete": "Rétablir", - "view": "Visualiser", "asset": { "delete": { "desc": "Permet de supprimer cet Asset", @@ -71,6 +173,15 @@ "label": "Visualiser" } }, + "child_create": "Création de sous-éléments", + "child_delete": "Suppression de sous-éléments", + "child_edit": "Edition de sous-éléments", + "child_master": "Master des sous-éléments", + "child_operator": "Opérateur des sous-éléments", + "child_owner": "Propriétaire des sous-éléments", + "child_share": "Partage des sous-éléments", + "child_undelete": "Restauration des sous-éléments", + "child_view": "Visualisation des sous-éléments", "collection": { "assets_operator": { "desc": "Autorise les actions de gestion sur les Assets ({{manage_asset_desc}}) de la collection et de ses sous-collections.", @@ -130,6 +241,9 @@ "desc": "modifier le titre ou les tags, déplacer vers une autre collection, modifier les renditions, afficher les versions des fichiers" } }, + "create": "Créer", + "delete": "Supprimer", + "edit": "Modifier", "integration": { "child_edit": { "desc": "Permet d'interagir avec l'intégration, par exemple en l'exécutant ou en l'utilisant dans un flux de travail, mais sans modifier sa configuration ni la supprimer.", @@ -148,16 +262,23 @@ "label": "Visualiser" } }, + "manage_collection": "Gérez", + "master": "Master", + "operator": "Opérateur", + "owner": "Propriétaire", "rendition_policy": { "child_edit": { - "label": "Modifier", - "desc": "Modifier la politique de renditions" + "desc": "Modifier la politique de renditions", + "label": "Modifier" }, "child_view": { - "label": "Visualiser", - "desc": "Visualiser la politique de rendition" + "desc": "Visualiser la politique de rendition", + "label": "Visualiser" } }, + "share": "Partager", + "undelete": "Rétablir", + "view": "Visualiser", "workspace": { "assets_operator": { "desc": "Autorise les actions de gestion sur les Assets ({{manage_asset_desc}}) au niveau racine de ce Workspace.", @@ -211,50 +332,119 @@ "desc": "Permet de visualiser tous les Assets du Workspace, mais pas nécessairement les collections auxquelles ils appartiennent.", "label": "Voir les Assets" } - }, - "child_create": "Création de sous-éléments", - "child_delete": "Suppression de sous-éléments", - "child_edit": "Edition de sous-éléments", - "child_master": "Master des sous-éléments", - "child_operator": "Opérateur des sous-éléments", - "child_owner": "Propriétaire des sous-éléments", - "child_share": "Partage des sous-éléments", - "child_undelete": "Restauration des sous-éléments", - "child_view": "Visualisation des sous-éléments" + } }, - "parent": { - "show": "Afficher les autorisations des parents {{name}} " + "table": { + "cols": { + "user_group": "Utilisateur/Groupe" + } } }, - "Asset": { + "annotation": { + "type": { + "arrow": "Flèche", + "circle": "Cercle", + "cue": "Repère", + "draw": "Dessiner", + "line": "Ligne", + "rectangle": "Rectangle", + "target": "Cible", + "text": "Texte", + "timerange": "Intervalle de temps" + } + }, + "annotations": { + "delete_shape": { + "confirm": "Êtes-vous sûr de vouloir supprimer cette forme ?" + } + }, + "appbar": { + "assets": "Assets", + "pages": "Pages" + }, + "aql": { + "constant": { + "no": "Non", + "null": "Nulle", + "yes": "Oui" + } + }, + "asset": { "actions": { + "copy": "Copier", "delete": "Supprimer", "download": "Télécharger", - "edit": "Modifier", - "edit_attributes": "Modifier les attributs", + "edit": "Editer", + "edit_attributes": "Editer les attributs", + "info": "Informations", + "move": "Déplacer", "open": "Ouvrir", - "save_as": "Enregistrer sous" + "replace_source_file": "Remplacer le fichier source", + "restore": "Restaurer", + "save_as": "Enregistrer sous", + "share": "Partager" + }, + "chip": { + "deleted": "Supprimé" }, "collection_list": { - "collections": "+ {{count}} collection", - "collections_plural": "+ {{count}} collections", - "others": "+ {{count}} autre", - "others_plural": "+ {{count}} autres" + "collections_many": "", + "collections_one": "+ {{count}} collection", + "collections_other": "+ {{count}} collections", + "others_many": "", + "others_one": "+ {{count}} autre", + "others_other": "+ {{count}} autres" }, "delete": { "confirm": { - "message_one": "Êtes-vous sûr de vouloir supprimer cet asset ?", "message_many": "", - "message_other": "Êtes-vous sûr de vouloir supprimer {{count}} assets ?", + "message_one": "Etes-vous sûr de vouloir supprimer cet asset ?", + "message_other": "Etes-vous sûr de vouloir supprimer ces assets ?", + "not_allowed": "Vous n'êtes autorisé à supprimer aucun de ces assets", + "text_to_type": { + "delete": "Supprimer" + }, "title": "Confirmer la suppression" - } + }, + "confirm_hard_delete_message_many": "Êtes-vous sûr de vouloir supprimer définitivement {{count}} Assets  ? Cette action ne peut pas être annulée.", + "confirm_hard_delete_message_one": "Êtes-vous sûr de vouloir supprimer définitivement {{count}} Asset  ? Cette action ne peut pas être annulée.", + "confirm_hard_delete_message_other": "Êtes-vous sûr de vouloir supprimer définitivement {{count}} Assets  ? Cette action ne peut pas être annulée.", + "confirm_message_many": "", + "confirm_message_one": "Êtes-vous sûr de vouloir supprimer l'asset ?", + "confirm_message_other": "Êtes-vous sûr de vouloir supprimer les {{count}}  assets ?", + "confirm_move_to_trash_message_many": "Êtes-vous sûr de vouloir déplacer {{count}} Assets vers la corbeille ?", + "confirm_move_to_trash_message_one": "Êtes-vous sûr de vouloir déplacer {{count}} Asset vers la corbeille ?", + "confirm_move_to_trash_message_other": "Êtes-vous sûr de vouloir déplacer {{count}} Assets vers la corbeille ?", + "hard_delete_many": "Supprimer définitivement {{count}} Assets", + "hard_delete_one": "Supprimer définitivement {{count}} Asset", + "hard_delete_other": "Supprimer définitivement {{count}} Assets", + "move_to_trash_many": "", + "move_to_trash_one": "Déplacer {{count}} Asset vers la corbeille", + "move_to_trash_other": "Déplacer les {{count}} Assets vers la corbeille", + "remove_from_collection": "Supprimer de la collection {{name}} ", + "remove_from_story": "Retirer de la Story {{name}} ", + "shared_warning_many": "", + "shared_warning_one": "Cet asset est actuellement partagé. Le supprimer supprimera l'accès de tous les utilisateurs.", + "shared_warning_other": " {{count}} de ces Assets sont actuellement partagés. Les supprimer supprimera l'accès de tous les utilisateurs." + }, + "es_document": { + "sync_now": "Synchroniser maintenant" }, "info": { - "created_at": "Date d'ajout", + "collection": "Collection", + "collections": { + "none": "Aucun" + }, + "created_at": "Créé le", "id": "ID", - "last_attribute_modification_date": "Date de dernière modification des attributs", - "last_modification_date": "Date de dernière modification", - "owner": "Propriétaire" + "last_attribute_modification_date": "Dernière date de modification de l'attribut", + "last_modification_date": "Dernière date de modification", + "owner": "Propriétaire", + "source_file": { + "label": "Fichier source", + "none": "Aucun" + }, + "workspace": "Workspace" }, "manage": { "acl": { @@ -265,7 +455,10 @@ "title": "Attributs" }, "edit": { - "title": "Modifier" + "title": "Editer" + }, + "es_doc": { + "title": "Document ES" }, "info": { "title": "Informations" @@ -276,45 +469,98 @@ "operations": { "title": "Opérations" }, - "Renditions": { + "renditions": { "title": "Renditions" }, - "title": "Gérer l'Asset {{name}}" + "title": "Gérer l'asset {{name}}", + "workflow": { + "title": "Workflow" + } }, + "not_found": "Asset non trouvé", "operations": { - "last_asset_workflows": "Derniers workflows d'Assets", - "trigger_workflow_again": "Relancer le workflow", - "view": "Voir", - "you_need_to_run_integrations_again": "Vous devez relancer les intégrations ?" + "last_asset_workflows": "Derniers workflows de l'asset", + "trigger_workflow_again": "Déclencher à nouveau le workflow", + "view": "Visualiser", + "you_need_to_run_integrations_again": "Avez-vous besoin de relancer les intégrations ?" }, "replace": { "label": "Remplacer" }, + "restore": { + "confirm": { + "title": "Confirmer la restauration" + }, + "confirm_message_many": "Êtes-vous sûr de vouloir restaurer {{count}} Assets ?", + "confirm_message_one": "Êtes-vous sûr de vouloir restaurer {{count}} Asset ?", + "confirm_message_other": "Êtes-vous sûr de vouloir restaurer {{count}} Assets ?", + "deleted_collection": "Restaurer", + "deleted_collection_or_story_warning": "Remarque : Certains Assets ne peuvent pas être restaurés car leurs collections de référence ou leur Stories ont été supprimées :", + "no_restorable_assets": "Aucun des Assets sélectionnés ne peut être restauré car leurs collections de référence ont été supprimées." + }, "tag_list": { - "others": "+ {{count}} autre", - "others_plural": "+ {{count}} autres", - "tags": "+ {{count}} tag", - "tags_plural": "+ {{count}} tags" + "others_many": "", + "others_one": "+ {{count}} autre", + "others_other": "+ {{count}} autres", + "tags_many": "", + "tags_one": "+ {{count}} tag", + "tags_other": "+ {{count}} tags" }, "view": { - "attributes": "Attributs de l'Asset" + "add_attachment": "Ajouter un fichier lié", + "appears_in": "Apparaît dans", + "attachments": "Fichiers liés", + "attributes": "Attributs de l'asset", + "delete_attachment": { + "button": "Supprimer le fichier lié", + "confirm_button": "Supprimer", + "confirm_message": "Êtes-vous sûr de vouloir supprimer ce fichier lié? Cette action ne peut pas être annulée.", + "confirm_title": "Supprimer le fichier lié", + "success_toast": "Le fichier lié a été supprimé avec succès" + }, + "detach_attachment": { + "button": "Détacher de l'Asset", + "confirm_button": "Détacher", + "confirm_message": "Êtes-vous sûr de vouloir le détacher de l'Asset ?", + "confirm_title": "Détacher de l'Asset", + "success_toast": "Le fichier lié a été détaché avec succès" + }, + "discussion": "Discussion", + "info": "Information", + "metrics": { + "not_configured": "Les analyses de Matomo ne sont pas configurées.", + "title": "Métriques" + }, + "rename_attachment": "Renommer le fichier lié" } }, "asset_actions": { "copy": "Dupliquer", "delete": "Supprimer", + "delete_permanently": "Supprimer définitivement", "download": "Télécharger", "edit": "Modifier", "edit_attributes": "Modifier les attributs", "export": "Exporter", "move": "Déplacer", + "restore": "Restaurer", "select_all": "Sélectionner tout", "share": "Partager", - "substitute_file": "Remplacer le fichier", - "unselect_all": "Désélectionner tout", "share_multiple": "Vous ne pouvez partager qu'un asset à la fois", - "delete_permanently": "Supprimer définitivement", - "restore": "Restaurer" + "substitute_file": "Remplacer le fichier", + "unselect_all": "Désélectionner tout" + }, + "asset_collections": { + "other_collections": "Il apparaît aussi comme raccourci dans les collections suivantes :", + "reference_collection": "Cet asset appartient à la collection {{collection}} dans le Workspace {{workspace}}.", + "reference_workspace": "Cet asset appartient à la collection racine du Workspace {{workspace}} .", + "remove_shortcut": "Retirer le raccourci", + "remove_shortcut_confirm": "Etes-vous sûr de vouloir retirer ce raccourci ?", + "title": "Collections" + }, + "asset_delete": { + "confirm": "Êtes-vous sûr de vouloir supprimer cet asset ?", + "title": "Supprimer l'asset" }, "asset_dropzone": { "drop_the_files_here": "Déposez les fichiers ici…", @@ -323,15 +569,47 @@ "asset_file_versions": { "current": "Actuel" }, + "asset_restore": { + "confirm": "Êtes-vous sûr de vouloir restaurer cet Asset ?", + "title": "Restaurer l'Asset" + }, "asset_selection": { "item": "élément", - "x_item_one": "{{count}} asset", "x_item_many": "", + "x_item_one": "{{count}} asset", "x_item_other": "{{total}} assets", - "x_item_with_selection_one": "{{selection}} / {{total}} asset", "x_item_with_selection_many": "", + "x_item_with_selection_one": "{{selection}} / {{total}} asset", "x_item_with_selection_other": "{{selection}} / {{total}} assets" }, + "asset_type": { + "choice": { + "asset": "Assets", + "asset_only": "Assets uniquement", + "both": "Les deux", + "story": "Stories", + "story_only": "Stories uniquement" + } + }, + "asset_version": { + "delete": "Supprimer la version" + }, + "asset_version_delete": { + "confirm": "Êtes-vous sûr de vouloir supprimer cette version ?", + "confirmed": "Version supprimée !" + }, + "asset_view": { + "edit_asset": "Asset {{name}} " + }, + "attachment": { + "dialog": { + "add": { + "submit": "Joindre", + "success": "Un nouveau fichier lié a été ajouté.", + "title": "Ajouter un fichier lié à l'Asset" + } + } + }, "attribute": { "editor": { "tabs": { @@ -353,18 +631,27 @@ } } }, - "attribute_policy": { - "new": { - "label": "Nouvelle politique d'accès" + "attributeList": { + "choose_modal": { + "title": "Sélectionnez la liste d'attributs courante" + }, + "create_button": { + "label": "Créer une nouvelle liste d'attributs" + }, + "default": { + "title": "Ma liste d'attributs" + }, + "delete": { + "confirm": "Êtes-vous sûr de vouloir supprimer cette liste d'attributs ?" } }, "attribute_definitions": { - "new": { - "label": "Nouvel attribut" - }, "filter": { "asset_type": "Filtrer par type d'Asset", "type": "Filtrer par type" + }, + "new": { + "label": "Nouvel attribut" } }, "attribute_editor": { @@ -401,6 +688,14 @@ } }, "attribute_entity": { + "delete": { + "confirm": { + "assertion": { + "delete_attr_def": "Je comprends que cette définition d'attribut \"{{ definitionName }}\" sera supprimée de tous les assets qui l'utilisent.", + "unset_on_attrs": "Je comprends que cette entité sera supprimée de tous les assets qui l'utilisent." + } + } + }, "dialog": { "create": { "title": "Nouvel élément" @@ -411,19 +706,34 @@ }, "new": { "label": "Nouvelle entité" + } + }, + "attribute_list": { + "manage": { + "acl": { + "title": "Permissions" + }, + "edit": { + "title": "Editer" + }, + "organize": { + "title": "Organiser" + }, + "title": "Gérer la liste d'attributs {{name}}" }, - "delete": { - "confirm": { - "assertion": { - "unset_on_attrs": "Je comprends que cette entité sera supprimée de tous les assets qui l'utilisent.", - "delete_attr_def": "Je comprends que cette définition d'attribut \"{{ definitionName }}\" sera supprimée de tous les assets qui l'utilisent." - } - } + "organize": { + "add_divider": "Ajouter un séparateur", + "add_spacer": "Ajouter un espacement" + } + }, + "attribute_policy": { + "new": { + "label": "Nouvelle politique d'accès" } }, "attributes": { - "values_one": "{{count}} valeur", "values_many": "", + "values_one": "{{count}} valeur", "values_other": "{{count}} valeurs" }, "attributes_editor_form": { @@ -438,13 +748,20 @@ "faces": "Visages", "labels": "Étiquettes", "no_face_detected": "Aucun visage détecté", + "no_label_detected": "Aucune étiquette détectée", "no_text_detected": "Aucun texte détecté", "text": "Texte", - "no_label_detected": "Aucune étiquette détectée", "texts": "Textes" } }, "basket": { + "actions": { + "delete": "Supprimer le panier", + "edit": "Editer le panier" + }, + "added_to_basket_many": "{{count}} éléments ajoutés au panier", + "added_to_basket_one": "Elément ajouté au panier", + "added_to_basket_other": "{{count}} éléments ajoutés au panier", "choose_modal": { "title": "Sélectionner le panier actuel" }, @@ -454,6 +771,9 @@ "default": { "title": "Mon panier" }, + "disabled": { + "label": "Vous n'êtes pas autorisé à modifier ce panier" + }, "info": { "creation_date": "Date de création", "id": "ID", @@ -480,59 +800,81 @@ "title": "Opérations" }, "title": "Gérer le panier {{name}}" - }, - "actions": { - "delete": "Supprimer le panier", - "edit": "Editer le panier" - }, - "disabled": { - "label": "Vous n'êtes pas autorisé à modifier ce panier" - }, - "added_to_basket_one": "Elément ajouté au panier", - "added_to_basket_many": "{{count}} éléments ajoutés au panier", - "added_to_basket_other": "{{count}} éléments ajoutés au panier" + } }, "basket_delete": { "confirm": "Êtes-vous sûr de vouloir supprimer ce panier ?", "title": "Supprimer le panier" }, "basket_view_dialog": { + "info": "Informations", + "integrations": "Intégrations", "item": "élément", "remove_from_basket": "Retirer du panier", - "x_item_one": "{{count}} élément", + "title": "Panier {{name}} ", "x_item_many": "", + "x_item_one": "{{count}} élément", "x_item_other": "{{count}} éléments", - "x_item_with_selection_one": "{{selection}} / {{total}} élément", "x_item_with_selection_many": "", - "x_item_with_selection_other": "{{selection}} / {{total}} éléments", - "info": "Informations", - "integrations": "Intégrations", - "title": "Panier {{name}} " - }, - "change_theme": { - "save": "Enregistrer", - "title": "Choisir un thème" - }, - "chip": { - "editable": "Éditable", - "private": "Privé", - "public": "Public", - "read_only": "Lecture seule" + "x_item_with_selection_one": "{{selection}} / {{total}} élément", + "x_item_with_selection_other": "{{selection}} / {{total}} éléments" }, - "collection": { - "info": { - "creation_date": "Date de création", + "built_in_attr": { + "collection": "Collection", + "collections": "Collections", + "createdAt": "Créé le", + "deleted": "Supprimé", + "editedAt": "Edité le", + "fileExtension": "Extension de fichier", + "fileMimeType": "Type de fichier MIME", + "fileSize": "Taille du fichier", + "fileType": "Type de fichier", + "filename": "Nom du fichier", + "has_source": "Dispose d'un fichier source", + "id": "ID", + "isStory": "Story", + "owner": "Propriétaire", + "privacy": "Confidentialité", + "rendition": "Rendition", + "score": "Score", + "stories": "Stories", + "tag": "Tag", + "workspace": "Workspace" + }, + "change_theme": { + "save": "Enregistrer", + "title": "Choisir un thème" + }, + "chip": { + "editable": "Éditable", + "private": "Privé", + "public": "Public", + "read_only": "Lecture seule" + }, + "collection": { + "acl": { + "parent": { + "collection": "Autorisations sur {{name}} ", + "story": "Autorisations pour la Story {{name}} ", + "workspace": "Autorisations sur le Workspace {{name}} " + } + }, + "delete": { + "confirm_message": "Voulez-vous vraiment supprimer la collection  ?" + }, + "info": { + "absolute_path": "Chemin absolu", + "creation_date": "Date de création", "id": "ID", "modification_date": "Date de modification", "owner": "Propriétaire", - "absolute_path": "Chemin absolu", "workspace": "Workspace" }, "item": { "create_asset": "Ajouter un nouvel asset à la collection", "create_collection": "Créer une sous collection", - "edit": "Modifier cette collection", "delete": "Supprimer", + "edit": "Modifier cette collection", "notifications": "Notifications", "restore": "Restaurer" }, @@ -543,25 +885,22 @@ "edit": { "title": "Modifier" }, + "es_doc": { + "title": "Document ES" + }, "info": { "title": "Informations" }, + "notifications": { + "title": "Notifications" + }, "operations": { "title": "Opérations" }, "tag_rules": { "title": "Règles des tags" }, - "title": "Gérer la collection {{name}}", - "es_doc": { - "title": "Document ES" - }, - "notifications": { - "title": "Notifications" - } - }, - "delete": { - "confirm_message": "Voulez-vous vraiment supprimer la collection  ?" + "title": "Gérer la collection {{name}}" }, "restore": { "confirm": { @@ -569,58 +908,58 @@ }, "confirm_message": "Êtes-vous sûr de vouloir restaurer la collection  ?" }, - "acl": { - "parent": { - "collection": "Autorisations sur {{name}} ", - "story": "Autorisations pour la Story {{name}} ", - "workspace": "Autorisations sur le Workspace {{name}} " - } - }, "tree_view": { "new_collection": "Nouvelle collection" } }, "collection_delete": { "confirm": "Êtes-vous sûr de vouloir supprimer cette collection ?", - "title": "Supprimer la collection", - "confirmed": "La collection a été supprimée !" + "confirmed": "La collection a été supprimée !", + "title": "Supprimer la collection" }, "collection_move": { "intro": "Sélectionnez la destination où déplacer cette collection :", - "title": "Déplacer la collection", "move": { "label": "Déplacer la collection" - } + }, + "title": "Déplacer la collection" + }, + "collection_panel": { + "trash": "Corbeille" + }, + "collection_restore": { + "confirmed": "La collection a été restaurée !", + "title": "Restaurer la collection" }, "common": { "cancel": "Annuler", + "close": "Fermer", + "confirm": "Confirmer", "copy": "Dupliquer", "databox": "Databox", "delete": "Supprimer", + "edit": "Editer", + "id": "ID", "item_sorted": "Ordre enregistré !", "loading": "Chargement…", "no": "Non", "or": "ou", "remove": "Retirer", + "revoke": "Révoquer", "save": "Enregistrer", "search": { "placeholder": "Rechercher…", "submit": "Rechercher" }, "uploading": "Téléchargement…", - "yes": "Oui", - "close": "Fermer", - "edit": "Editer", - "revoke": "Révoquer", - "id": "ID", - "confirm": "Confirmer" + "yes": "Oui" }, "copy_assets": { "dialog": { "intro": "Où voulez-vous dupliquer les assets sélectionnés ?", "submit": "Dupliquer", - "title_one": "Dupliquer {{count}} asset", "title_many": "", + "title_one": "Dupliquer {{count}} asset", "title_other": "Dupliquer {{count}} assets" }, "form": { @@ -641,6 +980,26 @@ "copy_toclipboard": { "copied": "Copié dans le presse-papiers !" }, + "create_share_link": { + "dialog": { + "submit": "Créer le lien", + "title": "Créer le lien de partage" + }, + "form": { + "expiresAt": { + "helper": "Optionnel. Si activé, le lien de partage ne sera actif seulement jusqu'à cette date", + "label": "Expire le" + }, + "startsAt": { + "helper": "Optionnel. Si activé, le lien de partage ne sera actif qu'après cette date", + "label": "Débute le" + }, + "title": { + "helper": "Vous pouvez définir à qui s'adresse ce lien de partage", + "label": "Titre" + } + } + }, "danger_zone": "Actions irréversibles", "date_histogram_facet": { "clear_filter": "Effacer le filtre" @@ -671,2011 +1030,1651 @@ "intro": "Veuillez taper \"{{ text }}\" pour confirmer :", "placeholder": "Tapez \"{{ text }}\"" }, - "reset": "Réinitialiser", - "save": "Enregistrer", - "search": "Rechercher", "export_attribute_entities": { + "all_locales": "Toutes les locales", "copy_code": "Copier le code", "format": "Format", - "select_format": "Sélectionner un format", - "title": "Exporter les entités de l'attribut", "locale": "Locale", + "select_format": "Sélectionner un format", "select_locale": "Sélectionner la locale", - "all_locales": "Toutes les locales", + "title": "Exporter les entités de l'attribut", "values": { "helper_text": "Entrez une valeur d'attribut d'entité par ligne.", "label": "Valeurs" } }, - "ok": "OK", "import_attribute_entities": { "import_button": "Importer", "title": "Importer des attributs d'entités à la liste {{list}}", "toast": { "success": "Attributs d'entités importés avec succès." } - } + }, + "ok": "OK", + "reset": "Réinitialiser", + "save": "Enregistrer", + "search": "Rechercher" }, "edit_sort_by": { "add_group_separators_between_results": "Ajouter des séparateurs de groupes entre les résultats", "group_by_sections": "Grouper par sections" }, - "editor_panel": { - "untranslated": "Non traduit" - }, - "export": { - "dialog": { - "intro": "Sélectionnez les renditions que vous voulez exporter :", - "submit": "Exporter", - "title_one": "Exporter {{count}} asset", - "title_many": "", - "title_other": "Exporter {{count}} assets" - } - }, - "expose_basket_integration": { - "also_delete_the_publication": "Supprimer également la publication", - "authorize": "Autoriser", - "force_sync": "Forcer la synchronisation", - "ok": "OK", - "stop_synchronization": "Arrêter la synchronisation ?", - "sync_with_a_publication": "Synchroniser avec une publication", - "edit_publication": "Modifier la publication" - }, - "face_detail_tooltip": { - "age_range": "Tranche d'âge", - "eyeglasses": "Lunettes", - "eyes_open": "Yeux ouverts", - "gender": "Genre", - "has_a_beard": "A une barbe", - "mouth_open": "Bouche ouverte", - "mustache": "Moustache", - "smiling": "Souriant" - }, - "facets": { - "missing_with_total": "Manquant ({{total}})" - }, - "filter": { - "exclude": "Exclure ", - "is_missing": "{{title}} manque" - }, - "filter_rule": { - "confirm_delete_this_rule": "Confirmer la suppression de cette règle ?", - "exclude": { - "helper": "Les Assets dans ce {{type}} seront seulement visibles s'ils NE contiennent PAS ces tags.", - "label": "Tags à exclure" - }, - "group": "Groupe", - "include": { - "helper": "Les Assets dans ce {{type}} seront seulement visibles s'ils contiennent ces tags.", - "label": "Tags à inclure" - }, - "or": "ou", - "rule_applies_for": "La règle s'applique pour :", - "user": "Utilisateur" - }, - "foo": "barre", - "form": { - "asset": { - "tags": { - "label": "Tags" + "editor": { + "format": { + "alignCenter": "Aligner au centre", + "alignJustify": "Justifier", + "alignLeft": "Aligner à gauche", + "alignRight": "Aligner à droite", + "blockQuote": "Bloc de citation", + "block_type": { + "heading": { + "label": "Titre {{number}}" + }, + "paragraph": { + "label": "Normal" + } }, - "templates": { - "label": "Remplir avec un modèle", - "no_options": "Aucun modèle disponible" + "bold": "Gras", + "bulletList": "Liste à puces", + "clear": "Effacer la mise en forme", + "code": "Code", + "codeBlock": "Bloc de code", + "fontFamily": { + "label": "Police" }, - "title": { - "label": "Titre" - } - }, - "asset_create": { - "title": "Créer un asset dans", - "title_with_parent": "Créer un Asset sous" - }, - "asset_edit": { - "success": "Asset modifié !" + "italic": "Italique", + "link": "Lien", + "orderedList": "Liste numérotée", + "redo": "Rétablir", + "save": "Enregistrer", + "strikethrough": "Barrer", + "underline": "Souligner", + "undo": "Annuler", + "view": "Visualiser" }, - "attribute": { - "collection": { - "item_add": "Ajouter {{name}}", - "item_remove": "Retirer" + "link": { + "dialog": { + "dialog_title": "Insérer un lien", + "remove": { + "label": "Supprimer le lien" + }, + "target": { + "blank": { + "label": "Nouvel onglet" + }, + "label": "Ouvrir le lien dans", + "self": { + "label": "Même onglet" + } + }, + "title": { + "label": "Titre (facultatif)" + }, + "url": { + "label": "URL" + } } }, - "attribute_policy": { - "editable": { - "label": "Éditable" - }, - "name": { - "label": "Nom" - }, - "public": { - "label": "Public" + "menu": { + "colors": { + "backgroundColor": "Couleur de fond", + "textColor": "Couleur de texte" } }, - "attribute_definition": { - "allowInvalid": { - "label": "Permettre les valeurs invalides" - }, - "policy": { - "label": "Politique" - }, - "entityList": { - "label": "Liste d'entités" - }, - "field_type": { - "label": "Type de champ" - }, - "multiple": { - "label": "Valeurs multiples" - }, - "name": { - "label": "Nom", - "translate": { - "title": "Traduction" - } - }, - "searchable": { - "label": "Recherchable" - }, - "slug": { - "label": "Slug" - }, - "suggest": { - "label": "Afficher dans les suggestions de recherche" - }, - "translatable": { - "label": "Traduisible" - }, - "editable": { - "label": "Éditable" - }, - "editableInGui": { - "label": "Modifiable dans l'interface graphique" - }, - "enabled": { - "label": "Activé" - }, - "facetEnabled": { - "label": "Facettes" - }, - "fallback": { - "label": "Valeur de repli" - }, - "initialValues": { - "label": "Valeurs initiales" - }, - "sortable": { - "label": "Triable" - }, - "asset_type": { - "label": "Type de l'Asset cible" - } - }, - "attribute_entity": { - "type": { - "label": "Type" - }, - "value": { - "label": "Valeur" - }, - "synonym": { - "label": "Synonyme" - }, - "synonyms": { - "label": "Synonyme" - } - }, - "basket": { - "description": { - "label": "Description" - }, - "title": { - "label": "Titre" - } - }, - "basket_create": { - "success": "Panier créé !", - "title": "Créer un panier" - }, - "basket_edit": { - "success": "Panier modifié !" - }, - "collection": { - "title": { - "label": "Titre", - "translate": { - "title": "Traduire le titre" - } - }, - "privacy": { - "inherited": "Une collection ne peut pas être plus restreinte que sa collection parente." - } - }, - "collection_create": { - "success": "Collection créée !", - "title": "Créer une collection dans", - "title_with_parent": "Créer une collection sous" - }, - "collection_edit": { - "success": "Collection modifiée !" - }, - "collection_move": { - "success": "Collection déplacée !" - }, - "copy_assets": { - "asset_not_linkable": { - "other_ws": "Les assets suivants ne peuvent pas être copiés par référence dans un autre Workspace", - "permission": "Les assets suivants ne peuvent pas être copiés par référence car vous n'avez pas les permissions nécessaires.", - "select_for_hard_copy": "Vous pouvez sélectionner l'asset que vous souhaitez dupliquer vers la destination (copie dure) :" - }, - "destination": { - "label": "Destination" - } - }, - "move_assets": { - "destination": { - "label": "Destination" - } - }, - "permissions": { - "label": "Permissions" - }, - "privacy": { - "label": "Confidentialité", - "choices": { - "helpers": { - "private": "Les utilisateurs peuvent demander l'accès" - }, - "private": "Privé", - "public": "Public", - "secret": "Secret" - }, - "inherited": "Une collection ne peut pas être plus restreinte que sa collection parente.", - "inherited_from_parent": "La confidentialité est héritée du parent : {{privacy}} " - }, - "profile": { - "firstName": { - "translate": { - "title": "Traduire l'étiquette" - } - }, - "description": { - "label": "Description" - }, - "public": { - "label": "Public" - }, - "title": { - "label": "Titre" - } - }, - "rendition_policy": { - "name": { - "label": "Nom" - }, - "public": { - "label": "Public" - }, - "editable": { - "label": "Modifiable" - } - }, - "rendition_definition": { - "policy": { - "label": "Politique de Renditions" - }, - "definition": { - "label": "Définition de Rendition" - }, - "name": { - "label": "Nom", - "translate": { - "title": "Traduction" - } - }, - "parent": { - "helper": "Rendition dont celle-ci est dérivée", - "label": "Parente", - "placeholder": "Fichier source de l'asset" - }, - "pickSourceFile": { - "label": "Sélectionner le fichier source" - }, - "useAsMain": { - "label": "Utiliser comme original" - }, - "useAsPreview": { - "label": "Utiliser comme aperçu" - }, - "useAsThumbnail": { - "label": "Utiliser comme vignette" - }, - "useAsAnimatedThumbnail": { - "label": "Utiliser comme vignette animée" - }, - "useAs": { - "preview": "Aperçu", - "label": "Rendition utilisée pour l'affichage", - "main": "Principal", - "thumbnail": "Vignette", - "animatedThumbnail": "Vignette animée" - }, - "buildMode": { - "label": "Mode de génération" - }, - "substitutable": { - "label": "Substituable" - }, - "target": { - "label": "Type d'Asset cible" - } - }, - "save_as": { - "destination": { - "label": "Destination" - } - }, - "tag": { - "color": { - "label": "Couleur" - }, - "name": { - "label": "Nom" - }, - "translate": { - "name": "Traduction" - } - }, - "upload": { - "destination": { - "label": "Destination" - }, - "submit": { - "title": "Ajouter" - }, - "success": "Assets ajoutés !", - "title": "Ajouter des fichiers", - "quiet": { - "label": "Ne pas déclencher de notification ou de webhook" - }, - "files_to_upload_one": "{{count}} fichier à importer", - "files_to_upload_many": "", - "files_to_upload_other": "{{count}} fichiers à importer", - "reset": "Réinitialiser", - "isStory": { - "label": "Story" - } - }, - "Workspace": { - "fallback_locales": { - "add": "Ajouter une langue par défaut", - "label": "Langue", - "title": "Langue par défaut" - }, - "locales": { - "add": "Ajouter une langue", - "label": "Langue", - "placeholder": "ex. fr ou fr-FR", - "title": "Langues du Workspace" - }, - "public": { - "label": "Public" - }, - "title": { - "label": "Titre" - } - }, - "workspace_edit": { - "success": "Workspace modifié !" - }, - "workspace": { - "fallback_locales": { - "add": "Ajouter une locale", - "label": "Langue", - "title": "Ordre des locales", - "remove": "Supprimer <1>cette langue" - }, - "locales": { - "add": "Ajouter une langue", - "label": "Langue", - "placeholder": "exemple: fr ou fr-FR", - "title": "Langues du Workspace", - "remove": "Supprimer <1>cette langue" - }, - "public": { - "label": "Publique" - }, - "title": { - "label": "Titre", - "translate": { - "title": "Traduction du titre" - } - }, - "fileAnalyzers": { - "label": "Analyseurs de fichiers" - }, - "trashRetentionDelay": { - "label": "Délai de conservation dans la corbeille (en jours)" - } - }, - "attributelist_create": { - "success": "Liste d'attributs créée !", - "title": "Créer une liste d'attributs" - }, - "integration": { - "errors": { - "label": "Dernières erreurs:" - }, - "help": { - "config_refenrece": "Configuration de Référence:", - "copy_reference": "Copier la référence", - "config_reference": "Référence de configuration :" - }, - "if": { - "placeholder": "Condition pour exécuter l'intégration", - "helper": "Condition utilisée pour déterminer si l'intégration doit être exécutée.", - "helper_examples": "Exemples de conditions:", - "label": "IF" - }, - "enabled": { - "label": "Activé" - }, - "config_info": { - "title": "Clés d'intégration" - }, - "integration": { - "label": "Intégration" - }, - "needs": { - "helper": "Ces intégrations doivent être terminées avant que cette intégration ne soit exécutée.", - "label": "A besoin de", - "placeholder": "Sélectionnez les dépendances" - }, - "title": { - "label": "Titre" - }, - "public": { - "label": "Public" - } - }, - "annotation": { - "default_name": "{{type}} #{{n}}" - }, - "attribute_list": { - "description": { - "label": "Description" - }, - "public": { - "label": "Public" - }, - "title": { - "label": "Titre" - } - }, - "attribute_list_edit": { - "success": "Liste d'attributs modifiée !" - }, - "attribute_list_item": { - "display_empty": { - "label": "Afficher même si la valeur est vide" - }, - "format": { - "label": "Format par défaut", - "none": "Aucun" - }, - "key": { - "label": "Valeur" - }, - "save": "Sauvegarder", - "success": "Sauvegardé !" - }, - "entity_type": { - "name": { - "label": "Type" - } - }, - "thread_message": { - "content": { - "placeholder": "Tapez votre message ici" - }, - "edit": { - "label": "Editer" - }, - "submit": { - "label": "Envoyer" - } - }, - "profile_edit": { - "success": "Profil modifié !" - }, - "profile_item": { - "display_empty": { - "label": "Afficher même si la valeur est vide" - }, - "format": { - "label": "Format par défaut", - "none": "Aucun" - }, - "key": { - "label": "Valeur" - }, - "save": "Enregistrer", - "success": "Elément enregistré !" - }, - "profile_create": { - "success": "Profil créé !", - "title": "Créer un Profil" - }, - "saved_search": { - "privacy": { - "label": "Confidentialité", - "private": { - "helper": "Accessible par lien, non listée", - "label": "Privée" - }, - "public": { - "helper": "Listée pour tous les utilisateurs", - "label": "Publique" + "widgets": { + "asset": { + "options": { + "assetId": { + "label": "ID d'Asset" + }, + "borderRadius": { + "label": "Rayon de la bordure (px)" + }, + "gap": { + "label": "Ecart" + }, + "imagePosition": { + "bottom": "En bas", + "label": "Position de l'image", + "left": "Gauche", + "right": "Droite", + "top": "Haut" + }, + "maxHeight": { + "label": "Hauteur maximale (px)" + }, + "maxWidth": { + "label": "Largeur maximale (px)" + }, + "position": { + "fixed": "Fixe", + "label": "Position de l'image", + "static": "Statique" + }, + "title": { + "label": "Titre" + } }, - "secret": { - "helper": "Seulement vous et les utilisateurs autorisés", - "label": "Secrète" - } - }, - "title": { - "label": "Titre" - } - }, - "saved_search_edit": { - "success": "Recherche sauvegardée modifiée !" - } - }, - "get_resolved_sort_by": { - "created_at": "Date d'ajout", - "relevance": "Pertinence" - }, - "get_user_name": { - "all_groups": "Tous les groupes", - "all_users": "Tous les utilisateurs", - "group_not_found": "Groupe non trouvé", - "user_not_found": "Utilisateur non trouvé" - }, - "group_divider": { - "none": "Aucun" - }, - "integration": { - "expose": { - "create_pub": { - "submit": "Créer et synchroniser", - "success": "La publication a été créée et sera synchronisée", - "title": "Créer une publication" - }, - "form": { - "description": "Description", - "enabled": "Activé", - "parent": "Publication parente", - "profile": "Profil de publication", - "slug": "Identifiant", - "title": "Titre de la publication" - }, - "sync": { - "event": { - "sync_clean": "Nettoyage des assets…", - "sync_complete": "Synchronisation terminée !", - "sync_progress": "Synchronisation en cours…" - } - } - }, - "not_allowed_for_use": "Vous n'êtes pas autorisé à utiliser cette intégration" - }, - "layout": { - "options": { - "collections_count": { - "label": "collections" - }, - "display_collections": { - "label": "Afficher les collections" - }, - "display_previews_hover": { - "label": "Afficher l'aperçu au survol" - }, - "display_tags": { - "label": "Afficher les tags" - }, - "display_title": { - "label": "Afficher le titre" - }, - "more": "Plus d'options", - "play_preview_videos": { - "label": "Lecture automatique des vidéos d'aperçu" - }, - "tags_count": { - "label": "tags" + "title": "Asset" }, - "thumb_size": { - "label": "Taille des vignettes" + "carousel": { + "options": { + "backgroundColor": { + "label": "Couleur de fond" + }, + "cover": { + "label": "Mode couverture" + }, + "height": { + "label": "Hauteur (px)" + }, + "maxItems": { + "label": "Nombre maximum d'éléments" + }, + "openAsset": { + "label": "Ouvrir l'Asset par un clic" + }, + "searchId": { + "label": "Recherche sauvegardée" + } + }, + "title": "Carrousel" }, - "title_rows": { - "label": "lignes" + "footer": { + "options": { + "add_link": "Ajouter un lien", + "backgroundColor": { + "label": "Couleur de fond" + }, + "link_label": { + "label": "Intitulé" + }, + "link_url": { + "label": "URL" + }, + "links": { + "label": "Liens" + }, + "textColor": { + "label": "Couleur de texte" + } + }, + "title": "Footer" }, - "preview_options": { - "attributesRatio": { - "label": "Taille des attributs" + "grid": { + "options": { + "backgroundColor": { + "label": "Couleur de fond" + }, + "gap": { + "label": "Espacement" + }, + "maxItems": { + "label": "Nombre maximum d'éléments" + }, + "openAsset": { + "label": "Ouvrir l'Asset par un clic" + }, + "searchId": { + "label": "Recherche sauvegardée" + }, + "size": { + "label": "Taille (px)" + } }, - "displayAttributes": { - "label": "Afficher les attributs dans l'aperçu" + "title": "Grille" + }, + "header_bar": { + "options": { + "add_link": "Ajouter un lien", + "link_label": { + "label": "Intitulé" + }, + "link_url": { + "label": "URL" + }, + "links": { + "label": "Liens" + } }, - "displayFile": { - "label": "Afficher l'aperçu" + "title": "Header" + }, + "remove_widget": "Supprimer le widget", + "search_grid": { + "options": { + "actions": { + "basket": { + "label": "Ajouter au panier" + }, + "copy": { + "label": "Copier" + }, + "delete": { + "label": "Supprimer" + }, + "edit": { + "label": "Modifier" + }, + "export": { + "label": "Exporter" + }, + "info": { + "label": "Informations" + }, + "label": "Actions", + "move": { + "label": "Déplacer" + }, + "open": { + "label": "Ouvrir" + }, + "replace": { + "label": "Remplacer" + }, + "restore": { + "label": "Restaurer" + }, + "share": { + "label": "Partager" + } + }, + "containerHeight": { + "label": "Hauteur du conteneur (px)" + }, + "displayFacets": { + "label": "Afficher les facettes" + }, + "maxItems": { + "label": "Nombre maximum d'éléments" + }, + "openAsset": { + "label": "Ouvrir l'Asset par un clic" + }, + "searchId": { + "label": "Recherche sauvegardée" + }, + "size": { + "label": "Taille (px)" + } }, + "title": "Grille de recherche" + }, + "spacer": { "options": { - "label": "Options de l'aperçu" + "spacing": { + "label": "Espacement" + } }, - "sizeRatio": { - "label": "Taille" - } - } - }, - "previews_locked": "Aperçus verrouillés", - "previews_unlocked": "Aperçus déverrouillés", - "view": { - "grid": "Vue en grille", - "list": "Vue en liste", - "masonry": "Vue en mosaïque" - }, - "display_settings": { - "tooltip": "Paramètres d'affichage" - } - }, - "left_panel": { - "baskets": "Paniers", - "facets": "Facettes", - "tree": "Workspaces", - "navigation": "Navigation" - }, - "load_more": { - "button": { - "load_more": "Charger plus", - "loading": "Chargement…" - } - }, - "menu": { - "change_theme": "Changer de thème", - "sign_in": "Se connecter", - "theme_editor": "Éditeur de thème" - }, - "metric": { - "ms": "ms" - }, - "modal": { - "close": "Fermer" - }, - "move_assets": { - "dialog": { - "intro": "Où voulez-vous déplacer les assets sélectionnés ?", - "submit": "Déplacer", - "title_one": "Déplacer {{count}} asset", - "title_many": "", - "title_other": "Déplacer {{count}} assets" - } - }, - "move_assets_dialog": { - "assets_were_moved": "Les assets ont été déplacés" - }, - "not_found": { - "back_home": "Retour à l'accueil", - "content": "La page que vous cherchez n'existe pas ou a été supprimée", - "title": "Page non trouvée" - }, - "operations_asset": { - "workflow_is_starting": "Workflow démarré !" - }, - "pagination": { - "load_more_collections": "Charger plus de collections" - }, - "pasted_image": { - "filename": "Image-collée-{{date}}" - }, - "permission_table": { - "actions": "Actions", - "no_permissions": "Aucune permission définie" - }, - "privacy": { - "no_access": "Pas d'accès", - "private": "Privé", - "private_in_workspace": "Privé dans le Workspace", - "public": "Public", - "public_for_users": "Public pour les utilisateurs", - "public_in_workspace": "Public dans le Workspace", - "secret": "Secret" - }, - "privacy_field": { - "only_visible_to_workspace": "Visible uniquement pour le Workspace", - "user_must_be_authenticated": "L'utilisateur doit être authentifié" - }, - "remove_bgasset_editor_actions": { - "bg_removed": "{{name}} - Arrière-plan retiré", - "remove_bg": "Retirer l'arrière-plan", - "use_slider_to_compare": "Utiliser le curseur pour comparer" - }, - "Rendition_policy": { - "new": { - "label": "Nouvelle politique d'accès de Rendition" - } - }, - "Rendition_definitions": { - "new": { - "label": "Nouvelle Rendition" - } - }, - "Renditions": { - "dirty": "Configuration modifiée", - "download": "Télécharger" - }, - "replace_asset_with_file_dialog": { - "asset_has_been_replaced": "Le fichier de l'asset a été remplacé", - "please_confirm_replacing_asset": "Confirmer le remplacement du fichier de l'asset.", - "replace_asset_with_file": "Remplacer le fichier de l'asset" - }, - "save_as_button": { - "new_asset": "Nouvel asset", - "Rendition": "Rendition", - "replace_asset_source": "Remplacer la source de l'asset", - "save_as": "Enregistrer sous", - "rendition": "Rendition" - }, - "save_as_template_form": { - "apply_to_collection": "Appliquer à la collection", - "include_collection_children": "Inclure les sous-collections", - "my_template": "Mon modèle…", - "public": "Public", - "remember_attributes": "Inclure les attributs", - "remember_privacy": "Inclure la confidentialité", - "remember_tags": "Inclure les tags", - "save_values_as_template_for_reuse": "Enregistrer les valeurs comme modèle pour réutilisation", - "template_name": "Nom du modèle", - "replace": "Remplacer le modèle appliqué" - }, - "save_file_as_new_asset_dialog": { - "file_is_saved": "Le fichier est enregistré", - "save": "Enregistrer", - "save_file_as_new_asset": "Enregistrer comme nouvel asset", - "title": { - "label": "Titre" + "title": "Espace" + }, + "unknown": "Type de widget inconnu" } }, - "save_file_as_rendition_dialog": { - "Rendition_has_been_saved": "La Rendition a été enregistrée", - "Rendition_to_add_or_replace": "Rendition à ajouter ou à remplacer", - "save_file_as_asset_rendition": "Enregistrer comme rendition de l'asset", - "rendition_to_add_or_replace": "Rendition à ajouter ou remplacer", - "rendition_has_been_saved": "La rendition a été sauvegardée" + "editor_panel": { + "untranslated": "Non traduit" }, - "search": { - "search_button": "Rechercher", - "sort_by": { - "title": "Trier par" - }, - "error": "Oups, une erreur s'est produite :", - "more_options": { - "clear_search": "Effacer la recherche" - }, - "no_results_message": "Nous sommes désolés, mais votre recherche n'a renvoyé aucun Asset  !", - "save_search": "Recherche sauvegardée", - "suggestion": { - "check_spelling": " Vérifiez l'orthographe  : Assurez-vous que tous les termes de recherche sont correctement orthographiés.", - "consider_using_facets": "Envisagez d'utiliser des facettes : Cliquez sur les différentes valeurs de facettes pour affiner ou élargir les résultats (Workspace, collection, tags, dates, etc.).", - "modify_filters": "Modifier les filtres : Si vous avez appliqué des filtres, supprimez-les ou modifiez-les pour élargir le champ de recherche." + "entity_type": { + "definitions": { + "count_many": "", + "count_one": "Utilisé sur {{ count }} définition d'attribut", + "count_other": "Utilisé sur {{ count }} définitions d'attributs", + "none": "Pas d'utilisation de définitions d'attributs" }, - "update_search": "Mettre à jour la recherche", - "update_success": "La recherche a été mise à jour avec succès !" - }, - "search_auto_complete": { - "search": "Rechercher…" - }, - "search_provider": { - "collections": "Collections", - "workspaces": "Workspaces" - }, - "selection_actions": { - "result": "résultat", - "s": "s", - "x_result_one": "{{count}} résultat", - "x_result_many": "", - "x_result_other": "{{count}} résultats", - "x_result_with_selection_one": "{{selection}} / {{total}} résultat", - "x_result_with_selection_many": "", - "x_result_with_selection_other": "{{selection}} / {{total}} résultats" - }, - "sort_by": { - "sort_by": "Trier par" + "delete": { + "confirm": { + "assertion": { + "no_undo": "Je suis conscient que cette action est irréversible.", + "unset_on_attrs": "Je suis conscient que toutes les entités de cette liste seront supprimés des attributs de l'asset." + } + } + }, + "list": { + "export": "Exporter", + "import": "Importer" + }, + "new": { + "label": "Nouvelle liste d'entités" + } }, - "sort_by_row": { - "ascendant": "Ascendant", - "descendant": "Descendant" + "es_document": { + "not_synced": "Ce document n'est pas synchronisé dans l'index.", + "refresh": "Actualiser", + "sync_scheduled": "Synchronisation planifiée" }, - "substitute_file": { + "export": { "dialog": { - "intro": "Déposer ici", - "submit": "Remplacer", - "title": "Remplacer le fichier" + "intro": "Sélectionnez les renditions que vous voulez exporter :", + "submit": "Exporter", + "title_many": "", + "title_one": "Exporter {{count}} asset", + "title_other": "Exporter {{count}} assets" } }, - "tag_rules": { - "edit_this_rule": "Modifier cette règle", - "new_rule": "Nouvelle règle", - "tag_rules": "Règles des tags" + "expose_basket_integration": { + "also_delete_the_publication": "Supprimer également la publication", + "authorize": "Autoriser", + "edit_publication": "Modifier la publication", + "force_sync": "Forcer la synchronisation", + "ok": "OK", + "stop_synchronization": "Arrêter la synchronisation ?", + "sync_with_a_publication": "Synchroniser avec une publication" }, - "tags": { - "label": "Tags", - "new": { - "label": "Nouveau tag" + "face_detail_tooltip": { + "age_range": "Tranche d'âge", + "eyeglasses": "Lunettes", + "eyes_open": "Yeux ouverts", + "gender": "Genre", + "has_a_beard": "A une barbe", + "mouth_open": "Bouche ouverte", + "mustache": "Moustache", + "smiling": "Souriant" + }, + "facet": { + "boolean": { + "false": { + "label": "Non ({{n}})" + }, + "true": { + "label": "Oui ({{n}})" + } } }, - "translatable_attribute_tabs": { - "untranslated": "Non traduit" + "facets": { + "missing_with_total": "Manquant ({{total}})" }, - "tuiphoto_editor": { - "file_name": "Nom du fichier", - "open_recent": "Ouvrir récent", - "original": "Original", - "save": "Enregistrer", - "save_as": "Enregistrer sous", - "saved": "Enregistré !" + "file": { + "analysis_pending": "Analyse en cours…", + "dialog": { + "metadata": { + "refresh": "Actualiser" + } + }, + "info": { + "accepted": "Accepté", + "analysis": "Analyse", + "analysis_pending": "Analyse en attente", + "id": "ID", + "size": "Taille", + "size_unknown": "Inconnu", + "type": "Type", + "url": "URL", + "url_none": "N/A" + }, + "manage": { + "info": { + "title": "Informations" + }, + "metadata": { + "title": "Métadonnées" + }, + "title": "Gérer le fichier {{name}}" + }, + "rejected": "Rejeté" }, - "upload_dropzone": { - "drag_n_drop_some_files_here_or_click_to_select_files": "Glissez-déposez des fichiers, cliquez pour sélectionner des fichiers ou coller le presse-papiers" + "file_upload": { + "asset_created_many": "{{count}} Assets créés avec succès.", + "asset_created_one": "{{count}} Asset créé avec succès.", + "asset_created_other": "{{count}} Assets créés avec succès.", + "back_to_file_upload": "Charger un fichier", + "back_to_files_upload": "Charger des fichiers", + "from_url": { + "placeholder": "Saisir l'URL du fichier" + }, + "from_urls": { + "placeholder": "Entrez les URL de fichier, une par ligne" + }, + "import_file": "Importer un fichier", + "import_files": "Importer un ou plusieurs fichiers", + "upload_from_url": "Importer à partir d'une l'URL" }, - "use_integration_auth": { - "auth": "Authentification" + "filter": { + "exclude": "Exclure ", + "is_missing": "{{title}} manque" }, - "Workspace": { - "info": { - "creation_date": "Date de création", - "id": "ID" + "filter_rule": { + "condition": { + "edit": "Modifier la condition", + "empty": "Aucune condition définie", + "helper": "Les Assets dans ce workspace seront seulement visibles s'ils correspondent à cette condition.", + "label": "Condition" }, - "item": { - "create_collection": "Ajouter une collection dans ce Workspace", - "edit": "Modifier ce Workspace" + "confirm_delete_this_rule": "Confirmer la suppression de cette règle ?", + "groups": "Groupes", + "rule_applies_for": "La règle s'applique pour :", + "targets_helper": "Laissez les deux vides pour appliquer la règle à tous les utilisateurs.", + "users": "Utilisateurs" + }, + "filter_rules": { + "edit_this_rule": "Modifier cette règle", + "everyone": "Tout le monde", + "filter_rules": "Règles de filtrage", + "new_rule": "Nouvelle règle" + }, + "foo": "barre", + "form": { + "Workspace": { + "fallback_locales": { + "add": "Ajouter une langue par défaut", + "label": "Langue", + "title": "Langue par défaut" + }, + "locales": { + "add": "Ajouter une langue", + "label": "Langue", + "placeholder": "ex. fr ou fr-FR", + "title": "Langues du Workspace" + }, + "public": { + "label": "Public" + }, + "title": { + "label": "Titre" + } }, - "manage": { - "acl": { - "title": "Permissions" + "annotation": { + "default_name": "{{type}} #{{n}}" + }, + "asset": { + "tags": { + "label": "Tags" }, - "attribute_policy": { - "title": "Classes d'attributs" + "templates": { + "label": "Remplir avec un modèle", + "no_options": "Aucun modèle disponible" }, - "attribute_definitions": { - "title": "Définitions d'attributs" + "title": { + "label": "Titre" + } + }, + "asset_create": { + "title": "Créer un asset dans", + "title_with_parent": "Créer un Asset sous" + }, + "asset_edit": { + "success": "Asset modifié !" + }, + "attribute": { + "collection": { + "item_add": "Ajouter {{name}}", + "item_remove": "Retirer" + } + }, + "attribute_definition": { + "allowInvalid": { + "label": "Permettre les valeurs invalides" + }, + "asset_type": { + "label": "Type de l'Asset cible" + }, + "editable": { + "label": "Éditable" + }, + "editableInGui": { + "label": "Modifiable dans l'interface graphique" + }, + "enabled": { + "label": "Activé" + }, + "entityList": { + "label": "Liste d'entités" + }, + "facetEnabled": { + "label": "Facettes" + }, + "fallback": { + "label": "Valeur de repli" + }, + "field_type": { + "label": "Type de champ" + }, + "initialValues": { + "label": "Valeurs initiales" + }, + "multiple": { + "label": "Valeurs multiples" + }, + "name": { + "label": "Nom", + "translate": { + "title": "Traduction" + } + }, + "policy": { + "label": "Politique" + }, + "searchable": { + "label": "Recherchable" + }, + "slug": { + "label": "Slug" + }, + "sortable": { + "label": "Triable" + }, + "suggest": { + "label": "Afficher dans les suggestions de recherche" + }, + "translatable": { + "label": "Traduisible" + } + }, + "attribute_entity": { + "synonym": { + "label": "Synonyme" + }, + "synonyms": { + "label": "Synonyme" + }, + "type": { + "label": "Type" + }, + "value": { + "label": "Valeur" + } + }, + "attribute_list": { + "description": { + "label": "Description" }, - "attribute_entity": { - "title": "Entités" + "public": { + "label": "Public" }, - "edit": { - "title": "Modifier" + "title": { + "label": "Titre" + } + }, + "attribute_list_edit": { + "success": "Liste d'attributs modifiée !" + }, + "attribute_list_item": { + "display_empty": { + "label": "Afficher même si la valeur est vide" }, - "info": { - "title": "Informations" + "format": { + "label": "Format par défaut", + "none": "Aucun" }, - "rendition_policy": { - "title": "Classes de Rendition" + "key": { + "label": "Valeur" }, - "rendition_definition": { - "title": "Définitions de Rendition" + "save": "Sauvegarder", + "success": "Sauvegardé !" + }, + "attribute_policy": { + "editable": { + "label": "Éditable" }, - "tag_rules": { - "title": "Règles des tags" + "name": { + "label": "Nom" }, - "tags": { - "title": "Tags" + "public": { + "label": "Public" + } + }, + "attributelist_create": { + "success": "Liste d'attributs créée !", + "title": "Créer une liste d'attributs" + }, + "basket": { + "description": { + "label": "Description" }, - "title": "Gérer le Workspace {{name}}" + "title": { + "label": "Titre" + } }, - "no_locale_defined": "Aucune langue définie dans ce Workspace" - }, - "asset": { - "actions": { - "download": "Télécharger", - "edit_attributes": "Editer les attributs", - "edit": "Editer", - "delete": "Supprimer", - "save_as": "Enregistrer sous", - "open": "Ouvrir", - "info": "Informations", - "move": "Déplacer", - "replace_source_file": "Remplacer le fichier source", - "share": "Partager", - "copy": "Copier", - "restore": "Restaurer" + "basket_create": { + "success": "Panier créé !", + "title": "Créer un panier" }, - "collection_list": { - "collections_one": "+ {{count}} collection", - "collections_many": "", - "collections_other": "+ {{count}} collections", - "others_one": "+ {{count}} autre", - "others_many": "", - "others_other": "+ {{count}} autres" + "basket_edit": { + "success": "Panier modifié !" }, - "manage": { - "operations": { - "title": "Opérations" + "collection": { + "privacy": { + "inherited": "Une collection ne peut pas être plus restreinte que sa collection parente." }, - "acl": { - "title": "Permissions", - "versions": "Versions" + "title": { + "label": "Titre", + "translate": { + "title": "Traduire le titre" + } + } + }, + "collection_create": { + "success": "Collection créée !", + "title": "Créer une collection dans", + "title_with_parent": "Créer une collection sous" + }, + "collection_edit": { + "success": "Collection modifiée !" + }, + "collection_move": { + "success": "Collection déplacée !" + }, + "copy_assets": { + "asset_not_linkable": { + "other_ws": "Les assets suivants ne peuvent pas être copiés par référence dans un autre Workspace", + "permission": "Les assets suivants ne peuvent pas être copiés par référence car vous n'avez pas les permissions nécessaires.", + "select_for_hard_copy": "Vous pouvez sélectionner l'asset que vous souhaitez dupliquer vers la destination (copie dure) :" }, - "attributes": { - "title": "Attributs" + "destination": { + "label": "Destination" + } + }, + "entity_type": { + "name": { + "label": "Type" + } + }, + "integration": { + "config_info": { + "title": "Clés d'intégration" }, - "edit": { - "title": "Editer" + "enabled": { + "label": "Activé" }, - "info": { - "title": "Informations" + "errors": { + "label": "Dernières erreurs:" }, - "open": { - "title": "Ouvrir" + "help": { + "config_refenrece": "Configuration de Référence:", + "config_reference": "Référence de configuration :", + "copy_reference": "Copier la référence" }, - "renditions": { - "title": "Renditions" + "if": { + "helper": "Condition utilisée pour déterminer si l'intégration doit être exécutée.", + "helper_examples": "Exemples de conditions:", + "label": "IF", + "placeholder": "Condition pour exécuter l'intégration" }, - "title": "Gérer l'asset {{name}}", - "es_doc": { - "title": "Document ES" + "integration": { + "label": "Intégration" }, - "workflow": { - "title": "Workflow" - } - }, - "delete": { - "confirm": { - "title": "Confirmer la suppression", - "message_one": "Etes-vous sûr de vouloir supprimer cet asset ?", - "message_many": "", - "message_other": "Etes-vous sûr de vouloir supprimer ces assets ?", - "not_allowed": "Vous n'êtes autorisé à supprimer aucun de ces assets", - "text_to_type": { - "delete": "Supprimer" - } + "needs": { + "helper": "Ces intégrations doivent être terminées avant que cette intégration ne soit exécutée.", + "label": "A besoin de", + "placeholder": "Sélectionnez les dépendances" }, - "confirm_message_one": "Êtes-vous sûr de vouloir supprimer l'asset ?", - "confirm_message_many": "", - "confirm_message_other": "Êtes-vous sûr de vouloir supprimer les {{count}}  assets ?", - "hard_delete_one": "Supprimer définitivement {{count}} Asset", - "hard_delete_many": "Supprimer définitivement {{count}} Assets", - "hard_delete_other": "Supprimer définitivement {{count}} Assets", - "remove_from_collection": "Supprimer de la collection {{name}} ", - "shared_warning_one": "Cet asset est actuellement partagé. Le supprimer supprimera l'accès de tous les utilisateurs.", - "shared_warning_many": "", - "shared_warning_other": " {{count}} de ces Assets sont actuellement partagés. Les supprimer supprimera l'accès de tous les utilisateurs.", - "confirm_hard_delete_message_one": "Êtes-vous sûr de vouloir supprimer définitivement {{count}} Asset  ? Cette action ne peut pas être annulée.", - "confirm_hard_delete_message_many": "Êtes-vous sûr de vouloir supprimer définitivement {{count}} Assets  ? Cette action ne peut pas être annulée.", - "confirm_hard_delete_message_other": "Êtes-vous sûr de vouloir supprimer définitivement {{count}} Assets  ? Cette action ne peut pas être annulée.", - "confirm_move_to_trash_message_one": "Êtes-vous sûr de vouloir déplacer {{count}} Asset vers la corbeille ?", - "confirm_move_to_trash_message_many": "Êtes-vous sûr de vouloir déplacer {{count}} Assets vers la corbeille ?", - "confirm_move_to_trash_message_other": "Êtes-vous sûr de vouloir déplacer {{count}} Assets vers la corbeille ?", - "move_to_trash_one": "Déplacer {{count}} Asset vers la corbeille", - "move_to_trash_many": "", - "move_to_trash_other": "Déplacer les {{count}} Assets vers la corbeille", - "remove_from_story": "Retirer de la Story {{name}} " - }, - "info": { - "id": "ID", - "last_attribute_modification_date": "Dernière date de modification de l'attribut", - "last_modification_date": "Dernière date de modification", - "owner": "Propriétaire", - "created_at": "Créé le", - "collection": "Collection", - "collections": { - "none": "Aucun" + "public": { + "label": "Public" }, - "workspace": "Workspace", - "source_file": { - "label": "Fichier source", - "none": "Aucun" + "title": { + "label": "Titre" } }, - "operations": { - "last_asset_workflows": "Derniers workflows de l'asset", - "trigger_workflow_again": "Déclencher à nouveau le workflow", - "view": "Visualiser", - "you_need_to_run_integrations_again": "Avez-vous besoin de relancer les intégrations ?" + "move_assets": { + "destination": { + "label": "Destination" + } }, - "replace": { - "label": "Remplacer" + "permissions": { + "label": "Permissions" }, - "tag_list": { - "others_one": "+ {{count}} autre", - "others_many": "", - "others_other": "+ {{count}} autres", - "tags_one": "+ {{count}} tag", - "tags_many": "", - "tags_other": "+ {{count}} tags" + "privacy": { + "choices": { + "helpers": { + "private": "Les utilisateurs peuvent demander l'accès" + }, + "private": "Privé", + "public": "Public", + "secret": "Secret" + }, + "inherited": "Une collection ne peut pas être plus restreinte que sa collection parente.", + "inherited_from_parent": "La confidentialité est héritée du parent : {{privacy}} ", + "label": "Confidentialité" }, - "view": { - "attributes": "Attributs de l'asset", - "discussion": "Discussion", - "info": "Information", - "appears_in": "Apparaît dans", - "add_attachment": "Ajouter un fichier lié", - "attachments": "Fichiers liés", - "delete_attachment": { - "confirm_button": "Supprimer", - "confirm_message": "Êtes-vous sûr de vouloir supprimer ce fichier lié? Cette action ne peut pas être annulée.", - "confirm_title": "Supprimer le fichier lié", - "button": "Supprimer le fichier lié", - "success_toast": "Le fichier lié a été supprimé avec succès" + "profile": { + "description": { + "label": "Description" }, - "rename_attachment": "Renommer le fichier lié", - "detach_attachment": { - "button": "Détacher de l'Asset", - "confirm_button": "Détacher", - "confirm_message": "Êtes-vous sûr de vouloir le détacher de l'Asset ?", - "confirm_title": "Détacher de l'Asset", - "success_toast": "Le fichier lié a été détaché avec succès" + "firstName": { + "translate": { + "title": "Traduire l'étiquette" + } }, - "metrics": { - "not_configured": "Les analyses de Matomo ne sont pas configurées.", - "title": "Métriques" + "public": { + "label": "Public" + }, + "title": { + "label": "Titre" } }, - "es_document": { - "sync_now": "Synchroniser maintenant" + "profile_create": { + "success": "Profil créé !", + "title": "Créer un Profil" }, - "not_found": "Asset non trouvé", - "chip": { - "deleted": "Supprimé" + "profile_edit": { + "success": "Profil modifié !" }, - "restore": { - "confirm": { - "title": "Confirmer la restauration" + "profile_item": { + "display_empty": { + "label": "Afficher même si la valeur est vide" }, - "confirm_message_one": "Êtes-vous sûr de vouloir restaurer {{count}} Asset ?", - "confirm_message_many": "Êtes-vous sûr de vouloir restaurer {{count}} Assets ?", - "confirm_message_other": "Êtes-vous sûr de vouloir restaurer {{count}} Assets ?", - "deleted_collection": "Restaurer", - "deleted_collection_or_story_warning": "Remarque : Certains Assets ne peuvent pas être restaurés car leurs collections de référence ou leur Stories ont été supprimées :", - "no_restorable_assets": "Aucun des Assets sélectionnés ne peut être restauré car leurs collections de référence ont été supprimées." - } - }, - "renditions": { - "dirty": "Les réglages de cette Rendition ont été modifiés après sa génération (Dirty).", - "download": "Télécharger", - "delete": "Supprimer", - "replace": "Remplacer", - "upload": "Importer la Rendition" - }, - "workspace": { - "info": { - "id": "ID", - "creation_date": "Date de création", - "owner": "Propriétaire" - }, - "item": { - "edit": "Modifier le Workspace", - "create_collection": "Ajouter la collection dans ce Workspace", - "create_asset": "Ajouter un Asset au Workspace" + "format": { + "label": "Format par défaut", + "none": "Aucun" + }, + "key": { + "label": "Valeur" + }, + "save": "Enregistrer", + "success": "Elément enregistré !" }, - "manage": { - "acl": { - "title": "Permissions" + "rendition_definition": { + "buildMode": { + "label": "Mode de génération" }, - "attribute_policy": { - "title": "Politiques d'accès des attributs" + "definition": { + "label": "Définition de Rendition" }, - "attribute_definitions": { - "title": "Attributs" + "name": { + "label": "Nom", + "translate": { + "title": "Traduction" + } }, - "attribute_entity": { - "title": "Entités" + "parent": { + "helper": "Rendition dont celle-ci est dérivée", + "label": "Parente", + "placeholder": "Fichier source de l'asset" }, - "edit": { - "title": "Editer" + "pickSourceFile": { + "label": "Sélectionner le fichier source" }, - "info": { - "title": "Informations" + "policy": { + "label": "Politique de Renditions" }, - "rendition_definition": { - "title": "Renditions" + "substitutable": { + "label": "Substituable" }, - "tag_rules": { - "title": "Règles de Tags" + "target": { + "label": "Type d'Asset cible" }, - "tags": { - "title": "Tags" + "useAs": { + "animatedThumbnail": "Vignette animée", + "label": "Rendition utilisée pour l'affichage", + "main": "Principal", + "preview": "Aperçu", + "thumbnail": "Vignette" }, - "title": "Gérer le Workspace {{name}}", - "rendition_policy": { - "title": "Politiques d'accès aux renditions" + "useAsAnimatedThumbnail": { + "label": "Utiliser comme vignette animée" }, - "integrations": { - "title": "Intégrations" + "useAsMain": { + "label": "Utiliser comme original" + }, + "useAsPreview": { + "label": "Utiliser comme aperçu" + }, + "useAsThumbnail": { + "label": "Utiliser comme vignette" } }, - "no_locale_defined": "Aucune langue définie pour ce Workspace" - }, - "rendition_policy": { - "new": { - "label": "Nouvelle politique d'accès" - } - }, - "rendition_definitions": { - "new": { - "label": "Nouvelle rendition" + "rendition_policy": { + "editable": { + "label": "Modifiable" + }, + "name": { + "label": "Nom" + }, + "public": { + "label": "Public" + } }, - "filter": { - "asset_type": "Filtrer par type d'Asset" - } - }, - "annotations": { - "delete_shape": { - "confirm": "Êtes-vous sûr de vouloir supprimer cette forme ?" - } - }, - "attributeList": { - "choose_modal": { - "title": "Sélectionnez la liste d'attributs courante" + "save_as": { + "destination": { + "label": "Destination" + } }, - "create_button": { - "label": "Créer une nouvelle liste d'attributs" + "saved_search": { + "privacy": { + "label": "Confidentialité", + "private": { + "helper": "Accessible par lien, non listée", + "label": "Privée" + }, + "public": { + "helper": "Listée pour tous les utilisateurs", + "label": "Publique" + }, + "secret": { + "helper": "Seulement vous et les utilisateurs autorisés", + "label": "Secrète" + } + }, + "title": { + "label": "Titre" + } }, - "default": { - "title": "Ma liste d'attributs" + "saved_search_edit": { + "success": "Recherche sauvegardée modifiée !" }, - "delete": { - "confirm": "Êtes-vous sûr de vouloir supprimer cette liste d'attributs ?" - } - }, - "entity_type": { - "delete": { - "confirm": { - "assertion": { - "unset_on_attrs": "Je suis conscient que toutes les entités de cette liste seront supprimés des attributs de l'asset.", - "no_undo": "Je suis conscient que cette action est irréversible." - } + "tag": { + "color": { + "label": "Couleur" + }, + "name": { + "label": "Nom" + }, + "translate": { + "name": "Traduction" } }, - "new": { - "label": "Nouvelle liste d'entités" + "thread_message": { + "content": { + "placeholder": "Tapez votre message ici" + }, + "edit": { + "label": "Editer" + }, + "submit": { + "label": "Envoyer" + } }, - "definitions": { - "count_one": "Utilisé sur {{ count }} définition d'attribut", - "count_many": "", - "count_other": "Utilisé sur {{ count }} définitions d'attributs", - "none": "Pas d'utilisation de définitions d'attributs" + "upload": { + "destination": { + "label": "Destination" + }, + "files_to_upload_many": "", + "files_to_upload_one": "{{count}} fichier à importer", + "files_to_upload_other": "{{count}} fichiers à importer", + "isStory": { + "label": "Story" + }, + "quiet": { + "label": "Ne pas déclencher de notification ou de webhook" + }, + "reset": "Réinitialiser", + "submit": { + "title": "Ajouter" + }, + "success": "Assets ajoutés !", + "title": "Ajouter des fichiers" }, - "list": { - "export": "Exporter", - "import": "Importer" - } - }, - "es_document": { - "sync_scheduled": "Synchronisation planifiée", - "not_synced": "Ce document n'est pas synchronisé dans l'index.", - "refresh": "Actualiser" - }, - "notification": { - "action": { - "follow": { - "label": "Suivre" + "workspace": { + "fallback_locales": { + "add": "Ajouter une locale", + "label": "Langue", + "remove": "Supprimer <1>cette langue", + "title": "Ordre des locales" + }, + "fileAnalyzers": { + "label": "Analyseurs de fichiers" + }, + "locales": { + "add": "Ajouter une langue", + "label": "Langue", + "placeholder": "exemple: fr ou fr-FR", + "remove": "Supprimer <1>cette langue", + "title": "Langues du Workspace" + }, + "public": { + "label": "Publique" }, - "unfollow": { - "label": "Ne plus suivre" - } - }, - "topics": { - "asset": { - "new_comment": { - "desc": "Recevoir une notification lors d'un nouveau commentaire", - "label": "Discussion" - }, - "delete": { - "desc": "Recevoir une notification lorsque l'asset est supprimé", - "label": "Suppression" - }, - "update": { - "desc": "Recevoir une notification lorsque l'asset est mis à jour", - "label": "Mise à jour" + "title": { + "label": "Titre", + "translate": { + "title": "Traduction du titre" } }, - "collection": { - "asset_new_comment": { - "desc": "Recevoir une notification lors d'un nouveau commentaire sur un asset de cette collection", - "label": "Discussion" - }, - "asset_add": { - "desc": "Recevoir une notification lorsqu'un asset est ajouté à la collection", - "label": "Asset ajouté" - }, - "asset_remove": { - "desc": "Recevoir une notification lorsqu'un asset est supprimé de la collection", - "label": "Asset supprimé" - }, - "asset_update": { - "desc": "Recevoir une notification lorsqu'un asset de cette collection est modifié", - "label": "Asset mis à jour" - }, - "not_authenticated": "Vous n'êtes pas authentifié pour suivre cette collection" + "trashRetentionDelay": { + "label": "Délai de conservation dans la corbeille (en jours)" } + }, + "workspace_edit": { + "success": "Workspace modifié !" } }, - "rendition_delete": { - "confirm": "Êtes-vous sûr de vouloir supprimer cette rendition ?", - "confirmed": "La rendition a été supprimée!" + "get_resolved_sort_by": { + "created_at": "Date d'ajout", + "relevance": "Pertinence" }, - "rentition": { - "flags": { - "non_projection": "Rendition plus conforme à la configuration définie", - "is_projection": "La rendition est une déclinaison de la source", - "locked": "Rendition verrouillée", - "substituted": "La rendition a été remplacée" - } + "get_user_name": { + "all_groups": "Tous les groupes", + "all_users": "Tous les utilisateurs", + "group_not_found": "Groupe non trouvé", + "user_not_found": "Utilisateur non trouvé" }, - "replace_asset": { - "dialog": { - "success": "Le nouveau fichier source d'asset a été chargé, remplacement en cours.", - "title": "Substituer le fichier source de l'asset", - "submit": "Substituer" - } + "group_divider": { + "none": "Aucun" }, - "search_condition": { - "builder": { - "add_condition_group": "Ajouter un groupe de conditions", - "operator": { - "not_between": "Non compris entre", - "not_matches": "Ne correspond pas", - "within_rectangle": "Dans un rectangle", - "and": "ET", - "between": "Entre", - "contains": "Contient", - "equals": "= (Égale)", - "exists": "Existe", - "greater_than": "> (Supérieur à)", - "greater_than_or_equals": ">= (Supérieur ou égal)", - "in": "Inclus dans", - "less_than": "< (Inférieur à)", - "less_than_or_equals": "<= (Inférieur ou égal à)", - "matches": "Correspond à", - "missing": "Est vide", - "not_contains": "Ne contient pas", - "not_equals": "! = (différent de)", - "not_in": "Non inclus dans", - "not_starts_with": "Ne commence pas par", - "or": "OU", - "starts_with": "Commence par", - "within_circle": "Dans un rayon de", - "within_circle_latitude": "Latitude", - "within_circle_longitude": "Longitude", - "within_circle_radius": "Rayon", - "within_rectangle_bottom_right_latitude": "Latitude bas droite", - "within_rectangle_bottom_right_longitude": "Longitude bas droite", - "within_rectangle_top_left_latitude": "Latitude haute gauche", - "within_rectangle_top_left_longitude": "Longitude haute gauche", - "placeholder": "Opérateur" + "integration": { + "expose": { + "create_pub": { + "submit": "Créer et synchroniser", + "success": "La publication a été créée et sera synchronisée", + "title": "Créer une publication" }, - "add_condition": "Ajouter une condition", - "field": "Champ", - "value": "Valeur" - }, - "dialog": { - "error": { - "invalid_query": "Requête invalide : {{error}}", - "empty_query": "Requête vide" + "form": { + "description": "Description", + "enabled": "Activé", + "parent": "Publication parente", + "profile": "Profil de publication", + "slug": "Identifiant", + "title": "Titre de la publication" }, - "add_condition": "Ajouter une condition", - "edit_condition": "Modifier la condition", - "submit_add": "Ajouter", - "submit_update": "Mettre à jour", - "switch_to_builder": "Passer au mode Graphique", - "switch_to_text": "Passer au mode Textuel" + "sync": { + "event": { + "sync_clean": "Nettoyage des assets…", + "sync_complete": "Synchronisation terminée !", + "sync_progress": "Synchronisation en cours…" + } + } }, - "add_condition": "Ajouter une condition", - "menu": { - "disable": "Désactiver", - "edit": "Modifier", - "enable": "Activer", - "remove": "Retirer" + "not_allowed_for_use": "Vous n'êtes pas autorisé à utiliser cette intégration" + }, + "integrations": { + "new": { + "label": "Nouvelle intégration" } }, - "share": { - "dialog": { - "copied": "Lien copié dans le presse-papiers", - "add_new": "Créer un nouveau lien de partage", - "advanced_mode": "Mode avancé", - "create_public_link": { - "primary": "Création d'un lien public", - "secondary": "Partagez un lien avec toute personne extérieure à votre organisation" - }, - "submit": "Copier le lien", - "title": "Partager un asset" + "landing": { + "editor": { + "insert_menu": { + "search_placeholder": "Recherche de widgets..." + } }, - "item": { - "createdAt": "Créé le {{date}}", - "expiresAt": "Expire le {{date}}", - "rendition": { - "asset": "Asset" - }, - "startsAt": "Commence le {{date}}" + "page_editor": { + "save_success": "Page enregistrée avec succès" + } + }, + "layout": { + "display_settings": { + "tooltip": "Paramètres d'affichage" }, - "socials": { - "linkedin": { - "title": "Partagez sur LinkedIn" + "options": { + "collections_count": { + "label": "collections" }, - "x": { - "title": "Partagez sur X" + "display_collections": { + "label": "Afficher les collections" }, - "telegram": { - "title": "Partager sur Telegram" + "display_previews_hover": { + "label": "Afficher l'aperçu au survol" }, - "tumblr": { - "title": "Partagez sur Tumblr" + "display_tags": { + "label": "Afficher les tags" }, - "email": { - "title": "Partager par e-mail" + "display_title": { + "label": "Afficher le titre" }, - "embed": { - "title": "Partager le code" + "more": "Plus d'options", + "play_preview_videos": { + "label": "Lecture automatique des vidéos d'aperçu" }, - "facebook": { - "title": "Partagez sur Facebook" + "preview_options": { + "attributesRatio": { + "label": "Taille des attributs" + }, + "displayAttributes": { + "label": "Afficher les attributs dans l'aperçu" + }, + "displayFile": { + "label": "Afficher l'aperçu" + }, + "options": { + "label": "Options de l'aperçu" + }, + "sizeRatio": { + "label": "Taille" + } }, - "instapaper": { - "title": "Partagez sur Instapaper" + "tags_count": { + "label": "tags" }, - "pinterest": { - "title": "Partagez sur Pinterest" + "thumb_size": { + "label": "Taille des vignettes" }, - "pocket": { - "title": "Partagez sur Pocket" + "title_rows": { + "label": "lignes" + } + }, + "previews_locked": "Aperçus verrouillés", + "previews_unlocked": "Aperçus déverrouillés", + "view": { + "grid": "Vue en grille", + "list": "Vue en liste", + "masonry": "Vue en mosaïque" + } + }, + "left_panel": { + "baskets": "Paniers", + "facets": "Facettes", + "navigation": "Navigation", + "tree": "Workspaces" + }, + "load_more": { + "button": { + "load_more": "Charger plus", + "loading": "Chargement…" + } + }, + "locale": { + "current": "Français", + "switcher": { + "app_languages": "Langues", + "change_data_locale": { + "modal": { + "confirm": "Continuer", + "title": "La page va être actualisée" + } }, - "whatsapp": { - "title": "Partagez sur WhatsApp" + "data_languages": "Langue des données", + "data_locale": { + "default": "Par défaut", + "default_description": "Utiliser la langue de l'interface" }, - "workplace": { - "title": "Partagez sur Workplace" - } - }, - "embed": { - "title": "Partage \"code embed\"" + "filter_placeholder": "Rechercher...", + "title": "Modifier la langue" } }, - "thread": { - "message": { - "delete": { - "confirm": { - "success": "Le message a été supprimé !", - "title": "Êtes-vous sûr de vouloir supprimer ce message ?" - } - } + "matomo": { + "assetView": { + "avg_completion_rate": "Taux d'achèvement moyen", + "avg_media_length": "Durée moyenne du média", + "avg_time_watched": "Durée moyenne de visionnage", + "finish_rate": "Taux de complétion", + "fullscreen_rate": "Taux de plein écran", + "interaction_rate": "Taux d'interaction", + "nb_finishes": "Nombre de lectures terminées", + "nb_impressions": "Nombre d'impressions", + "nb_interactions": "Nombre d'interactions", + "nb_plays": "Nombre de lectures", + "nb_plays_with_ml": "Lectures avec ml", + "nb_plays_with_tip": "Lectures avec pourboire", + "nb_unique_visitors_impressions": "Nombre d'impressions de visiteurs uniques", + "nb_unique_visitors_plays": "Nombre de lectures par visiteur unique", + "nb_visits": "Nombre de visites", + "noStats": "Aucune statistique n'est disponible pour cet Asset", + "play_rate": "Taux de lecture", + "sum_daily_nb_uniq_visitors": "Somme quotidienne de visiteurs uniques", + "sum_fullscreen_plays": "Somme des lectures en plein écran", + "sum_time_progress": "Somme du temps de progression" } }, - "Already translated": "Déjà traduit", - "asset_delete": { - "confirm": "Êtes-vous sûr de vouloir supprimer cet asset ?", - "title": "Supprimer l'asset" + "menu": { + "change_theme": "Changer de thème", + "sign_in": "Se connecter", + "theme_editor": "Éditeur de thème" }, - "asset_version": { - "delete": "Supprimer la version" + "metric": { + "ms": "ms" }, - "asset_version_delete": { - "confirm": "Êtes-vous sûr de vouloir supprimer cette version ?", - "confirmed": "Version supprimée !" + "modal": { + "close": "Fermer" }, - "asset_view": { - "edit_asset": "Asset {{name}} " + "move_assets": { + "dialog": { + "intro": "Où voulez-vous déplacer les assets sélectionnés ?", + "submit": "Déplacer", + "title_many": "", + "title_one": "Déplacer {{count}} asset", + "title_other": "Déplacer {{count}} assets" + } }, - "built_in_attr": { - "fileMimeType": "Type de fichier MIME", - "fileSize": "Taille du fichier", - "fileType": "Type de fichier", - "filename": "Nom du fichier", - "owner": "Propriétaire", - "collection": "Collection", - "createdAt": "Créé le", - "editedAt": "Edité le", - "id": "ID", - "privacy": "Confidentialité", - "rendition": "Rendition", - "score": "Score", - "tag": "Tag", - "workspace": "Workspace", - "collections": "Collections", - "isStory": "Story", - "stories": "Stories", - "deleted": "Supprimé", - "fileExtension": "Extension de fichier", - "has_source": "Dispose d'un fichier source" + "move_assets_dialog": { + "assets_were_moved": "Les assets ont été déplacés" }, - "file": { - "dialog": { - "metadata": { - "refresh": "Actualiser" + "not_found": { + "back_home": "Retour à l'accueil", + "content": "La page que vous cherchez n'existe pas ou a été supprimée", + "title": "Page non trouvée" + }, + "notification": { + "action": { + "follow": { + "label": "Suivre" + }, + "unfollow": { + "label": "Ne plus suivre" } }, - "info": { - "id": "ID", - "size": "Taille", - "type": "Type", - "url": "URL", - "accepted": "Accepté", - "analysis": "Analyse", - "analysis_pending": "Analyse en attente", - "size_unknown": "Inconnu", - "url_none": "N/A" - }, - "manage": { - "info": { - "title": "Informations" - }, - "metadata": { - "title": "Métadonnées" + "topics": { + "asset": { + "delete": { + "desc": "Recevoir une notification lorsque l'asset est supprimé", + "label": "Suppression" + }, + "new_comment": { + "desc": "Recevoir une notification lors d'un nouveau commentaire", + "label": "Discussion" + }, + "update": { + "desc": "Recevoir une notification lorsque l'asset est mis à jour", + "label": "Mise à jour" + } }, - "title": "Gérer le fichier {{name}}" - }, - "analysis_pending": "Analyse en cours…", - "rejected": "Rejeté" + "collection": { + "asset_add": { + "desc": "Recevoir une notification lorsqu'un asset est ajouté à la collection", + "label": "Asset ajouté" + }, + "asset_new_comment": { + "desc": "Recevoir une notification lors d'un nouveau commentaire sur un asset de cette collection", + "label": "Discussion" + }, + "asset_remove": { + "desc": "Recevoir une notification lorsqu'un asset est supprimé de la collection", + "label": "Asset supprimé" + }, + "asset_update": { + "desc": "Recevoir une notification lorsqu'un asset de cette collection est modifié", + "label": "Asset mis à jour" + }, + "not_authenticated": "Vous n'êtes pas authentifié pour suivre cette collection" + } + } }, - "integrations": { - "new": { - "label": "Nouvelle intégration" + "operations_asset": { + "workflow_is_starting": "Workflow démarré !" + }, + "page": { + "delete_confirm": "Supprimer la page", + "delete_title": "Supprimer la page « {{title}} »", + "list": { + "create_button": "Créer une page", + "no_result": "Aucune page", + "title": "Pages" } }, - "rendition_definition": { - "build_mode": { - "custom": "Générer", - "none": "Aucun", - "pick_source": "Copier le fichier parent ou source" + "pages": { + "create": { + "submit": "Créer", + "success": "Page créée avec succès", + "title": "Créer une page" + }, + "edit": { + "submit": "Enregistrer", + "success": "Page enregistrée avec succès", + "title": "Modifier la page" + }, + "form": { + "enabled": { + "label": "Activé" + }, + "public": { + "label": "Public" + }, + "slug": { + "helper": "Le slug est utilisé dans l'URL de la page et doit être unique.", + "label": "Slug" + }, + "title": { + "label": "Titre" + } } }, - "user_preferences": { - "loading": "Chargement des préférences utilisateur…" + "pagination": { + "load_more_collections": "Charger plus de collections" }, - "annotation": { - "type": { - "arrow": "Flèche", - "circle": "Cercle", - "cue": "Repère", - "draw": "Dessiner", - "line": "Ligne", - "rectangle": "Rectangle", - "target": "Cible", - "text": "Texte", - "timerange": "Intervalle de temps" - } + "pasted_image": { + "filename": "Image-collée-{{date}}" }, - "asset_collections": { - "reference_collection": "Cet asset appartient à la collection {{collection}} dans le Workspace {{workspace}}.", - "reference_workspace": "Cet asset appartient à la collection racine du Workspace {{workspace}} .", - "remove_shortcut": "Retirer le raccourci", - "title": "Collections", - "other_collections": "Il apparaît aussi comme raccourci dans les collections suivantes :", - "remove_shortcut_confirm": "Etes-vous sûr de vouloir retirer ce raccourci ?" + "permission_table": { + "actions": "Actions", + "no_permissions": "Aucune permission définie" }, - "attribute_list": { + "permissions": { + "helper_desc": "Niveaux de permissions :" + }, + "privacy": { + "no_access": "Pas d'accès", + "private": "Privé", + "private_in_workspace": "Privé dans le Workspace", + "public": "Public", + "public_for_users": "Public pour les utilisateurs", + "public_in_workspace": "Public dans le Workspace", + "secret": "Secret" + }, + "privacy_field": { + "only_visible_to_workspace": "Visible uniquement pour le Workspace", + "user_must_be_authenticated": "L'utilisateur doit être authentifié" + }, + "profile": { "manage": { "acl": { "title": "Permissions" }, "edit": { - "title": "Editer" + "title": "Modifier" }, "organize": { "title": "Organiser" }, - "title": "Gérer la liste d'attributs {{name}}" + "title": "Gérer le profil {{name}}" }, "organize": { "add_divider": "Ajouter un séparateur", "add_spacer": "Ajouter un espacement" } }, - "create_share_link": { + "remove_bg": { + "bg_removed": "{{title}} - Arrière-plan retiré", + "cannot_interact": "Vous ne disposez pas des autorisations suffisantes pour supprimer l'arrière-plan", + "remove_bg": "Retirer l'arrière-plan", + "use_slider_to_compare": "Utiliser le curseur pour comparer" + }, + "remove_bgasset_editor_actions": { + "bg_removed": "{{name}} - Arrière-plan retiré", + "remove_bg": "Retirer l'arrière-plan", + "use_slider_to_compare": "Utiliser le curseur pour comparer" + }, + "rename_attachment": { "dialog": { - "submit": "Créer le lien", - "title": "Créer le lien de partage" + "success": "Le fichier lié a été renommé.", + "title": "Renommer le fichier lié" }, "form": { - "expiresAt": { - "helper": "Optionnel. Si activé, le lien de partage ne sera actif seulement jusqu'à cette date", - "label": "Expire le" - }, - "startsAt": { - "helper": "Optionnel. Si activé, le lien de partage ne sera actif qu'après cette date", - "label": "Débute le" - }, - "title": { - "helper": "Vous pouvez définir à qui s'adresse ce lien de partage", - "label": "Titre" - } + "label": "Nom du fichier lié" } }, - "file_upload": { - "from_url": { - "placeholder": "Saisir l'URL du fichier" - }, - "upload_from_url": "Importer à partir d'une l'URL", - "asset_created_one": "{{count}} Asset créé avec succès.", - "asset_created_many": "{{count}} Assets créés avec succès.", - "asset_created_other": "{{count}} Assets créés avec succès.", - "back_to_file_upload": "Charger un fichier", - "back_to_files_upload": "Charger des fichiers", - "from_urls": { - "placeholder": "Entrez les URL de fichier, une par ligne" - }, - "import_file": "Importer un fichier", - "import_files": "Importer un ou plusieurs fichiers" - }, - "upload": { - "pending": { - "cancel_upload": "Annuler", - "empty": "Aucun envoi de fichier en attente", - "title": "Envois de fichiers en attente", - "toast": { - "message_one": "{{uploaded}} / {{count}} importé", - "message_many": "", - "message_other": "{{uploaded}} / {{count}} importés" - }, - "uploaded": "Importés" + "rendition_definition": { + "build_mode": { + "custom": "Générer", + "none": "Aucun", + "pick_source": "Copier le fichier parent ou source" } }, - "upload_rendition": { - "dialog": { - "submit": "Importer une rendition", - "success": "La rendition a été importée avec succès", - "title": "Importer la rendition {{renditionName}}" + "rendition_definitions": { + "filter": { + "asset_type": "Filtrer par type d'Asset" + }, + "new": { + "label": "Nouvelle rendition" } }, - "aql": { - "constant": { - "no": "Non", - "null": "Nulle", - "yes": "Oui" + "rendition_delete": { + "confirm": "Êtes-vous sûr de vouloir supprimer cette rendition ?", + "confirmed": "La rendition a été supprimée!" + }, + "rendition_policy": { + "new": { + "label": "Nouvelle politique d'accès" } }, - "asset_type": { - "choice": { - "asset": "Assets", - "asset_only": "Assets uniquement", - "both": "Les deux", - "story": "Stories", - "story_only": "Stories uniquement" + "renditions": { + "delete": "Supprimer", + "dirty": "Les réglages de cette Rendition ont été modifiés après sa génération (Dirty).", + "download": "Télécharger", + "replace": "Remplacer", + "upload": "Importer la Rendition" + }, + "rentition": { + "flags": { + "is_projection": "La rendition est une déclinaison de la source", + "locked": "Rendition verrouillée", + "non_projection": "Rendition plus conforme à la configuration définie", + "substituted": "La rendition a été remplacée" } }, - "facet": { - "boolean": { - "false": { - "label": "Non ({{n}})" - }, - "true": { - "label": "Oui ({{n}})" - } + "replace_asset": { + "dialog": { + "submit": "Substituer", + "success": "Le nouveau fichier source d'asset a été chargé, remplacement en cours.", + "title": "Substituer le fichier source de l'asset" } }, - "story": { - "chip": { - "label": "Story" + "replace_asset_with_file_dialog": { + "asset_has_been_replaced": "Le fichier de l'asset a été remplacé", + "please_confirm_replacing_asset": "Confirmer le remplacement du fichier de l'asset.", + "replace_asset_with_file": "Remplacer le fichier de l'asset" + }, + "save_as_button": { + "Rendition": "Rendition", + "new_asset": "Nouvel asset", + "rendition": "Rendition", + "replace_asset_source": "Remplacer la source de l'asset", + "save_as": "Enregistrer sous" + }, + "save_as_template_form": { + "apply_to_collection": "Appliquer à la collection", + "include_collection_children": "Inclure les sous-collections", + "my_template": "Mon modèle…", + "public": "Public", + "remember_attributes": "Inclure les attributs", + "remember_privacy": "Inclure la confidentialité", + "remember_tags": "Inclure les tags", + "replace": "Remplacer le modèle appliqué", + "save_values_as_template_for_reuse": "Enregistrer les valeurs comme modèle pour réutilisation", + "template_name": "Nom du modèle" + }, + "save_file_as_new_asset_dialog": { + "file_is_saved": "Le fichier est enregistré", + "save": "Enregistrer", + "save_file_as_new_asset": "Enregistrer comme nouvel asset", + "title": { + "label": "Titre" } }, - "asset_restore": { - "confirm": "Êtes-vous sûr de vouloir restaurer cet Asset ?", - "title": "Restaurer l'Asset" + "save_file_as_rendition_dialog": { + "Rendition_has_been_saved": "La Rendition a été enregistrée", + "Rendition_to_add_or_replace": "Rendition à ajouter ou à remplacer", + "rendition_has_been_saved": "La rendition a été sauvegardée", + "rendition_to_add_or_replace": "Rendition à ajouter ou remplacer", + "save_file_as_asset_rendition": "Enregistrer comme rendition de l'asset" }, - "attachment": { + "save_search": { "dialog": { - "add": { - "submit": "Joindre", - "success": "Un nouveau fichier lié a été ajouté.", - "title": "Ajouter un fichier lié à l'Asset" - } + "title": "Recherche sauvegardée" } }, - "collection_panel": { - "trash": "Corbeille" + "saved_search": { + "automations": { + "coming_soon": "Les automatisations seront bientôt disponibles !" + }, + "form": { + "created": "La recherche a été sauvegardée !" + }, + "info": { + "creation_date": "Date de création", + "id": "ID", + "modification_date": "Date de modification", + "owner": "Propriétaire" + }, + "item": { + "delete": "Supprimer", + "edit": "Modifier" + }, + "list": { + "title": "Recherches sauvegardées" + }, + "manage": { + "acl": { + "title": "Permissions" + }, + "automations": { + "title": "Automatisations" + }, + "edit": { + "title": "Modifier" + }, + "info": { + "title": "Informations" + }, + "title": "Gérer la recherche sauvegardée : {{name}}" + } }, - "collection_restore": { - "confirmed": "La collection a été restaurée !", - "title": "Restaurer la collection" + "search": { + "error": "Oups, une erreur s'est produite :", + "more_options": { + "clear_search": "Effacer la recherche" + }, + "no_results_message": "Nous sommes désolés, mais votre recherche n'a renvoyé aucun Asset  !", + "save_search": "Recherche sauvegardée", + "search_button": "Rechercher", + "sort_by": { + "title": "Trier par" + }, + "suggestion": { + "check_spelling": " Vérifiez l'orthographe  : Assurez-vous que tous les termes de recherche sont correctement orthographiés.", + "consider_using_facets": "Envisagez d'utiliser des facettes : Cliquez sur les différentes valeurs de facettes pour affiner ou élargir les résultats (Workspace, collection, tags, dates, etc.).", + "modify_filters": "Modifier les filtres : Si vous avez appliqué des filtres, supprimez-les ou modifiez-les pour élargir le champ de recherche." + }, + "update_search": "Mettre à jour la recherche", + "update_success": "La recherche a été mise à jour avec succès !" }, - "rename_attachment": { + "search_auto_complete": { + "search": "Rechercher…" + }, + "search_condition": { + "add_condition": "Ajouter une condition", + "builder": { + "add_condition": "Ajouter une condition", + "add_condition_group": "Ajouter un groupe de conditions", + "field": "Champ", + "operator": { + "and": "ET", + "between": "Entre", + "contains": "Contient", + "equals": "= (Égale)", + "exists": "Existe", + "greater_than": "> (Supérieur à)", + "greater_than_or_equals": ">= (Supérieur ou égal)", + "in": "Inclus dans", + "less_than": "< (Inférieur à)", + "less_than_or_equals": "<= (Inférieur ou égal à)", + "matches": "Correspond à", + "missing": "Est vide", + "not_between": "Non compris entre", + "not_contains": "Ne contient pas", + "not_equals": "! = (différent de)", + "not_in": "Non inclus dans", + "not_matches": "Ne correspond pas", + "not_starts_with": "Ne commence pas par", + "or": "OU", + "placeholder": "Opérateur", + "starts_with": "Commence par", + "within_circle": "Dans un rayon de", + "within_circle_latitude": "Latitude", + "within_circle_longitude": "Longitude", + "within_circle_radius": "Rayon", + "within_rectangle": "Dans un rectangle", + "within_rectangle_bottom_right_latitude": "Latitude bas droite", + "within_rectangle_bottom_right_longitude": "Longitude bas droite", + "within_rectangle_top_left_latitude": "Latitude haute gauche", + "within_rectangle_top_left_longitude": "Longitude haute gauche" + }, + "value": "Valeur" + }, "dialog": { - "success": "Le fichier lié a été renommé.", - "title": "Renommer le fichier lié" + "add_condition": "Ajouter une condition", + "edit_condition": "Modifier la condition", + "error": { + "empty_query": "Requête vide", + "invalid_query": "Requête invalide : {{error}}" + }, + "submit_add": "Ajouter", + "submit_update": "Mettre à jour", + "switch_to_builder": "Passer au mode Graphique", + "switch_to_text": "Passer au mode Textuel" }, - "form": { - "label": "Nom du fichier lié" + "menu": { + "disable": "Désactiver", + "edit": "Modifier", + "enable": "Activer", + "remove": "Retirer" } }, - "appbar": { - "assets": "Assets", - "pages": "Pages" + "search_provider": { + "collections": "Collections", + "workspaces": "Workspaces" }, - "profile": { - "manage": { - "acl": { - "title": "Permissions" - }, - "edit": { - "title": "Modifier" - }, - "organize": { - "title": "Organiser" - }, - "title": "Gérer le profil {{name}}" - }, - "organize": { - "add_divider": "Ajouter un séparateur", - "add_spacer": "Ajouter un espacement" - } + "selection_actions": { + "result": "résultat", + "s": "s", + "x_result_many": "", + "x_result_one": "{{count}} résultat", + "x_result_other": "{{count}} résultats", + "x_result_with_selection_many": "", + "x_result_with_selection_one": "{{selection}} / {{total}} résultat", + "x_result_with_selection_other": "{{selection}} / {{total}} résultats" }, - "editor": { - "format": { - "alignCenter": "Aligner au centre", - "alignJustify": "Justifier", - "alignLeft": "Aligner à gauche", - "alignRight": "Aligner à droite", - "blockQuote": "Bloc de citation", - "block_type": { - "heading": { - "label": "Titre {{number}}" - }, - "paragraph": { - "label": "Normal" - } - }, - "bold": "Gras", - "bulletList": "Liste à puces", - "clear": "Effacer la mise en forme", - "code": "Code", - "codeBlock": "Bloc de code", - "fontFamily": { - "label": "Police" + "share": { + "dialog": { + "add_new": "Créer un nouveau lien de partage", + "advanced_mode": "Mode avancé", + "copied": "Lien copié dans le presse-papiers", + "create_public_link": { + "primary": "Création d'un lien public", + "secondary": "Partagez un lien avec toute personne extérieure à votre organisation" }, - "italic": "Italique", - "link": "Lien", - "orderedList": "Liste numérotée", - "redo": "Rétablir", - "save": "Enregistrer", - "strikethrough": "Barrer", - "underline": "Souligner", - "undo": "Annuler", - "view": "Visualiser" + "submit": "Copier le lien", + "title": "Partager un asset" }, - "link": { - "dialog": { - "dialog_title": "Insérer un lien", - "remove": { - "label": "Supprimer le lien" - }, - "target": { - "blank": { - "label": "Nouvel onglet" - }, - "label": "Ouvrir le lien dans", - "self": { - "label": "Même onglet" - } - }, - "title": { - "label": "Titre (facultatif)" - }, - "url": { - "label": "URL" - } - } + "embed": { + "title": "Partage \"code embed\"" }, - "menu": { - "colors": { - "backgroundColor": "Couleur de fond", - "textColor": "Couleur de texte" - } + "item": { + "createdAt": "Créé le {{date}}", + "expiresAt": "Expire le {{date}}", + "rendition": { + "asset": "Asset" + }, + "startsAt": "Commence le {{date}}" }, - "widgets": { - "asset": { - "options": { - "assetId": { - "label": "ID d'Asset" - }, - "borderRadius": { - "label": "Rayon de la bordure (px)" - }, - "gap": { - "label": "Ecart" - }, - "imagePosition": { - "bottom": "En bas", - "label": "Position de l'image", - "left": "Gauche", - "right": "Droite", - "top": "Haut" - }, - "maxHeight": { - "label": "Hauteur maximale (px)" - }, - "maxWidth": { - "label": "Largeur maximale (px)" - }, - "position": { - "fixed": "Fixe", - "label": "Position de l'image", - "static": "Statique" - }, - "title": { - "label": "Titre" - } - }, - "title": "Asset" + "socials": { + "email": { + "title": "Partager par e-mail" }, - "carousel": { - "options": { - "backgroundColor": { - "label": "Couleur de fond" - }, - "cover": { - "label": "Mode couverture" - }, - "height": { - "label": "Hauteur (px)" - }, - "maxItems": { - "label": "Nombre maximum d'éléments" - }, - "openAsset": { - "label": "Ouvrir l'Asset par un clic" - }, - "searchId": { - "label": "Recherche sauvegardée" - } - }, - "title": "Carrousel" + "embed": { + "title": "Partager le code" }, - "footer": { - "options": { - "add_link": "Ajouter un lien", - "backgroundColor": { - "label": "Couleur de fond" - }, - "link_label": { - "label": "Intitulé" - }, - "link_url": { - "label": "URL" - }, - "links": { - "label": "Liens" - }, - "textColor": { - "label": "Couleur de texte" - } - }, - "title": "Footer" + "facebook": { + "title": "Partagez sur Facebook" }, - "grid": { - "options": { - "backgroundColor": { - "label": "Couleur de fond" - }, - "gap": { - "label": "Espacement" - }, - "maxItems": { - "label": "Nombre maximum d'éléments" - }, - "openAsset": { - "label": "Ouvrir l'Asset par un clic" - }, - "searchId": { - "label": "Recherche sauvegardée" - }, - "size": { - "label": "Taille (px)" - } - }, - "title": "Grille" + "instapaper": { + "title": "Partagez sur Instapaper" }, - "header_bar": { - "options": { - "add_link": "Ajouter un lien", - "link_label": { - "label": "Intitulé" - }, - "link_url": { - "label": "URL" - }, - "links": { - "label": "Liens" - } - }, - "title": "Header" + "linkedin": { + "title": "Partagez sur LinkedIn" + }, + "pinterest": { + "title": "Partagez sur Pinterest" + }, + "pocket": { + "title": "Partagez sur Pocket" }, - "remove_widget": "Supprimer le widget", - "search_grid": { - "options": { - "actions": { - "basket": { - "label": "Ajouter au panier" - }, - "copy": { - "label": "Copier" - }, - "delete": { - "label": "Supprimer" - }, - "edit": { - "label": "Modifier" - }, - "export": { - "label": "Exporter" - }, - "info": { - "label": "Informations" - }, - "label": "Actions", - "move": { - "label": "Déplacer" - }, - "open": { - "label": "Ouvrir" - }, - "replace": { - "label": "Remplacer" - }, - "restore": { - "label": "Restaurer" - }, - "share": { - "label": "Partager" - } - }, - "containerHeight": { - "label": "Hauteur du conteneur (px)" - }, - "displayFacets": { - "label": "Afficher les facettes" - }, - "maxItems": { - "label": "Nombre maximum d'éléments" - }, - "openAsset": { - "label": "Ouvrir l'Asset par un clic" - }, - "searchId": { - "label": "Recherche sauvegardée" - }, - "size": { - "label": "Taille (px)" - } - }, - "title": "Grille de recherche" + "telegram": { + "title": "Partager sur Telegram" }, - "spacer": { - "options": { - "spacing": { - "label": "Espacement" - } - }, - "title": "Espace" + "tumblr": { + "title": "Partagez sur Tumblr" }, - "unknown": "Type de widget inconnu" + "whatsapp": { + "title": "Partagez sur WhatsApp" + }, + "workplace": { + "title": "Partagez sur Workplace" + }, + "x": { + "title": "Partagez sur X" + } } }, - "landing": { - "editor": { - "insert_menu": { - "search_placeholder": "Recherche de widgets..." - } - }, - "page_editor": { - "save_success": "Page enregistrée avec succès" + "sort_by": { + "sort_by": "Trier par" + }, + "sort_by_row": { + "ascendant": "Ascendant", + "descendant": "Descendant" + }, + "story": { + "chip": { + "label": "Story" } }, - "matomo": { - "assetView": { - "avg_completion_rate": "Taux d'achèvement moyen", - "avg_media_length": "Durée moyenne du média", - "avg_time_watched": "Durée moyenne de visionnage", - "finish_rate": "Taux de complétion", - "fullscreen_rate": "Taux de plein écran", - "interaction_rate": "Taux d'interaction", - "nb_finishes": "Nombre de lectures terminées", - "nb_impressions": "Nombre d'impressions", - "nb_interactions": "Nombre d'interactions", - "nb_plays": "Nombre de lectures", - "nb_plays_with_ml": "Lectures avec ml", - "nb_unique_visitors_impressions": "Nombre d'impressions de visiteurs uniques", - "nb_unique_visitors_plays": "Nombre de lectures par visiteur unique", - "nb_visits": "Nombre de visites", - "noStats": "Aucune statistique n'est disponible pour cet Asset", - "play_rate": "Taux de lecture", - "sum_daily_nb_uniq_visitors": "Somme quotidienne de visiteurs uniques", - "sum_fullscreen_plays": "Somme des lectures en plein écran", - "sum_time_progress": "Somme du temps de progression", - "nb_plays_with_tip": "Lectures avec pourboire" + "substitute_file": { + "dialog": { + "intro": "Déposer ici", + "submit": "Remplacer", + "title": "Remplacer le fichier" } }, - "page": { - "delete_confirm": "Supprimer la page", - "delete_title": "Supprimer la page « {{title}} »", - "list": { - "create_button": "Créer une page", - "no_result": "Aucune page", - "title": "Pages" + "tags": { + "label": "Tags", + "new": { + "label": "Nouveau tag" } }, - "pages": { - "create": { - "submit": "Créer", - "success": "Page créée avec succès", - "title": "Créer une page" - }, - "edit": { - "submit": "Enregistrer", - "success": "Page enregistrée avec succès", - "title": "Modifier la page" - }, - "form": { - "enabled": { - "label": "Activé" - }, - "public": { - "label": "Public" - }, - "slug": { - "helper": "Le slug est utilisé dans l'URL de la page et doit être unique.", - "label": "Slug" - }, - "title": { - "label": "Titre" + "thread": { + "message": { + "delete": { + "confirm": { + "success": "Le message a été supprimé !", + "title": "Êtes-vous sûr de vouloir supprimer ce message ?" + } } } }, - "permissions": { - "helper_desc": "Niveaux de permissions :" + "translatable_attribute_tabs": { + "untranslated": "Non traduit" }, - "remove_bg": { - "bg_removed": "{{title}} - Arrière-plan retiré", - "cannot_interact": "Vous ne disposez pas des autorisations suffisantes pour supprimer l'arrière-plan", - "remove_bg": "Retirer l'arrière-plan", - "use_slider_to_compare": "Utiliser le curseur pour comparer" + "tuiphoto_editor": { + "file_name": "Nom du fichier", + "open_recent": "Ouvrir récent", + "original": "Original", + "save": "Enregistrer", + "save_as": "Enregistrer sous", + "saved": "Enregistré !" }, - "save_search": { + "upload": { + "pending": { + "cancel_upload": "Annuler", + "empty": "Aucun envoi de fichier en attente", + "title": "Envois de fichiers en attente", + "toast": { + "message_many": "", + "message_one": "{{uploaded}} / {{count}} importé", + "message_other": "{{uploaded}} / {{count}} importés" + }, + "uploaded": "Importés" + } + }, + "upload_dropzone": { + "drag_n_drop_some_files_here_or_click_to_select_files": "Glissez-déposez des fichiers, cliquez pour sélectionner des fichiers ou coller le presse-papiers" + }, + "upload_rendition": { "dialog": { - "title": "Recherche sauvegardée" + "submit": "Importer une rendition", + "success": "La rendition a été importée avec succès", + "title": "Importer la rendition {{renditionName}}" } }, - "saved_search": { - "automations": { - "coming_soon": "Les automatisations seront bientôt disponibles !" - }, - "form": { - "created": "La recherche a été sauvegardée !" - }, + "use_integration_auth": { + "auth": "Authentification" + }, + "user_preferences": { + "loading": "Chargement des préférences utilisateur…" + }, + "workspace": { "info": { "creation_date": "Date de création", "id": "ID", - "modification_date": "Date de modification", "owner": "Propriétaire" }, "item": { - "delete": "Supprimer", - "edit": "Modifier" - }, - "list": { - "title": "Recherches sauvegardées" + "create_asset": "Ajouter un Asset au Workspace", + "create_collection": "Ajouter la collection dans ce Workspace", + "edit": "Modifier le Workspace" }, "manage": { "acl": { "title": "Permissions" }, - "automations": { - "title": "Automatisations" + "attribute_definitions": { + "title": "Attributs" + }, + "attribute_entity": { + "title": "Entités" + }, + "attribute_policy": { + "title": "Politiques d'accès des attributs" }, "edit": { - "title": "Modifier" + "title": "Editer" + }, + "filter_rules": { + "title": "Règles de filtrage" }, "info": { "title": "Informations" }, - "title": "Gérer la recherche sauvegardée : {{name}}" - } + "integrations": { + "title": "Intégrations" + }, + "rendition_definition": { + "title": "Renditions" + }, + "rendition_policy": { + "title": "Politiques d'accès aux renditions" + }, + "tags": { + "title": "Tags" + }, + "title": "Gérer le Workspace {{name}}" + }, + "no_locale_defined": "Aucune langue définie pour ce Workspace" }, "workspaces": { "list": { diff --git a/databox/client/translations/it.json b/databox/client/translations/it.json index 1858c0d412..16b2cb5939 100644 --- a/databox/client/translations/it.json +++ b/databox/client/translations/it.json @@ -1,7 +1,4 @@ { - "locale": { - "current": "Italiano" - }, "acl": { "delete": "Elimina", "form": { @@ -28,18 +25,18 @@ "save_as": "Salva come" }, "collection_list": { - "collections_one": "Collection", "collections_many": "", + "collections_one": "Collection", "collections_other": "Collections", - "others_one": "Altri", "others_many": "", + "others_one": "Altri", "others_other": "Altri" }, "delete": { "confirm": { "message": "Sei sicuro di voler eliminare questo Asset?", - "message_one": "", "message_many": "", + "message_one": "", "message_other": "Sei sicuro di voler eliminare questi Asset?", "title": "Conferma eliminazione" } @@ -86,11 +83,11 @@ "label": "Sostituisci" }, "tag_list": { - "others_one": "Altri", "others_many": "", + "others_one": "Altri", "others_other": "Altri", - "tags_one": "Tag", "tags_many": "", + "tags_one": "Tag", "tags_other": "Tag" }, "view": { @@ -133,11 +130,6 @@ } } }, - "attribute_policy": { - "new": { - "label": "Nuova Attribute Policy" - } - }, "attribute_definitions": { "new": { "label": "Nuova Attribute Definition" @@ -189,9 +181,14 @@ "label": "Nuova Attribute Entity" } }, + "attribute_policy": { + "new": { + "label": "Nuova Attribute Policy" + } + }, "attributes": { - "values_one": "Valori", "values_many": "", + "values_one": "Valori", "values_other": "" }, "attributes_editor_form": { @@ -327,8 +324,8 @@ "dialog": { "intro": "Copia Asset", "submit": "Copia", - "title_one": "Copia Asset", "title_many": "", + "title_one": "Copia Asset", "title_other": "Copia Asset" }, "form": { @@ -423,17 +420,23 @@ "is_missing": "Mancante" }, "filter_rule": { - "confirm_delete_this_rule": "Confermi di voler eliminare questa regola?", - "exclude": { - "helper": "Escludi dalla ricerca" - }, - "group": "Gruppo", - "include": { - "helper": "Includi nella ricerca" + "condition": { + "edit": "Modifica condizione", + "empty": "Nessuna condizione definita", + "helper": "Le risorse di questo workspace saranno visibili solo se corrispondono a questa condizione.", + "label": "Condizione" }, - "or": "o", + "confirm_delete_this_rule": "Confermi di voler eliminare questa regola?", + "groups": "Gruppi", "rule_applies_for": "La regola si applica a", - "user": "Utente" + "targets_helper": "Lascia entrambi vuoti per applicare la regola a tutti gli utenti.", + "users": "Utenti" + }, + "filter_rules": { + "edit_this_rule": "Modifica questa regola", + "everyone": "Tutti", + "filter_rules": "Regole di filtro", + "new_rule": "Nuova regola" }, "foo": "", "form": { @@ -461,24 +464,10 @@ "item_remove": "Rimuovi elemento" } }, - "attribute_policy": { - "editable": { - "label": "Modificabile" - }, - "name": { - "label": "Nome" - }, - "public": { - "label": "Pubblico" - } - }, "attribute_definition": { "allowInvalid": { "label": "Consenti non valido" }, - "policy": { - "label": "Policy" - }, "entityList": { "label": "Lista entità" }, @@ -491,6 +480,9 @@ "name": { "label": "Nome" }, + "policy": { + "label": "Policy" + }, "searchable": { "label": "Ricercabile" }, @@ -512,6 +504,17 @@ "label": "Valore" } }, + "attribute_policy": { + "editable": { + "label": "Modificabile" + }, + "name": { + "label": "Nome" + }, + "public": { + "label": "Pubblico" + } + }, "basket": { "description": { "label": "Descrizione" @@ -571,18 +574,7 @@ } } }, - "rendition_policy": { - "name": { - "label": "Nome" - }, - "public": { - "label": "Pubblico" - } - }, "rendition_definition": { - "policy": { - "label": "Policy" - }, "definition": { "label": "Definizione" }, @@ -596,6 +588,12 @@ "pickSourceFile": { "label": "Scegli file sorgente" }, + "policy": { + "label": "Policy" + }, + "useAsAnimatedThumbnail": { + "label": "Usa come miniatura attiva" + }, "useAsMain": { "label": "Usa come originale" }, @@ -604,9 +602,14 @@ }, "useAsThumbnail": { "label": "Usa come miniatura" + } + }, + "rendition_policy": { + "name": { + "label": "Nome" }, - "useAsAnimatedThumbnail": { - "label": "Usa come miniatura attiva" + "public": { + "label": "Pubblico" } }, "save_as": { @@ -742,6 +745,9 @@ "loading": "Caricamento..." } }, + "locale": { + "current": "Italiano" + }, "menu": { "change_theme": "Cambia tema", "sign_in": "Accedi", @@ -757,8 +763,8 @@ "dialog": { "intro": "Sposta Asset", "submit": "Sposta", - "title_one": "Sposta Asset", "title_many": "", + "title_one": "Sposta Asset", "title_other": "Sposta Asset" } }, @@ -800,14 +806,14 @@ "remove_bg": "Rimuovi sfondo", "use_slider_to_compare": "Usa lo slider per confrontare" }, - "rendition_policy": { + "rendition_definitions": { "new": { - "label": "Nuova Rendition Policy" + "label": "Nuova Rendition Definition" } }, - "rendition_definitions": { + "rendition_policy": { "new": { - "label": "Nuova Rendition Definition" + "label": "Nuova Rendition Policy" } }, "renditions": { @@ -880,11 +886,6 @@ "title": "Sostituisci file" } }, - "tag_rules": { - "edit_this_rule": "Modifica questa regola", - "new_rule": "Nuova regola", - "tag_rules": "Regole Tag" - }, "tags": { "label": "Tag", "new": { @@ -921,29 +922,29 @@ "acl": { "title": "Gestisci ACL" }, - "attribute_policy": { - "title": "Gestisci Attribute Policy" - }, "attribute_definitions": { "title": "Gestisci Attribute Definitions" }, "attribute_entity": { "title": "Gestisci Attribute Entity" }, + "attribute_policy": { + "title": "Gestisci Attribute Policy" + }, "edit": { "title": "Modifica Workspace" }, + "filter_rules": { + "title": "Regole di filtro" + }, "info": { "title": "Informazioni" }, - "rendition_policy": { - "title": "Gestisci Rendition Policy" - }, "rendition_definition": { "title": "Gestisci Rendition Definition" }, - "tag_rules": { - "title": "Gestisci Tag Rules" + "rendition_policy": { + "title": "Gestisci Rendition Policy" }, "tags": { "title": "Gestisci Tag"